From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lj1-x22d.google.com (mail-lj1-x22d.google.com [IPv6:2a00:1450:4864:20::22d]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.bufferbloat.net (Postfix) with ESMTPS id A1C783BA8E for ; Tue, 15 Jan 2019 17:42:54 -0500 (EST) Received: by mail-lj1-x22d.google.com with SMTP id c19-v6so3799379lja.5 for ; Tue, 15 Jan 2019 14:42:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=N5kN0iZCUxi560IyobWEExZt7KqdSwne01gCjzDCODA=; b=b6vOS+Hq5otuVsBmBA5Snk9z7ziMaUAvzoMVHKtZ6fqKZSbB32AdfXEkJZLaFA1ezK vR7TjZu+KfhILHi3M7e53inOo4pIrBFgS85HMHXPVwpIyB9rKaIvnjswYRBSzAZbbZ4z g36g+czKGmIj45C1B8t5e27T2EsKPMHwczSJcfS6skTMdR7OsnLhWKGOexyAi600ill5 iUtTcWSWeCxP3B5arHqEaefso1b/dSR5C6qfxi3cVb7+rHpHxtvgkhQWom4kxgOc50fJ zcaUvda9I4e3df8TGMwS6e6TvOOnG7od356UgpJWcLuPU8wsu9mkGVlJIPC9hDoSjAXN bbjQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=N5kN0iZCUxi560IyobWEExZt7KqdSwne01gCjzDCODA=; b=EwWofAyTtJyYq9oUqAR7J7ZePs+htuKqoFIIl8D5eMDlvq7/3KAn9wJj0Gwv9HxmIz f9Gk4VYwThn/3BjmvKJxZFtQg/WuMJA9t1uv9lehHpSPT1h1DwLx6XG1yNvwff5fcpu6 68NoR8ThfYpvavh4AFXt6g/HLuW3qDpWTghOigbQ/ZdhYDieh3T6z5FBz2gGU/KF12ID dYE6YK7BtbywTu6kEtj1wc2KDeBu+ggKoGhz0aqml8nMCEzQXq7PAgkDzp9MSeMPw3IQ 2i4hX7urK9alDGeLz0Qrqd1trkDKbwz1UUYE/SWtCUC2KRPIWVxNg2qDZFihawagWn68 WEDA== X-Gm-Message-State: AJcUukfyUgiBJsaOAMBjxu1nqv989DIN2CpQoNyRu7OkCKPtsfq4HshJ w0So6IKOGwZ6o7J7GwDOmIy9p1lY8o1m7Ws4GX9CqQ== X-Google-Smtp-Source: ALg8bN4wH98V6HNRk40/RbNWIguXiZaCQu1VB0UdLWeFA71zhVe/kan72qrWbO8CuziYp5PX45xHX7UIt8wphhUv9cw= X-Received: by 2002:a2e:8992:: with SMTP id c18-v6mr4293310lji.17.1547592173130; Tue, 15 Jan 2019 14:42:53 -0800 (PST) MIME-Version: 1.0 References: <20190115192200.5644-1-gamanakis@gmail.com> In-Reply-To: <20190115192200.5644-1-gamanakis@gmail.com> From: Georgios Amanakis Date: Tue, 15 Jan 2019 17:42:41 -0500 Message-ID: To: Cake List Content-Type: multipart/alternative; boundary="000000000000bc9b24057f86e190" Subject: Re: [Cake] dual-src/dsthost unfairness, only with bi-directional traffic X-BeenThere: cake@lists.bufferbloat.net X-Mailman-Version: 2.1.20 Precedence: list List-Id: Cake - FQ_codel the next generation List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 15 Jan 2019 22:42:55 -0000 --000000000000bc9b24057f86e190 Content-Type: text/plain; charset="UTF-8" The patch I previously sent had the host_load manipulated only when dual-dsthost is sent, since that was what I was primarily testing. For dual-srchost to behave the same way line 2107 has to be changed, too. Will resubmit in case anybody wants to test, later today. On Tue, Jan 15, 2019, 2:22 PM George Amanakis > I think what is happening here is that if a client has flows such as "a > (bulk upload)" and "b (bulk download)", the incoming ACKs of flow "a" > compete with the incoming bulk traffic on flow "b". With compete I mean > in terms of flow selection. > > So if we adjust the host_load to be the same with the bulk_flow_count of > *each* host, the problem seems to be resolved. > I drafted a patch below. > > Pete's setup, tested with the patch (ingress in mbit/s): > IP1: 8down 49.18mbit/s > IP1: 1up 46.73mbit/s > IP2: 1down 47.39mbit/s > IP2: 8up 49.21mbit/s > > > --- > sch_cake.c | 34 ++++++++++++++++++++++++++++------ > 1 file changed, 28 insertions(+), 6 deletions(-) > > diff --git a/sch_cake.c b/sch_cake.c > index d434ae0..5c0f0e1 100644 > --- a/sch_cake.c > +++ b/sch_cake.c > @@ -148,6 +148,7 @@ struct cake_host { > u32 dsthost_tag; > u16 srchost_refcnt; > u16 dsthost_refcnt; > + u16 bulk_flow_count; > }; > > struct cake_heap_entry { > @@ -1897,10 +1898,10 @@ static s32 cake_enqueue(struct sk_buff *skb, > struct Qdisc *sch, > q->last_packet_time = now; > } > > + struct cake_host *srchost = &b->hosts[flow->srchost]; > + struct cake_host *dsthost = &b->hosts[flow->dsthost]; > /* flowchain */ > if (!flow->set || flow->set == CAKE_SET_DECAYING) { > - struct cake_host *srchost = &b->hosts[flow->srchost]; > - struct cake_host *dsthost = &b->hosts[flow->dsthost]; > u16 host_load = 1; > > if (!flow->set) { > @@ -1927,6 +1928,11 @@ static s32 cake_enqueue(struct sk_buff *skb, struct > Qdisc *sch, > flow->set = CAKE_SET_BULK; > b->sparse_flow_count--; > b->bulk_flow_count++; > + if (cake_dsrc(q->flow_mode)) > + srchost->bulk_flow_count++; > + > + if (cake_ddst(q->flow_mode)) > + dsthost->bulk_flow_count++; > } > > if (q->buffer_used > q->buffer_max_used) > @@ -2101,7 +2107,7 @@ retry: > host_load = max(host_load, srchost->srchost_refcnt); > > if (cake_ddst(q->flow_mode)) > - host_load = max(host_load, dsthost->dsthost_refcnt); > + host_load = max(host_load, dsthost->bulk_flow_count); > > WARN_ON(host_load > CAKE_QUEUES); > > @@ -2110,8 +2116,6 @@ retry: > /* The shifted prandom_u32() is a way to apply dithering to > * avoid accumulating roundoff errors > */ > - flow->deficit += (b->flow_quantum * quantum_div[host_load] > + > - (prandom_u32() >> 16)) >> 16; > list_move_tail(&flow->flowchain, &b->old_flows); > > /* Keep all flows with deficits out of the sparse and > decaying > @@ -2122,6 +2126,11 @@ retry: > if (flow->head) { > b->sparse_flow_count--; > b->bulk_flow_count++; > + if (cake_dsrc(q->flow_mode)) > + srchost->bulk_flow_count++; > + > + if (cake_ddst(q->flow_mode)) > + dsthost->bulk_flow_count++; > flow->set = CAKE_SET_BULK; > } else { > /* we've moved it to the bulk rotation for > @@ -2131,6 +2140,8 @@ retry: > flow->set = CAKE_SET_SPARSE_WAIT; > } > } > + flow->deficit += (b->flow_quantum * quantum_div[host_load] > + > + (prandom_u32() >> 16)) >> 16; > goto retry; > } > > @@ -2151,6 +2162,11 @@ retry: > &b->decaying_flows); > if (flow->set == CAKE_SET_BULK) { > b->bulk_flow_count--; > + if (cake_dsrc(q->flow_mode)) > + srchost->bulk_flow_count--; > + > + if (cake_ddst(q->flow_mode)) > + dsthost->bulk_flow_count--; > b->decaying_flow_count++; > } else if (flow->set == CAKE_SET_SPARSE || > flow->set == > CAKE_SET_SPARSE_WAIT) { > @@ -2164,8 +2180,14 @@ retry: > if (flow->set == CAKE_SET_SPARSE || > flow->set == CAKE_SET_SPARSE_WAIT) > b->sparse_flow_count--; > - else if (flow->set == CAKE_SET_BULK) > + else if (flow->set == CAKE_SET_BULK) { > b->bulk_flow_count--; > + if (cake_dsrc(q->flow_mode)) > + srchost->bulk_flow_count--; > + > + if (cake_ddst(q->flow_mode)) > + dsthost->bulk_flow_count--; > + } > else > b->decaying_flow_count--; > > -- > 2.20.1 > > --000000000000bc9b24057f86e190 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 PGRpdiBkaXI9ImF1dG8iPlRoZSBwYXRjaCBJIHByZXZpb3VzbHkgc2VudCBoYWQgdGhlIGhvc3Rf bG9hZCBtYW5pcHVsYXRlZCBvbmx5IHdoZW4gZHVhbC1kc3Rob3N0IGlzIHNlbnQsIHNpbmNlIHRo YXQgd2FzIHdoYXQgSSB3YXMgcHJpbWFyaWx5IHRlc3RpbmcuIEZvciBkdWFsLXNyY2hvc3QgdG8g YmVoYXZlIHRoZSBzYW1lIHdheSBsaW5lIDIxMDcgaGFzIHRvIGJlIGNoYW5nZWQsIHRvby4gV2ls bCByZXN1Ym1pdCBpbiBjYXNlIGFueWJvZHkgd2FudHMgdG8gdGVzdCwgbGF0ZXIgdG9kYXkuPC9k aXY+PGJyPjxkaXYgY2xhc3M9ImdtYWlsX3F1b3RlIj48ZGl2IGRpcj0ibHRyIj5PbiBUdWUsIEph biAxNSwgMjAxOSwgMjoyMiBQTSBHZW9yZ2UgQW1hbmFraXMgJmx0OzxhIGhyZWY9Im1haWx0bzpn YW1hbmFraXNAZ21haWwuY29tIj5nYW1hbmFraXNAZ21haWwuY29tPC9hPiB3cm90ZTo8YnI+PC9k aXY+PGJsb2NrcXVvdGUgY2xhc3M9ImdtYWlsX3F1b3RlIiBzdHlsZT0ibWFyZ2luOjAgMCAwIC44 ZXg7Ym9yZGVyLWxlZnQ6MXB4ICNjY2Mgc29saWQ7cGFkZGluZy1sZWZ0OjFleCI+PGJyPg0KSSB0 aGluayB3aGF0IGlzIGhhcHBlbmluZyBoZXJlIGlzIHRoYXQgaWYgYSBjbGllbnQgaGFzIGZsb3dz IHN1Y2ggYXMgJnF1b3Q7YTxicj4NCihidWxrIHVwbG9hZCkmcXVvdDsgYW5kICZxdW90O2IgKGJ1 bGsgZG93bmxvYWQpJnF1b3Q7LCB0aGUgaW5jb21pbmcgQUNLcyBvZiBmbG93ICZxdW90O2EmcXVv dDs8YnI+DQpjb21wZXRlIHdpdGggdGhlIGluY29taW5nIGJ1bGsgdHJhZmZpYyBvbiBmbG93ICZx dW90O2ImcXVvdDsuIFdpdGggY29tcGV0ZSBJIG1lYW48YnI+DQppbiB0ZXJtcyBvZiBmbG93IHNl bGVjdGlvbi48YnI+DQo8YnI+DQpTbyBpZiB3ZSBhZGp1c3QgdGhlIGhvc3RfbG9hZCB0byBiZSB0 aGUgc2FtZSB3aXRoIHRoZSBidWxrX2Zsb3dfY291bnQgb2Y8YnI+DQoqZWFjaCogaG9zdCwgdGhl IHByb2JsZW0gc2VlbXMgdG8gYmUgcmVzb2x2ZWQuPGJyPg0KSSBkcmFmdGVkIGEgcGF0Y2ggYmVs b3cuPGJyPg0KPGJyPg0KUGV0ZSYjMzk7cyBzZXR1cCwgdGVzdGVkIHdpdGggdGhlIHBhdGNoIChp bmdyZXNzIGluIG1iaXQvcyk6PGJyPg0KSVAxOiA4ZG93bsKgIDQ5LjE4bWJpdC9zPGJyPg0KSVAx OiAxdXDCoCDCoCA0Ni43M21iaXQvczxicj4NCklQMjogMWRvd27CoCA0Ny4zOW1iaXQvczxicj4N CklQMjogOHVwwqAgwqAgNDkuMjFtYml0L3M8YnI+DQo8YnI+DQo8YnI+DQotLS08YnI+DQrCoHNj aF9jYWtlLmMgfCAzNCArKysrKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tPGJyPg0KwqAx IGZpbGUgY2hhbmdlZCwgMjggaW5zZXJ0aW9ucygrKSwgNiBkZWxldGlvbnMoLSk8YnI+DQo8YnI+ DQpkaWZmIC0tZ2l0IGEvc2NoX2Nha2UuYyBiL3NjaF9jYWtlLmM8YnI+DQppbmRleCBkNDM0YWUw Li41YzBmMGUxIDEwMDY0NDxicj4NCi0tLSBhL3NjaF9jYWtlLmM8YnI+DQorKysgYi9zY2hfY2Fr ZS5jPGJyPg0KQEAgLTE0OCw2ICsxNDgsNyBAQCBzdHJ1Y3QgY2FrZV9ob3N0IHs8YnI+DQrCoCDC oCDCoCDCoCB1MzIgZHN0aG9zdF90YWc7PGJyPg0KwqAgwqAgwqAgwqAgdTE2IHNyY2hvc3RfcmVm Y250Ozxicj4NCsKgIMKgIMKgIMKgIHUxNiBkc3Rob3N0X3JlZmNudDs8YnI+DQorwqAgwqAgwqAg wqB1MTYgYnVsa19mbG93X2NvdW50Ozxicj4NCsKgfTs8YnI+DQo8YnI+DQrCoHN0cnVjdCBjYWtl X2hlYXBfZW50cnkgezxicj4NCkBAIC0xODk3LDEwICsxODk4LDEwIEBAIHN0YXRpYyBzMzIgY2Fr ZV9lbnF1ZXVlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBRZGlzYyAqc2NoLDxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIHEtJmd0O2xhc3RfcGFja2V0X3RpbWUgPSBub3c7PGJyPg0K wqAgwqAgwqAgwqAgfTxicj4NCjxicj4NCivCoCDCoCDCoCDCoHN0cnVjdCBjYWtlX2hvc3QgKnNy Y2hvc3QgPSAmYW1wO2ItJmd0O2hvc3RzW2Zsb3ctJmd0O3NyY2hvc3RdOzxicj4NCivCoCDCoCDC oCDCoHN0cnVjdCBjYWtlX2hvc3QgKmRzdGhvc3QgPSAmYW1wO2ItJmd0O2hvc3RzW2Zsb3ctJmd0 O2RzdGhvc3RdOzxicj4NCsKgIMKgIMKgIMKgIC8qIGZsb3djaGFpbiAqLzxicj4NCsKgIMKgIMKg IMKgIGlmICghZmxvdy0mZ3Q7c2V0IHx8IGZsb3ctJmd0O3NldCA9PSBDQUtFX1NFVF9ERUNBWUlO Rykgezxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHN0cnVjdCBjYWtlX2hvc3QgKnNyY2hv c3QgPSAmYW1wO2ItJmd0O2hvc3RzW2Zsb3ctJmd0O3NyY2hvc3RdOzxicj4NCi3CoCDCoCDCoCDC oCDCoCDCoCDCoCDCoHN0cnVjdCBjYWtlX2hvc3QgKmRzdGhvc3QgPSAmYW1wO2ItJmd0O2hvc3Rz W2Zsb3ctJmd0O2RzdGhvc3RdOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHUxNiBob3N0 X2xvYWQgPSAxOzxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmICghZmxvdy0m Z3Q7c2V0KSB7PGJyPg0KQEAgLTE5MjcsNiArMTkyOCwxMSBAQCBzdGF0aWMgczMyIGNha2VfZW5x dWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgUWRpc2MgKnNjaCw8YnI+DQrCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCBmbG93LSZndDtzZXQgPSBDQUtFX1NFVF9CVUxLOzxicj4NCsKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIGItJmd0O3NwYXJzZV9mbG93X2NvdW50LS07PGJyPg0KwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgYi0mZ3Q7YnVsa19mbG93X2NvdW50Kys7PGJyPg0KK8KgIMKgIMKg IMKgIMKgIMKgIMKgIMKgaWYgKGNha2VfZHNyYyhxLSZndDtmbG93X21vZGUpKTxicj4NCivCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHNyY2hvc3QtJmd0O2J1bGtfZmxvd19jb3Vu dCsrOzxicj4NCis8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAoY2FrZV9kZHN0KHEt Jmd0O2Zsb3dfbW9kZSkpPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg ZHN0aG9zdC0mZ3Q7YnVsa19mbG93X2NvdW50Kys7PGJyPg0KwqAgwqAgwqAgwqAgfTxicj4NCjxi cj4NCsKgIMKgIMKgIMKgIGlmIChxLSZndDtidWZmZXJfdXNlZCAmZ3Q7IHEtJmd0O2J1ZmZlcl9t YXhfdXNlZCk8YnI+DQpAQCAtMjEwMSw3ICsyMTA3LDcgQEAgcmV0cnk6PGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgaG9zdF9sb2FkID0gbWF4KGhvc3RfbG9hZCwgc3JjaG9zdC0mZ3Q7c3Jj aG9zdF9yZWZjbnQpOzxicj4NCjxicj4NCsKgIMKgIMKgIMKgIGlmIChjYWtlX2Rkc3QocS0mZ3Q7 Zmxvd19tb2RlKSk8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBob3N0X2xvYWQgPSBtYXgo aG9zdF9sb2FkLCBkc3Rob3N0LSZndDtkc3Rob3N0X3JlZmNudCk7PGJyPg0KK8KgIMKgIMKgIMKg IMKgIMKgIMKgIMKgaG9zdF9sb2FkID0gbWF4KGhvc3RfbG9hZCwgZHN0aG9zdC0mZ3Q7YnVsa19m bG93X2NvdW50KTs8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCBXQVJOX09OKGhvc3RfbG9hZCAmZ3Q7 IENBS0VfUVVFVUVTKTs8YnI+DQo8YnI+DQpAQCAtMjExMCw4ICsyMTE2LDYgQEAgcmV0cnk6PGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgLyogVGhlIHNoaWZ0ZWQgcHJhbmRvbV91MzIoKSBp cyBhIHdheSB0byBhcHBseSBkaXRoZXJpbmcgdG88YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCogYXZvaWQgYWNjdW11bGF0aW5nIHJvdW5kb2ZmIGVycm9yczxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgKi88YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBmbG93LSZndDtk ZWZpY2l0ICs9IChiLSZndDtmbG93X3F1YW50dW0gKiBxdWFudHVtX2Rpdltob3N0X2xvYWRdICs8 YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAo cHJhbmRvbV91MzIoKSAmZ3Q7Jmd0OyAxNikpICZndDsmZ3Q7IDE2Ozxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIGxpc3RfbW92ZV90YWlsKCZhbXA7Zmxvdy0mZ3Q7Zmxvd2NoYWluLCAmYW1w O2ItJmd0O29sZF9mbG93cyk7PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgLyog S2VlcCBhbGwgZmxvd3Mgd2l0aCBkZWZpY2l0cyBvdXQgb2YgdGhlIHNwYXJzZSBhbmQgZGVjYXlp bmc8YnI+DQpAQCAtMjEyMiw2ICsyMTI2LDExIEBAIHJldHJ5Ojxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmIChmbG93LSZndDtoZWFkKSB7PGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgYi0mZ3Q7c3BhcnNlX2Zsb3df Y291bnQtLTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCBiLSZndDtidWxrX2Zsb3dfY291bnQrKzs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAoY2FrZV9kc3JjKHEtJmd0O2Zsb3dfbW9kZSkp PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgc3JjaG9zdC0mZ3Q7YnVsa19mbG93X2NvdW50Kys7PGJyPg0KKzxicj4NCivCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChjYWtlX2Rkc3Qo cS0mZ3Q7Zmxvd19tb2RlKSk8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBkc3Rob3N0LSZndDtidWxrX2Zsb3dfY291bnQrKzs8 YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBmbG93 LSZndDtzZXQgPSBDQUtFX1NFVF9CVUxLOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIH0gZWxzZSB7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgLyogd2UmIzM5O3ZlIG1vdmVkIGl0IHRvIHRoZSBidWxrIHJvdGF0aW9u IGZvcjxicj4NCkBAIC0yMTMxLDYgKzIxNDAsOCBAQCByZXRyeTo8YnI+DQrCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBmbG93LSZndDtzZXQgPSBDQUtFX1NF VF9TUEFSU0VfV0FJVDs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB9 PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgfTxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoGZsb3ctJmd0O2RlZmljaXQgKz0gKGItJmd0O2Zsb3dfcXVhbnR1bSAqIHF1YW50dW1fZGl2 W2hvc3RfbG9hZF0gKzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoChwcmFuZG9tX3UzMigpICZndDsmZ3Q7IDE2KSkgJmd0OyZndDsgMTY7PGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZ290byByZXRyeTs8YnI+DQrCoCDCoCDCoCDCoCB9 PGJyPg0KPGJyPg0KQEAgLTIxNTEsNiArMjE2MiwxMSBAQCByZXRyeTo8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCZhbXA7Yi0mZ3Q7ZGVjYXlpbmdfZmxvd3MpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmIChmbG93LSZndDtzZXQgPT0gQ0FLRV9TRVRf QlVMSykgezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIGItJmd0O2J1bGtfZmxvd19jb3VudC0tOzxicj4NCivCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChjYWtl X2RzcmMocS0mZ3Q7Zmxvd19tb2RlKSk8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBzcmNob3N0LSZndDti dWxrX2Zsb3dfY291bnQtLTs8YnI+DQorPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKGNha2VfZGRzdChxLSZndDtmbG93 X21vZGUpKTxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGRzdGhvc3QtJmd0O2J1bGtfZmxvd19jb3VudC0t Ozxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIGItJmd0O2RlY2F5aW5nX2Zsb3dfY291bnQrKzs8YnI+DQrCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB9IGVsc2UgaWYgKGZsb3ctJmd0O3Nl dCA9PSBDQUtFX1NFVF9TUEFSU0UgfHw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGZsb3ctJmd0O3NldCA9PSBDQUtF X1NFVF9TUEFSU0VfV0FJVCkgezxicj4NCkBAIC0yMTY0LDggKzIxODAsMTQgQEAgcmV0cnk6PGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaWYgKGZs b3ctJmd0O3NldCA9PSBDQUtFX1NFVF9TUEFSU0UgfHw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBmbG93LSZndDtzZXQgPT0gQ0FLRV9T RVRfU1BBUlNFX1dBSVQpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgYi0mZ3Q7c3BhcnNlX2Zsb3dfY291bnQtLTs8YnI+DQot wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBlbHNlIGlmIChm bG93LSZndDtzZXQgPT0gQ0FLRV9TRVRfQlVMSyk8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBlbHNlIGlmIChmbG93LSZndDtzZXQgPT0gQ0FLRV9T RVRfQlVMSykgezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIGItJmd0O2J1bGtfZmxvd19jb3VudC0tOzxicj4NCivCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChj YWtlX2RzcmMocS0mZ3Q7Zmxvd19tb2RlKSk8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBzcmNob3N0LSZn dDtidWxrX2Zsb3dfY291bnQtLTs8YnI+DQorPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKGNha2VfZGRzdChxLSZndDtm bG93X21vZGUpKTxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGRzdGhvc3QtJmd0O2J1bGtfZmxvd19jb3Vu dC0tOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oH08YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBl bHNlPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgYi0mZ3Q7ZGVjYXlpbmdfZmxvd19jb3VudC0tOzxicj4NCjxicj4NCi0tIDxi cj4NCjIuMjAuMTxicj4NCjxicj4NCjwvYmxvY2txdW90ZT48L2Rpdj4NCg== --000000000000bc9b24057f86e190--