This document demonstrates the Bulmer effect and Bulmer’s
partitioning of genetic variance using AlphaSimR and traits with only
additive effects.
Bulmer’s partitioning of genetic variance
Bulmer had a simulation paper in 1976 where he decomposed genetic
variance in the following way:
\(V_G = V_g + C_{HW} + C_L\)
\(V_G\) is total genetic
variance.
\(V_g\) is genic variance. The
expected variance at Hardy-Weinberg and linkage equilibrium.
\(C_{HW}\) is the covariance due to
the departure from Hardy-Weinberg equilibrium in the observed genotype
frequencies.
\(V_g + C_{HW}\) is the expected
genetic variance at the observed genotype frequencies and linkage
equilibrium.
\(C_L\) is the covariance due to
genetic linkage (i.e. linkage disequilibrium).
This decomposition of genetic variance is implemented in AlphaSimR
and can be accessed using the genParam
function. Moreover,
AlphaSimR implements this partitioning on top of the classic
partitioning of genetic variance into additive, dominance, and epistasis
(additive-by-additive only).
The script below demonstrates how to access this partitioning for
additive genetic variance in a simulation using only additive effects.
(Note that genetic and additive variances are equivalent with only
additive effects)
gp$covA_HW
Trait1
0.00563195
Bulmer effect
The below scripts will illustrate the Bulmer effect. The first shows
the effect as a more general property by selecting different parts of a
bivariate normal distribution to model directional, stabilizing and
disruptive selection.
Source: Walsh & Lynch
X[1:100,]
[,1] [,2]
[1,] -0.11997504 3.95780154
[2,] 1.64888579 2.14889399
[3,] 2.08209775 1.56755871
[4,] 2.02424680 1.49953672
[5,] 1.33527929 2.12410887
[6,] 1.57835112 1.85431190
[7,] 1.51928211 1.84214821
[8,] 1.27511412 2.02045225
[9,] 1.99785662 1.29371909
[10,] 1.57382679 1.67371072
[11,] 1.13043606 2.04672731
[12,] 2.16779646 0.97844804
[13,] 1.31896346 1.82572017
[14,] 2.86899991 0.27342144
[15,] 1.02239528 2.06880193
[16,] 1.41871832 1.61886477
[17,] 0.61692059 2.41055429
[18,] 2.08733082 0.93102859
[19,] 1.73449806 1.26078652
[20,] 1.50998776 1.46777173
[21,] 0.68295530 2.28103379
[22,] 1.10006116 1.86267983
[23,] 1.67163335 1.22631947
[24,] 2.84297022 0.03494379
[25,] 0.73488944 2.11073178
[26,] 0.19454803 2.63706860
[27,] 1.41278104 1.39142347
[28,] 2.38376299 0.39655191
[29,] -0.21332947 2.99271810
[30,] 0.93840091 1.81609473
[31,] 1.08977129 1.59761661
[32,] 0.99399433 1.67864193
[33,] 1.50417444 1.16689120
[34,] 1.37801737 1.27758166
[35,] 1.38857674 1.26640983
[36,] 0.49285605 2.12631211
[37,] 1.95732380 0.62233491
[38,] 1.75588598 0.82075740
[39,] 1.63202191 0.93960363
[40,] 1.00958740 1.55467405
[41,] 1.22709034 1.33023021
[42,] 1.82727142 0.72769846
[43,] 0.64080945 1.90976334
[44,] 1.90802271 0.64020605
[45,] 1.37376250 1.17309819
[46,] 2.19174713 0.34762955
[47,] 1.37209731 1.16428779
[48,] 0.99776378 1.52131110
[49,] 0.97570189 1.51376256
[50,] 0.37751608 2.10177973
[51,] 2.64064420 -0.16244316
[52,] -0.06799668 2.54429294
[53,] -0.11297388 2.56409146
[54,] 0.18276116 2.25808211
[55,] 0.86748840 1.54317084
[56,] 1.01959068 1.38840839
[57,] 0.31049813 2.07174489
[58,] 2.57218646 -0.20042047
[59,] 0.43159142 1.92332546
[60,] 1.14548557 1.20451898
[61,] 1.18842281 1.16096354
[62,] 0.14509532 2.20310382
[63,] 1.71464502 0.63034594
[64,] 0.49509192 1.84760252
[65,] -0.19538294 2.50487458
[66,] 0.65076870 1.62851601
[67,] 0.79276425 1.47429234
[68,] 0.49294418 1.76351477
[69,] 1.05090238 1.20011893
[70,] 1.12329642 1.10406194
[71,] 0.91750618 1.30614770
[72,] 0.38255633 1.80700094
[73,] -0.70628324 2.88275644
[74,] 0.81785703 1.35527122
[75,] 0.61736835 1.53563446
[76,] 0.71757075 1.42103969
[77,] -0.54767096 2.68612442
[78,] 1.73449729 0.37458133
[79,] 1.43235314 0.66089426
[80,] 1.29107030 0.79631281
[81,] 0.01009305 2.07608917
[82,] 0.92158497 1.15403588
[83,] 1.59299268 0.46658581
[84,] 0.62973667 1.42134061
[85,] 0.76568307 1.27930427
[86,] 0.51084090 1.52334552
[87,] 0.58444465 1.44544518
[88,] 1.25733785 0.76865748
[89,] 0.55390361 1.46795719
[90,] 0.68126624 1.33383569
[91,] 1.44631496 0.56683085
[92,] 1.17910664 0.82926629
[93,] 1.28767438 0.71362260
[94,] 0.31460129 1.67744918
[95,] -0.45976910 2.44260471
[96,] 0.91613623 1.04927534
[97,] -0.29856743 2.25574900
[98,] 0.24653043 1.70166728
[99,] 0.62058131 1.29314184
[100,] 1.56527403 0.33949439
Single trait example
The below example will demonstrate the Bulmer effect using a simple
simulation. An initial population will be created and subjected to 19
generations of selection before undergoing 20 generations of random
mating. The Bulmer effect can be visualized by tracking both the total
genetic variance and the genic variance. The genic variance only depends
on changes in allele frequency, so it will not experience the Bulmer
effect. The difference between genic and genetic variance will be
primarily due to LD and the Bulmer effect (assuming negligible
departures from HWE).
# Create founder population
founderPop = quickHaplo(nInd=1000, nChr=10, segSites=1000)
# Adding 1 trait with heritability of 1
SP = SimParam$
new(founderPop)$
addTraitA(1000)$
setVarE(h2=1)
pop = newPop(founderPop)
# Creating variables to store genic and genetic variance
genicVar = geneticVar = numeric(40)
# Calculate initial variances
gp = genParam(pop)
genicVar[1] = gp$genicVarA
geneticVar[1] = gp$varA[1]
# Subject the population to 19 rounds of selection
for(i in 2:20){
pop = selectCross(pop, nInd=100, nCrosses=1000)
gp = genParam(pop)
genicVar[i] = gp$genicVarA
geneticVar[i] = gp$varA[1]
}
# Subject the population to 20 rounds of random mating
for(i in 21:40){
pop = selectCross(pop, nInd=100, nCrosses=1000, use="rand")
gp = genParam(pop)
genicVar[i] = gp$genicVarA
geneticVar[i] = gp$varA[1]
}
# Plot the change in both variances over time
# Genetic (black) and genic (red)
plot(1:40, geneticVar, type="l",
ylim=c(0, 1.1),
xlab="Generation",
ylab="Variance")
lines(1:40, genicVar, col="red")

