From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 1688747C84 for ; Mon, 16 Oct 2023 07:52:11 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6EF5868CA20; Mon, 16 Oct 2023 10:52:08 +0300 (EEST) Received: from mgamail.intel.com (mgamail.intel.com [192.55.52.93]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 14AE768C6BE for ; Mon, 16 Oct 2023 10:52:00 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1697442726; x=1728978726; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-id:content-transfer-encoding: mime-version; bh=1htBq0VVyrdj9OTGhURXycWSRUaDEzK55yGFfNmfXhI=; b=Sr8J18hqbTUA4d2rgQIQn0FtFKCKiyok6gC6pWd6ka4dc0O/OARNAndW ReM3w6N9pDm76E/p17QJR5C2CW+pER9KyX7hL4oD1mlg8W/qZO6dyey3w LfhCq3YfiXqLTzVXbmttOiaIVE+Rdx1vt7NB73lBT6tyjzFhDMPj296ES ql5eOtOhbNX6uixc0CgZiX2H8H60g58zpHsNkIAGeR62oHcRhh/cEKaTv HVJutIdcDjuGjScPCasQEV4A5JDNnn4x7/cpJo7W7eK8RlYnPCiRRHLpT FYEZ4sQSzgf/Zs4I0ffpkd1WSSUE9nIYhuRxjqG58pPOQHDzhQO+MiP4J Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10863"; a="382695750" X-IronPort-AV: E=Sophos;i="6.03,228,1694761200"; d="scan'208";a="382695750" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Oct 2023 00:51:55 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10863"; a="825911941" X-IronPort-AV: E=Sophos;i="6.03,228,1694761200"; d="scan'208";a="825911941" Received: from fmsmsx602.amr.corp.intel.com ([10.18.126.82]) by fmsmga004.fm.intel.com with ESMTP/TLS/AES256-GCM-SHA384; 16 Oct 2023 00:51:55 -0700 Received: from fmsmsx610.amr.corp.intel.com (10.18.126.90) by fmsmsx602.amr.corp.intel.com (10.18.126.82) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Mon, 16 Oct 2023 00:51:55 -0700 Received: from fmsedg601.ED.cps.intel.com (10.1.192.135) by fmsmsx610.amr.corp.intel.com (10.18.126.90) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32 via Frontend Transport; Mon, 16 Oct 2023 00:51:55 -0700 Received: from NAM12-MW2-obe.outbound.protection.outlook.com (104.47.66.41) by edgegateway.intel.com (192.55.55.70) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.32; Mon, 16 Oct 2023 00:51:54 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Yg1ttWEOCRYEh1W/Fk7zXIRZBOLRfu7tO3trnb1SBQ1zOKOHbgxRwUO6tN+PnrD6wzwW3QeELm31aWtCyBy/3+X8AMuE6mTwhinoJ2ZfkfYxciJdZAV5eMgviIDZUjE/OFLMTgz8i8anB4Ou/qepoLRCUsyTtfekMn6GZb1Su8D6g9piYydmPQgrxw0ckBCS+hoync3ra/fv6kVV/gNVDcb/joQpvwBLijDhjOegqQciq0oezxeSKp4KFtU4N0KMnoKUyMgSgs/opmmFztAZnkSFKePAbIlmDg/ipADR+y5af1L1656zR0b45GHU5IoUccLKzlrTeWxK62ShHmZPTA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=1htBq0VVyrdj9OTGhURXycWSRUaDEzK55yGFfNmfXhI=; b=AKQksCx00IBfwugo2O2qR4Aa+8xMr8rrrPl3LCNlBBS12wr+m/Nyqz3HFoOrvWTRGgc5bvtP3HTiUhIlat2segY4pAUs83/d3ViDtTu67GEPRtPWGLCR4BouaF8al1Xws6ZEnuruEa5xOUqSB9oXGPBUlaTPo2+ryaiUuqhxemtq+X2nYDCeup042ZeGdDyHZsGVDaEfl1YbWzE55Vq6pu6ImHySltUsDu0huEGHnWAE2ug3UtiXy5D6HvombPJimf/DwMTS8Bzz6KFN1jHDuvfXv+ZkpvG1LM4qquDYI9X4x+bWbru1ErAsiRtO108+F1JjKonmGFUFhBX+Y5CjAg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none Received: from LV8PR11MB8678.namprd11.prod.outlook.com (2603:10b6:408:20b::16) by DM4PR11MB7183.namprd11.prod.outlook.com (2603:10b6:8:111::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6886.35; Mon, 16 Oct 2023 07:51:52 +0000 Received: from LV8PR11MB8678.namprd11.prod.outlook.com ([fe80::6303:dce9:fec9:711d]) by LV8PR11MB8678.namprd11.prod.outlook.com ([fe80::6303:dce9:fec9:711d%4]) with mapi id 15.20.6863.047; Mon, 16 Oct 2023 07:51:51 +0000 From: "Xiang, Haihao" To: "ffmpeg-devel@ffmpeg.org" Thread-Topic: [FFmpeg-devel] [PATCH 1/2] avfilter/vf_lut3d: expose 3D LUT file parse function. Thread-Index: AQHZ7jSinm3OaVr4M0WvRyXoZjHTQbBMLtEA Date: Mon, 16 Oct 2023 07:51:50 +0000 Message-ID: References: <20230923154125.31376-1-cyfdecyf@gmail.com> <20230923154125.31376-2-cyfdecyf@gmail.com> In-Reply-To: <20230923154125.31376-2-cyfdecyf@gmail.com> Accept-Language: en-AS, zh-CN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: user-agent: Evolution 3.44.4-0ubuntu2 authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=intel.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: LV8PR11MB8678:EE_|DM4PR11MB7183:EE_ x-ms-office365-filtering-correlation-id: b8e4a204-f3b8-4952-0d69-08dbce1cc1b5 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: 5L0vofv2IO48XvZ3KkUNFVPz7l3JZMwMZOCvN+5OBmFG6C0Cfs7MpCiqzk5o5DgBkVIG/VlhVAYLKRKCwzbWrev62l+R1x/Ipl3CjiemGB4TJlN8hbltlzila+JjxRARxkTyEVtuQQ3k+oDPdmuvZX79E3o/5wuJrpymnYuyqGhLLMfzxgo8WOHR8gdOagDvfRTEJC5wwJSE6J6W9y12+L7IBmx7OSsZv3zulJhRkmTSi1Kk3pDecCJeYF8y0clei4LwsBLgFboYrsCqwB7Kz590Prjj9b/xnA1xGgXulOEY/XRmCxrINs6KNMVLkS/HhXKFM/ps/Gsr6Hhmuc8r+drD/dq8Ls+OqeWV1lD+nZGRpJ6I58+O62iAiXycAXAYP7C1adXcdTN3gASAbvGxzhnjra+8lLEydphNW4wqLe/xn5z9Y2U24c4ACk939nlwjhZDzVZQ9xjQyBFg1J03OHjpOOo4peY0jYpkVyJ55lwj5RdNtEHzlfwH9BFMoICqLee/YMtMyVEYEOzDHfn7u37xZWGu9a1hPp32o38XHHR+MZBiUNMbfWm/VAmyVi1N+dbuPaBVMXHMl4UqvCPHVq5fAKkvlKJYcMnCUvX4CgPTGunkb1Rv0Ubj692ID1amY3KLMJriEC7npYkEmpVZzg== x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:LV8PR11MB8678.namprd11.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230031)(136003)(376002)(366004)(346002)(39860400002)(396003)(230922051799003)(451199024)(186009)(64100799003)(1800799009)(66899024)(478600001)(6486002)(91956017)(76116006)(66946007)(66556008)(66476007)(66446008)(64756008)(6916009)(71200400001)(83380400001)(86362001)(38100700002)(82960400001)(316002)(6512007)(26005)(66574015)(6506007)(2616005)(41300700001)(36756003)(5660300002)(38070700005)(122000001)(30864003)(8936002)(8676002)(4326008)(2906002)(2004002)(559001)(579004); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?B?bkZXQVRZWWRMVEwzTnRlRVhVbk5USi9OTzlST25NcVB5WTh3WU5wSlZUaTEr?= =?utf-8?B?dlRhbERqVlIxVjJ3ckR2cUV5ZzJYbTdMUmNpSUR6c2hCODk4WjU0ZjE0Yytt?= =?utf-8?B?Z1BlY0NRQ3lMakpxTWlJMndFOVFsMkU2eTNWbUh5ay8wVWU4RGY0WmpVODFv?= =?utf-8?B?OWZvdTBxNUhXUTdqQkdkMEhOZHRFNE5teGJuWEhsSFMzOXhDaThNa1dLSjRx?= =?utf-8?B?LzR6K3hscnc2U1VEZ3VYZC8zbURqczFUSEh1dmFMZzcvc0lsNDJnbEVoQW0v?= =?utf-8?B?QmV5WWhURVQwek1sYVMxRlZWcGxGQ0pSUGp4dXpTL0NxMGhoY3ltMDAraHpI?= =?utf-8?B?ZG1mVWU3dVdTSXUrUVVVMjE1bHVZeWpnOGlqWGNlekVmYlcrMnpBSmlmY3gy?= =?utf-8?B?OXE0djBjbDhyRHlGclpqZXlCSEZSd1lldDV0UDF2Y3JWY3RLK01qbUZ4ZnAy?= =?utf-8?B?NkM1cmFCZkY2ai96N3lFbDhWWUxyVk9CL1JsdTdOcWQvRDBnRllRSlZSWjZ3?= =?utf-8?B?bk1RTmZQSGhmWVJ2aXVqbWJEcHA3d1h1VnNwcDd6bXdVQTRqTEY1Ykh6eWFZ?= =?utf-8?B?ZjFqMEkySlFjdkZGM205ZmRJdEo5eTduWEVyQ2ptQlhqZ09KMVo0VURSaVU0?= =?utf-8?B?bXJaOWovVmZYZWU4YXRkc1E3S1VNZmF1Tkt3N1YxU2JUYTU4WjJGVDJHMUNo?= =?utf-8?B?QjczemxxSWh6Vkp6T2R5cGxSTjBPRi85MkRJWTV3dWx6anc5SkFvTVB0VXdl?= =?utf-8?B?b0dQajIvNkdla0llcHUxOXVzd3Z4MUxlRTdITDJSR3dLWE1uejdJVUZXOGty?= =?utf-8?B?eWc5QUVCcVFwQ2w1Y1NYVDZFLzJ1T1VRSS9lK0RXQi93NUdYQlJZWjFVSWti?= =?utf-8?B?NlNYT1MxVFcrTGQ5ZFUwc0pEeXB1YmF5R2VvMjBmSHE0d0JFTE8yRC9Fc0xC?= =?utf-8?B?YW9DZGJXbnkxeU9uem9Gb2Zab1EyNUlqVkRTWVBmdDhwTVJQQ3lxbmhiYUNs?= =?utf-8?B?cVR5S3p5Ri8xcGhCUmMvRDZQRjQ0ZllrN28wWW9vWHZEWExMbDFpdFlzbzhq?= =?utf-8?B?YUNUM1p6Q1NtQ0JVS1RiemhFblZ1Vi8zZWlFVVlUNVhEMzc4QWJ2S0xJTTVB?= =?utf-8?B?ckdBKysxQXgxQjlTWHVwbWpTclIvcXJaejJ5ZzQ5SHV2alRkalJJNW1aOXpn?= =?utf-8?B?VVk2QmQwQU41MXhaV3NtY0lWSTk3b0hLWGFNUHkrcURYenlSd3ZRYzl0RkRW?= =?utf-8?B?SFdMcXpvK3kvdmNzVzNpSTd5VHI0RG0xNUVaNnRMa0VWZkFUTmpiY0I1NDQz?= =?utf-8?B?d3hSb0lrL09WTEtrNzFYSzBoWHZ1b3lOcTIrdkwveW8yZFpHZS9VTWUrdzZ0?= =?utf-8?B?b1NURHhLL0dHc1EyUUtVTFFRMDBDRklSODdkczlsdlZCTjNJRE5QZm1jbWVm?= =?utf-8?B?em91MGlJbkVLRzg0RzNtcU80bHlqM3l6V05WOXBjU0I2cUFQRVJLT1FBSE1x?= =?utf-8?B?RkhDdVQ4OFZoTHpOQlZ5L0JDM25jekdRcWdHWElOVVdYanJqRlpRQWtrYVVs?= =?utf-8?B?WnNVbTUrMjgrZFNaNmJIdFg1eE9CVWtjeitPSER1NXFWNnhXZzVvM3pmSCtU?= =?utf-8?B?L3poMFMyUzM4SFJ2dEFGSUt2SlNxTUZTSVRmVEhIdWw3R0QwcmNobGFaNStL?= =?utf-8?B?Wnc4WGRRZ2FSdVNZR1k3bjA1ZXAzT3BOOEJEc1ZadENyZkdHcFZEOG1rYlRq?= =?utf-8?B?YnEvbTY4am9ZRVB1czVGUGM2Wjl5djZLRXJmeTlDNXZ4L0VVczlDQ21QTWRu?= =?utf-8?B?eWlpS0JtU3dMVjNmQjRidXJ3NVlGUEw5MklwckhNR2p6OGxHRWdHUDR2b3dx?= =?utf-8?B?UllreElOWEpPK2pPZ1JyaFB3andld3orOFgyaURTMkp0dTVMdWRiaDZEa1Zm?= =?utf-8?B?cmFFVzhmemE4UjNrSlQyY2tkMlo5SFA4WTlSa0hQSWFheGFCSEs3TnhTVStC?= =?utf-8?B?NnU5cEF6dEwzR0NaZkF5bTJBVFd2UzBsaG9SaURIT1pFcjNzYTFuWjZTSy84?= =?utf-8?B?S1JncTEvUHlnUkRiR3k1RGJjU3lPVG1RRFJKQ1EycGpack5HbTBsOEpvaXpv?= =?utf-8?B?dDkwOW5pTHpKVEZobmtWTjh4RldPY0lNN0M3bEh0SjFKZVBBQ3h6U25SRGN0?= =?utf-8?B?QlE9PQ==?= Content-ID: MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: LV8PR11MB8678.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: b8e4a204-f3b8-4952-0d69-08dbce1cc1b5 X-MS-Exchange-CrossTenant-originalarrivaltime: 16 Oct 2023 07:51:50.6882 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: NhqJ6tqibq5XC8NLW3pRaBUEH5bVvYcw1yW47bFmzGENzvH3cPMHD/cJI5EDGciy4ea3arSelaYpLCRlGVjNtA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM4PR11MB7183 X-OriginatorOrg: intel.com Subject: Re: [FFmpeg-devel] [PATCH 1/2] avfilter/vf_lut3d: expose 3D LUT file parse function. X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: "cyfdecyf@gmail.com" Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: T24gU2EsIDIwMjMtMDktMjMgYXQgMjM6MzYgKzA4MDAsIENoZW4gWXVmZWkgd3JvdGU6Cj4gU2ln bmVkLW9mZi1ieTogQ2hlbiBZdWZlaSA8Y3lmZGVjeWZAZ21haWwuY29tPgo+IC0tLQo+IMKgbGli YXZmaWx0ZXIvTWFrZWZpbGXCoMKgIHzCoMKgIDggKy0KPiDCoGxpYmF2ZmlsdGVyL2x1dDNkLmPC oMKgwqAgfCA2NjkgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKPiDC oGxpYmF2ZmlsdGVyL2x1dDNkLmjCoMKgwqAgfMKgIDEzICsKPiDCoGxpYmF2ZmlsdGVyL3ZmX2x1 dDNkLmMgfCA1OTAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gwqA0IGZp bGVzIGNoYW5nZWQsIDY4OSBpbnNlcnRpb25zKCspLCA1OTEgZGVsZXRpb25zKC0pCj4gwqBjcmVh dGUgbW9kZSAxMDA2NDQgbGliYXZmaWx0ZXIvbHV0M2QuYwo+IAo+IGRpZmYgLS1naXQgYS9saWJh dmZpbHRlci9NYWtlZmlsZSBiL2xpYmF2ZmlsdGVyL01ha2VmaWxlCj4gaW5kZXggMmZlMDAzM2Iy MS4uYzFjZDc5N2U1YyAxMDA2NDQKPiAtLS0gYS9saWJhdmZpbHRlci9NYWtlZmlsZQo+ICsrKyBi L2xpYmF2ZmlsdGVyL01ha2VmaWxlCj4gQEAgLTMzMCw3ICszMzAsNyBAQCBPQkpTLSQoQ09ORklH X0dSQVBITU9OSVRPUl9GSUxURVIpwqDCoMKgwqDCoMKgwqDCoMKgwqAgKz0KPiBmX2dyYXBobW9u aXRvci5vCj4gwqBPQkpTLSQoQ09ORklHX0dSQVlXT1JMRF9GSUxURVIpwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgKz0gdmZfZ3JheXdvcmxkLm8KPiDCoE9CSlMtJChDT05GSUdfR1JFWUVER0Vf RklMVEVSKcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKz0gdmZfY29sb3Jjb25zdGFuY3ku bwo+IMKgT0JKUy0kKENPTkZJR19HVUlERURfRklMVEVSKcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgICs9IHZmX2d1aWRlZC5vCj4gLU9CSlMtJChDT05GSUdfSEFMRENMVVRfRklMVEVS KcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKz0gdmZfbHV0M2QubyBmcmFtZXN5bmMubwo+ ICtPQkpTLSQoQ09ORklHX0hBTERDTFVUX0ZJTFRFUinCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgICs9IHZmX2x1dDNkLm8gbHV0M2Qubwo+IGZyYW1lc3luYy5vCj4gwqBPQkpTLSQoQ09ORklH X0hGTElQX0ZJTFRFUinCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICs9IHZmX2hm bGlwLm8KPiDCoE9CSlMtJChDT05GSUdfSEZMSVBfVlVMS0FOX0ZJTFRFUinCoMKgwqDCoMKgwqDC oMKgwqDCoCArPSB2Zl9mbGlwX3Z1bGthbi5vIHZ1bGthbi5vCj4gwqBPQkpTLSQoQ09ORklHX0hJ U1RFUV9GSUxURVIpwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKz0gdmZfaGlzdGVx Lm8KPiBAQCAtMzY3LDEwICszNjcsMTAgQEAgT0JKUy0kKENPTkZJR19MSU1JVERJRkZfRklMVEVS KcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICs9Cj4gdmZfbGltaXRkaWZmLm8gZnJhbWVzeW5j Lm8KPiDCoE9CSlMtJChDT05GSUdfTElNSVRFUl9GSUxURVIpwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgICs9IHZmX2xpbWl0ZXIubwo+IMKgT0JKUy0kKENPTkZJR19MT09QX0ZJTFRFUinC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKz0gZl9sb29wLm8KPiDCoE9CSlMt JChDT05GSUdfTFVNQUtFWV9GSUxURVIpwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICs9 IHZmX2x1bWFrZXkubwo+IC1PQkpTLSQoQ09ORklHX0xVVDFEX0ZJTFRFUinCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgICs9IHZmX2x1dDNkLm8KPiArT0JKUy0kKENPTkZJR19MVVQx RF9GSUxURVIpwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCArPSB2Zl9sdXQzZC5v IGx1dDNkLm8KPiDCoE9CSlMtJChDT05GSUdfTFVUX0ZJTFRFUinCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCArPSB2Zl9sdXQubwo+IMKgT0JKUy0kKENPTkZJR19MVVQyX0ZJ TFRFUinCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKz0gdmZfbHV0Mi5vIGZy YW1lc3luYy5vCj4gLU9CSlMtJChDT05GSUdfTFVUM0RfRklMVEVSKcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgKz0gdmZfbHV0M2QubyBmcmFtZXN5bmMubwo+ICtPQkpTLSQoQ09O RklHX0xVVDNEX0ZJTFRFUinCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICs9IHZm X2x1dDNkLm8gbHV0M2Qubwo+IGZyYW1lc3luYy5vCj4gwqBPQkpTLSQoQ09ORklHX0xVVFJHQl9G SUxURVIpwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKz0gdmZfbHV0Lm8KPiDCoE9C SlMtJChDT05GSUdfTFVUWVVWX0ZJTFRFUinCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCArPSB2Zl9sdXQubwo+IMKgT0JKUy0kKENPTkZJR19NQVNLRURDTEFNUF9GSUxURVIpwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCArPSB2Zl9tYXNrZWRjbGFtcC5vIGZyYW1lc3luYy5vCj4gQEAgLTU0 OSw3ICs1NDksNyBAQCBPQkpTLSQoQ09ORklHX1ZJRFNUQUJUUkFOU0ZPUk1fRklMVEVSKcKgwqDC oMKgwqDCoCArPQo+IHZpZHN0YWJ1dGlscy5vIHZmX3ZpZHN0YWJ0cmFuc2ZvCj4gwqBPQkpTLSQo Q09ORklHX1ZJRl9GSUxURVIpwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg Kz0gdmZfdmlmLm8gZnJhbWVzeW5jLm8KPiDCoE9CSlMtJChDT05GSUdfVklHTkVUVEVfRklMVEVS KcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKz0gdmZfdmlnbmV0dGUubwo+IMKgT0JKUy0k KENPTkZJR19WTUFGTU9USU9OX0ZJTFRFUinCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKz0gdmZf dm1hZm1vdGlvbi5vIGZyYW1lc3luYy5vCj4gLU9CSlMtJChDT05GSUdfVlBQX1FTVl9GSUxURVIp wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICs9IHZmX3ZwcF9xc3Yubwo+ICtPQkpTLSQo Q09ORklHX1ZQUF9RU1ZfRklMVEVSKcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCArPSB2 Zl92cHBfcXN2Lm8gbHV0M2QubwoKVGhpcyBzaG91bGQgYmUgbW92ZWQgdG8gcGF0Y2ggMi8yLiAK ClRoYW5rcwpIYWloYW8KCgo+IMKgT0JKUy0kKENPTkZJR19WU1RBQ0tfRklMVEVSKcKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICs9IHZmX3N0YWNrLm8gZnJhbWVzeW5jLm8KPiDCoE9C SlMtJChDT05GSUdfVzNGRElGX0ZJTFRFUinCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCArPSB2Zl93M2ZkaWYubwo+IMKgT0JKUy0kKENPTkZJR19XQVZFRk9STV9GSUxURVIpwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCArPSB2Zl93YXZlZm9ybS5vCj4gZGlmZiAtLWdpdCBhL2xp YmF2ZmlsdGVyL2x1dDNkLmMgYi9saWJhdmZpbHRlci9sdXQzZC5jCj4gbmV3IGZpbGUgbW9kZSAx MDA2NDQKPiBpbmRleCAwMDAwMDAwMDAwLi4xNzM5NzlhZGNjCj4gLS0tIC9kZXYvbnVsbAo+ICsr KyBiL2xpYmF2ZmlsdGVyL2x1dDNkLmMKPiBAQCAtMCwwICsxLDY2OSBAQAo+ICsvKgo+ICsgKiBD b3B5cmlnaHQgKGMpIDIwMTMgQ2zDqW1lbnQgQsWTc2NoCj4gKyAqIENvcHlyaWdodCAoYykgMjAx OCBQYXVsIEIgTWFob2wKPiArICoKPiArICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgo+ ICsgKgo+ICsgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg aXQgYW5kL29yCj4gKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNz ZXIgR2VuZXJhbCBQdWJsaWMKPiArICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCj4gKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNl bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgo+ICsgKgo+ICsgKiBG Rm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwK PiArICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg d2FycmFudHkgb2YKPiArICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD VUxBUiBQVVJQT1NFLsKgIFNlZSB0aGUgR05VCj4gKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCj4gKyAqCj4gKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNl aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKPiArICogTGljZW5z ZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQo+ ICsgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBC b3N0b24sIE1BIDAyMTEwLTEzMDEKPiBVU0EKPiArICovCj4gKwo+ICsjaW5jbHVkZSAibHV0M2Qu aCIKPiArCj4gKyNpbmNsdWRlIDxmbG9hdC5oPgo+ICsKPiArI2luY2x1ZGUgImxpYmF2dXRpbC9h dnN0cmluZy5oIgo+ICsjaW5jbHVkZSAibGliYXZ1dGlsL2ZpbGVfb3Blbi5oIgo+ICsKPiArI2Rl ZmluZSBFWFBPTkVOVF9NQVNLIDB4N0Y4MDAwMDAKPiArI2RlZmluZSBNQU5USVNTQV9NQVNLIDB4 MDA3RkZGRkYKPiArI2RlZmluZSBTSUdOX01BU0vCoMKgwqDCoCAweDgwMDAwMDAwCj4gKwo+ICtz dGF0aWMgaW5saW5lIGZsb2F0IHNhbml0aXplZihmbG9hdCBmKQo+ICt7Cj4gK8KgwqDCoCB1bmlv biBhdl9pbnRmbG9hdDMyIHQ7Cj4gK8KgwqDCoCB0LmYgPSBmOwo+ICsKPiArwqDCoMKgIGlmICgo dC5pICYgRVhQT05FTlRfTUFTSykgPT0gRVhQT05FTlRfTUFTSykgewo+ICvCoMKgwqDCoMKgwqDC oCBpZiAoKHQuaSAmIE1BTlRJU1NBX01BU0spICE9IDApIHsKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCAvLyBOQU4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gMC4wZjsKPiArwqDC oMKgwqDCoMKgwqAgfSBlbHNlIGlmICh0LmkgJiBTSUdOX01BU0spIHsKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCAvLyAtSU5GCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1GTFRf TUFYOwo+ICvCoMKgwqDCoMKgwqDCoCB9IGVsc2Ugewo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IC8vICtJTkYKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gRkxUX01BWDsKPiArwqDC oMKgwqDCoMKgwqAgfQo+ICvCoMKgwqAgfQo+ICvCoMKgwqAgcmV0dXJuIGY7Cj4gK30KPiArCj4g K3N0YXRpYyBpbmxpbmUgZmxvYXQgbGVycGYoZmxvYXQgdjAsIGZsb2F0IHYxLCBmbG9hdCBmKQo+ ICt7Cj4gK8KgwqDCoCByZXR1cm4gdjAgKyAodjEgLSB2MCkgKiBmOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgaW5saW5lIHN0cnVjdCByZ2J2ZWMgbGVycChjb25zdCBzdHJ1Y3QgcmdidmVjICp2MCwgY29u c3Qgc3RydWN0IHJnYnZlYwo+ICp2MSwgZmxvYXQgZikKPiArewo+ICvCoMKgwqAgc3RydWN0IHJn YnZlYyB2ID0gewo+ICvCoMKgwqDCoMKgwqDCoCBsZXJwZih2MC0+ciwgdjEtPnIsIGYpLCBsZXJw Zih2MC0+ZywgdjEtPmcsIGYpLCBsZXJwZih2MC0+YiwgdjEtPmIsCj4gZikKPiArwqDCoMKgIH07 Cj4gK8KgwqDCoCByZXR1cm4gdjsKPiArfQo+ICsKPiAraW50IGZmX2FsbG9jYXRlXzNkbHV0KEFW RmlsdGVyQ29udGV4dCAqY3R4LCBMVVQzRENvbnRleHQgKmx1dDNkLCBpbnQgbHV0c2l6ZSwKPiBp bnQgcHJlbHV0KQo+ICt7Cj4gK8KgwqDCoCBpbnQgaTsKPiArwqDCoMKgIGlmIChsdXRzaXplIDwg MiB8fCBsdXRzaXplID4gTUFYX0xFVkVMKSB7Cj4gK8KgwqDCoMKgwqDCoMKgIGF2X2xvZyhjdHgs IEFWX0xPR19FUlJPUiwgIlRvbyBsYXJnZSBvciBpbnZhbGlkIDNEIExVVCBzaXplXG4iKTsKPiAr wqDCoMKgwqDCoMKgwqAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKPiArwqDCoMKgIH0KPiArCj4g K8KgwqDCoCBhdl9mcmVlcCgmbHV0M2QtPmx1dCk7Cj4gK8KgwqDCoCBsdXQzZC0+bHV0ID0gYXZf bWFsbG9jX2FycmF5KGx1dHNpemUgKiBsdXRzaXplICogbHV0c2l6ZSwgc2l6ZW9mKCpsdXQzZC0K PiA+bHV0KSk7Cj4gK8KgwqDCoCBpZiAoIWx1dDNkLT5sdXQpCj4gK8KgwqDCoMKgwqDCoMKgIHJl dHVybiBBVkVSUk9SKEVOT01FTSk7Cj4gKwo+ICvCoMKgwqAgaWYgKHByZWx1dCkgewo+ICvCoMKg wqDCoMKgwqDCoCBsdXQzZC0+cHJlbHV0LnNpemUgPSBQUkVMVVRfU0laRTsKPiArwqDCoMKgwqDC oMKgwqAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGF2X2ZyZWVwKCZsdXQzZC0+cHJlbHV0Lmx1dFtpXSk7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqAgbHV0M2QtPnByZWx1dC5sdXRbaV0gPSBhdl9tYWxsb2NfYXJyYXkoUFJFTFVUX1NJWkUsCj4g c2l6ZW9mKCpsdXQzZC0+cHJlbHV0Lmx1dFswXSkpOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGlmICghbHV0M2QtPnByZWx1dC5sdXRbaV0pCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwo+ICvCoMKgwqDCoMKgwqDCoCB9Cj4gK8KgwqDC oCB9IGVsc2Ugewo+ICvCoMKgwqDCoMKgwqDCoCBsdXQzZC0+cHJlbHV0LnNpemUgPSAwOwo+ICvC oMKgwqDCoMKgwqDCoCBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Cj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqAgYXZfZnJlZXAoJmx1dDNkLT5wcmVsdXQubHV0W2ldKTsKPiArwqDCoMKgwqDCoMKg wqAgfQo+ICvCoMKgwqAgfQo+ICvCoMKgwqAgbHV0M2QtPmx1dHNpemUgPSBsdXRzaXplOwo+ICvC oMKgwqAgbHV0M2QtPmx1dHNpemUyID0gbHV0c2l6ZSAqIGx1dHNpemU7Cj4gK8KgwqDCoCByZXR1 cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBzZXRfaWRlbnRpdHlfbWF0cml4KEFWRmlsdGVy Q29udGV4dCAqY3R4LCBMVVQzRENvbnRleHQgKmx1dDNkLCBpbnQKPiBzaXplKQo+ICt7Cj4gK8Kg wqDCoCBpbnQgcmV0LCBpLCBqLCBrOwo+ICvCoMKgwqAgY29uc3QgaW50IHNpemUyID0gc2l6ZSAq IHNpemU7Cj4gK8KgwqDCoCBjb25zdCBmbG9hdCBjID0gMS4gLyAoc2l6ZSAtIDEpOwo+ICsKPiAr wqDCoMKgIHJldCA9IGZmX2FsbG9jYXRlXzNkbHV0KGN0eCwgbHV0M2QsIHNpemUsIDApOwo+ICvC oMKgwqAgaWYgKHJldCA8IDApCj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiByZXQ7Cj4gKwo+ICvC oMKgwqAgZm9yIChrID0gMDsgayA8IHNpemU7IGsrKykgewo+ICvCoMKgwqDCoMKgwqDCoCBmb3Ig KGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZm9yIChp ID0gMDsgaSA8IHNpemU7IGkrKykgewo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg c3RydWN0IHJnYnZlYyAqdmVjID0gJmx1dDNkLT5sdXRbayAqIHNpemUyICsgaiAqIHNpemUgKyBp XTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHZlYy0+ciA9IGsgKiBjOwo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdmVjLT5nID0gaiAqIGM7Cj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB2ZWMtPmIgPSBpICogYzsKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCB9Cj4gK8KgwqDCoMKgwqDCoMKgIH0KPiArwqDCoMKgIH0KPiArCj4gK8KgwqDCoCBy ZXR1cm4gMDsKPiArfQo+ICsKPiArI2RlZmluZSBNQVhfTElORV9TSVpFIDUxMgo+ICsKPiArc3Rh dGljIGludCBza2lwX2xpbmUoY29uc3QgY2hhciAqcCkKPiArewo+ICvCoMKgwqAgd2hpbGUgKCpw ICYmIGF2X2lzc3BhY2UoKnApKQo+ICvCoMKgwqDCoMKgwqDCoCBwKys7Cj4gK8KgwqDCoCByZXR1 cm4gISpwIHx8ICpwID09ICcjJzsKPiArfQo+ICsKPiArc3RhdGljIGNoYXIqIGZnZXRfbmV4dF93 b3JkKGNoYXIqIGRzdCwgaW50IG1heCwgRklMRSogZikKPiArewo+ICvCoMKgwqAgaW50IGM7Cj4g K8KgwqDCoCBjaGFyICpwID0gZHN0Owo+ICsKPiArwqDCoMKgIC8qIGZvciBudWxsICovCj4gK8Kg wqDCoCBtYXgtLTsKPiArwqDCoMKgIC8qIHNraXAgdW50aWwgbmV4dCBub24gd2hpdGVzcGFjZSBj aGFyICovCj4gK8KgwqDCoCB3aGlsZSAoKGMgPSBmZ2V0YyhmKSkgIT0gRU9GKSB7Cj4gK8KgwqDC oMKgwqDCoMKgIGlmIChhdl9pc3NwYWNlKGMpKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNv bnRpbnVlOwo+ICsKPiArwqDCoMKgwqDCoMKgwqAgKnArKyA9IGM7Cj4gK8KgwqDCoMKgwqDCoMKg IG1heC0tOwo+ICvCoMKgwqDCoMKgwqDCoCBicmVhazsKPiArwqDCoMKgIH0KPiArCj4gK8KgwqDC oCAvKiBnZXQgbWF4IGJ5dGVzIG9yIHVwIHVudGlsIG5leHQgd2hpdGVzcGFjZSBjaGFyICovCj4g K8KgwqDCoCBmb3IgKDsgbWF4ID4gMDsgbWF4LS0pIHsKPiArwqDCoMKgwqDCoMKgwqAgaWYgKChj ID0gZmdldGMoZikpID09IEVPRikKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBicmVhazsKPiAr Cj4gK8KgwqDCoMKgwqDCoMKgIGlmIChhdl9pc3NwYWNlKGMpKQo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIGJyZWFrOwo+ICsKPiArwqDCoMKgwqDCoMKgwqAgKnArKyA9IGM7Cj4gK8KgwqDCoCB9 Cj4gKwo+ICvCoMKgwqAgKnAgPSAwOwo+ICvCoMKgwqAgaWYgKHAgPT0gZHN0KQo+ICvCoMKgwqDC oMKgwqDCoCByZXR1cm4gTlVMTDsKPiArwqDCoMKgIHJldHVybiBwOwo+ICt9Cj4gKwo+ICsKPiAr I2RlZmluZSBORVhUX0xJTkUobG9vcF9jb25kKSBkbyB7wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcCj4gK8KgwqDCoCBpZiAoIWZnZXRzKGxpbmUs IHNpemVvZihsaW5lKSwgZikpIHvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBcCj4gK8KgwqDCoMKgwqDCoMKgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlVuZXhwZWN0 ZWQgRU9GXG4iKTvCoMKgwqDCoMKgIFwKPiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIEFWRVJST1Jf SU5WQUxJRERBVEE7wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIFwKPiArwqDCoMKgIH3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgXAo+ICt9IHdoaWxlIChsb29wX2NvbmQpCj4gKwo+ICsjZGVmaW5lIE5FWFRf TElORV9PUl9HT1RPKGxvb3BfY29uZCwgbGFiZWwpIGRvIHvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IFwKPiArwqDCoMKgIGlmICghZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmKSkge8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwKPiArwqDCoMKgwqDCoMKgwqAgYXZfbG9n KGN0eCwgQVZfTE9HX0VSUk9SLCAiVW5leHBlY3RlZCBFT0ZcbiIpO8KgwqDCoMKgwqAgXAo+ICvC oMKgwqDCoMKgwqDCoCByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBO8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwKPiArwqDCoMKgwqDCoMKgwqAgZ290 byBsYWJlbDvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcCj4gK8KgwqDCoCB9wqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwKPiArfSB3aGlsZSAobG9v cF9jb25kKQo+ICsKPiArLyogQmFzaWNhbGx5IHIgZyBhbmQgYiBmbG9hdCB2YWx1ZXMgb24gZWFj aCBsaW5lLCB3aXRoIGEgZmFjdWx0YXRpdmUKPiAzRExVVFNJWkUKPiArICogZGlyZWN0aXZlOyBz ZWVtcyB0byBiZSBnZW5lcmF0ZWQgYnkgRGF2aW5jaSAqLwo+ICtzdGF0aWMgaW50IHBhcnNlX2Rh dChBVkZpbHRlckNvbnRleHQgKmN0eCwgTFVUM0RDb250ZXh0ICpsdXQzZCwgRklMRSAqZikKPiAr ewo+ICvCoMKgwqAgY2hhciBsaW5lW01BWF9MSU5FX1NJWkVdOwo+ICvCoMKgwqAgaW50IHJldCwg aSwgaiwgaywgc2l6ZSwgc2l6ZTI7Cj4gKwo+ICvCoMKgwqAgbHV0M2QtPmx1dHNpemUgPSBzaXpl ID0gMzM7Cj4gK8KgwqDCoCBzaXplMiA9IHNpemUgKiBzaXplOwo+ICsKPiArwqDCoMKgIE5FWFRf TElORShza2lwX2xpbmUobGluZSkpOwo+ICvCoMKgwqAgaWYgKCFzdHJuY21wKGxpbmUsICIzRExV VFNJWkUgIiwgMTApKSB7Cj4gK8KgwqDCoMKgwqDCoMKgIHNpemUgPSBzdHJ0b2wobGluZSArIDEw LCBOVUxMLCAwKTsKPiArCj4gK8KgwqDCoMKgwqDCoMKgIE5FWFRfTElORShza2lwX2xpbmUobGlu ZSkpOwo+ICvCoMKgwqAgfQo+ICsKPiArwqDCoMKgIHJldCA9IGZmX2FsbG9jYXRlXzNkbHV0KGN0 eCwgbHV0M2QsIHNpemUsIDApOwo+ICvCoMKgwqAgaWYgKHJldCA8IDApCj4gK8KgwqDCoMKgwqDC oMKgIHJldHVybiByZXQ7Cj4gKwo+ICvCoMKgwqAgZm9yIChrID0gMDsgayA8IHNpemU7IGsrKykg ewo+ICvCoMKgwqDCoMKgwqDCoCBmb3IgKGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7Cj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IHJnYnZlYyAqdmVjID0gJmx1dDNkLT5sdXRb ayAqIHNpemUyICsgaiAqIHNpemUgKyBpXTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGlmIChrICE9IDAgfHwgaiAhPSAwIHx8IGkgIT0gMCkKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgTkVYVF9MSU5FKHNraXBfbGluZShsaW5lKSk7Cj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoYXZfc3NjYW5mKGxpbmUsICIlZiAlZiAlZiIs ICZ2ZWMtPnIsICZ2ZWMtPmcsICZ2ZWMtPmIpICE9Cj4gMykKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Cj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqAgfQo+ICvCoMKgwqDCoMKgwqDCoCB9Cj4gK8KgwqDCoCB9Cj4gK8Kg wqDCoCByZXR1cm4gMDsKPiArfQo+ICsKPiArLyogSXJpZGFzIGZvcm1hdCAqLwo+ICtzdGF0aWMg aW50IHBhcnNlX2N1YmUoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIExVVDNEQ29udGV4dCAqbHV0M2Qs IEZJTEUgKmYpCj4gK3sKPiArwqDCoMKgIGNoYXIgbGluZVtNQVhfTElORV9TSVpFXTsKPiArwqDC oMKgIGZsb2F0IG1pblszXSA9IHswLjAsIDAuMCwgMC4wfTsKPiArwqDCoMKgIGZsb2F0IG1heFsz XSA9IHsxLjAsIDEuMCwgMS4wfTsKPiArCj4gK8KgwqDCoCB3aGlsZSAoZmdldHMobGluZSwgc2l6 ZW9mKGxpbmUpLCBmKSkgewo+ICvCoMKgwqDCoMKgwqDCoCBpZiAoIXN0cm5jbXAobGluZSwgIkxV VF8zRF9TSVpFIiwgMTEpKSB7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW50IHJldCwgaSwg aiwgazsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb25zdCBpbnQgc2l6ZSA9IHN0cnRvbChs aW5lICsgMTIsIE5VTEwsIDApOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbnN0IGludCBz aXplMiA9IHNpemUgKiBzaXplOwo+ICsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXQgPSBm Zl9hbGxvY2F0ZV8zZGx1dChjdHgsIGx1dDNkLCBzaXplLCAwKTsKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBpZiAocmV0IDwgMCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJl dHVybiByZXQ7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZvciAoayA9IDA7IGsgPCBz aXplOyBrKyspIHsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZvciAoaiA9IDA7 IGogPCBzaXplOyBqKyspIHsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0cnVjdCByZ2J2ZWMgKnZlYyA9ICZsdXQzZC0+bHV0 W2kgKiBzaXplMiArIGogKiBzaXplCj4gKyBrXTsKPiArCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZG8gewo+ICt0cnlfYWdhaW46Cj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBORVhUX0xJTkUo MCk7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBpZiAoIXN0cm5jbXAobGluZSwgIkRPTUFJTl8iLCA3KSkgewo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmbG9hdCAq dmFscyA9IE5VTEw7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmwqDCoMKgwqDCoCAoIXN0cm5jbXAobGluZSArIDcsICJN SU4gIiwgNCkpIHZhbHMKPiA9IG1pbjsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZWxzZSBpZiAoIXN0cm5jbXAobGluZSAr IDcsICJNQVggIiwgNCkpIHZhbHMKPiA9IG1heDsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKCF2YWxzKQo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBhdl9zc2NhbmYo bGluZSArIDExLCAiJWYgJWYgJWYiLCB2YWxzLCB2YWxzICsKPiAxLCB2YWxzICsgMik7Cj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIm1pbjogJWYgJWYgJWYgfAo+IG1heDogJWYg JWYgJWZcbiIsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbWluWzBdLCBtaW5bMV0sIG1pblsyXSwg bWF4WzBdLAo+IG1heFsxXSwgbWF4WzJdKTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZ290byB0cnlfYWdhaW47Cj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9IGVs c2UgaWYgKCFzdHJuY21wKGxpbmUsICJUSVRMRSIsIDUpKSB7Cj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGdvdG8gdHJ5X2Fn YWluOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgfQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IH0gd2hpbGUgKHNraXBfbGluZShsaW5lKSk7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKGF2X3NzY2FuZihsaW5lLCAiJWYgJWYgJWYiLCAmdmVj LT5yLCAmdmVjLT5nLAo+ICZ2ZWMtPmIpICE9IDMpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFU QTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBicmVhazsKPiArwqDCoMKgwqDCoMKgwqAgfQo+ICvCoMKg wqAgfQo+ICsKPiArwqDCoMKgIGx1dDNkLT5zY2FsZS5yID0gYXZfY2xpcGYoMS4gLyAobWF4WzBd IC0gbWluWzBdKSwgMC5mLCAxLmYpOwo+ICvCoMKgwqAgbHV0M2QtPnNjYWxlLmcgPSBhdl9jbGlw ZigxLiAvIChtYXhbMV0gLSBtaW5bMV0pLCAwLmYsIDEuZik7Cj4gK8KgwqDCoCBsdXQzZC0+c2Nh bGUuYiA9IGF2X2NsaXBmKDEuIC8gKG1heFsyXSAtIG1pblsyXSksIDAuZiwgMS5mKTsKPiArCj4g K8KgwqDCoCByZXR1cm4gMDsKPiArfQo+ICsKPiArLyogQXNzdW1lIDE3eDE3eDE3IExVVCB3aXRo IGEgMTYtYml0IGRlcHRoCj4gKyAqIEZJWE1FOiBpdCBzZWVtcyB0aGVyZSBhcmUgdmFyaW91cyAz ZGwgZm9ybWF0cyAqLwo+ICtzdGF0aWMgaW50IHBhcnNlXzNkbChBVkZpbHRlckNvbnRleHQgKmN0 eCwgTFVUM0RDb250ZXh0ICpsdXQzZCwgRklMRSAqZikKPiArewo+ICvCoMKgwqAgY2hhciBsaW5l W01BWF9MSU5FX1NJWkVdOwo+ICvCoMKgwqAgaW50IHJldCwgaSwgaiwgazsKPiArwqDCoMKgIGNv bnN0IGludCBzaXplID0gMTc7Cj4gK8KgwqDCoCBjb25zdCBpbnQgc2l6ZTIgPSAxNyAqIDE3Owo+ ICvCoMKgwqAgY29uc3QgZmxvYXQgc2NhbGUgPSAxNioxNioxNjsKPiArCj4gK8KgwqDCoCBsdXQz ZC0+bHV0c2l6ZSA9IHNpemU7Cj4gKwo+ICvCoMKgwqAgcmV0ID0gZmZfYWxsb2NhdGVfM2RsdXQo Y3R4LCBsdXQzZCwgc2l6ZSwgMCk7Cj4gK8KgwqDCoCBpZiAocmV0IDwgMCkKPiArwqDCoMKgwqDC oMKgwqAgcmV0dXJuIHJldDsKPiArCj4gK8KgwqDCoCBORVhUX0xJTkUoc2tpcF9saW5lKGxpbmUp KTsKPiArwqDCoMKgIGZvciAoayA9IDA7IGsgPCBzaXplOyBrKyspIHsKPiArwqDCoMKgwqDCoMKg wqAgZm9yIChqID0gMDsgaiA8IHNpemU7IGorKykgewo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIGludCByLCBnLCBiOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3Ry dWN0IHJnYnZlYyAqdmVjID0gJmx1dDNkLT5sdXRbayAqIHNpemUyICsgaiAqIHNpemUgKyBpXTsK PiArCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBORVhUX0xJTkUoc2tpcF9saW5l KGxpbmUpKTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmIChhdl9zc2NhbmYo bGluZSwgIiVkICVkICVkIiwgJnIsICZnLCAmYikgIT0gMykKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Cj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB2ZWMtPnIgPSByIC8gc2NhbGU7Cj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB2ZWMtPmcgPSBnIC8gc2NhbGU7Cj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCB2ZWMtPmIgPSBiIC8gc2NhbGU7Cj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqAgfQo+ICvCoMKgwqDCoMKgwqDCoCB9Cj4gK8KgwqDCoCB9Cj4gK8KgwqDCoCByZXR1 cm4gMDsKPiArfQo+ICsKPiArLyogUGFuZG9yYSBmb3JtYXQgKi8KPiArc3RhdGljIGludCBwYXJz ZV9tM2QoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIExVVDNEQ29udGV4dCAqbHV0M2QsIEZJTEUgKmYp Cj4gK3sKPiArwqDCoMKgIGZsb2F0IHNjYWxlOwo+ICvCoMKgwqAgaW50IHJldCwgaSwgaiwgaywg c2l6ZSwgc2l6ZTIsIGluID0gLTEsIG91dCA9IC0xOwo+ICvCoMKgwqAgY2hhciBsaW5lW01BWF9M SU5FX1NJWkVdOwo+ICvCoMKgwqAgdWludDhfdCByZ2JfbWFwWzNdID0gezAsIDEsIDJ9Owo+ICsK PiArwqDCoMKgIHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGYpKSB7Cj4gK8KgwqDC oMKgwqDCoMKgIGlmwqDCoMKgwqDCoCAoIXN0cm5jbXAobGluZSwgImluIizCoCAyKSkgaW7CoCA9 IHN0cnRvbChsaW5lICsgMiwgTlVMTCwgMCk7Cj4gK8KgwqDCoMKgwqDCoMKgIGVsc2UgaWYgKCFz dHJuY21wKGxpbmUsICJvdXQiLCAzKSkgb3V0ID0gc3RydG9sKGxpbmUgKyAzLCBOVUxMLCAwKTsK PiArwqDCoMKgwqDCoMKgwqAgZWxzZSBpZiAoIXN0cm5jbXAobGluZSwgInZhbHVlcyIsIDYpKSB7 Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29uc3QgY2hhciAqcCA9IGxpbmUgKyA2Owo+ICsj ZGVmaW5lIFNFVF9DT0xPUihpZCkgZG8ge8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgXAo+ICvCoMKgwqAgd2hpbGUgKGF2X2lzc3BhY2UoKnApKcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgXAo+ICvCoMKgwqDCoMKgwqDCoCBwKys7wqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXAo+ICvCoMKgwqAg c3dpdGNoICgqcCkge8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgXAo+ICvCoMKgwqAgY2FzZSAncic6IHJnYl9tYXBbaWRdID0gMDsgYnJlYWs7wqDC oMKgwqDCoMKgIFwKPiArwqDCoMKgIGNhc2UgJ2cnOiByZ2JfbWFwW2lkXSA9IDE7IGJyZWFrO8Kg wqDCoMKgwqDCoCBcCj4gK8KgwqDCoCBjYXNlICdiJzogcmdiX21hcFtpZF0gPSAyOyBicmVhazvC oMKgwqDCoMKgwqAgXAo+ICvCoMKgwqAgfcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXAo+ICvCoMKgwqAg d2hpbGUgKCpwICYmICFhdl9pc3NwYWNlKCpwKSnCoMKgwqDCoMKgwqDCoMKgwqDCoCBcCj4gK8Kg wqDCoMKgwqDCoMKgIHArKzvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcCj4gK30gd2hpbGUgKDApCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqAgU0VUX0NPTE9SKDApOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFNFVF9DT0xP UigxKTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBTRVRfQ09MT1IoMik7Cj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqAgYnJlYWs7Cj4gK8KgwqDCoMKgwqDCoMKgIH0KPiArwqDCoMKgIH0KPiAr Cj4gK8KgwqDCoCBpZiAoaW4gPT0gLTEgfHwgb3V0ID09IC0xKSB7Cj4gK8KgwqDCoMKgwqDCoMKg IGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgImluIGFuZCBvdXQgbXVzdCBiZSBkZWZpbmVkXG4i KTsKPiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Cj4gK8KgwqDC oCB9Cj4gK8KgwqDCoCBpZiAoaW4gPCAyIHx8IG91dCA8IDIgfHwKPiArwqDCoMKgwqDCoMKgwqAg aW7CoCA+IE1BWF9MRVZFTCpNQVhfTEVWRUwqTUFYX0xFVkVMIHx8Cj4gK8KgwqDCoMKgwqDCoMKg IG91dCA+IE1BWF9MRVZFTCpNQVhfTEVWRUwqTUFYX0xFVkVMKSB7Cj4gK8KgwqDCoMKgwqDCoMKg IGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgaW4gKCVkKSBvciBvdXQgKCVkKVxu IiwgaW4sIG91dCk7Cj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRB Owo+ICvCoMKgwqAgfQo+ICvCoMKgwqAgZm9yIChzaXplID0gMTsgc2l6ZSpzaXplKnNpemUgPCBp bjsgc2l6ZSsrKTsKPiArwqDCoMKgIGx1dDNkLT5sdXRzaXplID0gc2l6ZTsKPiArwqDCoMKgIHNp emUyID0gc2l6ZSAqIHNpemU7Cj4gKwo+ICvCoMKgwqAgcmV0ID0gZmZfYWxsb2NhdGVfM2RsdXQo Y3R4LCBsdXQzZCwgc2l6ZSwgMCk7Cj4gK8KgwqDCoCBpZiAocmV0IDwgMCkKPiArwqDCoMKgwqDC oMKgwqAgcmV0dXJuIHJldDsKPiArCj4gK8KgwqDCoCBzY2FsZSA9IDEuIC8gKG91dCAtIDEpOwo+ ICsKPiArwqDCoMKgIGZvciAoayA9IDA7IGsgPCBzaXplOyBrKyspIHsKPiArwqDCoMKgwqDCoMKg wqAgZm9yIChqID0gMDsgaiA8IHNpemU7IGorKykgewo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHN0cnVjdCByZ2J2ZWMgKnZlYyA9ICZsdXQzZC0+bHV0W2sgKiBzaXplMiArIGogKiBz aXplICsgaV07Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmbG9hdCB2YWxbM107 Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgTkVYVF9MSU5FKDApOwo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKGF2X3NzY2FuZihsaW5lLCAiJWYgJWYg JWYiLCB2YWwsIHZhbCArIDEsIHZhbCArIDIpICE9IDMpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdmVjLT5yID0gdmFsW3JnYl9tYXBbMF1dICogc2NhbGU7 Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB2ZWMtPmcgPSB2YWxbcmdiX21hcFsx XV0gKiBzY2FsZTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHZlYy0+YiA9IHZh bFtyZ2JfbWFwWzJdXSAqIHNjYWxlOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPiArwqDC oMKgwqDCoMKgwqAgfQo+ICvCoMKgwqAgfQo+ICvCoMKgwqAgcmV0dXJuIDA7Cj4gK30KPiArCj4g K3N0YXRpYyBpbnQgbmVhcmVzdF9zYW1wbGVfaW5kZXgoZmxvYXQgKmRhdGEsIGZsb2F0IHgsIGlu dCBsb3csIGludCBoaSkKPiArewo+ICvCoMKgwqAgaW50IG1pZDsKPiArwqDCoMKgIGlmICh4IDwg ZGF0YVtsb3ddKQo+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gbG93Owo+ICsKPiArwqDCoMKgIGlm ICh4ID4gZGF0YVtoaV0pCj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBoaTsKPiArCj4gK8KgwqDC oCBmb3IgKDs7KSB7Cj4gK8KgwqDCoMKgwqDCoMKgIGF2X2Fzc2VydDAoeCA+PSBkYXRhW2xvd10p Owo+ICvCoMKgwqDCoMKgwqDCoCBhdl9hc3NlcnQwKHggPD0gZGF0YVtoaV0pOwo+ICvCoMKgwqDC oMKgwqDCoCBhdl9hc3NlcnQwKChoaS1sb3cpID4gMCk7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoCBp ZiAoaGkgLSBsb3cgPT0gMSkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gbG93Owo+ ICsKPiArwqDCoMKgwqDCoMKgwqAgbWlkID0gKGxvdyArIGhpKSAvIDI7Cj4gKwo+ICvCoMKgwqDC oMKgwqDCoCBpZiAoeCA8IGRhdGFbbWlkXSkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBoaSA9 IG1pZDsKPiArwqDCoMKgwqDCoMKgwqAgZWxzZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxv dyA9IG1pZDsKPiArwqDCoMKgIH0KPiArCj4gK8KgwqDCoCByZXR1cm4gMDsKPiArfQo+ICsKPiAr I2RlZmluZSBORVhUX0ZMT0FUX09SX0dPVE8odmFsdWUsIGxhYmVsKcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwKPiArwqDCoMKgIGlmICghZmdldF9uZXh0X3dvcmQobGlu ZSwgc2l6ZW9mKGxpbmUpICxmKSkge8KgwqDCoMKgwqDCoMKgwqDCoMKgIFwKPiArwqDCoMKgwqDC oMKgwqAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcCj4gK8KgwqDCoMKgwqDCoMKgIGdvdG8gbGFiZWw7 wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXAo+ICvCoMKgwqAgfcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcCj4gK8KgwqDCoCBpZiAoYXZfc3NjYW5m KGxpbmUsICIlZiIsICZ2YWx1ZSkgIT0gMSkge8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg XAo+ICvCoMKgwqDCoMKgwqDCoCByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBO8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwKPiArwqDCoMKgwqDCoMKg wqAgZ290byBsYWJlbDvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcCj4gK8KgwqDCoCB9Cj4gKwo+ ICtzdGF0aWMgaW50IHBhcnNlX2NpbmVzcGFjZShBVkZpbHRlckNvbnRleHQgKmN0eCwgTFVUM0RD b250ZXh0ICpsdXQzZCwgRklMRQo+ICpmKQo+ICt7Cj4gK8KgwqDCoCBjaGFyIGxpbmVbTUFYX0xJ TkVfU0laRV07Cj4gK8KgwqDCoCBmbG9hdCBpbl9taW5bM13CoCA9IHswLjAsIDAuMCwgMC4wfTsK PiArwqDCoMKgIGZsb2F0IGluX21heFszXcKgID0gezEuMCwgMS4wLCAxLjB9Owo+ICvCoMKgwqAg ZmxvYXQgb3V0X21pblszXSA9IHswLjAsIDAuMCwgMC4wfTsKPiArwqDCoMKgIGZsb2F0IG91dF9t YXhbM10gPSB7MS4wLCAxLjAsIDEuMH07Cj4gK8KgwqDCoCBpbnQgaW5zaWRlX21ldGFkYXRhID0g MCwgc2l6ZSwgc2l6ZTI7Cj4gK8KgwqDCoCBpbnQgcHJlbHV0ID0gMDsKPiArwqDCoMKgIGludCBy ZXQgPSAwOwo+ICsKPiArwqDCoMKgIGludCBwcmVsdXRfc2l6ZXNbM10gPSB7MCwgMCwgMH07Cj4g K8KgwqDCoCBmbG9hdCAqaW5fcHJlbHV0WzNdwqAgPSB7TlVMTCwgTlVMTCwgTlVMTH07Cj4gK8Kg wqDCoCBmbG9hdCAqb3V0X3ByZWx1dFszXSA9IHtOVUxMLCBOVUxMLCBOVUxMfTsKPiArCj4gK8Kg wqDCoCBORVhUX0xJTkVfT1JfR09UTyhza2lwX2xpbmUobGluZSksIGVuZCk7Cj4gK8KgwqDCoCBp ZiAoc3RybmNtcChsaW5lLCAiQ1NQTFVUVjEwMCIsIDEwKSkgewo+ICvCoMKgwqDCoMKgwqDCoCBh dl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJOb3QgY2luZVNwYWNlIExVVCBmb3JtYXRcbiIpOwo+ ICvCoMKgwqDCoMKgwqDCoCByZXQgPSBBVkVSUk9SKEVJTlZBTCk7Cj4gK8KgwqDCoMKgwqDCoMKg IGdvdG8gZW5kOwo+ICvCoMKgwqAgfQo+ICsKPiArwqDCoMKgIE5FWFRfTElORV9PUl9HT1RPKHNr aXBfbGluZShsaW5lKSwgZW5kKTsKPiArwqDCoMKgIGlmIChzdHJuY21wKGxpbmUsICIzRCIsIDIp KSB7Cj4gK8KgwqDCoMKgwqDCoMKgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk5vdCAzRCBM VVQgZm9ybWF0XG4iKTsKPiArwqDCoMKgwqDCoMKgwqAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwo+ ICvCoMKgwqDCoMKgwqDCoCBnb3RvIGVuZDsKPiArwqDCoMKgIH0KPiArCj4gK8KgwqDCoCB3aGls ZSAoMSkgewo+ICvCoMKgwqDCoMKgwqDCoCBORVhUX0xJTkVfT1JfR09UTyhza2lwX2xpbmUobGlu ZSksIGVuZCk7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoCBpZiAoIXN0cm5jbXAobGluZSwgIkJFR0lO IE1FVEFEQVRBIiwgMTQpKSB7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW5zaWRlX21ldGFk YXRhID0gMTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb250aW51ZTsKPiArwqDCoMKgwqDC oMKgwqAgfQo+ICvCoMKgwqDCoMKgwqDCoCBpZiAoIXN0cm5jbXAobGluZSwgIkVORCBNRVRBREFU QSIsIDEyKSkgewo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGluc2lkZV9tZXRhZGF0YSA9IDA7 Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29udGludWU7Cj4gK8KgwqDCoMKgwqDCoMKgIH0K PiArwqDCoMKgwqDCoMKgwqAgaWYgKGluc2lkZV9tZXRhZGF0YSA9PSAwKSB7Cj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqAgaW50IHNpemVfciwgc2l6ZV9nLCBzaXplX2I7Cj4gKwo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Cj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpbnQgbnBvaW50cyA9IHN0cnRvbChsaW5lLCBOVUxMLCAw KTsKPiArCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAobnBvaW50cyA+IDIp IHsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZmxvYXQgdixsYXN0 Owo+ICsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKG5wb2lu dHMgPiBQUkVMVVRfU0laRSkgewo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlByZWx1dCBzaXplIHRvbwo+ IGxhcmdlLlxuIik7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnb3RvIGVuZDsKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+ICsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgaWYgKGluX3ByZWx1dFtpXSB8fCBvdXRfcHJlbHV0W2ldKSB7Cj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYXZfbG9nKGN0eCwgQVZf TE9HX0VSUk9SLCAiSW52YWxpZCBmaWxlIGhhcyBtdWx0aXBsZQo+IHByZWx1dHMuXG4iKTsKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXQgPSBBVkVS Uk9SX0lOVkFMSUREQVRBOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGdvdG8gZW5kOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCB9Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpbl9w cmVsdXRbaV3CoCA9IChmbG9hdCopYXZfbWFsbG9jKG5wb2ludHMgKgo+IHNpemVvZihmbG9hdCkp Owo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBvdXRfcHJlbHV0W2ld ID0gKGZsb2F0Kilhdl9tYWxsb2MobnBvaW50cyAqCj4gc2l6ZW9mKGZsb2F0KSk7Cj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmICghaW5fcHJlbHV0W2ldIHx8ICFv dXRfcHJlbHV0W2ldKSB7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGdvdG8gZW5kOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBwcmVsdXRfc2l6ZXNbaV0gPSBucG9pbnRzOwo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpbl9taW5baV0gPSBGTFRfTUFYOwo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpbl9tYXhbaV0gPSAtRkxUX01BWDsKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgb3V0X21pbltpXSA9IEZMVF9NQVg7 Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG91dF9tYXhbaV0gPSAt RkxUX01BWDsKPiArCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZv ciAoaW50IGogPSAwOyBqIDwgbnBvaW50czsgaisrKSB7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgTkVYVF9GTE9BVF9PUl9HT1RPKHYsIGVuZCkKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpbl9taW5baV0g PSBGRk1JTihpbl9taW5baV0sIHYpOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGluX21heFtpXSA9IEZGTUFYKGluX21heFtpXSwgdik7Cj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW5fcHJlbHV0W2ldW2pd ID0gdjsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBp ZiAoaiA+IDAgJiYgdiA8IGxhc3QpIHsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkludmFs aWQgZmlsZSwgbm9uCj4gaW5jcmVhc2luZyBwcmVsdXQuXG4iKTsKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldCA9IEFWRVJST1IoRU5P TUVNKTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIGdvdG8gZW5kOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIH0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBsYXN0ID0gdjsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg fQo+ICsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZm9yIChpbnQg aiA9IDA7IGogPCBucG9pbnRzOyBqKyspIHsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBORVhUX0ZMT0FUX09SX0dPVE8odiwgZW5kKQo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG91dF9taW5baV0gPSBGRk1J TihvdXRfbWluW2ldLCB2KTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBvdXRfbWF4W2ldID0gRkZNQVgob3V0X21heFtpXSwgdik7Cj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgb3V0X3ByZWx1dFtpXVtqXSA9 IHY7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPiArCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9IGVsc2UgaWYgKG5wb2ludHMgPT0gMinCoCB7 Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIE5FWFRfTElORV9PUl9H T1RPKHNraXBfbGluZShsaW5lKSwgZW5kKTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgaWYgKGF2X3NzY2FuZihsaW5lLCAiJWYgJWYiLCAmaW5fbWluW2ldLCAmaW5f bWF4W2ldKSAhPQo+IDIpIHsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOwo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGdvdG8gZW5kOwo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIE5FWFRfTElORV9PUl9HT1RPKHNraXBfbGluZShsaW5lKSwgZW5kKTsKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKGF2X3NzY2FuZihsaW5l LCAiJWYgJWYiLCAmb3V0X21pbltpXSwgJm91dF9tYXhbaV0pICE9Cj4gMikgewo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldCA9IEFWRVJST1JfSU5W QUxJRERBVEE7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgZ290byBlbmQ7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0K PiArCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9IGVsc2Ugewo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1Is ICJVbnN1cHBvcnRlZCBudW1iZXIgb2YgcHJlLWx1dAo+IHBvaW50cy5cbiIpOwo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXQgPSBBVkVSUk9SX1BBVENIV0VMQ09N RTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZ290byBlbmQ7Cj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgTkVYVF9MSU5FX09SX0dPVE8oc2tpcF9saW5lKGxpbmUpLCBlbmQpOwo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPiArCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAg aWYgKGF2X3NzY2FuZihsaW5lLCAiJWQgJWQgJWQiLCAmc2l6ZV9yLCAmc2l6ZV9nLCAmc2l6ZV9i KSAhPSAzKQo+IHsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldCA9IEFWRVJS T1IoRUlOVkFMKTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGdvdG8gZW5kOwo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAo c2l6ZV9yICE9IHNpemVfZyB8fCBzaXplX3IgIT0gc2l6ZV9iKSB7Cj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBz aXplIGNvbWJpbmF0aW9uOgo+ICVkeCVkeCVkLlxuIiwgc2l6ZV9yLCBzaXplX2csIHNpemVfYik7 Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXQgPSBBVkVSUk9SX1BBVENIV0VM Q09NRTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGdvdG8gZW5kOwo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIH0KPiArCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc2l6ZSA9 IHNpemVfcjsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzaXplMiA9IHNpemUgKiBzaXplOwo+ ICsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAocHJlbHV0X3NpemVzWzBdICYmIHByZWx1 dF9zaXplc1sxXSAmJiBwcmVsdXRfc2l6ZXNbMl0pCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBwcmVsdXQgPSAxOwo+ICsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXQgPSBm Zl9hbGxvY2F0ZV8zZGx1dChjdHgsIGx1dDNkLCBzaXplLCBwcmVsdXQpOwo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGlmIChyZXQgPCAwKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgcmV0dXJuIHJldDsKPiArCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZm9yIChpbnQgayA9 IDA7IGsgPCBzaXplOyBrKyspIHsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZv ciAoaW50IGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Cj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IHJnYnZlYyAq dmVjID0gJmx1dDNkLT5sdXRbaSAqIHNpemUyICsgaiAqIHNpemUKPiArIGtdOwo+ICsKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBORVhUX0xJTkVfT1Jf R09UTyhza2lwX2xpbmUobGluZSksIGVuZCk7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKGF2X3NzY2FuZihsaW5lLCAiJWYgJWYgJWYiLCAmdmVj LT5yLCAmdmVjLT5nLAo+ICZ2ZWMtPmIpICE9IDMpIHsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldCA9IEFWRVJST1JfSU5WQUxJRERB VEE7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBnb3RvIGVuZDsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCB9Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHZlYy0+ciAqPSBvdXRfbWF4WzBdIC0gb3V0X21pblswXTsKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB2ZWMtPmcgKj0gb3V0X21heFsxXSAt IG91dF9taW5bMV07Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgdmVjLT5iICo9IG91dF9tYXhbMl0gLSBvdXRfbWluWzJdOwo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCB9Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+ICsKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBicmVhazsKPiArwqDCoMKgwqDCoMKgwqAgfQo+ICvCoMKgwqAgfQo+ICsKPiArwqDC oMKgIGlmIChwcmVsdXQpIHsKPiArwqDCoMKgwqDCoMKgwqAgZm9yIChpbnQgYyA9IDA7IGMgPCAz OyBjKyspIHsKPiArCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbHV0M2QtPnByZWx1dC5taW5b Y10gPSBpbl9taW5bY107Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbHV0M2QtPnByZWx1dC5t YXhbY10gPSBpbl9tYXhbY107Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbHV0M2QtPnByZWx1 dC5zY2FsZVtjXSA9wqAgKDEuMGYgLyAoZmxvYXQpKGluX21heFtjXSAtIGluX21pbltjXSkpCj4g KiAobHV0M2QtPnByZWx1dC5zaXplIC0gMSk7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGZvciAoaW50IGkgPSAwOyBpIDwgbHV0M2QtPnByZWx1dC5zaXplOyArK2kpIHsKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZsb2F0IG1peCA9IChmbG9hdCkgaSAvIChmbG9hdCko bHV0M2QtPnByZWx1dC5zaXplIC0gMSk7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBmbG9hdCB4ID0gbGVycGYoaW5fbWluW2NdLCBpbl9tYXhbY10sIG1peCksIGEsIGI7Cj4gKwo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW50IGlkeCA9IG5lYXJlc3Rfc2FtcGxl X2luZGV4KGluX3ByZWx1dFtjXSwgeCwgMCwKPiBwcmVsdXRfc2l6ZXNbY10tMSk7Cj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBhdl9hc3NlcnQwKGlkeCArIDEgPCBwcmVsdXRfc2l6 ZXNbY10pOwo+ICsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGHCoMKgID0gb3V0 X3ByZWx1dFtjXVtpZHggKyAwXTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGLC oMKgID0gb3V0X3ByZWx1dFtjXVtpZHggKyAxXTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIG1peCA9IHggLSBpbl9wcmVsdXRbY11baWR4XTsKPiArCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBsdXQzZC0+cHJlbHV0Lmx1dFtjXVtpXSA9IHNhbml0aXplZihsZXJw ZihhLCBiLCBtaXgpKTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4gK8KgwqDCoMKgwqDC oMKgIH0KPiArwqDCoMKgwqDCoMKgwqAgbHV0M2QtPnNjYWxlLnIgPSAxLjAwZjsKPiArwqDCoMKg wqDCoMKgwqAgbHV0M2QtPnNjYWxlLmcgPSAxLjAwZjsKPiArwqDCoMKgwqDCoMKgwqAgbHV0M2Qt PnNjYWxlLmIgPSAxLjAwZjsKPiArCj4gK8KgwqDCoCB9IGVsc2Ugewo+ICvCoMKgwqDCoMKgwqDC oCBsdXQzZC0+c2NhbGUuciA9IGF2X2NsaXBmKDEuIC8gKGluX21heFswXSAtIGluX21pblswXSks IDAuZiwgMS5mKTsKPiArwqDCoMKgwqDCoMKgwqAgbHV0M2QtPnNjYWxlLmcgPSBhdl9jbGlwZigx LiAvIChpbl9tYXhbMV0gLSBpbl9taW5bMV0pLCAwLmYsIDEuZik7Cj4gK8KgwqDCoMKgwqDCoMKg IGx1dDNkLT5zY2FsZS5iID0gYXZfY2xpcGYoMS4gLyAoaW5fbWF4WzJdIC0gaW5fbWluWzJdKSwg MC5mLCAxLmYpOwo+ICvCoMKgwqAgfQo+ICsKPiArZW5kOgo+ICvCoMKgwqAgZm9yIChpbnQgYyA9 IDA7IGMgPCAzOyBjKyspIHsKPiArwqDCoMKgwqDCoMKgwqAgYXZfZnJlZXAoJmluX3ByZWx1dFtj XSk7Cj4gK8KgwqDCoMKgwqDCoMKgIGF2X2ZyZWVwKCZvdXRfcHJlbHV0W2NdKTsKPiArwqDCoMKg IH0KPiArwqDCoMKgIHJldHVybiByZXQ7Cj4gK30KPiArCj4gK2F2X2NvbGQgaW50IGZmX2x1dDNk X2luaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIExVVDNEQ29udGV4dCAqbHV0M2QpCj4gK3sKPiAr wqDCoMKgIGludCByZXQ7Cj4gK8KgwqDCoCBGSUxFICpmOwo+ICvCoMKgwqAgY29uc3QgY2hhciAq ZXh0Owo+ICsKPiArwqDCoMKgIGx1dDNkLT5zY2FsZS5yID0gbHV0M2QtPnNjYWxlLmcgPSBsdXQz ZC0+c2NhbGUuYiA9IDEuZjsKPiArCj4gK8KgwqDCoCBpZiAoIWx1dDNkLT5maWxlKSB7Cj4gK8Kg wqDCoMKgwqDCoMKgIHJldHVybiBzZXRfaWRlbnRpdHlfbWF0cml4KGN0eCwgbHV0M2QsIDMyKTsK PiArwqDCoMKgIH0KPiArCj4gK8KgwqDCoCBmID0gYXZwcml2X2ZvcGVuX3V0ZjgobHV0M2QtPmZp bGUsICJyIik7Cj4gK8KgwqDCoCBpZiAoIWYpIHsKPiArwqDCoMKgwqDCoMKgwqAgcmV0ID0gQVZF UlJPUihlcnJubyk7Cj4gK8KgwqDCoMKgwqDCoMKgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwg IiVzOiAlc1xuIiwgbHV0M2QtPmZpbGUsIGF2X2VycjJzdHIocmV0KSk7Cj4gK8KgwqDCoMKgwqDC oMKgIHJldHVybiByZXQ7Cj4gK8KgwqDCoCB9Cj4gKwo+ICvCoMKgwqAgZXh0ID0gc3RycmNocihs dXQzZC0+ZmlsZSwgJy4nKTsKPiArwqDCoMKgIGlmICghZXh0KSB7Cj4gK8KgwqDCoMKgwqDCoMKg IGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBndWVzcyB0aGUgZm9ybWF0IGZy b20gdGhlCj4gZXh0ZW5zaW9uXG4iKTsKPiArwqDCoMKgwqDCoMKgwqAgcmV0ID0gQVZFUlJPUl9J TlZBTElEREFUQTsKPiArwqDCoMKgwqDCoMKgwqAgZ290byBlbmQ7Cj4gK8KgwqDCoCB9Cj4gK8Kg wqDCoCBleHQrKzsKPiArCj4gK8KgwqDCoCBpZiAoIWF2X3N0cmNhc2VjbXAoZXh0LCAiZGF0Iikp IHsKPiArwqDCoMKgwqDCoMKgwqAgcmV0ID0gcGFyc2VfZGF0KGN0eCwgbHV0M2QsIGYpOwo+ICvC oMKgwqAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChleHQsICIzZGwiKSkgewo+ICvCoMKgwqDC oMKgwqDCoCByZXQgPSBwYXJzZV8zZGwoY3R4LCBsdXQzZCwgZik7Cj4gK8KgwqDCoCB9IGVsc2Ug aWYgKCFhdl9zdHJjYXNlY21wKGV4dCwgImN1YmUiKSkgewo+ICvCoMKgwqDCoMKgwqDCoCByZXQg PSBwYXJzZV9jdWJlKGN0eCwgbHV0M2QsIGYpOwo+ICvCoMKgwqAgfSBlbHNlIGlmICghYXZfc3Ry Y2FzZWNtcChleHQsICJtM2QiKSkgewo+ICvCoMKgwqDCoMKgwqDCoCByZXQgPSBwYXJzZV9tM2Qo Y3R4LCBsdXQzZCwgZik7Cj4gK8KgwqDCoCB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGV4dCwg ImNzcCIpKSB7Cj4gK8KgwqDCoMKgwqDCoMKgIHJldCA9IHBhcnNlX2NpbmVzcGFjZShjdHgsIGx1 dDNkLCBmKTsKPiArwqDCoMKgIH0gZWxzZSB7Cj4gK8KgwqDCoMKgwqDCoMKgIGF2X2xvZyhjdHgs IEFWX0xPR19FUlJPUiwgIlVucmVjb2duaXplZCAnLiVzJyBmaWxlIHR5cGVcbiIsIGV4dCk7Cj4g K8KgwqDCoMKgwqDCoMKgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKPiArwqDCoMKgIH0KPiArCj4g K8KgwqDCoCBpZiAoIXJldCAmJiAhbHV0M2QtPmx1dHNpemUpIHsKPiArwqDCoMKgwqDCoMKgwqAg YXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiM0QgTFVUIGlzIGVtcHR5XG4iKTsKPiArwqDCoMKg wqDCoMKgwqAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKPiArwqDCoMKgIH0KPiArCj4gK2Vu ZDoKPiArwqDCoMKgIGZjbG9zZShmKTsKPiArwqDCoMKgIHJldHVybiByZXQ7Cj4gK30KPiArCj4g K2F2X2NvbGQgdm9pZCBmZl9sdXQzZF91bmluaXQoTFVUM0RDb250ZXh0ICpsdXQzZCkKPiArewo+ ICvCoMKgwqAgaW50IGk7Cj4gK8KgwqDCoCBhdl9mcmVlcCgmbHV0M2QtPmx1dCk7Cj4gKwo+ICvC oMKgwqAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewo+ICvCoMKgwqDCoMKgwqDCoCBhdl9mcmVl cCgmbHV0M2QtPnByZWx1dC5sdXRbaV0pOwo+ICvCoMKgwqAgfQo+ICt9Cj4gZGlmZiAtLWdpdCBh L2xpYmF2ZmlsdGVyL2x1dDNkLmggYi9saWJhdmZpbHRlci9sdXQzZC5oCj4gaW5kZXggMTRlM2M3 ZmVhNi4uYjZhYWVkODVmMSAxMDA2NDQKPiAtLS0gYS9saWJhdmZpbHRlci9sdXQzZC5oCj4gKysr IGIvbGliYXZmaWx0ZXIvbHV0M2QuaAo+IEBAIC04NCw0ICs4NCwxNyBAQCB0eXBlZGVmIHN0cnVj dCBUaHJlYWREYXRhIHsKPiDCoAo+IMKgdm9pZCBmZl9sdXQzZF9pbml0X3g4NihMVVQzRENvbnRl eHQgKnMsIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyk7Cj4gwqAKPiAraW50IGZmX2Fs bG9jYXRlXzNkbHV0KEFWRmlsdGVyQ29udGV4dCAqY3R4LCBMVVQzRENvbnRleHQgKmx1dDNkLCBp bnQgbHV0c2l6ZSwKPiBpbnQgcHJlbHV0KTsKPiArCj4gKy8qKgo+ICsgKiBMb2FkIDNEIExVVCBm cm9tIGZpbGUuCj4gKyAqCj4gKyAqIEBwYXJhbSBsdXQzZCBMVVQzRENvbnRleHQgTG9hZCAzRCBM VVQgZnJvbSBwYXRoIHNwZWNpZmllZCBieSBgbHV0M2QtCj4gPmZpbGVgLgo+ICsgKsKgwqDCoMKg IElmIGBsdXQzZC0+ZmlsZWAgaXMgTlVMTCwgaW5pdGlhbGl6ZSBhbiBpZGVudGl0eSAzRCBMVVQu Cj4gKyAqLwo+ICtpbnQgZmZfbHV0M2RfaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCwgTFVUM0RD b250ZXh0ICpsdXQzZCk7Cj4gKwo+ICsvKirCoCBSZWxlYXNlIG1lbW9yeSB1c2VkIHRvIGhvbGQg M0QgTFVULiAqLwo+ICt2b2lkIGZmX2x1dDNkX3VuaW5pdChMVVQzRENvbnRleHQgKmx1dDNkKTsK PiArCj4gwqAjZW5kaWYgLyogQVZGSUxURVJfTFVUM0RfSCAqLwo+IGRpZmYgLS1naXQgYS9saWJh dmZpbHRlci92Zl9sdXQzZC5jIGIvbGliYXZmaWx0ZXIvdmZfbHV0M2QuYwo+IGluZGV4IDRlZGNj MmM3YTcuLjFkYTc5OGUyMTAgMTAwNjQ0Cj4gLS0tIGEvbGliYXZmaWx0ZXIvdmZfbHV0M2QuYwo+ ICsrKyBiL2xpYmF2ZmlsdGVyL3ZmX2x1dDNkLmMKPiBAQCAtNTUyLDM5ICs1NTIsNiBAQCBzdGF0 aWMgaW50IHNraXBfbGluZShjb25zdCBjaGFyICpwKQo+IMKgwqDCoMKgIHJldHVybiAhKnAgfHwg KnAgPT0gJyMnOwo+IMKgfQo+IMKgCj4gLXN0YXRpYyBjaGFyKiBmZ2V0X25leHRfd29yZChjaGFy KiBkc3QsIGludCBtYXgsIEZJTEUqIGYpCj4gLXsKPiAtwqDCoMKgIGludCBjOwo+IC3CoMKgwqAg Y2hhciAqcCA9IGRzdDsKPiAtCj4gLcKgwqDCoCAvKiBmb3IgbnVsbCAqLwo+IC3CoMKgwqAgbWF4 LS07Cj4gLcKgwqDCoCAvKiBza2lwIHVudGlsIG5leHQgbm9uIHdoaXRlc3BhY2UgY2hhciAqLwo+ IC3CoMKgwqAgd2hpbGUgKChjID0gZmdldGMoZikpICE9IEVPRikgewo+IC3CoMKgwqDCoMKgwqDC oCBpZiAoYXZfaXNzcGFjZShjKSkKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb250aW51ZTsK PiAtCj4gLcKgwqDCoMKgwqDCoMKgICpwKysgPSBjOwo+IC3CoMKgwqDCoMKgwqDCoCBtYXgtLTsK PiAtwqDCoMKgwqDCoMKgwqAgYnJlYWs7Cj4gLcKgwqDCoCB9Cj4gLQo+IC3CoMKgwqAgLyogZ2V0 IG1heCBieXRlcyBvciB1cCB1bnRpbCBuZXh0IHdoaXRlc3BhY2UgY2hhciAqLwo+IC3CoMKgwqAg Zm9yICg7IG1heCA+IDA7IG1heC0tKSB7Cj4gLcKgwqDCoMKgwqDCoMKgIGlmICgoYyA9IGZnZXRj KGYpKSA9PSBFT0YpCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7Cj4gLQo+IC3CoMKg wqDCoMKgwqDCoCBpZiAoYXZfaXNzcGFjZShjKSkKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBi cmVhazsKPiAtCj4gLcKgwqDCoMKgwqDCoMKgICpwKysgPSBjOwo+IC3CoMKgwqAgfQo+IC0KPiAt wqDCoMKgICpwID0gMDsKPiAtwqDCoMKgIGlmIChwID09IGRzdCkKPiAtwqDCoMKgwqDCoMKgwqAg cmV0dXJuIE5VTEw7Cj4gLcKgwqDCoCByZXR1cm4gcDsKPiAtfQo+IMKgCj4gwqAjZGVmaW5lIE5F WFRfTElORShsb29wX2NvbmQpIGRvIHvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIFwKPiDCoMKgwqDCoCBpZiAoIWZnZXRzKGxpbmUsIHNpemVvZihs aW5lKSwgZikpIHvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcCj4gQEAg LTU5Myw1MDUgKzU2MCw2IEBAIHN0YXRpYyBjaGFyKiBmZ2V0X25leHRfd29yZChjaGFyKiBkc3Qs IGludCBtYXgsIEZJTEUqIGYpCj4gwqDCoMKgwqAgfcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcCj4gwqB9IHdoaWxlIChsb29wX2NvbmQpCj4gwqAK PiAtI2RlZmluZSBORVhUX0xJTkVfT1JfR09UTyhsb29wX2NvbmQsIGxhYmVsKSBkbyB7wqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBcCj4gLcKgwqDCoCBpZiAoIWZnZXRzKGxpbmUsIHNpemVvZihsaW5l KSwgZikpIHvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcCj4gLcKgwqDC oMKgwqDCoMKgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlVuZXhwZWN0ZWQgRU9GXG4iKTvC oMKgwqDCoMKgIFwKPiAtwqDCoMKgwqDCoMKgwqAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcCj4gLcKg wqDCoMKgwqDCoMKgIGdvdG8gbGFiZWw7wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXAo+IC3CoMKg wqAgfcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBc Cj4gLX0gd2hpbGUgKGxvb3BfY29uZCkKPiAtCj4gLXN0YXRpYyBpbnQgYWxsb2NhdGVfM2RsdXQo QVZGaWx0ZXJDb250ZXh0ICpjdHgsIGludCBsdXRzaXplLCBpbnQgcHJlbHV0KQo+IC17Cj4gLcKg wqDCoCBMVVQzRENvbnRleHQgKmx1dDNkID0gY3R4LT5wcml2Owo+IC3CoMKgwqAgaW50IGk7Cj4g LcKgwqDCoCBpZiAobHV0c2l6ZSA8IDIgfHwgbHV0c2l6ZSA+IE1BWF9MRVZFTCkgewo+IC3CoMKg wqDCoMKgwqDCoCBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJUb28gbGFyZ2Ugb3IgaW52YWxp ZCAzRCBMVVQgc2l6ZVxuIik7Cj4gLcKgwqDCoMKgwqDCoMKgIHJldHVybiBBVkVSUk9SKEVJTlZB TCk7Cj4gLcKgwqDCoCB9Cj4gLQo+IC3CoMKgwqAgYXZfZnJlZXAoJmx1dDNkLT5sdXQpOwo+IC3C oMKgwqAgbHV0M2QtPmx1dCA9IGF2X21hbGxvY19hcnJheShsdXRzaXplICogbHV0c2l6ZSAqIGx1 dHNpemUsIHNpemVvZigqbHV0M2QtCj4gPmx1dCkpOwo+IC3CoMKgwqAgaWYgKCFsdXQzZC0+bHV0 KQo+IC3CoMKgwqDCoMKgwqDCoCByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwo+IC0KPiAtwqDCoMKg IGlmIChwcmVsdXQpIHsKPiAtwqDCoMKgwqDCoMKgwqAgbHV0M2QtPnByZWx1dC5zaXplID0gUFJF TFVUX1NJWkU7Cj4gLcKgwqDCoMKgwqDCoMKgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKPiAt wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBhdl9mcmVlcCgmbHV0M2QtPnByZWx1dC5sdXRbaV0pOwo+ IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGx1dDNkLT5wcmVsdXQubHV0W2ldID0gYXZfbWFsbG9j X2FycmF5KFBSRUxVVF9TSVpFLAo+IHNpemVvZigqbHV0M2QtPnByZWx1dC5sdXRbMF0pKTsKPiAt wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoIWx1dDNkLT5wcmVsdXQubHV0W2ldKQo+IC3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKPiAtwqDC oMKgwqDCoMKgwqAgfQo+IC3CoMKgwqAgfSBlbHNlIHsKPiAtwqDCoMKgwqDCoMKgwqAgbHV0M2Qt PnByZWx1dC5zaXplID0gMDsKPiAtwqDCoMKgwqDCoMKgwqAgZm9yIChpID0gMDsgaSA8IDM7IGkr Kykgewo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGF2X2ZyZWVwKCZsdXQzZC0+cHJlbHV0Lmx1 dFtpXSk7Cj4gLcKgwqDCoMKgwqDCoMKgIH0KPiAtwqDCoMKgIH0KPiAtwqDCoMKgIGx1dDNkLT5s dXRzaXplID0gbHV0c2l6ZTsKPiAtwqDCoMKgIGx1dDNkLT5sdXRzaXplMiA9IGx1dHNpemUgKiBs dXRzaXplOwo+IC3CoMKgwqAgcmV0dXJuIDA7Cj4gLX0KPiAtCj4gLS8qIEJhc2ljYWxseSByIGcg YW5kIGIgZmxvYXQgdmFsdWVzIG9uIGVhY2ggbGluZSwgd2l0aCBhIGZhY3VsdGF0aXZlCj4gM0RM VVRTSVpFCj4gLSAqIGRpcmVjdGl2ZTsgc2VlbXMgdG8gYmUgZ2VuZXJhdGVkIGJ5IERhdmluY2kg Ki8KPiAtc3RhdGljIGludCBwYXJzZV9kYXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEZJTEUgKmYp Cj4gLXsKPiAtwqDCoMKgIExVVDNEQ29udGV4dCAqbHV0M2QgPSBjdHgtPnByaXY7Cj4gLcKgwqDC oCBjaGFyIGxpbmVbTUFYX0xJTkVfU0laRV07Cj4gLcKgwqDCoCBpbnQgcmV0LCBpLCBqLCBrLCBz aXplLCBzaXplMjsKPiAtCj4gLcKgwqDCoCBsdXQzZC0+bHV0c2l6ZSA9IHNpemUgPSAzMzsKPiAt wqDCoMKgIHNpemUyID0gc2l6ZSAqIHNpemU7Cj4gLQo+IC3CoMKgwqAgTkVYVF9MSU5FKHNraXBf bGluZShsaW5lKSk7Cj4gLcKgwqDCoCBpZiAoIXN0cm5jbXAobGluZSwgIjNETFVUU0laRSAiLCAx MCkpIHsKPiAtwqDCoMKgwqDCoMKgwqAgc2l6ZSA9IHN0cnRvbChsaW5lICsgMTAsIE5VTEwsIDAp Owo+IC0KPiAtwqDCoMKgwqDCoMKgwqAgTkVYVF9MSU5FKHNraXBfbGluZShsaW5lKSk7Cj4gLcKg wqDCoCB9Cj4gLQo+IC3CoMKgwqAgcmV0ID0gYWxsb2NhdGVfM2RsdXQoY3R4LCBzaXplLCAwKTsK PiAtwqDCoMKgIGlmIChyZXQgPCAwKQo+IC3CoMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0Owo+IC0K PiAtwqDCoMKgIGZvciAoayA9IDA7IGsgPCBzaXplOyBrKyspIHsKPiAtwqDCoMKgwqDCoMKgwqAg Zm9yIChqID0gMDsgaiA8IHNpemU7IGorKykgewo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZv ciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIHN0cnVjdCByZ2J2ZWMgKnZlYyA9ICZsdXQzZC0+bHV0W2sgKiBzaXplMiArIGogKiBzaXpl ICsgaV07Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoayAhPSAwIHx8IGog IT0gMCB8fCBpICE9IDApCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IE5FWFRfTElORShza2lwX2xpbmUobGluZSkpOwo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgaWYgKGF2X3NzY2FuZihsaW5lLCAiJWYgJWYgJWYiLCAmdmVjLT5yLCAmdmVjLT5nLCAm dmVjLT5iKSAhPQo+IDMpCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0K PiAtwqDCoMKgwqDCoMKgwqAgfQo+IC3CoMKgwqAgfQo+IC3CoMKgwqAgcmV0dXJuIDA7Cj4gLX0K PiAtCj4gLS8qIElyaWRhcyBmb3JtYXQgKi8KPiAtc3RhdGljIGludCBwYXJzZV9jdWJlKEFWRmls dGVyQ29udGV4dCAqY3R4LCBGSUxFICpmKQo+IC17Cj4gLcKgwqDCoCBMVVQzRENvbnRleHQgKmx1 dDNkID0gY3R4LT5wcml2Owo+IC3CoMKgwqAgY2hhciBsaW5lW01BWF9MSU5FX1NJWkVdOwo+IC3C oMKgwqAgZmxvYXQgbWluWzNdID0gezAuMCwgMC4wLCAwLjB9Owo+IC3CoMKgwqAgZmxvYXQgbWF4 WzNdID0gezEuMCwgMS4wLCAxLjB9Owo+IC0KPiAtwqDCoMKgIHdoaWxlIChmZ2V0cyhsaW5lLCBz aXplb2YobGluZSksIGYpKSB7Cj4gLcKgwqDCoMKgwqDCoMKgIGlmICghc3RybmNtcChsaW5lLCAi TFVUXzNEX1NJWkUiLCAxMSkpIHsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpbnQgcmV0LCBp LCBqLCBrOwo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbnN0IGludCBzaXplID0gc3RydG9s KGxpbmUgKyAxMiwgTlVMTCwgMCk7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29uc3QgaW50 IHNpemUyID0gc2l6ZSAqIHNpemU7Cj4gLQo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldCA9 IGFsbG9jYXRlXzNkbHV0KGN0eCwgc2l6ZSwgMCk7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg aWYgKHJldCA8IDApCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0 Owo+IC0KPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmb3IgKGsgPSAwOyBrIDwgc2l6ZTsgaysr KSB7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmb3IgKGogPSAwOyBqIDwgc2l6 ZTsgaisrKSB7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZvciAo aSA9IDA7IGkgPCBzaXplOyBpKyspIHsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3QgcmdidmVjICp2ZWMgPSAmbHV0M2QtPmx1dFtpICogc2l6 ZTIgKyBqICogc2l6ZQo+ICsga107Cj4gLQo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIGRvIHsKPiAtdHJ5X2FnYWluOgo+IC3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgTkVYVF9MSU5FKDApOwo+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYg KCFzdHJuY21wKGxpbmUsICJET01BSU5fIiwgNykpIHsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZmxvYXQgKnZhbHMgPSBO VUxMOwo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBpZsKgwqDCoMKgwqAgKCFzdHJuY21wKGxpbmUgKyA3LCAiTUlOICIsIDQp KSB2YWxzCj4gPSBtaW47Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVsc2UgaWYgKCFzdHJuY21wKGxpbmUgKyA3LCAiTUFY ICIsIDQpKSB2YWxzCj4gPSBtYXg7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmICghdmFscykKPiAtwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYXZfc3NjYW5mKGxpbmUgKyAx MSwgIiVmICVmICVmIiwgdmFscywgdmFscyArCj4gMSwgdmFscyArIDIpOwo+IC3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBhdl9s b2coY3R4LCBBVl9MT0dfREVCVUcsICJtaW46ICVmICVmICVmIHwKPiBtYXg6ICVmICVmICVmXG4i LAo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG1pblswXSwgbWluWzFdLCBtaW5bMl0sIG1heFswXSwK PiBtYXhbMV0sIG1heFsyXSk7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGdvdG8gdHJ5X2FnYWluOwo+IC3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfSBlbHNlIGlmICgh c3RybmNtcChsaW5lLCAiVElUTEUiLCA1KSkgewo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnb3RvIHRyeV9hZ2FpbjsKPiAt wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0K PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9IHdoaWxl IChza2lwX2xpbmUobGluZSkpOwo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGlmIChhdl9zc2NhbmYobGluZSwgIiVmICVmICVmIiwgJnZlYy0+ciwgJnZl Yy0+ZywKPiAmdmVjLT5iKSAhPSAzKQo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Cj4gLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIH0KPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4gLcKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgYnJlYWs7Cj4gLcKgwqDCoMKgwqDCoMKgIH0KPiAtwqDCoMKgIH0KPiAt Cj4gLcKgwqDCoCBsdXQzZC0+c2NhbGUuciA9IGF2X2NsaXBmKDEuIC8gKG1heFswXSAtIG1pblsw XSksIDAuZiwgMS5mKTsKPiAtwqDCoMKgIGx1dDNkLT5zY2FsZS5nID0gYXZfY2xpcGYoMS4gLyAo bWF4WzFdIC0gbWluWzFdKSwgMC5mLCAxLmYpOwo+IC3CoMKgwqAgbHV0M2QtPnNjYWxlLmIgPSBh dl9jbGlwZigxLiAvIChtYXhbMl0gLSBtaW5bMl0pLCAwLmYsIDEuZik7Cj4gLQo+IC3CoMKgwqAg cmV0dXJuIDA7Cj4gLX0KPiAtCj4gLS8qIEFzc3VtZSAxN3gxN3gxNyBMVVQgd2l0aCBhIDE2LWJp dCBkZXB0aAo+IC0gKiBGSVhNRTogaXQgc2VlbXMgdGhlcmUgYXJlIHZhcmlvdXMgM2RsIGZvcm1h dHMgKi8KPiAtc3RhdGljIGludCBwYXJzZV8zZGwoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEZJTEUg KmYpCj4gLXsKPiAtwqDCoMKgIGNoYXIgbGluZVtNQVhfTElORV9TSVpFXTsKPiAtwqDCoMKgIExV VDNEQ29udGV4dCAqbHV0M2QgPSBjdHgtPnByaXY7Cj4gLcKgwqDCoCBpbnQgcmV0LCBpLCBqLCBr Owo+IC3CoMKgwqAgY29uc3QgaW50IHNpemUgPSAxNzsKPiAtwqDCoMKgIGNvbnN0IGludCBzaXpl MiA9IDE3ICogMTc7Cj4gLcKgwqDCoCBjb25zdCBmbG9hdCBzY2FsZSA9IDE2KjE2KjE2Owo+IC0K PiAtwqDCoMKgIGx1dDNkLT5sdXRzaXplID0gc2l6ZTsKPiAtCj4gLcKgwqDCoCByZXQgPSBhbGxv Y2F0ZV8zZGx1dChjdHgsIHNpemUsIDApOwo+IC3CoMKgwqAgaWYgKHJldCA8IDApCj4gLcKgwqDC oMKgwqDCoMKgIHJldHVybiByZXQ7Cj4gLQo+IC3CoMKgwqAgTkVYVF9MSU5FKHNraXBfbGluZShs aW5lKSk7Cj4gLcKgwqDCoCBmb3IgKGsgPSAwOyBrIDwgc2l6ZTsgaysrKSB7Cj4gLcKgwqDCoMKg wqDCoMKgIGZvciAoaiA9IDA7IGogPCBzaXplOyBqKyspIHsKPiAtwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBpbnQgciwgZywgYjsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IHN0cnVjdCByZ2J2ZWMgKnZlYyA9ICZsdXQzZC0+bHV0W2sgKiBzaXplMiArIGogKiBzaXplICsg aV07Cj4gLQo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgTkVYVF9MSU5FKHNraXBf bGluZShsaW5lKSk7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoYXZfc3Nj YW5mKGxpbmUsICIlZCAlZCAlZCIsICZyLCAmZywgJmIpICE9IDMpCj4gLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwo+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdmVjLT5yID0gciAvIHNjYWxlOwo+IC3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdmVjLT5nID0gZyAvIHNjYWxlOwo+IC3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdmVjLT5iID0gYiAvIHNjYWxlOwo+IC3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgIH0KPiAtwqDCoMKgwqDCoMKgwqAgfQo+IC3CoMKgwqAgfQo+IC3CoMKgwqAg cmV0dXJuIDA7Cj4gLX0KPiAtCj4gLS8qIFBhbmRvcmEgZm9ybWF0ICovCj4gLXN0YXRpYyBpbnQg cGFyc2VfbTNkKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBGSUxFICpmKQo+IC17Cj4gLcKgwqDCoCBM VVQzRENvbnRleHQgKmx1dDNkID0gY3R4LT5wcml2Owo+IC3CoMKgwqAgZmxvYXQgc2NhbGU7Cj4g LcKgwqDCoCBpbnQgcmV0LCBpLCBqLCBrLCBzaXplLCBzaXplMiwgaW4gPSAtMSwgb3V0ID0gLTE7 Cj4gLcKgwqDCoCBjaGFyIGxpbmVbTUFYX0xJTkVfU0laRV07Cj4gLcKgwqDCoCB1aW50OF90IHJn Yl9tYXBbM10gPSB7MCwgMSwgMn07Cj4gLQo+IC3CoMKgwqAgd2hpbGUgKGZnZXRzKGxpbmUsIHNp emVvZihsaW5lKSwgZikpIHsKPiAtwqDCoMKgwqDCoMKgwqAgaWbCoMKgwqDCoMKgICghc3RybmNt cChsaW5lLCAiaW4iLMKgIDIpKSBpbsKgID0gc3RydG9sKGxpbmUgKyAyLCBOVUxMLCAwKTsKPiAt wqDCoMKgwqDCoMKgwqAgZWxzZSBpZiAoIXN0cm5jbXAobGluZSwgIm91dCIsIDMpKSBvdXQgPSBz dHJ0b2wobGluZSArIDMsIE5VTEwsIDApOwo+IC3CoMKgwqDCoMKgwqDCoCBlbHNlIGlmICghc3Ry bmNtcChsaW5lLCAidmFsdWVzIiwgNikpIHsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb25z dCBjaGFyICpwID0gbGluZSArIDY7Cj4gLSNkZWZpbmUgU0VUX0NPTE9SKGlkKSBkbyB7wqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcCj4gLcKgwqDCoCB3aGlsZSAoYXZfaXNzcGFj ZSgqcCkpwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcCj4gLcKgwqDCoMKgwqDC oMKgIHArKzvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBcCj4gLcKgwqDCoCBzd2l0Y2ggKCpwKSB7wqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcCj4gLcKgwqDCoCBjYXNlICdyJzog cmdiX21hcFtpZF0gPSAwOyBicmVhazvCoMKgwqDCoMKgwqAgXAo+IC3CoMKgwqAgY2FzZSAnZyc6 IHJnYl9tYXBbaWRdID0gMTsgYnJlYWs7wqDCoMKgwqDCoMKgIFwKPiAtwqDCoMKgIGNhc2UgJ2In OiByZ2JfbWFwW2lkXSA9IDI7IGJyZWFrO8KgwqDCoMKgwqDCoCBcCj4gLcKgwqDCoCB9wqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBcCj4gLcKgwqDCoCB3aGlsZSAoKnAgJiYgIWF2X2lzc3BhY2UoKnApKcKg wqDCoMKgwqDCoMKgwqDCoMKgIFwKPiAtwqDCoMKgwqDCoMKgwqAgcCsrO8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwKPiAtfSB3 aGlsZSAoMCkKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBTRVRfQ09MT1IoMCk7Cj4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgU0VUX0NPTE9SKDEpOwo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKg IFNFVF9DT0xPUigyKTsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBicmVhazsKPiAtwqDCoMKg wqDCoMKgwqAgfQo+IC3CoMKgwqAgfQo+IC0KPiAtwqDCoMKgIGlmIChpbiA9PSAtMSB8fCBvdXQg PT0gLTEpIHsKPiAtwqDCoMKgwqDCoMKgwqAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiaW4g YW5kIG91dCBtdXN0IGJlIGRlZmluZWRcbiIpOwo+IC3CoMKgwqDCoMKgwqDCoCByZXR1cm4gQVZF UlJPUl9JTlZBTElEREFUQTsKPiAtwqDCoMKgIH0KPiAtwqDCoMKgIGlmIChpbiA8IDIgfHwgb3V0 IDwgMiB8fAo+IC3CoMKgwqDCoMKgwqDCoCBpbsKgID4gTUFYX0xFVkVMKk1BWF9MRVZFTCpNQVhf TEVWRUwgfHwKPiAtwqDCoMKgwqDCoMKgwqAgb3V0ID4gTUFYX0xFVkVMKk1BWF9MRVZFTCpNQVhf TEVWRUwpIHsKPiAtwqDCoMKgwqDCoMKgwqAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiaW52 YWxpZCBpbiAoJWQpIG9yIG91dCAoJWQpXG4iLCBpbiwgb3V0KTsKPiAtwqDCoMKgwqDCoMKgwqAg cmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Cj4gLcKgwqDCoCB9Cj4gLcKgwqDCoCBmb3IgKHNp emUgPSAxOyBzaXplKnNpemUqc2l6ZSA8IGluOyBzaXplKyspOwo+IC3CoMKgwqAgbHV0M2QtPmx1 dHNpemUgPSBzaXplOwo+IC3CoMKgwqAgc2l6ZTIgPSBzaXplICogc2l6ZTsKPiAtCj4gLcKgwqDC oCByZXQgPSBhbGxvY2F0ZV8zZGx1dChjdHgsIHNpemUsIDApOwo+IC3CoMKgwqAgaWYgKHJldCA8 IDApCj4gLcKgwqDCoMKgwqDCoMKgIHJldHVybiByZXQ7Cj4gLQo+IC3CoMKgwqAgc2NhbGUgPSAx LiAvIChvdXQgLSAxKTsKPiAtCj4gLcKgwqDCoCBmb3IgKGsgPSAwOyBrIDwgc2l6ZTsgaysrKSB7 Cj4gLcKgwqDCoMKgwqDCoMKgIGZvciAoaiA9IDA7IGogPCBzaXplOyBqKyspIHsKPiAtwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Cj4gLcKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3QgcmdidmVjICp2ZWMgPSAmbHV0M2QtPmx1dFtr ICogc2l6ZTIgKyBqICogc2l6ZSArIGldOwo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgZmxvYXQgdmFsWzNdOwo+IC0KPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIE5F WFRfTElORSgwKTsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmIChhdl9zc2Nh bmYobGluZSwgIiVmICVmICVmIiwgdmFsLCB2YWwgKyAxLCB2YWwgKyAyKSAhPSAzKQo+IC3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gQVZFUlJPUl9JTlZBTElE REFUQTsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHZlYy0+ciA9IHZhbFtyZ2Jf bWFwWzBdXSAqIHNjYWxlOwo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdmVjLT5n ID0gdmFsW3JnYl9tYXBbMV1dICogc2NhbGU7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCB2ZWMtPmIgPSB2YWxbcmdiX21hcFsyXV0gKiBzY2FsZTsKPiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCB9Cj4gLcKgwqDCoMKgwqDCoMKgIH0KPiAtwqDCoMKgIH0KPiAtwqDCoMKgIHJldHVy biAwOwo+IC19Cj4gLQo+IC1zdGF0aWMgaW50IG5lYXJlc3Rfc2FtcGxlX2luZGV4KGZsb2F0ICpk YXRhLCBmbG9hdCB4LCBpbnQgbG93LCBpbnQgaGkpCj4gLXsKPiAtwqDCoMKgIGludCBtaWQ7Cj4g LcKgwqDCoCBpZiAoeCA8IGRhdGFbbG93XSkKPiAtwqDCoMKgwqDCoMKgwqAgcmV0dXJuIGxvdzsK PiAtCj4gLcKgwqDCoCBpZiAoeCA+IGRhdGFbaGldKQo+IC3CoMKgwqDCoMKgwqDCoCByZXR1cm4g aGk7Cj4gLQo+IC3CoMKgwqAgZm9yICg7Oykgewo+IC3CoMKgwqDCoMKgwqDCoCBhdl9hc3NlcnQw KHggPj0gZGF0YVtsb3ddKTsKPiAtwqDCoMKgwqDCoMKgwqAgYXZfYXNzZXJ0MCh4IDw9IGRhdGFb aGldKTsKPiAtwqDCoMKgwqDCoMKgwqAgYXZfYXNzZXJ0MCgoaGktbG93KSA+IDApOwo+IC0KPiAt wqDCoMKgwqDCoMKgwqAgaWYgKGhpIC0gbG93ID09IDEpCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgcmV0dXJuIGxvdzsKPiAtCj4gLcKgwqDCoMKgwqDCoMKgIG1pZCA9IChsb3cgKyBoaSkgLyAy Owo+IC0KPiAtwqDCoMKgwqDCoMKgwqAgaWYgKHggPCBkYXRhW21pZF0pCj4gLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgaGkgPSBtaWQ7Cj4gLcKgwqDCoMKgwqDCoMKgIGVsc2UKPiAtwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBsb3cgPSBtaWQ7Cj4gLcKgwqDCoCB9Cj4gLQo+IC3CoMKgwqAgcmV0dXJu IDA7Cj4gLX0KPiAtCj4gLSNkZWZpbmUgTkVYVF9GTE9BVF9PUl9HT1RPKHZhbHVlLCBsYWJlbCnC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcCj4gLcKgwqDCoCBpZiAoIWZn ZXRfbmV4dF93b3JkKGxpbmUsIHNpemVvZihsaW5lKSAsZikpIHvCoMKgwqDCoMKgwqDCoMKgwqDC oCBcCj4gLcKgwqDCoMKgwqDCoMKgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7wqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXAo+IC3CoMKgwqDCoMKg wqDCoCBnb3RvIGxhYmVsO8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwKPiAtwqDCoMKgIH3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXAo+IC3CoMKg wqAgaWYgKGF2X3NzY2FuZihsaW5lLCAiJWYiLCAmdmFsdWUpICE9IDEpIHvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIFwKPiAtwqDCoMKgwqDCoMKgwqAgcmV0ID0gQVZFUlJPUl9JTlZBTElE REFUQTvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBc Cj4gLcKgwqDCoMKgwqDCoMKgIGdvdG8gbGFiZWw7wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXAo+ IC3CoMKgwqAgfQo+IC0KPiAtc3RhdGljIGludCBwYXJzZV9jaW5lc3BhY2UoQVZGaWx0ZXJDb250 ZXh0ICpjdHgsIEZJTEUgKmYpCj4gLXsKPiAtwqDCoMKgIExVVDNEQ29udGV4dCAqbHV0M2QgPSBj dHgtPnByaXY7Cj4gLcKgwqDCoCBjaGFyIGxpbmVbTUFYX0xJTkVfU0laRV07Cj4gLcKgwqDCoCBm bG9hdCBpbl9taW5bM13CoCA9IHswLjAsIDAuMCwgMC4wfTsKPiAtwqDCoMKgIGZsb2F0IGluX21h eFszXcKgID0gezEuMCwgMS4wLCAxLjB9Owo+IC3CoMKgwqAgZmxvYXQgb3V0X21pblszXSA9IHsw LjAsIDAuMCwgMC4wfTsKPiAtwqDCoMKgIGZsb2F0IG91dF9tYXhbM10gPSB7MS4wLCAxLjAsIDEu MH07Cj4gLcKgwqDCoCBpbnQgaW5zaWRlX21ldGFkYXRhID0gMCwgc2l6ZSwgc2l6ZTI7Cj4gLcKg wqDCoCBpbnQgcHJlbHV0ID0gMDsKPiAtwqDCoMKgIGludCByZXQgPSAwOwo+IC0KPiAtwqDCoMKg IGludCBwcmVsdXRfc2l6ZXNbM10gPSB7MCwgMCwgMH07Cj4gLcKgwqDCoCBmbG9hdCAqaW5fcHJl bHV0WzNdwqAgPSB7TlVMTCwgTlVMTCwgTlVMTH07Cj4gLcKgwqDCoCBmbG9hdCAqb3V0X3ByZWx1 dFszXSA9IHtOVUxMLCBOVUxMLCBOVUxMfTsKPiAtCj4gLcKgwqDCoCBORVhUX0xJTkVfT1JfR09U Tyhza2lwX2xpbmUobGluZSksIGVuZCk7Cj4gLcKgwqDCoCBpZiAoc3RybmNtcChsaW5lLCAiQ1NQ TFVUVjEwMCIsIDEwKSkgewo+IC3CoMKgwqDCoMKgwqDCoCBhdl9sb2coY3R4LCBBVl9MT0dfRVJS T1IsICJOb3QgY2luZVNwYWNlIExVVCBmb3JtYXRcbiIpOwo+IC3CoMKgwqDCoMKgwqDCoCByZXQg PSBBVkVSUk9SKEVJTlZBTCk7Cj4gLcKgwqDCoMKgwqDCoMKgIGdvdG8gZW5kOwo+IC3CoMKgwqAg fQo+IC0KPiAtwqDCoMKgIE5FWFRfTElORV9PUl9HT1RPKHNraXBfbGluZShsaW5lKSwgZW5kKTsK PiAtwqDCoMKgIGlmIChzdHJuY21wKGxpbmUsICIzRCIsIDIpKSB7Cj4gLcKgwqDCoMKgwqDCoMKg IGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk5vdCAzRCBMVVQgZm9ybWF0XG4iKTsKPiAtwqDC oMKgwqDCoMKgwqAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwo+IC3CoMKgwqDCoMKgwqDCoCBnb3Rv IGVuZDsKPiAtwqDCoMKgIH0KPiAtCj4gLcKgwqDCoCB3aGlsZSAoMSkgewo+IC3CoMKgwqDCoMKg wqDCoCBORVhUX0xJTkVfT1JfR09UTyhza2lwX2xpbmUobGluZSksIGVuZCk7Cj4gLQo+IC3CoMKg wqDCoMKgwqDCoCBpZiAoIXN0cm5jbXAobGluZSwgIkJFR0lOIE1FVEFEQVRBIiwgMTQpKSB7Cj4g LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW5zaWRlX21ldGFkYXRhID0gMTsKPiAtwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBjb250aW51ZTsKPiAtwqDCoMKgwqDCoMKgwqAgfQo+IC3CoMKgwqDCoMKg wqDCoCBpZiAoIXN0cm5jbXAobGluZSwgIkVORCBNRVRBREFUQSIsIDEyKSkgewo+IC3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGluc2lkZV9tZXRhZGF0YSA9IDA7Cj4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgY29udGludWU7Cj4gLcKgwqDCoMKgwqDCoMKgIH0KPiAtwqDCoMKgwqDCoMKgwqAgaWYg KGluc2lkZV9tZXRhZGF0YSA9PSAwKSB7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW50IHNp emVfciwgc2l6ZV9nLCBzaXplX2I7Cj4gLQo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZvciAo aW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBpbnQgbnBvaW50cyA9IHN0cnRvbChsaW5lLCBOVUxMLCAwKTsKPiAtCj4gLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAobnBvaW50cyA+IDIpIHsKPiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZmxvYXQgdixsYXN0Owo+IC0KPiAtwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKG5wb2ludHMgPiBQUkVMVVRfU0laRSkgewo+ IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGF2X2xvZyhj dHgsIEFWX0xPR19FUlJPUiwgIlByZWx1dCBzaXplIHRvbwo+IGxhcmdlLlxuIik7Cj4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0ID0gQVZFUlJPUl9J TlZBTElEREFUQTsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBnb3RvIGVuZDsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg fQo+IC0KPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKGluX3By ZWx1dFtpXSB8fCBvdXRfcHJlbHV0W2ldKSB7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBm aWxlIGhhcyBtdWx0aXBsZQo+IHByZWx1dHMuXG4iKTsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOwo+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGdvdG8gZW5kOwo+ IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4gLQo+IC3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpbl9wcmVsdXRbaV3CoCA9IChmbG9hdCop YXZfbWFsbG9jKG5wb2ludHMgKgo+IHNpemVvZihmbG9hdCkpOwo+IC3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBvdXRfcHJlbHV0W2ldID0gKGZsb2F0Kilhdl9tYWxsb2Mo bnBvaW50cyAqCj4gc2l6ZW9mKGZsb2F0KSk7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGlmICghaW5fcHJlbHV0W2ldIHx8ICFvdXRfcHJlbHV0W2ldKSB7Cj4gLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0ID0gQVZFUlJP UihFTk9NRU0pOwo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGdvdG8gZW5kOwo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9 Cj4gLQo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwcmVsdXRfc2l6 ZXNbaV0gPSBucG9pbnRzOwo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBpbl9taW5baV0gPSBGTFRfTUFYOwo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBpbl9tYXhbaV0gPSAtRkxUX01BWDsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgb3V0X21pbltpXSA9IEZMVF9NQVg7Cj4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIG91dF9tYXhbaV0gPSAtRkxUX01BWDsKPiAtCj4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZvciAoaW50IGogPSAwOyBqIDwgbnBv aW50czsgaisrKSB7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgTkVYVF9GTE9BVF9PUl9HT1RPKHYsIGVuZCkKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpbl9taW5baV0gPSBGRk1JTihpbl9taW5baV0sIHYp Owo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGluX21h eFtpXSA9IEZGTUFYKGluX21heFtpXSwgdik7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgaW5fcHJlbHV0W2ldW2pdID0gdjsKPiAtwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoaiA+IDAgJiYgdiA8IGxhc3Qp IHsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZmlsZSwgbm9uCj4gaW5jcmVh c2luZyBwcmVsdXQuXG4iKTsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKPiAtwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGdvdG8gZW5kOwo+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPiAtwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBsYXN0ID0gdjsKPiAtwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+IC0KPiAtwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZm9yIChpbnQgaiA9IDA7IGogPCBucG9pbnRzOyBq KyspIHsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBO RVhUX0ZMT0FUX09SX0dPVE8odiwgZW5kKQo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIG91dF9taW5baV0gPSBGRk1JTihvdXRfbWluW2ldLCB2KTsKPiAt wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBvdXRfbWF4W2ld ID0gRkZNQVgob3V0X21heFtpXSwgdik7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgb3V0X3ByZWx1dFtpXVtqXSA9IHY7Cj4gLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPiAtCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCB9IGVsc2UgaWYgKG5wb2ludHMgPT0gMinCoCB7Cj4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIE5FWFRfTElORV9PUl9HT1RPKHNraXBfbGluZShsaW5lKSwg ZW5kKTsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKGF2X3Nz Y2FuZihsaW5lLCAiJWYgJWYiLCAmaW5fbWluW2ldLCAmaW5fbWF4W2ldKSAhPQo+IDIpIHsKPiAt wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXQgPSBBVkVS Uk9SX0lOVkFMSUREQVRBOwo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGdvdG8gZW5kOwo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCB9Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIE5FWFRfTElO RV9PUl9HT1RPKHNraXBfbGluZShsaW5lKSwgZW5kKTsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgaWYgKGF2X3NzY2FuZihsaW5lLCAiJWYgJWYiLCAmb3V0X21pbltp XSwgJm91dF9tYXhbaV0pICE9Cj4gMikgewo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7Cj4gLcKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZ290byBlbmQ7Cj4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPiAtCj4gLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCB9IGVsc2Ugewo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBudW1iZXIg b2YgcHJlLWx1dAo+IHBvaW50cy5cbiIpOwo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCByZXQgPSBBVkVSUk9SX1BBVENIV0VMQ09NRTsKPiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZ290byBlbmQ7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCB9Cj4gLQo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgTkVYVF9M SU5FX09SX0dPVE8oc2tpcF9saW5lKGxpbmUpLCBlbmQpOwo+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgIH0KPiAtCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKGF2X3NzY2FuZihsaW5lLCAi JWQgJWQgJWQiLCAmc2l6ZV9yLCAmc2l6ZV9nLCAmc2l6ZV9iKSAhPSAzKQo+IHsKPiAtwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKPiAtwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGdvdG8gZW5kOwo+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgIH0KPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoc2l6ZV9yICE9IHNpemVfZyB8fCBz aXplX3IgIT0gc2l6ZV9iKSB7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBhdl9s b2coY3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBzaXplIGNvbWJpbmF0aW9uOgo+ICVk eCVkeCVkLlxuIiwgc2l6ZV9yLCBzaXplX2csIHNpemVfYik7Cj4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCByZXQgPSBBVkVSUk9SX1BBVENIV0VMQ09NRTsKPiAtwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIGdvdG8gZW5kOwo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0K PiAtCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc2l6ZSA9IHNpemVfcjsKPiAtwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBzaXplMiA9IHNpemUgKiBzaXplOwo+IC0KPiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBpZiAocHJlbHV0X3NpemVzWzBdICYmIHByZWx1dF9zaXplc1sxXSAmJiBwcmVsdXRf c2l6ZXNbMl0pCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwcmVsdXQgPSAxOwo+ IC0KPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXQgPSBhbGxvY2F0ZV8zZGx1dChjdHgsIHNp emUsIHByZWx1dCk7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKHJldCA8IDApCj4gLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0Owo+IC0KPiAtwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBmb3IgKGludCBrID0gMDsgayA8IHNpemU7IGsrKykgewo+IC3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqKyspIHsK PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZm9yIChpbnQgaSA9IDA7 IGkgPCBzaXplOyBpKyspIHsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBzdHJ1Y3QgcmdidmVjICp2ZWMgPSAmbHV0M2QtPmx1dFtpICogc2l6ZTIgKyBq ICogc2l6ZQo+ICsga107Cj4gLQo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIE5FWFRfTElORV9PUl9HT1RPKHNraXBfbGluZShsaW5lKSwgZW5kKTsKPiAt wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoYXZfc3Nj YW5mKGxpbmUsICIlZiAlZiAlZiIsICZ2ZWMtPnIsICZ2ZWMtPmcsCj4gJnZlYy0+YikgIT0gMykg ewo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGdvdG8gZW5kOwo+IC3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPiAtCj4gLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdmVjLT5yICo9IG91dF9tYXhbMF0gLSBv dXRfbWluWzBdOwo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIHZlYy0+ZyAqPSBvdXRfbWF4WzFdIC0gb3V0X21pblsxXTsKPiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB2ZWMtPmIgKj0gb3V0X21heFsyXSAtIG91 dF9taW5bMl07Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPiAt wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCB9Cj4gLQo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOwo+IC3CoMKgwqDCoMKgwqDC oCB9Cj4gLcKgwqDCoCB9Cj4gLQo+IC3CoMKgwqAgaWYgKHByZWx1dCkgewo+IC3CoMKgwqDCoMKg wqDCoCBmb3IgKGludCBjID0gMDsgYyA8IDM7IGMrKykgewo+IC0KPiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBsdXQzZC0+cHJlbHV0Lm1pbltjXSA9IGluX21pbltjXTsKPiAtwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBsdXQzZC0+cHJlbHV0Lm1heFtjXSA9IGluX21heFtjXTsKPiAtwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBsdXQzZC0+cHJlbHV0LnNjYWxlW2NdID3CoCAoMS4wZiAvIChmbG9hdCko aW5fbWF4W2NdIC0gaW5fbWluW2NdKSkKPiAqIChsdXQzZC0+cHJlbHV0LnNpemUgLSAxKTsKPiAt Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZm9yIChpbnQgaSA9IDA7IGkgPCBsdXQzZC0+cHJl bHV0LnNpemU7ICsraSkgewo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZmxvYXQg bWl4ID0gKGZsb2F0KSBpIC8gKGZsb2F0KShsdXQzZC0+cHJlbHV0LnNpemUgLSAxKTsKPiAtwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZsb2F0IHggPSBsZXJwZihpbl9taW5bY10sIGlu X21heFtjXSwgbWl4KSwgYSwgYjsKPiAtCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBpbnQgaWR4ID0gbmVhcmVzdF9zYW1wbGVfaW5kZXgoaW5fcHJlbHV0W2NdLCB4LCAwLAo+IHBy ZWx1dF9zaXplc1tjXS0xKTsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGF2X2Fz c2VydDAoaWR4ICsgMSA8IHByZWx1dF9zaXplc1tjXSk7Cj4gLQo+IC3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgYcKgwqAgPSBvdXRfcHJlbHV0W2NdW2lkeCArIDBdOwo+IC3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYsKgwqAgPSBvdXRfcHJlbHV0W2NdW2lkeCArIDFdOwo+ IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbWl4ID0geCAtIGluX3ByZWx1dFtjXVtp ZHhdOwo+IC0KPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGx1dDNkLT5wcmVsdXQu bHV0W2NdW2ldID0gc2FuaXRpemVmKGxlcnBmKGEsIGIsIG1peCkpOwo+IC3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgIH0KPiAtwqDCoMKgwqDCoMKgwqAgfQo+IC3CoMKgwqDCoMKgwqDCoCBsdXQzZC0+ c2NhbGUuciA9IDEuMDBmOwo+IC3CoMKgwqDCoMKgwqDCoCBsdXQzZC0+c2NhbGUuZyA9IDEuMDBm Owo+IC3CoMKgwqDCoMKgwqDCoCBsdXQzZC0+c2NhbGUuYiA9IDEuMDBmOwo+IC0KPiAtwqDCoMKg IH0gZWxzZSB7Cj4gLcKgwqDCoMKgwqDCoMKgIGx1dDNkLT5zY2FsZS5yID0gYXZfY2xpcGYoMS4g LyAoaW5fbWF4WzBdIC0gaW5fbWluWzBdKSwgMC5mLCAxLmYpOwo+IC3CoMKgwqDCoMKgwqDCoCBs dXQzZC0+c2NhbGUuZyA9IGF2X2NsaXBmKDEuIC8gKGluX21heFsxXSAtIGluX21pblsxXSksIDAu ZiwgMS5mKTsKPiAtwqDCoMKgwqDCoMKgwqAgbHV0M2QtPnNjYWxlLmIgPSBhdl9jbGlwZigxLiAv IChpbl9tYXhbMl0gLSBpbl9taW5bMl0pLCAwLmYsIDEuZik7Cj4gLcKgwqDCoCB9Cj4gLQo+IC1l bmQ6Cj4gLcKgwqDCoCBmb3IgKGludCBjID0gMDsgYyA8IDM7IGMrKykgewo+IC3CoMKgwqDCoMKg wqDCoCBhdl9mcmVlcCgmaW5fcHJlbHV0W2NdKTsKPiAtwqDCoMKgwqDCoMKgwqAgYXZfZnJlZXAo Jm91dF9wcmVsdXRbY10pOwo+IC3CoMKgwqAgfQo+IC3CoMKgwqAgcmV0dXJuIHJldDsKPiAtfQo+ IC0KPiAtc3RhdGljIGludCBzZXRfaWRlbnRpdHlfbWF0cml4KEFWRmlsdGVyQ29udGV4dCAqY3R4 LCBpbnQgc2l6ZSkKPiAtewo+IC3CoMKgwqAgTFVUM0RDb250ZXh0ICpsdXQzZCA9IGN0eC0+cHJp djsKPiAtwqDCoMKgIGludCByZXQsIGksIGosIGs7Cj4gLcKgwqDCoCBjb25zdCBpbnQgc2l6ZTIg PSBzaXplICogc2l6ZTsKPiAtwqDCoMKgIGNvbnN0IGZsb2F0IGMgPSAxLiAvIChzaXplIC0gMSk7 Cj4gLQo+IC3CoMKgwqAgcmV0ID0gYWxsb2NhdGVfM2RsdXQoY3R4LCBzaXplLCAwKTsKPiAtwqDC oMKgIGlmIChyZXQgPCAwKQo+IC3CoMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0Owo+IC0KPiAtwqDC oMKgIGZvciAoayA9IDA7IGsgPCBzaXplOyBrKyspIHsKPiAtwqDCoMKgwqDCoMKgwqAgZm9yIChq ID0gMDsgaiA8IHNpemU7IGorKykgewo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZvciAoaSA9 IDA7IGkgPCBzaXplOyBpKyspIHsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0 cnVjdCByZ2J2ZWMgKnZlYyA9ICZsdXQzZC0+bHV0W2sgKiBzaXplMiArIGogKiBzaXplICsgaV07 Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB2ZWMtPnIgPSBrICogYzsKPiAtwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHZlYy0+ZyA9IGogKiBjOwo+IC3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgdmVjLT5iID0gaSAqIGM7Cj4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgfQo+IC3CoMKgwqDCoMKgwqDCoCB9Cj4gLcKgwqDCoCB9Cj4gLQo+IC3CoMKgwqAgcmV0 dXJuIDA7Cj4gLX0KPiAtCj4gwqBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9m bXRzW10gPSB7Cj4gwqDCoMKgwqAgQVZfUElYX0ZNVF9SR0IyNCzCoCBBVl9QSVhfRk1UX0JHUjI0 LAo+IMKgwqDCoMKgIEFWX1BJWF9GTVRfUkdCQSzCoMKgIEFWX1BJWF9GTVRfQkdSQSwKPiBAQCAt MTIzMCw2NiArNjk4LDE0IEBAIEFWRklMVEVSX0RFRklORV9DTEFTU19FWFQobHV0M2QsICJsdXQz ZCIsCj4gbHV0M2RfaGFsZGNsdXRfb3B0aW9ucyk7Cj4gwqAKPiDCoHN0YXRpYyBhdl9jb2xkIGlu dCBsdXQzZF9pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQo+IMKgewo+IC3CoMKgwqAgaW50IHJl dDsKPiAtwqDCoMKgIEZJTEUgKmY7Cj4gLcKgwqDCoCBjb25zdCBjaGFyICpleHQ7Cj4gwqDCoMKg wqAgTFVUM0RDb250ZXh0ICpsdXQzZCA9IGN0eC0+cHJpdjsKPiAtCj4gLcKgwqDCoCBsdXQzZC0+ c2NhbGUuciA9IGx1dDNkLT5zY2FsZS5nID0gbHV0M2QtPnNjYWxlLmIgPSAxLmY7Cj4gLQo+IC3C oMKgwqAgaWYgKCFsdXQzZC0+ZmlsZSkgewo+IC3CoMKgwqDCoMKgwqDCoCByZXR1cm4gc2V0X2lk ZW50aXR5X21hdHJpeChjdHgsIDMyKTsKPiAtwqDCoMKgIH0KPiAtCj4gLcKgwqDCoCBmID0gYXZw cml2X2ZvcGVuX3V0ZjgobHV0M2QtPmZpbGUsICJyIik7Cj4gLcKgwqDCoCBpZiAoIWYpIHsKPiAt wqDCoMKgwqDCoMKgwqAgcmV0ID0gQVZFUlJPUihlcnJubyk7Cj4gLcKgwqDCoMKgwqDCoMKgIGF2 X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIiVzOiAlc1xuIiwgbHV0M2QtPmZpbGUsIGF2X2VycjJz dHIocmV0KSk7Cj4gLcKgwqDCoMKgwqDCoMKgIHJldHVybiByZXQ7Cj4gLcKgwqDCoCB9Cj4gLQo+ IC3CoMKgwqAgZXh0ID0gc3RycmNocihsdXQzZC0+ZmlsZSwgJy4nKTsKPiAtwqDCoMKgIGlmICgh ZXh0KSB7Cj4gLcKgwqDCoMKgwqDCoMKgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlVuYWJs ZSB0byBndWVzcyB0aGUgZm9ybWF0IGZyb20gdGhlCj4gZXh0ZW5zaW9uXG4iKTsKPiAtwqDCoMKg wqDCoMKgwqAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKPiAtwqDCoMKgwqDCoMKgwqAgZ290 byBlbmQ7Cj4gLcKgwqDCoCB9Cj4gLcKgwqDCoCBleHQrKzsKPiAtCj4gLcKgwqDCoCBpZiAoIWF2 X3N0cmNhc2VjbXAoZXh0LCAiZGF0IikpIHsKPiAtwqDCoMKgwqDCoMKgwqAgcmV0ID0gcGFyc2Vf ZGF0KGN0eCwgZik7Cj4gLcKgwqDCoCB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGV4dCwgIjNk bCIpKSB7Cj4gLcKgwqDCoMKgwqDCoMKgIHJldCA9IHBhcnNlXzNkbChjdHgsIGYpOwo+IC3CoMKg wqAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChleHQsICJjdWJlIikpIHsKPiAtwqDCoMKgwqDC oMKgwqAgcmV0ID0gcGFyc2VfY3ViZShjdHgsIGYpOwo+IC3CoMKgwqAgfSBlbHNlIGlmICghYXZf c3RyY2FzZWNtcChleHQsICJtM2QiKSkgewo+IC3CoMKgwqDCoMKgwqDCoCByZXQgPSBwYXJzZV9t M2QoY3R4LCBmKTsKPiAtwqDCoMKgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAoZXh0LCAiY3Nw IikpIHsKPiAtwqDCoMKgwqDCoMKgwqAgcmV0ID0gcGFyc2VfY2luZXNwYWNlKGN0eCwgZik7Cj4g LcKgwqDCoCB9IGVsc2Ugewo+IC3CoMKgwqDCoMKgwqDCoCBhdl9sb2coY3R4LCBBVl9MT0dfRVJS T1IsICJVbnJlY29nbml6ZWQgJy4lcycgZmlsZSB0eXBlXG4iLCBleHQpOwo+IC3CoMKgwqDCoMKg wqDCoCByZXQgPSBBVkVSUk9SKEVJTlZBTCk7Cj4gLcKgwqDCoCB9Cj4gLQo+IC3CoMKgwqAgaWYg KCFyZXQgJiYgIWx1dDNkLT5sdXRzaXplKSB7Cj4gLcKgwqDCoMKgwqDCoMKgIGF2X2xvZyhjdHgs IEFWX0xPR19FUlJPUiwgIjNEIExVVCBpcyBlbXB0eVxuIik7Cj4gLcKgwqDCoMKgwqDCoMKgIHJl dCA9IEFWRVJST1JfSU5WQUxJRERBVEE7Cj4gLcKgwqDCoCB9Cj4gLQo+IC1lbmQ6Cj4gLcKgwqDC oCBmY2xvc2UoZik7Cj4gLcKgwqDCoCByZXR1cm4gcmV0Owo+ICvCoMKgwqAgcmV0dXJuIGZmX2x1 dDNkX2luaXQoY3R4LCBsdXQzZCk7Cj4gwqB9Cj4gwqAKPiDCoHN0YXRpYyBhdl9jb2xkIHZvaWQg bHV0M2RfdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQo+IMKgewo+IMKgwqDCoMKgIExVVDNE Q29udGV4dCAqbHV0M2QgPSBjdHgtPnByaXY7Cj4gLcKgwqDCoCBpbnQgaTsKPiAtwqDCoMKgIGF2 X2ZyZWVwKCZsdXQzZC0+bHV0KTsKPiAtCj4gLcKgwqDCoCBmb3IgKGkgPSAwOyBpIDwgMzsgaSsr KSB7Cj4gLcKgwqDCoMKgwqDCoMKgIGF2X2ZyZWVwKCZsdXQzZC0+cHJlbHV0Lmx1dFtpXSk7Cj4g LcKgwqDCoCB9Cj4gK8KgwqDCoCBmZl9sdXQzZF91bmluaXQobHV0M2QpOwo+IMKgfQo+IMKgCj4g wqBzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgbHV0M2RfaW5wdXRzW10gPSB7Cj4gQEAgLTE0OTks NyArOTE1LDcgQEAgc3RhdGljIGludCBjb25maWdfY2x1dChBVkZpbHRlckxpbmsgKmlubGluaykK PiDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Cj4gwqDCoMKgwqAgfQo+ IMKgCj4gLcKgwqDCoCByZXR1cm4gYWxsb2NhdGVfM2RsdXQoY3R4LCBsZXZlbCwgMCk7Cj4gK8Kg wqDCoCByZXR1cm4gZmZfYWxsb2NhdGVfM2RsdXQoY3R4LCBsdXQzZCwgbGV2ZWwsIDApOwo+IMKg fQo+IMKgCj4gwqBzdGF0aWMgaW50IHVwZGF0ZV9hcHBseV9jbHV0KEZGRnJhbWVTeW5jICpmcykK Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmZmbXBlZy1k ZXZlbCBtYWlsaW5nIGxpc3QKZmZtcGVnLWRldmVsQGZmbXBlZy5vcmcKaHR0cHM6Ly9mZm1wZWcu b3JnL21haWxtYW4vbGlzdGluZm8vZmZtcGVnLWRldmVsCgpUbyB1bnN1YnNjcmliZSwgdmlzaXQg bGluayBhYm92ZSwgb3IgZW1haWwKZmZtcGVnLWRldmVsLXJlcXVlc3RAZmZtcGVnLm9yZyB3aXRo IHN1YmplY3QgInVuc3Vic2NyaWJlIi4K