Some General Comments:

Fermilab Booster Gradient Magnet

  1. Show that for a pure “H”-style dipole magnet with \(N\) turns per pole, current \(I\) per turn, and total gap height \(d\), the central field is given by

\[ B_y \approx \frac{2\mu_0NI}{d} \]

Choose an integration path that goes vertically through the center of the gap, through the iron around the two windings of current, and back to the gap. The integral will be… \[ \int \vec{H}\cdot\vec{d\ell} = \int_{gap} \vec{H}\cdot\vec{d\ell} + \int_{iron} \vec{H}\cdot\vec{d\ell} \\ = \int_{gap} (\vec{B}/\mu_0)\cdot\vec{d\ell} + \int_{iron} (\vec{B}/\mu)\cdot\vec{d\ell} ~~~~~~~~~ (\mu>>\mu_0) \\ \approx \int_{gap} (\vec{B}/\mu_0)\cdot\vec{d\ell} = B_y d/\mu_0 = 2\cdot N\cdot I \\ B_y \approx \frac{2\mu_0NI}{d}. \]

N   = 24 
d   = 0.0508   # m
B0  = 0.73     # T
alf = 10       # degrees
Ws  = 8        # GeV
mu0 = 4*pi/1e7 # T-m/A
  1. If a magnet has a gap of 50.8 mm and produces a field of 1.5 T, how many “Ampere-turns” is required of the magnet design?
NI = B0*d/2/mu0
NI
[1] 14755.25
  1. Now introduce a slope to the poles, creating a gradient magnet, similar to that of the Fermilab Booster magnet shown in class. Derive an estimate for the field gradient \(\partial B_y/\partial x\) if the two pole faces have \(\pm 10^\circ\) degree slopes (resulting in a positive gradient).

If each face has a relative slope of \(\pm \alpha\), then the total gap will vary as \(d = d_0 - 2\alpha x\) for small angle \(\alpha\): \[ B_y(x) \approx \frac{2\mu_0 NI}{d_0-2\alpha x} \approx \frac{2\mu_0NI}{d_0}\left(1+2\alpha \frac xd\right) \] The gradient is thus \[ B' = \frac{\partial B_y}{\partial x}= B_0\frac{2\alpha}{d} \] and the relative gradient will be \[ B'/B_0 = \frac{1}{B_0} \frac{\partial B_y}{\partial x}= \frac{2\alpha}{d}. \]

BponB = (2*alf*pi/180)/d
BponB*B0  # T/m
[1] 5.016104
BponB     # 1/m
[1] 6.871375
  1. Using FEMM, create a realistic model of the above gradient magnet. Compare the value of the field gradient to that of your estimate above.

Create a simple “H” magnet, and proceed to adjust the end points of the gap to create a gradient. We want the gap to vary as \(\pm\alpha\), so raise/lower the points at the edges of the gap by amount \(\pm\alpha\times w/2\), where \(w\) is the width of the gap (4 cm in the example used).

Gradient Magnet

Gradient Magnet

We draw a line and record the values of \(B_y\) along \(y=0\):

dfGrad=read.table("GradMagData.txt",skip=2,header=FALSE,col.names = c("x","By"))
head(dfGrad)
plot(dfGrad$x,dfGrad$By,typ="l")

# do a linear fit of the central region:
gradFit = dfGrad[(dfGrad$x>10) & (dfGrad$x<30),]
gradLM = lm(By ~ x, gradFit)
gradLM

Call:
lm(formula = By ~ x, data = gradFit)

Coefficients:
(Intercept)            x  
   0.613408     0.004903  
plot(gradFit$x,gradFit$By,typ="l")
abline(gradLM, col="red")

The average relative gradient in the central region is about

#  gradLM coeff[2] gives the slope; central field is about 0.6 T
gRel = gradLM$coefficients[2]/0.6*1000  # x is in mm, so here we get 1/m as final unit

