In this example, I use Siena to create data and assess how homophily and influence interact each other under misspecification (removing and including influence effect). I use parameters similar to the ones I get by analyzing data from scenario I in ISA v6.
Only influence simulation
Parameters I use:
# simulation values (I use some of the values I get from our model)
n <- 200 # actors
M <- 10 # waves
c <- 10 # number of categories behavior, uniform distribution
# network
rate <- 2 # rate network change
dens <- -2 # density
rec <- 2 # reciprocity
tt <- 0.5 # transitivity
c3 <- -0.3 # cycles
ego.b <- 0 # ego behavior covariate
alt.b <- 0 # alter behavior covariate
sim.b <- 0 # similarity behavior
# behavior
rate.b <- 1 # rate behavior change
lin.b <- 0.01 # linear trend
qu.b <- -0.20 # quadratic trend
avalt.b <- 1.5 # average alter
# run simulation
ss <- SimulateNetworksBehavior(n, M, c, rate, dens, rec, tt, c3, ego.b, alt.b, sim.b,
rate.b, lin.b, qu.b, avalt.b)
Average degrees 6.63 7.01 7.34 7.79 8.41 8.97 9.63 10.54 11.19 12.18
Average behavior 4.55 4.46 4.58 4.5 4.66 4.88 5.03 5.23 5.22 5.24
I use only the last four waves. The table below shows the estimates from different Siena specifications.
Observed autocorrelation from the simulated networks are kind of similar the ones we get from our ABM:
obs0[, moran_obs]
[1] 0.2559024 0.2453175 0.2539917
screenreg(list(m0, m1, m2), custom.model.names = c("N", "N+S", "N+S+I"))
=======================================================================
N N+S N+S+I
-----------------------------------------------------------------------
constant network rate (period 1) 2.13 *** 2.13 *** 2.13 ***
(0.11) (0.11) (0.12)
constant network rate (period 2) 1.91 *** 1.91 *** 1.91 ***
(0.10) (0.10) (0.10)
constant network rate (period 3) 1.94 *** 1.95 *** 1.95 ***
(0.11) (0.11) (0.10)
outdegree (density) -1.97 *** -1.97 *** -1.97 ***
(0.05) (0.05) (0.05)
reciprocity 1.96 *** 1.96 *** 1.96 ***
(0.09) (0.08) (0.09)
transitive triplets 0.49 *** 0.49 *** 0.49 ***
(0.02) (0.02) (0.02)
3-cycles -0.26 *** -0.26 *** -0.26 ***
(0.04) (0.04) (0.04)
rate beh (period 1) 1.10 *** 1.09 *** 0.99 ***
(0.13) (0.16) (0.13)
rate beh (period 2) 0.87 *** 0.87 *** 0.81 ***
(0.11) (0.11) (0.10)
rate beh (period 3) 1.06 *** 1.06 *** 0.97 ***
(0.13) (0.12) (0.13)
beh linear shape 0.11 * 0.11 0.17
(0.06) (0.06) (0.09)
beh quadratic shape 0.01 0.01 -0.19 **
(0.01) (0.01) (0.07)
beh alter 0.01 0.01
(0.01) (0.01)
beh ego 0.01 0.01
(0.01) (0.01)
beh similarity 0.06 0.05
(0.13) (0.13)
beh average alter 1.52 **
(0.49)
-----------------------------------------------------------------------
Iterations 2433 2548 2573
=======================================================================
*** p < 0.001, ** p < 0.01, * p < 0.05
I compute the difference between the observed and simulated autocorrelation (Moran’s I) to assess goodness-of-fit. Both specificationsn (N and N+S) are very off: there is more autocorrelation than the estimated by the Siena model.


When I add the influence effect, differences are closer to zero.

Again, there seems to be not counfounding between selection and influence.
Other GOF statistics (N+S+I)
This is good fit. Reality and our ABM are another story.
Note: some statistics are not plotted because their variance is 0.
This holds for the statistic: 10.



Note: some statistics are not plotted because their variance is 0.
This holds for the statistics: 4 5 Inf.


