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.96) (envelope-from ) id 1w0Xpx-001ztk-1x for pgsql-hackers@arkaria.postgresql.org; Thu, 12 Mar 2026 04:39:54 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w0Xpv-00DLRR-2k for pgsql-hackers@arkaria.postgresql.org; Thu, 12 Mar 2026 04:39:52 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w0Xpv-00DLRJ-0K for pgsql-hackers@lists.postgresql.org; Thu, 12 Mar 2026 04:39:52 +0000 Received: from mail-ed1-x533.google.com ([2a00:1450:4864:20::533]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w0Xps-00000001iZk-27Fc for pgsql-hackers@lists.postgresql.org; Thu, 12 Mar 2026 04:39:50 +0000 Received: by mail-ed1-x533.google.com with SMTP id 4fb4d7f45d1cf-660a293515fso943042a12.1 for ; Wed, 11 Mar 2026 21:39:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1773290387; cv=none; d=google.com; s=arc-20240605; b=bL7CctUPTZJW09x6aIG6M7fOgqJlXp00OoEvmjn21J/Jdfq6u7r9LPXkpu/os6YO06 X4nm6jRQU0LcEcnmPjwfY7ghW4GlLFxm+7FFkDUllWL4/O5NQARv/6f2c+aaqU7CjTz0 TC0Kyy2LqSL32PNQBNo3B6IxyucEVNYgwWEWTZ36FZbi/G8QypBREQ9NzUhmH23l+LRv RtHY5STE7PxwIPB0GnPyw+QlMHPpmIuRewzSsJmJvQLy6KPXqCnOWU2UW1m0pK+MSOJ1 U52gFAKzoQAhWKK1u4qvDqwgKyAgGkNcolGyOK0Cnw98ZVKrcmIV5HUaKdB0p0uiJ74j ZqqQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=EeQTD1sTZn7en5Lbmx7SsJyoKIVBQgrzt+q6rn4G0o4=; fh=vrsDoyr51YCmjcwtUw4f3tZ4KdKvzhZlGcOJLQHzn6w=; b=P455idDjCfJhpbzD0y2OIL0Qyr8EIXnpVbY9nTQwbfOhxkbcOBYm1qKfgim1mLuWEj Lf9IIX499L/J7ahgMj6Y9x5blyqSJpNkaLoNLIcxv5faMxD7pABsTc6DfynW7urCP8x2 In+t1pu+1345+ENbJTmHu0J+NrvgCTL/H9f57D4py2UTEi3vDrm831H2fDWHi+lIqDbd OUfmwkqgO+JsZMS3Jj2769UBMivCMXjZ7QGDZqXVBwnOWXSW4MWrPoBkTwqiGIFdvpgT pqiCVd+nIxRWTY644jmwi3x6Y+wz5ckq7u0AVyBuk/JJ2FGudC9tjOyT+DeyyxaE4amF FLDQ==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773290387; x=1773895187; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=EeQTD1sTZn7en5Lbmx7SsJyoKIVBQgrzt+q6rn4G0o4=; b=jWQfNim2jcla+igflMdGvHjoJsDPJBjaXUm+vDbtFkvUMYTfeybO0BT0R8YefwFd05 xqoauBIJVGC3SgrB4ZnjnemgLcLEFNFH1rl9DL3/oEb+gjcFUxo1XwIznfqX8GpsZ3Rn xSeIM4A70dJIvRFpnFuPnwTh0rQ/25SzzUWa4O6IkJUzSmFH2xvQTRXYtmLZchxNlq8r ZAz1hqofywXxdu0aOL10xJBLd7EFnQNH6h6fljXGOgitBqV5qZOmu1RLYYXeXpHRkLSk +TlqKV45LQHepxkYwfY+c1XfJzHLPpShNnwBP08vGODU248TfIfEUqg0I6Mjr/DqmEZR wHvg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773290387; x=1773895187; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=EeQTD1sTZn7en5Lbmx7SsJyoKIVBQgrzt+q6rn4G0o4=; b=N667Y5iUdFcHAFz1Owv5LFJqhaYOgT6tWx6+sufPmNRcPH8l0aRq9igCHUtYma0GCP Ih5focMql6boeYYCXtOw4AEZghciX4ozvvaquPWQDsJRL5arcWy9GgIX6/tOUvqOebTW 6Wf112jwwUHndqmHOqeNl0RpgPM+/96oDE7pNFxNJUfpbCSKp+0e5UMI5mUX0AmTg6Hr P31gtagSupua/V1Nsrxx1UkyNb5PJh3VttrrFBKD0m/kg80OysuhsuvA/wZLDQ3wUpWC WE8t0Cejna6cJWsIXC7zJQk2/N14sCprk6xw3MqDEG7pP+yLU+lo5qgYaEy6Lc4H9bbb Wlgg== X-Forwarded-Encrypted: i=1; AJvYcCXbie9x7j3bU4Y0AhbsTxSTnlEm3UVCV9z+M3HF+slqTE0MX5EB2fdGm3ZGe6TIJhS86F1SAKAgG19e37LU@lists.postgresql.org X-Gm-Message-State: AOJu0YwmvZn/llsr/srQifat/YawE3Tsh032F6104tgzaiABVjwh756u 9P2Y2nAN/LcF48LAY2EFgDtYn3tqgRDS79O0v/p3E14FVezUjUM3RuNalkdDwiyvaacJTsrntb3 ecZ+bYcEsl63GFk/YOGlOPgEgoozB7/M= X-Gm-Gg: ATEYQzy/s/Lwj8heLQFlrfLAtl4XDq7rX9CwXddOFSf8BSCDNx+l7Kuid2ZgxZZMfuM 5VBTbcddkgfOK87oVKmul5bN4Ob6FNrjM1ifXjqiouVaWAIvQ2awVzmp6T4q2sgHE54oj24q/2y SpD2yuQ9BE75Q16TFOGSi4Jsu2Vo1FQjhtIa2MwoiIHcy2ySlQ0k6745nIhR19JRH01KSv2o0br gFjhZM9g/7IvRMECCRE8JofH76KwYgB5DXg7AGEfGyY5836hGV68dzELndBpJ//hMAKv9O0sHKx udlB8SnxiZHK9LxUqXjhn4Jp2ANiTlAjZk7Y+f+xT3fA/i7mAPRWpvVFxPq/6PAcPWbabEE+cVp NCIt6bs7I X-Received: by 2002:a05:6402:1453:b0:662:dc98:7cc8 with SMTP id 4fb4d7f45d1cf-66319ddeef7mr2556463a12.18.1773290386615; Wed, 11 Mar 2026 21:39:46 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Xuneng Zhou Date: Thu, 12 Mar 2026 12:39:32 +0800 X-Gm-Features: AaiRm51sCmkGlGAzZ5c7fpTPN1JsXiT3yyQCcxeQTuuop_DSq7ABZAbpTCpqwf4 Message-ID: Subject: Re: Streamify more code paths To: Michael Paquier Cc: Andres Freund , pgsql-hackers , Nazir Bilal Yavuz Content-Type: multipart/mixed; boundary="0000000000009432a8064ccc5779" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000009432a8064ccc5779 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Thu, Mar 12, 2026 at 11:42=E2=80=AFAM Michael Paquier wrote: > > On Thu, Mar 12, 2026 at 06:33:08AM +0900, Michael Paquier wrote: > > Thanks for doing that. On my side, I am going to look at the gin and > > hash vacuum paths first with more testing as these don't use a custom > > callback. I don't think that I am going to need a lot of convincing, > > but I'd rather produce some numbers myself because doing something. > > I'll tweak a mounting point with the delay trick, as well. > > While debug_io_direct has been helping a bit, the trick for the delay > to throttle the IO activity has helped much more with my runtime > numbers. I have mounted a separate partition with a delay of 5ms, > disabled checkums (this part did not make a real difference), and > evicted shared buffers for relation and indexes before the VACUUM. > > Then I got better numbers. Here is an extract: > - worker=3D3: > gin_vacuum (100k tuples) base=3D 1448.2ms patch=3D 572.5ms 2.53x > ( 60.5%) (reads=3D175=E2=86=92104, io_time=3D1382.70=E2=86=92506.64ms) > gin_vacuum (300k tuples) base=3D 3728.0ms patch=3D 1332.0ms 2.80x > ( 64.3%) (reads=3D486=E2=86=92293, io_time=3D3669.89=E2=86=921266.27ms) > bloom_vacuum (100k tuples) base=3D 21826.8ms patch=3D 17220.3ms 1.27x > ( 21.1%) (reads=3D485=E2=86=92117, io_time=3D4773.33=E2=86=92270.56ms) > bloom_vacuum (300k tuples) base=3D 67054.0ms patch=3D 53164.7ms 1.26x > ( 20.7%) (reads=3D1431.5=E2=86=92327.5, io_time=3D13880.2=E2=86=92381.39= 5ms) > - io_uring: > gin_vacuum (100k tuples) base=3D 1240.3ms patch=3D 360.5ms 3.44x > ( 70.9%) (reads=3D175=E2=86=92104, io_time=3D1175.35=E2=86=92299.75ms) > gin_vacuum (300k tuples) base=3D 2829.9ms patch=3D 642.0ms 4.41x > ( 77.3%) (reads=3D465.5=E2=86=92293, io_time=3D2768.46=E2=86=92579.04ms) > bloom_vacuum (100k tuples) base=3D 22121.7ms patch=3D 17532.3ms 1.26x > ( 20.7%) (reads=3D485=E2=86=92117, io_time=3D4850.46=E2=86=92285.28ms) > bloom_vacuum (300k tuples) base=3D 67058.0ms patch=3D 53118.0ms 1.26x > ( 20.8%) (reads=3D1431.5=E2=86=92327.5, io_time=3D13870.9=E2=86=92305.44= ms) > > The higher the number of tuples, the better the performance for each > individual operation, but the tests take a much longer time (tens of > seconds vs tens of minutes). For GIN, the numbers can be quite good > once these reads are pushed. For bloom, the runtime is improved, and > the IO numbers are much better. > > At the end, I have applied these two parts. Remains now the hash > vacuum and the two parts for pgstattuple. > -- > Michael Thanks for running the benchmarks and pushing! Here're the results of my test with debug_io_direct and delay : -- io_uring, medium size bloom_vacuum_medium base=3D 8355.2ms patch=3D 715.0ms 11.68x ( 91.4%) (reads=3D4732=E2=86=921056, io_time=3D7699.47=E2=86=9286.52ms) pgstattuple_medium base=3D 4012.8ms patch=3D 213.7ms 18.78x ( 94.7%) (reads=3D2006=E2=86=922006, io_time=3D4001.66=E2=86=92200.24ms) pgstatindex_medium base=3D 5490.6ms patch=3D 37.9ms 144.88x ( 99.3%) (reads=3D2745=E2=86=92173, io_time=3D5481.54=E2=86=927.82ms) hash_vacuum_medium base=3D 34483.4ms patch=3D 2703.5ms 12.75x ( 92.2%) (reads=3D19166=E2=86=923901, io_time=3D31948.33=E2=86=92308.05ms) wal_logging_medium base=3D 7778.6ms patch=3D 7814.5ms 1.00x ( -0.5%) (reads=3D2857=E2=86=922845, io_time=3D11.84=E2=86=9211.45ms) -- worker, medium size bloom_vacuum_medium base=3D 8376.2ms patch=3D 747.7ms 11.20x ( 91.1%) (reads=3D4732=E2=86=921056, io_time=3D7688.91=E2=86=9265.49ms) pgstattuple_medium base=3D 4012.7ms patch=3D 339.0ms 11.84x ( 91.6%) (reads=3D2006=E2=86=922006, io_time=3D4002.23=E2=86=9249.99ms) pgstatindex_medium base=3D 5490.3ms patch=3D 38.3ms 143.23x ( 99.3%) (reads=3D2745=E2=86=92173, io_time=3D5480.60=E2=86=9216.24ms) hash_vacuum_medium base=3D 34638.4ms patch=3D 2940.2ms 11.78x ( 91.5%) (reads=3D19166=E2=86=923901, io_time=3D31881.61=E2=86=92242.01ms) wal_logging_medium base=3D 7440.1ms patch=3D 7434.0ms 1.00x ( 0.1%) (reads=3D2861=E2=86=922825, io_time=3D10.62=E2=86=9210.71ms) -- Setting read delay only sudo dmsetup reload "$DM_DELAY_DEV" --table "0 $size delay $dev 0 $ms $dev = 0 0" Setting dm_delay on delayed to 2ms read / 0ms write After setting the write delay to 0ms, I can observe more pronounced speedups overall, since vacuum operation is write-intensive =E2=80=94 delay= ing writes might dominate the runtime and mask the read-path improvement we're measuring. It also speeds up the runtime of the test. -- wal_logging The wal_logging patch does not seem to benefit from streamification in this configuration either. -- Delay settup For anyone wanting to reproduce the results with a simulated-latency device, here is the setup I used. 1. Create a 50GB file-backed block device (enough for PG data + indexes) sudo dd if=3D/dev/zero of=3D/srv/delay_disk.img bs=3D1M count=3D50000 statu= s=3Dprogress sudo losetup /dev/loop0 /srv/delay_disk.img 2. Create the dm_delay device with 2ms delay sudo dmsetup create delayed --table "0 $(sudo blockdev --getsz /dev/loop0) delay /dev/loop0 0 2" 3. Format and mount it sudo mkfs.ext4 /dev/mapper/delayed sudo mkdir -p /srv/pg_delayed sudo mount /dev/mapper/delayed /srv/pg_delayed sudo chown $(whoami) /srv/pg_delayed 4. Run benchmark with WORKROOT pointing to the delayed device WORKROOT=3D/srv/pg_delayed SIZES=3Dmedium REPS=3D3 \ ./run_streaming_benchmark.sh --baseline --io-method io_uring \ --test gin_vacuum --direct-io --io-delay 2 \ the targeted patch -- Best, Xuneng --0000000000009432a8064ccc5779 Content-Type: application/x-patch; name="v6-0003-Streamify-hash-index-VACUUM-primary-bucket-page-r.patch" Content-Disposition: attachment; filename="v6-0003-Streamify-hash-index-VACUUM-primary-bucket-page-r.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mmmxe2th1 RnJvbSAyYWRmY2Q2YzE2Zjk0ZTdkYWRiMzhmZmM2Y2ZlZDM0NTdiMzYzYmY1IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBhbHRlcmVnbzY1NSA8ODI0NjYyNTI2QHFxLmNvbT4KRGF0ZTog U3VuLCAyOCBEZWMgMjAyNSAxODoyOToyOCArMDgwMApTdWJqZWN0OiBbUEFUQ0ggdjYgMy81XSBT dHJlYW1pZnkgaGFzaCBpbmRleCBWQUNVVU0gcHJpbWFyeSBidWNrZXQgcGFnZSByZWFkcwoKUmVm YWN0b3IgaGFzaGJ1bGtkZWxldGUoKSB0byB1c2UgdGhlIFJlYWQgU3RyZWFtICBmb3IgcHJpbWFy eSBidWNrZXQKcGFnZXMuIFRoaXMgZW5hYmxlcyBwcmVmZXRjaGluZyBvZiB1cGNvbWluZyBidWNr ZXRzIHdoaWxlIHRoZSBjdXJyZW50Cm9uZSBpcyBiZWluZyBwcm9jZXNzZWQsIGltcHJvdmluZyBJ L08gZWZmaWNpZW5jeSBkdXJpbmcgaGFzaCBpbmRleAp2YWN1dW0gb3BlcmF0aW9ucy4KLS0tCiBz cmMvYmFja2VuZC9hY2Nlc3MvaGFzaC9oYXNoLmMgICB8IDgwICsrKysrKysrKysrKysrKysrKysr KysrKysrKysrKy0tCiBzcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdCB8ICAxICsKIDIg ZmlsZXMgY2hhbmdlZCwgNzggaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKCmRpZmYgLS1n aXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvaGFzaC9oYXNoLmMgYi9zcmMvYmFja2VuZC9hY2Nlc3Mv aGFzaC9oYXNoLmMKaW5kZXggZTg4ZGRiMzJhMDUuLjZkZjVlN2NjYmQxIDEwMDY0NAotLS0gYS9z cmMvYmFja2VuZC9hY2Nlc3MvaGFzaC9oYXNoLmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL2hh c2gvaGFzaC5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSAibm9kZXMvZXhlY25vZGVzLmgi CiAjaW5jbHVkZSAib3B0aW1pemVyL3BsYW5jYXQuaCIKICNpbmNsdWRlICJwZ3N0YXQuaCIKKyNp bmNsdWRlICJzdG9yYWdlL3JlYWRfc3RyZWFtLmgiCiAjaW5jbHVkZSAidXRpbHMvZm1ncnByb3Rv cy5oIgogI2luY2x1ZGUgInV0aWxzL2luZGV4X3NlbGZ1bmNzLmgiCiAjaW5jbHVkZSAidXRpbHMv cmVsLmgiCkBAIC00MiwxMiArNDMsMjMgQEAgdHlwZWRlZiBzdHJ1Y3QKIAlSZWxhdGlvbgloZWFw UmVsOwkJLyogaGVhcCByZWxhdGlvbiBkZXNjcmlwdG9yICovCiB9IEhhc2hCdWlsZFN0YXRlOwog CisvKiBXb3JraW5nIHN0YXRlIGZvciBzdHJlYW1pbmcgcmVhZHMgaW4gaGFzaGJ1bGtkZWxldGUg Ki8KK3R5cGVkZWYgc3RydWN0Cit7CisJSGFzaE1ldGFQYWdlIG1ldGFwOwkJCS8qIGNhY2hlZCBt ZXRhcGFnZSBmb3IgQlVDS0VUX1RPX0JMS05PICovCisJQnVja2V0CQluZXh0X2J1Y2tldDsJLyog bmV4dCBidWNrZXQgdG8gcHJlZmV0Y2ggKi8KKwlCdWNrZXQJCW1heF9idWNrZXQ7CQkvKiBzdG9w IHdoZW4gbmV4dF9idWNrZXQgPiBtYXhfYnVja2V0ICovCit9IEhhc2hCdWxrRGVsZXRlU3RyZWFt UHJpdmF0ZTsKKwogc3RhdGljIHZvaWQgaGFzaGJ1aWxkQ2FsbGJhY2soUmVsYXRpb24gaW5kZXgs CiAJCQkJCQkJICBJdGVtUG9pbnRlciB0aWQsCiAJCQkJCQkJICBEYXR1bSAqdmFsdWVzLAogCQkJ CQkJCSAgYm9vbCAqaXNudWxsLAogCQkJCQkJCSAgYm9vbCB0dXBsZUlzQWxpdmUsCiAJCQkJCQkJ ICB2b2lkICpzdGF0ZSk7CitzdGF0aWMgQmxvY2tOdW1iZXIgaGFzaF9idWxrZGVsZXRlX3JlYWRf c3RyZWFtX2NiKFJlYWRTdHJlYW0gKnN0cmVhbSwKKwkJCQkJCQkJCQkJCSAgdm9pZCAqY2FsbGJh Y2tfcHJpdmF0ZV9kYXRhLAorCQkJCQkJCQkJCQkJICB2b2lkICpwZXJfYnVmZmVyX2RhdGEpOwog CiAKIC8qCkBAIC00NTEsNiArNDYzLDI3IEBAIGhhc2hlbmRzY2FuKEluZGV4U2NhbkRlc2Mgc2Nh bikKIAlzY2FuLT5vcGFxdWUgPSBOVUxMOwogfQogCisvKgorICogUmVhZCBzdHJlYW0gY2FsbGJh Y2sgZm9yIGhhc2hidWxrZGVsZXRlLgorICoKKyAqIFJldHVybnMgdGhlIGJsb2NrIG51bWJlciBv ZiB0aGUgcHJpbWFyeSBwYWdlIGZvciB0aGUgbmV4dCBidWNrZXQgdG8KKyAqIHZhY3V1bSwgdXNp bmcgdGhlIEJVQ0tFVF9UT19CTEtOTyBtYXBwaW5nIGZyb20gdGhlIGNhY2hlZCBtZXRhcGFnZS4K KyAqLworc3RhdGljIEJsb2NrTnVtYmVyCitoYXNoX2J1bGtkZWxldGVfcmVhZF9zdHJlYW1fY2Io UmVhZFN0cmVhbSAqc3RyZWFtLAorCQkJCQkJCSAgIHZvaWQgKmNhbGxiYWNrX3ByaXZhdGVfZGF0 YSwKKwkJCQkJCQkgICB2b2lkICpwZXJfYnVmZmVyX2RhdGEpCit7CisJSGFzaEJ1bGtEZWxldGVT dHJlYW1Qcml2YXRlICpwID0gY2FsbGJhY2tfcHJpdmF0ZV9kYXRhOworCUJ1Y2tldAkJYnVja2V0 OworCisJaWYgKHAtPm5leHRfYnVja2V0ID4gcC0+bWF4X2J1Y2tldCkKKwkJcmV0dXJuIEludmFs aWRCbG9ja051bWJlcjsKKworCWJ1Y2tldCA9IHAtPm5leHRfYnVja2V0Kys7CisJcmV0dXJuIEJV Q0tFVF9UT19CTEtOTyhwLT5tZXRhcCwgYnVja2V0KTsKK30KKwogLyoKICAqIEJ1bGsgZGVsZXRp b24gb2YgYWxsIGluZGV4IGVudHJpZXMgcG9pbnRpbmcgdG8gYSBzZXQgb2YgaGVhcCB0dXBsZXMu CiAgKiBUaGUgc2V0IG9mIHRhcmdldCB0dXBsZXMgaXMgc3BlY2lmaWVkIHZpYSBhIGNhbGxiYWNr IHJvdXRpbmUgdGhhdCB0ZWxscwpAQCAtNDc1LDYgKzUwOCw4IEBAIGhhc2hidWxrZGVsZXRlKElu ZGV4VmFjdXVtSW5mbyAqaW5mbywgSW5kZXhCdWxrRGVsZXRlUmVzdWx0ICpzdGF0cywKIAlCdWZm ZXIJCW1ldGFidWYgPSBJbnZhbGlkQnVmZmVyOwogCUhhc2hNZXRhUGFnZSBtZXRhcDsKIAlIYXNo TWV0YVBhZ2UgY2FjaGVkbWV0YXA7CisJSGFzaEJ1bGtEZWxldGVTdHJlYW1Qcml2YXRlIHN0cmVh bV9wcml2YXRlOworCVJlYWRTdHJlYW0gKnN0cmVhbSA9IE5VTEw7CiAKIAl0dXBsZXNfcmVtb3Zl ZCA9IDA7CiAJbnVtX2luZGV4X3R1cGxlcyA9IDA7CkBAIC00OTUsNyArNTMwLDI1IEBAIGhhc2hi dWxrZGVsZXRlKEluZGV4VmFjdXVtSW5mbyAqaW5mbywgSW5kZXhCdWxrRGVsZXRlUmVzdWx0ICpz dGF0cywKIAljdXJfYnVja2V0ID0gMDsKIAljdXJfbWF4YnVja2V0ID0gb3JpZ19tYXhidWNrZXQ7 CiAKLWxvb3BfdG9wOgorCS8qIFNldCB1cCBzdHJlYW1pbmcgcmVhZCBmb3IgcHJpbWFyeSBidWNr ZXQgcGFnZXMgKi8KKwlzdHJlYW1fcHJpdmF0ZS5tZXRhcCA9IGNhY2hlZG1ldGFwOworCXN0cmVh bV9wcml2YXRlLm5leHRfYnVja2V0ID0gY3VyX2J1Y2tldDsKKwlzdHJlYW1fcHJpdmF0ZS5tYXhf YnVja2V0ID0gY3VyX21heGJ1Y2tldDsKKworCS8qCisJICogSXQgaXMgc2FmZSB0byB1c2UgYmF0 Y2htb2RlIGFzIGhhc2hfYnVsa2RlbGV0ZV9yZWFkX3N0cmVhbV9jYiB0YWtlcyBubworCSAqIGxv Y2tzLgorCSAqLworCXN0cmVhbSA9IHJlYWRfc3RyZWFtX2JlZ2luX3JlbGF0aW9uKFJFQURfU1RS RUFNX01BSU5URU5BTkNFIHwKKwkJCQkJCQkJCQlSRUFEX1NUUkVBTV9VU0VfQkFUQ0hJTkcsCisJ CQkJCQkJCQkJaW5mby0+c3RyYXRlZ3ksCisJCQkJCQkJCQkJcmVsLAorCQkJCQkJCQkJCU1BSU5f Rk9SS05VTSwKKwkJCQkJCQkJCQloYXNoX2J1bGtkZWxldGVfcmVhZF9zdHJlYW1fY2IsCisJCQkJ CQkJCQkJJnN0cmVhbV9wcml2YXRlLAorCQkJCQkJCQkJCTApOworCitidWNrZXRfbG9vcDoKIAl3 aGlsZSAoY3VyX2J1Y2tldCA8PSBjdXJfbWF4YnVja2V0KQogCXsKIAkJQmxvY2tOdW1iZXIgYnVj a2V0X2Jsa25vOwpAQCAtNTE1LDcgKzU2OCw4IEBAIGxvb3BfdG9wOgogCQkgKiBXZSBuZWVkIHRv IGFjcXVpcmUgYSBjbGVhbnVwIGxvY2sgb24gdGhlIHByaW1hcnkgYnVja2V0IHBhZ2UgdG8gb3V0 CiAJCSAqIHdhaXQgY29uY3VycmVudCBzY2FucyBiZWZvcmUgZGVsZXRpbmcgdGhlIGRlYWQgdHVw bGVzLgogCQkgKi8KLQkJYnVmID0gUmVhZEJ1ZmZlckV4dGVuZGVkKHJlbCwgTUFJTl9GT1JLTlVN LCBibGtubywgUkJNX05PUk1BTCwgaW5mby0+c3RyYXRlZ3kpOworCQlidWYgPSByZWFkX3N0cmVh bV9uZXh0X2J1ZmZlcihzdHJlYW0sIE5VTEwpOworCQlBc3NlcnQoQnVmZmVySXNWYWxpZChidWYp KTsKIAkJTG9ja0J1ZmZlckZvckNsZWFudXAoYnVmKTsKIAkJX2hhc2hfY2hlY2twYWdlKHJlbCwg YnVmLCBMSF9CVUNLRVRfUEFHRSk7CiAKQEAgLTU0Niw2ICs2MDAsMTYgQEAgbG9vcF90b3A6CiAJ CQl7CiAJCQkJY2FjaGVkbWV0YXAgPSBfaGFzaF9nZXRjYWNoZWRtZXRhcChyZWwsICZtZXRhYnVm LCB0cnVlKTsKIAkJCQlBc3NlcnQoY2FjaGVkbWV0YXAgIT0gTlVMTCk7CisKKwkJCQkvKgorCQkJ CSAqIFJlc2V0IHN0cmVhbSB3aXRoIHVwZGF0ZWQgbWV0YWRhdGEgZm9yIHJlbWFpbmluZyBidWNr ZXRzLgorCQkJCSAqIFRoZSBCVUNLRVRfVE9fQkxLTk8gbWFwcGluZyBkZXBlbmRzIG9uIGhhc2ht X3NwYXJlc1tdLAorCQkJCSAqIHdoaWNoIG1heSBoYXZlIGNoYW5nZWQuCisJCQkJICovCisJCQkJ c3RyZWFtX3ByaXZhdGUubWV0YXAgPSBjYWNoZWRtZXRhcDsKKwkJCQlzdHJlYW1fcHJpdmF0ZS5u ZXh0X2J1Y2tldCA9IGN1cl9idWNrZXQgKyAxOworCQkJCXN0cmVhbV9wcml2YXRlLm1heF9idWNr ZXQgPSBjdXJfbWF4YnVja2V0OworCQkJCXJlYWRfc3RyZWFtX3Jlc2V0KHN0cmVhbSk7CiAJCQl9 CiAJCX0KIApAQCAtNTc4LDkgKzY0MiwxOSBAQCBsb29wX3RvcDoKIAkJY2FjaGVkbWV0YXAgPSBf aGFzaF9nZXRjYWNoZWRtZXRhcChyZWwsICZtZXRhYnVmLCB0cnVlKTsKIAkJQXNzZXJ0KGNhY2hl ZG1ldGFwICE9IE5VTEwpOwogCQljdXJfbWF4YnVja2V0ID0gY2FjaGVkbWV0YXAtPmhhc2htX21h eGJ1Y2tldDsKLQkJZ290byBsb29wX3RvcDsKKworCQkvKiBSZXNldCBzdHJlYW0gdG8gcHJvY2Vz cyBhZGRpdGlvbmFsIGJ1Y2tldHMgZnJvbSBzcGxpdCAqLworCQlzdHJlYW1fcHJpdmF0ZS5tZXRh cCA9IGNhY2hlZG1ldGFwOworCQlzdHJlYW1fcHJpdmF0ZS5uZXh0X2J1Y2tldCA9IGN1cl9idWNr ZXQ7CisJCXN0cmVhbV9wcml2YXRlLm1heF9idWNrZXQgPSBjdXJfbWF4YnVja2V0OworCQlyZWFk X3N0cmVhbV9yZXNldChzdHJlYW0pOworCQlnb3RvIGJ1Y2tldF9sb29wOwogCX0KIAorCS8qIFN0 cmVhbSBzaG91bGQgYmUgZXhoYXVzdGVkIHNpbmNlIHdlIHByb2Nlc3NlZCBhbGwgYnVja2V0cyAq LworCUFzc2VydChyZWFkX3N0cmVhbV9uZXh0X2J1ZmZlcihzdHJlYW0sIE5VTEwpID09IEludmFs aWRCdWZmZXIpOworCXJlYWRfc3RyZWFtX2VuZChzdHJlYW0pOworCiAJLyogT2theSwgd2UncmUg cmVhbGx5IGRvbmUuICBVcGRhdGUgdHVwbGUgY291bnQgaW4gbWV0YXBhZ2UuICovCiAJU1RBUlRf Q1JJVF9TRUNUSU9OKCk7CiAKZGlmZiAtLWdpdCBhL3NyYy90b29scy9wZ2luZGVudC90eXBlZGVm cy5saXN0IGIvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxpc3QKaW5kZXggYTY3MjQ2MTM4 ZWIuLjBkNjBhMTdiYzJjIDEwMDY0NAotLS0gYS9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMu bGlzdAorKysgYi9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdApAQCAtMTE4NSw2ICsx MTg1LDcgQEAgSGFzaEFnZ0JhdGNoCiBIYXNoQWdnU3BpbGwKIEhhc2hBbGxvY0Z1bmMKIEhhc2hC dWlsZFN0YXRlCitIYXNoQnVsa0RlbGV0ZVN0cmVhbVByaXZhdGUKIEhhc2hDb21wYXJlRnVuYwog SGFzaENvcHlGdW5jCiBIYXNoSW5kZXhTdGF0Ci0tIAoyLjUxLjAKCg== --0000000000009432a8064ccc5779 Content-Type: application/x-patch; name="v6-0002-Streamify-heap-bloat-estimation-scan.-Introduce-a.patch" Content-Disposition: attachment; filename="v6-0002-Streamify-heap-bloat-estimation-scan.-Introduce-a.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mmmxe2te0 RnJvbSA0MzUwNTExZDQwZjVlZmVkMmJlMjZjNTE4Y2JiMTVjNGM4NDM1ZWI0IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBhbHRlcmVnbzY1NSA8ODI0NjYyNTI2QHFxLmNvbT4KRGF0ZTog U2F0LCAyNyBEZWMgMjAyNSAwMDoyOTowMiArMDgwMApTdWJqZWN0OiBbUEFUQ0ggdjYgMi81XSBT dHJlYW1pZnkgaGVhcCBibG9hdCBlc3RpbWF0aW9uIHNjYW4uIEludHJvZHVjZSBhIAogcmVhZC1z dHJlYW0gY2FsbGJhY2sgdG8gc2tpcCBhbGwtdmlzaWJsZSBwYWdlcyB2aWEgVk0vRlNNIGxvb2t1 cCBhbmQgCiBzdHJlYW0tcmVhZCB0aGUgcmVzdCwgcmVkdWNpbmcgcGFnZSByZWFkcyBhbmQgaW1w cm92aW5nIHBnc3RhdHR1cGxlX2FwcHJveCAKIGV4ZWN1dGlvbiB0aW1lIG9uIGxhcmdlIHJlbGF0 aW9ucy4KCi0tLQogY29udHJpYi9wZ3N0YXR0dXBsZS9wZ3N0YXRhcHByb3guYyB8IDEyNiArKysr KysrKysrKysrKysrKysrKysrLS0tLS0tLQogc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxp c3QgICB8ICAgMSArCiAyIGZpbGVzIGNoYW5nZWQsIDk2IGluc2VydGlvbnMoKyksIDMxIGRlbGV0 aW9ucygtKQoKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdzdGF0dHVwbGUvcGdzdGF0YXBwcm94LmMg Yi9jb250cmliL3Bnc3RhdHR1cGxlL3Bnc3RhdGFwcHJveC5jCmluZGV4IDNmYWQyNGNmMjQ4Li42 OGFlNzcyMGIzMSAxMDA2NDQKLS0tIGEvY29udHJpYi9wZ3N0YXR0dXBsZS9wZ3N0YXRhcHByb3gu YworKysgYi9jb250cmliL3Bnc3RhdHR1cGxlL3Bnc3RhdGFwcHJveC5jCkBAIC0yMyw2ICsyMyw3 IEBACiAjaW5jbHVkZSAic3RvcmFnZS9idWZtZ3IuaCIKICNpbmNsdWRlICJzdG9yYWdlL2ZyZWVz cGFjZS5oIgogI2luY2x1ZGUgInN0b3JhZ2UvcHJvY2FycmF5LmgiCisjaW5jbHVkZSAic3RvcmFn ZS9yZWFkX3N0cmVhbS5oIgogCiBQR19GVU5DVElPTl9JTkZPX1YxKHBnc3RhdHR1cGxlX2FwcHJv eCk7CiBQR19GVU5DVElPTl9JTkZPX1YxKHBnc3RhdHR1cGxlX2FwcHJveF92MV81KTsKQEAgLTQ1 LDYgKzQ2LDYxIEBAIHR5cGVkZWYgc3RydWN0IG91dHB1dF90eXBlCiAKICNkZWZpbmUgTlVNX09V VFBVVF9DT0xVTU5TIDEwCiAKKy8qCisgKiBTdHJ1Y3QgZm9yIHN0YXRhcHByb3hfaGVhcCByZWFk IHN0cmVhbSBjYWxsYmFjay4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgU3RhdEFwcHJveFJlYWRTdHJl YW1Qcml2YXRlCit7CisJUmVsYXRpb24JcmVsOworCW91dHB1dF90eXBlICpzdGF0OworCUJsb2Nr TnVtYmVyIGN1cnJlbnRfYmxvY2tudW07CisJQmxvY2tOdW1iZXIgbmJsb2NrczsKKwlCbG9ja051 bWJlciBzY2FubmVkOwkJLyogY291bnQgb2YgcGFnZXMgYWN0dWFsbHkgcmVhZCAqLworCUJ1ZmZl cgkJdm1idWZmZXI7CQkvKiBmb3IgVk0gbG9va3VwcyAqLworfSBTdGF0QXBwcm94UmVhZFN0cmVh bVByaXZhdGU7CisKKy8qCisgKiBSZWFkIHN0cmVhbSBjYWxsYmFjayBmb3Igc3RhdGFwcHJveF9o ZWFwLgorICoKKyAqIFRoaXMgY2FsbGJhY2sgY2hlY2tzIHRoZSB2aXNpYmlsaXR5IG1hcCBmb3Ig ZWFjaCBibG9jay4gSWYgdGhlIGJsb2NrIGlzCisgKiBhbGwtdmlzaWJsZSwgd2UgY2FuIGdldCB0 aGUgZnJlZSBzcGFjZSBmcm9tIHRoZSBGU00gd2l0aG91dCByZWFkaW5nIHRoZQorICogYWN0dWFs IHBhZ2UsIGFuZCBza2lwIHRvIHRoZSBuZXh0IGJsb2NrLiBPbmx5IGJsb2NrcyB0aGF0IGFyZSBu b3QKKyAqIGFsbC12aXNpYmxlIGFyZSByZXR1cm5lZCBmb3IgYWN0dWFsIHJlYWRpbmcuCisgKi8K K3N0YXRpYyBCbG9ja051bWJlcgorc3RhdGFwcHJveF9oZWFwX3JlYWRfc3RyZWFtX25leHQoUmVh ZFN0cmVhbSAqc3RyZWFtLAorCQkJCQkJCQkgdm9pZCAqY2FsbGJhY2tfcHJpdmF0ZV9kYXRhLAor CQkJCQkJCQkgdm9pZCAqcGVyX2J1ZmZlcl9kYXRhKQoreworCVN0YXRBcHByb3hSZWFkU3RyZWFt UHJpdmF0ZSAqcCA9IGNhbGxiYWNrX3ByaXZhdGVfZGF0YTsKKworCXdoaWxlIChwLT5jdXJyZW50 X2Jsb2NrbnVtIDwgcC0+bmJsb2NrcykKKwl7CisJCUJsb2NrTnVtYmVyIGJsa25vID0gcC0+Y3Vy cmVudF9ibG9ja251bSsrOworCQlTaXplCQlmcmVlc3BhY2U7CisKKwkJQ0hFQ0tfRk9SX0lOVEVS UlVQVFMoKTsKKworCQkvKgorCQkgKiBJZiB0aGUgcGFnZSBoYXMgb25seSB2aXNpYmxlIHR1cGxl cywgdGhlbiB3ZSBjYW4gZmluZCBvdXQgdGhlIGZyZWUKKwkJICogc3BhY2UgZnJvbSB0aGUgRlNN IGFuZCBtb3ZlIG9uIHdpdGhvdXQgcmVhZGluZyB0aGUgcGFnZS4KKwkJICovCisJCWlmIChWTV9B TExfVklTSUJMRShwLT5yZWwsIGJsa25vLCAmcC0+dm1idWZmZXIpKQorCQl7CisJCQlmcmVlc3Bh Y2UgPSBHZXRSZWNvcmRlZEZyZWVTcGFjZShwLT5yZWwsIGJsa25vKTsKKwkJCXAtPnN0YXQtPnR1 cGxlX2xlbiArPSBCTENLU1ogLSBmcmVlc3BhY2U7CisJCQlwLT5zdGF0LT5mcmVlX3NwYWNlICs9 IGZyZWVzcGFjZTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogVGhpcyBibG9jayBuZWVkcyB0 byBiZSByZWFkICovCisJCXAtPnNjYW5uZWQrKzsKKwkJcmV0dXJuIGJsa25vOworCX0KKworCXJl dHVybiBJbnZhbGlkQmxvY2tOdW1iZXI7Cit9CisKIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIHRha2Vz IGFuIGFscmVhZHkgb3BlbiByZWxhdGlvbiBhbmQgc2NhbnMgaXRzIHBhZ2VzLAogICogc2tpcHBp bmcgdGhvc2UgdGhhdCBoYXZlIHRoZSBjb3JyZXNwb25kaW5nIHZpc2liaWxpdHkgbWFwIGJpdCBz ZXQuCkBAIC01OCw1MyArMTE0LDU4IEBAIHR5cGVkZWYgc3RydWN0IG91dHB1dF90eXBlCiBzdGF0 aWMgdm9pZAogc3RhdGFwcHJveF9oZWFwKFJlbGF0aW9uIHJlbCwgb3V0cHV0X3R5cGUgKnN0YXQp CiB7Ci0JQmxvY2tOdW1iZXIgc2Nhbm5lZCwKLQkJCQluYmxvY2tzLAotCQkJCWJsa25vOwotCUJ1 ZmZlcgkJdm1idWZmZXIgPSBJbnZhbGlkQnVmZmVyOworCUJsb2NrTnVtYmVyIG5ibG9ja3M7CiAJ QnVmZmVyQWNjZXNzU3RyYXRlZ3kgYnN0cmF0ZWd5OwogCVRyYW5zYWN0aW9uSWQgT2xkZXN0WG1p bjsKKwlTdGF0QXBwcm94UmVhZFN0cmVhbVByaXZhdGUgcDsKKwlSZWFkU3RyZWFtICpzdHJlYW07 CiAKIAlPbGRlc3RYbWluID0gR2V0T2xkZXN0Tm9uUmVtb3ZhYmxlVHJhbnNhY3Rpb25JZChyZWwp OwogCWJzdHJhdGVneSA9IEdldEFjY2Vzc1N0cmF0ZWd5KEJBU19CVUxLUkVBRCk7CiAKIAluYmxv Y2tzID0gUmVsYXRpb25HZXROdW1iZXJPZkJsb2NrcyhyZWwpOwotCXNjYW5uZWQgPSAwOwogCi0J Zm9yIChibGtubyA9IDA7IGJsa25vIDwgbmJsb2NrczsgYmxrbm8rKykKKwkvKiBJbml0aWFsaXpl IHJlYWQgc3RyZWFtIHByaXZhdGUgZGF0YSAqLworCXAucmVsID0gcmVsOworCXAuc3RhdCA9IHN0 YXQ7CisJcC5jdXJyZW50X2Jsb2NrbnVtID0gMDsKKwlwLm5ibG9ja3MgPSBuYmxvY2tzOworCXAu c2Nhbm5lZCA9IDA7CisJcC52bWJ1ZmZlciA9IEludmFsaWRCdWZmZXI7CisKKwkvKgorCSAqIENy ZWF0ZSB0aGUgcmVhZCBzdHJlYW0uIFdlIGRvbid0IHVzZSBSRUFEX1NUUkVBTV9VU0VfQkFUQ0hJ TkcgYmVjYXVzZQorCSAqIHRoZSBjYWxsYmFjayBhY2Nlc3NlcyB0aGUgdmlzaWJpbGl0eSBtYXAg d2hpY2ggbWF5IG5lZWQgdG8gcmVhZCBWTQorCSAqIHBhZ2VzLiBXaGlsZSB0aGlzIHNob3VsZG4n dCBjYXVzZSBkZWFkbG9ja3MsIHdlIGVyciBvbiB0aGUgc2lkZSBvZgorCSAqIGNhdXRpb24uCisJ ICovCisJc3RyZWFtID0gcmVhZF9zdHJlYW1fYmVnaW5fcmVsYXRpb24oUkVBRF9TVFJFQU1fRlVM TCwKKwkJCQkJCQkJCQlic3RyYXRlZ3ksCisJCQkJCQkJCQkJcmVsLAorCQkJCQkJCQkJCU1BSU5f Rk9SS05VTSwKKwkJCQkJCQkJCQlzdGF0YXBwcm94X2hlYXBfcmVhZF9zdHJlYW1fbmV4dCwKKwkJ CQkJCQkJCQkmcCwKKwkJCQkJCQkJCQkwKTsKKworCWZvciAoOzspCiAJewogCQlCdWZmZXIJCWJ1 ZjsKIAkJUGFnZQkJcGFnZTsKIAkJT2Zmc2V0TnVtYmVyIG9mZm51bSwKIAkJCQkJbWF4b2ZmOwot CQlTaXplCQlmcmVlc3BhY2U7Ci0KLQkJQ0hFQ0tfRk9SX0lOVEVSUlVQVFMoKTsKLQotCQkvKgot CQkgKiBJZiB0aGUgcGFnZSBoYXMgb25seSB2aXNpYmxlIHR1cGxlcywgdGhlbiB3ZSBjYW4gZmlu ZCBvdXQgdGhlIGZyZWUKLQkJICogc3BhY2UgZnJvbSB0aGUgRlNNIGFuZCBtb3ZlIG9uLgotCQkg Ki8KLQkJaWYgKFZNX0FMTF9WSVNJQkxFKHJlbCwgYmxrbm8sICZ2bWJ1ZmZlcikpCi0JCXsKLQkJ CWZyZWVzcGFjZSA9IEdldFJlY29yZGVkRnJlZVNwYWNlKHJlbCwgYmxrbm8pOwotCQkJc3RhdC0+ dHVwbGVfbGVuICs9IEJMQ0tTWiAtIGZyZWVzcGFjZTsKLQkJCXN0YXQtPmZyZWVfc3BhY2UgKz0g ZnJlZXNwYWNlOwotCQkJY29udGludWU7Ci0JCX0KKwkJQmxvY2tOdW1iZXIgYmxrbm87CiAKLQkJ YnVmID0gUmVhZEJ1ZmZlckV4dGVuZGVkKHJlbCwgTUFJTl9GT1JLTlVNLCBibGtubywKLQkJCQkJ CQkJIFJCTV9OT1JNQUwsIGJzdHJhdGVneSk7CisJCWJ1ZiA9IHJlYWRfc3RyZWFtX25leHRfYnVm ZmVyKHN0cmVhbSwgTlVMTCk7CisJCWlmIChidWYgPT0gSW52YWxpZEJ1ZmZlcikKKwkJCWJyZWFr OwogCiAJCUxvY2tCdWZmZXIoYnVmLCBCVUZGRVJfTE9DS19TSEFSRSk7CiAKIAkJcGFnZSA9IEJ1 ZmZlckdldFBhZ2UoYnVmKTsKKwkJYmxrbm8gPSBCdWZmZXJHZXRCbG9ja051bWJlcihidWYpOwog CiAJCXN0YXQtPmZyZWVfc3BhY2UgKz0gUGFnZUdldEV4YWN0RnJlZVNwYWNlKHBhZ2UpOwogCi0J CS8qIFdlIG1heSBjb3VudCB0aGUgcGFnZSBhcyBzY2FubmVkIGV2ZW4gaWYgaXQncyBuZXcvZW1w dHkgKi8KLQkJc2Nhbm5lZCsrOwotCiAJCWlmIChQYWdlSXNOZXcocGFnZSkgfHwgUGFnZUlzRW1w dHkocGFnZSkpCiAJCXsKIAkJCVVubG9ja1JlbGVhc2VCdWZmZXIoYnVmKTsKQEAgLTE2OSw2ICsy MzAsOSBAQCBzdGF0YXBwcm94X2hlYXAoUmVsYXRpb24gcmVsLCBvdXRwdXRfdHlwZSAqc3RhdCkK IAkJVW5sb2NrUmVsZWFzZUJ1ZmZlcihidWYpOwogCX0KIAorCUFzc2VydChwLmN1cnJlbnRfYmxv Y2tudW0gPT0gbmJsb2Nrcyk7CisJcmVhZF9zdHJlYW1fZW5kKHN0cmVhbSk7CisKIAlzdGF0LT50 YWJsZV9sZW4gPSAodWludDY0KSBuYmxvY2tzICogQkxDS1NaOwogCiAJLyoKQEAgLTE3OSw3ICsy NDMsNyBAQCBzdGF0YXBwcm94X2hlYXAoUmVsYXRpb24gcmVsLCBvdXRwdXRfdHlwZSAqc3RhdCkK IAkgKiB0dXBsZXMgaW4gYWxsLXZpc2libGUgcGFnZXMsIHNvIG5vIGNvcnJlY3Rpb24gaXMgbmVl ZGVkIGZvciB0aGF0LCBhbmQKIAkgKiB3ZSBhbHJlYWR5IGFjY291bnRlZCBmb3IgdGhlIHNwYWNl IGluIHRob3NlIHBhZ2VzLCB0b28uCiAJICovCi0Jc3RhdC0+dHVwbGVfY291bnQgPSB2YWNfZXN0 aW1hdGVfcmVsdHVwbGVzKHJlbCwgbmJsb2Nrcywgc2Nhbm5lZCwKKwlzdGF0LT50dXBsZV9jb3Vu dCA9IHZhY19lc3RpbWF0ZV9yZWx0dXBsZXMocmVsLCBuYmxvY2tzLCBwLnNjYW5uZWQsCiAJCQkJ CQkJCQkJCSAgIHN0YXQtPnR1cGxlX2NvdW50KTsKIAogCS8qIEl0J3Mgbm90IGNsZWFyIGlmIHdl IGNvdWxkIGdldCAtMSBoZXJlLCBidXQgYmUgc2FmZS4gKi8KQEAgLTE5MCwxNiArMjU0LDE2IEBA IHN0YXRhcHByb3hfaGVhcChSZWxhdGlvbiByZWwsIG91dHB1dF90eXBlICpzdGF0KQogCSAqLwog CWlmIChuYmxvY2tzICE9IDApCiAJewotCQlzdGF0LT5zY2FubmVkX3BlcmNlbnQgPSAxMDAuMCAq IHNjYW5uZWQgLyBuYmxvY2tzOworCQlzdGF0LT5zY2FubmVkX3BlcmNlbnQgPSAxMDAuMCAqIHAu c2Nhbm5lZCAvIG5ibG9ja3M7CiAJCXN0YXQtPnR1cGxlX3BlcmNlbnQgPSAxMDAuMCAqIHN0YXQt PnR1cGxlX2xlbiAvIHN0YXQtPnRhYmxlX2xlbjsKIAkJc3RhdC0+ZGVhZF90dXBsZV9wZXJjZW50 ID0gMTAwLjAgKiBzdGF0LT5kZWFkX3R1cGxlX2xlbiAvIHN0YXQtPnRhYmxlX2xlbjsKIAkJc3Rh dC0+ZnJlZV9wZXJjZW50ID0gMTAwLjAgKiBzdGF0LT5mcmVlX3NwYWNlIC8gc3RhdC0+dGFibGVf bGVuOwogCX0KIAotCWlmIChCdWZmZXJJc1ZhbGlkKHZtYnVmZmVyKSkKKwlpZiAoQnVmZmVySXNW YWxpZChwLnZtYnVmZmVyKSkKIAl7Ci0JCVJlbGVhc2VCdWZmZXIodm1idWZmZXIpOwotCQl2bWJ1 ZmZlciA9IEludmFsaWRCdWZmZXI7CisJCVJlbGVhc2VCdWZmZXIocC52bWJ1ZmZlcik7CisJCXAu dm1idWZmZXIgPSBJbnZhbGlkQnVmZmVyOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3Rvb2xz L3BnaW5kZW50L3R5cGVkZWZzLmxpc3QgYi9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlz dAppbmRleCAxNDFiOWQ2ZTA3Ny4uYTY3MjQ2MTM4ZWIgMTAwNjQ0Ci0tLSBhL3NyYy90b29scy9w Z2luZGVudC90eXBlZGVmcy5saXN0CisrKyBiL3NyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5s aXN0CkBAIC0yOTE3LDYgKzI5MTcsNyBAQCBTdGFydFJlcGxpY2F0aW9uQ21kCiBTdGFydHVwU3Rh dHVzRW51bQogU3RhdEVudHJ5CiBTdGF0RXh0RW50cnkKK1N0YXRBcHByb3hSZWFkU3RyZWFtUHJp dmF0ZQogU3RhdGVGaWxlQ2h1bmsKIFN0YXRpc3RpY0V4dEluZm8KIFN0YXRzQnVpbGREYXRhCi0t IAoyLjUxLjAKCg== --0000000000009432a8064ccc5779 Content-Type: application/x-patch; name="v6-0005-Use-streaming-read-API-in-pgstatindex-functions.patch" Content-Disposition: attachment; filename="v6-0005-Use-streaming-read-API-in-pgstatindex-functions.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mmmxe2tl3 RnJvbSAwODVhYmVhN2U0YzY5OThhY2RhZjBlZjk2YWE3NTllZDMwZmQxZDI1IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBhbHRlcmVnbzY1NSA8ODI0NjYyNTI2QHFxLmNvbT4KRGF0ZTog VGh1LCAxMiBNYXIgMjAyNiAxMDo0ODozOCArMDgwMApTdWJqZWN0OiBbUEFUQ0ggdjYgNS81XSBV c2Ugc3RyZWFtaW5nIHJlYWQgQVBJIGluIHBnc3RhdGluZGV4IGZ1bmN0aW9ucwoKUmVwbGFjZSBz eW5jaHJvbm91cyBSZWFkQnVmZmVyRXh0ZW5kZWQoKSBsb29wcyB3aXRoIHRoZSBzdHJlYW1pbmcg cmVhZApBUEkgaW4gcGdzdGF0aW5kZXhfaW1wbCgpIGFuZCBwZ3N0YXRoYXNoaW5kZXgoKS4KCkF1 dGhvcjogWHVuZW5nIFpob3UgPHh1bmVuZ3pob3VAZ21haWwuY29tPgpSZXZpZXdlZC1ieTogTmF6 aXIgQmlsYWwgWWF2dXogPGJ5YXZ1ejgxQGdtYWlsLmNvbT4KUmV2aWV3ZWQtYnk6IHdlbmh1aSBx aXUgPHFpdXdlbmh1aWZ4QGdtYWlsLmNvbT4KUmV2aWV3ZWQtYnk6IFNoaW55YSBLYXRvIDxzaGlu eWExMS5rYXRvQGdtYWlsLmNvbT4KLS0tCiBjb250cmliL3Bnc3RhdHR1cGxlL3Bnc3RhdGluZGV4 LmMgfCA2NSArKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwg NTQgaW5zZXJ0aW9ucygrKSwgMTEgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvY29udHJpYi9w Z3N0YXR0dXBsZS9wZ3N0YXRpbmRleC5jIGIvY29udHJpYi9wZ3N0YXR0dXBsZS9wZ3N0YXRpbmRl eC5jCmluZGV4IGVmNzIzYWYxZjE5Li4yYjNjMzUxZWNmZiAxMDA2NDQKLS0tIGEvY29udHJpYi9w Z3N0YXR0dXBsZS9wZ3N0YXRpbmRleC5jCisrKyBiL2NvbnRyaWIvcGdzdGF0dHVwbGUvcGdzdGF0 aW5kZXguYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgImZ1bmNhcGkuaCIKICNpbmNsdWRl ICJtaXNjYWRtaW4uaCIKICNpbmNsdWRlICJzdG9yYWdlL2J1Zm1nci5oIgorI2luY2x1ZGUgInN0 b3JhZ2UvcmVhZF9zdHJlYW0uaCIKICNpbmNsdWRlICJ1dGlscy9yZWwuaCIKICNpbmNsdWRlICJ1 dGlscy92YXJsZW5hLmgiCiAKQEAgLTIxNyw2ICsyMTgsOCBAQCBwZ3N0YXRpbmRleF9pbXBsKFJl bGF0aW9uIHJlbCwgRnVuY3Rpb25DYWxsSW5mbyBmY2luZm8pCiAJQmxvY2tOdW1iZXIgYmxrbm87 CiAJQlRJbmRleFN0YXQgaW5kZXhTdGF0OwogCUJ1ZmZlckFjY2Vzc1N0cmF0ZWd5IGJzdHJhdGVn eSA9IEdldEFjY2Vzc1N0cmF0ZWd5KEJBU19CVUxLUkVBRCk7CisJQmxvY2tSYW5nZVJlYWRTdHJl YW1Qcml2YXRlIHA7CisJUmVhZFN0cmVhbSAqc3RyZWFtOwogCiAJaWYgKCFJU19JTkRFWChyZWwp IHx8ICFJU19CVFJFRShyZWwpKQogCQllcmVwb3J0KEVSUk9SLApAQCAtMjczLDExICsyNzYsMjkg QEAgcGdzdGF0aW5kZXhfaW1wbChSZWxhdGlvbiByZWwsIEZ1bmN0aW9uQ2FsbEluZm8gZmNpbmZv KQogCWluZGV4U3RhdC5mcmFnbWVudHMgPSAwOwogCiAJLyoKLQkgKiBTY2FuIGFsbCBibG9ja3Mg ZXhjZXB0IHRoZSBtZXRhcGFnZQorCSAqIFNjYW4gYWxsIGJsb2NrcyBleGNlcHQgdGhlIG1ldGFw YWdlICgwdGggcGFnZSkgdXNpbmcgc3RyZWFtaW5nIHJlYWRzCiAJICovCiAJbmJsb2NrcyA9IFJl bGF0aW9uR2V0TnVtYmVyT2ZCbG9ja3MocmVsKTsKIAotCWZvciAoYmxrbm8gPSAxOyBibGtubyA8 IG5ibG9ja3M7IGJsa25vKyspCisJQmxvY2tOdW1iZXIgc3RhcnRibGsgPSBCVFJFRV9NRVRBUEFH RSArIDE7CisKKwlwLmN1cnJlbnRfYmxvY2tudW0gPSBzdGFydGJsazsKKwlwLmxhc3RfZXhjbHVz aXZlID0gbmJsb2NrczsKKworCS8qCisJICogSXQgaXMgc2FmZSB0byB1c2UgYmF0Y2htb2RlIGFz IGJsb2NrX3JhbmdlX3JlYWRfc3RyZWFtX2NiIHRha2VzIG5vCisJICogbG9ja3MuCisJICovCisJ c3RyZWFtID0gcmVhZF9zdHJlYW1fYmVnaW5fcmVsYXRpb24oUkVBRF9TVFJFQU1fRlVMTCB8CisJ CQkJCQkJCQkJUkVBRF9TVFJFQU1fVVNFX0JBVENISU5HLAorCQkJCQkJCQkJCWJzdHJhdGVneSwK KwkJCQkJCQkJCQlyZWwsCisJCQkJCQkJCQkJTUFJTl9GT1JLTlVNLAorCQkJCQkJCQkJCWJsb2Nr X3JhbmdlX3JlYWRfc3RyZWFtX2NiLAorCQkJCQkJCQkJCSZwLAorCQkJCQkJCQkJCTApOworCisJ Zm9yIChibGtubyA9IHN0YXJ0YmxrOyBibGtubyA8IG5ibG9ja3M7IGJsa25vKyspCiAJewogCQlC dWZmZXIJCWJ1ZmZlcjsKIAkJUGFnZQkJcGFnZTsKQEAgLTI4NSw4ICszMDYsNyBAQCBwZ3N0YXRp bmRleF9pbXBsKFJlbGF0aW9uIHJlbCwgRnVuY3Rpb25DYWxsSW5mbyBmY2luZm8pCiAKIAkJQ0hF Q0tfRk9SX0lOVEVSUlVQVFMoKTsKIAotCQkvKiBSZWFkIGFuZCBsb2NrIGJ1ZmZlciAqLwotCQli dWZmZXIgPSBSZWFkQnVmZmVyRXh0ZW5kZWQocmVsLCBNQUlOX0ZPUktOVU0sIGJsa25vLCBSQk1f Tk9STUFMLCBic3RyYXRlZ3kpOworCQlidWZmZXIgPSByZWFkX3N0cmVhbV9uZXh0X2J1ZmZlcihz dHJlYW0sIE5VTEwpOwogCQlMb2NrQnVmZmVyKGJ1ZmZlciwgQlVGRkVSX0xPQ0tfU0hBUkUpOwog CiAJCXBhZ2UgPSBCdWZmZXJHZXRQYWdlKGJ1ZmZlcik7CkBAIC0zMjIsMTEgKzM0MiwxMiBAQCBw Z3N0YXRpbmRleF9pbXBsKFJlbGF0aW9uIHJlbCwgRnVuY3Rpb25DYWxsSW5mbyBmY2luZm8pCiAJ CWVsc2UKIAkJCWluZGV4U3RhdC5pbnRlcm5hbF9wYWdlcysrOwogCi0JCS8qIFVubG9jayBhbmQg cmVsZWFzZSBidWZmZXIgKi8KLQkJTG9ja0J1ZmZlcihidWZmZXIsIEJVRkZFUl9MT0NLX1VOTE9D Syk7Ci0JCVJlbGVhc2VCdWZmZXIoYnVmZmVyKTsKKwkJVW5sb2NrUmVsZWFzZUJ1ZmZlcihidWZm ZXIpOwogCX0KIAorCUFzc2VydChyZWFkX3N0cmVhbV9uZXh0X2J1ZmZlcihzdHJlYW0sIE5VTEwp ID09IEludmFsaWRCdWZmZXIpOworCXJlYWRfc3RyZWFtX2VuZChzdHJlYW0pOworCiAJcmVsYXRp b25fY2xvc2UocmVsLCBBY2Nlc3NTaGFyZUxvY2spOwogCiAJLyotLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCkBAIC02MDAsNiArNjIxLDggQEAgcGdzdGF0aGFzaGluZGV4KFBHX0ZVTkNUSU9O X0FSR1MpCiAJSGFzaE1ldGFQYWdlIG1ldGFwOwogCWZsb2F0OAkJZnJlZV9wZXJjZW50OwogCXVp bnQ2NAkJdG90YWxfc3BhY2U7CisJQmxvY2tSYW5nZVJlYWRTdHJlYW1Qcml2YXRlIHA7CisJUmVh ZFN0cmVhbSAqc3RyZWFtOwogCiAJLyoKIAkgKiBUaGlzIHVzZXMgcmVsYXRpb25fb3BlbigpIGFu ZCBub3QgaW5kZXhfb3BlbigpLiAgVGhlIGxhdHRlciBhbGxvd3MKQEAgLTY0NCwxNiArNjY3LDMz IEBAIHBnc3RhdGhhc2hpbmRleChQR19GVU5DVElPTl9BUkdTKQogCS8qIHByZXBhcmUgYWNjZXNz IHN0cmF0ZWd5IGZvciB0aGlzIGluZGV4ICovCiAJYnN0cmF0ZWd5ID0gR2V0QWNjZXNzU3RyYXRl Z3koQkFTX0JVTEtSRUFEKTsKIAotCS8qIFN0YXJ0IGZyb20gYmxrbm8gMSBhcyAwdGggYmxvY2sg aXMgbWV0YXBhZ2UgKi8KLQlmb3IgKGJsa25vID0gMTsgYmxrbm8gPCBuYmxvY2tzOyBibGtubysr KQorCS8qIFNjYW4gYWxsIGJsb2NrcyBleGNlcHQgdGhlIG1ldGFwYWdlICgwdGggcGFnZSkgdXNp bmcgc3RyZWFtaW5nIHJlYWRzICovCisJQmxvY2tOdW1iZXIgc3RhcnRibGsgPSBIQVNIX01FVEFQ QUdFICsgMTsKKworCXAuY3VycmVudF9ibG9ja251bSA9IHN0YXJ0YmxrOworCXAubGFzdF9leGNs dXNpdmUgPSBuYmxvY2tzOworCisJLyoKKwkgKiBJdCBpcyBzYWZlIHRvIHVzZSBiYXRjaG1vZGUg YXMgYmxvY2tfcmFuZ2VfcmVhZF9zdHJlYW1fY2IgdGFrZXMgbm8KKwkgKiBsb2Nrcy4KKwkgKi8K KwlzdHJlYW0gPSByZWFkX3N0cmVhbV9iZWdpbl9yZWxhdGlvbihSRUFEX1NUUkVBTV9GVUxMIHwK KwkJCQkJCQkJCQlSRUFEX1NUUkVBTV9VU0VfQkFUQ0hJTkcsCisJCQkJCQkJCQkJYnN0cmF0ZWd5 LAorCQkJCQkJCQkJCXJlbCwKKwkJCQkJCQkJCQlNQUlOX0ZPUktOVU0sCisJCQkJCQkJCQkJYmxv Y2tfcmFuZ2VfcmVhZF9zdHJlYW1fY2IsCisJCQkJCQkJCQkJJnAsCisJCQkJCQkJCQkJMCk7CisK Kwlmb3IgKGJsa25vID0gc3RhcnRibGs7IGJsa25vIDwgbmJsb2NrczsgYmxrbm8rKykKIAl7CiAJ CUJ1ZmZlcgkJYnVmOwogCQlQYWdlCQlwYWdlOwogCiAJCUNIRUNLX0ZPUl9JTlRFUlJVUFRTKCk7 CiAKLQkJYnVmID0gUmVhZEJ1ZmZlckV4dGVuZGVkKHJlbCwgTUFJTl9GT1JLTlVNLCBibGtubywg UkJNX05PUk1BTCwKLQkJCQkJCQkJIGJzdHJhdGVneSk7CisJCWJ1ZiA9IHJlYWRfc3RyZWFtX25l eHRfYnVmZmVyKHN0cmVhbSwgTlVMTCk7CiAJCUxvY2tCdWZmZXIoYnVmLCBCVUZGRVJfTE9DS19T SEFSRSk7CiAJCXBhZ2UgPSBCdWZmZXJHZXRQYWdlKGJ1Zik7CiAKQEAgLTY5OCw2ICs3MzgsOSBA QCBwZ3N0YXRoYXNoaW5kZXgoUEdfRlVOQ1RJT05fQVJHUykKIAkJVW5sb2NrUmVsZWFzZUJ1ZmZl cihidWYpOwogCX0KIAorCUFzc2VydChyZWFkX3N0cmVhbV9uZXh0X2J1ZmZlcihzdHJlYW0sIE5V TEwpID09IEludmFsaWRCdWZmZXIpOworCXJlYWRfc3RyZWFtX2VuZChzdHJlYW0pOworCiAJLyog RG9uZSBhY2Nlc3NpbmcgdGhlIGluZGV4ICovCiAJcmVsYXRpb25fY2xvc2UocmVsLCBBY2Nlc3NT aGFyZUxvY2spOwogCi0tIAoyLjUxLjAKCg== --0000000000009432a8064ccc5779 Content-Type: application/x-patch; name="v6-0004-Streamify-log_newpage_range-WAL-logging-path.patch" Content-Disposition: attachment; filename="v6-0004-Streamify-log_newpage_range-WAL-logging-path.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mmmxe2tj2 RnJvbSAxNGYxYTZiZWQyN2FjZjBmNTE3MTQwYjliNGYwYWZhNGRiNjQ3NzdiIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBhbHRlcmVnbzY1NSA8ODI0NjYyNTI2QHFxLmNvbT4KRGF0ZTog VGh1LCAxMiBNYXIgMjAyNiAxMDo0MTo0MSArMDgwMApTdWJqZWN0OiBbUEFUQ0ggdjYgNC81XSBT dHJlYW1pZnkgbG9nX25ld3BhZ2VfcmFuZ2UoKSBXQUwgbG9nZ2luZyBwYXRoCgpSZWZhY3RvciBs b2dfbmV3cGFnZV9yYW5nZSgpIHRvIHVzZSB0aGUgUmVhZCBTdHJlYW0gQVBJLiBUaGlzIGFsbG93 cwpwcmVmZXRjaGluZyBvZiB1cGNvbWluZyByZWxhdGlvbiBibG9ja3MgZHVyaW5nIGJ1bGsgV0FM IGxvZ2dpbmcKb3BlcmF0aW9ucywgb3ZlcmxhcHBpbmcgSS9PIHdpdGggQ1BVLWludGVuc2l2ZSBY TG9nSW5zZXJ0IGFuZApXQUwtd3JpdGluZyB3b3JrLgotLS0KIHNyYy9iYWNrZW5kL2FjY2Vzcy90 cmFuc2FtL3hsb2dpbnNlcnQuYyB8IDI2ICsrKysrKysrKysrKysrKysrKysrKysrLS0KIDEgZmls ZSBjaGFuZ2VkLCAyNCBpbnNlcnRpb25zKCspLCAyIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBh L3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2dpbnNlcnQuYyBiL3NyYy9iYWNrZW5kL2Fj Y2Vzcy90cmFuc2FtL3hsb2dpbnNlcnQuYwppbmRleCBhYzNjMWE3ODM5Ni4uNzFlZjFlYTIwNTIg MTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2dpbnNlcnQuYworKysg Yi9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9naW5zZXJ0LmMKQEAgLTM4LDYgKzM4LDcg QEAKICNpbmNsdWRlICJwZ190cmFjZS5oIgogI2luY2x1ZGUgInJlcGxpY2F0aW9uL29yaWdpbi5o IgogI2luY2x1ZGUgInN0b3JhZ2UvYnVmbWdyLmgiCisjaW5jbHVkZSAic3RvcmFnZS9yZWFkX3N0 cmVhbS5oIgogI2luY2x1ZGUgInN0b3JhZ2UvcHJvYy5oIgogI2luY2x1ZGUgInV0aWxzL21lbXV0 aWxzLmgiCiAjaW5jbHVkZSAidXRpbHMvcGdzdGF0X2ludGVybmFsLmgiCkBAIC0xMjk2LDYgKzEy OTcsOCBAQCBsb2dfbmV3cGFnZV9yYW5nZShSZWxhdGlvbiByZWwsIEZvcmtOdW1iZXIgZm9ya251 bSwKIHsKIAlpbnQJCQlmbGFnczsKIAlCbG9ja051bWJlciBibGtubzsKKwlCbG9ja1JhbmdlUmVh ZFN0cmVhbVByaXZhdGUgcDsKKwlSZWFkU3RyZWFtICpzdHJlYW07CiAKIAlmbGFncyA9IFJFR0JV Rl9GT1JDRV9JTUFHRTsKIAlpZiAocGFnZV9zdGQpCkBAIC0xMzA4LDYgKzEzMTEsMjMgQEAgbG9n X25ld3BhZ2VfcmFuZ2UoUmVsYXRpb24gcmVsLCBGb3JrTnVtYmVyIGZvcmtudW0sCiAJICovCiAJ WExvZ0Vuc3VyZVJlY29yZFNwYWNlKFhMUl9NQVhfQkxPQ0tfSUQgLSAxLCAwKTsKIAorCS8qIFNl dCB1cCBhIHN0cmVhbWluZyByZWFkIGZvciB0aGUgcmFuZ2Ugb2YgYmxvY2tzICovCisJcC5jdXJy ZW50X2Jsb2NrbnVtID0gc3RhcnRibGs7CisJcC5sYXN0X2V4Y2x1c2l2ZSA9IGVuZGJsazsKKwor CS8qCisJICogSXQgaXMgc2FmZSB0byB1c2UgYmF0Y2htb2RlIGFzIGJsb2NrX3JhbmdlX3JlYWRf c3RyZWFtX2NiIHRha2VzIG5vCisJICogbG9ja3MuCisJICovCisJc3RyZWFtID0gcmVhZF9zdHJl YW1fYmVnaW5fcmVsYXRpb24oUkVBRF9TVFJFQU1fTUFJTlRFTkFOQ0UgfAorCQkJCQkJCQkJCVJF QURfU1RSRUFNX1VTRV9CQVRDSElORywKKwkJCQkJCQkJCQlOVUxMLAorCQkJCQkJCQkJCXJlbCwK KwkJCQkJCQkJCQlmb3JrbnVtLAorCQkJCQkJCQkJCWJsb2NrX3JhbmdlX3JlYWRfc3RyZWFtX2Ni LAorCQkJCQkJCQkJCSZwLAorCQkJCQkJCQkJCTApOworCiAJYmxrbm8gPSBzdGFydGJsazsKIAl3 aGlsZSAoYmxrbm8gPCBlbmRibGspCiAJewpAQCAtMTMyMiw4ICsxMzQyLDcgQEAgbG9nX25ld3Bh Z2VfcmFuZ2UoUmVsYXRpb24gcmVsLCBGb3JrTnVtYmVyIGZvcmtudW0sCiAJCW5idWZzID0gMDsK IAkJd2hpbGUgKG5idWZzIDwgWExSX01BWF9CTE9DS19JRCAmJiBibGtubyA8IGVuZGJsaykKIAkJ ewotCQkJQnVmZmVyCQlidWYgPSBSZWFkQnVmZmVyRXh0ZW5kZWQocmVsLCBmb3JrbnVtLCBibGtu bywKLQkJCQkJCQkJCQkJCSBSQk1fTk9STUFMLCBOVUxMKTsKKwkJCUJ1ZmZlcgkJYnVmID0gcmVh ZF9zdHJlYW1fbmV4dF9idWZmZXIoc3RyZWFtLCBOVUxMKTsKIAogCQkJTG9ja0J1ZmZlcihidWYs IEJVRkZFUl9MT0NLX0VYQ0xVU0lWRSk7CiAKQEAgLTEzNjMsNiArMTM4Miw5IEBAIGxvZ19uZXdw YWdlX3JhbmdlKFJlbGF0aW9uIHJlbCwgRm9ya051bWJlciBmb3JrbnVtLAogCQlmb3IgKGkgPSAw OyBpIDwgbmJ1ZnM7IGkrKykKIAkJCVVubG9ja1JlbGVhc2VCdWZmZXIoYnVmcGFja1tpXSk7CiAJ fQorCisJQXNzZXJ0KHJlYWRfc3RyZWFtX25leHRfYnVmZmVyKHN0cmVhbSwgTlVMTCkgPT0gSW52 YWxpZEJ1ZmZlcik7CisJcmVhZF9zdHJlYW1fZW5kKHN0cmVhbSk7CiB9CiAKIC8qCi0tIAoyLjUx LjAKCg== --0000000000009432a8064ccc5779 Content-Type: application/x-sh; name="run_streaming_benchmark.sh" Content-Disposition: attachment; filename="run_streaming_benchmark.sh" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mmmxevkg4 IyEvdXNyL2Jpbi9lbnYgYmFzaApzZXQgLWV1byBwaXBlZmFpbAoKIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIwojIFN0cmVhbWluZyBSZWFkIFBhdGNoZXMgQmVuY2htYXJrCiMKIyBVc2FnZTogLi9ydW5f c3RyZWFtaW5nX2JlbmNoLnNoIFtPUFRJT05TXSA8cGF0Y2g+CiMKIyBPcHRpb25zOgojICAgLS1j bGVhbiAgICAgICAgICAgUmVtb3ZlIGV4aXN0aW5nIGJ1aWxkcyBhbmQgc3RhcnQgZnJlc2gKIyAg IC0tYmFzZWxpbmUgICAgICAgIEFsc28gYnVpbGQgYW5kIHRlc3QgdmFuaWxsYSBQb3N0Z3JlU1FM IGZvciBjb21wYXJpc29uCiMgICAtLXRlc3QgVEVTVCAgICAgICBSdW4gc3BlY2lmaWMgdGVzdCAo Ymxvb21fc2NhbiwgYmxvb21fdmFjdXVtLCBwZ3N0YXR0dXBsZSwKIyAgICAgICAgICAgICAgICAg ICAgIHBnc3RhdGluZGV4LCBnaW5fdmFjdXVtLCB3YWxfbG9nZ2luZywgaGFzaF92YWN1dW0sIG9y ICJhbGwiKQojICAgLS1pby1tZXRob2QgTU9ERSAgSS9PIG1ldGhvZDogaW9fdXJpbmcsIHdvcmtl ciwgb3Igc3luYyAoZGVmYXVsdDogaW9fdXJpbmcpCiMgICAtLWlvLXdvcmtlcnMgTiAgICBOdW1i ZXIgb2YgSS9PIHdvcmtlcnMgZm9yIHdvcmtlciBtb2RlIChkZWZhdWx0OiAzKQojICAgLS1pby1j b25jdXJyZW5jeSBOICBNYXggY29uY3VycmVudCBJL09zIHBlciBwcm9jZXNzIChkZWZhdWx0OiA2 NCkKIyAgIC0tZGlyZWN0LWlvICAgICAgICAgRW5hYmxlIGRpcmVjdCBJTyAoZGVidWdfaW9fZGly ZWN0PWRhdGEpLCBieXBhc3NlcyBPUyBwYWdlIGNhY2hlCiMgICAtLWlvLWRlbGF5IE1TICAgICAg IFNpbXVsYXRlIHN0b3JhZ2UgbGF0ZW5jeSB2aWEgZG1fZGVsYXkgKHJlcXVpcmVzIHByZS1jcmVh dGVkIGRldmljZSkKIyAgIC0tcHJvZmlsZSAgICAgICAgICAgRW5hYmxlIHBlcmYgcHJvZmlsaW5n IGFuZCBmbGFtZWdyYXBoIGdlbmVyYXRpb24KIwojIEVudmlyb25tZW50OgojICAgV09SS1JPT1Qg ICAgICAgQmFzZSBkaXJlY3RvcnkgKGRlZmF1bHQ6ICRIT01FL3BnX2JlbmNoKQojICAgUkVQUyAg ICAgICAgICAgUmVwZXRpdGlvbnMgcGVyIHRlc3QgKGRlZmF1bHQ6IDUpCiMgICBTSVpFUyAgICAg ICAgICBUYWJsZSBzaXplcyB0byB0ZXN0IChkZWZhdWx0OiAibGFyZ2UiKQojICAgRkxBTUVHUkFQ SF9ESVIgUGF0aCB0byBGbGFtZUdyYXBoIHRvb2xzIChkZWZhdWx0OiAkSE9NRS9GbGFtZUdyYXBo KQojICAgRE1fREVMQVlfREVWICAgZG1fZGVsYXkgZGV2aWNlIG5hbWUgZm9yIC0taW8tZGVsYXkg KGRlZmF1bHQ6ICJkZWxheWVkIikKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKbG9nKCkgeyBwcmlu dGYgJ1wwMzNbMTszNG09PT5cMDMzWzBtICVzXG4nICIkKiI7IH0KZGllKCkgeyBwcmludGYgJ1ww MzNbMTszMW1FUlJPUjpcMDMzWzBtICVzXG4nICIkKiIgPiYyOyBleGl0IDE7IH0KCiMgLS0tIENM SSBwYXJzaW5nIC0tLQpDTEVBTj0wCkJBU0VMSU5FPTAKRE9fUFJPRklMRT0wCkRJUkVDVF9JTz0w CklPX0RFTEFZX01TPSIiClRFU1Q9ImFsbCIKSU9fTUVUSE9EPSIke0lPX01FVEhPRDotaW9fdXJp bmd9IgpJT19XT1JLRVJTPSIke0lPX1dPUktFUlM6LTN9IgpJT19NQVhfQ09OQ1VSUkVOQ1k9IiR7 SU9fTUFYX0NPTkNVUlJFTkNZOi02NH0iCkRNX0RFTEFZX0RFVj0iJHtETV9ERUxBWV9ERVY6LWRl bGF5ZWR9IgpQQVRDSD0iIgoKd2hpbGUgW1sgJCMgLWd0IDAgXV07IGRvCiAgY2FzZSAiJDEiIGlu CiAgICAtLWNsZWFuKSAgICAgICAgICBDTEVBTj0xIDs7CiAgICAtLWJhc2VsaW5lKSAgICAgICBC QVNFTElORT0xIDs7CiAgICAtLXByb2ZpbGUpICAgICAgICBET19QUk9GSUxFPTEgOzsKICAgIC0t ZGlyZWN0LWlvKSAgICAgIERJUkVDVF9JTz0xIDs7CiAgICAtLWlvLWRlbGF5KSAgICAgICBJT19E RUxBWV9NUz0iJDIiOyBzaGlmdCA7OwogICAgLS10ZXN0KSAgICAgICAgICAgVEVTVD0iJDIiOyBz aGlmdCA7OwogICAgLS1pby1tZXRob2QpICAgICAgSU9fTUVUSE9EPSIkMiI7IHNoaWZ0IDs7CiAg ICAtLWlvLXdvcmtlcnMpICAgICBJT19XT1JLRVJTPSIkMiI7IHNoaWZ0IDs7CiAgICAtLWlvLWNv bmN1cnJlbmN5KSBJT19NQVhfQ09OQ1VSUkVOQ1k9IiQyIjsgc2hpZnQgOzsKICAgIC1ofC0taGVs cCkgICAgICAgIHNlZCAtbiAnMywyN3AnICIkMCIgfCBzZWQgJ3MvXiMgXD8vLyc7IGV4aXQgMCA7 OwogICAgLSopICAgICAgICAgICAgICAgZGllICJVbmtub3duIG9wdGlvbjogJDEiIDs7CiAgICAq KSAgICAgICAgICAgICAgICBQQVRDSD0iJDEiIDs7CiAgZXNhYwogIHNoaWZ0CmRvbmUKCiMgVmFs aWRhdGUgaW9fbWV0aG9kCmNhc2UgIiRJT19NRVRIT0QiIGluCiAgaW9fdXJpbmd8d29ya2VyfHN5 bmMpIDs7CiAgKikgZGllICJJbnZhbGlkIC0taW8tbWV0aG9kOiAkSU9fTUVUSE9EIChtdXN0IGJl IGlvX3VyaW5nLCB3b3JrZXIsIG9yIHN5bmMpIiA7Owplc2FjCgojIFZhbGlkYXRlIGRtX2RlbGF5 IGRldmljZSBpZiAtLWlvLWRlbGF5IGlzIHVzZWQKaWYgW1sgLW4gIiRJT19ERUxBWV9NUyIgXV07 IHRoZW4KICBjb21tYW5kIC12IGRtc2V0dXAgPi9kZXYvbnVsbCAyPiYxIHx8IGRpZSAiLS1pby1k ZWxheSByZXF1aXJlcyBkbXNldHVwIChzdWRvIGFwdCBpbnN0YWxsIGRtc2V0dXApIgogIHN1ZG8g ZG1zZXR1cCBzdGF0dXMgIiRETV9ERUxBWV9ERVYiID4vZGV2L251bGwgMj4mMSBcCiAgICB8fCBk aWUgImRtX2RlbGF5IGRldmljZSAnJERNX0RFTEFZX0RFVicgbm90IGZvdW5kLiBDcmVhdGUgaXQg Zmlyc3QsIGUuZy46XG4gIHVtb3VudCAvc3J2ICYmIGRtc2V0dXAgY3JlYXRlICRETV9ERUxBWV9E RVYgLS10YWJsZSBcIjAgXCQoYmxvY2tkZXYgLS1nZXRzeiAvZGV2L0RFVklDRSkgZGVsYXkgL2Rl di9ERVZJQ0UgMCAkSU9fREVMQVlfTVNcIiAmJiBtb3VudCAvZGV2L21hcHBlci8kRE1fREVMQVlf REVWIC9zcnYvIgpmaQoKW1sgLXogIiRQQVRDSCIgXV0gJiYgZGllICJVc2FnZTogJDAgWy0tY2xl YW5dIFstLWJhc2VsaW5lXSBbLS10ZXN0IFRFU1RdIDxwYXRjaD4iCltbICEgLWYgIiRQQVRDSCIg XV0gJiYgZGllICJQYXRjaCBub3QgZm91bmQ6ICRQQVRDSCIKW1sgIiRQQVRDSCIgIT0gLyogXV0g JiYgUEFUQ0g9IiRQV0QvJFBBVENIIgoKIyAtLS0gUHJvZmlsaW5nIHZhbGlkYXRpb24gLS0tCkZM QU1FR1JBUEhfRElSPSIke0ZMQU1FR1JBUEhfRElSOi0kSE9NRS9GbGFtZUdyYXBofSIKUEVSRl9T VURPPSIke1BFUkZfU1VETzotc3Vkb30iClBFUkZfRVZFTlQ9IiR7UEVSRl9FVkVOVDotY3ljbGVz fSIgICMgY3ljbGVzID0gdXNlcitrZXJuZWw7IGN5Y2xlczp1ID0gdXNlci1vbmx5CmlmIFtbICRE T19QUk9GSUxFIC1lcSAxIF1dOyB0aGVuCiAgY29tbWFuZCAtdiBwZXJmID4vZGV2L251bGwgMj4m MSB8fCBkaWUgIk5lZWQgcGVyZiAoc3VkbyBhcHQgaW5zdGFsbCBsaW51eC10b29scy0kKHVuYW1l IC1yKSkiCiAgW1sgLXggIiRGTEFNRUdSQVBIX0RJUi9zdGFja2NvbGxhcHNlLXBlcmYucGwiIF1d IHx8IGRpZSAiTWlzc2luZyAkRkxBTUVHUkFQSF9ESVIvc3RhY2tjb2xsYXBzZS1wZXJmLnBsIChn aXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL2JyZW5kYW5ncmVnZy9GbGFtZUdyYXBoKSIKICBb WyAteCAiJEZMQU1FR1JBUEhfRElSL2ZsYW1lZ3JhcGgucGwiIF1dIHx8IGRpZSAiTWlzc2luZyAk RkxBTUVHUkFQSF9ESVIvZmxhbWVncmFwaC5wbCIKZmkKCiMgLS0tIENvbmZpZ3VyYXRpb24gLS0t CldPUktST09UPSIke1dPUktST09UOi0kSE9NRS9wZ19iZW5jaH0iClJFUFM9IiR7UkVQUzotNX0i ClNJWkVTPSIke1NJWkVTOi1sYXJnZX0iCgpST09UX0JBU0U9IiRXT1JLUk9PVC92YW5pbGxhIgpQ QVRDSF9UQUc9JChiYXNlbmFtZSAiJFBBVENIIiAucGF0Y2ggfCB0ciAtZGMgJ1s6YWxudW06XV8t JyB8IGN1dCAtYzEtNDApClJPT1RfUEFUQ0g9IiRXT1JLUk9PVC8kUEFUQ0hfVEFHIgoKIyAtLS0g SGVscGVycyAtLS0KcGcoKSB7IGVjaG8gIiQxL3BnL2Jpbi8kMiI7IH0KCnBpY2tfcG9ydCgpIHsK ICBmb3IgcCBpbiAkKHNlcSAiJHsxOi01NDMyfSIgNjAwMDApOyBkbwogICAgbHNvZiAtaVRDUDoi JHAiIC1zVENQOkxJU1RFTiA+L2Rldi9udWxsIDI+JjEgfHwgeyBlY2hvICIkcCI7IHJldHVybjsg fQogIGRvbmUKICBkaWUgIk5vIGZyZWUgcG9ydCBmb3VuZCIKfQoKc2V0X2lvX2RlbGF5KCkgewog IGxvY2FsIG1zPSIkMSIKICBbWyAteiAiJElPX0RFTEFZX01TIiBdXSAmJiByZXR1cm4KICBsb2Nh bCB0YWJsZSBzaXplIGRldgogIHRhYmxlPSQoc3VkbyBkbXNldHVwIHRhYmxlICIkRE1fREVMQVlf REVWIikKICBzaXplPSQoZWNobyAiJHRhYmxlIiB8IGF3ayAne3ByaW50ICQyfScpCiAgZGV2PSQo ZWNobyAiJHRhYmxlIiB8IGF3ayAne3ByaW50ICQ0fScpCiAgbG9nICJTZXR0aW5nIGRtX2RlbGF5 IG9uICRETV9ERUxBWV9ERVYgdG8gJHttc31tcyByZWFkIC8gMG1zIHdyaXRlIgogIHN1ZG8gZG1z ZXR1cCBzdXNwZW5kICIkRE1fREVMQVlfREVWIgogIHN1ZG8gZG1zZXR1cCByZWxvYWQgIiRETV9E RUxBWV9ERVYiIC0tdGFibGUgIjAgJHNpemUgZGVsYXkgJGRldiAwICRtcyAkZGV2IDAgMCIKICBz dWRvIGRtc2V0dXAgcmVzdW1lICIkRE1fREVMQVlfREVWIgp9CgojIC0tLSBCdWlsZCBQb3N0Z3Jl U1FMIC0tLQpidWlsZF9wZygpIHsKICBsb2NhbCBST09UPSIkMSIgUEFUQ0hfRklMRT0iJHsyOi19 IgogIAogIFtbICRDTEVBTiAtZXEgMSBdXSAmJiBybSAtcmYgIiRST09UIgogIAogIGlmIFtbICEg LXggIiQocGcgIiRST09UIiBpbml0ZGIpIiBdXTsgdGhlbgogICAgbG9nICJCdWlsZGluZyBQb3N0 Z3JlU1FMOiAkUk9PVCIKICAgIG1rZGlyIC1wICIkUk9PVCIKICAgIAogICAgZ2l0IGNsb25lIC0t ZGVwdGggMSBodHRwczovL2dpdGh1Yi5jb20vcG9zdGdyZXMvcG9zdGdyZXMgIiRST09UL3NyYyIg Mj4vZGV2L251bGwKICAgIGNkICIkUk9PVC9zcmMiCiAgICAKICAgIFtbIC1uICIkUEFUQ0hfRklM RSIgXV0gJiYgeyBsb2cgIkFwcGx5aW5nIHBhdGNoIjsgZ2l0IGFwcGx5ICIkUEFUQ0hfRklMRSI7 IH0KICAgIAogICAgLi9jb25maWd1cmUgLS1wcmVmaXg9IiRST09UL3BnIiAtLXdpdGgtbGlidXJp bmcgXAogICAgICBDRkxBR1M9Jy1PMiAtZ2dkYjMgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXInID4v ZGV2L251bGwgMj4mMQogICAgCiAgICBtYWtlIC1qIiQobnByb2MpIiBpbnN0YWxsID4vZGV2L251 bGwgMj4mMQogIGVsc2UKICAgIGxvZyAiUmV1c2luZyBidWlsZDogJFJPT1QiCiAgICBjZCAiJFJP T1Qvc3JjIgogIGZpCiAgCiAgIyBBbHdheXMgaW5zdGFsbCBjb250cmlicyAoaWRlbXBvdGVudCwg Y2F0Y2hlcyByZXVzZWQgYnVpbGRzIG1pc3NpbmcgbmV3IGV4dGVuc2lvbnMpCiAgbWFrZSAtQyBj b250cmliL2Jsb29tIGluc3RhbGwgPi9kZXYvbnVsbCAyPiYxCiAgbWFrZSAtQyBjb250cmliL3Bn c3RhdHR1cGxlIGluc3RhbGwgPi9kZXYvbnVsbCAyPiYxCiAgbWFrZSAtQyBjb250cmliL3BnX2J1 ZmZlcmNhY2hlIGluc3RhbGwgPi9kZXYvbnVsbCAyPiYxCiAgbWFrZSAtQyBjb250cmliL3BnX3By ZXdhcm0gaW5zdGFsbCA+L2Rldi9udWxsIDI+JjEKfQoKIyAtLS0gQ2x1c3RlciBtYW5hZ2VtZW50 IC0tLQppbml0X2NsdXN0ZXIoKSB7CiAgbG9jYWwgUk9PVD0iJDEiIFBPUlQ9IiQyIgogIAogIHJt IC1yZiAiJFJPT1QvZGF0YSIKICAiJChwZyAiJFJPT1QiIGluaXRkYikiIC1EICIkUk9PVC9kYXRh IiAtLW5vLWxvY2FsZSA+L2Rldi9udWxsIDI+JjEKICAKICBjYXQgPj4gIiRST09UL2RhdGEvcG9z dGdyZXNxbC5jb25mIiA8PEVPRgpwb3J0ID0gJFBPUlQKbGlzdGVuX2FkZHJlc3NlcyA9ICcxMjcu MC4wLjEnCnNoYXJlZF9idWZmZXJzID0gJzMyR0InCmVmZmVjdGl2ZV9pb19jb25jdXJyZW5jeSA9 IDIwMAppb19tZXRob2QgPSAkSU9fTUVUSE9ECmlvX3dvcmtlcnMgPSAkSU9fV09SS0VSUwppb19t YXhfY29uY3VycmVuY3kgPSAkSU9fTUFYX0NPTkNVUlJFTkNZCnRyYWNrX2lvX3RpbWluZyA9IG9u CnRyYWNrX3dhbF9pb190aW1pbmcgPSBvbgpzeW5jaHJvbm91c19jb21taXQgPSBvbgphdXRvdmFj dXVtID0gb2ZmCmNoZWNrcG9pbnRfdGltZW91dCA9IDFoCm1heF93YWxfc2l6ZSA9IDEwR0IKbWF4 X3BhcmFsbGVsX3dvcmtlcnNfcGVyX2dhdGhlciA9IDAKRU9GCiAgCiAgW1sgJERJUkVDVF9JTyAt ZXEgMSBdXSAmJiBlY2hvICJkZWJ1Z19pb19kaXJlY3QgPSBkYXRhIiA+PiAiJFJPT1QvZGF0YS9w b3N0Z3Jlc3FsLmNvbmYiCiAgCiAgIiQocGcgIiRST09UIiBwZ19jdGwpIiAtRCAiJFJPT1QvZGF0 YSIgLWwgIiRST09UL3NlcnZlci5sb2ciIHN0YXJ0IC13ID4vZGV2L251bGwKICAKICBwc3FsX3J1 biAiJFJPT1QiICIkUE9SVCIgLWMgIkNSRUFURSBFWFRFTlNJT04gSUYgTk9UIEVYSVNUUyBwZ19i dWZmZXJjYWNoZTsiCiAgcHNxbF9ydW4gIiRST09UIiAiJFBPUlQiIC1jICJDUkVBVEUgRVhURU5T SU9OIElGIE5PVCBFWElTVFMgcGdfcHJld2FybTsiCn0KCnN0b3BfY2x1c3RlcigpIHsKICBsb2Nh bCBST09UPSIkMSIKICAiJChwZyAiJFJPT1QiIHBnX2N0bCkiIC1EICIkUk9PVC9kYXRhIiBzdG9w IC1tIGZhc3QgMj4vZGV2L251bGwgfHwgdHJ1ZQp9Cgpkcm9wX2NhY2hlcygpIHsKICBsb2NhbCBS T09UPSIkMSIgUE9SVD0iJDIiCiAgc2hpZnQgMgogIGxvY2FsIHJlbHM9KCIkQCIpCiAgCiAgIyBF dmljdCB0YXJnZXQgcmVsYXRpb25zIGZyb20gc2hhcmVkIGJ1ZmZlcnMgKG5vIFBHIHJlc3RhcnQg bmVlZGVkKQogIGZvciByZWwgaW4gIiR7cmVsc1tAXX0iOyBkbwogICAgcHNxbF9ydW4gIiRST09U IiAiJFBPUlQiIC1jICJTRUxFQ1QgcGdfYnVmZmVyY2FjaGVfZXZpY3RfcmVsYXRpb24oJyR7cmVs fSc6OnJlZ2NsYXNzKTsiID4vZGV2L251bGwKICBkb25lCiAgCiAgIyBEcm9wIE9TIHBhZ2UgY2Fj aGUgKHNraXAgd2l0aCBkaXJlY3QgSU8g4oCUIG5vIHBhZ2UgY2FjaGUgaW52b2x2ZWQpCiAgaWYg W1sgJERJUkVDVF9JTyAtZXEgMCBdXTsgdGhlbgogICAgc3luYwogICAgZWNobyAzIHwgc3VkbyB0 ZWUgL3Byb2Mvc3lzL3ZtL2Ryb3BfY2FjaGVzID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICBz bGVlcCAyCiAgZmkKfQoKcHNxbF9ydW4oKSB7CiAgbG9jYWwgUk9PVD0iJDEiIFBPUlQ9IiQyIgog IHNoaWZ0IDIKICAiJChwZyAiJFJPT1QiIHBzcWwpIiAtaCAxMjcuMC4wLjEgLXAgIiRQT1JUIiAt ZCBwb3N0Z3JlcyAtdiBPTl9FUlJPUl9TVE9QPTEgLUF0cSAiJEAiCn0KCiMgLS0tIFRpbWluZyAt LS0KcnVuX3RpbWVkKCkgewogIGxvY2FsIFJPT1Q9IiQxIiBQT1JUPSIkMiIgU1FMPSIkMyIKICBs b2NhbCBtcwogICMgLVg6IGlnbm9yZSAucHNxbHJjLCAtdiBPTl9FUlJPUl9TVE9QPTE6IGZhaWwg b24gU1FMIGVycm9ycwogICMgUGFyc2UgbGFzdCBUaW1lOiBsaW5lLCBoYW5kbGUgYm90aCAibXMi IGFuZCAicyIgdW5pdHMKICBtcz0kKCIkKHBnICIkUk9PVCIgcHNxbCkiIC1oIDEyNy4wLjAuMSAt cCAiJFBPUlQiIC1kIHBvc3RncmVzIC1YIC12IE9OX0VSUk9SX1NUT1A9MSAtQXQgXAogICAgLWMg J1x0aW1pbmcgb24nIC1jICIkU1FMIiAyPiYxIHwgXAogICAgYXdrICcKICAgICAgL1RpbWU6LyB7 CiAgICAgICAgdmFsPSQyOyB1bml0PSQzOwogICAgICAgIGlmICh1bml0PT0ibXMiKSBtcz12YWw7 CiAgICAgICAgZWxzZSBpZiAodW5pdD09InMiKSBtcz12YWwqMTAwMDsKICAgICAgfQogICAgICBF TkQgeyBpZiAobXM9PSIiKSBleGl0IDE7IHByaW50ZiAiJS4zZlxuIiwgbXM7IH0KICAgICcpCiAg IyBWYWxpZGF0ZSBudW1lcmljIG91dHB1dAogIFtbICIkbXMiID1+IF5bMC05XSsoXC5bMC05XSsp PyQgXV0gfHwgeyBlY2hvICJFUlJPUjogTm9uLW51bWVyaWMgdGltaW5nOiAkbXMiID4mMjsgcmV0 dXJuIDE7IH0KICBlY2hvICIkbXMiCn0KCiMgLS0tIEkvTyBTdGF0cyAtLS0KIyBSdW4gU1FMIGFu ZCBjYXB0dXJlIHRpbWluZyArIEkvTyBzdGF0cyBmcm9tIHBnX3N0YXRfaW8KIyBSZXNldHMgc3Rh dHMgYmVmb3JlIHF1ZXJ5LCB3YWl0cyBmb3IgZmx1c2gsIHRoZW4gcmVhZHMgYWJzb2x1dGUgdmFs dWVzCiMgTm90ZTogcGdfc3RhdF9pbyBoYXMgUEdTVEFUX01JTl9JTlRFUlZBTD0xMDAwbXMgZmx1 c2ggZGVsYXksIHNvIHdlIHdhaXQgMS41cwojICAgICAgIGFmdGVyIHRoZSBxdWVyeSB0byBlbnN1 cmUgc3RhdHMgYXJlIGZsdXNoZWQgdG8gc2hhcmVkIG1lbW9yeS4KIyBOb3RlOiBwZ19zdGF0X2lv IGNvdW50cyBJL08gb3BlcmF0aW9ucywgbm90IHBhZ2VzICh3aXRoIGlvX2NvbWJpbmVfbGltaXQ9 MTI4a0IsCiMgICAgICAgdXAgdG8gMTYgcGFnZXMgcGVyIG9wZXJhdGlvbikuIFRoaXMgaXMgZXhw ZWN0ZWQgYmVoYXZpb3IuCiMgUmV0dXJuczogbXMscmVhZHMscmVhZF90aW1lCnJ1bl90aW1lZF93 aXRoX2lvKCkgewogIGxvY2FsIFJPT1Q9IiQxIiBQT1JUPSIkMiIgU1FMPSIkMyIKICBsb2NhbCBy ZXN1bHQKICAKICAjIFJlc2V0IHN0YXRzLCBydW4gcXVlcnksIHdhaXQgZm9yIGZsdXNoLCByZWFk IGFic29sdXRlIHZhbHVlcwogICMgLSBGaWx0ZXIgYnkgY2xpZW50IGJhY2tlbmQgYW5kIGlvIHdv cmtlciAoZXhjbHVkZXMgYmd3cml0ZXIvY2hlY2twb2ludGVyKQogICMgLSAxLjVzIGRlbGF5IGFs bG93cyBzdGF0cyB0byBmbHVzaCAoUEdTVEFUX01JTl9JTlRFUlZBTD0xMDAwbXMpCiAgcmVzdWx0 PSQoIiQocGcgIiRST09UIiBwc3FsKSIgLWggMTI3LjAuMC4xIC1wICIkUE9SVCIgLWQgcG9zdGdy ZXMgLVggLXYgT05fRVJST1JfU1RPUD0xIDw8RU9TUUwKU0VMRUNUIHBnX3N0YXRfcmVzZXRfc2hh cmVkKCdpbycpOwpcXHRpbWluZyBvbgokU1FMClxcdGltaW5nIG9mZgpTRUxFQ1QgcGdfc2xlZXAo MS41KTsKXFx0IG9uClNFTEVDVCAKICBDT0FMRVNDRShTVU0ocmVhZHMpLDApOjpiaWdpbnQsCiAg Q09BTEVTQ0UoU1VNKHJlYWRfdGltZSksMCk6Om51bWVyaWMoMTIsMikKRlJPTSBwZ19zdGF0X2lv IApXSEVSRSBvYmplY3QgPSAncmVsYXRpb24nIEFORCBiYWNrZW5kX3R5cGUgSU4gKCdjbGllbnQg YmFja2VuZCcsICdpbyB3b3JrZXInKTsKRU9TUUwKICAyPiYxKQogIAogICMgUGFyc2UgdGltaW5n IChsYXN0IFRpbWU6IGxpbmUpCiAgbG9jYWwgbXMKICBtcz0kKGVjaG8gIiRyZXN1bHQiIHwgYXdr ICcKICAgIC9UaW1lOi8gewogICAgICB2YWw9JDI7IHVuaXQ9JDM7CiAgICAgIGlmICh1bml0PT0i bXMiKSBtcz12YWw7CiAgICAgIGVsc2UgaWYgKHVuaXQ9PSJzIikgbXM9dmFsKjEwMDA7CiAgICB9 CiAgICBFTkQgeyBpZiAobXM9PSIiKSBleGl0IDE7IHByaW50ZiAiJS4zZlxuIiwgbXM7IH0KICAn KQogIAogICMgUGFyc2UgSS9PIHN0YXRzIChsYXN0IG5vbi1lbXB0eSBsaW5lIHdpdGggcGlwZSBz ZXBhcmF0b3I6IHJlYWRzfHJlYWRfdGltZSkKICBsb2NhbCByZWFkcyByZWFkX3RpbWUKICBsb2Nh bCBpb19saW5lCiAgaW9fbGluZT0kKGVjaG8gIiRyZXN1bHQiIHwgZ3JlcCAnfCcgfCB0YWlsIC0x KQogIHJlYWRzPSQoZWNobyAiJGlvX2xpbmUiIHwgY3V0IC1kJ3wnIC1mMSB8IHRyIC1kICcgJykK ICByZWFkX3RpbWU9JChlY2hvICIkaW9fbGluZSIgfCBjdXQgLWQnfCcgLWYyIHwgdHIgLWQgJyAn KQogIAogICMgRGVmYXVsdCB0byAwIGlmIG5vdCBmb3VuZAogIFtbICIkcmVhZHMiID1+IF4tP1sw LTldKyQgXV0gfHwgcmVhZHM9MAogIFtbICIkcmVhZF90aW1lIiA9fiBeLT9bMC05XSsoXC5bMC05 XSspPyQgXV0gfHwgcmVhZF90aW1lPTAKICAKICBlY2hvICIkbXMsJHJlYWRzLCRyZWFkX3RpbWUi Cn0KCiMgLS0tIFN0YXRpc3RpY3MgLS0tCmNhbGNfbWVkaWFuKCkgewogIGF3ayAtRiwgJ05SPjF7 YVsrK25dPSQyfUVORHsKICAgIGlmKG49PTApe3ByaW50IDA7IGV4aXR9CiAgICBmb3IoaT0xO2k8 PW47aSsrKWZvcihqPWkrMTtqPD1uO2orKylpZihhW2ldPmFbal0pe3Q9YVtpXTthW2ldPWFbal07 YVtqXT10fQogICAgcHJpbnQgKG4lMik/YVtpbnQobi8yKSsxXTooYVtuLzJdK2Fbbi8yKzFdKS8y CiAgfScgIiQxIgp9CgpjYWxjX21lZGlhbl9jb2woKSB7CiAgbG9jYWwgZmlsZT0iJDEiIGNvbD0i JDIiCiAgYXdrIC1GLCAtdiBjb2w9IiRjb2wiICdOUj4xe2FbKytuXT0kY29sfUVORHsKICAgIGlm KG49PTApe3ByaW50IDA7IGV4aXR9CiAgICBmb3IoaT0xO2k8PW47aSsrKWZvcihqPWkrMTtqPD1u O2orKylpZihhW2ldPmFbal0pe3Q9YVtpXTthW2ldPWFbal07YVtqXT10fQogICAgcHJpbnQgKG4l Mik/YVtpbnQobi8yKSsxXTooYVtuLzJdK2Fbbi8yKzFdKS8yCiAgfScgIiRmaWxlIgp9CgpjYWxj X3N0YXRzKCkgewogIGxvY2FsIGNzdj0iJDEiCiAgYXdrIC1GLCAnTlI+MXthWysrbl09JDI7cys9 JDJ9RU5EewogICAgaWYobj09MClleGl0CiAgICBmb3IoaT0xO2k8PW47aSsrKWZvcihqPWkrMTtq PD1uO2orKylpZihhW2ldPmFbal0pe3Q9YVtpXTthW2ldPWFbal07YVtqXT10fQogICAgbWVkPShu JTIpP2FbaW50KG4vMikrMV06KGFbbi8yXSthW24vMisxXSkvMgogICAgYXZnPXMvbjsgZm9yKGk9 MTtpPD1uO2krKylzcys9KGFbaV0tYXZnKV4yOyBzZD1zcXJ0KHNzL24pCiAgICBwcmludGYgIm1l ZGlhbj0lLjFmbXMgbWVhbj0lLjFmwrElLjFmbXMgbj0lZCIsIG1lZCwgYXZnLCBzZCwgbgogIH0n ICIkY3N2Igp9CgojIC0tLSBQcm9maWxpbmcgLS0tCiMgUnVuIGEgU1FMIGNvbW1hbmQgdW5kZXIg cGVyZiwgYXR0YWNoaW5nIHRvIHRoZSBiYWNrZW5kIFBJRC4KIyBHZW5lcmF0ZXMgcGVyZi5kYXRh IGFuZCBmbGFtZWdyYXBoIFNWRy4KIyAgIHByb2ZpbGVfc3FsIFJPT1QgUE9SVCBMQUJFTCBTUUwK cHJvZmlsZV9zcWwoKSB7CiAgW1sgJERPX1BST0ZJTEUgLW5lIDEgXV0gJiYgcmV0dXJuCiAgCiAg bG9jYWwgUk9PVD0iJDEiIFBPUlQ9IiQyIiBMQUJFTD0iJDMiIFNRTD0iJDQiCiAgbG9jYWwgUFJP Rl9ESVI9IiRST09UL3Byb2ZpbGUiCiAgbWtkaXIgLXAgIiRQUk9GX0RJUiIKICAKICBsb2NhbCBQ RVJGX0RBVEE9IiRQUk9GX0RJUi8ke0xBQkVMfS5wZXJmLmRhdGEiCiAgbG9jYWwgU1ZHPSIkUFJP Rl9ESVIvJHtMQUJFTH0uc3ZnIgogIGxvY2FsIHBzcWxfYmluCiAgcHNxbF9iaW49IiQocGcgIiRS T09UIiBwc3FsKSIKICAKICAjIFVzZSBhIHVuaXF1ZSBhcHBsaWNhdGlvbl9uYW1lIHRvIGZpbmQg dGhlIGJhY2tlbmQgUElECiAgbG9jYWwgQVBQPSJwcm9mXyR7TEFCRUx9XyQkIgogIAogICMgTGF1 bmNoIGEgcHNxbCBzZXNzaW9uIHRoYXQgd2lsbCBmaXJzdCBpZGVudGlmeSBpdHNlbGYsIHRoZW4g cnVuIHRoZSBTUUwKICAjIFRoZSBwZ19zbGVlcCgpIGdpdmVzIHVzIHRpbWUgdG8gZmluZCB0aGUg YmFja2VuZCBQSUQgYW5kIGF0dGFjaCBwZXJmCiAgUEdBUFBOQU1FPSIkQVBQIiAiJHBzcWxfYmlu IiAtaCAxMjcuMC4wLjEgLXAgIiRQT1JUIiAtZCBwb3N0Z3JlcyBcCiAgICAtWCAtdiBPTl9FUlJP Ul9TVE9QPTEgPDxFT1NRTCA+L2Rldi9udWxsIDI+JjEgJgpTRUxFQ1QgcGdfc2xlZXAoMik7CiRT UUwKRU9TUUwKICBsb2NhbCBRVUVSWV9TSEVMTF9QSUQ9JCEKICAKICAjIEZpbmQgdGhlIGJhY2tl bmQgUElEIHZpYSBwZ19zdGF0X2FjdGl2aXR5CiAgbG9jYWwgQkFDS0VORF9QSUQ9IiIKICBmb3Ig KChuPTA7IG48MTAwOyBuKyspKTsgZG8KICAgIEJBQ0tFTkRfUElEPSQoIiRwc3FsX2JpbiIgLWgg MTI3LjAuMC4xIC1wICIkUE9SVCIgLWQgcG9zdGdyZXMgLUF0cSBcCiAgICAgIC1jICJTRUxFQ1Qg cGlkIEZST00gcGdfc3RhdF9hY3Rpdml0eSBXSEVSRSBhcHBsaWNhdGlvbl9uYW1lPScke0FQUH0n IE9SREVSIEJZIGJhY2tlbmRfc3RhcnQgREVTQyBMSU1JVCAxOyIgMj4vZGV2L251bGwpCiAgICBb WyAtbiAiJEJBQ0tFTkRfUElEIiAmJiAtZCAiL3Byb2MvJEJBQ0tFTkRfUElEIiBdXSAmJiBicmVh awogICAgc2xlZXAgMC4wNQogIGRvbmUKICAKICBpZiBbWyAteiAiJEJBQ0tFTkRfUElEIiB8fCAh IC1kICIvcHJvYy8kQkFDS0VORF9QSUQiIF1dOyB0aGVuCiAgICBsb2cgIldBUk5JTkc6IENvdWxk IG5vdCBmaW5kIGJhY2tlbmQgUElEIGZvciBwcm9maWxpbmcsIHNraXBwaW5nIgogICAgd2FpdCAi JFFVRVJZX1NIRUxMX1BJRCIgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgcmV0dXJuCiAgZmkKICAK ICBsb2cgIlByb2ZpbGluZyBiYWNrZW5kIFBJRCAkQkFDS0VORF9QSUQg4oaSICRQRVJGX0RBVEEi CiAgCiAgIyBBdHRhY2ggcGVyZiB0byB0aGUgYmFja2VuZDsgd2UgZXhwbGljaXRseSBraWxsIC1J TlQgaXQgYWZ0ZXIgdGhlIHF1ZXJ5IGZpbmlzaGVzCiAgJFBFUkZfU1VETyBwZXJmIHJlY29yZCAt ZyAtLWNhbGwtZ3JhcGggZHdhcmYgXAogICAgLXAgIiRCQUNLRU5EX1BJRCIgLW8gIiRQRVJGX0RB VEEiIFwKICAgIC0tZXZlbnQ9IiRQRVJGX0VWRU5UIiAyPi9kZXYvbnVsbCAmCiAgbG9jYWwgUEVS Rl9QSUQ9JCEKICBzbGVlcCAwLjEKICAKICAjIFZlcmlmeSBwZXJmIGFjdHVhbGx5IHN0YXJ0ZWQg KHBlcm1pc3Npb25zLCB2YWxpZCBQSUQsIGV0Yy4pCiAgaWYgISBraWxsIC0wICIkUEVSRl9QSUQi IDI+L2Rldi9udWxsOyB0aGVuCiAgICBsb2cgIldBUk5JTkc6IHBlcmYgcmVjb3JkIGZhaWxlZCB0 byBzdGFydCAocGVybWlzc2lvbnMvY29uZmlnPyksIHNraXBwaW5nIGZsYW1lZ3JhcGgiCiAgICB3 YWl0ICIkUVVFUllfU0hFTExfUElEIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICByZXR1cm4KICBm aQogIAogICMgV2FpdCBmb3IgdGhlIHF1ZXJ5IHRvIGZpbmlzaAogIHdhaXQgIiRRVUVSWV9TSEVM TF9QSUQiIDI+L2Rldi9udWxsIHx8IHRydWUKICAKICAjIEdpdmUgcGVyZiBhIG1vbWVudCB0byBm bHVzaCwgdGhlbiBzdG9wIGl0CiAgc2xlZXAgMC41CiAgJFBFUkZfU1VETyBraWxsIC1JTlQgIiRQ RVJGX1BJRCIgMj4vZGV2L251bGwgfHwgdHJ1ZTsgd2FpdCAiJFBFUkZfUElEIiAyPi9kZXYvbnVs bCB8fCB0cnVlCiAgCiAgIyBHZW5lcmF0ZSBmbGFtZWdyYXBoCiAgZ2VuZXJhdGVfZmxhbWVncmFw aCAiJFBFUkZfREFUQSIgIiRTVkciICIkTEFCRUwiCn0KCiMgQ29udmVydCBwZXJmLmRhdGEg4oaS IGZsYW1lZ3JhcGggU1ZHCiMgICBnZW5lcmF0ZV9mbGFtZWdyYXBoIFBFUkZfREFUQSBTVkdfUEFU SCBUSVRMRQpnZW5lcmF0ZV9mbGFtZWdyYXBoKCkgewogIGxvY2FsIFBFUkZfREFUQT0iJDEiIFNW Rz0iJDIiIFRJVExFPSIkMyIKICAKICBbWyAtZiAiJFBFUkZfREFUQSIgXV0gfHwgcmV0dXJuCiAg CiAgbG9jYWwgRk9MREVEPSIke1BFUkZfREFUQSUucGVyZi5kYXRhfS5mb2xkZWQiCiAgaWYgJFBF UkZfU1VETyBwZXJmIHNjcmlwdCAtaSAiJFBFUkZfREFUQSIgMj4vZGV2L251bGwgXAogICAgICB8 ICIkRkxBTUVHUkFQSF9ESVIvc3RhY2tjb2xsYXBzZS1wZXJmLnBsIiA+ICIkRk9MREVEIiAyPi9k ZXYvbnVsbCBcCiAgICAgICYmIFtbIC1zICIkRk9MREVEIiBdXTsgdGhlbgogICAgIiRGTEFNRUdS QVBIX0RJUi9mbGFtZWdyYXBoLnBsIiAtLXRpdGxlICIkVElUTEUiIC0tY291bnRuYW1lIHNhbXBs ZXMgXAogICAgICAiJEZPTERFRCIgPiAiJFNWRyIgMj4vZGV2L251bGwKICAgIGxvZyAiRmxhbWVn cmFwaDogJFNWRyIKICAgIHJtIC1mICIkRk9MREVEIgogIGVsc2UKICAgIGxvZyAiV0FSTklORzog RmFpbGVkIHRvIGdlbmVyYXRlIGZsYW1lZ3JhcGggZm9yICRUSVRMRSIKICAgIHJtIC1mICIkRk9M REVEIgogIGZpCn0KCiMgLS0tIEJlbmNobWFyayBydW5uZXIgLS0tCiMgYmVuY2htYXJrIFJPT1Qg UE9SVCBOQU1FIFNRTCBSRUxBVElPTiBbUkVMQVRJT04uLi5dCmJlbmNobWFyaygpIHsKICBsb2Nh bCBST09UPSIkMSIgUE9SVD0iJDIiIE5BTUU9IiQzIiBTUUw9IiQ0IgogIHNoaWZ0IDQKICBsb2Nh bCByZWxzPSgiJEAiKQogIGxvY2FsIE9VVD0iJFJPT1QvcmVzdWx0cy8ke05BTUV9LmNzdiIKICAK ICBta2RpciAtcCAiJFJPT1QvcmVzdWx0cyIKICBlY2hvICJydW4sbXMscmVhZHMscmVhZF90aW1l X21zIiA+ICIkT1VUIgogIAogIGZvciAoKGk9MTsgaTw9UkVQUzsgaSsrKSk7IGRvCiAgICBkcm9w X2NhY2hlcyAiJFJPT1QiICIkUE9SVCIgIiR7cmVsc1tAXX0iCiAgICBsb2NhbCByZXN1bHQgbXMg cmVhZHMgcmVhZF90aW1lCiAgICByZXN1bHQ9JChydW5fdGltZWRfd2l0aF9pbyAiJFJPT1QiICIk UE9SVCIgIiRTUUwiKQogICAgSUZTPScsJyByZWFkIC1yIG1zIHJlYWRzIHJlYWRfdGltZSA8PDwi JHJlc3VsdCIKICAgIGVjaG8gIiRpLCRtcywkcmVhZHMsJHJlYWRfdGltZSIgPj4gIiRPVVQiCiAg ICBsb2cgIiROQU1FIFskaS8kUkVQU106ICR7bXN9bXMgKHJlYWRzPSRyZWFkcywgaW9fdGltZT0k e3JlYWRfdGltZX1tcykiCiAgZG9uZQp9CgojIC0tLSBEYXRhIHNldHVwIGZ1bmN0aW9ucyAtLS0K c2V0dXBfYmxvb20oKSB7CiAgbG9jYWwgUk9PVD0iJDEiIFBPUlQ9IiQyIiBTSVpFPSIkMyIKICBs b2NhbCBOUk9XUwogIGNhc2UgIiRTSVpFIiBpbgogICAgc21hbGwpICBOUk9XUz0xMDAwMDAgOzsK ICAgIG1lZGl1bSkgTlJPV1M9MTAwMDAwMCA7OwogICAgbGFyZ2UpICBOUk9XUz0xMDAwMDAwMCA7 OwogIGVzYWMKICAKICBsb2cgIkNyZWF0aW5nIEJsb29tIHRlc3QgZGF0YSAoJFNJWkU6ICROUk9X UyByb3dzKSIKICBwc3FsX3J1biAiJFJPT1QiICIkUE9SVCIgPDxTUUwKQ1JFQVRFIEVYVEVOU0lP TiBJRiBOT1QgRVhJU1RTIGJsb29tOwpEUk9QIFRBQkxFIElGIEVYSVNUUyBibG9vbV90ZXN0OwpD UkVBVEUgVEFCTEUgYmxvb21fdGVzdCAoaWQgSU5ULCBkYXRhIFRFWFQsIHZhbDEgSU5ULCB2YWwy IElOVCk7CklOU0VSVCBJTlRPIGJsb29tX3Rlc3QgU0VMRUNUIGksICdkYXRhXyd8fGksIGklMTAw MCwgaSUxMDAgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwkTlJPV1MpIGk7CkNSRUFURSBJTkRFWCBi bG9vbV9pZHggT04gYmxvb21fdGVzdCBVU0lORyBibG9vbSAodmFsMSwgdmFsMik7ClZBQ1VVTSBB TkFMWVpFIGJsb29tX3Rlc3Q7CkNIRUNLUE9JTlQ7ClNRTAp9CgpzZXR1cF9wZ3N0YXR0dXBsZSgp IHsKICBsb2NhbCBST09UPSIkMSIgUE9SVD0iJDIiIFNJWkU9IiQzIgogIGxvY2FsIE5ST1dTCiAg Y2FzZSAiJFNJWkUiIGluCiAgICBzbWFsbCkgIE5ST1dTPTEwMDAwMCA7OwogICAgbWVkaXVtKSBO Uk9XUz0xMDAwMDAwIDs7CiAgICBsYXJnZSkgIE5ST1dTPTEwMDAwMDAwIDs7CiAgZXNhYwogIAog IGxvZyAiQ3JlYXRpbmcgcGdzdGF0dHVwbGUgdGVzdCBkYXRhICgkU0laRTogJE5ST1dTIHJvd3Mp IgogIHBzcWxfcnVuICIkUk9PVCIgIiRQT1JUIiA8PFNRTApDUkVBVEUgRVhURU5TSU9OIElGIE5P VCBFWElTVFMgcGdzdGF0dHVwbGU7CkRST1AgVEFCTEUgSUYgRVhJU1RTIGhlYXBfdGVzdDsKQ1JF QVRFIFRBQkxFIGhlYXBfdGVzdCAoaWQgU0VSSUFMIFBSSU1BUlkgS0VZLCBkYXRhIFRFWFQpOwpJ TlNFUlQgSU5UTyBoZWFwX3Rlc3QgKGRhdGEpIFNFTEVDVCByZXBlYXQoJ3gnLDEwMCkgRlJPTSBn ZW5lcmF0ZV9zZXJpZXMoMSwkTlJPV1MpOwpWQUNVVU0gQU5BTFlaRSBoZWFwX3Rlc3Q7CkNIRUNL UE9JTlQ7ClNRTAp9CgpzZXR1cF9wZ3N0YXRpbmRleCgpIHsKICBsb2NhbCBST09UPSIkMSIgUE9S VD0iJDIiIFNJWkU9IiQzIgogIGxvY2FsIE5ST1dTCiAgY2FzZSAiJFNJWkUiIGluCiAgICBzbWFs bCkgIE5ST1dTPTEwMDAwMCA7OwogICAgbWVkaXVtKSBOUk9XUz0xMDAwMDAwIDs7CiAgICBsYXJn ZSkgIE5ST1dTPTEwMDAwMDAwIDs7CiAgZXNhYwogIAogIGxvZyAiQ3JlYXRpbmcgcGdzdGF0aW5k ZXggdGVzdCBkYXRhICgkU0laRTogJE5ST1dTIHJvd3MpIgogIHBzcWxfcnVuICIkUk9PVCIgIiRQ T1JUIiA8PFNRTApDUkVBVEUgRVhURU5TSU9OIElGIE5PVCBFWElTVFMgcGdzdGF0dHVwbGU7CkRS T1AgVEFCTEUgSUYgRVhJU1RTIGlkeF90ZXN0OwpDUkVBVEUgVEFCTEUgaWR4X3Rlc3QgKGlkIFNF UklBTCBQUklNQVJZIEtFWSwgZGF0YSBURVhUKTsKSU5TRVJUIElOVE8gaWR4X3Rlc3QgKGRhdGEp IFNFTEVDVCAnZGF0YV9yb3dfJyB8fCBpIHx8ICdfJyB8fCByZXBlYXQoJ3gnLDUwKSBGUk9NIGdl bmVyYXRlX3NlcmllcygxLCROUk9XUykgaTsKVkFDVVVNIEFOQUxZWkUgaWR4X3Rlc3Q7CkNIRUNL UE9JTlQ7ClNRTAp9CgpzZXR1cF9naW4oKSB7CiAgbG9jYWwgUk9PVD0iJDEiIFBPUlQ9IiQyIiBT SVpFPSIkMyIKICBsb2NhbCBOUk9XUwogIGNhc2UgIiRTSVpFIiBpbgogICAgc21hbGwpICBOUk9X Uz0xMDAwMDAgOzsKICAgIG1lZGl1bSkgTlJPV1M9MTAwMDAwMCA7OwogICAgbGFyZ2UpICBOUk9X Uz01MDAwMDAwIDs7CiAgZXNhYwogIAogIGxvZyAiQ3JlYXRpbmcgR0lOIHRlc3QgZGF0YSAoJFNJ WkU6ICROUk9XUyByb3dzKSIKICBwc3FsX3J1biAiJFJPT1QiICIkUE9SVCIgPDxTUUwKRFJPUCBU QUJMRSBJRiBFWElTVFMgZ2luX3Rlc3Q7Ci0tIE5vIFBSSU1BUlkgS0VZOiBpc29sYXRlIEdJTiBp bmRleCB2YWN1dW0gZnJvbSBidHJlZSBvdmVyaGVhZApDUkVBVEUgVEFCTEUgZ2luX3Rlc3QgKGlk IElOVCwgdGFncyBURVhUW10pOwpJTlNFUlQgSU5UTyBnaW5fdGVzdCAoaWQsIHRhZ3MpClNFTEVD VCBpLCBBUlJBWShTRUxFQ1QgJ3RhZ18nfHwocmFuZG9tKCkqMTAwKTo6aW50IEZST00gZ2VuZXJh dGVfc2VyaWVzKDEsNSkpCkZST00gZ2VuZXJhdGVfc2VyaWVzKDEsJE5ST1dTKSBpOwpDUkVBVEUg SU5ERVggZ2luX2lkeCBPTiBnaW5fdGVzdCBVU0lORyBnaW4gKHRhZ3MpOwpWQUNVVU0gQU5BTFla RSBnaW5fdGVzdDsKQ0hFQ0tQT0lOVDsKU1FMCn0KCnNldHVwX2hhc2goKSB7CiAgbG9jYWwgUk9P VD0iJDEiIFBPUlQ9IiQyIiBTSVpFPSIkMyIKICBsb2NhbCBOUk9XUwogIGNhc2UgIiRTSVpFIiBp bgogICAgc21hbGwpICBOUk9XUz01MDAwMDAgOzsKICAgIG1lZGl1bSkgTlJPV1M9NTAwMDAwMCA7 OwogICAgbGFyZ2UpICBOUk9XUz0yMDAwMDAwMCA7OwogIGVzYWMKICAKICBsb2cgIkNyZWF0aW5n IEhhc2ggdGVzdCBkYXRhICgkU0laRTogJE5ST1dTIHVuaXF1ZSB2YWx1ZXMpIgogIHBzcWxfcnVu ICIkUk9PVCIgIiRQT1JUIiA8PFNRTApEUk9QIFRBQkxFIElGIEVYSVNUUyBoYXNoX3Rlc3Q7Ci0t IE5vIFBSSU1BUlkgS0VZOiBpc29sYXRlIGhhc2ggaW5kZXggdmFjdXVtIGZyb20gYnRyZWUgb3Zl cmhlYWQKQ1JFQVRFIFRBQkxFIGhhc2hfdGVzdCAoaWQgSU5ULCBkYXRhIFRFWFQpOwpJTlNFUlQg SU5UTyBoYXNoX3Rlc3QgU0VMRUNUIGksICd4JyBGUk9NIGdlbmVyYXRlX3NlcmllcygxLCROUk9X UykgaTsKQ1JFQVRFIElOREVYIGhhc2hfaWR4IE9OIGhhc2hfdGVzdCBVU0lORyBoYXNoIChpZCk7 ClZBQ1VVTSBBTkFMWVpFIGhhc2hfdGVzdDsKQ0hFQ0tQT0lOVDsKU1FMCn0KCnNldHVwX3dhbCgp IHsKICBsb2NhbCBST09UPSIkMSIgUE9SVD0iJDIiIFNJWkU9IiQzIgogIGxvY2FsIE5ST1dTCiAg Y2FzZSAiJFNJWkUiIGluCiAgICBzbWFsbCkgIE5ST1dTPTEwMDAwMDAgOzsKICAgIG1lZGl1bSkg TlJPV1M9NTAwMDAwMCA7OwogICAgbGFyZ2UpICBOUk9XUz0yMDAwMDAwMCA7OwogIGVzYWMKICAK ICBsb2cgIkNyZWF0aW5nIHRhYmxlIGZvciBHSU4gaW5kZXggYnVpbGQgLyBsb2dfbmV3cGFnZV9y YW5nZSB0ZXN0ICgkU0laRTogJE5ST1dTIHJvd3MpIgogIHBzcWxfcnVuICIkUk9PVCIgIiRQT1JU IiA8PFNRTApEUk9QIFRBQkxFIElGIEVYSVNUUyB3YWxfdGVzdDsKLS0gVGFibGUgd2l0aCB0c3Zl Y3RvciBjb2x1bW4gZm9yIEdJTiBpbmRleGluZyAoZnVsbC10ZXh0IHNlYXJjaCkKLS0gR0lOIGlu ZGV4IGJ1aWxkcyBhbHdheXMgY2FsbCBsb2dfbmV3cGFnZV9yYW5nZSgpIGF0IHRoZSBlbmQgb2YK LS0gZ2luYnVpbGQoKSAoZ2luaW5zZXJ0LmMpIHRvIFdBTC1sb2cgYWxsIGluZGV4IHBhZ2VzLiAK Q1JFQVRFIFRBQkxFIHdhbF90ZXN0IChpZCBJTlQsIGRvYyBURVhULCBkb2NfdHN2IFRTVkVDVE9S KTsKSU5TRVJUIElOVE8gd2FsX3Rlc3QKICBTRUxFQ1QgaSwKICAgICAgICAgJ3dvcmQnIHx8IChy YW5kb20oKSoxMDAwMCk6OmludCB8fCAnIHRlcm0nIHx8IChyYW5kb20oKSoxMDAwMCk6OmludAog ICAgICAgICAgIHx8ICcgdG9rZW4nIHx8IChyYW5kb20oKSo1MDAwKTo6aW50IHx8ICcgcGhyYXNl JyB8fCAocmFuZG9tKCkqODAwMCk6OmludCwKICAgICAgICAgdG9fdHN2ZWN0b3IoJ3NpbXBsZScs CiAgICAgICAgICAgJ3dvcmQnIHx8IChyYW5kb20oKSoxMDAwMCk6OmludCB8fCAnIHRlcm0nIHx8 IChyYW5kb20oKSoxMDAwMCk6OmludAogICAgICAgICAgIHx8ICcgdG9rZW4nIHx8IChyYW5kb20o KSo1MDAwKTo6aW50IHx8ICcgcGhyYXNlJyB8fCAocmFuZG9tKCkqODAwMCk6OmludCkKICBGUk9N IGdlbmVyYXRlX3NlcmllcygxLCROUk9XUykgaTsKVkFDVVVNIEFOQUxZWkUgd2FsX3Rlc3Q7CkNI RUNLUE9JTlQ7ClNRTAp9CgojIC0tLSBUZXN0IGZ1bmN0aW9ucyAtLS0KdGVzdF9ibG9vbV9zY2Fu KCkgewogIGxvY2FsIFJPT1Q9IiQxIiBQT1JUPSIkMiIgTEFCRUw9IiQzIiBTSVpFPSIkNCIKICBz ZXR1cF9ibG9vbSAiJFJPT1QiICIkUE9SVCIgIiRTSVpFIgogIGJlbmNobWFyayAiJFJPT1QiICIk UE9SVCIgIiR7TEFCRUx9X2Jsb29tX3NjYW5fJHtTSVpFfSIgXAogICAgIlNFVCBlbmFibGVfc2Vx c2Nhbj1vZmY7IFNFTEVDVCBDT1VOVCgqKSBGUk9NIGJsb29tX3Rlc3QgV0hFUkUgdmFsMT00MiBB TkQgdmFsMj03OyIgXAogICAgYmxvb21fdGVzdCBibG9vbV9pZHgKICAjIFByb2ZpbGUgYWZ0ZXIg YmVuY2htYXJrIHJlcHM6IHNoYXJlZF9idWZmZXJzIG1lbW9yeSBhbHJlYWR5IGZhdWx0ZWQgaW4s CiAgIyBzbyBwYWdlLWZhdWx0IG5vaXNlIGlzIGdvbmU7IGRyb3BfY2FjaGVzIGVuc3VyZXMgY29s ZCBJTyBmb3IgdGhlIHByb2ZpbGUuCiAgaWYgW1sgJERPX1BST0ZJTEUgLWVxIDEgXV07IHRoZW4K ICAgIGRyb3BfY2FjaGVzICIkUk9PVCIgIiRQT1JUIiBibG9vbV90ZXN0IGJsb29tX2lkeAogICAg cHJvZmlsZV9zcWwgIiRST09UIiAiJFBPUlQiICIke0xBQkVMfV9ibG9vbV9zY2FuXyR7U0laRX0i IFwKICAgICAgIlNFVCBlbmFibGVfc2Vxc2Nhbj1vZmY7IFNFTEVDVCBDT1VOVCgqKSBGUk9NIGJs b29tX3Rlc3QgV0hFUkUgdmFsMT00MiBBTkQgdmFsMj03OyIKICBmaQp9Cgp0ZXN0X2Jsb29tX3Zh Y3V1bSgpIHsKICBsb2NhbCBST09UPSIkMSIgUE9SVD0iJDIiIExBQkVMPSIkMyIgU0laRT0iJDQi CiAgbG9jYWwgT1VUPSIkUk9PVC9yZXN1bHRzLyR7TEFCRUx9X2Jsb29tX3ZhY3V1bV8ke1NJWkV9 LmNzdiIKICBta2RpciAtcCAiJFJPT1QvcmVzdWx0cyIKICBlY2hvICJydW4sbXMscmVhZHMscmVh ZF90aW1lX21zIiA+ICIkT1VUIgogIAogIGZvciAoKGk9MTsgaTw9UkVQUzsgaSsrKSk7IGRvCiAg ICAjIEZyZXNoIHRhYmxlIGVhY2ggcnVuIGZvciBjb25zaXN0ZW50IHN0YXRlCiAgICBzZXR1cF9i bG9vbSAiJFJPT1QiICIkUE9SVCIgIiRTSVpFIgogICAgIyBDcmVhdGUgMTAlIGRlYWQgdHVwbGVz CiAgICBwc3FsX3J1biAiJFJPT1QiICIkUE9SVCIgLWMgIkRFTEVURSBGUk9NIGJsb29tX3Rlc3Qg V0hFUkUgaWQgJSAxMCA9IDA7IgogICAgCiAgICBkcm9wX2NhY2hlcyAiJFJPT1QiICIkUE9SVCIg Ymxvb21fdGVzdCBibG9vbV9pZHgKICAgIGxvY2FsIHJlc3VsdCBtcyByZWFkcyByZWFkX3RpbWUK ICAgIHJlc3VsdD0kKHJ1bl90aW1lZF93aXRoX2lvICIkUk9PVCIgIiRQT1JUIiAiVkFDVVVNIGJs b29tX3Rlc3Q7IikKICAgIElGUz0nLCcgcmVhZCAtciBtcyByZWFkcyByZWFkX3RpbWUgPDw8IiRy ZXN1bHQiCiAgICBlY2hvICIkaSwkbXMsJHJlYWRzLCRyZWFkX3RpbWUiID4+ICIkT1VUIgogICAg bG9nICIke0xBQkVMfV9ibG9vbV92YWN1dW1fJHtTSVpFfSBbJGkvJFJFUFNdOiAke21zfW1zIChy ZWFkcz0kcmVhZHMsIGlvX3RpbWU9JHtyZWFkX3RpbWV9bXMpIgogIGRvbmUKICAKICBpZiBbWyAk RE9fUFJPRklMRSAtZXEgMSBdXTsgdGhlbgogICAgc2V0dXBfYmxvb20gIiRST09UIiAiJFBPUlQi ICIkU0laRSIKICAgIHBzcWxfcnVuICIkUk9PVCIgIiRQT1JUIiAtYyAiREVMRVRFIEZST00gYmxv b21fdGVzdCBXSEVSRSBpZCAlIDEwID0gMDsiCiAgICBkcm9wX2NhY2hlcyAiJFJPT1QiICIkUE9S VCIgYmxvb21fdGVzdCBibG9vbV9pZHgKICAgIHByb2ZpbGVfc3FsICIkUk9PVCIgIiRQT1JUIiAi JHtMQUJFTH1fYmxvb21fdmFjdXVtXyR7U0laRX0iICJWQUNVVU0gYmxvb21fdGVzdDsiCiAgZmkK fQoKdGVzdF9wZ3N0YXR0dXBsZSgpIHsKICBsb2NhbCBST09UPSIkMSIgUE9SVD0iJDIiIExBQkVM PSIkMyIgU0laRT0iJDQiCiAgbG9jYWwgT1VUPSIkUk9PVC9yZXN1bHRzLyR7TEFCRUx9X3Bnc3Rh dHR1cGxlXyR7U0laRX0uY3N2IgogIG1rZGlyIC1wICIkUk9PVC9yZXN1bHRzIgogIGVjaG8gInJ1 bixtcyxyZWFkcyxyZWFkX3RpbWVfbXMiID4gIiRPVVQiCiAgCiAgIyBTZXR1cCBvbmNlIOKAlCBy b2xsZWQtYmFjayBERUxFVEUga2VlcHMgbGF5b3V0IGlkZW50aWNhbCBhY3Jvc3MgYWxsIHJlcHMK ICBzZXR1cF9wZ3N0YXR0dXBsZSAiJFJPT1QiICIkUE9SVCIgIiRTSVpFIgogICMgUm9sbGVkLWJh Y2sgREVMRVRFIGNsZWFycyB0aGUgYWxsLXZpc2libGUgYml0IGluIHRoZSBWaXNpYmlsaXR5IE1h cCBzbwogICMgcGdzdGF0dHVwbGVfYXBwcm94IG11c3QgYWN0dWFsbHkgcmVhZCB0aG9zZSBwYWdl cyAoaXQgc2tpcHMgYWxsLXZpc2libGUgcGFnZXMpLgogICMgVXNpbmcgUk9MTEJBQ0sga2VlcHMg dGhlIHBoeXNpY2FsIGxheW91dCBpZGVudGljYWwgYWNyb3NzIGFsbCByZXBzIChubyBUT0FTVAog ICMgb3V0LW9mLXBhZ2UgdXBkYXRlcywgbm8gZGlydHkgcGFnZXMgdG8gZmx1c2ggZnJvbSBzaGFy ZWRfYnVmZmVycykuCiAgcHNxbF9ydW4gIiRST09UIiAiJFBPUlQiIC1jICJCRUdJTjsgREVMRVRF IEZST00gaGVhcF90ZXN0IFdIRVJFIGlkICUgNTAwID0gMDsgUk9MTEJBQ0s7IgogICMgV2FybXVw IHBhc3M6IFRoZSByb2xsZWQtYmFjayBERUxFVEUgbGVmdCBldmVyeSB0b3VjaGVkIHR1cGxlIHdp dGggYW4geG1heAogICMgcG9pbnRpbmcgdG8gdGhlIGFib3J0ZWQgdHJhbnNhY3Rpb24gYnV0IG5v IGhpbnQgYml0cyBzZXQuIE9uIHRoZSBmaXJzdAogICMgcGdzdGF0dHVwbGVfYXBwcm94IGNhbGws IEhlYXBUdXBsZVNhdGlzZmllc1ZhY3V1bSDihpIgSGVhcFR1cGxlU2F0aXNmaWVzVmFjdXVtSG9y aXpvbgogICMgbXVzdCByZXNvbHZlIGVhY2ggc3VjaCB4bWF4OiBUcmFuc2FjdGlvbklkSXNJblBy b2dyZXNzIChQcm9jQXJyYXkgc2NhbikgdGhlbgogICMgVHJhbnNhY3Rpb25JZERpZENvbW1pdCAo Q0xPRyBsb29rdXApIOKAlCBvbmx5IHRoZW4gY2FuIGl0IGNhbGwgU2V0SGludEJpdHMgdG8KICAj IHN0YW1wIEhFQVBfWE1BWF9JTlZBTElEIGFuZCBNYXJrQnVmZmVyRGlydHlIaW50LiBXaXRob3V0 IHRoaXMgd2FybXVwLCByZXAgMQogICMgcGF5cyB+MTEwMG1zIGV4dHJhIENQVSBmb3IgdGhvc2Ug Q0xPRy9Qcm9jQXJyYXkgbG9va3Vwcy4gU3Vic2VxdWVudCByZXBzIGhpdAogICMgdGhlIGVhcmx5 LWV4aXQgYXQgImlmICh0X2luZm9tYXNrICYgSEVBUF9YTUFYX0lOVkFMSUQpIHJldHVybiBIRUFQ VFVQTEVfTElWRSIKICAjIGFuZCBza2lwIHRoZSBleHBlbnNpdmUgcGF0aCBlbnRpcmVseS4KICAj IEFmdGVyIHRoaXMgcGFzcywgdGhlIGRpcnRpZWQgaGludC1iaXQgcGFnZXMgYXJlIGZsdXNoZWQg dG8gZGlzayB2aWEKICAjIGRyb3BfY2FjaGVzLCBzbyBhbGwgcmVwcyBzdGFydCBmcm9tIHRoZSBz YW1lIG9uLWRpc2sgc3RhdGUuCiAgcHNxbF9ydW4gIiRST09UIiAiJFBPUlQiIC1jICJTRUxFQ1Qg KiBGUk9NIHBnc3RhdHR1cGxlX2FwcHJveCgnaGVhcF90ZXN0Jyk7IiA+L2Rldi9udWxsCgogIGZv ciAoKGk9MTsgaTw9UkVQUzsgaSsrKSk7IGRvCiAgICBkcm9wX2NhY2hlcyAiJFJPT1QiICIkUE9S VCIgaGVhcF90ZXN0IGhlYXBfdGVzdF9wa2V5CiAgICBsb2NhbCByZXN1bHQgbXMgcmVhZHMgcmVh ZF90aW1lCiAgICByZXN1bHQ9JChydW5fdGltZWRfd2l0aF9pbyAiJFJPT1QiICIkUE9SVCIgIlNF TEVDVCAqIEZST00gcGdzdGF0dHVwbGVfYXBwcm94KCdoZWFwX3Rlc3QnKTsiKQogICAgSUZTPScs JyByZWFkIC1yIG1zIHJlYWRzIHJlYWRfdGltZSA8PDwiJHJlc3VsdCIKICAgIGVjaG8gIiRpLCRt cywkcmVhZHMsJHJlYWRfdGltZSIgPj4gIiRPVVQiCiAgICBsb2cgIiR7TEFCRUx9X3Bnc3RhdHR1 cGxlXyR7U0laRX0gWyRpLyRSRVBTXTogJHttc31tcyAocmVhZHM9JHJlYWRzLCBpb190aW1lPSR7 cmVhZF90aW1lfW1zKSIKICBkb25lCiAgCiAgaWYgW1sgJERPX1BST0ZJTEUgLWVxIDEgXV07IHRo ZW4KICAgIHBzcWxfcnVuICIkUk9PVCIgIiRQT1JUIiAtYyAiQkVHSU47IERFTEVURSBGUk9NIGhl YXBfdGVzdCBXSEVSRSBpZCAlIDUwMCA9IDA7IFJPTExCQUNLOyIKICAgIGRyb3BfY2FjaGVzICIk Uk9PVCIgIiRQT1JUIiBoZWFwX3Rlc3QgaGVhcF90ZXN0X3BrZXkKICAgIHByb2ZpbGVfc3FsICIk Uk9PVCIgIiRQT1JUIiAiJHtMQUJFTH1fcGdzdGF0dHVwbGVfJHtTSVpFfSIgXAogICAgICAiU0VM RUNUICogRlJPTSBwZ3N0YXR0dXBsZV9hcHByb3goJ2hlYXBfdGVzdCcpOyIKICBmaQp9Cgp0ZXN0 X3Bnc3RhdGluZGV4KCkgewogIGxvY2FsIFJPT1Q9IiQxIiBQT1JUPSIkMiIgTEFCRUw9IiQzIiBT SVpFPSIkNCIKICBzZXR1cF9wZ3N0YXRpbmRleCAiJFJPT1QiICIkUE9SVCIgIiRTSVpFIgogIGJl bmNobWFyayAiJFJPT1QiICIkUE9SVCIgIiR7TEFCRUx9X3Bnc3RhdGluZGV4XyR7U0laRX0iIFwK ICAgICJTRUxFQ1QgKiBGUk9NIHBnc3RhdGluZGV4KCdpZHhfdGVzdF9wa2V5Jyk7IiBcCiAgICBp ZHhfdGVzdCBpZHhfdGVzdF9wa2V5CiAgaWYgW1sgJERPX1BST0ZJTEUgLWVxIDEgXV07IHRoZW4K ICAgIGRyb3BfY2FjaGVzICIkUk9PVCIgIiRQT1JUIiBpZHhfdGVzdCBpZHhfdGVzdF9wa2V5CiAg ICBwcm9maWxlX3NxbCAiJFJPT1QiICIkUE9SVCIgIiR7TEFCRUx9X3Bnc3RhdGluZGV4XyR7U0la RX0iIFwKICAgICAgIlNFTEVDVCAqIEZST00gcGdzdGF0aW5kZXgoJ2lkeF90ZXN0X3BrZXknKTsi CiAgZmkKfQoKdGVzdF9naW5fdmFjdXVtKCkgewogIGxvY2FsIFJPT1Q9IiQxIiBQT1JUPSIkMiIg TEFCRUw9IiQzIiBTSVpFPSIkNCIKICBsb2NhbCBPVVQ9IiRST09UL3Jlc3VsdHMvJHtMQUJFTH1f Z2luX3ZhY3V1bV8ke1NJWkV9LmNzdiIKICBta2RpciAtcCAiJFJPT1QvcmVzdWx0cyIKICBlY2hv ICJydW4sbXMscmVhZHMscmVhZF90aW1lX21zIiA+ICIkT1VUIgogIAogIGZvciAoKGk9MTsgaTw9 UkVQUzsgaSsrKSk7IGRvCiAgICAjIEZyZXNoIHRhYmxlIGVhY2ggcnVuIGZvciBjb25zaXN0ZW50 IHN0YXRlCiAgICBzZXR1cF9naW4gIiRST09UIiAiJFBPUlQiICIkU0laRSIKICAgIAogICAgZHJv cF9jYWNoZXMgIiRST09UIiAiJFBPUlQiIGdpbl90ZXN0IGdpbl9pZHgKICAgIGxvY2FsIHJlc3Vs dCBtcyByZWFkcyByZWFkX3RpbWUKICAgICMgVkFDVVVNIEFOQUxZWkUgZm9yY2VzIGdpbnZhY3V1 bWNsZWFudXAoKSB0byBydW4gYW5kIHNjYW4gYWxsIHBhZ2VzCiAgICByZXN1bHQ9JChydW5fdGlt ZWRfd2l0aF9pbyAiJFJPT1QiICIkUE9SVCIgIlZBQ1VVTSBBTkFMWVpFIGdpbl90ZXN0OyIpCiAg ICBJRlM9JywnIHJlYWQgLXIgbXMgcmVhZHMgcmVhZF90aW1lIDw8PCIkcmVzdWx0IgogICAgZWNo byAiJGksJG1zLCRyZWFkcywkcmVhZF90aW1lIiA+PiAiJE9VVCIKICAgIGxvZyAiJHtMQUJFTH1f Z2luX3ZhY3V1bV8ke1NJWkV9IFskaS8kUkVQU106ICR7bXN9bXMgKHJlYWRzPSRyZWFkcywgaW9f dGltZT0ke3JlYWRfdGltZX1tcykiCiAgZG9uZQogIAogIGlmIFtbICRET19QUk9GSUxFIC1lcSAx IF1dOyB0aGVuCiAgICBzZXR1cF9naW4gIiRST09UIiAiJFBPUlQiICIkU0laRSIKICAgIGRyb3Bf Y2FjaGVzICIkUk9PVCIgIiRQT1JUIiBnaW5fdGVzdCBnaW5faWR4CiAgICBwcm9maWxlX3NxbCAi JFJPT1QiICIkUE9SVCIgIiR7TEFCRUx9X2dpbl92YWN1dW1fJHtTSVpFfSIgIlZBQ1VVTSBBTkFM WVpFIGdpbl90ZXN0OyIKICBmaQp9Cgp0ZXN0X2hhc2hfdmFjdXVtKCkgewogIGxvY2FsIFJPT1Q9 IiQxIiBQT1JUPSIkMiIgTEFCRUw9IiQzIiBTSVpFPSIkNCIKICBsb2NhbCBPVVQ9IiRST09UL3Jl c3VsdHMvJHtMQUJFTH1faGFzaF92YWN1dW1fJHtTSVpFfS5jc3YiCiAgbWtkaXIgLXAgIiRST09U L3Jlc3VsdHMiCiAgZWNobyAicnVuLG1zLHJlYWRzLHJlYWRfdGltZV9tcyIgPiAiJE9VVCIKICAK ICBmb3IgKChpPTE7IGk8PVJFUFM7IGkrKykpOyBkbwogICAgIyBGcmVzaCB0YWJsZSBlYWNoIHJ1 biBmb3IgY29uc2lzdGVudCBzdGF0ZQogICAgc2V0dXBfaGFzaCAiJFJPT1QiICIkUE9SVCIgIiRT SVpFIgogICAgIyBDcmVhdGUgMTAlIGRlYWQgdHVwbGVzCiAgICBwc3FsX3J1biAiJFJPT1QiICIk UE9SVCIgLWMgIkRFTEVURSBGUk9NIGhhc2hfdGVzdCBXSEVSRSBpZCAlIDEwID0gMDsiCiAgICAK ICAgIGRyb3BfY2FjaGVzICIkUk9PVCIgIiRQT1JUIiBoYXNoX3Rlc3QgaGFzaF9pZHgKICAgIGxv Y2FsIHJlc3VsdCBtcyByZWFkcyByZWFkX3RpbWUKICAgIHJlc3VsdD0kKHJ1bl90aW1lZF93aXRo X2lvICIkUk9PVCIgIiRQT1JUIiAiVkFDVVVNIGhhc2hfdGVzdDsiKQogICAgSUZTPScsJyByZWFk IC1yIG1zIHJlYWRzIHJlYWRfdGltZSA8PDwiJHJlc3VsdCIKICAgIGVjaG8gIiRpLCRtcywkcmVh ZHMsJHJlYWRfdGltZSIgPj4gIiRPVVQiCiAgICBsb2cgIiR7TEFCRUx9X2hhc2hfdmFjdXVtXyR7 U0laRX0gWyRpLyRSRVBTXTogJHttc31tcyAocmVhZHM9JHJlYWRzLCBpb190aW1lPSR7cmVhZF90 aW1lfW1zKSIKICBkb25lCiAgCiAgaWYgW1sgJERPX1BST0ZJTEUgLWVxIDEgXV07IHRoZW4KICAg IHNldHVwX2hhc2ggIiRST09UIiAiJFBPUlQiICIkU0laRSIKICAgIHBzcWxfcnVuICIkUk9PVCIg IiRQT1JUIiAtYyAiREVMRVRFIEZST00gaGFzaF90ZXN0IFdIRVJFIGlkICUgMTAgPSAwOyIKICAg IGRyb3BfY2FjaGVzICIkUk9PVCIgIiRQT1JUIiBoYXNoX3Rlc3QgaGFzaF9pZHgKICAgIHByb2Zp bGVfc3FsICIkUk9PVCIgIiRQT1JUIiAiJHtMQUJFTH1faGFzaF92YWN1dW1fJHtTSVpFfSIgIlZB Q1VVTSBoYXNoX3Rlc3Q7IgogIGZpCn0KCnRlc3Rfd2FsX2xvZ2dpbmcoKSB7CiAgbG9jYWwgUk9P VD0iJDEiIFBPUlQ9IiQyIiBMQUJFTD0iJDMiIFNJWkU9IiQ0IgogIGxvY2FsIE9VVD0iJFJPT1Qv cmVzdWx0cy8ke0xBQkVMfV93YWxfbG9nZ2luZ18ke1NJWkV9LmNzdiIKICBta2RpciAtcCAiJFJP T1QvcmVzdWx0cyIKICBlY2hvICJydW4sbXMscmVhZHMscmVhZF90aW1lX21zIiA+ICIkT1VUIgog IAogICMgQnVpbGQgdGFibGUgb25jZSAtIG9ubHkgcmVidWlsZCBpbmRleCBlYWNoIHJlcAogIHNl dHVwX3dhbCAiJFJPT1QiICIkUE9SVCIgIiRTSVpFIgogIAogIGxvY2FsIFdBTF9TUUw9IkNSRUFU RSBJTkRFWCB3YWxfdGVzdF9naW5faWR4IE9OIHdhbF90ZXN0IFVTSU5HIGdpbiAoZG9jX3Rzdik7 IgogIAogIGZvciAoKGk9MTsgaTw9UkVQUzsgaSsrKSk7IGRvCiAgICAjIERyb3AgaW5kZXggZnJv bSBwcmV2aW91cyBpdGVyYXRpb24KICAgIHBzcWxfcnVuICIkUk9PVCIgIiRQT1JUIiAtYyAiRFJP UCBJTkRFWCBJRiBFWElTVFMgd2FsX3Rlc3RfZ2luX2lkeDsiCiAgICAKICAgICMgRHJvcCBPUyBj YWNoZXMgLSBzb3VyY2UgdGFibGUgcGFnZXMgYXJlIENPTEQgb24gZGlzawogICAgZHJvcF9jYWNo ZXMgIiRST09UIiAiJFBPUlQiIHdhbF90ZXN0CiAgICAKICAgICMgQ1JFQVRFIElOREVYIG9uIEdJ TiAodHN2ZWN0b3Jfb3BzKToKICAgICMgLSBHSU4gYWx3YXlzIHVzZXMgdGhlIHNhbWUgYnVpbGQg cGF0aDogZ2luYnVpbGQoKSBwb3B1bGF0ZXMgdGhlCiAgICAjICAgaW5kZXggaW4gbWVtb3J5LCBm bHVzaGVzIHRvIGRpc2ssIHRoZW4gY2FsbHMgbG9nX25ld3BhZ2VfcmFuZ2UoKQogICAgIyAgIHRv IHJlYWQgQUxMIGluZGV4IHBhZ2VzIGFuZCB3cml0ZSB0aGVtIHRvIFdBTCAoZ2luaW5zZXJ0LmM6 Nzg1LTc5MCkKICAgIGxvY2FsIHJlc3VsdCBtcyByZWFkcyByZWFkX3RpbWUKICAgIHJlc3VsdD0k KHJ1bl90aW1lZF93aXRoX2lvICIkUk9PVCIgIiRQT1JUIiAiJFdBTF9TUUwiKQogICAgSUZTPScs JyByZWFkIC1yIG1zIHJlYWRzIHJlYWRfdGltZSA8PDwiJHJlc3VsdCIKICAgIGVjaG8gIiRpLCRt cywkcmVhZHMsJHJlYWRfdGltZSIgPj4gIiRPVVQiCiAgICBsb2cgIiR7TEFCRUx9X3dhbF9sb2dn aW5nXyR7U0laRX0gWyRpLyRSRVBTXTogJHttc31tcyAocmVhZHM9JHJlYWRzLCBpb190aW1lPSR7 cmVhZF90aW1lfW1zKSIKICBkb25lCiAgCiAgaWYgW1sgJERPX1BST0ZJTEUgLWVxIDEgXV07IHRo ZW4KICAgIHBzcWxfcnVuICIkUk9PVCIgIiRQT1JUIiAtYyAiRFJPUCBJTkRFWCBJRiBFWElTVFMg d2FsX3Rlc3RfZ2luX2lkeDsiCiAgICBkcm9wX2NhY2hlcyAiJFJPT1QiICIkUE9SVCIgd2FsX3Rl c3QKICAgIHByb2ZpbGVfc3FsICIkUk9PVCIgIiRQT1JUIiAiJHtMQUJFTH1fd2FsX2xvZ2dpbmdf JHtTSVpFfSIgIiRXQUxfU1FMIgogIGZpCn0KCiMgLS0tIFJ1biB0ZXN0cyBmb3IgYSBidWlsZCAt LS0Kd2FybXVwX2NhdGFsb2coKSB7CiAgbG9jYWwgUk9PVD0iJDEiIFBPUlQ9IiQyIgogICMgRXhw bGljaXRseSBwcmV3YXJtIGNhdGFsb2cgdGFibGVzIGFuZCB0aGVpciBpbmRleGVzIGludG8gc2hh cmVkX2J1ZmZlcnMKICAjIHNvIHJlcCAxIGRvZXNuJ3QgcGF5IGRpc2stcmVhZCBjb3N0IGZvciBj YXRhbG9nIHBhZ2VzLgogICMgcGdfYnVmZmVyY2FjaGVfZXZpY3RfcmVsYXRpb24gb25seSBldmlj dHMgdGhlIHRlc3QgcmVsYXRpb24sIG5vdCBjYXRhbG9ncywKICAjIHNvIHRoZXNlIHN0YXkgd2Fy bSBhY3Jvc3MgYWxsIHJlcHMuCiAgcHNxbF9ydW4gIiRST09UIiAiJFBPUlQiIDw8U1FMID4vZGV2 L251bGwKU0VMRUNUIHBnX3ByZXdhcm0oJ3BnX2NsYXNzJywgICAgICdidWZmZXInKTsKU0VMRUNU IHBnX3ByZXdhcm0oJ3BnX2F0dHJpYnV0ZScsICdidWZmZXInKTsKU0VMRUNUIHBnX3ByZXdhcm0o J3BnX25hbWVzcGFjZScsICdidWZmZXInKTsKU0VMRUNUIHBnX3ByZXdhcm0oJ3BnX3Byb2MnLCAg ICAgICdidWZmZXInKTsKU0VMRUNUIHBnX3ByZXdhcm0oJ3BnX3R5cGUnLCAgICAgICdidWZmZXIn KTsKU1FMCn0KCnJ1bl90ZXN0cygpIHsKICBsb2NhbCBST09UPSIkMSIgTEFCRUw9IiQyIgogIGxv Y2FsIFBPUlQKICBQT1JUPSQocGlja19wb3J0KQogIAogIGxvZyAiWyRMQUJFTF0gU3RhcnRpbmcg Y2x1c3RlciBvbiBwb3J0ICRQT1JUIgogIGluaXRfY2x1c3RlciAiJFJPT1QiICIkUE9SVCIKICB3 YXJtdXBfY2F0YWxvZyAiJFJPT1QiICIkUE9SVCIKICBzZXRfaW9fZGVsYXkgIiRJT19ERUxBWV9N UyIKICAKICB0cmFwICJzdG9wX2NsdXN0ZXIgJyRST09UJyIgRVhJVAogIAogIGZvciBTSVpFIGlu ICRTSVpFUzsgZG8KICAgIGNhc2UgIiRURVNUIiBpbgogICAgICBibG9vbV9zY2FuKSAgIHRlc3Rf Ymxvb21fc2NhbiAiJFJPT1QiICIkUE9SVCIgIiRMQUJFTCIgIiRTSVpFIiA7OwogICAgICBibG9v bV92YWN1dW0pIHRlc3RfYmxvb21fdmFjdXVtICIkUk9PVCIgIiRQT1JUIiAiJExBQkVMIiAiJFNJ WkUiIDs7CiAgICAgIHBnc3RhdHR1cGxlKSAgdGVzdF9wZ3N0YXR0dXBsZSAiJFJPT1QiICIkUE9S VCIgIiRMQUJFTCIgIiRTSVpFIiA7OwogICAgICBwZ3N0YXRpbmRleCkgIHRlc3RfcGdzdGF0aW5k ZXggIiRST09UIiAiJFBPUlQiICIkTEFCRUwiICIkU0laRSIgOzsKICAgICAgZ2luX3ZhY3V1bSkg ICB0ZXN0X2dpbl92YWN1dW0gIiRST09UIiAiJFBPUlQiICIkTEFCRUwiICIkU0laRSIgOzsKICAg ICAgaGFzaF92YWN1dW0pICB0ZXN0X2hhc2hfdmFjdXVtICIkUk9PVCIgIiRQT1JUIiAiJExBQkVM IiAiJFNJWkUiIDs7CiAgICAgIHdhbF9sb2dnaW5nKSAgdGVzdF93YWxfbG9nZ2luZyAiJFJPT1Qi ICIkUE9SVCIgIiRMQUJFTCIgIiRTSVpFIiA7OwogICAgICBhbGwpCiAgICAgICAgdGVzdF9ibG9v bV92YWN1dW0gIiRST09UIiAiJFBPUlQiICIkTEFCRUwiICIkU0laRSIKICAgICAgICB0ZXN0X3Bn c3RhdHR1cGxlICIkUk9PVCIgIiRQT1JUIiAiJExBQkVMIiAiJFNJWkUiCiAgICAgICAgdGVzdF9w Z3N0YXRpbmRleCAiJFJPT1QiICIkUE9SVCIgIiRMQUJFTCIgIiRTSVpFIgogICAgICAgIHRlc3Rf aGFzaF92YWN1dW0gIiRST09UIiAiJFBPUlQiICIkTEFCRUwiICIkU0laRSIKICAgICAgICB0ZXN0 X3dhbF9sb2dnaW5nICIkUk9PVCIgIiRQT1JUIiAiJExBQkVMIiAiJFNJWkUiCiAgICAgICAgOzsK ICAgICAgKikgZGllICJVbmtub3duIHRlc3Q6ICRURVNUIiA7OwogICAgZXNhYwogIGRvbmUKICAK ICBzdG9wX2NsdXN0ZXIgIiRST09UIgogIHRyYXAgLSBFWElUCn0KCiMgLS0tIENvbXBhcmUgcmVz dWx0cyAtLS0KY29tcGFyZV9yZXN1bHRzKCkgewogIGxvY2FsIGJhc2VfY3N2PSIkMSIgcGF0Y2hf Y3N2PSIkMiIgbGFiZWw9IiQzIgogIAogIFtbICEgLWYgIiRiYXNlX2NzdiIgfHwgISAtZiAiJHBh dGNoX2NzdiIgXV0gJiYgcmV0dXJuCiAgCiAgbG9jYWwgYmFzZV9tZWQgcGF0Y2hfbWVkCiAgYmFz ZV9tZWQ9JChjYWxjX21lZGlhbiAiJGJhc2VfY3N2IikKICBwYXRjaF9tZWQ9JChjYWxjX21lZGlh biAiJHBhdGNoX2NzdiIpCiAgCiAgIyBHdWFyZCBhZ2FpbnN0IGVtcHR5IG9yIHplcm8gdmFsdWVz IHRvIHByZXZlbnQgZGl2aXNpb24gYnkgemVybwogIFtbIC16ICIkYmFzZV9tZWQiIHx8ICIkYmFz ZV9tZWQiID09ICIwIiBdXSAmJiBiYXNlX21lZD0iMC4wMDEiCiAgW1sgLXogIiRwYXRjaF9tZWQi IHx8ICIkcGF0Y2hfbWVkIiA9PSAiMCIgXV0gJiYgcGF0Y2hfbWVkPSIwLjAwMSIKICAKICBsb2Nh bCBzcGVlZHVwIHBjdAogIHNwZWVkdXA9JChhd2sgIkJFR0lOIHsgcHJpbnRmIFwiJS4yZlwiLCAk YmFzZV9tZWQgLyAkcGF0Y2hfbWVkIH0iKQogIHBjdD0kKGF3ayAiQkVHSU4geyBwcmludGYgXCIl LjFmXCIsICgkYmFzZV9tZWQgLSAkcGF0Y2hfbWVkKSAvICRiYXNlX21lZCAqIDEwMCB9IikKICAK ICBsb2NhbCBpb19pbmZvPSIiCiAgaWYgaGVhZCAtMSAiJGJhc2VfY3N2IiB8IGdyZXAgLXEgInJl YWRzIjsgdGhlbgogICAgIyBTdGFuZGFyZCB0ZXN0OiBjb2x1bW5zIGFyZSBydW4sbXMscmVhZHMs cmVhZF90aW1lX21zCiAgICBsb2NhbCBiYXNlX3JlYWRzIHBhdGNoX3JlYWRzIGJhc2VfaW8gcGF0 Y2hfaW8KICAgIGJhc2VfcmVhZHM9JChjYWxjX21lZGlhbl9jb2wgIiRiYXNlX2NzdiIgMykKICAg IHBhdGNoX3JlYWRzPSQoY2FsY19tZWRpYW5fY29sICIkcGF0Y2hfY3N2IiAzKQogICAgYmFzZV9p bz0kKGNhbGNfbWVkaWFuX2NvbCAiJGJhc2VfY3N2IiA0KQogICAgcGF0Y2hfaW89JChjYWxjX21l ZGlhbl9jb2wgIiRwYXRjaF9jc3YiIDQpCiAgICAjIERlZmF1bHQgdG8gMCBpZiBlbXB0eQogICAg W1sgLXogIiRiYXNlX3JlYWRzIiBdXSAmJiBiYXNlX3JlYWRzPTAKICAgIFtbIC16ICIkcGF0Y2hf cmVhZHMiIF1dICYmIHBhdGNoX3JlYWRzPTAKICAgIFtbIC16ICIkYmFzZV9pbyIgXV0gJiYgYmFz ZV9pbz0wCiAgICBbWyAteiAiJHBhdGNoX2lvIiBdXSAmJiBwYXRjaF9pbz0wCiAgICBpb19pbmZv PSIgIChyZWFkcz0ke2Jhc2VfcmVhZHN94oaSJHtwYXRjaF9yZWFkc30sIGlvX3RpbWU9JHtiYXNl X2lvfeKGkiR7cGF0Y2hfaW99bXMpIgogIGZpCiAgCiAgcHJpbnRmICIlLTI2cyBiYXNlPSU4LjFm bXMgIHBhdGNoPSU4LjFmbXMgICU1LjJmeCAgKCU1LjFmJSUpJXNcbiIgXAogICAgIiRsYWJlbCIg IiRiYXNlX21lZCIgIiRwYXRjaF9tZWQiICIkc3BlZWR1cCIgIiRwY3QiICIkaW9faW5mbyIKfQoK cHJpbnRfc3VtbWFyeSgpIHsKICBlY2hvICIiCiAgZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgogIGVjaG8gIiAgICAgICAgICAgICAgICAgICAgIFNUUkVB TUlORyBSRUFEIEJFTkNITUFSSyBSRVNVTFRTICAgICAgICAgICAgICAgICAgICIKICBlY2hvICLi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCiAgZWNobyAiIgogIAog IGlmIFtbICRCQVNFTElORSAtZXEgMSBdXTsgdGhlbgogICAgcHJpbnRmICIlLTI2cyAlLTE3cyAl LTE3cyAlLTdzICUtN3MgJXNcbiIgIlRFU1QiICJCQVNFTElORSIgIlBBVENIRUQiICJTUEVFRFVQ IiAiQ0hBTkdFIiAiSS9PIFRJTUUiCiAgICBlY2hvICLilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAiCiAgICAKICAgIGZvciBTSVpF IGluICRTSVpFUzsgZG8KICAgICAgZm9yIHRlc3RfbmFtZSBpbiBibG9vbV9zY2FuIGJsb29tX3Zh Y3V1bSBwZ3N0YXR0dXBsZSBwZ3N0YXRpbmRleCBnaW5fdmFjdXVtIGhhc2hfdmFjdXVtIHdhbF9s b2dnaW5nOyBkbwogICAgICAgIFtbICIkVEVTVCIgIT0gImFsbCIgJiYgIiRURVNUIiAhPSAiJHRl c3RfbmFtZSIgXV0gJiYgY29udGludWUKICAgICAgICBjb21wYXJlX3Jlc3VsdHMgXAogICAgICAg ICAgIiRST09UX0JBU0UvcmVzdWx0cy9iYXNlXyR7dGVzdF9uYW1lfV8ke1NJWkV9LmNzdiIgXAog ICAgICAgICAgIiRST09UX1BBVENIL3Jlc3VsdHMvcGF0Y2hlZF8ke3Rlc3RfbmFtZX1fJHtTSVpF fS5jc3YiIFwKICAgICAgICAgICIke3Rlc3RfbmFtZX1fJHtTSVpFfSIKICAgICAgZG9uZQogICAg ZG9uZQogIGVsc2UKICAgIGVjaG8gIlJlc3VsdHMgKHBhdGNoZWQgb25seSk6IgogICAgZWNobyAi IgogICAgZm9yIGYgaW4gIiRST09UX1BBVENIL3Jlc3VsdHMvIiouY3N2OyBkbwogICAgICBbWyAt ZiAiJGYiIF1dIHx8IGNvbnRpbnVlCiAgICAgIHByaW50ZiAiJS00MHMgJXNcbiIgIiQoYmFzZW5h bWUgIiRmIiAuY3N2KToiICIkKGNhbGNfc3RhdHMgIiRmIikiCiAgICBkb25lCiAgZmkKICAKICBl Y2hvICIiCiAgZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ IgogIGVjaG8gIkNTViBmaWxlczogJFJPT1RfUEFUQ0gvcmVzdWx0cy8iCiAgW1sgJEJBU0VMSU5F IC1lcSAxIF1dICYmIGVjaG8gIkJhc2VsaW5lOiAgJFJPT1RfQkFTRS9yZXN1bHRzLyIKICAKICAj IExpc3QgZ2VuZXJhdGVkIGZsYW1lZ3JhcGhzCiAgaWYgW1sgJERPX1BST0ZJTEUgLWVxIDEgXV07 IHRoZW4KICAgIGxvY2FsIHN2Z3M9KCkKICAgIGZvciBkaXIgaW4gIiRST09UX0JBU0UvcHJvZmls ZSIgIiRST09UX1BBVENIL3Byb2ZpbGUiOyBkbwogICAgICBbWyAtZCAiJGRpciIgXV0gfHwgY29u dGludWUKICAgICAgZm9yIHN2ZyBpbiAiJGRpciIvKi5zdmc7IGRvCiAgICAgICAgW1sgLWYgIiRz dmciIF1dICYmIHN2Z3MrPSgiJHN2ZyIpCiAgICAgIGRvbmUKICAgIGRvbmUKICAgIGlmIFtbICR7 I3N2Z3NbQF19IC1ndCAwIF1dOyB0aGVuCiAgICAgIGVjaG8gIiIKICAgICAgZWNobyAiRmxhbWVn cmFwaHM6IgogICAgICBmb3Igc3ZnIGluICIke3N2Z3NbQF19IjsgZG8gZWNobyAiICAkc3ZnIjsg ZG9uZQogICAgZmkKICBmaQogIAogIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkCIKfQoKIyAtLS0gTWFpbiAtLS0KbWFpbigpIHsKICBsb2cgIlN0cmVhbWlu ZyBSZWFkIEJlbmNobWFyayIKICBsb2cgIlBhdGNoOiAkUEFUQ0ggKCRQQVRDSF9UQUcpIgogIGxv ZyAiVGVzdHM6ICRURVNUIgogIGxvZyAiU2l6ZXM6ICRTSVpFUyIKICBsb2cgIlJlcHM6ICAkUkVQ UyIKICBsb2cgIkkvTzogICAkSU9fTUVUSE9EICh3b3JrZXJzPSRJT19XT1JLRVJTLCBjb25jdXJy ZW5jeT0kSU9fTUFYX0NPTkNVUlJFTkNZKSIKICBbWyAkRElSRUNUX0lPIC1lcSAxIF1dICYmIGxv ZyAiRGlyZWN0IElPOiBlbmFibGVkIChkZWJ1Z19pb19kaXJlY3Q9ZGF0YSkiCiAgW1sgLW4gIiRJ T19ERUxBWV9NUyIgXV0gJiYgbG9nICJJL08gZGVsYXk6ICR7SU9fREVMQVlfTVN9bXMgdmlhIGRt X2RlbGF5ICgkRE1fREVMQVlfREVWKSIKICBbWyAkRE9fUFJPRklMRSAtZXEgMSBdXSAmJiBsb2cg IlByb2ZpbGU6IGVuYWJsZWQgKGZsYW1lZ3JhcGhzIOKGkiA8cm9vdD4vcHJvZmlsZS8pIgogIAog ICMgQnVpbGQKICBpZiBbWyAkQkFTRUxJTkUgLWVxIDEgXV07IHRoZW4KICAgIGJ1aWxkX3BnICIk Uk9PVF9CQVNFIiAiIgogIGZpCiAgYnVpbGRfcGcgIiRST09UX1BBVENIIiAiJFBBVENIIgogIAog ICMgUnVuIHRlc3RzCiAgaWYgW1sgJEJBU0VMSU5FIC1lcSAxIF1dOyB0aGVuCiAgICBsb2cgIlJ1 bm5pbmcgYmFzZWxpbmUgdGVzdHMiCiAgICBydW5fdGVzdHMgIiRST09UX0JBU0UiICJiYXNlIgog IGZpCiAgCiAgbG9nICJSdW5uaW5nIHBhdGNoZWQgdGVzdHMiCiAgcnVuX3Rlc3RzICIkUk9PVF9Q QVRDSCIgInBhdGNoZWQiCiAgCiAgIyBTdW1tYXJ5CiAgcHJpbnRfc3VtbWFyeQp9CgptYWluCg== --0000000000009432a8064ccc5779--