Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sR7VY-00DOx1-68 for pgsql-hackers@arkaria.postgresql.org; Tue, 09 Jul 2024 09:51:37 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1sR7VW-00EYRs-KI for pgsql-hackers@arkaria.postgresql.org; Tue, 09 Jul 2024 09:51:34 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sR7VV-00EYRk-TQ for pgsql-hackers@lists.postgresql.org; Tue, 09 Jul 2024 09:51:34 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sR7VM-001COw-VO for pgsql-hackers@lists.postgresql.org; Tue, 09 Jul 2024 09:51:32 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mx2023; t=1720518683; bh=XtJVmaLZdhusF9NHH4aomAs0k2W1PSn/XHu7Q9IyP0g=; h=Date:From:To:Cc:Subject:In-Reply-To:References:User-Agent: Message-ID:From; b=I6HxI0sbvP0EXJ7GuKlQNzluc2XeAM4cvmNVfLl/8Wt/qxzyapBoZilFghQWmK5qF smzpvEdmGNk3VzsK/r1NTdL3UuibwaH493zyoK0xOfJWNtiGB7XHfpJ0JJt2JRlusS VEhp8dH0yg4cPrJodSZh9U7Xi88MtQL2cg5hXMxuNLOncx7cuOr3C19F792hereVsP mHPrMoDAuSxS3Naz/i5GrxO7PupTEl3x6uHAPJGAltUJVU9Polb277NMPl1y337aC6 UCHtoRQv2Bqik56eAkHB/85Lxjm73nswReetJcBsqxVs1atGlmS6Q5hhTfb3PLokjU r00W6V1eOyrIA== Received: from mail.postgrespro.ru (webmail.mstn.postgrespro.ru [192.168.2.26]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: i.kartyshov@postgrespro.ru) by mail.postgrespro.ru (Postfix/587) with ESMTPSA id 5AE79601F0; Tue, 9 Jul 2024 12:51:23 +0300 (MSK) MIME-Version: 1.0 Date: Tue, 09 Jul 2024 12:51:23 +0300 From: Kartyshov Ivan To: Kyotaro Horiguchi Cc: aekorotkov@gmail.com, hlinnaka@iki.fi, alvherre@alvh.no-ip.org, pashkin.elfe@gmail.com, bharath.rupireddyforpostgres@gmail.com, euler@eulerto.com, thomas.munro@gmail.com, peter@eisentraut.org, amit.kapila16@gmail.com, dilipbalaut@gmail.com, smithpb2250@gmail.com, pgsql-hackers@lists.postgresql.org Subject: Re: [HACKERS] make async slave to wait for lsn to be replayed In-Reply-To: <20240620.173045.1163445432733259320.horikyota.ntt@gmail.com> References: <20240620.173045.1163445432733259320.horikyota.ntt@gmail.com> User-Agent: Roundcube Webmail/1.6.7 Message-ID: <8d0286f9f0c2f9fc29794dda6b5f4600@postgrespro.ru> X-Sender: i.kartyshov@postgrespro.ru Content-Type: multipart/mixed; boundary="=_f422e19c01bfc383c1855c69eec9cc41" X-KSMG-AntiPhishing: NotDetected, bases: 2024/07/09 09:10:00 X-KSMG-AntiSpam-Interceptor-Info: not scanned X-KSMG-AntiSpam-Status: not scanned, disabled by settings X-KSMG-AntiVirus: Kaspersky Secure Mail Gateway, version 2.1.0.7854, bases: 2024/07/09 06:10:00 #25915050 X-KSMG-AntiVirus-Status: NotDetected, skipped X-KSMG-LinksScanning: not scanned, disabled by settings X-KSMG-Message-Action: skipped X-KSMG-Rule-ID: 1 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --=_f422e19c01bfc383c1855c69eec9cc41 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed Thank you for your interest in the patch. On 2024-06-20 11:30, Kyotaro Horiguchi wrote: > Hi, I looked through the patch and have some comments. > > > ====== L68: > + Recovery Procedures > > It looks somewhat confusing and appears as if the section is intended > to explain how to perform recovery. Since this is the first built-in > procedure, I'm not sure how should this section be written. However, > the section immediately above is named "Recovery Control Functions", > so "Reocvery Synchronization Functions" would align better with the > naming of the upper section. (I don't believe we need to be so strcit > about the distinction between functions and procedures here.) > > It looks strange that the procedure signature includes the return type. Good point, change Recovery Procedures -> Recovery Synchronization Procedures > ====== L93: > + If timeout is not specified or zero, > this > + procedure returns once WAL is replayed upto > + target_lsn. > + If the timeout is specified (in > + milliseconds) and greater than zero, the procedure waits until > the > + server actually replays the WAL upto > target_lsn or > + until the given time has passed. On timeout, an error is > emitted. > > The first sentence should mention the main functionality. Following > precedents, it might be better to use something like "Waits until > recovery surpasses the specified LSN. If no timeout is specified or it > is set to zero, this procedure waits indefinitely for the LSN. If the > timeout is specified (in milliseconds) and is greater than zero, the > procedure waits until the LSN is reached or the specified time has > elapsed. On timeout, or if the server is promoted before the LSN is > reached, an error is emitted." > > The detailed explanation that follows the above seems somewhat too > verbose to me, as other functions don't have such detailed examples. Please offer your description. I think it would be better. > ====== L484 > /* > + * Set latches for processes, whose waited LSNs are already replayed. > This > + * involves spinlocks. So, we shouldn't do this under a spinlock. > + */ > > Here, I'm not quite sure what specifically spinlock (or mutex?) is > referring to. However, more importantly, shouldn't we explain that it > is okay not to use any locks at all, rather than mentioning that > spinlocks should not be used here? I found a similar case around > freelist.c:238, which is written as follows. > >> * Not acquiring ProcArrayLock here which is slightly icky. It's >> * actually fine because procLatch isn't ever freed, so we just can >> * potentially set the wrong process' (or no process') latch. >> */ >> SetLatch(&ProcGlobal->allProcs[bgwprocno].procLatch); ??? > ===== L518 > +void > +WaitForLSN(XLogRecPtr targetLSN, int64 timeout) > > This function is only called within the same module. I'm not sure if > we need to expose it. I we do, the name should probably be more > specific. I'm not quite sure if the division of functionality between > this function and its only caller function is appropriate. As a > possible refactoring, we could have WaitForLSN() just return the > result as [reached, timedout, promoted] and delegate prerequisition > checks and error reporting to the SQL function. waitLSN -> waitLSNStates No, waitLSNStates is not the best name, because waitLSNState is a state, and waitLSN is not the array of waitLSNStates. We can think about another name, what you think? > ===== L524 > + /* Shouldn't be called when shmem isn't initialized */ > + Assert(waitLSN); > > Seeing this assertion, I feel that the name "waitLSN" is a bit > obscure. How about renaming it to "waitLSNStates"? > ===== L527 > + /* Should be only called by a backend */ > + Assert(MyBackendType == B_BACKEND && MyProcNumber <= MaxBackends); > > This is somewhat excessive, causing a server crash when ending with an > error would suffice. By the way, if I execute "CALL > pg_wal_replay_wait('0/0')" on a logical wansender, the server crashes. > The condition doesn't seem appropriate. Can you give more information on your server crashes, so I could repeat them. > ===== L565 > + if (timeout > 0) > + { > + delay_ms = (endtime - GetCurrentTimestamp()) / 1000; > + latch_events |= WL_TIMEOUT; > + if (delay_ms <= 0) > + break; > > "timeout" is immutable in the function. Therefore, we can calculate > "latch_events" before entering the loop. By the way, the name > 'latch_events' seems a bit off. Latch is a kind of event the function > can wait for. Therefore, something like wait_events might be more > appropriate. "wait_event" - it can't be, because in latch declaration, this events responsible for wake up and not for wait int WaitLatch(Latch *latch, int wakeEvents, long timeout, uint32 wait_event_info) > ==== L578 > + if (rc & WL_LATCH_SET) > + ResetLatch(MyLatch); > > I think we usually reset latches unconditionally after returning from > WaitLatch(), even when waiting for timeouts. No, it depends on you logic, when you have several wake_events and you want to choose what event ignited your latch. Check applyparallelworker.c:813 > ===== L798 > + * A process number, same as the index of this item in > waitLSN->procInfos. > + * Stored for convenience. > + */ > + int procnum; > > It is described as "(just) for convenience". However, it is referenced > by Startup to fetch the PGPROC entry for the waiter, which necessary > for Startup. That aside, why don't we hold (the pointer to) procLatch > instead of procnum? It makes things simpler and I believe it is our > standard practice. Can you deeper explane what you meen and give the example? > ===== L809 > + /* A flag indicating that this item is added to waitLSN->waitersHeap > */ > + bool inHeap; > > The name "inHeap" seems too leteral and might be hard to understand in > most occurances. How about using "waiting" instead? No, inHeap leteral mean indeed inHeap. Check the comment. Please suggest a more suitable one. > ===== L940 > +# Check that new data is visible after calling pg_wal_replay_wait() > > On the other hand, the comment for the check for this test states that > >> +# Make sure the current LSN on standby and is the same as primary's >> LSN +ok($output eq 30, "standby reached the same LSN as primary"); > > I think the first comment and the second should be consistent. Thanks, I'll rephrase this comment >> Oh, I forgot some notes about 044_wal_replay_wait_injection_test.pl. >> >> 1. It's not clear why this test needs node_standby2 at all. It seems >> useless. > > I agree with you. What we would need is a second *waiter client* > connecting to the same stanby rather than a second standby. I feel > like having a test where the first waiter is removed while multiple > waiters are waiting, as well as a test where promotion occurs under > the same circumstances. Can you give more information about this cases step by step, and what means "remove" and "promotion". >> 2. The target LSN is set to pg_current_wal_insert_lsn() + 10000. This >> location seems to be unachievable in this test. So, it's not clear >> what race condition this test could potentially detect. >> 3. I think it would make sense to check for the race condition >> reported by Heikki. That is to insert the injection point at the >> beginning of WaitLSNSetLatches(). > > I think the race condition you mentioned refers to the inconsistency > between the inHeap flag and the pairing heap caused by a race > condition between timeout and wakeup (or perhaps other combinations? > I'm not sure which version of the patch the mentioned race condition > refers to). However, I imagine it is difficult to reliably reproduce > this condition. In that regard, in the latest patch, the coherence > between the inHeap flag and the pairing heap is protected by LWLock, > so I believe we no longer need that test. No, Alexandre means that Heikki point on race condition just before LWLock. But injection point we can inject and stepin on backend, and WaitLSNSetLatches is used from Recovery process. But I have trouble to wakeup injection point on server. -- Ivan Kartyshov Postgres Professional: www.postgrespro.com --=_f422e19c01bfc383c1855c69eec9cc41 Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=v20-Implement-pg_wal_replay_wait-store.patch Content-Disposition: attachment; filename=v20-Implement-pg_wal_replay_wait-store.patch; size=40892 RnJvbSBhODI1ZmJlNzI2MmQ4NDA1ZmUwNWYyOWFhOTRjYmRjMzRmMWM2ZjI4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiAiaS5rYXJ0eXNob3YiIDxpLmthcnR5c2hvdkBwb3N0cmdlc3By by5ydT4KRGF0ZTogTW9uLCA4IEp1bCAyMDI0IDIwOjQyOjE5ICswMzAwClN1YmplY3Q6IFtQQVRD SF0gU3ViamVjdDogW1BBVENIIHYyMF0gSW1wbGVtZW50IHBnX3dhbF9yZXBsYXlfd2FpdCgpIHN0 b3JlZAogcHJvY2VkdXJlCgpwZ193YWxfcmVwbGF5X3dhaXQoKSBpcyB0byBiZSB1c2VkIG9uIHN0 YW5kYnkgYW5kIHNwZWNpZmllcyB3YWl0aW5nIGZvcgp0aGUgc3BlY2lmaWMgV0FMIGxvY2F0aW9u IHRvIGJlIHJlcGxheWVkIGJlZm9yZSBzdGFydGluZyB0aGUgdHJhbnNhY3Rpb24uClRoaXMgb3B0 aW9uIGlzIHVzZWZ1bCB3aGVuIHRoZSB1c2VyIG1ha2VzIHNvbWUgZGF0YSBjaGFuZ2VzIG9uIHBy aW1hcnkgYW5kCm5lZWRzIGEgZ3VhcmFudGVlIHRvIHNlZSB0aGVzZSBjaGFuZ2VzIG9uIHN0YW5k YnkuCgpUaGUgcXVldWUgb2Ygd2FpdGVycyBpcyBzdG9yZWQgaW4gdGhlIHNoYXJlZCBtZW1vcnkg YXJyYXkgc29ydGVkIGJ5IExTTi4KRHVyaW5nIHJlcGxheSBvZiBXQUwgd2FpdGVycyB3aG9zZSBM U05zIGFyZSBhbHJlYWR5IHJlcGxheWVkIGFyZSBkZWxldGVkIGZyb20KdGhlIHNoYXJlZCBtZW1v cnkgYXJyYXkgYW5kIHdva2VuIHVwIGJ5IHNldHRpbmcgb2YgdGhlaXIgbGF0Y2hlcy4KCnBnX3dh bF9yZXBsYXlfd2FpdCgpIG5lZWRzIHRvIHdhaXQgd2l0aG91dCBhbnkgc25hcHNob3QgaGVsZC4g IE90aGVyd2lzZSwKdGhlIHNuYXBzaG90IGNvdWxkIHByZXZlbnQgdGhlIHJlcGxheSBvZiBXQUwg cmVjb3JkcyBpbXBseWluZyBhIGtpbmQgb2YKc2VsZi1kZWFkbG9jay4gIFRoaXMgaXMgd2h5IGl0 IGlzIG9ubHkgcG9zc2libGUgdG8gaW1wbGVtZW50CnBnX3dhbF9yZXBsYXlfd2FpdCgpIGFzIGEg cHJvY2VkdXJlIHdvcmtpbmcgd2l0aG91dCBhbiBhY3RpdmUgc25hcHNob3QsCm5vdCBhIGZ1bmN0 aW9uLgoKQ2F0dmVyc2lvbiBpcyBidW1wZWQuCgpEaXNjdXNzaW9uOiBodHRwczovL3Bvc3Rnci5l cy9tL2ViMTJmOWIwMzg1MWJiMjU4M2FkYWI1ZGY5NTc5YjRiJTQwcG9zdGdyZXNwcm8ucnUKQXV0 aG9yOiBLYXJ0eXNob3YgSXZhbiwgQWxleGFuZGVyIEtvcm90a292ClJldmlld2VkLWJ5OiBNaWNo YWVsIFBhcXVpZXIsIFBldGVyIEVpc2VudHJhdXQsIERpbGlwIEt1bWFyLCBBbWl0IEthcGlsYQpS ZXZpZXdlZC1ieTogQWxleGFuZGVyIExha2hpbiwgQmhhcmF0aCBSdXBpcmVkZHksIEV1bGVyIFRh dmVpcmEKLS0tCiBkb2Mvc3JjL3NnbWwvZnVuYy5zZ21sICAgICAgICAgICAgICAgICAgICAgICAg fCAxMDkgKysrKysrCiBzcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94YWN0LmMgICAgICAgICAg ICAgfCAgIDYgKwogc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZy5jICAgICAgICAgICAg IHwgICA3ICsKIHNyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2dyZWNvdmVyeS5jICAgICB8 ICAxMSArCiBzcmMvYmFja2VuZC9jYXRhbG9nL3N5c3RlbV9mdW5jdGlvbnMuc3FsICAgICAgfCAg IDMgKwogc3JjL2JhY2tlbmQvY29tbWFuZHMvTWFrZWZpbGUgICAgICAgICAgICAgICAgIHwgICAz ICstCiBzcmMvYmFja2VuZC9jb21tYW5kcy9tZXNvbi5idWlsZCAgICAgICAgICAgICAgfCAgIDEg Kwogc3JjL2JhY2tlbmQvY29tbWFuZHMvd2FpdGxzbi5jICAgICAgICAgICAgICAgIHwgMzQ2ICsr KysrKysrKysrKysrKysrKwogc3JjL2JhY2tlbmQvbGliL3BhaXJpbmdoZWFwLmMgICAgICAgICAg ICAgICAgIHwgIDE4ICstCiBzcmMvYmFja2VuZC9zdG9yYWdlL2lwYy9pcGNpLmMgICAgICAgICAg ICAgICAgfCAgIDMgKwogc3JjL2JhY2tlbmQvc3RvcmFnZS9sbWdyL3Byb2MuYyAgICAgICAgICAg ICAgIHwgICA2ICsKIC4uLi91dGlscy9hY3Rpdml0eS93YWl0X2V2ZW50X25hbWVzLnR4dCAgICAg ICB8ICAgMiArCiBzcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0ICAgICAgICAgICAgICAg fCAgIDUgKwogc3JjL2luY2x1ZGUvY29tbWFuZHMvd2FpdGxzbi5oICAgICAgICAgICAgICAgIHwg IDc3ICsrKysKIHNyYy9pbmNsdWRlL2xpYi9wYWlyaW5naGVhcC5oICAgICAgICAgICAgICAgICB8 ICAgMyArCiBzcmMvaW5jbHVkZS9zdG9yYWdlL2x3bG9ja2xpc3QuaCAgICAgICAgICAgICAgfCAg IDEgKwogc3JjL3Rlc3QvcGVybC9Qb3N0Z3JlU1FML1Rlc3QvQ2x1c3Rlci5wbSAgICAgIHwgIDIy ICsrCiBzcmMvdGVzdC9yZWNvdmVyeS9tZXNvbi5idWlsZCAgICAgICAgICAgICAgICAgfCAgIDIg Kwogc3JjL3Rlc3QvcmVjb3ZlcnkvdC8wNDNfd2FsX3JlcGxheV93YWl0LnBsICAgIHwgMjIyICsr KysrKysrKysrCiAuLi4vdC8wNDRfd2FsX3JlcGxheV93YWl0X2luamVjdGlvbl90ZXN0LnBsICAg fCAgODYgKysrKysKIHNyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0ICAgICAgICAgICAg ICB8ICAgMiArCiAyMSBmaWxlcyBjaGFuZ2VkLCA5MzIgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlv bnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvYmFja2VuZC9jb21tYW5kcy93YWl0bHNuLmMK IGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvaW5jbHVkZS9jb21tYW5kcy93YWl0bHNuLmgKIGNyZWF0 ZSBtb2RlIDEwMDY0NCBzcmMvdGVzdC9yZWNvdmVyeS90LzA0M193YWxfcmVwbGF5X3dhaXQucGwK IGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvdGVzdC9yZWNvdmVyeS90LzA0NF93YWxfcmVwbGF5X3dh aXRfaW5qZWN0aW9uX3Rlc3QucGwKCmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvZnVuYy5zZ21s IGIvZG9jL3NyYy9zZ21sL2Z1bmMuc2dtbAppbmRleCA5M2VlM2Q0YjYwLi4xMjExN2RmMWFiIDEw MDY0NAotLS0gYS9kb2Mvc3JjL3NnbWwvZnVuYy5zZ21sCisrKyBiL2RvYy9zcmMvc2dtbC9mdW5j LnNnbWwKQEAgLTI4ODE2LDYgKzI4ODE2LDExNSBAQCBwb3N0Z3Jlcz0jIFNFTEVDVCAnMC8wJzo6 cGdfbHNuICsgcGQuc2VnbWVudF9udW1iZXIgKiBwcy5zZXR0aW5nOjppbnQgKyA6b2Zmc2V0CiAg ICAgdGhlIHBhdXNlLCB0aGUgcmF0ZSBvZiBXQUwgZ2VuZXJhdGlvbiBhbmQgYXZhaWxhYmxlIGRp c2sgc3BhY2UuCiAgICA8L3BhcmE+CiAKKyAgIDxwYXJhPgorICAgIFRoZSBwcm9jZWR1cmUgc2hv d24gaW4gPHhyZWYgbGlua2VuZD0icHJvY2VkdXJlcy1yZWNvdmVyeS1jb250cm9sLXRhYmxlIi8+ CisgICAgY2FuIGJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIHJlY292ZXJ5LgorICAgPC9wYXJhPgor CisgICA8dGFibGUgaWQ9InJlY292ZXJ5LXN5bmNocm9uaXphdGlvbi1wcm9jZWR1cmUtdGFibGUi PgorICAgIDx0aXRsZT5SZWNvdmVyeSBTeW5jaHJvbml6YXRpb24gUHJvY2VkdXJlPC90aXRsZT4K KyAgICA8dGdyb3VwIGNvbHM9IjEiPgorICAgICA8dGhlYWQ+CisgICAgICA8cm93PgorICAgICAg IDxlbnRyeSByb2xlPSJmdW5jX3RhYmxlX2VudHJ5Ij48cGFyYSByb2xlPSJmdW5jX3NpZ25hdHVy ZSI+CisgICAgICAgIFByb2NlZHVyZQorICAgICAgIDwvcGFyYT4KKyAgICAgICA8cGFyYT4KKyAg ICAgICAgRGVzY3JpcHRpb24KKyAgICAgICA8L3BhcmE+PC9lbnRyeT4KKyAgICAgIDwvcm93Pgor ICAgICA8L3RoZWFkPgorCisgICAgIDx0Ym9keT4KKyAgICAgIDxyb3c+CisgICAgICAgPGVudHJ5 IHJvbGU9ImZ1bmNfdGFibGVfZW50cnkiPjxwYXJhIHJvbGU9ImZ1bmNfc2lnbmF0dXJlIj4KKyAg ICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgIDxwcmltYXJ5PnBnX3dhbF9yZXBsYXlfd2FpdDwv cHJpbWFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxmdW5jdGlvbj5wZ193YWxf cmVwbGF5X3dhaXQ8L2Z1bmN0aW9uPiAoCisgICAgICAgICAgPHBhcmFtZXRlcj50YXJnZXRfbHNu PC9wYXJhbWV0ZXI+IDx0eXBlPnBnX2xzbjwvdHlwZT4sCisgICAgICAgICAgPHBhcmFtZXRlcj50 aW1lb3V0PC9wYXJhbWV0ZXI+IDx0eXBlPmJpZ2ludDwvdHlwZT4gPGxpdGVyYWw+REVGQVVMVDwv bGl0ZXJhbD4gPGxpdGVyYWw+MDwvbGl0ZXJhbD4pCisgICAgICAgIDxyZXR1cm52YWx1ZT52b2lk PC9yZXR1cm52YWx1ZT4KKyAgICAgICA8L3BhcmE+CisgICAgICAgPHBhcmE+CisgICAgICAgIElm IDxwYXJhbWV0ZXI+dGltZW91dDwvcGFyYW1ldGVyPiBpcyBub3Qgc3BlY2lmaWVkIG9yIHplcm8s IHRoaXMKKyAgICAgICAgcHJvY2VkdXJlIHJldHVybnMgb25jZSBXQUwgaXMgcmVwbGF5ZWQgdXB0 bworICAgICAgICA8bGl0ZXJhbD50YXJnZXRfbHNuPC9saXRlcmFsPi4KKyAgICAgICAgSWYgdGhl IDxwYXJhbWV0ZXI+dGltZW91dDwvcGFyYW1ldGVyPiBpcyBzcGVjaWZpZWQgKGluCisgICAgICAg IG1pbGxpc2Vjb25kcykgYW5kIGdyZWF0ZXIgdGhhbiB6ZXJvLCB0aGUgcHJvY2VkdXJlIHdhaXRz IHVudGlsIHRoZQorICAgICAgICBzZXJ2ZXIgYWN0dWFsbHkgcmVwbGF5cyB0aGUgV0FMIHVwdG8g PGxpdGVyYWw+dGFyZ2V0X2xzbjwvbGl0ZXJhbD4gb3IKKyAgICAgICAgdW50aWwgdGhlIGdpdmVu IHRpbWUgaGFzIHBhc3NlZC4gT24gdGltZW91dCwgYW4gZXJyb3IgaXMgZW1pdHRlZC4KKyAgICAg ICA8L3BhcmE+PC9lbnRyeT4KKyAgICAgIDwvcm93PgorICAgICA8L3Rib2R5PgorICAgIDwvdGdy b3VwPgorICAgPC90YWJsZT4KKworICAgPHBhcmE+CisgICAgPGZ1bmN0aW9uPnBnX3dhbF9yZXBs YXlfd2FpdDwvZnVuY3Rpb24+IHdhaXRzIHRpbGwKKyAgICA8cGFyYW1ldGVyPnRhcmdldF9sc248 L3BhcmFtZXRlcj4gdG8gYmUgcmVwbGF5ZWQgb24gc3RhbmRieS4KKyAgICBUaGF0IGlzLCBhZnRl ciB0aGlzIGZ1bmN0aW9uIGV4ZWN1dGlvbiwgdGhlIHZhbHVlIHJldHVybmVkIGJ5CisgICAgPGZ1 bmN0aW9uPnBnX2xhc3Rfd2FsX3JlcGxheV9sc248L2Z1bmN0aW9uPiBzaG91bGQgYmUgZ3JlYXRl ciBvciBlcXVhbAorICAgIHRvIHRoZSA8cGFyYW1ldGVyPnRhcmdldF9sc248L3BhcmFtZXRlcj4g dmFsdWUuICBUaGlzIGlzIHVzZWZ1bCB0byBhY2hpZXZlCisgICAgcmVhZC15b3VyLXdyaXRlcy1j b25zaXN0ZW5jeSwgd2hpbGUgdXNpbmcgYXN5bmMgcmVwbGljYSBmb3IgcmVhZHMgYW5kCisgICAg cHJpbWFyeSBmb3Igd3JpdGVzLiAgSW4gdGhhdCBjYXNlIDxhY3JvbnltPmxzbjwvYWNyb255bT4g b2YgdGhlIGxhc3QKKyAgICBtb2RpZmljYXRpb24gc2hvdWxkIGJlIHN0b3JlZCBvbiB0aGUgY2xp ZW50IGFwcGxpY2F0aW9uIHNpZGUgb3IgdGhlCisgICAgY29ubmVjdGlvbiBwb29sZXIgc2lkZS4K KyAgIDwvcGFyYT4KKworICAgPHBhcmE+CisgICAgWW91IGNhbiB1c2UgPGZ1bmN0aW9uPnBnX3dh bF9yZXBsYXlfd2FpdDwvZnVuY3Rpb24+IHRvIHdhaXQgZm9yCisgICAgdGhlIDx0eXBlPnBnX2xz bjwvdHlwZT4gdmFsdWUuICBGb3IgZXhhbXBsZSwgYW4gYXBwbGljYXRpb24gY291bGQgdXBkYXRl CisgICAgdGhlIDxsaXRlcmFsPm1vdmllPC9saXRlcmFsPiB0YWJsZSBhbmQgZ2V0IHRoZSA8YWNy b255bT5sc248L2Fjcm9ueW0+IGFmdGVyCisgICAgY2hhbmdlcyBqdXN0IG1hZGUuICBUaGlzIGV4 YW1wbGUgdXNlcyA8ZnVuY3Rpb24+cGdfY3VycmVudF93YWxfaW5zZXJ0X2xzbjwvZnVuY3Rpb24+ CisgICAgb24gcHJpbWFyeSBzZXJ2ZXIgdG8gZ2V0IHRoZSA8YWNyb255bT5sc248L2Fjcm9ueW0+ IGdpdmVuIHRoYXQKKyAgICA8dmFybmFtZT5zeW5jaHJvbm91c19jb21taXQ8L3Zhcm5hbWU+IGNv dWxkIGJlIHNldCB0bworICAgIDxsaXRlcmFsPm9mZjwvbGl0ZXJhbD4uCisKKyAgIDxwcm9ncmFt bGlzdGluZz4KK3Bvc3RncmVzPSMgVVBEQVRFIG1vdmllIFNFVCBnZW5yZSA9ICdEcmFtYXRpYycg V0hFUkUgZ2VucmUgPSAnRHJhbWEnOworVVBEQVRFIDEwMAorcG9zdGdyZXM9IyBTRUxFQ1QgcGdf Y3VycmVudF93YWxfaW5zZXJ0X2xzbigpOworcGdfY3VycmVudF93YWxfaW5zZXJ0X2xzbgorLS0t LS0tLS0tLS0tLS0tLS0tLS0KKzAvMzA2RUUyMAorKDEgcm93KQorICAgPC9wcm9ncmFtbGlzdGlu Zz4KKworICAgVGhlbiBhbiBhcHBsaWNhdGlvbiBjb3VsZCBydW4gPGZ1bmN0aW9uPnBnX3dhbF9y ZXBsYXlfd2FpdDwvZnVuY3Rpb24+CisgICB3aXRoIHRoZSA8YWNyb255bT5sc248L2Fjcm9ueW0+ IG9idGFpbmVkIGZyb20gcHJpbWFyeS4gIEFmdGVyIHRoYXQgdGhlCisgICBjaGFuZ2VzIG1hZGUg b2YgcHJpbWFyeSBzaG91bGQgYmUgZ3VhcmFudGVlZCB0byBiZSB2aXNpYmxlIG9uIHJlcGxpY2Eu CisKKyAgIDxwcm9ncmFtbGlzdGluZz4KK3Bvc3RncmVzPSMgQ0FMTCBwZ193YWxfcmVwbGF5X3dh aXQoJzAvMzA2RUUyMCcpOworQ0FMTAorcG9zdGdyZXM9IyBTRUxFQ1QgKiBGUk9NIG1vdmllIFdI RVJFIGdlbnJlID0gJ0RyYW1hJzsKKyBnZW5yZQorLS0tLS0tLQorKDAgcm93cykKKyAgIDwvcHJv Z3JhbWxpc3Rpbmc+CisKKyAgIEl0IG1heSBhbHNvIGhhcHBlbiB0aGF0IHRhcmdldCA8YWNyb255 bT5sc248L2Fjcm9ueW0+IGlzIG5vdCBhY2hpZXZlZAorICAgd2l0aGluIHRoZSB0aW1lb3V0LiAg SW4gdGhhdCBjYXNlIHRoZSBlcnJvciBpcyB0aHJvd24uCisKKyAgIDxwcm9ncmFtbGlzdGluZz4K K3Bvc3RncmVzPSMgQ0FMTCBwZ193YWxfcmVwbGF5X3dhaXQoJzAvMzA2RUUyMCcsIDEwMCk7CitF UlJPUjogIHRpbWVkIG91dCB3aGlsZSB3YWl0aW5nIGZvciB0YXJnZXQgTFNOIDAvMzA2RUUyMCB0 byBiZSByZXBsYXllZDsgY3VycmVudCByZXBsYXkgTFNOIDAvMzA2RUE2MAorICAgIDwvcHJvZ3Jh bWxpc3Rpbmc+CisKKyAgIDwvcGFyYT4KKworICAgPHBhcmE+CisgICAgIDxmdW5jdGlvbj5wZ193 YWxfcmVwbGF5X3dhaXQ8L2Z1bmN0aW9uPiBjYW4gYmUgdXNlZCB3aXRoaW4KKyAgICAgdGhlIHRy YW5zYWN0aW9uLgorCisgICA8cHJvZ3JhbWxpc3Rpbmc+Citwb3N0Z3Jlcz0jIEJFR0lOOworQkVH SU4KK3Bvc3RncmVzPSojIENBTEwgcGdfd2FsX3JlcGxheV93YWl0KCcwLzMwNkVFMjAnKTsKKyAg IDwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgIDwvcGFyYT4KICAgPC9zZWN0Mj4KIAogICA8c2VjdDIg aWQ9ImZ1bmN0aW9ucy1zbmFwc2hvdC1zeW5jaHJvbml6YXRpb24iPgpkaWZmIC0tZ2l0IGEvc3Jj L2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGFjdC5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5z YW0veGFjdC5jCmluZGV4IGQxMTlhYjkwOWQuLmRmYzhjZjJkY2YgMTAwNjQ0Ci0tLSBhL3NyYy9i YWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hhY3QuYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvdHJh bnNhbS94YWN0LmMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlICJjb21tYW5kcy9hc3luYy5o IgogI2luY2x1ZGUgImNvbW1hbmRzL3RhYmxlY21kcy5oIgogI2luY2x1ZGUgImNvbW1hbmRzL3Ry aWdnZXIuaCIKKyNpbmNsdWRlICJjb21tYW5kcy93YWl0bHNuLmgiCiAjaW5jbHVkZSAiY29tbW9u L3BnX3BybmcuaCIKICNpbmNsdWRlICJleGVjdXRvci9zcGkuaCIKICNpbmNsdWRlICJsaWJwcS9i ZS1mc3N0dWJzLmgiCkBAIC0yODA5LDYgKzI4MTAsMTEgQEAgQWJvcnRUcmFuc2FjdGlvbih2b2lk KQogCSAqLwogCUxXTG9ja1JlbGVhc2VBbGwoKTsKIAorCS8qCisJICogQ2xlYW51cCB3YWl0aW5n IGZvciBMU04gaWYgYW55LgorCSAqLworCVdhaXRMU05DbGVhbnVwKCk7CisKIAkvKiBDbGVhciB3 YWl0IGluZm9ybWF0aW9uIGFuZCBjb21tYW5kIHByb2dyZXNzIGluZGljYXRvciAqLwogCXBnc3Rh dF9yZXBvcnRfd2FpdF9lbmQoKTsKIAlwZ3N0YXRfcHJvZ3Jlc3NfZW5kX2NvbW1hbmQoKTsKZGlm ZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2cuYyBiL3NyYy9iYWNrZW5k L2FjY2Vzcy90cmFuc2FtL3hsb2cuYwppbmRleCAzM2UyN2E2ZTcyLi43YzgyZTJjZDhiIDEwMDY0 NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9nLmMKKysrIGIvc3JjL2JhY2tl bmQvYWNjZXNzL3RyYW5zYW0veGxvZy5jCkBAIC02Niw2ICs2Niw3IEBACiAjaW5jbHVkZSAiY2F0 YWxvZy9jYXR2ZXJzaW9uLmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9wZ19jb250cm9sLmgiCiAjaW5j bHVkZSAiY2F0YWxvZy9wZ19kYXRhYmFzZS5oIgorI2luY2x1ZGUgImNvbW1hbmRzL3dhaXRsc24u aCIKICNpbmNsdWRlICJjb21tb24vY29udHJvbGRhdGFfdXRpbHMuaCIKICNpbmNsdWRlICJjb21t b24vZmlsZV91dGlscy5oIgogI2luY2x1ZGUgImV4ZWN1dG9yL2luc3RydW1lbnQuaCIKQEAgLTYx MzAsNiArNjEzMSwxMiBAQCBTdGFydHVwWExPRyh2b2lkKQogCVVwZGF0ZUNvbnRyb2xGaWxlKCk7 CiAJTFdMb2NrUmVsZWFzZShDb250cm9sRmlsZUxvY2spOwogCisJLyoKKwkgKiBXYWtlIHVwIGFs bCB3YWl0ZXJzIGZvciByZXBsYXkgTFNOLiAgVGhleSBuZWVkIHRvIHJlcG9ydCBhbiBlcnJvciB0 aGF0CisJICogcmVjb3Zlcnkgd2FzIGVuZGVkIGJlZm9yZSBhY2hpZXZpbmcgdGhlIHRhcmdldCBM U04uCisJICovCisJV2FpdExTTlNldExhdGNoZXMoSW52YWxpZFhMb2dSZWNQdHIpOworCiAJLyoK IAkgKiBTaHV0ZG93biB0aGUgcmVjb3ZlcnkgZW52aXJvbm1lbnQuICBUaGlzIG11c3Qgb2NjdXIg YWZ0ZXIKIAkgKiBSZWNvdmVyUHJlcGFyZWRUcmFuc2FjdGlvbnMoKSAoc2VlIG5vdGVzIGluIGxv Y2tfdHdvcGhhc2VfcmVjb3ZlcigpKQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL3Ry YW5zYW0veGxvZ3JlY292ZXJ5LmMgYi9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9ncmVj b3ZlcnkuYwppbmRleCAyZWQzZWEyYjQ1Li40NDNiNmMyODAyIDEwMDY0NAotLS0gYS9zcmMvYmFj a2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9ncmVjb3ZlcnkuYworKysgYi9zcmMvYmFja2VuZC9hY2Nl c3MvdHJhbnNhbS94bG9ncmVjb3ZlcnkuYwpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgImJh Y2t1cC9iYXNlYmFja3VwLmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9wZ19jb250cm9sLmgiCiAjaW5j bHVkZSAiY29tbWFuZHMvdGFibGVzcGFjZS5oIgorI2luY2x1ZGUgImNvbW1hbmRzL3dhaXRsc24u aCIKICNpbmNsdWRlICJjb21tb24vZmlsZV91dGlscy5oIgogI2luY2x1ZGUgIm1pc2NhZG1pbi5o IgogI2luY2x1ZGUgInBnc3RhdC5oIgpAQCAtMTgyOCw2ICsxODI5LDE2IEBAIFBlcmZvcm1XYWxS ZWNvdmVyeSh2b2lkKQogCQkJCWJyZWFrOwogCQkJfQogCisJCQkvKgorCQkJICogSWYgd2UgcmVw bGF5ZWQgYW4gTFNOIHRoYXQgc29tZW9uZSB3YXMgd2FpdGluZyBmb3IgdGhlbiB3YWxrCisJCQkg KiBvdmVyIHRoZSBzaGFyZWQgbWVtb3J5IGFycmF5IGFuZCBzZXQgbGF0Y2hlcyB0byBub3RpZnkg dGhlCisJCQkgKiB3YWl0ZXJzLgorCQkJICovCisJCQlpZiAod2FpdExTTiAmJgorCQkJCShYTG9n UmVjb3ZlcnlDdGwtPmxhc3RSZXBsYXllZEVuZFJlY1B0ciA+PQorCQkJCSBwZ19hdG9taWNfcmVh ZF91NjQoJndhaXRMU04tPm1pbldhaXRlZExTTikpKQorCQkJCVdhaXRMU05TZXRMYXRjaGVzKFhM b2dSZWNvdmVyeUN0bC0+bGFzdFJlcGxheWVkRW5kUmVjUHRyKTsKKwogCQkJLyogRWxzZSwgdHJ5 IHRvIGZldGNoIHRoZSBuZXh0IFdBTCByZWNvcmQgKi8KIAkJCXJlY29yZCA9IFJlYWRSZWNvcmQo eGxvZ3ByZWZldGNoZXIsIExPRywgZmFsc2UsIHJlcGxheVRMSSk7CiAJCX0gd2hpbGUgKHJlY29y ZCAhPSBOVUxMKTsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NhdGFsb2cvc3lzdGVtX2Z1bmN0 aW9ucy5zcWwgYi9zcmMvYmFja2VuZC9jYXRhbG9nL3N5c3RlbV9mdW5jdGlvbnMuc3FsCmluZGV4 IGFlMDk5ZTMyOGMuLjYyM2I5NTM5YjEgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2NhdGFsb2cv c3lzdGVtX2Z1bmN0aW9ucy5zcWwKKysrIGIvc3JjL2JhY2tlbmQvY2F0YWxvZy9zeXN0ZW1fZnVu Y3Rpb25zLnNxbApAQCAtNDE0LDYgKzQxNCw5IEBAIENSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9O CiAgIGpzb25fcG9wdWxhdGVfcmVjb3Jkc2V0KGJhc2UgYW55ZWxlbWVudCwgZnJvbV9qc29uIGpz b24sIHVzZV9qc29uX2FzX3RleHQgYm9vbGVhbiBERUZBVUxUIGZhbHNlKQogICBSRVRVUk5TIFNF VE9GIGFueWVsZW1lbnQgTEFOR1VBR0UgaW50ZXJuYWwgU1RBQkxFIFJPV1MgMTAwICBBUyAnanNv bl9wb3B1bGF0ZV9yZWNvcmRzZXQnIFBBUkFMTEVMIFNBRkU7CiAKK0NSRUFURSBPUiBSRVBMQUNF IFBST0NFRFVSRSBwZ193YWxfcmVwbGF5X3dhaXQodGFyZ2V0X2xzbiBwZ19sc24sIHRpbWVvdXQg aW50OCBERUZBVUxUIDApCisgIExBTkdVQUdFIGludGVybmFsIEFTICdwZ193YWxfcmVwbGF5X3dh aXQnOworCiBDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBwZ19sb2dpY2FsX3Nsb3RfZ2V0X2No YW5nZXMoCiAgICAgSU4gc2xvdF9uYW1lIG5hbWUsIElOIHVwdG9fbHNuIHBnX2xzbiwgSU4gdXB0 b19uY2hhbmdlcyBpbnQsIFZBUklBRElDIG9wdGlvbnMgdGV4dFtdIERFRkFVTFQgJ3t9JywKICAg ICBPVVQgbHNuIHBnX2xzbiwgT1VUIHhpZCB4aWQsIE9VVCBkYXRhIHRleHQpCmRpZmYgLS1naXQg YS9zcmMvYmFja2VuZC9jb21tYW5kcy9NYWtlZmlsZSBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL01h a2VmaWxlCmluZGV4IDQ4ZjczNDhmOTEuLmNlZGU5MGMzYjkgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNr ZW5kL2NvbW1hbmRzL01ha2VmaWxlCisrKyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL01ha2VmaWxl CkBAIC02MSw2ICs2MSw3IEBAIE9CSlMgPSBcCiAJdmFjdXVtLm8gXAogCXZhY3V1bXBhcmFsbGVs Lm8gXAogCXZhcmlhYmxlLm8gXAotCXZpZXcubworCXZpZXcubyBcCisJd2FpdGxzbi5vCiAKIGlu Y2x1ZGUgJCh0b3Bfc3JjZGlyKS9zcmMvYmFja2VuZC9jb21tb24ubWsKZGlmZiAtLWdpdCBhL3Ny Yy9iYWNrZW5kL2NvbW1hbmRzL21lc29uLmJ1aWxkIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvbWVz b24uYnVpbGQKaW5kZXggNmRkMDBhNGFiZC4uNzU0OWJlNWRjMyAxMDA2NDQKLS0tIGEvc3JjL2Jh Y2tlbmQvY29tbWFuZHMvbWVzb24uYnVpbGQKKysrIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvbWVz b24uYnVpbGQKQEAgLTUwLDQgKzUwLDUgQEAgYmFja2VuZF9zb3VyY2VzICs9IGZpbGVzKAogICAn dmFjdXVtcGFyYWxsZWwuYycsCiAgICd2YXJpYWJsZS5jJywKICAgJ3ZpZXcuYycsCisgICd3YWl0 bHNuLmMnLAogKQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvd2FpdGxzbi5jIGIv c3JjL2JhY2tlbmQvY29tbWFuZHMvd2FpdGxzbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAwMDAuLmE1NDViNmYyMzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYmFja2VuZC9j b21tYW5kcy93YWl0bHNuLmMKQEAgLTAsMCArMSwzNDYgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor ICoKKyAqIHdhaXRsc24uYworICoJICBJbXBsZW1lbnRzIHdhaXRpbmcgZm9yIHRoZSBnaXZlbiBy ZXBsYXkgTFNOLCB3aGljaCBpcyB1c2VkIGluCisgKgkgIENBTEwgcGdfd2FsX3JlcGxheV93YWl0 KHRhcmdldF9sc24gcGdfbHNuLCB0aW1lb3V0IGZsb2F0OCkuCisgKgorICogQ29weXJpZ2h0IChj KSAyMDI0LCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAorICoKKyAqIElERU5U SUZJQ0FUSU9OCisgKgkgIHNyYy9iYWNrZW5kL2NvbW1hbmRzL3dhaXRsc24uYworICoKKyAqLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlICJwb3N0Z3Jlcy5oIgorCisjaW5jbHVkZSA8 ZmxvYXQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJwZ3N0YXQuaCIKKyNpbmNs dWRlICJhY2Nlc3MveGxvZy5oIgorI2luY2x1ZGUgImFjY2Vzcy94bG9ncmVjb3ZlcnkuaCIKKyNp bmNsdWRlICJjb21tYW5kcy93YWl0bHNuLmgiCisjaW5jbHVkZSAiZnVuY2FwaS5oIgorI2luY2x1 ZGUgIm1pc2NhZG1pbi5oIgorI2luY2x1ZGUgInN0b3JhZ2UvbGF0Y2guaCIKKyNpbmNsdWRlICJz dG9yYWdlL3Byb2MuaCIKKyNpbmNsdWRlICJzdG9yYWdlL3NobWVtLmgiCisjaW5jbHVkZSAidXRp bHMvZm1ncnByb3Rvcy5oIgorI2luY2x1ZGUgInV0aWxzL2luamVjdGlvbl9wb2ludC5oIgorI2lu Y2x1ZGUgInV0aWxzL3BnX2xzbi5oIgorI2luY2x1ZGUgInV0aWxzL3NuYXBtZ3IuaCIKKyNpbmNs dWRlICJ1dGlscy93YWl0X2V2ZW50X3R5cGVzLmgiCisKK3N0YXRpYyBpbnQJbHNuX2NtcChjb25z dCBwYWlyaW5naGVhcF9ub2RlICphLCBjb25zdCBwYWlyaW5naGVhcF9ub2RlICpiLAorCQkJCQl2 b2lkICphcmcpOworCitzdHJ1Y3QgV2FpdExTTlN0YXRlICp3YWl0TFNOID0gTlVMTDsKKworLyog UmVwb3J0IHRoZSBhbW91bnQgb2Ygc2hhcmVkIG1lbW9yeSBzcGFjZSBuZWVkZWQgZm9yIFdhaXRM U05TdGF0ZS4gKi8KK1NpemUKK1dhaXRMU05TaG1lbVNpemUodm9pZCkKK3sKKwlTaXplCQlzaXpl OworCisJc2l6ZSA9IG9mZnNldG9mKFdhaXRMU05TdGF0ZSwgcHJvY0luZm9zKTsKKwlzaXplID0g YWRkX3NpemUoc2l6ZSwgbXVsX3NpemUoTWF4QmFja2VuZHMsIHNpemVvZihXYWl0TFNOUHJvY0lu Zm8pKSk7CisJcmV0dXJuIHNpemU7Cit9CisKKy8qIEluaXRpYWxpemUgdGhlIFdhaXRMU05TdGF0 ZSBpbiB0aGUgc2hhcmVkIG1lbW9yeS4gKi8KK3ZvaWQKK1dhaXRMU05TaG1lbUluaXQodm9pZCkK K3sKKwlib29sCQlmb3VuZDsKKworCXdhaXRMU04gPSAoV2FpdExTTlN0YXRlICopIFNobWVtSW5p dFN0cnVjdCgiV2FpdExTTlN0YXRlIiwKKwkJCQkJCQkJCQkJICAgV2FpdExTTlNobWVtU2l6ZSgp LAorCQkJCQkJCQkJCQkgICAmZm91bmQpOworCWlmICghZm91bmQpCisJeworCQlwZ19hdG9taWNf aW5pdF91NjQoJndhaXRMU04tPm1pbldhaXRlZExTTiwgUEdfVUlOVDY0X01BWCk7CisJCXBhaXJp bmdoZWFwX2luaXRpYWxpemUoJndhaXRMU04tPndhaXRlcnNIZWFwLCBsc25fY21wLCBOVUxMKTsK KwkJbWVtc2V0KCZ3YWl0TFNOLT5wcm9jSW5mb3MsIDAsIE1heEJhY2tlbmRzICogc2l6ZW9mKFdh aXRMU05Qcm9jSW5mbykpOworCX0KK30KKworLyoKKyAqIENvbXBhcmlzb24gZnVuY3Rpb24gZm9y IHdhaXRMU04tPndhaXRlcnNIZWFwIGhlYXAuICBXYWl0aW5nIHByb2Nlc3NlcyBhcmUKKyAqIG9y ZGVyZWQgYnkgbHNuLCBzbyB0aGF0IHRoZSB3YWl0ZXIgd2l0aCBzbWFsbGVzdCBsc24gaXMgYXQg dGhlIHRvcC4KKyAqLworc3RhdGljIGludAorbHNuX2NtcChjb25zdCBwYWlyaW5naGVhcF9ub2Rl ICphLCBjb25zdCBwYWlyaW5naGVhcF9ub2RlICpiLCB2b2lkICphcmcpCit7CisJY29uc3QgV2Fp dExTTlByb2NJbmZvICphcHJvYyA9IHBhaXJpbmdoZWFwX2NvbnN0X2NvbnRhaW5lcihXYWl0TFNO UHJvY0luZm8sIHBoTm9kZSwgYSk7CisJY29uc3QgV2FpdExTTlByb2NJbmZvICpicHJvYyA9IHBh aXJpbmdoZWFwX2NvbnN0X2NvbnRhaW5lcihXYWl0TFNOUHJvY0luZm8sIHBoTm9kZSwgYik7CisK KwlpZiAoYXByb2MtPndhaXRMU04gPCBicHJvYy0+d2FpdExTTikKKwkJcmV0dXJuIDE7CisJZWxz ZSBpZiAoYXByb2MtPndhaXRMU04gPiBicHJvYy0+d2FpdExTTikKKwkJcmV0dXJuIC0xOworCWVs c2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBVcGRhdGUgd2FpdExTTi0+bWluV2FpdGVkTFNO IGFjY29yZGluZyB0byB0aGUgY3VycmVudCBzdGF0ZSBvZgorICogd2FpdExTTi0+d2FpdGVyc0hl YXAuCisgKi8KK3N0YXRpYyB2b2lkCit1cGRhdGVNaW5XYWl0ZWRMU04odm9pZCkKK3sKKwlYTG9n UmVjUHRyCW1pbldhaXRlZExTTiA9IFBHX1VJTlQ2NF9NQVg7CisKKwlpZiAoIXBhaXJpbmdoZWFw X2lzX2VtcHR5KCZ3YWl0TFNOLT53YWl0ZXJzSGVhcCkpCisJeworCQlwYWlyaW5naGVhcF9ub2Rl ICpub2RlID0gcGFpcmluZ2hlYXBfZmlyc3QoJndhaXRMU04tPndhaXRlcnNIZWFwKTsKKworCQlt aW5XYWl0ZWRMU04gPSBwYWlyaW5naGVhcF9jb250YWluZXIoV2FpdExTTlByb2NJbmZvLCBwaE5v ZGUsIG5vZGUpLT53YWl0TFNOOworCX0KKworCXBnX2F0b21pY193cml0ZV91NjQoJndhaXRMU04t Pm1pbldhaXRlZExTTiwgbWluV2FpdGVkTFNOKTsKK30KKworLyoKKyAqIFB1dCB0aGUgY3VycmVu dCBwcm9jZXNzIGludG8gdGhlIGhlYXAgb2YgTFNOIHdhaXRlcnMuCisgKi8KK3N0YXRpYyB2b2lk CithZGRMU05XYWl0ZXIoWExvZ1JlY1B0ciBsc24pCit7CisJV2FpdExTTlByb2NJbmZvICpwcm9j SW5mbyA9ICZ3YWl0TFNOLT5wcm9jSW5mb3NbTXlQcm9jTnVtYmVyXTsKKworCUxXTG9ja0FjcXVp cmUoV2FpdExTTkxvY2ssIExXX0VYQ0xVU0lWRSk7CisKKwlBc3NlcnQoIXByb2NJbmZvLT5pbkhl YXApOworCisJcHJvY0luZm8tPnByb2NudW0gPSBNeVByb2NOdW1iZXI7CisJcHJvY0luZm8tPndh aXRMU04gPSBsc247CisKKwlwYWlyaW5naGVhcF9hZGQoJndhaXRMU04tPndhaXRlcnNIZWFwLCAm cHJvY0luZm8tPnBoTm9kZSk7CisJcHJvY0luZm8tPmluSGVhcCA9IHRydWU7CisJdXBkYXRlTWlu V2FpdGVkTFNOKCk7CisKKwlMV0xvY2tSZWxlYXNlKFdhaXRMU05Mb2NrKTsKK30KKworLyoKKyAq IFJlbW92ZSB0aGUgY3VycmVudCBwcm9jZXNzIGZyb20gdGhlIGhlYXAgb2YgTFNOIHdhaXRlcnMg aWYgaXQncyB0aGVyZS4KKyAqLworc3RhdGljIHZvaWQKK2RlbGV0ZUxTTldhaXRlcih2b2lkKQor eworCVdhaXRMU05Qcm9jSW5mbyAqcHJvY0luZm8gPSAmd2FpdExTTi0+cHJvY0luZm9zW015UHJv Y051bWJlcl07CisKKwlMV0xvY2tBY3F1aXJlKFdhaXRMU05Mb2NrLCBMV19FWENMVVNJVkUpOwor CisJaWYgKCFwcm9jSW5mby0+aW5IZWFwKQorCXsKKwkJTFdMb2NrUmVsZWFzZShXYWl0TFNOTG9j ayk7CisJCXJldHVybjsKKwl9CisKKwlwYWlyaW5naGVhcF9yZW1vdmUoJndhaXRMU04tPndhaXRl cnNIZWFwLCAmcHJvY0luZm8tPnBoTm9kZSk7CisJcHJvY0luZm8tPmluSGVhcCA9IGZhbHNlOwor CXVwZGF0ZU1pbldhaXRlZExTTigpOworCisJTFdMb2NrUmVsZWFzZShXYWl0TFNOTG9jayk7Cit9 CisKKy8qCisgKiBTZXQgbGF0Y2hlcyBvZiBMU04gd2FpdGVycyB3aG9zZSBMU04gaGFzIGJlZW4g cmVwbGF5ZWQuICBTZXQgbGF0Y2hlcyBvZiBhbGwKKyAqIExTTiB3YWl0ZXJzIHdoZW4gSW52YWxp ZFhMb2dSZWNQdHIgaXMgZ2l2ZW4uCisgKi8KK3ZvaWQKK1dhaXRMU05TZXRMYXRjaGVzKFhMb2dS ZWNQdHIgY3VycmVudExTTikKK3sKKwlpbnQJCQlpOworCWludAkJICAgKndha2VVcFByb2NOdW1z OworCWludAkJCW51bVdha2VVcFByb2NzID0gMDsKKworCXdha2VVcFByb2NOdW1zID0gcGFsbG9j KHNpemVvZihpbnQpICogTWF4QmFja2VuZHMpOworCisJLyoKKwkgKiBDaGVjayBpZiBzdGFydHVw IHByb2Nlc3MgaXMgYWxyZWFkeSByZXBsYXllZCB0YXJnZXQgbHNuCisJICovCisJSU5KRUNUSU9O X1BPSU5UKCJwZy13YWwtcmVwbGF5LXNldC1sYXRjaCIpOworCisJTFdMb2NrQWNxdWlyZShXYWl0 TFNOTG9jaywgTFdfRVhDTFVTSVZFKTsKKworCS8qCisJICogSXRlcmF0ZSB0aGUgcGFpcmluZyBo ZWFwIG9mIHdhaXRpbmcgcHJvY2Vzc2VzIHRpbGwgd2UgZmluZCBMU04gbm90IHlldAorCSAqIHJl cGxheWVkLiAgUmVjb3JkIHRoZSBwcm9jZXNzIG51bWJlcnMgdG8gc2V0IHRoZWlyIGxhdGNoZXMg bGF0ZXIuCisJICovCisJd2hpbGUgKCFwYWlyaW5naGVhcF9pc19lbXB0eSgmd2FpdExTTi0+d2Fp dGVyc0hlYXApKQorCXsKKwkJcGFpcmluZ2hlYXBfbm9kZSAqbm9kZSA9IHBhaXJpbmdoZWFwX2Zp cnN0KCZ3YWl0TFNOLT53YWl0ZXJzSGVhcCk7CisJCVdhaXRMU05Qcm9jSW5mbyAqcHJvY0luZm8g PSBwYWlyaW5naGVhcF9jb250YWluZXIoV2FpdExTTlByb2NJbmZvLCBwaE5vZGUsIG5vZGUpOwor CisJCWlmICghWExvZ1JlY1B0cklzSW52YWxpZChjdXJyZW50TFNOKSAmJgorCQkJcHJvY0luZm8t PndhaXRMU04gPiBjdXJyZW50TFNOKQorCQkJYnJlYWs7CisKKwkJd2FrZVVwUHJvY051bXNbbnVt V2FrZVVwUHJvY3MrK10gPSBwcm9jSW5mby0+cHJvY251bTsKKwkJKHZvaWQpIHBhaXJpbmdoZWFw X3JlbW92ZV9maXJzdCgmd2FpdExTTi0+d2FpdGVyc0hlYXApOworCQlwcm9jSW5mby0+aW5IZWFw ID0gZmFsc2U7CisJfQorCisJdXBkYXRlTWluV2FpdGVkTFNOKCk7CisKKwlMV0xvY2tSZWxlYXNl KFdhaXRMU05Mb2NrKTsKKworCS8qCisJICogU2V0IGxhdGNoZXMgZm9yIHByb2Nlc3Nlcywgd2hv c2Ugd2FpdGVkIExTTnMgYXJlIGFscmVhZHkgcmVwbGF5ZWQuIFRoaXMKKwkgKiBpbnZvbHZlcyBz cGlubG9ja3MuICBTbywgd2Ugc2hvdWxkbid0IGRvIHRoaXMgdW5kZXIgYSBzcGlubG9jay4KKwkg Ki8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtV2FrZVVwUHJvY3M7IGkrKykKKwl7CisJCVBHUFJPQwkg ICAqYmFja2VuZDsKKworCQliYWNrZW5kID0gR2V0UEdQcm9jQnlOdW1iZXIod2FrZVVwUHJvY051 bXNbaV0pOworCQlTZXRMYXRjaCgmYmFja2VuZC0+cHJvY0xhdGNoKTsKKwl9CisJcGZyZWUod2Fr ZVVwUHJvY051bXMpOworfQorCisvKgorICogRGVsZXRlIG91ciBpdGVtIGZyb20gc2htZW0gYXJy YXkgaWYgYW55LgorICovCit2b2lkCitXYWl0TFNOQ2xlYW51cCh2b2lkKQoreworCS8qCisJICog V2UgZG8gYSBmYXN0LXBhdGggY2hlY2sgb2YgdGhlICdpbkhlYXAnIGZsYWcgd2l0aG91dCB0aGUg bG9jay4gIFRoaXMKKwkgKiBmbGFnIGlzIHNldCB0byB0cnVlIG9ubHkgYnkgdGhlIHByb2Nlc3Mg aXRzZWxmLiAgU28sIGl0J3Mgb25seSBwb3NzaWJsZQorCSAqIHRvIGdldCBhIGZhbHNlIHBvc2l0 aXZlLiAgQnV0IHRoYXQgd2lsbCBiZSBlbGltaW5hdGVkIGJ5IGEgcmVjaGVjaworCSAqIGluc2lk ZSBkZWxldGVMU05XYWl0ZXIoKS4KKwkgKi8KKwlpZiAod2FpdExTTi0+cHJvY0luZm9zW015UHJv Y051bWJlcl0uaW5IZWFwKQorCQlkZWxldGVMU05XYWl0ZXIoKTsKK30KKworLyoKKyAqIFdhaXQg dXNpbmcgTXlMYXRjaCB0aWxsIHRoZSBnaXZlbiBMU04gaXMgcmVwbGF5ZWQsIHRoZSBwb3N0bWFz dGVyIGRpZXMgb3IKKyAqIHRpbWVvdXQgaGFwcGVucy4KKyAqLwordm9pZAorV2FpdEZvckxTTihY TG9nUmVjUHRyIHRhcmdldExTTiwgaW50NjQgdGltZW91dCkKK3sKKwlYTG9nUmVjUHRyCWN1cnJl bnRMU047CisJVGltZXN0YW1wVHogZW5kdGltZSA9IDA7CisKKwkvKiBTaG91bGRuJ3QgYmUgY2Fs bGVkIHdoZW4gc2htZW0gaXNuJ3QgaW5pdGlhbGl6ZWQgKi8KKwlBc3NlcnQod2FpdExTTik7CisK KwkvKiBTaG91bGQgYmUgb25seSBjYWxsZWQgYnkgYSBiYWNrZW5kICovCisJQXNzZXJ0KE15QmFj a2VuZFR5cGUgPT0gQl9CQUNLRU5EICYmIE15UHJvY051bWJlciA8PSBNYXhCYWNrZW5kcyk7CisK KwlpZiAoIVJlY292ZXJ5SW5Qcm9ncmVzcygpKQorCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJj b2RlKEVSUkNPREVfT0JKRUNUX05PVF9JTl9QUkVSRVFVSVNJVEVfU1RBVEUpLAorCQkJCSBlcnJt c2coInJlY292ZXJ5IGlzIG5vdCBpbiBwcm9ncmVzcyIpLAorCQkJCSBlcnJoaW50KCJXYWl0aW5n IGZvciBMU04gY2FuIG9ubHkgYmUgZXhlY3V0ZWQgZHVyaW5nIHJlY292ZXJ5LiIpKSk7CisKKwkv KiBJZiB0YXJnZXQgTFNOIGlzIGFscmVhZHkgcmVwbGF5ZWQsIGV4aXQgaW1tZWRpYXRlbHkgKi8K KwlpZiAodGFyZ2V0TFNOIDw9IEdldFhMb2dSZXBsYXlSZWNQdHIoTlVMTCkpCisJCXJldHVybjsK KworCWlmICh0aW1lb3V0ID4gMCkKKwkJZW5kdGltZSA9IFRpbWVzdGFtcFR6UGx1c01pbGxpc2Vj b25kcyhHZXRDdXJyZW50VGltZXN0YW1wKCksIHRpbWVvdXQpOworCisJYWRkTFNOV2FpdGVyKHRh cmdldExTTik7CisKKwlmb3IgKDs7KQorCXsKKwkJaW50CQkJcmM7CisJCWludAkJCXdha2VfZXZl bnRzID0gV0xfTEFUQ0hfU0VUIHwgV0xfRVhJVF9PTl9QTV9ERUFUSDsKKwkJbG9uZwkJZGVsYXlf bXMgPSAwOworCisJCS8qIENoZWNrIGlmIHRoZSB3YWl0ZWQgTFNOIGhhcyBiZWVuIHJlcGxheWVk ICovCisJCWN1cnJlbnRMU04gPSBHZXRYTG9nUmVwbGF5UmVjUHRyKE5VTEwpOworCQlpZiAodGFy Z2V0TFNOIDw9IGN1cnJlbnRMU04pCisJCQlicmVhazsKKworCQkvKiBSZWNoZWNrIHRoYXQgcmVj b3ZlcnkgaXMgc3RpbGwgaW4tcHJvZ3Jlc3MgKi8KKwkJaWYgKCFSZWNvdmVyeUluUHJvZ3Jlc3Mo KSkKKwkJCWVyZXBvcnQoRVJST1IsCisJCQkJCShlcnJjb2RlKEVSUkNPREVfT0JKRUNUX05PVF9J Tl9QUkVSRVFVSVNJVEVfU1RBVEUpLAorCQkJCQkgZXJybXNnKCJyZWNvdmVyeSBpcyBub3QgaW4g cHJvZ3Jlc3MiKSwKKwkJCQkJIGVycmRldGFpbCgiUmVjb3ZlcnkgZW5kZWQgYmVmb3JlIHJlcGxh eWluZyB0aGUgdGFyZ2V0IExTTiAlWC8lWDsgbGFzdCByZXBsYXkgTFNOICVYLyVYLiIsCisJCQkJ CQkJICAgTFNOX0ZPUk1BVF9BUkdTKHRhcmdldExTTiksCisJCQkJCQkJICAgTFNOX0ZPUk1BVF9B UkdTKGN1cnJlbnRMU04pKSkpOworCisJCWlmICh0aW1lb3V0ID4gMCkKKwkJeworCQkJZGVsYXlf bXMgPSBUaW1lc3RhbXBEaWZmZXJlbmNlTWlsbGlzZWNvbmRzKAorCQkJCQkJR2V0Q3VycmVudFRp bWVzdGFtcCgpLGVuZHRpbWUpOworCQkJd2FrZV9ldmVudHMgfD0gV0xfVElNRU9VVDsKKwkJCWlm IChkZWxheV9tcyA8PSAwKQorCQkJCWJyZWFrOworCQl9CisKKwkJQ0hFQ0tfRk9SX0lOVEVSUlVQ VFMoKTsKKworCQlyYyA9IFdhaXRMYXRjaChNeUxhdGNoLCB3YWtlX2V2ZW50cywgZGVsYXlfbXMs CisJCQkJCSAgIFdBSVRfRVZFTlRfV0FJVF9GT1JfV0FMX1JFUExBWSk7CisKKwkJaWYgKHJjICYg V0xfTEFUQ0hfU0VUKQorCQkJUmVzZXRMYXRjaChNeUxhdGNoKTsKKwl9CisKKwlkZWxldGVMU05X YWl0ZXIoKTsKKworCWlmICh0YXJnZXRMU04gPiBjdXJyZW50TFNOKQorCXsKKwkJZXJlcG9ydChF UlJPUiwKKwkJCQkoZXJyY29kZShFUlJDT0RFX1FVRVJZX0NBTkNFTEVEKSwKKwkJCQkgZXJybXNn KCJ0aW1lZCBvdXQgd2hpbGUgd2FpdGluZyBmb3IgdGFyZ2V0IExTTiAlWC8lWCB0byBiZSByZXBs YXllZDsgY3VycmVudCByZXBsYXkgTFNOICVYLyVYIiwKKwkJCQkJCUxTTl9GT1JNQVRfQVJHUyh0 YXJnZXRMU04pLAorCQkJCQkJTFNOX0ZPUk1BVF9BUkdTKGN1cnJlbnRMU04pKSkpOworCX0KK30K KworRGF0dW0KK3BnX3dhbF9yZXBsYXlfd2FpdChQR19GVU5DVElPTl9BUkdTKQoreworCVhMb2dS ZWNQdHIJdGFyZ2V0X2xzbiA9IFBHX0dFVEFSR19MU04oMCk7CisJaW50NjQJCXRpbWVvdXQgPSBQ R19HRVRBUkdfSU5UNjQoMSk7CisKKwlpZiAodGltZW91dCA8IDApCisJCWVyZXBvcnQoRVJST1Is CisJCQkJKGVycmNvZGUoRVJSQ09ERV9OVU1FUklDX1ZBTFVFX09VVF9PRl9SQU5HRSksCisJCQkJ IGVycm1zZygiXCJ0aW1lb3V0XCIgbXVzdCBub3QgYmUgbmVnYXRpdmUiKSkpOworCisJLyoKKwkg KiBXZSBhcmUgZ29pbmcgdG8gd2FpdCBmb3IgdGhlIExTTiByZXBsYXkuICBXZSBzaG91bGQgZmly c3QgY2FyZSB0aGF0IHdlCisJICogZG9uJ3QgaG9sZCBhIHNuYXBzaG90IGFuZCBjb3JyZXNwb25k aW5nbHkgb3VyIE15UHJvYy0+eG1pbiBpcyBpbnZhbGlkLgorCSAqIE90aGVyd2lzZSwgb3VyIHNu YXBzaG90IGNvdWxkIHByZXZlbnQgdGhlIHJlcGxheSBvZiBXQUwgcmVjb3JkcworCSAqIGltcGx5 aW5nIGEga2luZCBvZiBzZWxmLWRlYWRsb2NrLiAgVGhpcyBpcyB0aGUgcmVhc29uIHdoeQorCSAq IHBnX3dhbF9yZXBsYXlfd2FpdCgpIGlzIGEgcHJvY2VkdXJlLCBub3QgYSBmdW5jdGlvbi4KKwkg KgorCSAqIEF0IGZpcnN0LCB3ZSBzaG91bGQgY2hlY2sgdGhlcmUgaXMgbm8gYWN0aXZlIHNuYXBz aG90LiAgQWNjb3JkaW5nIHRvCisJICogUGxhbm5lZFN0bXRSZXF1aXJlc1NuYXBzaG90KCksIGV2 ZW4gaW4gYW4gYXRvbWljIGNvbnRleHQsIENhbGxTdG10IGlzCisJICogcHJvY2Vzc2VkIHdpdGgg YSBzbmFwc2hvdC4gIFRoYW5rZnVsbHksIHdlIGNhbiBwb3AgdGhpcyBzbmFwc2hvdCwKKwkgKiBi ZWNhdXNlIFBvcnRhbFJ1blV0aWxpdHkoKSBjYW4gdG9sZXJhdGUgdGhpcy4KKwkgKi8KKwlpZiAo QWN0aXZlU25hcHNob3RTZXQoKSkKKwkJUG9wQWN0aXZlU25hcHNob3QoKTsKKworCS8qIEdpdmUg dXAgaWYgdGhlcmUgaXMgc3RpbGwgYW4gYWN0aXZlIHNhbnBzaG90LiAqLworCWlmIChBY3RpdmVT bmFwc2hvdFNldCgpKQorCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVfT0JK RUNUX05PVF9JTl9QUkVSRVFVSVNJVEVfU1RBVEUpLAorCQkJCSBlcnJtc2coInBnX3dhbF9yZXBs YXlfd2FpdCgpIG11c3QgYmUgb25seSBjYWxsZWQgd2l0aG91dCBhY3RpdmUgc25hcHNob3QiKSwK KwkJCQkgZXJyZGV0YWlsKCJNYWtlIHN1cmUgcGdfd2FsX3JlcGxheV93YWl0KCkgaXNuJ3QgY2Fs bGVkIHdpdGhpbiBhIHRyYW5zYWN0aW9uLCBhbm90aGVyIHByb2NlZHVyZSwgb3IgYSBmdW5jdGlv bi4iKSkpOworCisJLyoKKwkgKiBBdCBzZWNvbmQsIGludmFsaWRhdGUgYSBjYXRhbG9nIHNuYXBz aG90IGlmIGFueS4gIEFuZCB3ZSBzaG91bGQgYmUgZG9uZQorCSAqIHdpdGggdGhlIHByZXBhcmF0 aW9uLgorCSAqLworCUludmFsaWRhdGVDYXRhbG9nU25hcHNob3QoKTsKKwlBc3NlcnQoTXlQcm9j LT54bWluID09IEludmFsaWRUcmFuc2FjdGlvbklkKTsKKworCSh2b2lkKSBXYWl0Rm9yTFNOKHRh cmdldF9sc24sIHRpbWVvdXQpOworCisJUEdfUkVUVVJOX1ZPSUQoKTsKK30KZGlmZiAtLWdpdCBh L3NyYy9iYWNrZW5kL2xpYi9wYWlyaW5naGVhcC5jIGIvc3JjL2JhY2tlbmQvbGliL3BhaXJpbmdo ZWFwLmMKaW5kZXggZmUxZGViYTEzZS4uNzg1OGU1ZTA3NiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tl bmQvbGliL3BhaXJpbmdoZWFwLmMKKysrIGIvc3JjL2JhY2tlbmQvbGliL3BhaXJpbmdoZWFwLmMK QEAgLTQ0LDEyICs0NCwyNiBAQCBwYWlyaW5naGVhcF9hbGxvY2F0ZShwYWlyaW5naGVhcF9jb21w YXJhdG9yIGNvbXBhcmUsIHZvaWQgKmFyZykKIAlwYWlyaW5naGVhcCAqaGVhcDsKIAogCWhlYXAg PSAocGFpcmluZ2hlYXAgKikgcGFsbG9jKHNpemVvZihwYWlyaW5naGVhcCkpOworCXBhaXJpbmdo ZWFwX2luaXRpYWxpemUoaGVhcCwgY29tcGFyZSwgYXJnKTsKKworCXJldHVybiBoZWFwOworfQor CisvKgorICogcGFpcmluZ2hlYXBfaW5pdGlhbGl6ZQorICoKKyAqIFNhbWUgYXMgcGFpcmluZ2hl YXBfYWxsb2NhdGUoKSwgYnV0IGluaXRpYWxpemVzIHRoZSBwYWlyaW5nIGhlYXAgaW4tcGxhY2UK KyAqIHJhdGhlciB0aGFuIGFsbG9jYXRpbmcgYSBuZXcgY2h1bmsgb2YgbWVtb3J5LiAgVXNlZnVs IHRvIHN0b3JlIHRoZSBwYWlyaW5nCisgKiBoZWFwIGluIGEgc2hhcmVkIG1lbW9yeS4KKyAqLwor dm9pZAorcGFpcmluZ2hlYXBfaW5pdGlhbGl6ZShwYWlyaW5naGVhcCAqaGVhcCwgcGFpcmluZ2hl YXBfY29tcGFyYXRvciBjb21wYXJlLAorCQkJCQkgICB2b2lkICphcmcpCit7CiAJaGVhcC0+cGhf Y29tcGFyZSA9IGNvbXBhcmU7CiAJaGVhcC0+cGhfYXJnID0gYXJnOwogCiAJaGVhcC0+cGhfcm9v dCA9IE5VTEw7Ci0KLQlyZXR1cm4gaGVhcDsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL3NyYy9iYWNr ZW5kL3N0b3JhZ2UvaXBjL2lwY2kuYyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL2lwY2kuYwpp bmRleCAyMTAwMTUwZjAxLi5iMTgwYWU5N2FmIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9zdG9y YWdlL2lwYy9pcGNpLmMKKysrIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvaXBjaS5jCkBAIC0y NSw2ICsyNSw3IEBACiAjaW5jbHVkZSAiYWNjZXNzL3hsb2dwcmVmZXRjaGVyLmgiCiAjaW5jbHVk ZSAiYWNjZXNzL3hsb2dyZWNvdmVyeS5oIgogI2luY2x1ZGUgImNvbW1hbmRzL2FzeW5jLmgiCisj aW5jbHVkZSAiY29tbWFuZHMvd2FpdGxzbi5oIgogI2luY2x1ZGUgIm1pc2NhZG1pbi5oIgogI2lu Y2x1ZGUgInBnc3RhdC5oIgogI2luY2x1ZGUgInBvc3RtYXN0ZXIvYXV0b3ZhY3V1bS5oIgpAQCAt MTUyLDYgKzE1Myw3IEBAIENhbGN1bGF0ZVNobWVtU2l6ZShpbnQgKm51bV9zZW1hcGhvcmVzKQog CXNpemUgPSBhZGRfc2l6ZShzaXplLCBXYWl0RXZlbnRDdXN0b21TaG1lbVNpemUoKSk7CiAJc2l6 ZSA9IGFkZF9zaXplKHNpemUsIEluamVjdGlvblBvaW50U2htZW1TaXplKCkpOwogCXNpemUgPSBh ZGRfc2l6ZShzaXplLCBTbG90U3luY1NobWVtU2l6ZSgpKTsKKwlzaXplID0gYWRkX3NpemUoc2l6 ZSwgV2FpdExTTlNobWVtU2l6ZSgpKTsKICNpZmRlZiBFWEVDX0JBQ0tFTkQKIAlzaXplID0gYWRk X3NpemUoc2l6ZSwgU2htZW1CYWNrZW5kQXJyYXlTaXplKCkpOwogI2VuZGlmCkBAIC0zNTcsNiAr MzU5LDcgQEAgQ3JlYXRlT3JBdHRhY2hTaG1lbVN0cnVjdHModm9pZCkKIAlTdGF0c1NobWVtSW5p dCgpOwogCVdhaXRFdmVudEN1c3RvbVNobWVtSW5pdCgpOwogCUluamVjdGlvblBvaW50U2htZW1J bml0KCk7CisJV2FpdExTTlNobWVtSW5pdCgpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvc3JjL2Jh Y2tlbmQvc3RvcmFnZS9sbWdyL3Byb2MuYyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvbG1nci9wcm9j LmMKaW5kZXggMWIyM2VmYjI2Zi4uYWM2NmRhODYzOCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQv c3RvcmFnZS9sbWdyL3Byb2MuYworKysgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2xtZ3IvcHJvYy5j CkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSAiYWNjZXNzL3RyYW5zYW0uaCIKICNpbmNsdWRl ICJhY2Nlc3MvdHdvcGhhc2UuaCIKICNpbmNsdWRlICJhY2Nlc3MveGxvZ3V0aWxzLmgiCisjaW5j bHVkZSAiY29tbWFuZHMvd2FpdGxzbi5oIgogI2luY2x1ZGUgIm1pc2NhZG1pbi5oIgogI2luY2x1 ZGUgInBnc3RhdC5oIgogI2luY2x1ZGUgInBvc3RtYXN0ZXIvYXV0b3ZhY3V1bS5oIgpAQCAtODYy LDYgKzg2MywxMSBAQCBQcm9jS2lsbChpbnQgY29kZSwgRGF0dW0gYXJnKQogCSAqLwogCUxXTG9j a1JlbGVhc2VBbGwoKTsKIAorCS8qCisJICogQ2xlYW51cCB3YWl0aW5nIGZvciBMU04gaWYgYW55 LgorCSAqLworCVdhaXRMU05DbGVhbnVwKCk7CisKIAkvKiBDYW5jZWwgYW55IHBlbmRpbmcgY29u ZGl0aW9uIHZhcmlhYmxlIHNsZWVwLCB0b28gKi8KIAlDb25kaXRpb25WYXJpYWJsZUNhbmNlbFNs ZWVwKCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FjdGl2aXR5L3dhaXRfZXZl bnRfbmFtZXMudHh0IGIvc3JjL2JhY2tlbmQvdXRpbHMvYWN0aXZpdHkvd2FpdF9ldmVudF9uYW1l cy50eHQKaW5kZXggZGIzN2JlZWFhZS4uZDEwY2E3MjNkYyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tl bmQvdXRpbHMvYWN0aXZpdHkvd2FpdF9ldmVudF9uYW1lcy50eHQKKysrIGIvc3JjL2JhY2tlbmQv dXRpbHMvYWN0aXZpdHkvd2FpdF9ldmVudF9uYW1lcy50eHQKQEAgLTg3LDYgKzg3LDcgQEAgTElC UFFXQUxSRUNFSVZFUl9DT05ORUNUCSJXYWl0aW5nIGluIFdBTCByZWNlaXZlciB0byBlc3RhYmxp c2ggY29ubmVjdGlvbiB0byByZW0KIExJQlBRV0FMUkVDRUlWRVJfUkVDRUlWRQkiV2FpdGluZyBp biBXQUwgcmVjZWl2ZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gcmVtb3RlIHNlcnZlci4iCiBTU0xf T1BFTl9TRVJWRVIJIldhaXRpbmcgZm9yIFNTTCB3aGlsZSBhdHRlbXB0aW5nIGNvbm5lY3Rpb24u IgogV0FJVF9GT1JfU1RBTkRCWV9DT05GSVJNQVRJT04JIldhaXRpbmcgZm9yIFdBTCB0byBiZSBy ZWNlaXZlZCBhbmQgZmx1c2hlZCBieSB0aGUgcGh5c2ljYWwgc3RhbmRieS4iCitXQUlUX0ZPUl9X QUxfUkVQTEFZCSJXYWl0aW5nIGZvciBhIHJlcGxheSBvZiB0aGUgcGFydGljdWxhciBXQUwgcG9z aXRpb24gb24gdGhlIHBoeXNpY2FsIHN0YW5kYnkuIgogV0FMX1NFTkRFUl9XQUlUX0ZPUl9XQUwJ IldhaXRpbmcgZm9yIFdBTCB0byBiZSBmbHVzaGVkIGluIFdBTCBzZW5kZXIgcHJvY2Vzcy4iCiBX QUxfU0VOREVSX1dSSVRFX0RBVEEJIldhaXRpbmcgZm9yIGFueSBhY3Rpdml0eSB3aGVuIHByb2Nl c3NpbmcgcmVwbGllcyBmcm9tIFdBTCByZWNlaXZlciBpbiBXQUwgc2VuZGVyIHByb2Nlc3MuIgog CkBAIC0zNDUsNiArMzQ2LDcgQEAgV0FMU3VtbWFyaXplcgkiV2FpdGluZyB0byByZWFkIG9yIHVw ZGF0ZSBXQUwgc3VtbWFyaXphdGlvbiBzdGF0ZS4iCiBEU01SZWdpc3RyeQkiV2FpdGluZyB0byBy ZWFkIG9yIHVwZGF0ZSB0aGUgZHluYW1pYyBzaGFyZWQgbWVtb3J5IHJlZ2lzdHJ5LiIKIEluamVj dGlvblBvaW50CSJXYWl0aW5nIHRvIHJlYWQgb3IgdXBkYXRlIGluZm9ybWF0aW9uIHJlbGF0ZWQg dG8gaW5qZWN0aW9uIHBvaW50cy4iCiBTZXJpYWxDb250cm9sCSJXYWl0aW5nIHRvIHJlYWQgb3Ig dXBkYXRlIHNoYXJlZCA8ZmlsZW5hbWU+cGdfc2VyaWFsPC9maWxlbmFtZT4gc3RhdGUuIgorV2Fp dExTTgkiV2FpdGluZyB0byByZWFkIG9yIHVwZGF0ZSBzaGFyZWQgV2FpdC1mb3ItTFNOIHN0YXRl LiIKIAogIwogIyBFTkQgT0YgUFJFREVGSU5FRCBMV0xPQ0tTIChETyBOT1QgQ0hBTkdFIFRISVMg TElORSkKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQgYi9zcmMv aW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0CmluZGV4IDBiZjQxM2ZlMDUuLjExNDBhYzVhMDcg MTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQKKysrIGIvc3JjL2lu Y2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdApAQCAtMTIxNjEsNiArMTIxNjEsMTEgQEAKICAgcHJv cmV0dHlwZSA9PiAnYnl0ZWEnLCBwcm9hcmd0eXBlcyA9PiAncGdfYnJpbl9taW5tYXhfbXVsdGlf c3VtbWFyeScsCiAgIHByb3NyYyA9PiAnYnJpbl9taW5tYXhfbXVsdGlfc3VtbWFyeV9zZW5kJyB9 LAogCit7IG9pZCA9PiAnMTYzODcnLCBkZXNjciA9PiAnd2FpdCB3aXRoIHRpbWVvdXQgZm9yIHRh cmdldCBMU04gdG8gcmVwbGF5ZWQgb24gc3RhbmRieScsCisgIHByb25hbWUgPT4gJ3BnX3dhbF9y ZXBsYXlfd2FpdCcsIHByb2tpbmQgPT4gJ3AnLCBwcm9yZXR0eXBlID0+ICd2b2lkJywKKyAgcHJv YXJndHlwZXMgPT4gJ3BnX2xzbiBpbnQ4JywgcHJvYXJnbmFtZXMgPT4gJ3t0YXJnZXRfbHNuLHRp bWVvdXR9JywKKyAgcHJvc3JjID0+ICdwZ193YWxfcmVwbGF5X3dhaXQnIH0sCisKIHsgb2lkID0+ ICc2MjkxJywgZGVzY3IgPT4gJ2FyYml0cmFyeSB2YWx1ZSBmcm9tIGFtb25nIGlucHV0IHZhbHVl cycsCiAgIHByb25hbWUgPT4gJ2FueV92YWx1ZScsIHByb2tpbmQgPT4gJ2EnLCBwcm9pc3N0cmlj dCA9PiAnZicsCiAgIHByb3JldHR5cGUgPT4gJ2FueWVsZW1lbnQnLCBwcm9hcmd0eXBlcyA9PiAn YW55ZWxlbWVudCcsCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9jb21tYW5kcy93YWl0bHNuLmgg Yi9zcmMvaW5jbHVkZS9jb21tYW5kcy93YWl0bHNuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMDAwMC4uYTE5NDA5ZTRiMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9pbmNsdWRl L2NvbW1hbmRzL3dhaXRsc24uaApAQCAtMCwwICsxLDc3IEBACisvKi0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyAqCisgKiB3YWl0bHNuLmgKKyAqCSAgRGVjbGFyYXRpb25zIGZvciBMU04gcmVwbGF5IHdhaXRp bmcgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDI0LCBQb3N0Z3JlU1FMIEdsb2Jh bCBEZXZlbG9wbWVudCBHcm91cAorICoKKyAqIHNyYy9pbmNsdWRlL2NvbW1hbmRzL3dhaXRsc24u aAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaWZuZGVmIFdBSVRfTFNOX0gKKyNkZWZp bmUgV0FJVF9MU05fSAorCisjaW5jbHVkZSAibGliL3BhaXJpbmdoZWFwLmgiCisjaW5jbHVkZSAi cG9zdGdyZXMuaCIKKyNpbmNsdWRlICJwb3J0L2F0b21pY3MuaCIKKyNpbmNsdWRlICJzdG9yYWdl L3NwaW4uaCIKKyNpbmNsdWRlICJ0Y29wL2Rlc3QuaCIKKworLyoKKyAqIFdhaXRMU05Qcm9jSW5m byAtIHRoZSBzaGFyZWQgbWVtb3J5IHN0cnVjdHVyZSByZXByZXNlbnRpbmcgaW5mb3JtYXRpb24K KyAqIGFib3V0IHRoZSBzaW5nbGUgcHJvY2Vzcywgd2hpY2ggbWF5IHdhaXQgZm9yIExTTiByZXBs YXkuICBBbiBpdGVtIG9mCisgKiB3YWl0TFNOLT5wcm9jSW5mb3MgYXJyYXkuCisgKi8KK3R5cGVk ZWYgc3RydWN0IFdhaXRMU05Qcm9jSW5mbworeworCS8qCisJICogQSBwcm9jZXNzIG51bWJlciwg c2FtZSBhcyB0aGUgaW5kZXggb2YgdGhpcyBpdGVtIGluIHdhaXRMU04tPnByb2NJbmZvcy4KKwkg KiBTdG9yZWQgZm9yIGNvbnZlbmllbmNlLgorCSAqLworCWludAkJCXByb2NudW07CisKKwkvKiBM U04sIHdoaWNoIHRoaXMgcHJvY2VzcyBpcyB3YWl0aW5nIGZvciAqLworCVhMb2dSZWNQdHIJd2Fp dExTTjsKKworCS8qIEEgcGFpcmluZyBoZWFwIG5vZGUgZm9yIHBhcnRpY2lwYXRpb24gaW4gd2Fp dExTTi0+d2FpdGVyc0hlYXAgKi8KKwlwYWlyaW5naGVhcF9ub2RlIHBoTm9kZTsKKworCS8qIEEg ZmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhpcyBpdGVtIGlzIGFkZGVkIHRvIHdhaXRMU04tPndhaXRl cnNIZWFwICovCisJYm9vbAkJaW5IZWFwOworfSBXYWl0TFNOUHJvY0luZm87CisKKy8qCisgKiBX YWl0TFNOU3RhdGUgLSB0aGUgc2hhcmVkIG1lbW9yeSBzdGF0ZSBmb3IgdGhlIHJlcGxheSBMU04g d2FpdGluZyBmYWNpbGl0eS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgV2FpdExTTlN0YXRlCit7CisJ LyoKKwkgKiBUaGUgbWluaW11bSBMU04gdmFsdWUgc29tZSBwcm9jZXNzIGlzIHdhaXRpbmcgZm9y LiAgVXNlZCBmb3IgdGhlCisJICogZmFzdC1wYXRoIGNoZWNraW5nIGlmIHdlIG5lZWQgdG8gd2Fr ZSB1cCBhbnkgd2FpdGVycyBhZnRlciByZXBsYXlpbmcgYQorCSAqIFdBTCByZWNvcmQuICBDb3Vs ZCBiZSByZWFkIGxvY2stbGVzcy4gIFVwZGF0ZSBwcm90ZWN0ZWQgYnkgV2FpdExTTkxvY2suCisJ ICovCisJcGdfYXRvbWljX3VpbnQ2NCBtaW5XYWl0ZWRMU047CisKKwkvKgorCSAqIEEgcGFpcmlu ZyBoZWFwIG9mIHdhaXRpbmcgcHJvY2Vzc2VzIG9yZGVyIGJ5IExTTiB2YWx1ZXMgKGxlYXN0IExT TiBpcworCSAqIG9uIHRvcCkuICBQcm90ZWN0ZWQgYnkgV2FpdExTTkxvY2suCisJICovCisJcGFp cmluZ2hlYXAgd2FpdGVyc0hlYXA7CisKKwkvKgorCSAqIEFuIGFycmF5IHdpdGggcGVyLXByb2Nl c3MgaW5mb3JtYXRpb24sIGluZGV4ZWQgYnkgdGhlIHByb2Nlc3MgbnVtYmVyLgorCSAqIFByb3Rl Y3RlZCBieSBXYWl0TFNOTG9jay4KKwkgKi8KKwlXYWl0TFNOUHJvY0luZm8gcHJvY0luZm9zW0ZM RVhJQkxFX0FSUkFZX01FTUJFUl07Cit9IFdhaXRMU05TdGF0ZTsKKworZXh0ZXJuIFBHRExMSU1Q T1JUIHN0cnVjdCBXYWl0TFNOU3RhdGUgKndhaXRMU047CisKK2V4dGVybiB2b2lkIFdhaXRGb3JM U04oWExvZ1JlY1B0ciB0YXJnZXRMU04sIGludDY0IHRpbWVvdXQpOworZXh0ZXJuIFNpemUgV2Fp dExTTlNobWVtU2l6ZSh2b2lkKTsKK2V4dGVybiB2b2lkIFdhaXRMU05TaG1lbUluaXQodm9pZCk7 CitleHRlcm4gdm9pZCBXYWl0TFNOU2V0TGF0Y2hlcyhYTG9nUmVjUHRyIGN1cnJlbnRMU04pOwor ZXh0ZXJuIHZvaWQgV2FpdExTTkNsZWFudXAodm9pZCk7CisKKyNlbmRpZgkJCQkJCQkvKiBXQUlU X0xTTl9IICovCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9saWIvcGFpcmluZ2hlYXAuaCBiL3Ny Yy9pbmNsdWRlL2xpYi9wYWlyaW5naGVhcC5oCmluZGV4IDdlYWRlODE1MzUuLjllMWMyNjAzM2Eg MTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2xpYi9wYWlyaW5naGVhcC5oCisrKyBiL3NyYy9pbmNs dWRlL2xpYi9wYWlyaW5naGVhcC5oCkBAIC03Nyw2ICs3Nyw5IEBAIHR5cGVkZWYgc3RydWN0IHBh aXJpbmdoZWFwCiAKIGV4dGVybiBwYWlyaW5naGVhcCAqcGFpcmluZ2hlYXBfYWxsb2NhdGUocGFp cmluZ2hlYXBfY29tcGFyYXRvciBjb21wYXJlLAogCQkJCQkJCQkJCSB2b2lkICphcmcpOworZXh0 ZXJuIHZvaWQgcGFpcmluZ2hlYXBfaW5pdGlhbGl6ZShwYWlyaW5naGVhcCAqaGVhcCwKKwkJCQkJ CQkJICAgcGFpcmluZ2hlYXBfY29tcGFyYXRvciBjb21wYXJlLAorCQkJCQkJCQkgICB2b2lkICph cmcpOwogZXh0ZXJuIHZvaWQgcGFpcmluZ2hlYXBfZnJlZShwYWlyaW5naGVhcCAqaGVhcCk7CiBl eHRlcm4gdm9pZCBwYWlyaW5naGVhcF9hZGQocGFpcmluZ2hlYXAgKmhlYXAsIHBhaXJpbmdoZWFw X25vZGUgKm5vZGUpOwogZXh0ZXJuIHBhaXJpbmdoZWFwX25vZGUgKnBhaXJpbmdoZWFwX2ZpcnN0 KHBhaXJpbmdoZWFwICpoZWFwKTsKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3N0b3JhZ2UvbHds b2NrbGlzdC5oIGIvc3JjL2luY2x1ZGUvc3RvcmFnZS9sd2xvY2tsaXN0LmgKaW5kZXggNmEyZjY0 YzU0Zi4uODhkYzc5YjJiZCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvc3RvcmFnZS9sd2xvY2ts aXN0LmgKKysrIGIvc3JjL2luY2x1ZGUvc3RvcmFnZS9sd2xvY2tsaXN0LmgKQEAgLTgzLDMgKzgz LDQgQEAgUEdfTFdMT0NLKDQ5LCBXQUxTdW1tYXJpemVyKQogUEdfTFdMT0NLKDUwLCBEU01SZWdp c3RyeSkKIFBHX0xXTE9DSyg1MSwgSW5qZWN0aW9uUG9pbnQpCiBQR19MV0xPQ0soNTIsIFNlcmlh bENvbnRyb2wpCitQR19MV0xPQ0soNTMsIFdhaXRMU04pCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9w ZXJsL1Bvc3RncmVTUUwvVGVzdC9DbHVzdGVyLnBtIGIvc3JjL3Rlc3QvcGVybC9Qb3N0Z3JlU1FM L1Rlc3QvQ2x1c3Rlci5wbQppbmRleCAwMTM1YzVhNzk1Li5mMDUwMDJlNTc1IDEwMDY0NAotLS0g YS9zcmMvdGVzdC9wZXJsL1Bvc3RncmVTUUwvVGVzdC9DbHVzdGVyLnBtCisrKyBiL3NyYy90ZXN0 L3BlcmwvUG9zdGdyZVNRTC9UZXN0L0NsdXN0ZXIucG0KQEAgLTI4NTEsNiArMjg1MSwyOCBAQCBz dWIgd2FpdF9mb3JfZXZlbnQKIAogPXBvZAogCis9aXRlbSAkbm9kZS0+d2FpdF9mb3JfZXZlbnRz KHdhaXRfZXZlbnRfbmFtZSkKKworUG9sbCBwZ19zdGF0X2FjdGl2aXR5IHVudGlsIHJlYWNoZXMg d2FpdF9ldmVudF9uYW1lLgorCis9Y3V0CisKK3N1YiB3YWl0X2Zvcl9ldmVudHMKK3sKKwlteSAo JHNlbGYsICR3YWl0X2V2ZW50X25hbWUpID0gQF87CisKKwkkc2VsZi0+cG9sbF9xdWVyeV91bnRp bCgKKwkJJ3Bvc3RncmVzJywgcXFbCisJCVNFTEVDVCBjb3VudCgqKSA+IDAgRlJPTSBwZ19zdGF0 X2FjdGl2aXR5CisJCVdIRVJFIHdhaXRfZXZlbnQgPSAnJHdhaXRfZXZlbnRfbmFtZScKKwldKQor CSAgb3IgZGllCisJICBxcSh0aW1lZCBvdXQgd2hlbiB3YWl0aW5nIGZvciB0byByZWFjaCB3YWl0 IGV2ZW50ICckd2FpdF9ldmVudF9uYW1lJyk7CisKKwlyZXR1cm47Cit9Cis9cG9kCisKID1pdGVt ICRub2RlLT53YWl0X2Zvcl9jYXRjaHVwKHN0YW5kYnlfbmFtZSwgbW9kZSwgdGFyZ2V0X2xzbikK IAogV2FpdCBmb3IgdGhlIHJlcGxpY2F0aW9uIGNvbm5lY3Rpb24gd2l0aCBhcHBsaWNhdGlvbl9u YW1lIHN0YW5kYnlfbmFtZSB1bnRpbApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVjb3ZlcnkvbWVz b24uYnVpbGQgYi9zcmMvdGVzdC9yZWNvdmVyeS9tZXNvbi5idWlsZAppbmRleCBiMWViNzdiMWVj Li4zZWZlNDY0NWFjIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWNvdmVyeS9tZXNvbi5idWlsZAor KysgYi9zcmMvdGVzdC9yZWNvdmVyeS9tZXNvbi5idWlsZApAQCAtNTEsNiArNTEsOCBAQCB0ZXN0 cyArPSB7CiAgICAgICAndC8wNDBfc3RhbmRieV9mYWlsb3Zlcl9zbG90c19zeW5jLnBsJywKICAg ICAgICd0LzA0MV9jaGVja3BvaW50X2F0X3Byb21vdGUucGwnLAogICAgICAgJ3QvMDQyX2xvd19s ZXZlbF9iYWNrdXAucGwnLAorICAgICAgJ3QvMDQzX3dhbF9yZXBsYXlfd2FpdC5wbCcsCisgICAg ICAndC8wNDRfd2FsX3JlcGxheV93YWl0X2luamVjdGlvbl90ZXN0LnBsJywKICAgICBdLAogICB9 LAogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVjb3ZlcnkvdC8wNDNfd2FsX3JlcGxheV93YWl0 LnBsIGIvc3JjL3Rlc3QvcmVjb3ZlcnkvdC8wNDNfd2FsX3JlcGxheV93YWl0LnBsCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAuLmNjOGZiMjA3OWEKLS0tIC9kZXYvbnVsbAor KysgYi9zcmMvdGVzdC9yZWNvdmVyeS90LzA0M193YWxfcmVwbGF5X3dhaXQucGwKQEAgLTAsMCAr MSwyMjIgQEAKKyMgQ2hlY2tzIHdhaXRpbmcgZm9yIHRoZSBsc24gcmVwbGF5IG9uIHN0YW5kYnkg dXNpbmcKKyMgcGdfd2FsX3JlcGxheV93YWl0KCkgcHJvY2VkdXJlLgordXNlIHN0cmljdDsKK3Vz ZSB3YXJuaW5nczsKKwordXNlIFBvc3RncmVTUUw6OlRlc3Q6OkNsdXN0ZXI7Cit1c2UgUG9zdGdy ZVNRTDo6VGVzdDo6VXRpbHM7Cit1c2UgVGVzdDo6TW9yZTsKKworIyBJbml0aWFsaXplIHByaW1h cnkgbm9kZQorbXkgJG5vZGVfcHJpbWFyeSA9IFBvc3RncmVTUUw6OlRlc3Q6OkNsdXN0ZXItPm5l dygncHJpbWFyeScpOworJG5vZGVfcHJpbWFyeS0+aW5pdChhbGxvd3Nfc3RyZWFtaW5nID0+IDEp OworJG5vZGVfcHJpbWFyeS0+c3RhcnQ7CisKKyMgQW5kIHNvbWUgY29udGVudCBhbmQgdGFrZSBh IGJhY2t1cAorJG5vZGVfcHJpbWFyeS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsCisJIkNSRUFURSBU QUJMRSB3YWl0X3Rlc3QgQVMgU0VMRUNUIGdlbmVyYXRlX3NlcmllcygxLDEwKSBBUyBhIik7Citt eSAkYmFja3VwX25hbWUgPSAnbXlfYmFja3VwJzsKKyRub2RlX3ByaW1hcnktPmJhY2t1cCgkYmFj a3VwX25hbWUpOworCisjIENyZWF0ZSBhIHN0cmVhbWluZyBzdGFuZGJ5IHdpdGggYSAxIHNlY29u ZCBkZWxheSBmcm9tIHRoZSBiYWNrdXAKK215ICRub2RlX3N0YW5kYnkxID0gUG9zdGdyZVNRTDo6 VGVzdDo6Q2x1c3Rlci0+bmV3KCdzdGFuZGJ5Jyk7CitteSAkZGVsYXkgPSAxOworJG5vZGVfc3Rh bmRieTEtPmluaXRfZnJvbV9iYWNrdXAoJG5vZGVfcHJpbWFyeSwgJGJhY2t1cF9uYW1lLAorCWhh c19zdHJlYW1pbmcgPT4gMSk7Ciskbm9kZV9zdGFuZGJ5MS0+YXBwZW5kX2NvbmYoCisJJ3Bvc3Rn cmVzcWwuY29uZicsIHFxWworCXJlY292ZXJ5X21pbl9hcHBseV9kZWxheSA9ICcke2RlbGF5fXMn CitdKTsKKyRub2RlX3N0YW5kYnkxLT5zdGFydDsKKworIyAxLgorIyBNYWtlIHN1cmUgdGhhdCBw Z193YWxfcmVwbGF5X3dhaXQoKSB3b3JrczogYWRkIG5ldyBjb250ZW50IHRvCisjIHByaW1hcnkg YW5kIG1lbW9yaXplIHByaW1hcnkncyBpbnNlcnQgTFNOLCB0aGVuIHdhaXQgZm9yIHRoYXQgTFNO IHRvIGJlCisjIHJlcGxheWVkIG9uIHN0YW5kYnkuCiskbm9kZV9wcmltYXJ5LT5zYWZlX3BzcWwo J3Bvc3RncmVzJywKKwkiSU5TRVJUIElOVE8gd2FpdF90ZXN0IFZBTFVFUyAoZ2VuZXJhdGVfc2Vy aWVzKDExLCAyMCkpIik7CitteSAkbHNuMSA9CisgICRub2RlX3ByaW1hcnktPnNhZmVfcHNxbCgn cG9zdGdyZXMnLCAiU0VMRUNUIHBnX2N1cnJlbnRfd2FsX2luc2VydF9sc24oKSIpOworbXkgJG91 dHB1dCA9ICRub2RlX3N0YW5kYnkxLT5zYWZlX3BzcWwoCisJJ3Bvc3RncmVzJywgcXFbCisJQ0FM TCBwZ193YWxfcmVwbGF5X3dhaXQoJyR7bHNuMX0nLCAxMDAwMDAwKTsKKwlTRUxFQ1QgcGdfbHNu X2NtcChwZ19sYXN0X3dhbF9yZXBsYXlfbHNuKCksICcke2xzbjF9Jzo6cGdfbHNuKTsKK10pOwor CisjIE1ha2Ugc3VyZSB0aGUgY3VycmVudCBMU04gb24gc3RhbmRieSBpcyBhdCBsZWFzdCBhcyBi aWcgYXMgdGhlIExTTiB3ZQorIyBvYnNlcnZlZCBvbiBwcmltYXJ5J3MgYmVmb3JlLgorb2soJG91 dHB1dCA+PSAwLAorCSJzdGFuZGJ5IHJlYWNoZWQgdGhlIHNhbWUgTFNOIGFzIHByaW1hcnkgYWZ0 ZXIgcGdfd2FsX3JlcGxheV93YWl0KCkiKTsKKworIyAyLgorIyBDaGVjayB0aGF0IG5ldyBkYXRh IGlzIHZpc2libGUgYWZ0ZXIgY2FsbGluZyBwZ193YWxfcmVwbGF5X3dhaXQoKQorJG5vZGVfcHJp bWFyeS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsCisJIklOU0VSVCBJTlRPIHdhaXRfdGVzdCBWQUxV RVMgKGdlbmVyYXRlX3NlcmllcygyMSwgMzApKSIpOworbXkgJGxzbjIgPQorICAkbm9kZV9wcmlt YXJ5LT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgIlNFTEVDVCBwZ19jdXJyZW50X3dhbF9pbnNlcnRf bHNuKCkiKTsKKyRvdXRwdXQgPSAkbm9kZV9zdGFuZGJ5MS0+c2FmZV9wc3FsKAorCSdwb3N0Z3Jl cycsIHFxWworCUNBTEwgcGdfd2FsX3JlcGxheV93YWl0KCcke2xzbjJ9Jyk7CisJU0VMRUNUIGNv dW50KCopIEZST00gd2FpdF90ZXN0OworXSk7CisKKyMgTWFrZSBzdXJlIHRoZSBjb3VudCgqKSBv biBzdGFuZGJ5IGFuZCBpcyB0aGUgc2FtZSBhcyBwcmltYXJ5J3MgTFNOCitvaygkb3V0cHV0IGVx IDMwLCAic3RhbmRieSByZWFjaGVkIHRoZSBzYW1lIExTTiBhcyBwcmltYXJ5Iik7CisKKyMgMy4K KyMgQ2hlY2sgdHdvIHN0YW5kYnkgd2FpdGluZyBMU04KKyMgQ3JlYXRlIGEgc3RyZWFtaW5nIHNl Y29uZCBzdGFuZGJ5IHdpdGggYSAxIHNlY29uZCBkZWxheSBmcm9tIHRoZSBiYWNrdXAKK215ICRu b2RlX3N0YW5kYnkyID0gUG9zdGdyZVNRTDo6VGVzdDo6Q2x1c3Rlci0+bmV3KCdzdGFuZGJ5Micp OworJG5vZGVfc3RhbmRieTItPmluaXRfZnJvbV9iYWNrdXAoJG5vZGVfcHJpbWFyeSwgJGJhY2t1 cF9uYW1lLAorCWhhc19zdHJlYW1pbmcgPT4gMSk7Ciskbm9kZV9zdGFuZGJ5Mi0+YXBwZW5kX2Nv bmYoCisJJ3Bvc3RncmVzcWwuY29uZicsIHFxWworCXJlY292ZXJ5X21pbl9hcHBseV9kZWxheSA9 ICcke2RlbGF5fXMnCitdKTsKKyRub2RlX3N0YW5kYnkyLT5zdGFydDsKKworIyBDaGVjayB0aGF0 IG5ldyBkYXRhIGlzIHZpc2libGUgYWZ0ZXIgY2FsbGluZyBwZ193YWxfcmVwbGF5X3dhaXQoKQor JG5vZGVfcHJpbWFyeS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsCisJIklOU0VSVCBJTlRPIHdhaXRf dGVzdCBWQUxVRVMgKGdlbmVyYXRlX3NlcmllcygzMSwgNDApKSIpOworJGxzbjIgPQorICAkbm9k ZV9wcmltYXJ5LT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgIlNFTEVDVCBwZ19jdXJyZW50X3dhbF9p bnNlcnRfbHNuKCkiKTsKKworJG91dHB1dCA9ICRub2RlX3N0YW5kYnkxLT5zYWZlX3BzcWwoCisJ J3Bvc3RncmVzJywgcXFbCisJQ0FMTCBwZ193YWxfcmVwbGF5X3dhaXQoJyR7bHNuMn0nKTsKKwlT RUxFQ1QgY291bnQoKikgRlJPTSB3YWl0X3Rlc3Q7CitdKTsKK215ICRvdXRwdXQyID0gJG5vZGVf c3RhbmRieTItPnNhZmVfcHNxbCgKKwkncG9zdGdyZXMnLCBxcVsKKwlDQUxMIHBnX3dhbF9yZXBs YXlfd2FpdCgnJHtsc24yfScpOworCVNFTEVDVCBjb3VudCgqKSBGUk9NIHdhaXRfdGVzdDsKK10p OworCisjIE1ha2Ugc3VyZSB0aGUgY291bnQoKikgb24gc3RhbmRieSBhbmQgc3RhbmRieTIgYXJl IHRoZSBzYW1lIGFzCisjIHByaW1hcnkncyBMU04KK29rKCRvdXRwdXQgZXEgNDAsICJzdGFuZGJ5 MSByZWFjaGVkIHRoZSBzYW1lIExTTiBhcyBwcmltYXJ5Iik7Citvaygkb3V0cHV0MiBlcSA0MCwg InN0YW5kYnkyIHJlYWNoZWQgdGhlIHNhbWUgTFNOIGFzIHByaW1hcnkiKTsKKworIyA0LgorIyBD cmVhdGUgYSBjYXNjYWRpbmcgc3RhbmRieSB3YWl0aW5nIExTTgorJGJhY2t1cF9uYW1lID0gJ2Nh c19iYWNrdXAnOworJG5vZGVfc3RhbmRieTEtPmJhY2t1cCgkYmFja3VwX25hbWUpOworCitteSAk Y2FzY2FkaW5nX3N0YW5kYnkgPSBQb3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVyLT5uZXcoJ2Nhc2Nh ZGluZ19zdGFuZGJ5Jyk7CiskY2FzY2FkaW5nX3N0YW5kYnktPmluaXRfZnJvbV9iYWNrdXAoCisJ JG5vZGVfc3RhbmRieTEsICRiYWNrdXBfbmFtZSwKKwloYXNfc3RyZWFtaW5nID0+IDEsCisJaGFz X3Jlc3RvcmluZyA9PiAxKTsKKworbXkgJGNhc2NhZGluZ19jb25uc3RyID0gJG5vZGVfc3RhbmRi eTEtPmNvbm5zdHI7CiskY2FzY2FkaW5nX3N0YW5kYnktPmFwcGVuZF9jb25mKAorCSdwb3N0Z3Jl c3FsLmNvbmYnLCBxcSgKKwlob3Rfc3RhbmRieV9mZWVkYmFjayA9IG9uCisJcmVjb3ZlcnlfbWlu X2FwcGx5X2RlbGF5ID0gJyR7ZGVsYXl9cycKKykpOworCiskY2FzY2FkaW5nX3N0YW5kYnktPnN0 YXJ0OworCisjIENoZWNrIHRoYXQgbmV3IGRhdGEgaXMgdmlzaWJsZSBhZnRlciBjYWxsaW5nIHBn X3dhbF9yZXBsYXlfd2FpdCgpCiskbm9kZV9wcmltYXJ5LT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywK KwkiSU5TRVJUIElOVE8gd2FpdF90ZXN0IFZBTFVFUyAoZ2VuZXJhdGVfc2VyaWVzKDQxLCA1MCkp Iik7CiskbHNuMiA9CisgICRub2RlX3ByaW1hcnktPnNhZmVfcHNxbCgncG9zdGdyZXMnLCAiU0VM RUNUIHBnX2N1cnJlbnRfd2FsX2luc2VydF9sc24oKSIpOworCiskb3V0cHV0ID0gJG5vZGVfc3Rh bmRieTEtPnNhZmVfcHNxbCgKKwkncG9zdGdyZXMnLCBxcVsKKwlDQUxMIHBnX3dhbF9yZXBsYXlf d2FpdCgnJHtsc24yfScpOworCVNFTEVDVCBjb3VudCgqKSBGUk9NIHdhaXRfdGVzdDsKK10pOwor JG91dHB1dDIgPSAkY2FzY2FkaW5nX3N0YW5kYnktPnNhZmVfcHNxbCgKKwkncG9zdGdyZXMnLCBx cVsKKwlDQUxMIHBnX3dhbF9yZXBsYXlfd2FpdCgnJHtsc24yfScpOworCVNFTEVDVCBjb3VudCgq KSBGUk9NIHdhaXRfdGVzdDsKK10pOworCisjIE1ha2Ugc3VyZSB0aGUgY291bnQoKikgb24gc3Rh bmRieSBhbmQgc3RhbmRieTIgYXJlIHRoZSBzYW1lIGFzCisjIHByaW1hcnkncyBMU04KK29rKCRv dXRwdXQgZXEgNTAsICJzdGFuZGJ5MSByZWFjaGVkIHRoZSBzYW1lIExTTiBhcyBwcmltYXJ5Iik7 Citvaygkb3V0cHV0MiBlcSA1MCwgImNhc2NhZGluZ19zdGFuZGJ5IHJlYWNoZWQgdGhlIHNhbWUg TFNOIGFzIHByaW1hcnkiKTsKKworIyA1LgorIyBDaGVjayB0aGF0IHdhaXRpbmcgZm9yIHVucmVh Y2hhYmxlIExTTiB0cmlnZ2VycyB0aGUgdGltZW91dC4gIFRoZQorIyB1bnJlYWNoYWJsZSBMU04g bXVzdCBiZSB3ZWxsIGluIGFkdmFuY2UuICBTbyBXQUwgcmVjb3JkcyBpc3N1ZWQgYnkKKyMgdGhl IGNvbmN1cnJlbnQgYXV0b3ZhY3V1bSBjb3VsZCBub3QgYWZmZWN0IHRoYXQuCitteSAkbHNuMyA9 CisgICRub2RlX3ByaW1hcnktPnNhZmVfcHNxbCgncG9zdGdyZXMnLAorCSJTRUxFQ1QgcGdfY3Vy cmVudF93YWxfaW5zZXJ0X2xzbigpICsgMTAwMDAwMDAwMDAiKTsKK215ICRzdGRlcnI7Ciskbm9k ZV9zdGFuZGJ5MS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsCisJIkNBTEwgcGdfd2FsX3JlcGxheV93 YWl0KCcke2xzbjJ9JywgMTApOyIpOworJG5vZGVfc3RhbmRieTEtPnBzcWwoCisJJ3Bvc3RncmVz JywKKwkiQ0FMTCBwZ193YWxfcmVwbGF5X3dhaXQoJyR7bHNuM30nLCAxMDAwKTsiLAorCXN0ZGVy ciA9PiBcJHN0ZGVycik7CitvayggJHN0ZGVyciA9fiAvdGltZWQgb3V0IHdoaWxlIHdhaXRpbmcg Zm9yIHRhcmdldCBMU04vLAorCSJnZXQgdGltZW91dCBvbiB3YWl0aW5nIGZvciB1bnJlYWNoYWJs ZSBMU04iKTsKKworCisjIDYuCisjIEFsc28sIGNoZWNrIHRoZSBzY2VuYXJpbyBvZiBtdWx0aXBs ZSBMU04gd2FpdGVycy4gIFdlIG1ha2UgNSBiYWNrZ3JvdW5kIHBzcWwKKyMgc2Vzc2lvbnMgZWFj aCB3YWl0aW5nIGZvciBhIGNvcnJlc3BvbmRpbmcgaW5zZXJ0aW9uLiAgV2hlbiB3YWl0aW5nIGlz CisjIGZpbmlzaGVkLCBzdG9yZWQgcHJvY2VkdXJlcyBsb2dzIGlmIHRoZXJlIGFyZSB2aXNpYmxl IGFzIG1hbnkgcm93cyBhcworIyBzaG91bGQgYmUuCiskbm9kZV9wcmltYXJ5LT5zYWZlX3BzcWwo CisJJ3Bvc3RncmVzJywgcXFbCitDUkVBVEUgRlVOQ1RJT04gbG9nX2NvdW50KGkgaW50KSBSRVRV Uk5TIHZvaWQgQVMgXCRcJAorICBERUNMQVJFCisgICAgY291bnQgaW50OworICBCRUdJTgorICAg IFNFTEVDVCBjb3VudCgqKSBGUk9NIHdhaXRfdGVzdCBJTlRPIGNvdW50OworICAgIElGIGNvdW50 ID49IDUxICsgaSBUSEVOCisgICAgICBSQUlTRSBMT0cgJ2NvdW50ICUnLCBpOworICAgIEVORCBJ RjsKKyAgRU5ECitcJFwkCitMQU5HVUFHRSBwbHBnc3FsOworXSk7Ciskbm9kZV9zdGFuZGJ5MS0+ c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJTRUxFQ1QgcGdfd2FsX3JlcGxheV9wYXVzZSgpOyIpOwor Zm9yIChteSAkaSA9IDA7ICRpIDwgNTsgJGkrKykKK3sKKwlwcmludCgkaSk7CisJJG5vZGVfcHJp bWFyeS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsCisJCSJJTlNFUlQgSU5UTyB3YWl0X3Rlc3QgVkFM VUVTICgke2l9KTsiKTsKKwlteSAkbHNuID0KKwkgICRub2RlX3ByaW1hcnktPnNhZmVfcHNxbCgn cG9zdGdyZXMnLAorCQkiU0VMRUNUIHBnX2N1cnJlbnRfd2FsX2luc2VydF9sc24oKSIpOworCW15 ICRwc3FsX3Nlc3Npb24gPSAkbm9kZV9zdGFuZGJ5MS0+YmFja2dyb3VuZF9wc3FsKCdwb3N0Z3Jl cycpOworCSRwc3FsX3Nlc3Npb24tPnF1ZXJ5X3VudGlsKAorCQlxci9zdGFydC8sIHFxWworCQlc XGVjaG8gc3RhcnQKKwkJQ0FMTCBwZ193YWxfcmVwbGF5X3dhaXQoJyR7bHNufScpOworCQlTRUxF Q1QgbG9nX2NvdW50KCR7aX0pOworCV0pOworfQorbXkgJGxvZ19vZmZzZXQgPSAtcyAkbm9kZV9z dGFuZGJ5MS0+bG9nZmlsZTsKKyRub2RlX3N0YW5kYnkxLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywg IlNFTEVDVCBwZ193YWxfcmVwbGF5X3Jlc3VtZSgpOyIpOworZm9yIChteSAkaSA9IDA7ICRpIDwg NTsgJGkrKykKK3sKKwkkbm9kZV9zdGFuZGJ5MS0+d2FpdF9mb3JfbG9nKCJjb3VudCAke2l9Iiwg JGxvZ19vZmZzZXQpOworfQorCisKKyMgNy4KKyMgQ2hlY2sgdGhhdCB0aGUgc3RhbmRieSBwcm9t b3Rpb24gdGVybWluYXRlcyB0aGUgd2FpdCBvbiBMU04uICBTdGFydAorIyB3YWl0aW5nIGZvciB1 bnJlYWNoYWJsZSBMU04gdGhlbiBwcm9tb3RlLiAgQ2hlY2sgdGhlIGxvZyBmb3IgdGhlIHJlbGV2 YW50CisjIGVycm9yIG1lc3NhZ2UuCitteSAkcHNxbF9zZXNzaW9uID0gJG5vZGVfc3RhbmRieTEt PmJhY2tncm91bmRfcHNxbCgncG9zdGdyZXMnKTsKKyRwc3FsX3Nlc3Npb24tPnF1ZXJ5X3VudGls KAorCXFyL3N0YXJ0LywgcXFbCisJXFxlY2hvIHN0YXJ0CisJQ0FMTCBwZ193YWxfcmVwbGF5X3dh aXQoJyR7bHNuM30nKTsKK10pOworCiskbG9nX29mZnNldCA9IC1zICRub2RlX3N0YW5kYnkxLT5s b2dmaWxlOworJG5vZGVfc3RhbmRieTEtPnByb21vdGU7Ciskbm9kZV9zdGFuZGJ5MS0+d2FpdF9m b3JfbG9nKCdyZWNvdmVyeSBpcyBub3QgaW4gcHJvZ3Jlc3MnLCAkbG9nX29mZnNldCk7CisKKyRu b2RlX3N0YW5kYnkxLT5zdG9wOworJG5vZGVfc3RhbmRieTItPnN0b3A7Ciskbm9kZV9wcmltYXJ5 LT5zdG9wOworZG9uZV90ZXN0aW5nKCk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWNvdmVyeS90 LzA0NF93YWxfcmVwbGF5X3dhaXRfaW5qZWN0aW9uX3Rlc3QucGwgYi9zcmMvdGVzdC9yZWNvdmVy eS90LzA0NF93YWxfcmVwbGF5X3dhaXRfaW5qZWN0aW9uX3Rlc3QucGwKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMDAwMC4uNzJkNzZkZjIwYgotLS0gL2Rldi9udWxsCisrKyBiL3Ny Yy90ZXN0L3JlY292ZXJ5L3QvMDQ0X3dhbF9yZXBsYXlfd2FpdF9pbmplY3Rpb25fdGVzdC5wbApA QCAtMCwwICsxLDg2IEBACisjIENvcHlyaWdodCAoYykgMjAyNCwgUG9zdGdyZVNRTCBHbG9iYWwg RGV2ZWxvcG1lbnQgR3JvdXAKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5ncyBGQVRBTCA9PiAn YWxsJzsKK3VzZSBQb3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVyOwordXNlIFBvc3RncmVTUUw6OlRl c3Q6OlV0aWxzOwordXNlIFRpbWU6OkhpUmVzIHF3KHVzbGVlcCk7Cit1c2UgVGVzdDo6TW9yZTsK KworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMg VGVzdCByYWNlIGNvbmRpdGlvbiB3aGVuIHRpbWVvdXQgcmVhY2hlZCBhbmQgbmV3IHdhbCByZXBs YXllZCBvbiBzdGFuZGJ5LgorIworIyBUaGlzIHRlc3QgcmVsaWVzIG9uIGFuIGluamVjdGlvbiBw b2ludCB0aGF0IGNhdXNlIHRvIHdhaXQgYmVmb3JlIERlbGV0ZQorIyBmcm9tIGhlYXAgYW5kIHdh aXQgd2hlbiBuZXcgbHNuIGFkZGVkIHRvIGhlYXAuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpZiAoJEVOVntlbmFibGVfaW5qZWN0aW9uX3Bv aW50c30gbmUgJ3llcycpCit7CisJcGxhbiBza2lwX2FsbCA9PiAnSW5qZWN0aW9uIHBvaW50cyBu b3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYnVpbGQnOworfQorCisjIEluaXRpYWxpemUgcHJpbWFyeSBu b2RlLgorbXkgJG5vZGVfcHJpbWFyeSA9IFBvc3RncmVTUUw6OlRlc3Q6OkNsdXN0ZXItPm5ldygn bWFzdGVyJyk7Ciskbm9kZV9wcmltYXJ5LT5pbml0KGFsbG93c19zdHJlYW1pbmcgPT4gMSk7Cisk bm9kZV9wcmltYXJ5LT5hcHBlbmRfY29uZigKKwkncG9zdGdyZXNxbC5jb25mJywgcVsKK3Jlc3Rh cnRfYWZ0ZXJfY3Jhc2ggPSBvbgorXSk7Ciskbm9kZV9wcmltYXJ5LT5zdGFydDsKKworbXkgJGJh Y2t1cF9uYW1lID0gJ215X2JhY2t1cCc7Ciskbm9kZV9wcmltYXJ5LT5iYWNrdXAoJGJhY2t1cF9u YW1lKTsKKworIyBTZXR1cCBmaXJzdCBzdGFuZGJ5LgorbXkgJG5vZGVfc3RhbmRieSA9IFBvc3Rn cmVTUUw6OlRlc3Q6OkNsdXN0ZXItPm5ldygnc3RhbmRieTEnKTsKKyRub2RlX3N0YW5kYnktPmlu aXRfZnJvbV9iYWNrdXAoJG5vZGVfcHJpbWFyeSwgJGJhY2t1cF9uYW1lLAorCWhhc19zdHJlYW1p bmcgPT4gMSk7Ciskbm9kZV9zdGFuZGJ5LT5zdGFydDsKKworIyBDcmVhdGUgdGFibGUKKyRub2Rl X3ByaW1hcnktPnNhZmVfcHNxbCgncG9zdGdyZXMnLCAnQ1JFQVRFIFRBQkxFIHByaW1fdGFiIChh IGludCk7Jyk7CisKKyMgQ3JlYXRlIGV4dGVudGlvbiBpbmplY3Rpb24gcG9pbnQKKyRub2RlX3By aW1hcnktPnNhZmVfcHNxbCgncG9zdGdyZXMnLCAnQ1JFQVRFIEVYVEVOU0lPTiBpbmplY3Rpb25f cG9pbnRzOycpOworIyBXYWl0IHVudGlsIHRoZSBleHRlbnNpb24gaGFzIGJlZW4gY3JlYXRlZCBv biB0aGUgc3RhbmRieQorJG5vZGVfcHJpbWFyeS0+d2FpdF9mb3JfcmVwbGF5X2NhdGNodXAoJG5v ZGVfc3RhbmRieSk7CisKKyMgQXR0YWNoIHRoZSBwb2ludCBpbiBiZWZvcmUgZGVsZXRlTFNOV2Fp dGVyLgorJG5vZGVfc3RhbmRieS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsCisJIlNFTEVDVCBpbmpl Y3Rpb25fcG9pbnRzX2F0dGFjaCgncGctd2FsLXJlcGxheS1zZXQtbGF0Y2gnLCAnd2FpdCcpOyIp OworCisjIEdldCBsb2cgb2Zmc2V0CitteSAkbG9nc3RhcnQgPSAtcyAkbm9kZV9zdGFuZGJ5LT5s b2dmaWxlOworCisjIEdldCBjdXJyZW50IGxzbiBmcm9tIHByaW1hcnkKK215ICRsc25fcHIgPSAk bm9kZV9wcmltYXJ5LT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywKKwkiU0VMRUNUIHBnX2N1cnJlbnRf d2FsX2luc2VydF9sc24oKSArIDEwOyIpOworCiskbm9kZV9wcmltYXJ5LT5zYWZlX3BzcWwoJ3Bv c3RncmVzJywgJ0lOU0VSVCBJTlRPIHByaW1fdGFiIFZBTFVFUyAoMSk7Jyk7CisjIENBTEwgcGdf d2FsX3JlcGxheV93YWl0IHdpdGggdGltZW91dCBvbiBzdGFuZGJ5CitteSAkcHNxbF9zZXNzaW9u MSA9ICRub2RlX3N0YW5kYnktPmJhY2tncm91bmRfcHNxbCgncG9zdGdyZXMnKTsKKyRwc3FsX3Nl c3Npb24xLT5xdWVyeV91bnRpbCgKKwlxci9zdGFydC8sIHFxWworCUNBTEwgcGdfd2FsX3JlcGxh eV93YWl0KCcke2xzbl9wcn0nLDEwMDAwKTsKK10pOworCisjIEdlbmVyYXRlIHNvbWUgV0FMCisk bm9kZV9wcmltYXJ5LT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgJ0lOU0VSVCBJTlRPIHByaW1fdGFi IFZBTFVFUyAoMSk7Jyk7CisjJG5vZGVfcHJpbWFyeS0+d2FpdF9mb3JfcmVwbGF5X2NhdGNodXAo JG5vZGVfc3RhbmRieSk7CisKKyMgV2FpdCB0aWxsIHBnLXdhbC1yZXBsYXktc2V0LWxhdGNoIGFw cGVyaWVkIGluIHBnX3N0YXRfYWN0aXZpdHkKKyRub2RlX3N0YW5kYnktPndhaXRfZm9yX2V2ZW50 cygnY2xpZW50IGJhY2tlbmQnLCAncGctd2FsLXJlcGxheS1zZXQtbGF0Y2gnKTsKKyRub2RlX3N0 YW5kYnktPnNhZmVfcHNxbCgncG9zdGdyZXMnLAorCSJTRUxFQ1QgY291bnQoKikgPiAwIEZST00g cGdfc3RhdF9hY3Rpdml0eSBXSEVSRQorCXdhaXRfZXZlbnRfdHlwZSA9ICdFeHRlbnNpb24nIEFO RCB3YWl0X2V2ZW50ID0gJ3BnLXdhbC1yZXBsYXktc2V0LWxhdGNoJyIpOworCisjIFdha2UgdXAg dG8gY2hlY2sgdGhlIG1lc3NhZ2UKKyRub2RlX3N0YW5kYnktPnNhZmVfcHNxbCgncG9zdGdyZXMn LAorCSJTRUxFQ1QgaW5qZWN0aW9uX3BvaW50c193YWtldXAoJ3BnLXdhbC1yZXBsYXktc2V0LWxh dGNoJyk7Iik7CisKKyMgQ2hlY2sgdGhlIGxvZworb2soICRub2RlX3N0YW5kYnktPmxvZ19jb250 YWlucygKKwkJInRpbWVkIG91dCB3aGlsZSB3YWl0aW5nIGZvciB0YXJnZXQgTFNOIiwgJGxvZ3N0 YXJ0KSwKKwkicGdfd2FsX3JlcGxheV93YWl0IHRpbWVvdXQiKTsKKworZG9uZV90ZXN0aW5nKCk7 CmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdCBiL3NyYy90b29s cy9wZ2luZGVudC90eXBlZGVmcy5saXN0CmluZGV4IDkzMjBlNGQ4MDguLjE5NzliMmY4ZjUgMTAw NjQ0Ci0tLSBhL3NyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0CisrKyBiL3NyYy90b29s cy9wZ2luZGVudC90eXBlZGVmcy5saXN0CkBAIC0zMTA3LDYgKzMxMDcsOCBAQCBXYWl0RXZlbnRJ TwogV2FpdEV2ZW50SVBDCiBXYWl0RXZlbnRTZXQKIFdhaXRFdmVudFRpbWVvdXQKK1dhaXRMU05Q cm9jSW5mbworV2FpdExTTlN0YXRlCiBXYWl0UE1SZXN1bHQKIFdhbENsb3NlTWV0aG9kCiBXYWxD b21wcmVzc2lvbgotLSAKMi4zNC4xCgo= --=_f422e19c01bfc383c1855c69eec9cc41--