Network misspecification
What happens if I misspecify the network. The selection coefficient increases but it is still very noisy. This suggests that most of the problem in our ABM is related to finding good fit of the network part or the behavior change (I am not sure what more important is).
screenreg(m3)
=============================================
Model 1
---------------------------------------------
constant network rate (period 1) 2.12 ***
(0.11)
constant network rate (period 2) 1.91 ***
(0.10)
constant network rate (period 3) 1.95 ***
(0.11)
outdegree (density) -1.32 ***
(0.04)
reciprocity 2.01 ***
(0.08)
beh alter 0.01
(0.01)
beh ego 0.00
(0.01)
beh similarity 0.13
(0.13)
rate beh (period 1) 0.99 ***
(0.13)
rate beh (period 2) 0.82 ***
(0.11)
rate beh (period 3) 0.98 ***
(0.13)
beh linear shape 0.16
(0.09)
beh quadratic shape -0.19 **
(0.07)
beh average alter 1.52 **
(0.49)
---------------------------------------------
Iterations 2514
=============================================
*** p < 0.001, ** p < 0.01, * p < 0.05
LS0tCnRpdGxlOiAiQXNzZXNzaW5nIEluZmx1ZW5jZSBNaXNzcGVjaWZpY2F0aW9uIGluIFNpZW5hIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpJbiB0aGlzIGV4YW1wbGUsIEkgdXNlIFNpZW5hIHRvIGNyZWF0ZSBkYXRhIGFuZCBhc3Nlc3MgaG93IGhvbW9waGlseSBhbmQgaW5mbHVlbmNlIGludGVyYWN0IGVhY2ggb3RoZXIgdW5kZXIgbWlzc3BlY2lmaWNhdGlvbiAocmVtb3ZpbmcgYW5kIGluY2x1ZGluZyBpbmZsdWVuY2UgZWZmZWN0KS4gSSB1c2UgcGFyYW1ldGVycyBzaW1pbGFyIHRvIHRoZSBvbmVzIEkgZ2V0IGJ5IGFuYWx5emluZyBkYXRhIGZyb20gc2NlbmFyaW8gSSBpbiBJU0EgdjYuIAoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KFJTaWVuYVRlc3QpCmxpYnJhcnkobmV0d29yaykKbGlicmFyeSh0ZXhyZWcpCmxpYnJhcnkoc2RhemFyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoc25hKQoKIyBmdW5jdGlvbnMKCnNpZW5hMDdUb0NvbnZlcmdlbmNlIDwtIGZ1bmN0aW9uKGFsZywgZGF0LCBlZmYsIGFuczAgPSBOVUxMLCBub2RlcyA9IDEsIC4uLikgewoKbnVtciA8LSAwCmFucyA8LSBzaWVuYTA3KGFsZywgZGF0YSA9IGRhdCwgZWZmZWN0cyA9IGVmZiwgcHJldkFucyA9IGFuczAsIGJhdGNoID0gVFJVRSwKICAgICAgICAgICAgICAgdmVyYm9zZSA9IEZBTFNFLCB1c2VDbHVzdGVyID0gVFJVRSwgbmJyTm9kZXMgPSBub2RlcywKICAgICAgICAgICAgICAgcmV0dXJuRGVwcyA9IFRSVUUsIHNpbGVudCA9IFRSVUUpICMgdGhlIGZpcnN0IHJ1bgoKcmVwZWF0IHsKbnVtciA8LSBudW1yICsgMQp0bSA8LSBhbnMkdGNvbnYubWF4CmNhdChudW1yLCB0bSwiXG4iKQppZiAodG0gPCAwLjI1ICYgbnVtciA+IDApIHticmVha30KaWYgKHRtID4gOCkge2JyZWFrfQojIGNvdW50IG51bWJlciBvZiByZXBlYXRlZCBydW5zCiMgY29udmVyZ2VuY2UgaW5kaWNhdG9yCiMgcmVwb3J0IGhvdyBmYXIgd2UgYXJlCiMgc3VjY2VzcwojIGRpdmVyZ2VuY2Ugd2l0aG91dCBtdWNoIGhvcGUKIyBvZiByZXR1cm5pbmcgdG8gZ29vZCBwYXJhbWV0ZXIgdmFsdWVzCmlmIChudW1yID4gMTApIHticmVha30gICMgbm93IGl0IGhhcyBsYXN0ZWQgdG9vIGxvbmcKYW5zIDwtIHNpZW5hMDcoYWxnLCBkYXRhID0gZGF0LCBlZmZlY3RzID0gZWZmLCBwcmV2QW5zID0gYW5zLCBiYXRjaCA9IFRSVUUsCiAgICAgICAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSwgdXNlQ2x1c3RlciA9IFRSVUUsIG5ick5vZGVzID0gbm9kZXMsIHJldHVybkRlcHMgPSBUUlVFLAogICAgICAgICAgICAgICBzaWxlbnQgPSBUUlVFKQp9CiBpZiAodG0gPiAwLjI1KQogewogICAgY2F0KCJXYXJuaW5nOiBjb252ZXJnZW5jZSBpbmFkZXF1YXRlLlxuIikKIH0KCmFucwoKfQoKCgpNb3JhbkdlYXJ5IDwtIGZ1bmN0aW9uKGksIGRhdGEsIHNpbXMsIHdhdmUsIGdyb3VwTmFtZSwgdmFyTmFtZSwgbGV2bHM9MToyKXsKeCA8LSBuZXR3b3JrOjphcy5zb2Npb21hdHJpeChuZXR3b3JrRXh0cmFjdGlvbihpLCBkYXRhLCBzaW1zLCB3YXZlLCBncm91cE5hbWUsIHZhck5hbWVbMV0pKQp6IDwtIGJlaGF2aW9yRXh0cmFjdGlvbihpLGRhdGEsc2ltcyx3YXZlLGdyb3VwTmFtZSx2YXJOYW1lWzJdKQpuIDwtIGxlbmd0aCh6KQp6LmF2ZSA8LSBtZWFuKHosbmEucm09VFJVRSkKbnVtZXJhdG9yIDwtIG4qc3VtKHgqb3V0ZXIoei16LmF2ZSx6LXouYXZlKSxuYS5ybT1UUlVFKQpkZW5vbWluYXRvciA8LSBzdW0oeCxuYS5ybT1UUlVFKSpzdW0oKHotei5hdmUpXjIsbmEucm09VFJVRSkKcmVzIDwtIG51bWVyYXRvci9kZW5vbWluYXRvcgpudW1lcmF0b3IgPC0gKG4tMSkqc3VtKHgqKG91dGVyKHoseixGVU49Jy0nKV4yKSxuYS5ybT1UUlVFKQpkZW5vbWluYXRvciA8LSAyKnN1bSh4LG5hLnJtPVRSVUUpKnN1bSgoei16LmF2ZSleMixuYS5ybT1UUlVFKQpyZXNbMl0gPC0gbnVtZXJhdG9yL2Rlbm9taW5hdG9yCm5hbWVzKHJlcykgPC0gYygiTW9yYW4iLCJHZWFyeSIpCnJldHVybihyZXMpCn0KCk1vcmFuIDwtIGZ1bmN0aW9uKHgsIG15bmV0d29yaykgewpuZXQgPC0gbmV0d29yazo6YXMuc29jaW9tYXRyaXgobXluZXR3b3JrKQp4LmF2ZSA8LSBtZWFuKHgsIG5hLnJtID0gVFJVRSkKbiA8LSBsZW5ndGgoeCkKbnVtZXJhdG9yIDwtIG4gKiBzdW0gKCBuZXQgKiBvdXRlcih4IC0geC5hdmUsIHggLSB4LmF2ZSksIG5hLnJtID0gVFJVRSApCmRlbm9taW5hdG9yIDwtIHN1bShuZXQsIG5hLnJtID0gVFJVRSkgKiBzdW0gKCh4IC0geC5hdmUpXjIsIG5hLnJtID0gVFJVRSkKcmVzIDwtIG51bWVyYXRvciAvIGRlbm9taW5hdG9yCnJldHVybihyZXMpCn0KCkdlYXJ5IDwtIGZ1bmN0aW9uKHgsIG15bmV0d29yaykgewpuZXQgPC0gbmV0d29yazo6YXMuc29jaW9tYXRyaXgobXluZXR3b3JrKQp4LmF2ZSA8LSBtZWFuKHgsIG5hLnJtID0gVFJVRSkKbiA8LSBsZW5ndGgoeCkKbnVtZXJhdG9yIDwtIChuIC0gMSkgKiBzdW0obmV0ICogKG91dGVyKHgsIHgsIEZVTiA9ICctJyleMiApLCBuYS5ybSA9IFRSVUUpCmRlbm9taW5hdG9yIDwtIDIgKiBzdW0obmV0LCBuYS5ybT1UUlVFKSAqIHN1bSgoeCAtIHguYXZlKV4yICxuYS5ybT1UUlVFKQpyZXMgPC0gbnVtZXJhdG9yIC8gZGVub21pbmF0b3IKcmV0dXJuKHJlcykKfQoKR2VvZGVzaWNEaXN0cmlidXRpb24gPC0gZnVuY3Rpb24gKGksIGRhdGEsIHNpbXMsIHBlcmlvZCwgZ3JvdXBOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgdmFyTmFtZSwgbGV2bHM9YygxOjUsSW5mKSwgY3VtdWxhdGl2ZT1UUlVFLCAuLi4pIHsKICAgeCA8LSBuZXR3b3JrRXh0cmFjdGlvbihpLCBkYXRhLCBzaW1zLCBwZXJpb2QsIGdyb3VwTmFtZSwgdmFyTmFtZSkKICAgYSA8LSBzbmE6Omdlb2Rpc3Qoc3ltbWV0cml6ZSh4KSkkZ2Rpc3QKICAgaWYgKGN1bXVsYXRpdmUpCiAgIHsKICAgICBnZGkgPC0gc2FwcGx5KGxldmxzLCBmdW5jdGlvbihpKXsgc3VtKGE8PWkpIH0pCiAgIH0KIGVsc2UKICAgewogICAgIGdkaSA8LSBzYXBwbHkobGV2bHMsIGZ1bmN0aW9uKGkpeyBzdW0oYT09aSkgfSkKICAgfQogICBuYW1lcyhnZGkpIDwtIGFzLmNoYXJhY3RlcihsZXZscykKICAgZ2RpCn0KCgpUcmlhZENlbnN1cyA8LSBmdW5jdGlvbihpLCBkYXRhLCBzaW1zLCB3YXZlLCBncm91cE5hbWUsIHZhck5hbWUsIGxldmxzPTE6MTYpewogICAgIHggPC0gbmV0d29ya0V4dHJhY3Rpb24oaSwgZGF0YSwgc2ltcywgd2F2ZSwgZ3JvdXBOYW1lLCB2YXJOYW1lKQogICBpZiAobmV0d29yazo6bmV0d29yay5lZGdlY291bnQoeCkgPD0gMCl7eCA8LSBzeW1tZXRyaXplKHgpfQogICAgICMgYmVjYXVzZSBlbHNlIHRyaWFkLmNlbnN1cyh4KSB3aWxsIGxlYWQgdG8gYW4gZXJyb3IKICAgICB0YyA8LSBzbmE6OnRyaWFkLmNlbnN1cyh4KVsxLGxldmxzXQogICAgICMgbmFtZXMgYXJlIHRyYW5zZmVycmVkIGF1dG9tYXRpY2FsbHkKICAgICB0YwogfQoKIyBnZXQgbW9yYW4gYW5kIGdlYXJ5IG1lYXN1cmVzCmdldEF1dG9Db3JyIDwtIGZ1bmN0aW9uKG1vZGVsLCBwZXJpb2QsIHZhcm5hbWVzLCBncm91cE5hbWUgPSAiRGF0YTEiLAogICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZWQgPSBGQUxTRSwgbnVtc2ltID0gTlVMTCkgewpvdXRwdXQgPC0gbGlzdCgpCm5zaW0gPC0gMTpsZW5ndGgobW9kZWwkc2ltcykKaWYgKCFpcy5udWxsKG51bXNpbSkpIHsKICBpZiAobnVtc2ltID4gMCkgbnNpbSA8LSBzYW1wbGUobnNpbSwgbnVtc2ltKQp9Cgpmb3IgKGogaW4gc2VxX2Fsb25nKHBlcmlvZCkpIHsKICAjIHByaW50KHBhc3RlMCgiQ29tcHV0aW5nIFBlcmlvZCA9ICIsIGosIi4uLiIpKQogIG1vcmFuIDwtIE5BOyBnZWFyeSA8LSBOQQogICAgaWYgKG9ic2VydmVkKSB7CiAgICAgIG5ldCA8LSBuZXR3b3JrRXh0cmFjdGlvbihOVUxMLCBtb2RlbCRmLCBtb2RlbCRzaW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kID0gcGVyaW9kW2pdLCBncm91cE5hbWU9IGdyb3VwTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhck5hbWU9IHZhcm5hbWVzWzFdKQogICAgICBiZWggPC0gYmVoYXZpb3JFeHRyYWN0aW9uKE5VTEwsIG1vZGVsJGYsIG1vZGVsJHNpbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kID0gcGVyaW9kW2pdLCBncm91cE5hbWU9IGdyb3VwTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJOYW1lPSB2YXJuYW1lc1syXSkKICAgICAgbW9yYW4gPC0gIE1vcmFuKGJlaCwgbmV0KQogICAgICBnZWFyeSA8LSAgR2VhcnkoYmVoLCBuZXQpCiAgICB9CiAgICBlbHNlIGlmIChvYnNlcnZlZCA9PSBGQUxTRSkgewogICAgICBmb3IgKGkgaW4gc2VxX2Fsb25nKG5zaW0pKSB7CiAgICAgICAgbmV0IDwtIG5ldHdvcmtFeHRyYWN0aW9uKG5zaW1baV0sIG1vZGVsJGYsIG1vZGVsJHNpbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZCA9IHBlcmlvZFtqXSwgZ3JvdXBOYW1lPSBncm91cE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhck5hbWU9IHZhcm5hbWVzWzFdKQogICAgICAgIGJlaCA8LSBiZWhhdmlvckV4dHJhY3Rpb24obnNpbVtpXSwgbW9kZWwkZiwgbW9kZWwkc2ltcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kID0gcGVyaW9kW2pdLCBncm91cE5hbWU9IGdyb3VwTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyTmFtZT0gdmFybmFtZXNbMl0pCiAgICAgICAgIG1vcmFuW2ldIDwtICBNb3JhbihiZWgsIG5ldCkKICAgICAgICAgZ2VhcnlbaV0gPC0gIEdlYXJ5KGJlaCwgbmV0KQoKICAgICAgfQogICAgfQogIG91dHB1dFtbal1dIDwtIGRhdGEuZnJhbWUobW9yYW4sIGdlYXJ5KQogIHJlc3VsdCA8LSBkYXRhLnRhYmxlOjpyYmluZGxpc3Qob3V0cHV0LCBpZGNvbCA9ICJ0aW1lIikKfQpyZXR1cm4ocmVzdWx0KQp9CgoKU2ltdWxhdGVOZXR3b3Jrc0JlaGF2aW9yIDwtIGZ1bmN0aW9uKG4sIE0sIGMsIHJhdGUsIGRlbnMsIHJlYywgdHQsIGMzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWdvLmIsIGFsdC5iLCBzaW0uYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUuYiwgbGluLmIsIHF1LmIsIGF2YWx0LmIpewoKICAjIFNpbXVsYXRlcyBNIGNvbnNlY3V0aXZlIG5ldHdvcmsgYW5kIGJlaGF2aW9yIHdhdmVzLCB3aXRoIG4gYWN0b3JzLAogICMgd2l0aCBjIGNhdGVnb3JpZXMgb2YgdGhlIGJlaGF2aW9yIHZhcmlhYmxlLAogICMgYWNjb3JkaW5nIHRvIGEgc3RvY2hhc3RpYyBhY3Rvci1vcmllbnRlZCBtb2RlbAogICMgd2l0aCBwYXJhbWV0ZXIgdmFsdWVzIHJhdGUgZm9yIHJhdGUsCiAgIyBkZW5zIGZvciBvdXRkZWdyZWUsIHJlYyBmb3IgcmVjaXByb2NpdHksCiAgIyB0dCBmb3IgdHJhbnNpdGl2ZSB0cmlwbGV0cywgYzMgZm9yIDMtY3ljbGVzLAogICMgd2l0aCBmb3IgdGhlIGJlaGF2aW9yYWwgZGVwZW5kZW50IHZhcmlhYmxlIHBhcmFtZXRlciB2YWx1ZXMKICAjIHJhdGUuYiBmb3IgcmF0ZSwgbGluLmIgZm9yIGxpbmVhciB0ZW5kZW5jeSwKICAjIHF1LmIgZm9yIHF1YWRyYXRpYyB0ZW5kZW5jeSwgYW5kIGF2YWx0LmIgZm9yIGF2ZXJhZ2UgYWx0ZXIuCgogICMgQ3JlYXRlIGluaXRpYWwgMi13YXZlIGRhdGEgdG8gZ2V0IGEgc3VpdGFibGUgZGF0YSBzdHJ1Y3R1cmUuCiAgIyBhcmJpdHJhcmlseSwgdGhpcyBpbml0aWFsIG5ldHdvcmsgaGFzIGFuIGV4cGVjdGVkIGF2ZXJhZ2UgZGVncmVlIG9mIDMKICBYMCA8LSBtYXRyaXgocmJpbm9tKG4qbiwxLDIvKG4tMSkpLG4sbikKICBkaWFnKFgwKSA8LSAwCiAgWDEgPC0gWDAKICAKICAjIGJ1dCBYMCBhbmQgWDEgc2hvdWxkIG5vdCBiZSBpZGVudGljYWwgZm9yIHVzZSBpbiBzaWVuYURlcGVuZGVudAogIFgwWzEsMl0gPC0gMAogIFgwWzIsMV0gPC0gMQogIFgxWzEsMl0gPC0gMQogIFgxWzIsMV0gPC0gMAogIFhYIDwtIGFycmF5KE5BLGMobixuLDIpKQogIFhYWywsMV0gPC0gWDAKICBYWFssLDJdIDwtIFgxCiAgCiAgIyBDcmVhdGUgYmVoYXZpb3IgdmFyaWFibGU7IGluaXRpYWwgZGlzdHJpYnV0aW9uIHVuaWZvcm0gb24gezEsIC4uLiwgY30uCiAgWlogPC0gcG1pbihtYXRyaXgodHJ1bmMoYypydW5pZihuKjIpKSsxLCBuLCAyKSwgYykKICAjIGhpc3QoWlosIGJyZWFrcyAgPSAxMykKICAjIHRhYmxlKFpaKQogIAogICMgV2l0aCB0aGlzIGRhdGEgc3RydWN0dXJlLCB3ZSBub3cgY2FuIGNyZWF0ZSB0aGUgZGF0YS4KICBYICAgPC0gc2llbmFEZXBlbmRlbnQoWFgsIGFsbG93T25seSA9IEZBTFNFKQogIFogICA8LSBzaWVuYURlcGVuZGVudChaWiwgdHlwZT0iYmVoYXZpb3IiLCBhbGxvd09ubHkgPSBGQUxTRSkKICBJbml0RGF0YSA8LSBzaWVuYURhdGFDcmVhdGUoWCwgWikKICAKICBJbml0RWZmMCA8LSBnZXRFZmZlY3RzKEluaXREYXRhKQogIAogICMgc2luayB0byBhdm9pZCBwcmludGluZyB0byB0aGUgc2NyZWVuCiAgc2luaygiZWZmLnR4dCIpCiAgCiAgIyBTcGVjaWZ5IHRoZSBwYXJhbWV0ZXJzLgogICMgVGhlIHJhdGUgcGFyYW1ldGVycyBhcmUgZmlyc3QgbXVsdGlwbGllZCBieSAxMCwKICAjIHdoaWNoIHdpbGwgYmUgdXNlZCBvbmx5IHRvIGdldCBmcm9tIHRoZSB0b3RhbGx5IHJhbmRvbSBuZXR3b3JrIFhYWywsMV0gPSBYMAogICMgdG8gdGhlIG5ldHdvcmsgdGhhdCB3aWxsIGJlIHRoZSBzaW11bGF0ZWQgZmlyc3Qgd2F2ZS4KICBJbml0RWZmMCA8LSBzZXRFZmZlY3QoSW5pdEVmZjAsIFJhdGUsIHR5cGU9InJhdGUiLCBpbml0aWFsVmFsdWUgPSAxMCpyYXRlKQogIEluaXRFZmYwIDwtIHNldEVmZmVjdChJbml0RWZmMCwgZGVuc2l0eSwgaW5pdGlhbFZhbHVlID0gZGVucykKICBJbml0RWZmMCA8LSBzZXRFZmZlY3QoSW5pdEVmZjAsIHJlY2lwLCBpbml0aWFsVmFsdWUgPSByZWMpCiAgSW5pdEVmZjAgPC0gc2V0RWZmZWN0KEluaXRFZmYwLCB0cmFuc1RyaXAsIGluaXRpYWxWYWx1ZSA9IHR0KQogIEluaXRFZmYwIDwtIHNldEVmZmVjdChJbml0RWZmMCwgY3ljbGUzLCBpbml0aWFsVmFsdWUgPSBjMykKICBJbml0RWZmMCA8LSBzZXRFZmZlY3QoSW5pdEVmZjAsIGVnb1gsIGludGVyYWN0aW9uMT0iWiIsIGluaXRpYWxWYWx1ZSA9IGVnby5iKQogIEluaXRFZmYwIDwtIHNldEVmZmVjdChJbml0RWZmMCwgYWx0WCwgaW50ZXJhY3Rpb24xPSJaIiwgaW5pdGlhbFZhbHVlID0gYWx0LmIpCiAgSW5pdEVmZjAgPC0gc2V0RWZmZWN0KEluaXRFZmYwLCBzaW1YLCBpbnRlcmFjdGlvbjE9IloiLCBpbml0aWFsVmFsdWUgPSBzaW0uYikKCiAgSW5pdEVmZjAgPC0gc2V0RWZmZWN0KEluaXRFZmYwLCBuYW1lID0gIloiLCBSYXRlLCB0eXBlPSJyYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlID0gMTAqcmF0ZS5iKQogIEluaXRFZmYwIDwtIHNldEVmZmVjdChJbml0RWZmMCwgbmFtZSA9ICJaIiwgbGluZWFyLCBpbml0aWFsVmFsdWUgPSBsaW4uYikKICBJbml0RWZmMCA8LSBzZXRFZmZlY3QoSW5pdEVmZjAsIG5hbWUgPSAiWiIsIHF1YWQsIGluaXRpYWxWYWx1ZSA9IHF1LmIpCiAgSW5pdEVmZjAgPC0gc2V0RWZmZWN0KEluaXRFZmYwLCBuYW1lID0gIloiLCBhdkFsdCwgaW50ZXJhY3Rpb24xID0gIlgiLAogICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBhdmFsdC5iKQogIAogICMjIFRoZSBwYXJhbWV0ZXIgZ2l2ZW4gZm9yIG4zIHNob3VsZCBiZSBsYXJnZXIgdGhhbiBzdW0oSW5pdEVmZjAkaW5jbHVkZSkKICBudGhyZWUgPC0gc3VtKEluaXRFZmYwJGluY2x1ZGUpCSsgNQogIEluaXRBbGcgPC0gc2llbmFBbGdvcml0aG1DcmVhdGUocHJvam5hbWU9IkluaXQiLCB1c2VTdGRJbml0cz1GQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmQ9RkFMU0UsIG5zdWI9MCwgbjM9bnRocmVlLCBzaW1Pbmx5PVRSVUUpCiAgIyBTaW11bGF0ZSB0aGUgZmlyc3Qgd2F2ZS4KICBJbml0U2ltICAgPC0gc2llbmEwNyhJbml0QWxnLCBkYXRhPUluaXREYXRhLCBlZmY9SW5pdEVmZjAsCiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuRGVwcz1UUlVFLCBiYXRjaD1UUlVFLCBzaWxlbnQ9VFJVRSkKICAKICAjIE5vdyBwcmVwYXJlIGZvciBzaW11bGF0aW5nIHdhdmVzIDIgdG8gTS4KICAjIENyZWF0ZSBlbXB0eSByZXN1bHQgbmV0d29yayBhbmQgYmVoYXZpb3IgbWF0cmljZXMKICBYcyA8LSBhcnJheShOQSwgZGltPWMobixuLE0pKQogIFpzIDwtIGFycmF5KE5BLCBkaW09YyhuLE0pKQogIAogICMgVGhlIHJhdGUgcGFyYW1ldGVyIHZhbHVlcyBmcm9tIHRoZSBmdW5jdGlvbiBjYWxsIGFyZSByZWluc3RhdGVkIGluIEluaXRFZmYuCiAgSW5pdEVmZiA8LSBJbml0RWZmMAogIEluaXRFZmYgPC0gc2V0RWZmZWN0KEluaXRFZmYsIFJhdGUsIHR5cGUgPSAicmF0ZSIsIGluaXRpYWxWYWx1ZSA9IHJhdGUpCiAgSW5pdEVmZiA8LSBzZXRFZmZlY3QoSW5pdEVmZiwgbmFtZSA9ICJaIiwgUmF0ZSwgdHlwZSA9ICJyYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWUgPSByYXRlLmIpCiAgc2luaygpCiAgZm9yIChtIGluIDE6TSl7CiAgICAjIE5vdGUgdGhhdCB3ZSBzdGFydCB0aGlzIGxvb3Agd2l0aCBhIHByZXZpb3VzbHkgc2ltdWxhdGVkIG5ldHdvcmsuCiAgICAjIFRyYW5zZm9ybSB0aGUgcHJldmlvdXNseSBzaW11bGF0ZWQgbmV0d29yawogICAgIyBmcm9tIGVkZ2UgbGlzdCBpbnRvIGFkamFjZW5jeSBtYXRyaXgKICAgIFhYc2ltIDwtIG1hdHJpeCgwLG4sbikKICAgIG5zaW0gIDwtIEluaXRBbGckbjMKICAgIFhYc2ltW0luaXRTaW0kc2ltc1tbbnNpbV1dW1sxXV0kWFtbMV1dWywxOjJdXSAgPC0KICAgICAgSW5pdFNpbSRzaW1zW1tuc2ltXV1bWzFdXSRYW1sxXV1bLDNdCiAgICBac2ltIDwtIEluaXRTaW0kc2ltc1tbbnNpbV1dW1sxXV0kWltbMV1dCiAgICAjIFB1dCBzaW11bGF0ZWQgbmV0d29yayBhbmQgYmVoYXZpb3IgaW50byB0aGUgcmVzdWx0IG1hdHJpeC4KICAgIFhzWywsbV0gPC0gWFhzaW0KICAgIFpzWyxtXSA8LSBac2ltCiAgICAjIFB1dCBzaW11bGF0ZWQgbmV0d29yayBpbiBkZXNpcmVkIHBsYWNlcyBmb3IgdGhlIG5leHQgc2ltdWxhdGlvbgogICAgWFhbLCwyXSA8LSBYWFssLDFdICMgdXNlZCBvbmx5IHRvIGdldCB0aGUgZGF0YSBzdHJ1Y3R1cmUKICAgIFhYWywsMV0gPC0gWFhzaW0KICAgIFpaWywyXSA8LSBaWlssMV0KICAgIFpaWywxXSA8LSBac2ltCiAgICBpZiAobSA8IE0pIHsKICAgICAgIyBUaGUgZm9sbG93aW5nIGlzIG9ubHkgdG8gcHJldmVudCB0aGUgZXJyb3IgdGhhdCB3b3VsZCBvY2N1cgogICAgICAjIGluIHRoZSB2ZXJ5IHVubGlrZWx5IGV2ZW50IFhYWywsMV0gPT0gWFhbLCwyXSBvciBaWlssMV0gPT0gWlpbLDJdLgogICAgICBpZiAoaWRlbnRpY2FsKFhYWywsMV0sIFhYWywsMl0pKXtYWFsxLDIsMV0gPC0gMSAtIFhYWzEsMiwyXX0KICAgICAgaWYgKGlkZW50aWNhbChaWlssMV0sIFpaWywyXSkpewogICAgICAgIFpaWzEsMV0gPC0gaWZlbHNlKChaWlsxLDFdID09IDEpLCAyLCAxKX0KICAgICAgIyBTcGVjaWZ5IHRoZSB0d28td2F2ZSBuZXR3b3JrIGRhdGEgc2V0IHN0YXJ0aW5nIHdpdGggWFhbLCwxXS4KICAgICAgWCA8LSBzaWVuYURlcGVuZGVudChYWCwgYWxsb3dPbmx5ID0gRkFMU0UpCiAgICAgIFogPC0gc2llbmFEZXBlbmRlbnQoWlosIHR5cGUgPSAnYmVoYXZpb3InLCBhbGxvd09ubHkgPSBGQUxTRSkKICAgICAgIyBTaW11bGF0ZSB3YXZlIG0rMSBzdGFydGluZyBhdCBYWFssLDFdIHdoaWNoIGlzIHRoZSBwcmV2aW91cyBYWHNpbQogICAgICBJbml0RGF0YSAgPC0gc2llbmFEYXRhQ3JlYXRlKFgsIFopCiAgICAgIEluaXRTaW0gPC0gc2llbmEwNyhJbml0QWxnLCBkYXRhPUluaXREYXRhLCBlZmY9SW5pdEVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkRlcHM9VFJVRSwgYmF0Y2g9VFJVRSwgc2lsZW50PVRSVUUpCiAgICB9CiAgfQogICMgUHJlc2VudCB0aGUgYXZlcmFnZSBkZWdyZWVzIHRvIGZhY2lsaXRhdGUgdHVuaW5nIHRoZSBvdXRkZWdyZWUgcGFyYW1ldGVyCiAgIyB0byBhY2hpZXZlIGEgZGVzaXJlZCBhdmVyYWdlIHZhbHVlIGZvciB0aGUgYXZlcmFnZSBkZWdyZWVzLgogIGNhdCgiQXZlcmFnZSBkZWdyZWVzICIsIHJvdW5kKGNvbFN1bXMoWHMsZGltcz0yKS9uLCBkaWdpdHM9MiksICJcbiIpCiAgY2F0KCJBdmVyYWdlIGJlaGF2aW9yICIsIHJvdW5kKGNvbFN1bXMoWnMpL24sIGRpZ2l0cz0yKSwgIlxuIikKICAKICAjIG5ldHdvcmtzIGlzIGFuIGFycmF5IG9mIGRpbWVuc2lvbiBueG54TTsKICAjIGJlaGF2aW9ycyBpcyBhIG1hdHJpeCBvZiBkaW1lbnNpb24gbnhNCiAgbGlzdChuZXR3b3JrcyA9IFhzLCBiZWhhdmlvcnMgPSBacykKfQpgYGAKCiMjIE9ubHkgaW5mbHVlbmNlIHNpbXVsYXRpb24KClBhcmFtZXRlcnMgSSB1c2U6IAoKYGBge3J9CiMgc2ltdWxhdGlvbiB2YWx1ZXMgKEkgdXNlIHNvbWUgb2YgdGhlIHZhbHVlcyBJIGdldCBmcm9tIG91ciBtb2RlbCkKCm4gPC0gMjAwICMgYWN0b3JzCk0gPC0gMTAgIyB3YXZlcwpjIDwtIDEwICMgbnVtYmVyIG9mIGNhdGVnb3JpZXMgYmVoYXZpb3IsIHVuaWZvcm0gZGlzdHJpYnV0aW9uCgojIG5ldHdvcmsKcmF0ZSA8LSAyICMgcmF0ZSBuZXR3b3JrIGNoYW5nZQpkZW5zIDwtIC0yICMgZGVuc2l0eSAKcmVjIDwtIDIgIyByZWNpcHJvY2l0eSAKdHQgPC0gMC41ICMgdHJhbnNpdGl2aXR5IApjMyA8LSAtMC4zICMgY3ljbGVzCmVnby5iIDwtIDAgIyBlZ28gYmVoYXZpb3IgY292YXJpYXRlCmFsdC5iIDwtIDAgIyBhbHRlciBiZWhhdmlvciBjb3ZhcmlhdGUKc2ltLmIgPC0gMCAjIHNpbWlsYXJpdHkgYmVoYXZpb3IKCiMgYmVoYXZpb3IKcmF0ZS5iIDwtIDEgIyByYXRlIGJlaGF2aW9yIGNoYW5nZQpsaW4uYiA8LSAwLjAxICMgbGluZWFyIHRyZW5kCnF1LmIgPC0gLTAuMjAgIyBxdWFkcmF0aWMgdHJlbmQKYXZhbHQuYiA8LSAxLjUgIyBhdmVyYWdlIGFsdGVyIApgYGAKCmBgYHtyfQojIHJ1biBzaW11bGF0aW9uIApzcyA8LSBTaW11bGF0ZU5ldHdvcmtzQmVoYXZpb3IobiwgTSwgYywgcmF0ZSwgZGVucywgcmVjLCB0dCwgYzMsIGVnby5iLCBhbHQuYiwgc2ltLmIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlLmIsIGxpbi5iLCBxdS5iLCBhdmFsdC5iKQpgYGAKCkkgdXNlIG9ubHkgdGhlIGxhc3QgZm91ciB3YXZlcy4gVGhlIHRhYmxlIGJlbG93IHNob3dzIHRoZSBlc3RpbWF0ZXMgZnJvbSBkaWZmZXJlbnQgU2llbmEgc3BlY2lmaWNhdGlvbnMuIAoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CiMgZ2V0IGRhdGEgYW5kIGNyZWF0ZSBTaWVuYSBvYmplY3RzCm5ldCA8LSBzcyRuZXR3b3Jrc1ssICwgNzoxMF0KYmVoIDwtIHNzJGJlaGF2aW9yc1ssIDc6MTBdCgojIHNpZW5hCm5ldHdvcmsgPC0gc2llbmFEZXBlbmRlbnQobmV0KQpiZWggPC0gc2llbmFEZXBlbmRlbnQoYmVoLCB0eXBlID0gImJlaGF2aW9yIikKbXlEYXRhIDwtIHNpZW5hRGF0YUNyZWF0ZShuZXR3b3JrLCBiZWgpCm15RWZmZWN0cyA8LSBnZXRFZmZlY3RzKG15RGF0YSkKbXlhbGdvcml0aG0gPC0gc2llbmFBbGdvcml0aG1DcmVhdGUobnN1YiA9IDQsIG4zID0gMTAwMCkKYGBgCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CgojIGFkZCBncm91cCBuZXR3b3JrIGVmZmVjdHMKbXlFZmZlY3RzIDwtIGluY2x1ZGVFZmZlY3RzKG15RWZmZWN0cywgY3ljbGUzLCB0cmFuc1RyaXAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ID0gRkFMU0UsIHRlc3QgPSBGQUxTRSwgaW5jbHVkZSA9IFRSVUUpCgptMCA8LSBzaWVuYTA3VG9Db252ZXJnZW5jZShteWFsZ29yaXRobSwgZGF0ID0gbXlEYXRhLCBlZmYgPSBteUVmZmVjdHMsIG5vZGVzID0gMikKCnNpbTAgPC0gZ2V0QXV0b0NvcnIobTAsIHBlcmlvZCA9IGMoMTozKSwgdmFybmFtZXMgID0gYygibmV0d29yayIsICJiZWgiKSwgb2JzZXJ2ZWQgPSBGQUxTRSkKb2JzMCA8LSBnZXRBdXRvQ29ycihtMCwgcGVyaW9kID0gYygxOjMpLCB2YXJuYW1lcyAgPSBjKCJuZXR3b3JrIiwgImJlaCIpLCBvYnNlcnZlZCA9IFRSVUUpCnNldG5hbWVzKG9iczAsICJtb3JhbiIsICAibW9yYW5fb2JzIikKCnNldGtleShvYnMwLCB0aW1lKQpzZXRrZXkoc2ltMCwgdGltZSkKc20gPC0gb2JzMFtzaW0wXVssIC4odGltZSwgbW9yYW4sIG1vcmFuX29icyldCnNtWywgZGlmZiA6PSBtb3Jhbl9vYnMgLSBtb3Jhbl0KcDAgPC0gZ2dwbG90KHNtLCBhZXMoeD1hcy5mYWN0b3IodGltZSksIHk9ZGlmZikpICsgZ2VvbV92aW9saW4oKSArIAogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSkgKyAKICBsYWJzKHggPSJcblBlcmlvZCIsIHkgPSAiRGlmZmVyZW5jZSBPYnNlcnZlZCBhbmQgU2ltdWxhdGVkIE1vcmFuJ3MgSSIsIHRpdGxlID0gIk4iKSArIAogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9MCksIGxpbmV0eXBlID0gMikKcmVtb3ZlKHNtKQoKIyBhZGQgc2VsZWN0aW9uCm15RWZmZWN0cyA8LSBpbmNsdWRlRWZmZWN0cyhteUVmZmVjdHMsIGVnb1gsIGFsdFgsIHNpbVgsICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aW9uMSA9ICJiZWgiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeCA9IEZBTFNFLCB0ZXN0ID0gRkFMU0UsIGluY2x1ZGUgPSBUUlVFKQoKbTEgPC0gc2llbmEwN1RvQ29udmVyZ2VuY2UobXlhbGdvcml0aG0sIGRhdCA9IG15RGF0YSwgZWZmID0gbXlFZmZlY3RzLCBub2RlcyA9IDIpCgpzaW0xIDwtIGdldEF1dG9Db3JyKG0xLCBwZXJpb2QgPSBjKDE6MyksIHZhcm5hbWVzICA9IGMoIm5ldHdvcmsiLCAiYmVoIiksIG9ic2VydmVkID0gRkFMU0UpCm9iczEgPC0gZ2V0QXV0b0NvcnIobTEsIHBlcmlvZCA9IGMoMTozKSwgdmFybmFtZXMgID0gYygibmV0d29yayIsICJiZWgiKSwgb2JzZXJ2ZWQgPSBUUlVFKQpzZXRuYW1lcyhvYnMxLCAibW9yYW4iLCAgIm1vcmFuX29icyIpCgpzZXRrZXkob2JzMSwgdGltZSkKc2V0a2V5KHNpbTEsIHRpbWUpCnNtIDwtIG9iczFbc2ltMV1bLCAuKHRpbWUsIG1vcmFuLCBtb3Jhbl9vYnMpXQpzbVssIGRpZmYgOj0gbW9yYW5fb2JzIC0gbW9yYW5dCnAxIDwtIGdncGxvdChzbSwgYWVzKHg9YXMuZmFjdG9yKHRpbWUpLCB5PWRpZmYpKSArIGdlb21fdmlvbGluKCkgKyAKICBnZW9tX2JveHBsb3Qod2lkdGg9MC4xKSArIAogIGxhYnMoeCA9IlxuUGVyaW9kIiwgeSA9ICJEaWZmZXJlbmNlIE9ic2VydmVkIGFuZCBTaW11bGF0ZWQgTW9yYW4ncyBJIiwgdGl0bGUgPSAiTitTIikgKyAKICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PTApLCBsaW5ldHlwZSA9IDIpCnJlbW92ZShzbSkKCiMgYWRkIGluZmx1ZW5jZQpteUVmZmVjdHMgPC0gaW5jbHVkZUVmZmVjdHMobXlFZmZlY3RzLCBuYW1lID0gImJlaCIsIGF2QWx0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aW9uMSA9ICJuZXR3b3JrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeCA9IEZBTFNFLCB0ZXN0ID0gRkFMU0UsIGluY2x1ZGUgPSBUUlVFKQoKbTIgPC0gc2llbmEwN1RvQ29udmVyZ2VuY2UobXlhbGdvcml0aG0sIGRhdCA9IG15RGF0YSwgZWZmID0gbXlFZmZlY3RzLCBub2RlcyA9IDIpCgpzaW0yIDwtIGdldEF1dG9Db3JyKG0yLCBwZXJpb2QgPSBjKDE6MyksIHZhcm5hbWVzICA9IGMoIm5ldHdvcmsiLCAiYmVoIiksIG9ic2VydmVkID0gRkFMU0UpCm9iczIgPC0gZ2V0QXV0b0NvcnIobTIsIHBlcmlvZCA9IGMoMTozKSwgdmFybmFtZXMgID0gYygibmV0d29yayIsICJiZWgiKSwgb2JzZXJ2ZWQgPSBUUlVFKQpzZXRuYW1lcyhvYnMyLCAibW9yYW4iLCAgIm1vcmFuX29icyIpCgpzZXRrZXkob2JzMiwgdGltZSkKc2V0a2V5KHNpbTIsIHRpbWUpCnNtIDwtIG9iczJbc2ltMl1bLCAuKHRpbWUsIG1vcmFuLCBtb3Jhbl9vYnMpXQpzbVssIGRpZmYgOj0gbW9yYW5fb2JzIC0gbW9yYW5dCnAyIDwtIGdncGxvdChzbSwgYWVzKHg9YXMuZmFjdG9yKHRpbWUpLCB5PWRpZmYpKSArIGdlb21fdmlvbGluKCkgKyAKICBnZW9tX2JveHBsb3Qod2lkdGg9MC4xKSArIAogIGxhYnMoeCA9IlxuUGVyaW9kIiwgeSA9ICJEaWZmZXJlbmNlIE9ic2VydmVkIGFuZCBTaW11bGF0ZWQgTW9yYW4ncyBJIiwgdGl0bGUgPSAiTitTK0kiKSArIAogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9MCksIGxpbmV0eXBlID0gMikKCmBgYAoKT2JzZXJ2ZWQgYXV0b2NvcnJlbGF0aW9uIGZyb20gdGhlIHNpbXVsYXRlZCBuZXR3b3JrcyBhcmUga2luZCBvZiBzaW1pbGFyIHRoZSBvbmVzIHdlIGdldCBmcm9tIG91ciBBQk06CgpgYGB7cn0Kb2JzMFssIG1vcmFuX29ic10KYGBgCgpgYGB7cn0Kc2NyZWVucmVnKGxpc3QobTAsIG0xLCBtMiksIGN1c3RvbS5tb2RlbC5uYW1lcyA9ICBjKCJOIiwgIk4rUyIsICJOK1MrSSIpKQpgYGAKCkkgY29tcHV0ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSAqb2JzZXJ2ZWQqIGFuZCAqc2ltdWxhdGVkKiBhdXRvY29ycmVsYXRpb24gKE1vcmFuJ3MgSSkgdG8gYXNzZXNzIGdvb2RuZXNzLW9mLWZpdC4gQm90aCBzcGVjaWZpY2F0aW9uc24gKE4gYW5kIE4rUykgYXJlIHZlcnkgb2ZmOiB0aGVyZSBpcyBtb3JlIGF1dG9jb3JyZWxhdGlvbiB0aGFuIHRoZSBlc3RpbWF0ZWQgYnkgdGhlIFNpZW5hIG1vZGVsLiAKCmBgYHtyLCBlY2hvPUZBTFNFfQpwMApwMQpgYGAKCldoZW4gSSBhZGQgdGhlIGluZmx1ZW5jZSBlZmZlY3QsIGRpZmZlcmVuY2VzIGFyZSBjbG9zZXIgdG8gemVyby4gCgpgYGB7ciwgZWNobz1GQUxTRX0KcDIKYGBgCgpBZ2FpbiwgdGhlcmUgc2VlbXMgdG8gYmUgbm90IGNvdW5mb3VuZGluZyBiZXR3ZWVuIHNlbGVjdGlvbiBhbmQgaW5mbHVlbmNlLiAKCiMjIE90aGVyIEdPRiBzdGF0aXN0aWNzIChOK1MrSSkKClRoaXMgaXMgZ29vZCBmaXQuIFJlYWxpdHkgYW5kIG91ciBBQk0gYXJlIGFub3RoZXIgc3RvcnkuCgpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBnb2YuYmVoIDwtIHNpZW5hR09GKG0yLCBCZWhhdmlvckRpc3RyaWJ1dGlvbiwgdmVyYm9zZSA9IEZBTFNFLCAgam9pbiA9IFRSVUUsIHZhck5hbWUgPSAiYmVoIikKIyBnb2YuaW5kZWdyZWUgPC0gc2llbmFHT0YobTIsIHZlcmJvc2UgPSBGQUxTRSwgdmFyTmFtZT0gIm5ldHdvcmsiLCAgSW5kZWdyZWVEaXN0cmlidXRpb24sIGpvaW49IFRSVUUsIGN1bXVsYXRpdmUgPSBUUlVFKQojIGdvZi5vdXRkZWdyZWUgPC1zaWVuYUdPRihtMiwgdmVyYm9zZSA9IEZBTFNFLCB2YXJOYW1lPSAibmV0d29yayIsIE91dGRlZ3JlZURpc3RyaWJ1dGlvbiwgam9pbj0gVFJVRSwgY3VtdWxhdGl2ZSA9IFRSVUUpCiMgZ29mLmRpcyA8LSBzaWVuYUdPRihtMiwgdmVyYm9zZSA9IEZBTFNFLCB2YXJOYW1lID0gIm5ldHdvcmsiLCBHZW9kZXNpY0Rpc3RyaWJ1dGlvbiwgam9pbiA9IFRSVUUsIGN1bXVsYXRpdmUgPSBUUlVFKQojIGdvZi50cmlhZCA8LSBzaWVuYUdPRihtMiwgVHJpYWRDZW5zdXMsIHZlcmJvc2UgPSBGQUxTRSwgam9pbiA9IFRSVUUsIHZhck5hbWUgPSAibmV0d29yayIpCgpwbG90KGdvZi5iZWgpCnBsb3QoZ29mLmluZGVncmVlKQpwbG90KGdvZi5vdXRkZWdyZWUpCnBsb3QoZ29mLmRpcykKcGxvdChnb2YudHJpYWQsIHNjYWxlID0gVFJVRSwgY2VudGVyID0gVFJVRSkKYGBgCgojIyBOZXR3b3JrIG1pc3NwZWNpZmljYXRpb24KCldoYXQgaGFwcGVucyBpZiBJIG1pc3NwZWNpZnkgdGhlIG5ldHdvcmsuIFRoZSBzZWxlY3Rpb24gY29lZmZpY2llbnQgaW5jcmVhc2VzIGJ1dCBpdCBpcyBzdGlsbCB2ZXJ5IG5vaXN5LiBUaGlzIHN1Z2dlc3RzIHRoYXQgbW9zdCBvZiB0aGUgcHJvYmxlbSBpbiBvdXIgQUJNIGlzIHJlbGF0ZWQgdG8gZmluZGluZyBnb29kIGZpdCBvZiB0aGUgbmV0d29yayBwYXJ0IG9yIHRoZSBiZWhhdmlvciBjaGFuZ2UgKEkgYW0gbm90IHN1cmUgd2hhdCBtb3JlIGltcG9ydGFudCBpcykuIAoKYGBge3J9Cm15RWZmZWN0cyA8LSBnZXRFZmZlY3RzKG15RGF0YSkKCm15RWZmZWN0cyA8LSBpbmNsdWRlRWZmZWN0cyhteUVmZmVjdHMsIGVnb1gsIGFsdFgsIHNpbVgsICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aW9uMSA9ICJiZWgiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeCA9IEZBTFNFLCB0ZXN0ID0gRkFMU0UsIGluY2x1ZGUgPSBUUlVFKQoKbXlFZmZlY3RzIDwtIGluY2x1ZGVFZmZlY3RzKG15RWZmZWN0cywgbmFtZSA9ICJiZWgiLCBhdkFsdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdGlvbjEgPSAibmV0d29yayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXggPSBGQUxTRSwgdGVzdCA9IEZBTFNFLCBpbmNsdWRlID0gVFJVRSkKCm0zIDwtIHNpZW5hMDdUb0NvbnZlcmdlbmNlKG15YWxnb3JpdGhtLCBkYXQgPSBteURhdGEsIGVmZiA9IG15RWZmZWN0cywgbm9kZXMgPSAyKQpzY3JlZW5yZWcobTMpCmBgYA==