I was curious to know what the difference between MPRAGE & MPRAGE-DIST, and here’s a synopsis of my learning…
Inhomogeneity depends on the subject’s anatomy, the orientation of that anatomy with respect to the B0 field, as well as several other factors such as the scan-dependent magnetic shim settings. This generally means that inhomogeneity is not known in advance, and should be measured (“field mapping”) at each scan session in order to construct an accurate forward model of the distortion process (Chambers et al., 2015).
There are numerous ways to complete beta inhomogenity correction for EPI images (if fieldmaps are not available). In all circumstances though, it seems most efficient to use one’s field maps collected durring that session, if available.
1. Bias Correction /MPRAGE
This should not be completed on MPRAGE post-hoc, as it results in over correction (?) \(\dagger\)
subdir="~/DATA/EPIC_SCRIPT/Dicom/7089/7089_1"
setwd(subdir)
fsl_biascorrect(file = "SAGT1MPRAGEDistCorND.nii.gz",
outfile = "ND_SAGT1MPRAGEDistCor_BiasCorrect", #User defines outfile name
opts = "-v")
1a. Voxel-Intensity Distributions: /MPRAGE
x-axis is voxel intensity
y-axis is distribution for 1 slice
each line represents a slice (2,6,10,14,18) respectivly

1b. Contrast Map: Results of inhomogenity correction of /MPRAGE
sub.bias <- niftiarr(nim, nim-fast_img)
# quantile the difference image using these as breaks
q=quantile(sub.bias[sub.bias !=0],probs = seq(0,1,by=0.1))
# get a diverging gradient palette
fcol=div_gradient_pal(low="blue",mid="yellow",high ="red")
ortho2(nim,sub.bias,col.y = alpha(fcol(seq(0,1, length=10)),
0.5), ybreaks = q, ycolorbar=TRUE, text = paste0("Original
Image Minus N4", "\n Bias-Corrected Image"))

2. Bias Correction /MPRAGE-DIST
subdir="~/DATA/EPIC_SCRIPT/Dicom/7089/7089_1"
setwd(subdir)
fsl_biascorrect(file = "SAGT1MPRAGEDistCor.nii.gz",
outfile = "SAGT1MPRAGEDistCor_BiasCorrect",
opts = "-v")
2a. Voxel-Intensity Distributions: /MPRRAGE-DIST
The code for plotting:

2b. Contrast Map: Results of inhomogenity correction of /MPRAGE-DIST

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0UsIGVjaG89VFJVRX0KbGlicmFyeShkY20ybmlpcikKbGlicmFyeShvcm8uZGljb20pCmxpYnJhcnkob3JvLm5pZnRpKQpsaWJyYXJ5KGZzbHIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShyZXNoYXBlMikKbGlicmFyeShzY2FsZXMpCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCkkgd2FzIGN1cmlvdXMgdG8ga25vdyB3aGF0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gTVBSQUdFICYgTVBSQUdFLURJU1QsIGFuZCBoZXJlJ3MgYSBzeW5vcHNpcyBvZiBteSBsZWFybmluZy4uLgoKSW5ob21vZ2VuZWl0eSBkZXBlbmRzIG9uIHRoZSBzdWJqZWN04oCZcyBhbmF0b215LCB0aGUgb3JpZW50YXRpb24gb2YgdGhhdCBhbmF0b215IHdpdGggcmVzcGVjdCB0byB0aGUgQjAgZmllbGQsIGFzIHdlbGwgYXMgc2V2ZXJhbCBvdGhlciBmYWN0b3JzIHN1Y2ggYXMgdGhlIHNjYW4tZGVwZW5kZW50IG1hZ25ldGljIHNoaW0gc2V0dGluZ3MuIFRoaXMgZ2VuZXJhbGx5IG1lYW5zIHRoYXQgaW5ob21vZ2VuZWl0eSBpcyBub3Qga25vd24gaW4gYWR2YW5jZSwgYW5kIHNob3VsZCBiZSBtZWFzdXJlZCAo4oCcZmllbGQgbWFwcGluZ+KAnSkgYXQgZWFjaCBzY2FuIHNlc3Npb24gaW4gb3JkZXIgdG8gY29uc3RydWN0IGFuIGFjY3VyYXRlICpmb3J3YXJkKiBtb2RlbCBvZiB0aGUgZGlzdG9ydGlvbiBwcm9jZXNzIChDaGFtYmVycyBldCBhbC4sIDIwMTUpLgoKVGhlcmUgYXJlIG51bWVyb3VzIHdheXMgdG8gY29tcGxldGUgYmV0YSBpbmhvbW9nZW5pdHkgY29ycmVjdGlvbiBmb3IgRVBJIGltYWdlcyAoaWYgZmllbGRtYXBzIGFyZSBub3QgYXZhaWxhYmxlKS4gSW4gYWxsIGNpcmN1bXN0YW5jZXMgdGhvdWdoLCBpdCBzZWVtcyBtb3N0IGVmZmljaWVudCB0byB1c2Ugb25lJ3MgZmllbGQgbWFwcyBjb2xsZWN0ZWQgZHVycmluZyB0aGF0IHNlc3Npb24sIGlmIGF2YWlsYWJsZS4gCgoqIFRoZSBwb3N0LWhvYyBmc2wgbWV0aG9kIHRoYXQgSSByZXZpZXdlZCBjYW4gYmUgZm91bmQgaGVyZTogCiAgICAgaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9wbWMvYXJ0aWNsZXMvUE1DNDY2MjQyMy8KCiAgICAqIFRoZXkgcmVnaXN0ZXIgdGhlIGRpc3RvcnRlZCBmTVJJIHRvIGEgVDEtd2VpZ2h0ZWQgaW1hZ2UsIGFzIGl0IGhhcyBoaWdoIGluIHRpc3N1ZSBjb250cmFzdCBhbmQgcHJvdmlkZXMgbXV0dWFsIGluZm9ybWF0aW9uIGFib3V0IGluaG9tb2dlbml0eSAoaWYgdGhlcmUgaXMgbm90IGFsb3Qgb2YgbW90aW9uIGJldHdlZW4gTVBSQUdFIGFuZCByZXN0aW5nIHN0YXRlIGFxdWlzdGlvbnMpLiAKICAgIAogICAgKiBIZXJlIGFyZSB0aGVpciByZXN1bHRzOiBodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3BtYy9hcnRpY2xlcy9QTUM0NjYyNDIzL2ZpZ3VyZS9GMS8KCgogICAgICogTVBSQUdFIGRpc3RvcnRpb24gY29ycmVjdGlvbiBpcyBhdXRvbWF0aWNhbGx5IHByb2dyYW1tZWQgaW50byBvdXIgZGVmYXVsdCBwaXBlbGluZSwgICAgICAgYmVjYXVzZSwgcmVhbGx5IHRoZXJlIGlzIG5vIGJldHRlciBhbHRlcm5hdGl2ZS4gQXMgc3RhdGVkIGFib3ZlLCB0aGUgcHJvY2VzcyBzZWVtcyB0byBiZSBtb2RlbGVkICpmb3J3YXJkKiBpbnRvIE1QUkFHRSByZWNvbnN0cnVjdGlvbi4KCiAgICAqICMjIyMjT3V0cHV0IGZyb20gZGNtMm5paXg6IyMjIyMjCiAgICAgICAgKiAvTVBSQUdFID09IE1QUkFHRURpc3RDb3JyTkQKICAgICAgICAqIC9NUFJBR0UtRElTVCA9PSBNUFJBR0VEaXN0Q29ycgoKPGJyLz4KPGJyLz4KYGBge3IgTk8gUlVOMTogZGNtMm5paXggT3V0cHV0IE1QUkFHRV9EaXN0Q29yTkQsIGluY2x1ZGU9RkFMU0UsIGV2YWw9RkFMU0V9CnN1YmRpcj0ifi9EQVRBL0VQSUNfU0NSSVBUL0RpY29tLzcwODkvNzA4OV8xIgpzZXR3ZChzdWJkaXIpCnN1YmRpcjwtbGlzdC5kaXJzKHN1YmRpcikKRENNIDwtIHJlYWRESUNPTShzdWJkaXJbMl0sIHZlcmJvc2U9VFJVRSkKc2VyaWVzSW5zdGFuY2VVSUQgPC0gZXh0cmFjdEhlYWRlcihEQ00kaGRyLCAiU2VyaWVzSW5zdGFuY2VVSUQiLCBGQUxTRSkKZm9yICh1aWQgaW4gdW5pcXVlKHNlcmllc0luc3RhbmNlVUlEKSkgewogIGluZGV4IDwtIHdoaWNoKHVubGlzdChsYXBwbHkoRENNJGhkciwgZnVuY3Rpb24oeCkgdWlkICVpbiUgeCR2YWx1ZSkpKQogIHVpZC5kY20gPC0gbGlzdChoZHI9RENNJGhkcltpbmRleF0sIGltZz1EQ00kaW1nW2luZGV4XSkKICBzZXJpZXNEZXNjcmlwdGlvbiA8LSBleHRyYWN0SGVhZGVyKHVpZC5kY20kaGRyLCAiU2VyaWVzRGVzY3JpcHRpb24iLCBGQUxTRSkKIGZuYW1lIDwtIHBhc3RlKGdzdWIoIlteMC05QS1aYS16XSIsICIiLAogICB1bmlxdWUoYyggc2VyaWVzRGVzY3JpcHRpb24gKSkpLAogY29sbGFwc2U9Il8iKQogIGNhdCgiIyMiLCBmbmFtZSwgZmlsbD1UUlVFKQogIGlmIChnc3ViKCJbXjAtOUEtWmEtel0iLCAiIiwgdW5pcXVlKHNlcmllc0Rlc2NyaXB0aW9uKSkgPT0gImF4dGVuc29yIikgewogICAgRCA8LSA0CiAgICByZXNsaWNlPC0gRkFMU0UKICB9ZWxzZXsKICAgIEQgPC0gMwogICAgcmVzbGljZTwtIFRSVUUKICAgIAogIH0KICB1aWQubmlmdGk8LWRpY29tMm5pZnRpKHVpZC5kY20sIERJTT1ELCByZXNsaWNlPXJlc2xpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwPWMoIlNlcmllc0Rlc2NyaXB0aW9uIikpCiAgc2V0d2Qoc3ViZGlyKQogIHdyaXRlTklmVEkodWlkLm5pZnRpICxmbmFtZSwgZ3ppcHBlZCA9IFRSVUUsIHZlcmJvc2UgPSBUUlVFKQp9CiMjIyBPdXRwdXQgaXMgU0FHVDFNUFJBR0VEaXN0Q29yTkQubmlpLmd6ICMjIwpgYGAKPGJyLz4KPGJyLz4KCiMjIyMgMS4gQmlhcyBDb3JyZWN0aW9uIC9NUFJBR0UKIyMjIyMgVGhpcyBzaG91bGQgbm90IGJlIGNvbXBsZXRlZCBvbiBNUFJBR0UgcG9zdC1ob2MsIGFzIGl0IHJlc3VsdHMgaW4gb3ZlciBjb3JyZWN0aW9uICg/KSAkXGRhZ2dlciQKYGBge3IgTk9SVU4yOiBCSUFTIENvcnJlY3QgL01QUkFHRSAsIGV2YWw9RkFMU0UsIGVjaG89VFJVRX0Kc3ViZGlyPSJ+L0RBVEEvRVBJQ19TQ1JJUFQvRGljb20vNzA4OS83MDg5XzEiCnNldHdkKHN1YmRpcikKZnNsX2JpYXNjb3JyZWN0KGZpbGUgPSAiU0FHVDFNUFJBR0VEaXN0Q29yTkQubmlpLmd6IiwKICAgICAgICAgICAgICAgIG91dGZpbGUgPSAiTkRfU0FHVDFNUFJBR0VEaXN0Q29yX0JpYXNDb3JyZWN0IiwgI1VzZXIgZGVmaW5lcyBvdXRmaWxlIG5hbWUKICAgICAgICAgICAgICAgIG9wdHMgPSAiLXYiKQoKYGBgCjxici8+CgojIyMjIDFhLiBWb3hlbC1JbnRlbnNpdHkgRGlzdHJpYnV0aW9uczogL01QUkFHRSAKICAqeC1heGlzIGlzIHZveGVsIGludGVuc2l0eSAgCiAgKnktYXhpcyBpcyBkaXN0cmlidXRpb24gZm9yIDEgc2xpY2UgIAogIGVhY2ggbGluZSByZXByZXNlbnRzIGEgc2xpY2UgKDIsNiwxMCwxNCwxOCkgcmVzcGVjdGl2bHkgIApgYGB7ciBWSVQtMSwgZWNobz1GQUxTRSwgZWNobz1GQUxTRX0KbmltPXJlYWROSWZUSSgifi9EQVRBL0VQSUNfU0NSSVBUL0RpY29tLzcwODkvNzA4OV8xL1NBR1QxTVBSQUdFRGlzdENvck5ELm5paS5neiIsIHJlb3JpZW50PUZBTFNFKSAKZmFzdF9pbWcgPXJlYWROSWZUSSgifi9EQVRBL0VQSUNfU0NSSVBUL0RpY29tLzcwODkvNzA4OV8xL05EX1NBR1QxTVBSQUdFRGlzdENvcl9CaWFzQ29ycmVjdC5uaWkuZ3oiLCByZW9yaWVudD1GQUxTRSkgCnNsaWNlcyA9IGMoMiwgNiwgMTAsIDE0LCAxOCkKdmFscyA9IGxhcHBseShzbGljZXMsIGZ1bmN0aW9uKHgpIHsKICBjYmluZChpbWcgPSBjKG5pbVssLHhdKSwgZmFzdCA9IGMoZmFzdF9pbWdbLCx4XSksCiAgICAgICAgc2xpY2UgPSB4KQp9KQp2YWxzID0gZG8uY2FsbCgicmJpbmQiLCB2YWxzKQp2YWxzID0gZGF0YS5mcmFtZSh2YWxzKQp2YWxzID0gdmFsc1sgdmFscyRpbWcgPiAwICYgdmFscyRmYXN0ID4gMCwgXQpjb2xuYW1lcyh2YWxzKVsxOjJdID0gYygiU0FHVDFNUFJBR0VEaXN0Q29yTkQiLCAiQmlhcy1Db3JyZWN0ZWQgVmFsdWUiKQp2ID0gbWVsdCh2YWxzLCBpZC52YXJzID0gInNsaWNlIikKZyA9IGdncGxvdChhZXMoeCA9IHZhbHVlLCBjb2xvdXIgPSBmYWN0b3Ioc2xpY2UpKSwgZGF0YSA9IHYpICsgZ2VvbV9saW5lKHN0YXQgPSAiZGVuc2l0eSIpICsgZmFjZXRfd3JhcCh+IHZhcmlhYmxlKQpnID0gZyArIHNjYWxlX2NvbG91cl9kaXNjcmV0ZShuYW1lID0gIlNsaWNlICMiKSAKcHJpbnQoZykKYGBgCjxici8+CgojIyMjIDFiLiBDb250cmFzdCBNYXA6IFJlc3VsdHMgb2YgaW5ob21vZ2VuaXR5IGNvcnJlY3Rpb24gb2YgL01QUkFHRSAKYGBge3IgIENvbnRyYXN0IE1hcDE6IE5EIEJpYXMgQ29ycmVjdGlvbiwgZWNobz1UUlVFLCBldmFsPVRSVUV9CnN1Yi5iaWFzIDwtIG5pZnRpYXJyKG5pbSwgbmltLWZhc3RfaW1nKQojIHF1YW50aWxlIHRoZSBkaWZmZXJlbmNlIGltYWdlIHVzaW5nIHRoZXNlIGFzIGJyZWFrcwpxPXF1YW50aWxlKHN1Yi5iaWFzW3N1Yi5iaWFzICE9MF0scHJvYnMgPSBzZXEoMCwxLGJ5PTAuMSkpCiMgZ2V0IGEgZGl2ZXJnaW5nIGdyYWRpZW50IHBhbGV0dGUKZmNvbD1kaXZfZ3JhZGllbnRfcGFsKGxvdz0iYmx1ZSIsbWlkPSJ5ZWxsb3ciLGhpZ2ggPSJyZWQiKQpvcnRobzIobmltLHN1Yi5iaWFzLGNvbC55ID0gYWxwaGEoZmNvbChzZXEoMCwxLCBsZW5ndGg9MTApKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNSksIHlicmVha3MgPSBxLCB5Y29sb3JiYXI9VFJVRSwgdGV4dCA9IHBhc3RlMCgiU0FHVDFNUFJBR0VEaXN0Q29yTkQKIE1pbnVzIE40IiwgIlxuIEJpYXMtQ29ycmVjdGVkIEltYWdlIikpIApgYGAKCmBgYHtyIDIuIE1QUkFHRS1ESVNUXzJfTklJWCwgaW5jbHVkZT1GQUxTRSwgZXZhbD1GQUxTRX0Kc3ViZGlyPSJ+L0RBVEEvRVBJQ19TQ1JJUFQvRGljb20vNzA4OS83MDg5XzEiCnNldHdkKHN1YmRpcikKc3ViZGlyPC1saXN0LmRpcnMoc3ViZGlyKQpEQ00gPC0gcmVhZERJQ09NKHN1YmRpclszXSwgdmVyYm9zZT1UUlVFKQpzZXJpZXNJbnN0YW5jZVVJRCA8LSBleHRyYWN0SGVhZGVyKERDTSRoZHIsICJTZXJpZXNJbnN0YW5jZVVJRCIsIEZBTFNFKQpmb3IgKHVpZCBpbiB1bmlxdWUoc2VyaWVzSW5zdGFuY2VVSUQpKSB7CiAgaW5kZXggPC0gd2hpY2godW5saXN0KGxhcHBseShEQ00kaGRyLCBmdW5jdGlvbih4KSB1aWQgJWluJSB4JHZhbHVlKSkpCiAgdWlkLmRjbSA8LSBsaXN0KGhkcj1EQ00kaGRyW2luZGV4XSwgaW1nPURDTSRpbWdbaW5kZXhdKQogIHNlcmllc0Rlc2NyaXB0aW9uIDwtIGV4dHJhY3RIZWFkZXIodWlkLmRjbSRoZHIsICJTZXJpZXNEZXNjcmlwdGlvbiIsIEZBTFNFKQogZm5hbWUgPC0gcGFzdGUoZ3N1YigiW14wLTlBLVphLXpdIiwgIiIsCiAgIHVuaXF1ZShjKCBzZXJpZXNEZXNjcmlwdGlvbiApKSksCiBjb2xsYXBzZT0iXyIpCiAgY2F0KCIjIyIsIGZuYW1lLCBmaWxsPVRSVUUpCiAgaWYgKGdzdWIoIlteMC05QS1aYS16XSIsICIiLCB1bmlxdWUoc2VyaWVzRGVzY3JpcHRpb24pKSA9PSAiYXh0ZW5zb3IiKSB7CiAgICBEIDwtIDQKICAgIHJlc2xpY2U8LSBGQUxTRQogIH1lbHNlewogICAgRCA8LSAzCiAgICByZXNsaWNlPC0gVFJVRQogICAgCiAgfQogIHVpZC5uaWZ0aTwtZGljb20ybmlmdGkodWlkLmRjbSwgRElNPUQsIHJlc2xpY2U9cmVzbGljZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXA9YygiU2VyaWVzRGVzY3JpcHRpb24iKSkKICBzZXR3ZChzdWJkaXIpCiAgd3JpdGVOSWZUSSh1aWQubmlmdGkgLGZuYW1lLCBnemlwcGVkID0gVFJVRSwgdmVyYm9zZSA9IFRSVUUpCn0KCiMjIyBvdXRwdXQgaXMgTVBSQUdFRGlzdENvciAjIyMKCmBgYAoKPGJyLz4KPGJyLz4KCiMjIyMgMi4gQmlhcyBDb3JyZWN0aW9uIC9NUFJBR0UtRElTVCAgCmBgYHtyIEJJQVMgQ29ycmVjdCBNUFJBR0UtRElTVCxlY2hvPVRSVUUsIGV2YWw9RkFMU0V9CnN1YmRpcj0ifi9EQVRBL0VQSUNfU0NSSVBUL0RpY29tLzcwODkvNzA4OV8xIgpzZXR3ZChzdWJkaXIpCmZzbF9iaWFzY29ycmVjdChmaWxlID0gIlNBR1QxTVBSQUdFRGlzdENvci5uaWkuZ3oiLAogICAgICAgICAgICAgICAgb3V0ZmlsZSA9ICJTQUdUMU1QUkFHRURpc3RDb3JfQmlhc0NvcnJlY3QiLCAKICAgICAgICAgICAgICAgIG9wdHMgPSAiLXYiKQpgYGAKPGJyLz4KCiMjIyMgMmEuIFZveGVsLUludGVuc2l0eSBEaXN0cmlidXRpb25zOiAvTVBSUkFHRS1ESVNUIApUaGUgY29kZSBmb3IgcGxvdHRpbmc6CmBgYHtyIFZJVCBNUFJBR0UtRElTVCAoZG91YmxlIGNvcnJlY3Rpb24pLCBldmFsPVRSVUUsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Cm5pbT1yZWFkTklmVEkoIn4vREFUQS9FUElDX1NDUklQVC9EaWNvbS83MDg5LzcwODlfMS9TQUdUMU1QUkFHRURpc3RDb3IubmlpLmd6IiwgcmVvcmllbnQ9RkFMU0UpIApmYXN0X2ltZyA9cmVhZE5JZlRJKCJ+L0RBVEEvRVBJQ19TQ1JJUFQvRGljb20vNzA4OS83MDg5XzEvU0FHVDFNUFJBR0VEaXN0Q29yX0JpYXNDb3JyZWN0Lm5paS5neiIsIHJlb3JpZW50PUZBTFNFKSAKCnNsaWNlcyA9IGMoMiwgNiwgMTAsIDE0LCAxOCkgICAgI0Nob29zZSBzbGljZSBhcnJheSBhbmQgY29uY2F0LiB2b3hlbCBpbnRlbnMuIHZhbHMuCnZhbHMgPSBsYXBwbHkoc2xpY2VzLCBmdW5jdGlvbih4KSB7CiAgY2JpbmQoaW1nID0gYyhuaW1bLCx4XSksIGZhc3QgPSBjKGZhc3RfaW1nWywseF0pLAogICAgICAgIHNsaWNlID0geCkKfSkKdmFscyA9IGRvLmNhbGwoInJiaW5kIiwgdmFscykKdmFscyA9IGRhdGEuZnJhbWUodmFscykKdmFscyA9IHZhbHNbIHZhbHMkaW1nID4gMCAmIHZhbHMkZmFzdCA+IDAsIF0gI1JlbW92ZSB6ZXJvIGludGVuc2l0eSB2b3hlbHMKY29sbmFtZXModmFscylbMToyXSA9IGMoIlNBR1QxTVBSQUdFRGlzdENvciIsICJCaWFzLUNvcnJlY3RlZCBWYWx1ZSIpCnYgPSBtZWx0KHZhbHMsIGlkLnZhcnMgPSAic2xpY2UiKSAjUmVzaGFwZSB0byBsb25nIGZvcm0KZyA9IGdncGxvdChhZXMoeCA9IHZhbHVlLCBjb2xvdXIgPSBmYWN0b3Ioc2xpY2UpKSwgZGF0YSA9IHYpICsgZ2VvbV9saW5lKHN0YXQgPSAiZGVuc2l0eSIpICsgZmFjZXRfd3JhcCh+IHZhcmlhYmxlKSAjUGxvdApnID0gZyArIHNjYWxlX2NvbG91cl9kaXNjcmV0ZShuYW1lID0gIlNsaWNlICMiKSAgICNBZGQgY29sb3IgdG8gc2xpY2UgYXJyYXlzCnByaW50KGcpCmBgYAo8YnIvPgoKIyMjIyAyYi4gQ29udHJhc3QgTWFwOiBSZXN1bHRzIG9mIGluaG9tb2dlbml0eSBjb3JyZWN0aW9uIG9mIC9NUFJBR0UtRElTVCAKYGBge3IgQ29udHJhc3QgTWFwIE1QUkFHRURpc3RDb3IsIGV2YWw9VFJVRSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0Kc3ViLmJpYXMgPC0gbmlmdGlhcnIobmltLCBuaW0tZmFzdF9pbWcpCiMgcXVhbnRpbGUgdGhlIGRpZmZlcmVuY2UgaW1hZ2UgdXNpbmcgdGhlc2UgYXMgYnJlYWtzCnE9cXVhbnRpbGUoc3ViLmJpYXNbc3ViLmJpYXMgIT0wXSxwcm9icyA9IHNlcSgwLDEsYnk9MC4xKSkKIyBnZXQgYSBkaXZlcmdpbmcgZ3JhZGllbnQgcGFsZXR0ZQpmY29sPWRpdl9ncmFkaWVudF9wYWwobG93PSJibHVlIixtaWQ9InllbGxvdyIsaGlnaCA9InJlZCIpCm9ydGhvMihuaW0sc3ViLmJpYXMsY29sLnkgPSBhbHBoYShmY29sKHNlcSgwLDEsIGxlbmd0aD0xMCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41KSwgeWJyZWFrcyA9IHEsIHljb2xvcmJhcj1UUlVFLCB0ZXh0ID0gcGFzdGUwKCJPcmlnaW5hbApJbWFnZSBNaW51cyBONCIsICJcbiBCaWFzLUNvcnJlY3RlZCBJbWFnZSIpKSAKCmBgYAoKPGJyLz4KPGJyLz4KCiMjIyBDb250cmFzdCBNYXAgMzogUmVzdWx0cyBvZiBpbmhvbWVnZW50aXR5IGNvcnJlY3Rpb24gYnVpbHQgaW50byBESUNPTSBkYXRhIHN0cnVjdHVyZSAgCiMjIyMjIE5vdGUgdGhlIGNlbnRyYWwgYXJlYXMgb2YgZ3JleSBzY2FsZSBhcmUgb3ZlcmxhcHBpbmcgc291cmNlcyBvZiBkaXN0b3J0aW9uLWNvcnJlY3Rpb24gZHVlIHRvIHBlcnR1cmJlZCBLLVNwYWNlLiAgVGhpcyBpcyBlc3NlbnRpYWxseSBsaWtlIHBsb3R0aW5nIHRoZSByZXNpZHVhbHMgaW4gYSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCAoPykgICRcZGFnZ2VyJCAKCiogaHR0cDovL21yaXF1ZXN0aW9ucy5jb20vd2hhdC1pcy1rLXNwYWNlLmh0bWwKCmBgYHtyIE1QUkFHRSBtaW51cyBNUFJBR0UtRElTVCwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKbmltPXJlYWROSWZUSSgifi9EQVRBL0VQSUNfU0NSSVBUL0RpY29tLzcwODkvNzA4OV8xL1NBR1QxTVBSQUdFRGlzdENvci5uaWkuZ3oiLCByZW9yaWVudD1GQUxTRSkgCmZhc3RfaW1nID1yZWFkTklmVEkoIn4vREFUQS9FUElDX1NDUklQVC9EaWNvbS83MDg5LzcwODlfMS9TQUdUMU1QUkFHRURpc3RDb3JORC5uaWkuZ3oiLCByZW9yaWVudD1GQUxTRSkgCnN1Yi5iaWFzIDwtIG5pZnRpYXJyKG5pbSwgbmltLWZhc3RfaW1nKQojIHF1YW50aWxlIHRoZSBkaWZmZXJlbmNlIGltYWdlIHVzaW5nIHRoZXNlIGFzIGJyZWFrcwpxPXF1YW50aWxlKHN1Yi5iaWFzW3N1Yi5iaWFzICE9MF0scHJvYnMgPSBzZXEoMCwxLGJ5PTAuMSkpCiMgZ2V0IGEgZGl2ZXJnaW5nIGdyYWRpZW50IHBhbGV0dGUKZmNvbD1kaXZfZ3JhZGllbnRfcGFsKGxvdz0iYmx1ZSIsbWlkPSJ5ZWxsb3ciLGhpZ2ggPSJyZWQiKQpvcnRobzIobmltLHN1Yi5iaWFzLGNvbC55ID0gYWxwaGEoZmNvbChzZXEoMCwxLCBsZW5ndGg9MTApKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNSksIHlicmVha3MgPSBxLCB5Y29sb3JiYXI9VFJVRSwgdGV4dCA9IHBhc3RlMCgiT3JpZ2luYWwKSW1hZ2UgTWludXMgTjQiLCAiXG4gQmlhcy1Db3JyZWN0ZWQgSW1hZ2UiKSkgCgpzbGljZXMgPSBjKDIsIDYsIDEwLCAxNCwgMTgpCnZhbHMgPSBsYXBwbHkoc2xpY2VzLCBmdW5jdGlvbih4KSB7CiAgY2JpbmQoaW1nID0gYyhuaW1bLCx4XSksIGZhc3QgPSBjKGZhc3RfaW1nWywseF0pLAogICAgICAgIHNsaWNlID0geCkKfSkKdmFscyA9IGRvLmNhbGwoInJiaW5kIiwgdmFscykKdmFscyA9IGRhdGEuZnJhbWUodmFscykKdmFscyA9IHZhbHNbIHZhbHMkaW1nID4gMCAmIHZhbHMkZmFzdCA+IDAsIF0KY29sbmFtZXModmFscylbMToyXSA9IGMoIlNBR1QxTVBSQUdFRGlzdENvck5EIFZhbHVlIiwgIlNBR1QxTVBSQUdFRGlzdENvciBWYWx1ZSIpCnYgPSBtZWx0KHZhbHMsIGlkLnZhcnMgPSAic2xpY2UiKQpnID0gZ2dwbG90KGFlcyh4ID0gdmFsdWUsIGNvbG91ciA9IGZhY3RvcihzbGljZSkpLCBkYXRhID0gdikgKyBnZW9tX2xpbmUoc3RhdCA9ICJkZW5zaXR5IikgKyBmYWNldF93cmFwKH4gdmFyaWFibGUpCmcgPSBnICsgc2NhbGVfY29sb3VyX2Rpc2NyZXRlKG5hbWUgPSAiU2xpY2UgIyIpIApwcmludChnKQpgYGAKPGJyLz4KPGJyLz4KPGJyLz4KCgojIyMjIENvbW1wYXJpc29uIDQ6IE1QUkFHRShORCkgbWludXMgQmlhcyBDb3JyZWN0ZWQgTVBSQUdFLURJU1QuIAojIyMjIyBFeGFtcGxlIHJlc3VsdHMgb2Ygb3Zlci1jb3JyZWN0aW9uICAoPykgb3IgYXBwbGljYXRpb24gb2YgZGlzdC4gY29ycmVjdGlvbiBmaWVsZD8KIyMjIyMgT25lIG5vdGFibGUgb2JzZXJ2YXRpb24gaXMgdGhlIHZveGVsLWludGVuc2l0eSBkaXN0ci4gcGxvdCBpcyBpZGVudGljYWwgdG8gMmEuCmBgYHtyIE1QUkFHRSB2cy4gQmlhcy1jb3JyZWN0ZWQgTVBSQUdFLURJU1QgKG92ZXItY29ycmVjdGlvbiksIGV2YWw9VFJVRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KbmltPXJlYWROSWZUSSgifi9EQVRBL0VQSUNfU0NSSVBUL0RpY29tLzcwODkvNzA4OV8xL1NBR1QxTVBSQUdFRGlzdENvck5ELm5paS5neiIsIHJlb3JpZW50PUZBTFNFKSAKZmFzdF9pbWcgPXJlYWROSWZUSSgifi9EQVRBL0VQSUNfU0NSSVBUL0RpY29tLzcwODkvNzA4OV8xL1NBR1QxTVBSQUdFRGlzdENvcl9CaWFzQ29ycmVjdC5uaWkuZ3oiLCByZW9yaWVudD1GQUxTRSkgCnNsaWNlcyA9IGMoMiwgNiwgMTAsIDE0LCAxOCkKdmFscyA9IGxhcHBseShzbGljZXMsIGZ1bmN0aW9uKHgpIHsKICBjYmluZChpbWcgPSBjKG5pbVssLHhdKSwgZmFzdCA9IGMoZmFzdF9pbWdbLCx4XSksCiAgICAgICAgc2xpY2UgPSB4KQp9KQp2YWxzID0gZG8uY2FsbCgicmJpbmQiLCB2YWxzKQp2YWxzID0gZGF0YS5mcmFtZSh2YWxzKQp2YWxzID0gdmFsc1sgdmFscyRpbWcgPiAwICYgdmFscyRmYXN0ID4gMCwgXQpjb2xuYW1lcyh2YWxzKVsxOjJdID0gYygiU0FHVDFNUFJBR0VEaXN0Q29yTkQiLCAiU0FHVDFNUFJBR0VEaXN0Q29yX0JpYXNDb3JyZWN0IikKdiA9IG1lbHQodmFscywgaWQudmFycyA9ICJzbGljZSIpCmcgPSBnZ3Bsb3QoYWVzKHggPSB2YWx1ZSwgY29sb3VyID0gZmFjdG9yKHNsaWNlKSksIGRhdGEgPSB2KSArIGdlb21fbGluZShzdGF0ID0gImRlbnNpdHkiKSArIGZhY2V0X3dyYXAofiB2YXJpYWJsZSkKZyA9IGcgKyBzY2FsZV9jb2xvdXJfZGlzY3JldGUobmFtZSA9ICJTbGljZSAjIikgCnByaW50KGcpCmBgYAoKCgoKYGBge3IgTVBSQUdFIG1pbnVzIEJpYXMtY29ycmVjdGVkIE1QUkFHRS1ESVNUIChvdmVyLWNvcnJlY3Rpb24pLGV2YWw9VFJVRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KbmltPXJlYWROSWZUSSgifi9EQVRBL0VQSUNfU0NSSVBUL0RpY29tLzcwODkvNzA4OV8xL1NBR1QxTVBSQUdFRGlzdENvck5ELm5paS5neiIsIHJlb3JpZW50PUZBTFNFKSAKZmFzdF9pbWcgPXJlYWROSWZUSSgifi9EQVRBL0VQSUNfU0NSSVBUL0RpY29tLzcwODkvNzA4OV8xL1NBR1QxTVBSQUdFRGlzdENvcl9CaWFzQ29ycmVjdC5uaWkuZ3oiLCByZW9yaWVudD1GQUxTRSkgCnN1Yi5iaWFzIDwtIG5pZnRpYXJyKG5pbSwgbmltLWZhc3RfaW1nKQojIHF1YW50aWxlIHRoZSBkaWZmZXJlbmNlIGltYWdlIHVzaW5nIHRoZXNlIGFzIGJyZWFrcwpxPXF1YW50aWxlKHN1Yi5iaWFzW3N1Yi5iaWFzICE9MF0scHJvYnMgPSBzZXEoMCwxLGJ5PTAuMSkpCiMgZ2V0IGEgZGl2ZXJnaW5nIGdyYWRpZW50IHBhbGV0dGUKZmNvbD1kaXZfZ3JhZGllbnRfcGFsKGxvdz0iYmx1ZSIsbWlkPSJ5ZWxsb3ciLGhpZ2ggPSJyZWQiKQpvcnRobzIobmltLHN1Yi5iaWFzLGNvbC55ID0gYWxwaGEoZmNvbChzZXEoMCwxLCBsZW5ndGg9MTApKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNSksIHlicmVha3MgPSBxLCB5Y29sb3JiYXI9VFJVRSwgdGV4dCA9IHBhc3RlMCgiT3JpZ2luYWwKSW1hZ2UgTWludXMgTjQiLCAiXG4gQmlhcy1Db3JyZWN0ZWQgSW1hZ2UiKSkgCmBgYAoKCgoKCgoK