\(B'/B_0\) = 8/m.

  1. The Fermilab Booster BF magnet uses 24 turns of conductor per pole. What current is required to generate the field needed for an 8 GeV (kinetic energy) proton beam? Assume the gap height on the ideal orbit is 50.8 mm. [Note: See the Booster parameters found in Problem Set 3.]
Bbf = 0.72588  # T
Bpf = 1.60761  # T/m
Iboo = Bbf*d/2/mu0/N
Iboo  # Ampere
[1] 611.3324
  1. Using your FEMM model as an approximation to the BF magnet, what slope of the pole tips is necessary to generate the gradient required for the Fermilab BF magnet? [Again, see the Booster parameters found in Problem Set 3 to find the necessary gradient.]

From the Booster magnet parameters, the central field of, say, the BF magnet is 0.72588 T and its gradient is 1.60761 T/m. So, the relative gradient should be 2.21 /m.

From our present magnet design above, we see that we need to reduce our gradient by roughly a factor of

GradFrac = (Bpf/Bbf)/gRel

1/GradFrac = 3.69 while keeping the field strength at \(x=0\) to be about 0.7 T, giving a relative gradient of 2.21/m. (The pole tip angle should thus be reduced from the initial 10 degrees to about 3 degrees.) Hence, by iterating the locations of the end points of the gap, and the current in the magnet, we can create such a field condition.

dfGrad2=read.table("GradMagData3.txt",skip=2,header=FALSE,col.names = c("x","By"))
plot(dfGrad2$x,dfGrad2$By,typ="l")

gradFit = dfGrad2[(dfGrad2$x>10) & (dfGrad2$x<30),]
gradLM = lm(By ~ x, gradFit)
gradLM

Call:
lm(formula = By ~ x, data = gradFit)

Coefficients:
(Intercept)            x  
   0.682696     0.001398  
plot(gradFit$x,gradFit$By,typ="l")
abline(gradLM, col="red")

gradLM$coefficients[2]*1000/0.71
       x 
1.969528 

[shooting for a ratio of 2.2, so off by about 10%; but you get the idea…]

MRI Solenoid Magnet

A solenoid magnet to be used for an MRI instrument requires a coil with inner bore radius 0.7 m and a central field strength of 1.5 T.

  1. Assume the MRI magnet coil is a classical solenoid with \(N'\) turns of conductor per meter in the \(z\)-direction and of length much greater than the bore radius. Calculate the necessary value of \(N'\times I\) to produce the desired field value.
NpI = B0/mu0
NpI  # A/m
[1] 1193662
  1. If we again assume zero thickness for the coil, but finite length of \(L\), then one can show that the magnetic field on axis will be \[ B_z(z) = \frac{\mu_0 N'I}{2} \left( \frac{z+L/2}{\sqrt{R^2+(z+L/2)^2}} - \frac{z-L/2}{\sqrt{R^2+(z-L/2)^2} } \right) . \] Calculate and plot the magnitude of the field on the central axis as a function of \(z\) over the range -3 m < \(z\) < 3 m for a solenoid of length 2.2 m.
Bz = function(z){
   mu0*NpI/2*( (z+ell/2)/sqrt(R^2+(z+ell/2)^2) -
      (z-ell/2)/sqrt(R^2+(z-ell/2)^2) )
}
curve(Bz,-3,3)

Bz(0)
[1] 1.265492
#rescale... 
NpI = 1.5/Bz(0)*NpI
NpI
[1] 1414859
curve(Bz,-3,3)

NpI*ell  # turn/m * I * length[m] = total Amps in coil region
[1] 3112690

Note: this amount of current may seem huge: 3.1 million Amps! Readily available superconducting cables can have current densities on the order of 1000 A/mm\(^2\). So, a coil that is 2 m long and 14 mm thick can, in principle, carry on the scale of 1000 A/mm\(^2\) x 2000 mm * 14 mm = 28 MA. Even taking into account efficiencies of cable area, etc., 3.1 MA should not be a problem using this modern technology.

  1. Perform a FEMM calculation for a solenoid magnet with the above properties. For this calculation, assume a coil thickness of 14 mm (i.e., 2% of the coil inner radius). Make a single plot of both the FEMM results of \(B_z(z)\) along with the curve found in part b.

[Note: FEMM ships with a magnetic-solenoid example, “Magnetics Tutorial,” which should be in the directory C:femm42\examples\tutorial.fem on the user’s local machine. Many other useful examples can be found at the FEMM home page, under “Examples”.]

Since we want total current of \(3.1\) MA in the coil region of the solenoid, create a region with this number by adjusting turns per coil and current in coil region in FEMM.

Here is a plot created of such a device:

Solenoid Calculation

Solenoid Calculation

By taking a line along the \(r=0\) axis and saving the data, one can compare the FEMM result with the equation in Part b above. Note that since “\(r=0\)” is a boundary used in the calculation, one will need to obtain points near this line, like say \(r = 0.001\) mm, to use to create the table of \(B_z\) vs. \(z\).

dfSol=read.table("SolenoidData.txt",skip=2,header=FALSE,col.names = c("z","Bz"))
head(dfSol)
dfSol$z = dfSol$z-3  # center the data
plot(dfSol$z,dfSol$Bz,typ="l")
curve(Bz(x),-3,3, add=TRUE, col="red",typ="p")

  1. (Extra Credit): Derive the equation in part b above.

From Biot-Savart Law: \[\begin{eqnarray*} dB_z(z) &=& \frac{\mu_0}{4\pi} \frac{2\pi R \cdot \vec{dI} \times \hat{r'}}{r'^2} = \frac{\mu_0}{4\pi} \frac{2\pi R \cdot dI \cdot (R/r')}{r'^2} \\ &=& \frac{\mu_0\; (j\;dz')}{2}\cdot\frac{R^2}{[(z-z')^2 + R^2 ]^{3/2}} \\ B_z(z) &=& \frac{\mu_0\;j }{2}\int_{-L/2}^{L/2}\cdot\frac{R^2}{[(z-z')^2 + R^2 ]^{3/2}} dz' \\ &=& \frac{\mu_0\;j }{2}\int_{-L/2}^{L/2}\cdot\frac{1}{[((z-z')/R)^2 + 1 ]^{3/2}} \frac{dz'}{R} \\ &=& \frac{\mu_0\;j }{2}\int_{-(L/2+z)/R}^{(L/2-z)/R}\cdot\frac{1}{[u^2 + 1 ]^{3/2}} du \\ &=& \frac{\mu_0\;j }{2} \; \frac{u}{\sqrt{1+ u^2}} \bigg\rvert_{-(L/2+z)/R}^{(L/2-z)/R} \\ &=& \frac{\mu_0\; N'I }{2} \left( \frac{z+L/2}{\sqrt{R^2+(z+L/2)^2}} - \frac{z-L/2}{\sqrt{R^2+(z-L/2)^2} } \right) . \end{eqnarray*}\]


  1. Northern Illinois University and Fermi National Accelerator Laboratory

LS0tCnRpdGxlOiAiSG9tZXdvcmsgNCBEaXNjdXNzaW9uIgphdXRob3I6IE1pa2UgU3lwaGVyc15bTm9ydGhlcm4gSWxsaW5vaXMgVW5pdmVyc2l0eSBhbmQgRmVybWkgTmF0aW9uYWwgQWNjZWxlcmF0b3IKICBMYWJvcmF0b3J5XQpkYXRlOiAnbGFzdCB1cGRhdGU6IGByIGZvcm1hdCgoU3lzLkRhdGUoKSksICIlZCAlYiAlWSIpYCcKb3V0cHV0OiAgaHRtbF9ub3RlYm9vawotLS0KCioqU29tZSBHZW5lcmFsIENvbW1lbnRzOioqCgotIGdyYWRlOiAgMjAgcG9zc2libGUgIAogICAgICArIDEwIHB0cyBlYWNoIHByb2JsZW0gKCs1IGJvbnVzKSAgCiAgICAgICsgYXZlIHNjb3JlOiAgMTkvMjAgIAoKCgoqKkZlcm1pbGFiIEJvb3N0ZXIgR3JhZGllbnQgTWFnbmV0KioKCmEuIFNob3cgdGhhdCBmb3IgYSBwdXJlICJIIi1zdHlsZSBkaXBvbGUgbWFnbmV0IHdpdGggJE4kIHR1cm5zIHBlciBwb2xlLCBjdXJyZW50ICRJJCBwZXIgdHVybiwgYW5kIHRvdGFsIGdhcCBoZWlnaHQgJGQkLCB0aGUgY2VudHJhbCBmaWVsZCBpcyBnaXZlbiBieSAgCgokJApCX3kgXGFwcHJveCBcZnJhY3syXG11XzBOSX17ZH0gCiQkCgpDaG9vc2UgYW4gaW50ZWdyYXRpb24gcGF0aCB0aGF0IGdvZXMgdmVydGljYWxseSB0aHJvdWdoIHRoZSBjZW50ZXIgb2YgdGhlIGdhcCwgdGhyb3VnaCB0aGUgaXJvbiBhcm91bmQgdGhlIHR3byB3aW5kaW5ncyBvZiBjdXJyZW50LCBhbmQgYmFjayB0byB0aGUgZ2FwLiAgVGhlIGludGVncmFsIHdpbGwgYmUuLi4KJCQKXGludCBcdmVje0h9XGNkb3RcdmVje2RcZWxsfSA9IFxpbnRfe2dhcH0gXHZlY3tIfVxjZG90XHZlY3tkXGVsbH0gKyBcaW50X3tpcm9ufSBcdmVje0h9XGNkb3RcdmVje2RcZWxsfSBcXAogPSBcaW50X3tnYXB9IChcdmVje0J9L1xtdV8wKVxjZG90XHZlY3tkXGVsbH0gKyBcaW50X3tpcm9ufSAoXHZlY3tCfS9cbXUpXGNkb3RcdmVje2RcZWxsfSB+fn5+fn5+fn4gKFxtdT4+XG11XzApIFxcCiBcYXBwcm94ICBcaW50X3tnYXB9IChcdmVje0J9L1xtdV8wKVxjZG90XHZlY3tkXGVsbH0gPSBCX3kgZC9cbXVfMCA9IDJcY2RvdCBOXGNkb3QgSSBcXAogQl95IFxhcHByb3ggXGZyYWN7MlxtdV8wTkl9e2R9LgokJAoKCmBgYHtyLCBldmFsPVRSVUUsIGVjaG89VFJVRX0KTiAgID0gMjQgCmQgICA9IDAuMDUwOCAgICMgbQpCMCAgPSAwLjczICAgICAjIFQKYWxmID0gMTAgICAgICAgIyBkZWdyZWVzCldzICA9IDggICAgICAgICMgR2VWCm11MCA9IDQqcGkvMWU3ICMgVC1tL0EKYGBgCgpiLiBJZiBhIG1hZ25ldCBoYXMgYSBnYXAgb2YgYHIgcm91bmQoZCoxMDAwLDEpYCBtbSBhbmQgcHJvZHVjZXMgYSBmaWVsZCBvZiBgciBCMGAgVCwgaG93IG1hbnkgIkFtcGVyZS10dXJucyIgaXMgcmVxdWlyZWQgb2YgdGhlIG1hZ25ldCBkZXNpZ24/ICAKCmBgYHtyLCBldmFsPVRSVUUsIGVjaG89VFJVRX0KTkkgPSBCMCpkLzIvbXUwCk5JCmBgYAoKYy4gTm93IGludHJvZHVjZSBhIHNsb3BlIHRvIHRoZSBwb2xlcywgY3JlYXRpbmcgYSBncmFkaWVudCBtYWduZXQsIHNpbWlsYXIgdG8gdGhhdCBvZiB0aGUgRmVybWlsYWIgQm9vc3RlciBtYWduZXQgc2hvd24gaW4gY2xhc3MuICBEZXJpdmUgYW4gZXN0aW1hdGUgZm9yIHRoZSBmaWVsZCBncmFkaWVudCAkXHBhcnRpYWwgQl95L1xwYXJ0aWFsIHgkIGlmIHRoZSB0d28gcG9sZSBmYWNlcyBoYXZlICRccG0gYHIgYWxmYF5cY2lyYyQgZGVncmVlIHNsb3BlcyAocmVzdWx0aW5nIGluIGEgcG9zaXRpdmUgZ3JhZGllbnQpLiAgCgpJZiBlYWNoIGZhY2UgaGFzIGEgcmVsYXRpdmUgc2xvcGUgb2YgJFxwbSBcYWxwaGEkLCB0aGVuIHRoZSB0b3RhbCBnYXAgd2lsbCB2YXJ5IGFzICRkID0gZF8wIC0gMlxhbHBoYSB4JCBmb3Igc21hbGwgYW5nbGUgJFxhbHBoYSQ6CiQkCkJfeSh4KSBcYXBwcm94IFxmcmFjezJcbXVfMCBOSX17ZF8wLTJcYWxwaGEgeH0gXGFwcHJveCBcZnJhY3syXG11XzBOSX17ZF8wfVxsZWZ0KDErMlxhbHBoYSBcZnJhYyB4ZFxyaWdodCkgCiQkClRoZSBncmFkaWVudCBpcyB0aHVzCiQkCkInID0gIFxmcmFje1xwYXJ0aWFsIEJfeX17XHBhcnRpYWwgeH09IEJfMFxmcmFjezJcYWxwaGF9e2R9CiQkCmFuZCB0aGUgcmVsYXRpdmUgZ3JhZGllbnQgd2lsbCBiZQokJApCJy9CXzAgPSBcZnJhY3sxfXtCXzB9IFxmcmFje1xwYXJ0aWFsIEJfeX17XHBhcnRpYWwgeH09IFxmcmFjezJcYWxwaGF9e2R9LgokJApgYGB7ciwgZXZhbD1UUlVFLCBlY2hvPVRSVUV9CkJwb25CID0gKDIqYWxmKnBpLzE4MCkvZApCcG9uQipCMCAgIyBUL20KQnBvbkIgICAgICMgMS9tCmBgYAoKCmQuIFVzaW5nIGBGRU1NYCwgY3JlYXRlIGEgcmVhbGlzdGljIG1vZGVsIG9mIHRoZSBhYm92ZSBncmFkaWVudCBtYWduZXQuICBDb21wYXJlIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgZ3JhZGllbnQgdG8gdGhhdCBvZiB5b3VyIGVzdGltYXRlIGFib3ZlLiAgCgpDcmVhdGUgYSBzaW1wbGUgIkgiIG1hZ25ldCwgYW5kIHByb2NlZWQgdG8gYWRqdXN0IHRoZSBlbmQgcG9pbnRzIG9mIHRoZSBnYXAgdG8gY3JlYXRlIGEgZ3JhZGllbnQuICBXZSB3YW50IHRoZSBnYXAgdG8gdmFyeSBhcyAkXHBtXGFscGhhJCwgc28gcmFpc2UvbG93ZXIgdGhlIHBvaW50cyBhdCB0aGUgZWRnZXMgb2YgdGhlIGdhcCBieSBhbW91bnQgJFxwbVxhbHBoYVx0aW1lcyB3LzIkLCB3aGVyZSAkdyQgaXMgdGhlIHdpZHRoIG9mIHRoZSBnYXAgKDQgY20gaW4gdGhlIGV4YW1wbGUgdXNlZCkuCgohW0dyYWRpZW50IE1hZ25ldF0oR3JhZE1hZ0NhbGMucG5nKQoKV2UgZHJhdyBhIGxpbmUgYW5kIHJlY29yZCB0aGUgdmFsdWVzIG9mICRCX3kkIGFsb25nICR5PTAkOgpgYGB7ciwgZXZhbD1UUlVFLCBlY2hvPVRSVUV9CmRmR3JhZD1yZWFkLnRhYmxlKCJHcmFkTWFnRGF0YS50eHQiLHNraXA9MixoZWFkZXI9RkFMU0UsY29sLm5hbWVzID0gYygieCIsIkJ5IikpCmhlYWQoZGZHcmFkKQpwbG90KGRmR3JhZCR4LGRmR3JhZCRCeSx0eXA9ImwiKQojIGRvIGEgbGluZWFyIGZpdCBvZiB0aGUgY2VudHJhbCByZWdpb246CmdyYWRGaXQgPSBkZkdyYWRbKGRmR3JhZCR4PjEwKSAmIChkZkdyYWQkeDwzMCksXQpncmFkTE0gPSBsbShCeSB+IHgsIGdyYWRGaXQpCmdyYWRMTQpwbG90KGdyYWRGaXQkeCxncmFkRml0JEJ5LHR5cD0ibCIpCmFibGluZShncmFkTE0sIGNvbD0icmVkIikKYGBgCgpUaGUgYXZlcmFnZSByZWxhdGl2ZSBncmFkaWVudCBpbiB0aGUgY2VudHJhbCByZWdpb24gaXMgYWJvdXQKYGBge3IsIGV2YWw9VFJVRSwgZWNobz1UUlVFfQojICBncmFkTE0gY29lZmZbMl0gZ2l2ZXMgdGhlIHNsb3BlOyBjZW50cmFsIGZpZWxkIGlzIGFib3V0IDAuNiBUCmdSZWwgPSBncmFkTE0kY29lZmZpY2llbnRzWzJdLzAuNioxMDAwICAjIHggaXMgaW4gbW0sIHNvIGhlcmUgd2UgZ2V0IDEvbSBhcyBmaW5hbCB1bml0CmBgYAokQicvQl8wJCA9IGByIHJvdW5kKGdSZWwpYC9tLgoKZS4gVGhlIEZlcm1pbGFiIEJvb3N0ZXIgKipCRioqIG1hZ25ldCB1c2VzIGByIE5gIHR1cm5zIG9mIGNvbmR1Y3RvciBwZXIgcG9sZS4gIFdoYXQgY3VycmVudCBpcyByZXF1aXJlZCB0byBnZW5lcmF0ZSB0aGUgZmllbGQgbmVlZGVkIGZvciBhbiBgciBXc2AgR2VWIChraW5ldGljIGVuZXJneSkgcHJvdG9uIGJlYW0/ICBBc3N1bWUgdGhlIGdhcCBoZWlnaHQgb24gdGhlIGlkZWFsIG9yYml0IGlzIGByIHJvdW5kKGQqMTAwMCwxKWAgbW0uIFtOb3RlOiAgU2VlIHRoZSBCb29zdGVyIHBhcmFtZXRlcnMgZm91bmQgaW4gUHJvYmxlbSBTZXQgMy5dICAKYGBge3IsIGV2YWw9VFJVRSwgZWNobz1UUlVFfQpCYmYgPSAwLjcyNTg4ICAjIFQKQnBmID0gMS42MDc2MSAgIyBUL20KSWJvbyA9IEJiZipkLzIvbXUwL04KSWJvbyAgIyBBbXBlcmUKYGBgCgpmLiBVc2luZyB5b3VyIGBGRU1NYCBtb2RlbCBhcyBhbiBhcHByb3hpbWF0aW9uIHRvIHRoZSAqKkJGKiogbWFnbmV0LCB3aGF0IHNsb3BlIG9mIHRoZSBwb2xlIHRpcHMgaXMgbmVjZXNzYXJ5IHRvIGdlbmVyYXRlIHRoZSBncmFkaWVudCByZXF1aXJlZCBmb3IgdGhlIEZlcm1pbGFiICoqQkYqKiBtYWduZXQ/IFtBZ2Fpbiwgc2VlIHRoZSBCb29zdGVyIHBhcmFtZXRlcnMgZm91bmQgaW4gUHJvYmxlbSBTZXQgMyB0byBmaW5kIHRoZSBuZWNlc3NhcnkgZ3JhZGllbnQuXSAgCgpGcm9tIHRoZSBCb29zdGVyIG1hZ25ldCBwYXJhbWV0ZXJzLCB0aGUgY2VudHJhbCBmaWVsZCBvZiwgc2F5LCB0aGUgKipCRioqIG1hZ25ldCBpcyBgciBCYmZgIFQgYW5kIGl0cyBncmFkaWVudCBpcyBgciBCcGZgIFQvbS4gIFNvLCB0aGUgcmVsYXRpdmUgZ3JhZGllbnQgc2hvdWxkIGJlIGByIHJvdW5kKEJwZi9CYmYsMilgIC9tLgoKRnJvbSBvdXIgcHJlc2VudCBtYWduZXQgZGVzaWduIGFib3ZlLCB3ZSBzZWUgdGhhdCB3ZSBuZWVkIHRvIHJlZHVjZSBvdXIgZ3JhZGllbnQgYnkgcm91Z2hseSBhIGZhY3RvciBvZgpgYGB7ciwgZXZhbD1UUlVFLCBlY2hvPVRSVUV9CkdyYWRGcmFjID0gKEJwZi9CYmYpL2dSZWwKYGBgCmAxL0dyYWRGcmFjYCA9IGByIHJvdW5kKDEvR3JhZEZyYWMsMilgIHdoaWxlIGtlZXBpbmcgdGhlIGZpZWxkIHN0cmVuZ3RoIGF0ICR4PTAkIHRvIGJlIGFib3V0IDAuNyBULCBnaXZpbmcgYSByZWxhdGl2ZSBncmFkaWVudCBvZiBgciByb3VuZChCcGYvQmJmLDIpYC9tLiAoVGhlIHBvbGUgdGlwIGFuZ2xlIHNob3VsZCB0aHVzIGJlIHJlZHVjZWQgZnJvbSB0aGUgaW5pdGlhbCAxMCBkZWdyZWVzIHRvIGFib3V0IGByIHJvdW5kKDEwKkdyYWRGcmFjKWAgZGVncmVlcy4pICBIZW5jZSwgYnkgaXRlcmF0aW5nIHRoZSBsb2NhdGlvbnMgb2YgdGhlIGVuZCBwb2ludHMgb2YgdGhlIGdhcCwgYW5kIHRoZSBjdXJyZW50IGluIHRoZSBtYWduZXQsIHdlIGNhbiBjcmVhdGUgc3VjaCBhIGZpZWxkIGNvbmRpdGlvbi4KCmBgYHtyLCBldmFsPVRSVUUsIGVjaG89VFJVRX0KZGZHcmFkMj1yZWFkLnRhYmxlKCJHcmFkTWFnRGF0YTMudHh0Iixza2lwPTIsaGVhZGVyPUZBTFNFLGNvbC5uYW1lcyA9IGMoIngiLCJCeSIpKQpwbG90KGRmR3JhZDIkeCxkZkdyYWQyJEJ5LHR5cD0ibCIpCmdyYWRGaXQgPSBkZkdyYWQyWyhkZkdyYWQyJHg+MTApICYgKGRmR3JhZDIkeDwzMCksXQpncmFkTE0gPSBsbShCeSB+IHgsIGdyYWRGaXQpCmdyYWRMTQpwbG90KGdyYWRGaXQkeCxncmFkRml0JEJ5LHR5cD0ibCIpCmFibGluZShncmFkTE0sIGNvbD0icmVkIikKZ3JhZExNJGNvZWZmaWNpZW50c1syXSoxMDAwLzAuNzEKYGBgCgpbc2hvb3RpbmcgZm9yIGEgcmF0aW8gb2YgMi4yLCBzbyBvZmYgYnkgYWJvdXQgMTAlOyBidXQgeW91IGdldCB0aGUgaWRlYS4uLl0KCioqTVJJIFNvbGVub2lkIE1hZ25ldCoqCgpgYGB7ciwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQpCMCAgPSAxLjUgICAgICAgIyBUCmVsbCA9IDIuMiAgICAgICAjIG0KUiAgID0gMC43ICAgICAgICMgbQpgYGAKCkEgc29sZW5vaWQgbWFnbmV0IHRvIGJlIHVzZWQgZm9yIGFuIE1SSSBpbnN0cnVtZW50IHJlcXVpcmVzIGEgY29pbCB3aXRoIGlubmVyIGJvcmUgcmFkaXVzIGByIFJgIG0gYW5kIGEgY2VudHJhbCBmaWVsZCBzdHJlbmd0aCBvZiBgciBCMGAgVC4KCmEuIEFzc3VtZSB0aGUgTVJJIG1hZ25ldCBjb2lsIGlzIGEgY2xhc3NpY2FsIHNvbGVub2lkIHdpdGggJE4nJCB0dXJucyBvZiBjb25kdWN0b3IgcGVyIG1ldGVyIGluIHRoZSAkeiQtZGlyZWN0aW9uIGFuZCBvZiBsZW5ndGggbXVjaCBncmVhdGVyIHRoYW4gdGhlIGJvcmUgcmFkaXVzLiAgQ2FsY3VsYXRlIHRoZSBuZWNlc3NhcnkgdmFsdWUgb2YgJE4nXHRpbWVzIEkkIHRvIHByb2R1Y2UgdGhlIGRlc2lyZWQgZmllbGQgdmFsdWUuICAKCmBgYHtyfQpOcEkgPSBCMC9tdTAKTnBJICAjIEEvbQpgYGAKCgoKYi4gSWYgd2UgYWdhaW4gYXNzdW1lIHplcm8gdGhpY2tuZXNzIGZvciB0aGUgY29pbCwgYnV0IGZpbml0ZSBsZW5ndGggb2YgJEwkLCB0aGVuIG9uZSBjYW4gc2hvdyB0aGF0IHRoZSBtYWduZXRpYyBmaWVsZCBvbiBheGlzIHdpbGwgYmUKJCQKQl96KHopID0gXGZyYWN7XG11XzAgTidJfXsyfSBcbGVmdCggXGZyYWN7eitMLzJ9e1xzcXJ0e1JeMisoeitMLzIpXjJ9fSAtIAogIFxmcmFje3otTC8yfXtcc3FydHtSXjIrKHotTC8yKV4yfSB9IFxyaWdodCkgLgokJApDYWxjdWxhdGUgYW5kIHBsb3QgdGhlIG1hZ25pdHVkZSBvZiB0aGUgZmllbGQgb24gdGhlIGNlbnRyYWwgYXhpcyBhcyBhIGZ1bmN0aW9uIG9mICR6JCBvdmVyIHRoZSByYW5nZSAtMyBtIDwgJHokIDwgMyBtIGZvciBhIHNvbGVub2lkIG9mIGxlbmd0aCBgciBlbGxgIG0uICAKCmBgYHtyfQpCeiA9IGZ1bmN0aW9uKHopewogICBtdTAqTnBJLzIqKCAoeitlbGwvMikvc3FydChSXjIrKHorZWxsLzIpXjIpIC0KICAgICAgKHotZWxsLzIpL3NxcnQoUl4yKyh6LWVsbC8yKV4yKSApCn0KY3VydmUoQnosLTMsMykKQnooMCkKI3Jlc2NhbGUuLi4gCk5wSSA9IDEuNS9CeigwKSpOcEkKTnBJCmN1cnZlKEJ6LC0zLDMpCk5wSSplbGwgICMgdHVybi9tICogSSAqIGxlbmd0aFttXSA9IHRvdGFsIEFtcHMgaW4gY29pbCByZWdpb24KYGBgCgpOb3RlOiAgdGhpcyBhbW91bnQgb2YgY3VycmVudCBtYXkgc2VlbSBodWdlOiAgYHIgcm91bmQoTnBJKmVsbC8xZTYsMSlgICBtaWxsaW9uIEFtcHMhICBSZWFkaWx5IGF2YWlsYWJsZSBzdXBlcmNvbmR1Y3RpbmcgY2FibGVzIGNhbiBoYXZlIGN1cnJlbnQgZGVuc2l0aWVzIG9uIHRoZSBvcmRlciBvZiAxMDAwIEEvbW0kXjIkLiAgU28sIGEgY29pbCB0aGF0IGlzIDIgbSBsb25nIGFuZCAxNCBtbSB0aGljayBjYW4sIGluIHByaW5jaXBsZSwgY2Fycnkgb24gdGhlIHNjYWxlIG9mIDEwMDAgQS9tbSReMiQgeCAyMDAwIG1tICogMTQgbW0gPSAyOCBNQS4gIEV2ZW4gdGFraW5nIGludG8gYWNjb3VudCBlZmZpY2llbmNpZXMgb2YgY2FibGUgYXJlYSwgZXRjLiwgYHIgcm91bmQoTnBJKmVsbC8xZTYsMSlgIE1BIHNob3VsZCBub3QgYmUgYSBwcm9ibGVtIHVzaW5nIHRoaXMgbW9kZXJuIHRlY2hub2xvZ3kuICAKCmMuIFBlcmZvcm0gYSBgRkVNTWAgY2FsY3VsYXRpb24gZm9yIGEgc29sZW5vaWQgbWFnbmV0IHdpdGggdGhlIGFib3ZlIHByb3BlcnRpZXMuICBGb3IgdGhpcyBjYWxjdWxhdGlvbiwgYXNzdW1lIGEgY29pbCB0aGlja25lc3Mgb2YgYHIgMC4wMipSKjEwMDBgIG1tICgqaS5lLiosIDIlIG9mIHRoZSBjb2lsIGlubmVyIHJhZGl1cykuICAgTWFrZSBhIHNpbmdsZSBwbG90IG9mIGJvdGggdGhlIGBGRU1NYCByZXN1bHRzIG9mICRCX3ooeikkIGFsb25nIHdpdGggdGhlIGN1cnZlIGZvdW5kIGluIHBhcnQgYGJgLgoKW05vdGU6ICBgRkVNTWAgc2hpcHMgd2l0aCBhIG1hZ25ldGljLXNvbGVub2lkIGV4YW1wbGUsIOKAnE1hZ25ldGljcyBUdXRvcmlhbCzigJ0gd2hpY2ggc2hvdWxkIGJlIGluIHRoZSBkaXJlY3RvcnkgYEM6ZmVtbTQyXGV4YW1wbGVzXHR1dG9yaWFsLmZlbWAgb24gdGhlIHVzZXLigJlzIGxvY2FsIG1hY2hpbmUuIApNYW55IG90aGVyIHVzZWZ1bCBleGFtcGxlcyBjYW4gYmUgZm91bmQgYXQgdGhlIGBGRU1NYCBob21lIHBhZ2UsIHVuZGVyICJFeGFtcGxlcyIuXQoKU2luY2Ugd2Ugd2FudCB0b3RhbCBjdXJyZW50IG9mICRgciByb3VuZChOcEkqZWxsLzFlNiwxKWAkIE1BIGluIHRoZSBjb2lsIHJlZ2lvbiBvZiB0aGUgc29sZW5vaWQsIGNyZWF0ZSBhIHJlZ2lvbiB3aXRoIHRoaXMgbnVtYmVyIGJ5IGFkanVzdGluZyB0dXJucyBwZXIgY29pbCBhbmQgY3VycmVudCBpbiBjb2lsIHJlZ2lvbiBpbiBgRkVNTWAuICAKCkhlcmUgaXMgYSBwbG90IGNyZWF0ZWQgb2Ygc3VjaCBhIGRldmljZToKCiFbU29sZW5vaWQgQ2FsY3VsYXRpb25dKFNvbGVub2lkQ2FsYy5wbmcpCgpCeSB0YWtpbmcgYSBsaW5lIGFsb25nIHRoZSAkcj0wJCBheGlzIGFuZCBzYXZpbmcgdGhlIGRhdGEsIG9uZSBjYW4gY29tcGFyZSB0aGUgYEZFTU1gIHJlc3VsdCB3aXRoIHRoZSBlcXVhdGlvbiBpbiBQYXJ0IGBiYCBhYm92ZS4gIE5vdGUgdGhhdCBzaW5jZSAiJHI9MCQiIGlzIGEgYm91bmRhcnkgdXNlZCBpbiB0aGUgY2FsY3VsYXRpb24sIG9uZSB3aWxsIG5lZWQgdG8gb2J0YWluIHBvaW50cyAqbmVhciogdGhpcyBsaW5lLCBsaWtlIHNheSAkciA9IDAuMDAxJCBtbSwgdG8gdXNlIHRvIGNyZWF0ZSB0aGUgdGFibGUgb2YgJEJfeiQgdnMuICR6JC4KCmBgYHtyfQpkZlNvbD1yZWFkLnRhYmxlKCJTb2xlbm9pZERhdGEudHh0Iixza2lwPTIsaGVhZGVyPUZBTFNFLGNvbC5uYW1lcyA9IGMoInoiLCJCeiIpKQpoZWFkKGRmU29sKQpkZlNvbCR6ID0gZGZTb2wkei0zICAjIGNlbnRlciB0aGUgZGF0YQpwbG90KGRmU29sJHosZGZTb2wkQnosdHlwPSJsIikKY3VydmUoQnooeCksLTMsMywgYWRkPVRSVUUsIGNvbD0icmVkIix0eXA9InAiKQpgYGAKCgpkLiAoRXh0cmEgQ3JlZGl0KTogIERlcml2ZSB0aGUgZXF1YXRpb24gaW4gcGFydCBgYmAgYWJvdmUuCgpGcm9tIEJpb3QtU2F2YXJ0IExhdzoKXGJlZ2lue2VxbmFycmF5Kn0KZEJfeih6KSAmPSYgXGZyYWN7XG11XzB9ezRccGl9IFxmcmFjezJccGkgUiBcY2RvdCBcdmVje2RJfSBcdGltZXMgXGhhdHtyJ319e3InXjJ9Cj0gXGZyYWN7XG11XzB9ezRccGl9IFxmcmFjezJccGkgUiBcY2RvdCBkSSBcY2RvdCAoUi9yJyl9e3InXjJ9IFxcCiAgJj0mIFxmcmFje1xtdV8wXDsgKGpcO2R6Jyl9ezJ9XGNkb3RcZnJhY3tSXjJ9e1soei16JyleMiArIFJeMiBdXnszLzJ9fSBcXAogQl96KHopICY9JiBcZnJhY3tcbXVfMFw7aiB9ezJ9XGludF97LUwvMn1ee0wvMn1cY2RvdFxmcmFje1JeMn17Wyh6LXonKV4yICsgUl4yIF1eezMvMn19IGR6JyBcXAogICAmPSYgXGZyYWN7XG11XzBcO2ogfXsyfVxpbnRfey1MLzJ9XntMLzJ9XGNkb3RcZnJhY3sxfXtbKCh6LXonKS9SKV4yICsgMSBdXnszLzJ9fSBcZnJhY3tkeid9e1J9IFxcCiAgICY9JiBcZnJhY3tcbXVfMFw7aiB9ezJ9XGludF97LShMLzIreikvUn1eeyhMLzIteikvUn1cY2RvdFxmcmFjezF9e1t1XjIgKyAxIF1eezMvMn19IGR1IFxcCiAgICY9JiBcZnJhY3tcbXVfMFw7aiB9ezJ9IFw7IFxmcmFje3V9e1xzcXJ0ezErIHVeMn19IFxiaWdnXHJ2ZXJ0X3stKEwvMit6KS9SfV57KEwvMi16KS9SfSBcXAogICAmPSYgXGZyYWN7XG11XzBcOyBOJ0kgfXsyfSBcbGVmdCggXGZyYWN7eitMLzJ9e1xzcXJ0e1JeMisoeitMLzIpXjJ9fSAtIAogIFxmcmFje3otTC8yfXtcc3FydHtSXjIrKHotTC8yKV4yfSB9IFxyaWdodCkgLgpcZW5ke2VxbmFycmF5Kn0KCgo=