Multitrait example
This script will demonstrate how the Bulmer effect applies to
multiple traits. It proceeds by first selecting for higher values in
both traits for 19 generations before flipping the direction of
selection on the second trait for the next 20 generations. I find it a
useful demonstration of why we should be careful about attributing
biological mechanisms to genetic correlations.
founderPop = quickHaplo(nInd=1000, nChr=10, segSites=1000)
# Adding 2 uncorrelated traits
SP = SimParam$
new(founderPop)$
addTraitA(1000,
mean=c(0,0),
var=c(1,1),
corA=diag(2))$
setVarE(h2=c(1,1))
pop = newPop(founderPop)
# Creating a variable to store genetic correlation
corr = numeric(40)
# Measure initial correlation
gp = genParam(pop)
corr[1] = cor(gv(pop))[1,2]
# Select both traits for positive value for 19 rounds
for(i in 2:20){
pop = selectCross(pop, nInd=100, nCrosses=1000,
trait=selIndex, b=c(1,1))
corr[i] = cor(gv(pop))[1,2]
}
# Switch direction on second trait for 20 rounds
for(i in 21:40){
pop = selectCross(pop, nInd=100, nCrosses=1000,
trait=selIndex, b=c(1,-1))
corr[i] = cor(gv(pop))[1,2]
}
# Plot changes in genetic correlation
plot(1:40, corr, type="l",
xlab="Generation",
ylab="Correlation")
LS0tCnRpdGxlOiAnUXVhbnRpdGF0aXZlIEdlbmV0aWNzOiBBZGRpdGl2ZSBFZmZlY3RzJwpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpUaGlzIGRvY3VtZW50IGRlbW9uc3RyYXRlcyB0aGUgQnVsbWVyIGVmZmVjdCBhbmQgQnVsbWVyJ3MgcGFydGl0aW9uaW5nIG9mIGdlbmV0aWMgdmFyaWFuY2UgdXNpbmcgQWxwaGFTaW1SIGFuZCB0cmFpdHMgd2l0aCBvbmx5IGFkZGl0aXZlIGVmZmVjdHMuCgojIyBCdWxtZXIncyBwYXJ0aXRpb25pbmcgb2YgZ2VuZXRpYyB2YXJpYW5jZQoKQnVsbWVyIGhhZCBhIHNpbXVsYXRpb24gcGFwZXIgaW4gMTk3NiB3aGVyZSBoZSBkZWNvbXBvc2VkIGdlbmV0aWMgdmFyaWFuY2UgaW4gdGhlIGZvbGxvd2luZyB3YXk6CgokVl9HID0gVl9nICsgQ197SFd9ICsgQ19MJAoKJFZfRyQgaXMgdG90YWwgZ2VuZXRpYyB2YXJpYW5jZS4KCiRWX2ckIGlzIGdlbmljIHZhcmlhbmNlLiBUaGUgZXhwZWN0ZWQgdmFyaWFuY2UgYXQgSGFyZHktV2VpbmJlcmcgYW5kIGxpbmthZ2UgZXF1aWxpYnJpdW0uCgokQ197SFd9JCBpcyB0aGUgY292YXJpYW5jZSBkdWUgdG8gdGhlIGRlcGFydHVyZSBmcm9tIEhhcmR5LVdlaW5iZXJnIGVxdWlsaWJyaXVtIGluIHRoZSBvYnNlcnZlZCBnZW5vdHlwZSBmcmVxdWVuY2llcy4KCiRWX2cgKyBDX3tIV30kIGlzIHRoZSBleHBlY3RlZCBnZW5ldGljIHZhcmlhbmNlIGF0IHRoZSBvYnNlcnZlZCBnZW5vdHlwZSBmcmVxdWVuY2llcyBhbmQgbGlua2FnZSBlcXVpbGlicml1bS4KCiRDX0wkIGlzIHRoZSBjb3ZhcmlhbmNlIGR1ZSB0byBnZW5ldGljIGxpbmthZ2UgKGkuZS4gbGlua2FnZSBkaXNlcXVpbGlicml1bSkuCgpUaGlzIGRlY29tcG9zaXRpb24gb2YgZ2VuZXRpYyB2YXJpYW5jZSBpcyBpbXBsZW1lbnRlZCBpbiBBbHBoYVNpbVIgYW5kIGNhbiBiZSBhY2Nlc3NlZCB1c2luZyB0aGUgYGdlblBhcmFtYCBmdW5jdGlvbi4gTW9yZW92ZXIsIEFscGhhU2ltUiBpbXBsZW1lbnRzIHRoaXMgcGFydGl0aW9uaW5nIG9uIHRvcCBvZiB0aGUgY2xhc3NpYyBwYXJ0aXRpb25pbmcgb2YgZ2VuZXRpYyB2YXJpYW5jZSBpbnRvIGFkZGl0aXZlLCBkb21pbmFuY2UsIGFuZCBlcGlzdGFzaXMgKGFkZGl0aXZlLWJ5LWFkZGl0aXZlIG9ubHkpLgoKVGhlIHNjcmlwdCBiZWxvdyBkZW1vbnN0cmF0ZXMgaG93IHRvIGFjY2VzcyB0aGlzIHBhcnRpdGlvbmluZyBmb3IgYWRkaXRpdmUgZ2VuZXRpYyB2YXJpYW5jZSBpbiBhIHNpbXVsYXRpb24gdXNpbmcgb25seSBhZGRpdGl2ZSBlZmZlY3RzLiAoTm90ZSB0aGF0IGdlbmV0aWMgYW5kIGFkZGl0aXZlIHZhcmlhbmNlcyBhcmUgZXF1aXZhbGVudCB3aXRoIG9ubHkgYWRkaXRpdmUgZWZmZWN0cykKCmBgYHtyfQpsaWJyYXJ5KEFscGhhU2ltUikKCiMgR2VuZXJhdGUgZm91bmRlciBoYXBsb3R5cGVzIHVzaW5nIE1hQ1MKZm91bmRlclBvcCA9IHJ1bk1hY3MobkluZD0xMDAsIG5DaHI9MTAsIHNlZ1NpdGVzPTEwMCkKCiMgU2V0IHNpbXVsYXRpb24gcGFyYW1ldGVyIHdpdGggYSBzaW5nbGUgYWRkaXRpdmUgdHJhaXQKU1AgPSBTaW1QYXJhbSQKICBuZXcoZm91bmRlclBvcCkkCiAgYWRkVHJhaXRBKDEwMCwgbWVhbj0wLCB2YXI9MSkKCiMgQ3JlYXRlIGFuIGluaXRpYWwgcG9wdWxhdGlvbgpwb3AgPSBuZXdQb3AoZm91bmRlclBvcCkKCiMgTWVhc3VyZSBtZWFuIGFuZCB2YXJpYW5jZSAoZGVmaW5lZCBpbiBTaW1QYXJhbSkKbWVhbkcocG9wKQp2YXJHKHBvcCkKCiMgRXh0cmFjdCB0aGUgYWRkaXRpdmUgZWZmZWN0cwphID0gU1AkdHJhaXRzW1sxXV1AYWRkRWZmCmhpc3QoYSkKbWVhbihhKQp2YXIoYSkKCiMgUHVsbCB0aGUgUVRMIGdlbm90eXBlcyBhbmQgY2FsY3VsYXRlIGFsbGVsZSBmcmVxdWVuY3kKUVRMID0gcHVsbFF0bEdlbm8ocG9wKQpwID0gY29sTWVhbnMoUVRMKS8yCnEgPSAxLXAKaGlzdChwKQoKIyBEZXRlcm1pbmUgdGhlIGFtb3VudCBvZiBkZXBhcnR1cmUgZnJvbSBIYXJkeS1XZWluYmVyZyBlcXVpbGlicml1bQojIHByb2IoaGV0ZXJvenlnb3VzKSA9IDIqKDEtRikqcCpxCnBIZXQgPSBjb2xNZWFucyhRVEw9PTEpCkYgPSAxIC0gcEhldC8oMipwKnEpCmhpc3QoRikKCiMgQ2FsY3VsYXRlIGdlbmV0aWMgcGFyYW1ldGVycyBmb3IgdGhlIHBvcHVsYXRpb24KZ3AgPSBnZW5QYXJhbShwb3ApCnN0cihncCkKCiMgR2VuaWMgdmFyaWFuY2UgKEhXRSBhbmQgbm8gTEQpCmdwJGdlbmljVmFyQQpzdW0oMipwKnEqYV4yKQoKIyBFeHBlY3RlZCBnZW5ldGljIHZhcmlhbmNlIHdpdGhvdXQgTEQKZ3AkZ2VuaWNWYXJBICsgZ3AkY292QV9IVwpzdW0oMiooMStGKSpwKnEqYV4yKQoKIyBUb3RhbCBhZGRpdGl2ZSB2YXJpYW5jZQpncCR2YXJBCmdwJGdlbmljVmFyQSArIGdwJGNvdkFfSFcgKyBncCRjb3ZBX0wKYGBgCgojIyBCdWxtZXIgZWZmZWN0CgpUaGUgYmVsb3cgc2NyaXB0cyB3aWxsIGlsbHVzdHJhdGUgdGhlIEJ1bG1lciBlZmZlY3QuIFRoZSBmaXJzdCBzaG93cyB0aGUgZWZmZWN0IGFzIGEgbW9yZSBnZW5lcmFsIHByb3BlcnR5IGJ5IHNlbGVjdGluZyBkaWZmZXJlbnQgcGFydHMgb2YgYSBiaXZhcmlhdGUgbm9ybWFsIGRpc3RyaWJ1dGlvbiB0byBtb2RlbCBkaXJlY3Rpb25hbCwgc3RhYmlsaXppbmcgYW5kIGRpc3J1cHRpdmUgc2VsZWN0aW9uLgoKIVtTb3VyY2U6IFdhbHNoICYgTHluY2hdKC4vU2VsZWN0aW9uLnBuZykKCmBgYHtyfQojIEdlbmVyYXRlIGJpdmFyaWF0ZSBub3JtYWxseSBkaXN0cmlidXRlZCBkYXRhIHdpdGhvdXQgY29ycmVsYXRpb24KWCA9IG1hdHJpeChybm9ybSgyKjEwMDApLCBucm93PTEwMDApCgpwbG90KFgpCmNvcihYKQoKIyBPcmRlciB0aGUgZGF0YSBieSB0aGUgc3VtIG9mIHRoZSB0d28gdmFyaWFibGVzCnogPSByb3dTdW1zKFgpClggPSBYW29yZGVyKHosIGRlY3JlYXNpbmc9VFJVRSksIF0KCiMgRGlyZWN0aW9uYWwgc2VsZWN0aW9uCmNvcihYWzE6MTAwLF0pCgojIFN0YWJpbGl6aW5nIHNlbGVjdGlvbgpjb3IoWFs0NTE6NTUwLF0pCgojIERpc3J1cHRpdmUgc2VsZWN0aW9uCmNvcihYW2MoMTo1MCwgOTUxOjEwMDApLF0pCgpgYGAKCiMjIyBTaW5nbGUgdHJhaXQgZXhhbXBsZQoKVGhlIGJlbG93IGV4YW1wbGUgd2lsbCBkZW1vbnN0cmF0ZSB0aGUgQnVsbWVyIGVmZmVjdCB1c2luZyBhIHNpbXBsZSBzaW11bGF0aW9uLiBBbiBpbml0aWFsIHBvcHVsYXRpb24gd2lsbCBiZSBjcmVhdGVkIGFuZCBzdWJqZWN0ZWQgdG8gMTkgZ2VuZXJhdGlvbnMgb2Ygc2VsZWN0aW9uIGJlZm9yZSB1bmRlcmdvaW5nIDIwIGdlbmVyYXRpb25zIG9mIHJhbmRvbSBtYXRpbmcuIFRoZSBCdWxtZXIgZWZmZWN0IGNhbiBiZSB2aXN1YWxpemVkIGJ5IHRyYWNraW5nIGJvdGggdGhlIHRvdGFsIGdlbmV0aWMgdmFyaWFuY2UgYW5kIHRoZSBnZW5pYyB2YXJpYW5jZS4gVGhlIGdlbmljIHZhcmlhbmNlIG9ubHkgZGVwZW5kcyBvbiBjaGFuZ2VzIGluIGFsbGVsZSBmcmVxdWVuY3ksIHNvIGl0IHdpbGwgbm90IGV4cGVyaWVuY2UgdGhlIEJ1bG1lciBlZmZlY3QuIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gZ2VuaWMgYW5kIGdlbmV0aWMgdmFyaWFuY2Ugd2lsbCBiZSBwcmltYXJpbHkgZHVlIHRvIExEIGFuZCB0aGUgQnVsbWVyIGVmZmVjdCAoYXNzdW1pbmcgbmVnbGlnaWJsZSBkZXBhcnR1cmVzIGZyb20gSFdFKS4KCmBgYHtyfQoKIyBDcmVhdGUgZm91bmRlciBwb3B1bGF0aW9uCmZvdW5kZXJQb3AgPSBxdWlja0hhcGxvKG5JbmQ9MTAwMCwgbkNocj0xMCwgc2VnU2l0ZXM9MTAwMCkKCiMgQWRkaW5nIDEgdHJhaXQgd2l0aCBoZXJpdGFiaWxpdHkgb2YgMQpTUCA9IFNpbVBhcmFtJAogIG5ldyhmb3VuZGVyUG9wKSQKICBhZGRUcmFpdEEoMTAwMCkkCiAgc2V0VmFyRShoMj0xKQoKcG9wID0gbmV3UG9wKGZvdW5kZXJQb3ApCgojIENyZWF0aW5nIHZhcmlhYmxlcyB0byBzdG9yZSBnZW5pYyBhbmQgZ2VuZXRpYyB2YXJpYW5jZQpnZW5pY1ZhciA9IGdlbmV0aWNWYXIgPSBudW1lcmljKDQwKQoKIyBDYWxjdWxhdGUgaW5pdGlhbCB2YXJpYW5jZXMKZ3AgPSBnZW5QYXJhbShwb3ApCmdlbmljVmFyWzFdID0gZ3AkZ2VuaWNWYXJBCmdlbmV0aWNWYXJbMV0gPSBncCR2YXJBWzFdCgojIFN1YmplY3QgdGhlIHBvcHVsYXRpb24gdG8gMTkgcm91bmRzIG9mIHNlbGVjdGlvbgpmb3IoaSBpbiAyOjIwKXsKICBwb3AgPSBzZWxlY3RDcm9zcyhwb3AsIG5JbmQ9MTAwLCBuQ3Jvc3Nlcz0xMDAwKQogIAogIGdwID0gZ2VuUGFyYW0ocG9wKQogIGdlbmljVmFyW2ldID0gZ3AkZ2VuaWNWYXJBCiAgZ2VuZXRpY1ZhcltpXSA9IGdwJHZhckFbMV0KfQoKIyBTdWJqZWN0IHRoZSBwb3B1bGF0aW9uIHRvIDIwIHJvdW5kcyBvZiByYW5kb20gbWF0aW5nCmZvcihpIGluIDIxOjQwKXsKICBwb3AgPSBzZWxlY3RDcm9zcyhwb3AsIG5JbmQ9MTAwLCBuQ3Jvc3Nlcz0xMDAwLCB1c2U9InJhbmQiKQogIAogIGdwID0gZ2VuUGFyYW0ocG9wKQogIGdlbmljVmFyW2ldID0gZ3AkZ2VuaWNWYXJBCiAgZ2VuZXRpY1ZhcltpXSA9IGdwJHZhckFbMV0KfQoKIyBQbG90IHRoZSBjaGFuZ2UgaW4gYm90aCB2YXJpYW5jZXMgb3ZlciB0aW1lCiMgR2VuZXRpYyAoYmxhY2spIGFuZCBnZW5pYyAocmVkKQpwbG90KDE6NDAsIGdlbmV0aWNWYXIsIHR5cGU9ImwiLAogICAgIHlsaW09YygwLCAxLjEpLAogICAgIHhsYWI9IkdlbmVyYXRpb24iLAogICAgIHlsYWI9IlZhcmlhbmNlIikKbGluZXMoMTo0MCwgZ2VuaWNWYXIsIGNvbD0icmVkIikKYGBgCgojIyMgTXVsdGl0cmFpdCBleGFtcGxlCgpUaGlzIHNjcmlwdCB3aWxsIGRlbW9uc3RyYXRlIGhvdyB0aGUgQnVsbWVyIGVmZmVjdCBhcHBsaWVzIHRvIG11bHRpcGxlIHRyYWl0cy4gSXQgcHJvY2VlZHMgYnkgZmlyc3Qgc2VsZWN0aW5nIGZvciBoaWdoZXIgdmFsdWVzIGluIGJvdGggdHJhaXRzIGZvciAxOSBnZW5lcmF0aW9ucyBiZWZvcmUgZmxpcHBpbmcgdGhlIGRpcmVjdGlvbiBvZiBzZWxlY3Rpb24gb24gdGhlIHNlY29uZCB0cmFpdCBmb3IgdGhlIG5leHQgMjAgZ2VuZXJhdGlvbnMuIEkgZmluZCBpdCBhIHVzZWZ1bCBkZW1vbnN0cmF0aW9uIG9mIHdoeSB3ZSBzaG91bGQgYmUgY2FyZWZ1bCBhYm91dCBhdHRyaWJ1dGluZyBiaW9sb2dpY2FsIG1lY2hhbmlzbXMgdG8gZ2VuZXRpYyBjb3JyZWxhdGlvbnMuCgpgYGB7cn0KZm91bmRlclBvcCA9IHF1aWNrSGFwbG8obkluZD0xMDAwLCBuQ2hyPTEwLCBzZWdTaXRlcz0xMDAwKQoKIyBBZGRpbmcgMiB1bmNvcnJlbGF0ZWQgdHJhaXRzClNQID0gU2ltUGFyYW0kCiAgbmV3KGZvdW5kZXJQb3ApJAogIGFkZFRyYWl0QSgxMDAwLCAKICAgICAgICAgICAgbWVhbj1jKDAsMCksCiAgICAgICAgICAgIHZhcj1jKDEsMSksCiAgICAgICAgICAgIGNvckE9ZGlhZygyKSkkCiAgc2V0VmFyRShoMj1jKDEsMSkpCgpwb3AgPSBuZXdQb3AoZm91bmRlclBvcCkKCiMgQ3JlYXRpbmcgYSB2YXJpYWJsZSB0byBzdG9yZSBnZW5ldGljIGNvcnJlbGF0aW9uCmNvcnIgPSBudW1lcmljKDQwKQoKIyBNZWFzdXJlIGluaXRpYWwgY29ycmVsYXRpb24KZ3AgPSBnZW5QYXJhbShwb3ApCmNvcnJbMV0gPSBjb3IoZ3YocG9wKSlbMSwyXQoKIyBTZWxlY3QgYm90aCB0cmFpdHMgZm9yIHBvc2l0aXZlIHZhbHVlIGZvciAxOSByb3VuZHMKZm9yKGkgaW4gMjoyMCl7CiAgcG9wID0gc2VsZWN0Q3Jvc3MocG9wLCBuSW5kPTEwMCwgbkNyb3NzZXM9MTAwMCwgCiAgICAgICAgICAgICAgICAgICAgdHJhaXQ9c2VsSW5kZXgsIGI9YygxLDEpKQogIGNvcnJbaV0gPSBjb3IoZ3YocG9wKSlbMSwyXQp9CgojIFN3aXRjaCBkaXJlY3Rpb24gb24gc2Vjb25kIHRyYWl0IGZvciAyMCByb3VuZHMKZm9yKGkgaW4gMjE6NDApewogIHBvcCA9IHNlbGVjdENyb3NzKHBvcCwgbkluZD0xMDAsIG5Dcm9zc2VzPTEwMDAsIAogICAgICAgICAgICAgICAgICAgIHRyYWl0PXNlbEluZGV4LCBiPWMoMSwtMSkpCiAgY29ycltpXSA9IGNvcihndihwb3ApKVsxLDJdCn0KCiMgUGxvdCBjaGFuZ2VzIGluIGdlbmV0aWMgY29ycmVsYXRpb24KcGxvdCgxOjQwLCBjb3JyLCB0eXBlPSJsIiwKICAgICB4bGFiPSJHZW5lcmF0aW9uIiwKICAgICB5bGFiPSJDb3JyZWxhdGlvbiIpCmBgYAo=