sys = Scanner(B0, B1, Gmax, Smax, ADC_Δt, seq_Δt, GR_Δt, RF_Δt,
+KomaMRIBase · KomaMRI.jl sys = Scanner(B0, B1, Gmax, Smax, ADC_Δt, seq_Δt, GR_Δt, RF_Δt,
RF_ring_down_T, RF_dead_time_T, ADC_dead_time_T)
The Scanner struct. It contains hardware limitations of the MRI resonator. It is an input for the simulation.
Arguments
B0
: (::Real
, =1.5
, [T]
) main magnetic field strengthB1
: (::Real
, =10e-6
, [T]
) maximum RF amplitudeGmax
: (::Real
, =60e-3
, [T/m]
) maximum gradient amplitudeSmax
: (::Real
, =500
, [mT/m/ms]
) gradient's maximum slew-rateADC_Δt
: (::Real
, =2e-6
, [s]
) ADC raster timeseq_Δt
: (::Real
, =1e-5
, [s]
) sequence-block raster timeGR_Δt
: (::Real
, =1e-5
, [s]
) gradient raster timeRF_Δt
: (::Real
, =1e-6
, [s]
) RF raster timeRF_ring_down_T
: (::Real
, =20e-6
, [s]
) RF ring down timeRF_dead_time_T
: (::Real
, =100e-6
, [s]
) RF dead timeADC_dead_time_T
: (::Real
, =10e-6
, [s]
) ADC dead timeReturns
sys
: (::Scanner
) Scanner structExamples
julia> sys = Scanner()
-julia> sys.B0
source obj = Phantom(name, x, y, z, ρ, T1, T2, T2s, Δw, Dλ1, Dλ2, Dθ, motion)
The Phantom struct. Most of its field names are vectors, with each element associated with a property value representing a spin. This struct serves as an input for the simulation.
Arguments
name
: (::String
) phantom namex
: (::AbstractVector{T<:Real}
, [m]
) spin x-position vectory
: (::AbstractVector{T<:Real}
, [m]
) spin y-position vectorz
: (::AbstractVector{T<:Real}
, [m]
) spin z-position vectorρ
: (::AbstractVector{T<:Real}
) spin proton density vectorT1
: (::AbstractVector{T<:Real}
, [s]
) spin T1 parameter vectorT2
: (::AbstractVector{T<:Real}
, [s]
) spin T2 parameter vectorT2s
: (::AbstractVector{T<:Real}
, [s]
) spin T2s parameter vectorΔw
: (::AbstractVector{T<:Real}
, [rad/s]
) spin off-resonance parameter vectorDλ1
: (::AbstractVector{T<:Real}
) spin Dλ1 (diffusion) parameter vectorDλ2
: (::AbstractVector{T<:Real}
) spin Dλ2 (diffusion) parameter vectorDθ
: (::AbstractVector{T<:Real}
) spin Dθ (diffusion) parameter vectormotion
: (::AbstractMotion{T<:Real}
) motionReturns
obj
: (::Phantom
) Phantom structExamples
julia> obj = Phantom(x=[0.0])
+julia> sys.B0
source obj = Phantom(name, x, y, z, ρ, T1, T2, T2s, Δw, Dλ1, Dλ2, Dθ, motion)
The Phantom struct. Most of its field names are vectors, with each element associated with a property value representing a spin. This struct serves as an input for the simulation.
Arguments
name
: (::String
) phantom namex
: (::AbstractVector{T<:Real}
, [m]
) spin x-position vectory
: (::AbstractVector{T<:Real}
, [m]
) spin y-position vectorz
: (::AbstractVector{T<:Real}
, [m]
) spin z-position vectorρ
: (::AbstractVector{T<:Real}
) spin proton density vectorT1
: (::AbstractVector{T<:Real}
, [s]
) spin T1 parameter vectorT2
: (::AbstractVector{T<:Real}
, [s]
) spin T2 parameter vectorT2s
: (::AbstractVector{T<:Real}
, [s]
) spin T2s parameter vectorΔw
: (::AbstractVector{T<:Real}
, [rad/s]
) spin off-resonance parameter vectorDλ1
: (::AbstractVector{T<:Real}
) spin Dλ1 (diffusion) parameter vectorDλ2
: (::AbstractVector{T<:Real}
) spin Dλ2 (diffusion) parameter vectorDθ
: (::AbstractVector{T<:Real}
) spin Dθ (diffusion) parameter vectormotion
: (::AbstractMotion{T<:Real}
) motionReturns
obj
: (::Phantom
) Phantom structExamples
julia> obj = Phantom(x=[0.0])
-julia> obj.ρ
source phantom = brain_phantom2D(;axis="axial", ss=4)
Creates a two-dimensional brain Phantom struct. Default ss=4 sample spacing is 2 mm. Original file (ss=1) sample spacing is .5 mm.
References
B. Aubert-Broche, D.L. Collins, A.C. Evans: "A new improved version of the realistic digital brain phantom" NeuroImage, in review - 2006 B. Aubert-Broche, M. Griffin, G.B. Pike, A.C. Evans and D.L. Collins: "20 new digital brain phantoms for creation of validation image data bases" IEEE TMI, in review - 2006 https://brainweb.bic.mni.mcgill.ca/brainweb/tissuemr parameters.txt Keywords
axis
: (::String
, ="axial"
, opts=["axial"
, "coronal"
, "sagittal"
]) orientation of the phantomss
: (::Integer or ::Vector{Integer}
, =4
) subsampling parameter for all axes if scaler, per axis if 2 element vector [ssx, ssy]us
: (::Integer or ::Vector{Integer}
, =1
) upsampling parameter for all axes if scaler, per axis if 2 element vector [usx, usy], if used ss is set to ss=1Returns
obj
: (::Phantom
) Phantom structExamples
julia> obj = brain_phantom2D(; axis="sagittal", ss=1)
+julia> obj.ρ
source phantom = brain_phantom2D(;axis="axial", ss=4)
Creates a two-dimensional brain Phantom struct. Default ss=4 sample spacing is 2 mm. Original file (ss=1) sample spacing is .5 mm.
References
B. Aubert-Broche, D.L. Collins, A.C. Evans: "A new improved version of the realistic digital brain phantom" NeuroImage, in review - 2006 B. Aubert-Broche, M. Griffin, G.B. Pike, A.C. Evans and D.L. Collins: "20 new digital brain phantoms for creation of validation image data bases" IEEE TMI, in review - 2006 https://brainweb.bic.mni.mcgill.ca/brainweb/tissuemr parameters.txt Keywords
axis
: (::String
, ="axial"
, opts=["axial"
, "coronal"
, "sagittal"
]) orientation of the phantomss
: (::Integer or ::Vector{Integer}
, =4
) subsampling parameter for all axes if scaler, per axis if 2 element vector [ssx, ssy]us
: (::Integer or ::Vector{Integer}
, =1
) upsampling parameter for all axes if scaler, per axis if 2 element vector [usx, usy], if used ss is set to ss=1Returns
obj
: (::Phantom
) Phantom structExamples
julia> obj = brain_phantom2D(; axis="sagittal", ss=1)
julia> obj = brain_phantom2D(; axis="axial", us=[1, 2])
-julia> plot_phantom_map(obj, :ρ)
source obj = brain_phantom3D(; ss=4, us=1, start_end=[160,200])
Creates a three-dimentional brain Phantom struct. Default ss=4 sample spacing is 2 mm. Original file (ss=1) sample spacing is .5 mm.
References
B. Aubert-Broche, D.L. Collins, A.C. Evans: "A new improved version of the realistic digital brain phantom" NeuroImage, in review - 2006 B. Aubert-Broche, M. Griffin, G.B. Pike, A.C. Evans and D.L. Collins: "20 new digital brain phantoms for creation of validation image data bases" IEEE TMI, in review - 2006 https://brainweb.bic.mni.mcgill.ca/brainweb/tissuemr parameters.txt Keywords
ss
: (::Integer or ::Vector{Integer}
, =4
) subsampling parameter for all axes if scaler, per axis if 3 element vector [ssx, ssy, ssz]us
: (::Integer or ::Vector{Integer}
, =1
) upsampling parameter for all axes if scaler, per axis if 3 element vector [usx, usy, usz]start_end
: (::Vector{Integer}
, =[160,200]
) z index range of presampled phantom, 180 is centerReturns
obj
: (::Phantom
) 3D Phantom structExamples
julia> obj = brain_phantom3D(; ss=5)
+julia> plot_phantom_map(obj, :ρ)
source obj = brain_phantom3D(; ss=4, us=1, start_end=[160,200])
Creates a three-dimentional brain Phantom struct. Default ss=4 sample spacing is 2 mm. Original file (ss=1) sample spacing is .5 mm.
References
B. Aubert-Broche, D.L. Collins, A.C. Evans: "A new improved version of the realistic digital brain phantom" NeuroImage, in review - 2006 B. Aubert-Broche, M. Griffin, G.B. Pike, A.C. Evans and D.L. Collins: "20 new digital brain phantoms for creation of validation image data bases" IEEE TMI, in review - 2006 https://brainweb.bic.mni.mcgill.ca/brainweb/tissuemr parameters.txt Keywords
ss
: (::Integer or ::Vector{Integer}
, =4
) subsampling parameter for all axes if scaler, per axis if 3 element vector [ssx, ssy, ssz]us
: (::Integer or ::Vector{Integer}
, =1
) upsampling parameter for all axes if scaler, per axis if 3 element vector [usx, usy, usz]start_end
: (::Vector{Integer}
, =[160,200]
) z index range of presampled phantom, 180 is centerReturns
obj
: (::Phantom
) 3D Phantom structExamples
julia> obj = brain_phantom3D(; ss=5)
julia> obj = brain_phantom3D(; us=[2, 2, 1])
-julia> plot_phantom_map(obj, :ρ)
source obj = pelvis_phantom2D(; ss=4, us=1)
Creates a two-dimensional pelvis Phantom struct. Default ss=4 sample spacing is 2 mm. Original file (ss=1) sample spacing is .5 mm.
Keywords
ss
: (::Integer or ::Vector{Integer}
, =4
) subsampling parameter for all axes if scaler, per axis if 2 element vector [ssx, ssy]us
: (::Integer or ::Vector{Integer}
, =1
) upsampling parameter for all axes if scaler, per axis if 2 element vector [usx, usy]Returns
obj
: (::Phantom
) Phantom structExamples
julia> obj = pelvis_phantom2D(; ss=2])
+julia> plot_phantom_map(obj, :ρ)
source obj = pelvis_phantom2D(; ss=4, us=1)
Creates a two-dimensional pelvis Phantom struct. Default ss=4 sample spacing is 2 mm. Original file (ss=1) sample spacing is .5 mm.
Keywords
ss
: (::Integer or ::Vector{Integer}
, =4
) subsampling parameter for all axes if scaler, per axis if 2 element vector [ssx, ssy]us
: (::Integer or ::Vector{Integer}
, =1
) upsampling parameter for all axes if scaler, per axis if 2 element vector [usx, usy]Returns
obj
: (::Phantom
) Phantom structExamples
julia> obj = pelvis_phantom2D(; ss=2])
julia> obj = pelvis_phantom2D(; us=[1, 2])
-julia> pelvis_phantom2D(obj, :ρ)
source obj = heart_phantom(
+julia> pelvis_phantom2D(obj, :ρ)
source obj = heart_phantom(
circumferential_strain, radial_strain, rotation_angle;
heart_rate, asymmetry
-)
Heart-like LV 2D phantom. The variable circumferential_strain
and radial_strain
are for streching (if positive) or contraction (if negative). rotation_angle
is for rotation.
Keywords
circumferential_strain
: (::Real
, =-0.3
) contraction parameter. Between -1 and 1radial_strain
: (::Real
, =-0.3
) contraction parameter. Between -1 and 1rotation_angle
: (::Real
, =15.0
, [º]
) maximum rotation angleheart_rate
: (::Real
, =60
, [bpm]
) heartbeat frequencytemporal_asymmetry
: (::Real
, =0.2
) time fraction of the period in which the systole occurs. Therefore, diastole lasts for period * (1 - temporal_asymmetry)
Returns
obj
: (::Phantom
) Heart-like LV phantom structsource nomotion = NoMotion{T<:Real}()
NoMotion struct. It is used to create static phantoms.
Returns
nomotion
: (::NoMotion
) NoMotion structExamples
julia> nomotion = NoMotion{Float64}()
source motionlist = MotionList(motions...)
MotionList struct. The other option, instead of NoMotion
, is to define a dynamic phantom by means of the MotionList
struct. It is composed by one or more Motion
instances.
Arguments
motions
: (::Vector{Motion{T<:Real}}
) vector of Motion
instancesReturns
motionlist
: (::MotionList
) MotionList structExamples
julia> motionlist = MotionList(
+)
Heart-like LV 2D phantom. The variable circumferential_strain
and radial_strain
are for streching (if positive) or contraction (if negative). rotation_angle
is for rotation.
Keywords
circumferential_strain
: (::Real
, =-0.3
) contraction parameter. Between -1 and 1radial_strain
: (::Real
, =-0.3
) contraction parameter. Between -1 and 1rotation_angle
: (::Real
, =15.0
, [º]
) maximum rotation angleheart_rate
: (::Real
, =60
, [bpm]
) heartbeat frequencytemporal_asymmetry
: (::Real
, =0.2
) time fraction of the period in which the systole occurs. Therefore, diastole lasts for period * (1 - temporal_asymmetry)
Returns
obj
: (::Phantom
) Heart-like LV phantom structsource nomotion = NoMotion{T<:Real}()
NoMotion struct. It is used to create static phantoms.
Returns
nomotion
: (::NoMotion
) NoMotion structExamples
julia> nomotion = NoMotion{Float64}()
source motionlist = MotionList(motions...)
MotionList struct. The other option, instead of NoMotion
, is to define a dynamic phantom by means of the MotionList
struct. It is composed by one or more Motion
instances.
Arguments
motions
: (::Vector{Motion{T<:Real}}
) vector of Motion
instancesReturns
motionlist
: (::MotionList
) MotionList structExamples
julia> motionlist = MotionList(
Motion(
action = Translate(0.01, 0.0, 0.02),
time = TimeRange(0.0, 1.0),
@@ -30,13 +30,13 @@
time = Periodic(1.0),
spins = SpinRange(1:10)
)
- )
source x, y, z = get_spin_coords(motionset, x, y, z, t)
Calculates the position of each spin at a set of arbitrary time instants, i.e. the time steps of the simulation. For each dimension (x, y, z), the output matrix has $N_{ {spins}}$ rows and length(t)
columns.
Arguments
motionset
: (::AbstractMotion{T<:Real}
) phantom motionx
: (::AbstractVector{T<:Real}
, [m]
) spin x-position vectory
: (::AbstractVector{T<:Real}
, [m]
) spin y-position vectorz
: (::AbstractVector{T<:Real}
, [m]
) spin z-position vectort
: horizontal array of time instantsReturns
x, y, z
: (::Tuple{AbstractArray, AbstractArray, AbstractArray}
) spin positions over timesource motion = Motion(action)
+ )
source x, y, z = get_spin_coords(motionset, x, y, z, t)
Calculates the position of each spin at a set of arbitrary time instants, i.e. the time steps of the simulation. For each dimension (x, y, z), the output matrix has $N_{ {spins}}$ rows and length(t)
columns.
Arguments
motionset
: (::AbstractMotion{T<:Real}
) phantom motionx
: (::AbstractVector{T<:Real}
, [m]
) spin x-position vectory
: (::AbstractVector{T<:Real}
, [m]
) spin y-position vectorz
: (::AbstractVector{T<:Real}
, [m]
) spin z-position vectort
: horizontal array of time instantsReturns
x, y, z
: (::Tuple{AbstractArray, AbstractArray, AbstractArray}
) spin positions over timesource motion = Motion(action)
motion = Motion(action, time)
motion = Motion(action, time, spins)
Motion struct. It defines the motion, during a certain time interval, of a given group of spins. It is composed by three fields: action
, which defines the motion itself, time
, which accounts for the time during which the motion takes place, and spins
, which indicates the spins that are affected by that motion.
Arguments
action
: (::AbstractAction{T<:Real}
) action, such as Translate
or Rotate
time
: (::AbstractTimeSpan{T<:Real}
, =TimeRange(0.0)
) time information about the motionspins
: (::AbstractSpinSpan
, =AllSpins()
) spin indexes affected by the motionReturns
motion
: (::Motion
) Motion structExamples
julia> motion = Motion(
action = Translate(0.01, 0.0, 0.02),
time = TimeRange(0.0, 1.0),
spins = SpinRange(1:10)
- )
source translate = Translate(dx, dy, dz)
Translate struct. It produces a linear translation. Its fields are the final displacements in the three axes (dx, dy, dz).
Arguments
dx
: (::Real
, [m]
) translation in xdy
: (::Real
, [m]
) translation in y dz
: (::Real
, [m]
) translation in zReturns
translate
: (::Translate
) Translate structExamples
julia> translate = Translate(dx=0.01, dy=0.02, dz=0.03)
source translate = Translate(dx, dy, dz, time, spins)
Arguments
dx
: (::Real
, [m]
) translation in xdy
: (::Real
, [m]
) translation in y dz
: (::Real
, [m]
) translation in ztime
: (::AbstractTimeSpan{T<:Real}
) time information about the motionspins
: (::AbstractSpinSpan
) spin indexes affected by the motionReturns
translate
: (::Motion
) Motion structExamples
julia> translate = Translate(0.01, 0.02, 0.03, TimeRange(0.0, 1.0), SpinRange(1:10))
source rotate = Rotate(pitch, roll, yaw)
Rotate struct. It produces a rotation in the three axes: x (pitch), y (roll), and z (yaw). We follow the RAS (Right-Anterior-Superior) orientation, and the rotations are applied following the right-hand rule (counter-clockwise):
The applied rotation matrix is obtained as follows:
\[\begin{equation}
+ )
source translate = Translate(dx, dy, dz)
Translate struct. It produces a linear translation. Its fields are the final displacements in the three axes (dx, dy, dz).
Arguments
dx
: (::Real
, [m]
) translation in xdy
: (::Real
, [m]
) translation in y dz
: (::Real
, [m]
) translation in zReturns
translate
: (::Translate
) Translate structExamples
julia> translate = Translate(dx=0.01, dy=0.02, dz=0.03)
source translate = Translate(dx, dy, dz, time, spins)
Arguments
dx
: (::Real
, [m]
) translation in xdy
: (::Real
, [m]
) translation in y dz
: (::Real
, [m]
) translation in ztime
: (::AbstractTimeSpan{T<:Real}
) time information about the motionspins
: (::AbstractSpinSpan
) spin indexes affected by the motionReturns
translate
: (::Motion
) Motion structExamples
julia> translate = Translate(0.01, 0.02, 0.03, TimeRange(0.0, 1.0), SpinRange(1:10))
source rotate = Rotate(pitch, roll, yaw)
Rotate struct. It produces a rotation in the three axes: x (pitch), y (roll), and z (yaw). We follow the RAS (Right-Anterior-Superior) orientation, and the rotations are applied following the right-hand rule (counter-clockwise):
The applied rotation matrix is obtained as follows:
\[\begin{equation}
\begin{aligned}
R &= R_z(\alpha) R_y(\beta) R_x(\gamma) \\
&= \begin{bmatrix}
@@ -60,7 +60,7 @@
-\sin \beta & \cos \beta \sin \gamma & \cos \beta \cos \gamma
\end{bmatrix}
\end{aligned}
-\end{equation}\]
Arguments
pitch
: (::Real
, [º]
) rotation in xroll
: (::Real
, [º]
) rotation in y yaw
: (::Real
, [º]
) rotation in zReturns
rotate
: (::Rotate
) Rotate structExamples
julia> rotate = Rotate(pitch=15.0, roll=0.0, yaw=20.0)
source rotate = Rotate(pitch, roll, yaw, spins)
Arguments
pitch
: (::Real
, [º]
) rotation in xroll
: (::Real
, [º]
) rotation in y yaw
: (::Real
, [º]
) rotation in ztime
: (::AbstractTimeSpan{T<:Real}
) time information about the motionspins
: (::AbstractSpinSpan
) spin indexes affected by the motionReturns
rotate
: (::Motion
) Motion struct with Rotate
actionExamples
julia> rotate = Rotate(15.0, 0.0, 20.0, TimeRange(0.0, 1.0), SpinRange(1:10))
source heartbeat = HeartBeat(circumferential_strain, radial_strain, longitudinal_strain)
HeartBeat struct. It produces a heartbeat-like motion, characterised by three types of strain: circumferential, radial and longitudinal
Arguments
circumferential_strain
: (::Real
) contraction parameterradial_strain
: (::Real
) contraction parameterlongitudinal_strain
: (::Real
) contraction parameterReturns
heartbeat
: (::HeartBeat
) HeartBeat structExamples
julia> heartbeat = HeartBeat(circumferential_strain=-0.3, radial_strain=-0.2, longitudinal_strain=0.0)
source heartbeat = HeartBeat(circumferential_strain, radial_strain, longitudinal_strainl, time, spins)
Arguments
circumferential_strain
: (::Real
) contraction parameterradial_strain
: (::Real
) contraction parameterlongitudinal_strain
: (::Real
) contraction parametertime
: (::AbstractTimeSpan{T<:Real}
) time information about the motionspins
: (::AbstractSpinSpan
) spin indexes affected by the motionReturns
heartbeat
: (::Motion
) Motion struct with HeartBeat
actionExamples
julia> heartbeat = HeartBeat(-0.3, -0.2, 0.0, TimeRange(0.0, 1.0), SpinRange(1:10))
source path = Path(dx, dy, dz)
Path struct. For this action (and for FlowPath
), motion is not defined solely on the basis of three numerical parameters, one for each spatial direction, as occurs for the Translate
, Rotate
and HeartBeat
actions.
For this action, it is necessary to define motion for each spin independently, in x (dx
), y (dy
) and z (dz
). dx
, dy
and dz
are now three matrixes, of ($N_{spins}* \times \; N_{discrete\,times}$ ) each. This means that each row corresponds to a spin trajectory over a set of discrete time instants.
*When creating a motion with Flow
or FlowPath
, you must make sure that the number of rows of the matrices dx
, dy
and dz
matches the number of spins that are affected by the motion.
Remember that the range of spins affected by a motion is defined by the spins
field of the Motion
struct
example:
julia> motion = Motion(
+\end{equation}\]Arguments
pitch
: (::Real
, [º]
) rotation in xroll
: (::Real
, [º]
) rotation in y yaw
: (::Real
, [º]
) rotation in zReturns
rotate
: (::Rotate
) Rotate structExamples
julia> rotate = Rotate(pitch=15.0, roll=0.0, yaw=20.0)
source rotate = Rotate(pitch, roll, yaw, spins)
Arguments
pitch
: (::Real
, [º]
) rotation in xroll
: (::Real
, [º]
) rotation in y yaw
: (::Real
, [º]
) rotation in ztime
: (::AbstractTimeSpan{T<:Real}
) time information about the motionspins
: (::AbstractSpinSpan
) spin indexes affected by the motionReturns
rotate
: (::Motion
) Motion struct with Rotate
actionExamples
julia> rotate = Rotate(15.0, 0.0, 20.0, TimeRange(0.0, 1.0), SpinRange(1:10))
source heartbeat = HeartBeat(circumferential_strain, radial_strain, longitudinal_strain)
HeartBeat struct. It produces a heartbeat-like motion, characterised by three types of strain: circumferential, radial and longitudinal
Arguments
circumferential_strain
: (::Real
) contraction parameterradial_strain
: (::Real
) contraction parameterlongitudinal_strain
: (::Real
) contraction parameterReturns
heartbeat
: (::HeartBeat
) HeartBeat structExamples
julia> heartbeat = HeartBeat(circumferential_strain=-0.3, radial_strain=-0.2, longitudinal_strain=0.0)
source heartbeat = HeartBeat(circumferential_strain, radial_strain, longitudinal_strainl, time, spins)
Arguments
circumferential_strain
: (::Real
) contraction parameterradial_strain
: (::Real
) contraction parameterlongitudinal_strain
: (::Real
) contraction parametertime
: (::AbstractTimeSpan{T<:Real}
) time information about the motionspins
: (::AbstractSpinSpan
) spin indexes affected by the motionReturns
heartbeat
: (::Motion
) Motion struct with HeartBeat
actionExamples
julia> heartbeat = HeartBeat(-0.3, -0.2, 0.0, TimeRange(0.0, 1.0), SpinRange(1:10))
source path = Path(dx, dy, dz)
Path struct. For this action (and for FlowPath
), motion is not defined solely on the basis of three numerical parameters, one for each spatial direction, as occurs for the Translate
, Rotate
and HeartBeat
actions.
For this action, it is necessary to define motion for each spin independently, in x (dx
), y (dy
) and z (dz
). dx
, dy
and dz
are now three matrixes, of ($N_{spins}* \times \; N_{discrete\,times}$ ) each. This means that each row corresponds to a spin trajectory over a set of discrete time instants.
*When creating a motion with Flow
or FlowPath
, you must make sure that the number of rows of the matrices dx
, dy
and dz
matches the number of spins that are affected by the motion.
Remember that the range of spins affected by a motion is defined by the spins
field of the Motion
struct
example:
julia> motion = Motion(
action = Path(
dx=[0.01 0.02; 0.02 0.03], # 2 rows
dy=[0.02 0.03; 0.03 0.04],
@@ -71,103 +71,103 @@
dx=[0.01 0.02; 0.02 0.03],
dy=[0.02 0.03; 0.03 0.04],
dz=[0.03 0.04; 0.04 0.05]
- )
source path = Path(dx, dy, dz, time, spins)
Arguments
dx
: (::AbstractArray{T<:Real}
, [m]
) displacements in xdy
: (::AbstractArray{T<:Real}
, [m]
) displacements in y dz
: (::AbstractArray{T<:Real}
, [m]
) displacements in ztime
: (::AbstractTimeSpan{T<:Real}
) time information about the motionspins
: (::AbstractSpinSpan
) spin indexes affected by the motionReturns
path
: (::Motion
) Motion struct with Path
actionExamples
julia> path = Path(
+ )
source path = Path(dx, dy, dz, time, spins)
Arguments
dx
: (::AbstractArray{T<:Real}
, [m]
) displacements in xdy
: (::AbstractArray{T<:Real}
, [m]
) displacements in y dz
: (::AbstractArray{T<:Real}
, [m]
) displacements in ztime
: (::AbstractTimeSpan{T<:Real}
) time information about the motionspins
: (::AbstractSpinSpan
) spin indexes affected by the motionReturns
path
: (::Motion
) Motion struct with Path
actionExamples
julia> path = Path(
[0.01 0.02; 0.02 0.03],
[0.02 0.03; 0.03 0.04],
[0.03 0.04; 0.04 0.05],
TimeRange(0.0, 1.0),
SpinRange(1:10)
- )
source flowpath = FlowPath(dx, dy, dz, spin_reset)
FlowPath struct. This action is the same as Path
, except that it includes an additional field, called spin_reset
, which accounts for spins leaving the volume and being remapped to another input position. When this happens, the magnetization state of these spins must be reset during the simulation.
As with the dx
, dy
and dz
matrices, spin_reset
has a size of ($N_{spins} \times \; N_{discrete\,times}$ ).
Arguments
dx
: (::AbstractArray{T<:Real}
, [m]
) displacements in xdy
: (::AbstractArray{T<:Real}
, [m]
) displacements in y dz
: (::AbstractArray{T<:Real}
, [m]
) displacements in zspin_reset
: (::AbstractArray{Bool}
) reset spin state flagsReturns
flowpath
: (::FlowPath
) FlowPath structExamples
julia> flowpath = FlowPath(
+ )
source flowpath = FlowPath(dx, dy, dz, spin_reset)
FlowPath struct. This action is the same as Path
, except that it includes an additional field, called spin_reset
, which accounts for spins leaving the volume and being remapped to another input position. When this happens, the magnetization state of these spins must be reset during the simulation.
As with the dx
, dy
and dz
matrices, spin_reset
has a size of ($N_{spins} \times \; N_{discrete\,times}$ ).
Arguments
dx
: (::AbstractArray{T<:Real}
, [m]
) displacements in xdy
: (::AbstractArray{T<:Real}
, [m]
) displacements in y dz
: (::AbstractArray{T<:Real}
, [m]
) displacements in zspin_reset
: (::AbstractArray{Bool}
) reset spin state flagsReturns
flowpath
: (::FlowPath
) FlowPath structExamples
julia> flowpath = FlowPath(
dx=[0.01 0.02; 0.02 0.03],
dy=[0.02 0.03; 0.03 0.04],
dz=[0.03 0.04; 0.04 -0.04],
spin_reset=[false false; false true]
- )
source flowpath = FlowPath(dx, dy, dz, spin_reset, time, spins)
Arguments
dx
: (::AbstractArray{T<:Real}
, [m]
) displacements in xdy
: (::AbstractArray{T<:Real}
, [m]
) displacements in y dz
: (::AbstractArray{T<:Real}
, [m]
) displacements in zspin_reset
: (::AbstractArray{Bool}
) reset spin state flagstime
: (::AbstractTimeSpan{T<:Real}
) time information about the motionspins
: (::AbstractSpinSpan
) spin indexes affected by the motionReturns
flowpath
: (::Motion
) Motion struct with FlowPath
actionExamples
julia> flowpath = FlowPath(
+ )
source flowpath = FlowPath(dx, dy, dz, spin_reset, time, spins)
Arguments
dx
: (::AbstractArray{T<:Real}
, [m]
) displacements in xdy
: (::AbstractArray{T<:Real}
, [m]
) displacements in y dz
: (::AbstractArray{T<:Real}
, [m]
) displacements in zspin_reset
: (::AbstractArray{Bool}
) reset spin state flagstime
: (::AbstractTimeSpan{T<:Real}
) time information about the motionspins
: (::AbstractSpinSpan
) spin indexes affected by the motionReturns
flowpath
: (::Motion
) Motion struct with FlowPath
actionExamples
julia> flowpath = FlowPath(
[0.01 0.02; 0.02 0.03],
[0.02 0.03; 0.03 0.04],
[0.03 0.04; 0.04 0.05],
[false false; false true],
TimeRange(0.0, 1.0),
SpinRange(1:10)
- )
source timerange = TimeRange(t_start, t_end)
TimeRange struct. It is a specialized type that inherits from AbstractTimeSpan and defines a time interval, with start and end times.
Arguments
t_start
: (::Real
, [s]
) start timet_end
: (::Real
, [s]
) end timeReturns
timerange
: (::TimeRange
) TimeRange structExamples
julia> timerange = TimeRange(0.0, 1.0)
source periodic = Periodic(period, asymmetry)
Periodic struct. It is a specialized type that inherits from AbstractTimeSpan, designed to work with time intervals that repeat periodically. It includes a measure of asymmetry in order to recreate a asymmetric period.
Arguments
period
: (::Real
, [s]
) period durationasymmetry
: (::Real
, =0.5
) temporal asymmetry factor. Between 0 and 1.Returns
periodic
: (::Periodic
) Periodic structExamples
julia> periodic = Periodic(1.0, 0.2)
source t_unit = unit_time(t, time_range)
The unit_time
function normalizes a given array of time values t to a unit interval [0, 1] based on a specified start time t_start
and end time t_end
. This function is used for non-periodic motions, where each element of t is transformed to fit within the range [0, 1] based on the provided start and end times.
Arguments
t
: (::AbstractArray{T<:Real}
, [s]
) array of time values to be normalizedtime_range
: (::TimeRange{T<:Real}
, [s]
) time interval (defined by t_start
and t_end
) over which we want to normaliseReturns
t_unit
: (::AbstractArray{T<:Real}
, [s]
) array of normalized time valuesExamples
julia> t_unit = KomaMRIBase.unit_time([0.0, 1.0, 2.0, 3.0, 4.0, 5.0], TimeRange(1.0, 4.0))
+ )
source timerange = TimeRange(t_start, t_end)
TimeRange struct. It is a specialized type that inherits from AbstractTimeSpan and defines a time interval, with start and end times.
Arguments
t_start
: (::Real
, [s]
) start timet_end
: (::Real
, [s]
) end timeReturns
timerange
: (::TimeRange
) TimeRange structExamples
julia> timerange = TimeRange(0.0, 1.0)
source periodic = Periodic(period, asymmetry)
Periodic struct. It is a specialized type that inherits from AbstractTimeSpan, designed to work with time intervals that repeat periodically. It includes a measure of asymmetry in order to recreate a asymmetric period.
Arguments
period
: (::Real
, [s]
) period durationasymmetry
: (::Real
, =0.5
) temporal asymmetry factor. Between 0 and 1.Returns
periodic
: (::Periodic
) Periodic structExamples
julia> periodic = Periodic(1.0, 0.2)
source t_unit = unit_time(t, time_range)
The unit_time
function normalizes a given array of time values t to a unit interval [0, 1] based on a specified start time t_start
and end time t_end
. This function is used for non-periodic motions, where each element of t is transformed to fit within the range [0, 1] based on the provided start and end times.
Arguments
t
: (::AbstractArray{T<:Real}
, [s]
) array of time values to be normalizedtime_range
: (::TimeRange{T<:Real}
, [s]
) time interval (defined by t_start
and t_end
) over which we want to normaliseReturns
t_unit
: (::AbstractArray{T<:Real}
, [s]
) array of normalized time valuesExamples
julia> t_unit = KomaMRIBase.unit_time([0.0, 1.0, 2.0, 3.0, 4.0, 5.0], TimeRange(1.0, 4.0))
6-element Vector{Float64}:
0.0
0.0
0.333
0.666
1.0
- 1.0
source t_unit = unit_time(t, periodic)
The unit_time
function normalizes a given array of time values t to a unit interval [0, 1] for periodic motions, based on a specified period and an asymmetry factor. This function is useful for creating triangular waveforms or normalizing time values in periodic processes.
Arguments
t
: (::AbstractArray{T<:Real}
, [s]
) array of time values to be normalizedperiodic
: (::Periodic{T<:Real}
, [s]
) information about the period
and the temporal asymmetry
Returns
t_unit
: (::AbstractArray{T<:Real}
, [s]
) array of normalized time valuesExamples
julia> t_unit = KomaMRIBase.unit_time([0.0, 1.0, 2.0, 3.0, 4.0, 5.0], Periodic(4.0, 0.5))
+ 1.0
source t_unit = unit_time(t, periodic)
The unit_time
function normalizes a given array of time values t to a unit interval [0, 1] for periodic motions, based on a specified period and an asymmetry factor. This function is useful for creating triangular waveforms or normalizing time values in periodic processes.
Arguments
t
: (::AbstractArray{T<:Real}
, [s]
) array of time values to be normalizedperiodic
: (::Periodic{T<:Real}
, [s]
) information about the period
and the temporal asymmetry
Returns
t_unit
: (::AbstractArray{T<:Real}
, [s]
) array of normalized time valuesExamples
julia> t_unit = KomaMRIBase.unit_time([0.0, 1.0, 2.0, 3.0, 4.0, 5.0], Periodic(4.0, 0.5))
6-element Vector{Float64}:
0.0
0.5
1.0
0.5
0.0
- 0.5
source allspins = AllSpins()
AllSpins struct. It is a specialized type that inherits from AbstractSpinSpan and is used to cover all the spins of a phantom.
Returns
allspins
: (::AllSpins
) AllSpins structExamples
julia> allspins = AllSpins()
source spinrange = SpinRange(range)
SpinRange struct. It is a specialized type that inherits from AbstractSpinSpan and is used to select a certain range and number of spins.
Arguments
range
: (::AbstractVector
) spin id's. This argument can be a Range, a Vector or a BitVectorReturns
spinrange
: (::SpinRange
) SpinRange structExamples
julia> spinrange = SpinRange(1:10)
+ 0.5
source allspins = AllSpins()
AllSpins struct. It is a specialized type that inherits from AbstractSpinSpan and is used to cover all the spins of a phantom.
Returns
allspins
: (::AllSpins
) AllSpins structExamples
julia> allspins = AllSpins()
source spinrange = SpinRange(range)
SpinRange struct. It is a specialized type that inherits from AbstractSpinSpan and is used to select a certain range and number of spins.
Arguments
range
: (::AbstractVector
) spin id's. This argument can be a Range, a Vector or a BitVectorReturns
spinrange
: (::SpinRange
) SpinRange structExamples
julia> spinrange = SpinRange(1:10)
julia> spinrange = SpinRange([1, 3, 5, 7])
-julia> spinrange = SpinRange(obj.x .> 0)
source seq = Sequence()
+julia> spinrange = SpinRange(obj.x .> 0)
source seq = Sequence()
seq = Sequence(GR)
seq = Sequence(GR, RF)
seq = Sequence(GR, RF, ADC)
seq = Sequence(GR, RF, ADC, DUR)
seq = Sequence(GR::Array{Grad,1})
seq = Sequence(GR::Array{Grad,1}, RF::Array{RF,1})
-seq = Sequence(GR::Array{Grad,1}, RF::Array{RF,1}, A::ADC, DUR, DEF)
The Sequence struct. It contains events of an MRI sequence. Most field names (except for the DEF field) consist of matrices or vectors, where each column index represents a sequence block. This struct serves as an input for the simulation.
Arguments
GR
: (::Matrix{Grad}
) gradient matrix. Rows for x-y-z amplitudes and columns are for blocksRF
: (::Matrix{RF}
) RF matrix. The 1 row is for the coil and columns are for blocksADC
: (::Array{ADC,1}
) ADC block vectorDUR
: (::Vector
, [s]
) duration block vectorDEF
: (::Dict{String, Any}
) dictionary with relevant information of the sequence. Possible keys could be ["AdcRasterTime"
, "GradientRasterTime"
, "Name"
, "Nz"
, "Num_Blocks"
, "Nx"
, "Ny"
, "PulseqVersion"
, "BlockDurationRaster"
, "FileName"
, "RadiofrequencyRasterTime"
]Returns
seq
: (::Sequence
) Sequence structsource y = dur(x::Grad)
+seq = Sequence(GR::Array{Grad,1}, RF::Array{RF,1}, A::ADC, DUR, DEF)
The Sequence struct. It contains events of an MRI sequence. Most field names (except for the DEF field) consist of matrices or vectors, where each column index represents a sequence block. This struct serves as an input for the simulation.
Arguments
GR
: (::Matrix{Grad}
) gradient matrix. Rows for x-y-z amplitudes and columns are for blocksRF
: (::Matrix{RF}
) RF matrix. The 1 row is for the coil and columns are for blocksADC
: (::Array{ADC,1}
) ADC block vectorDUR
: (::Vector
, [s]
) duration block vectorDEF
: (::Dict{String, Any}
) dictionary with relevant information of the sequence. Possible keys could be ["AdcRasterTime"
, "GradientRasterTime"
, "Name"
, "Nz"
, "Num_Blocks"
, "Nx"
, "Ny"
, "PulseqVersion"
, "BlockDurationRaster"
, "FileName"
, "RadiofrequencyRasterTime"
]Returns
seq
: (::Sequence
) Sequence structsource y = dur(x::Grad)
y = dur(x::Vector{Grad})
-y = dur(x::Matrix{Grad})
Duration time in [s] of Grad struct or Grad Array.
Arguments
x
: (::Grad
or ::Vector{Grad}
or ::Matrix{Grad}
) Grad struct or Grad ArrayReturns
y
: (::Float64
, [s]
) duration of the Grad struct or Grad Arraysource y = dur(x::RF)
+y = dur(x::Matrix{Grad})
Duration time in [s] of Grad struct or Grad Array.
Arguments
x
: (::Grad
or ::Vector{Grad}
or ::Matrix{Grad}
) Grad struct or Grad ArrayReturns
y
: (::Float64
, [s]
) duration of the Grad struct or Grad Arraysource y = dur(x::RF)
y = dur(x::Vector{RF})
-y = dur(x::Matrix{RF})
Duration time in [s] of RF struct or RF Array.
Arguments
x
: (::RF
or ::Vector{RF}
or ::Matrix{RF}
) RF struct or RF arrayReturns
y
: (::Float64
, [s
]) duration of the RF struct or RF arraysource T = dur(x::Sequence)
The total duration of the sequence in [s].
Arguments
x
: (::Sequence
) Sequence structReturns
T
: (::Real
, [s]
) total duration of the sequencesource T0 = get_block_start_times(seq::Sequence)
Returns a vector containing the start times of blocks in a sequence. The initial time is always zero, and the final time corresponds to the duration of the sequence.
Arguments
seq
: (::Sequence
) Sequence structReturns
T0
: (::Vector
, [s]
) start times of the blocks in a sequencesource y = get_flip_angles(x::Sequence)
Returns all the flip angles of the RF pulses in the sequence x
.
Arguments
x
: (::Sequence
) Sequence structReturns
y
: (::Vector{Float64}
, [deg]
) flip anglessource gr = Grad(A, T)
+y = dur(x::Matrix{RF})
Duration time in [s] of RF struct or RF Array.
Arguments
x
: (::RF
or ::Vector{RF}
or ::Matrix{RF}
) RF struct or RF arrayReturns
y
: (::Float64
, [s
]) duration of the RF struct or RF arraysource T = dur(x::Sequence)
The total duration of the sequence in [s].
Arguments
x
: (::Sequence
) Sequence structReturns
T
: (::Real
, [s]
) total duration of the sequencesource T0 = get_block_start_times(seq::Sequence)
Returns a vector containing the start times of blocks in a sequence. The initial time is always zero, and the final time corresponds to the duration of the sequence.
Arguments
seq
: (::Sequence
) Sequence structReturns
T0
: (::Vector
, [s]
) start times of the blocks in a sequencesource y = get_flip_angles(x::Sequence)
Returns all the flip angles of the RF pulses in the sequence x
.
Arguments
x
: (::Sequence
) Sequence structReturns
y
: (::Vector{Float64}
, [deg]
) flip anglessource gr = Grad(A, T)
gr = Grad(A, T, rise)
gr = Grad(A, T, rise, delay)
gr = Grad(A, T, rise, fall, delay)
gr = Grad(A, T, rise, fall, delay, first, last)
The Grad struct represents a gradient of a sequence event.
Arguments
A
: (::Real
or ::Vector
, [T/m]
) amplitude of the gradientT
: (::Real
or ::Vector
, [s]
) duration of the flat-toprise
: (::Real
, [s]
) duration of the risefall
: (::Real
, [s]
) duration of the falldelay
: (::Real
, [s]
) duration of the delayReturns
gr
: (::Grad
) gradient structExamples
julia> gr = Grad(1, 1, 0.1, 0.1, 0.2)
-julia> seq = Sequence([gr]); plot_seq(seq)
source gr = Grad(f::Function, T::Real, N::Integer; delay::Real)
Generates an arbitrary gradient waveform defined by the function f
in the interval t ∈ [0,T
]. The time separation between two consecutive samples is given by T/(N-1).
Arguments
f
: (::Function
) function that describes the gradient waveformT
: (::Real
, [s]
) duration of the gradient waveformN
: (::Integer
, =300
) number of samples of the gradient waveformKeywords
delay
: (::Real
, =0
, [s]
) delay time of the waveformReturns
gr
: (::Grad
) gradient structExamples
julia> gx = Grad(t -> sin(π*t / 0.8), 0.8)
+julia> seq = Sequence([gr]); plot_seq(seq)
source gr = Grad(f::Function, T::Real, N::Integer; delay::Real)
Generates an arbitrary gradient waveform defined by the function f
in the interval t ∈ [0,T
]. The time separation between two consecutive samples is given by T/(N-1).
Arguments
f
: (::Function
) function that describes the gradient waveformT
: (::Real
, [s]
) duration of the gradient waveformN
: (::Integer
, =300
) number of samples of the gradient waveformKeywords
delay
: (::Real
, =0
, [s]
) delay time of the waveformReturns
gr
: (::Grad
) gradient structExamples
julia> gx = Grad(t -> sin(π*t / 0.8), 0.8)
-julia> seq = Sequence([gx]); plot_seq(seq)
source rf = RF(A, T)
+julia> seq = Sequence([gx]); plot_seq(seq)
source rf = RF(A, T)
rf = RF(A, T, Δf)
rf = RF(A, T, Δf, delay)
The RF struct represents a Radio Frequency excitation of a sequence event.
Arguments
A
: (::Complex
, [T]
) RF complex amplitud modulation (AM), $B_1(t) = |B_1(t)| e^{i\phi(t)} = B_{1}(t) + iB_{1,y}(t)$ T
: (::Real
, [s
]) RF durationΔf
: (::Real
or ::Vector
, [Hz
]) RF frequency difference with respect to the Larmor frequency. This can be a number but also a vector to represent frequency modulated signals (FM).delay
: (::Real
, [s
]) RF delay timeReturns
Examples
julia> rf = RF(1, 1, 0, 0.2)
-julia> seq = Sequence(); seq += rf; plot_seq(seq)
source rf = RF_fun(f::Function, T::Real, N::Int64)
Generate an RF sequence with amplitudes sampled from a function waveform.
This function is not being used in this KomaMRI version.
Arguments
f
: (::Function
, [T
]) function for the RF amplitud waveformT
: (::Real
, [s
]) duration of the RF pulseN
: (::Int64
) number of samples of the RF pulseReturns
rf
:(::RF
) RF struct with amplitud defined by the function f
source α = get_flip_angle(x::RF)
Calculates the flip angle α [deg] of an RF struct. α = γ ∫ B1(τ) dτ
Arguments
Returns
α
: (::Int64
, [deg]
) flip angle RF struct x
source adc = ADC(N, T)
+julia> seq = Sequence(); seq += rf; plot_seq(seq)
source rf = RF_fun(f::Function, T::Real, N::Int64)
Generate an RF sequence with amplitudes sampled from a function waveform.
This function is not being used in this KomaMRI version.
Arguments
f
: (::Function
, [T
]) function for the RF amplitud waveformT
: (::Real
, [s
]) duration of the RF pulseN
: (::Int64
) number of samples of the RF pulseReturns
rf
:(::RF
) RF struct with amplitud defined by the function f
source α = get_flip_angle(x::RF)
Calculates the flip angle α [deg] of an RF struct. α = γ ∫ B1(τ) dτ
Arguments
Returns
α
: (::Int64
, [deg]
) flip angle RF struct x
source adc = ADC(N, T)
adc = ADC(N, T, delay)
adc = ADC(N, T, delay, Δf, ϕ)
The ADC struct represents the Analog to Digital Converter (ADC) of a sequence event.
Arguments
N
: (::Int64
) number of acquired samplesT
: (::Float64
, [s
]) duration to acquire the samplesdelay
: (::Float64
, [s
]) delay time to start the acquisitionΔf
: (::Float64
, [Hz
]) delta frequency. It is meant to compensate RF pulse phasesϕ
: (::Float64
, [rad]
) phase. It is meant to compensate RF pulse phasesReturns
Examples
julia> adc = ADC(16, 1, 0.1)
-julia> seq = Sequence(); seq += adc; plot_seq(seq)
source times = get_adc_sampling_times(seq)
Returns an array of times when the samples of the sequence seq
are acquired.
Arguments
seq
: (::Sequence
) sequence structReturns
times
: (::Vector{Float64}
, [s]
) time array when samples are acquiredsource comp = get_adc_phase_compensation(seq)
Returns an array of phase compensation factors, $\exp(-\mathrm{i}\varphi)$ , which are used to compensate the acquired signal $S$ by applying the operation $S_{\mathrm{comp}} = S \exp(-\mathrm{i}\varphi)$ after the simulation. This compensation is necessary because the signal typically exhibits a phase offset of $\varphi$ following RF excitation with a phase of $\varphi$ . Such pulses are commonly employed in sequences involving RF spoiling.
Arguments
seq
: (::Sequence
) sequence structReturns
comp
: (::Vector{Complex}
, [rad]
) array of phase compensations for every acquired samplesource delay = Delay(T)
The Delay struct is meant to add a delay to a sequence by using a sum operator.
Arguments
T
: (::Real
, [s]
) time delay valueReturns
delay
: (::Delay
) delay structExamples
julia> delay = Delay(0.5)
+julia> seq = Sequence(); seq += adc; plot_seq(seq)
source times = get_adc_sampling_times(seq)
Returns an array of times when the samples of the sequence seq
are acquired.
Arguments
seq
: (::Sequence
) sequence structReturns
times
: (::Vector{Float64}
, [s]
) time array when samples are acquiredsource comp = get_adc_phase_compensation(seq)
Returns an array of phase compensation factors, $\exp(-\mathrm{i}\varphi)$ , which are used to compensate the acquired signal $S$ by applying the operation $S_{\mathrm{comp}} = S \exp(-\mathrm{i}\varphi)$ after the simulation. This compensation is necessary because the signal typically exhibits a phase offset of $\varphi$ following RF excitation with a phase of $\varphi$ . Such pulses are commonly employed in sequences involving RF spoiling.
Arguments
seq
: (::Sequence
) sequence structReturns
comp
: (::Vector{Complex}
, [rad]
) array of phase compensations for every acquired samplesource delay = Delay(T)
The Delay struct is meant to add a delay to a sequence by using a sum operator.
Arguments
T
: (::Real
, [s]
) time delay valueReturns
delay
: (::Delay
) delay structExamples
julia> delay = Delay(0.5)
julia> s = Sequence([Grad(1, 1, 0.1)])
-julia> seq = delay + s; plot_seq(seq)
source Rx = rotx(θ::Real)
Rotates vector counter-clockwise with respect to the x-axis.
Arguments
θ
: (::Real
, [rad]
) rotation angleReturns
Rx
: (::Matrix{Int64}
) rotation matrixsource Ry = roty(θ::Real)
Rotates vector counter-clockwise with respect to the y-axis.
Arguments
θ
: (::Real
, [rad]
) rotation angleReturns
Ry
: (::Matrix{Int64}
) rotation matrixsource Rz = rotz(θ::Real)
Rotates vector counter-clockwise with respect to the z-axis.
Arguments
θ
: (::Real
, [rad]
) rotation angleReturns
Rz
: (::Matrix{Int64}
) rotation matrixsource Mk, Mk_adc = get_Mk(seq::Sequence, k; Δt=1, skip_rf=zeros(Bool, sum(is_RF_on.(seq))))
Computes the $k$ th-order moment of the Sequence seq
given by the formula $\int_0^T t^k G(t) dt$ .
Arguments
seq
: (::Sequence
) Sequence structk
: (::Integer
) order of the moment to be computedΔt
: (::Real
, =1
, [s]
) nominal delta time separation between two time samples for ADC acquisition and Gradientsskip_rf
: (::Vector{Bool}
, =zeros(Bool, sum(is_RF_on.(seq)))
) boolean vector which indicates whether to skip the computation for resetting the integral for excitation or refocusing RF typeReturns
Mk
: (3-column ::Matrix{Real}
) $k$ th-order momentMk_adc
: (3-column ::Matrix{Real}
) $k$ th-order moment sampled at ADC timessource Computes the 1st-order moment of the Sequence seq
. Refer to get_Mk
source Computes the 2nd-order moment of the Sequence seq
. Refer to get_Mk
source y = is_RF_on(x::Sequence)
-y = is_RF_on(x::Sequence, t::Vector{Float64})
Tells if the sequence seq
has elements with RF active, or active during time t
.
Arguments
x
: (::Sequence
) Sequence structt
: (::Vector{Float64}
, [s]
) time to checkReturns
y
: (::Bool
) boolean that tells whether or not the RF in the sequence is activesource y = is_GR_on(x::Sequence)
Tells if the sequence seq
has elements with GR active.
Arguments
x
: (::Sequence
) Sequence structReturns
y
: (::Bool
) boolean that tells whether or not the GR in the sequence is activesource y = is_Gx_on(x::Sequence)
Tells if the sequence seq
has elements with GR active in x direction.
Arguments
x
: (::Sequence
) Sequence structReturns
y
: (::Bool
) boolean that tells whether or not the GRx in the sequence is activesource y = is_Gy_on(x::Sequence)
Tells if the sequence seq
has elements with GR active in y direction.
Arguments
x
: (::Sequence
) Sequence structReturns
y
: (::Bool
) boolean that tells whether or not the GRy in the sequence is activesource y = is_Gz_on(x::Sequence)
Tells if the sequence seq
has elements with GR active in z direction.
Arguments
x
: (::Sequence
) Sequence structReturns
y
: (::Bool
) boolean that tells whether or not the GRz in the sequence is activesource y = is_ADC_on(x::Sequence)
-y = is_ADC_on(x::Sequence, t::Union{Array{Float64,1}, Array{Float64,2}})
Tells if the sequence seq
has elements with ADC active, or active during time t
.
Arguments
x
: (::Sequence
) sequence structt
: (::Union{Array{Float64,1}, Array{Float64,2}}
, [s]
) time to checkReturns
y
: (::Bool
) boolean that tells whether or not the ADC in the sequence is activesource seqd = DiscreteSequence(Gx, Gy, Gz, B1, Δf, ADC, t, Δt)
A sampled version of a Sequence struct, containing vectors for event amplitudes at specified times. DiscreteSequence is the struct used for simulation.
Arguments
Gx
: (::AbstractVector{T<:Real}
, [T/m]
) x-gradient vectorGy
: (::AbstractVector{T<:Real}
, [T/m]
) y-gradient vectorGz
: (::AbstractVector{T<:Real}
, [T/m]
) z-gradient vectorB1
: (::AbstractVector{Complex{T<:Real}}
, [T]
) RF amplitude vectorΔf
: (::AbstractVector{T<:Real}
, [Hz]
) RF carrier frequency displacement vectorADC
: (::AbstractVector{Bool}
) ADC sample vectort
: (::AbstractVector{T<:Real}
, [s]
) time vectorΔt
: (::AbstractVector{T<:Real}
, [s]
) delta time vectorReturns
seqd
: (::DiscreteSequence
) DiscreteSequence structsource seqd = discretize(seq::Sequence; sampling_params=default_sampling_params())
This function returns a sampled Sequence struct with RF and gradient time refinements based on simulation parameters.
Arguments
seq
: (::Sequence
) sequenceKeywords
sampling_params
: (::Dict{String, Any}
, =default_sampling_params()
) sampling parameter dictionaryReturns
seqd
: (::DiscreteSequence
) DiscreteSequence structsource samples = get_samples(seq::Sequence; off_val=0, max_rf_samples=Inf)
Returns the samples of the events in seq
.
Arguments
seq
: (::Sequence
) Sequence structKeywords
off_val
: (::Number
, =0
) offset value for amplitude. Typically used to hide points in plots by setting it to Inf
max_rf_samples
: (::Integer
, =Inf
) maximum number of samples for the RF structReturns
samples
: (::NamedTuple
) contains samples for gx
, gy
, gz
, rf
, and adc
events. Each event, represented by e::NamedTuple
, includes time samples (e.t
) and amplitude samples (e.A
)source t = times(gr::Grad)
+julia> seq = delay + s; plot_seq(seq)
source Rx = rotx(θ::Real)
Rotates vector counter-clockwise with respect to the x-axis.
Arguments
θ
: (::Real
, [rad]
) rotation angleReturns
Rx
: (::Matrix{Int64}
) rotation matrixsource Ry = roty(θ::Real)
Rotates vector counter-clockwise with respect to the y-axis.
Arguments
θ
: (::Real
, [rad]
) rotation angleReturns
Ry
: (::Matrix{Int64}
) rotation matrixsource Rz = rotz(θ::Real)
Rotates vector counter-clockwise with respect to the z-axis.
Arguments
θ
: (::Real
, [rad]
) rotation angleReturns
Rz
: (::Matrix{Int64}
) rotation matrixsource Mk, Mk_adc = get_Mk(seq::Sequence, k; Δt=1, skip_rf=zeros(Bool, sum(is_RF_on.(seq))))
Computes the $k$ th-order moment of the Sequence seq
given by the formula $\int_0^T t^k G(t) dt$ .
Arguments
seq
: (::Sequence
) Sequence structk
: (::Integer
) order of the moment to be computedΔt
: (::Real
, =1
, [s]
) nominal delta time separation between two time samples for ADC acquisition and Gradientsskip_rf
: (::Vector{Bool}
, =zeros(Bool, sum(is_RF_on.(seq)))
) boolean vector which indicates whether to skip the computation for resetting the integral for excitation or refocusing RF typeReturns
Mk
: (3-column ::Matrix{Real}
) $k$ th-order momentMk_adc
: (3-column ::Matrix{Real}
) $k$ th-order moment sampled at ADC timessource Computes the 1st-order moment of the Sequence seq
. Refer to get_Mk
source Computes the 2nd-order moment of the Sequence seq
. Refer to get_Mk
source y = is_RF_on(x::Sequence)
+y = is_RF_on(x::Sequence, t::Vector{Float64})
Tells if the sequence seq
has elements with RF active, or active during time t
.
Arguments
x
: (::Sequence
) Sequence structt
: (::Vector{Float64}
, [s]
) time to checkReturns
y
: (::Bool
) boolean that tells whether or not the RF in the sequence is activesource y = is_GR_on(x::Sequence)
Tells if the sequence seq
has elements with GR active.
Arguments
x
: (::Sequence
) Sequence structReturns
y
: (::Bool
) boolean that tells whether or not the GR in the sequence is activesource y = is_Gx_on(x::Sequence)
Tells if the sequence seq
has elements with GR active in x direction.
Arguments
x
: (::Sequence
) Sequence structReturns
y
: (::Bool
) boolean that tells whether or not the GRx in the sequence is activesource y = is_Gy_on(x::Sequence)
Tells if the sequence seq
has elements with GR active in y direction.
Arguments
x
: (::Sequence
) Sequence structReturns
y
: (::Bool
) boolean that tells whether or not the GRy in the sequence is activesource y = is_Gz_on(x::Sequence)
Tells if the sequence seq
has elements with GR active in z direction.
Arguments
x
: (::Sequence
) Sequence structReturns
y
: (::Bool
) boolean that tells whether or not the GRz in the sequence is activesource y = is_ADC_on(x::Sequence)
+y = is_ADC_on(x::Sequence, t::Union{Array{Float64,1}, Array{Float64,2}})
Tells if the sequence seq
has elements with ADC active, or active during time t
.
Arguments
x
: (::Sequence
) sequence structt
: (::Union{Array{Float64,1}, Array{Float64,2}}
, [s]
) time to checkReturns
y
: (::Bool
) boolean that tells whether or not the ADC in the sequence is activesource seqd = DiscreteSequence(Gx, Gy, Gz, B1, Δf, ADC, t, Δt)
A sampled version of a Sequence struct, containing vectors for event amplitudes at specified times. DiscreteSequence is the struct used for simulation.
Arguments
Gx
: (::AbstractVector{T<:Real}
, [T/m]
) x-gradient vectorGy
: (::AbstractVector{T<:Real}
, [T/m]
) y-gradient vectorGz
: (::AbstractVector{T<:Real}
, [T/m]
) z-gradient vectorB1
: (::AbstractVector{Complex{T<:Real}}
, [T]
) RF amplitude vectorΔf
: (::AbstractVector{T<:Real}
, [Hz]
) RF carrier frequency displacement vectorADC
: (::AbstractVector{Bool}
) ADC sample vectort
: (::AbstractVector{T<:Real}
, [s]
) time vectorΔt
: (::AbstractVector{T<:Real}
, [s]
) delta time vectorReturns
seqd
: (::DiscreteSequence
) DiscreteSequence structsource seqd = discretize(seq::Sequence; sampling_params=default_sampling_params())
This function returns a sampled Sequence struct with RF and gradient time refinements based on simulation parameters.
Arguments
seq
: (::Sequence
) sequenceKeywords
sampling_params
: (::Dict{String, Any}
, =default_sampling_params()
) sampling parameter dictionaryReturns
seqd
: (::DiscreteSequence
) DiscreteSequence structsource samples = get_samples(seq::Sequence; off_val=0, max_rf_samples=Inf)
Returns the samples of the events in seq
.
Arguments
seq
: (::Sequence
) Sequence structKeywords
off_val
: (::Number
, =0
) offset value for amplitude. Typically used to hide points in plots by setting it to Inf
max_rf_samples
: (::Integer
, =Inf
) maximum number of samples for the RF structReturns
samples
: (::NamedTuple
) contains samples for gx
, gy
, gz
, rf
, and adc
events. Each event, represented by e::NamedTuple
, includes time samples (e.t
) and amplitude samples (e.A
)source t = times(gr::Grad)
t = times(rf::RF)
-t = times(adc::ADC)
Get time samples of MRI sequence event.
Arguments
gr
: (::Grad
) Gradient structrf
: (::RF
) RF structadc
: (::ADC
) ADC structReturns
t
: (::Vector{Number}
) vector with time samplessource A = ampls(g::Grad)
+t = times(adc::ADC)
Get time samples of MRI sequence event.
Arguments
gr
: (::Grad
) Gradient structrf
: (::RF
) RF structadc
: (::ADC
) ADC structReturns
t
: (::Vector{Number}
) vector with time samplessource A = ampls(g::Grad)
A = ampls(r::RF)
-A = ampls(d::ADC)
Get amplitude samples of MRI sequence event.
Arguments
gr
: (::Grad
) Gradient structrf
: (::RF
) RF structadc
: (::ADC
) ADC structReturns
A
: (::Vector{Number}
) vector with amplitude samplessource f = freqs(r::RF)
Get frequency samples of MRI sequence event.
Arguments
Returns
f
: (::Vector{Number}
) vector with frequency samplessource y = trapz(Δt, x)
Trapezoidal integration for every spin of a phantom.
In practice, this function is used to integrate (Gx * x + Gy * y + Gz * z) * Δt for all the spins. NΔt
is the length of Δt
. Ns
stands for the number of spins of a phantom. x
is a matrix which rows represents different spins and columns are different times and the elements are the field Gx * x + Gy * y + Gz * z values.
Arguments
Δt
: (1 x NΔt ::Matrix{Float64}
, [s]
) delta time 1-row arrayx
: (Ns x (NΔt+1) ::Matrix{Float64}
, [T]
) magnitude of the field Gx * x + Gy * y + Gz * zReturns
y
: (Ns x 1 ::Matrix{Float64}
, [T*s]
) vector where every element is the integral of (Gx * x + Gy * y + Gz * z) * Δt for every spin of a phantomsource y = cumtrapz(Δt, x)
Trapezoidal cumulative integration over time for every spin of a phantom.
Arguments
Δt
: (1 x NΔt ::Matrix{Float64}
, [s]
) delta time 1-row arrayx
: (Ns x (NΔt+1) ::Matrix{Float64}
, [T]
) magnitude of the field Gx * x + Gy * y + Gz * zReturns
y
: (Ns x NΔt ::Matrix{Float64}
, [T*s]
) matrix where every column is the cumulative integration over time of (Gx * x + Gy * y + Gz * z) * Δt for every spin of a phantomsource array_of_ranges = kfoldperm(N, k; breaks=[])
Divides a list of indices from 1 to N
into k
groups.
Arguments
N
: (::Integer
) number of elements to be orderedk
: (::Integer
) number of groups to divide the N
elements.Keywords
breaks
: (::Vector{<:Integer}
, =[]
) array of indices where predefined breakpoints are placed.Returns
array_of_ranges
: (::Vector{UnitRange{<:Integer}}
) array containing ranges of different groups. The target is k
groups, but this could increase by adding elements to the breaks
input arraysource PulseDesigner
A module to define different pulse sequences.
source seq = RF_hard(B1, T, sys; G=[0, 0, 0], Δf=0)
Returns a sequence with a RF excitation pulse.
Arguments
B1
: (::Number
, [T]
) RF pulse amplitudeT
: (::Real
, [s]
) RF pulse durationsys
: (::Scanner
) Scanner structKeywords
G
: (::Vector{Real}
, =[0, 0, 0]
, [T/m]
) gradient amplitudes for x, y, zΔf
: (::Real
, =0
, [Hz]
) RF pulse carrier frequency displacementReturns
seq
: (::Sequence
) Sequence struct with a RF pulseExamples
julia> sys = Scanner(); durRF = π / 2 / (2π * γ * sys.B1);
+A = ampls(d::ADC)
Get amplitude samples of MRI sequence event.
Arguments
gr
: (::Grad
) Gradient structrf
: (::RF
) RF structadc
: (::ADC
) ADC structReturns
A
: (::Vector{Number}
) vector with amplitude samplessource f = freqs(r::RF)
Get frequency samples of MRI sequence event.
Arguments
Returns
f
: (::Vector{Number}
) vector with frequency samplessource y = trapz(Δt, x)
Trapezoidal integration for every spin of a phantom.
In practice, this function is used to integrate (Gx * x + Gy * y + Gz * z) * Δt for all the spins. NΔt
is the length of Δt
. Ns
stands for the number of spins of a phantom. x
is a matrix which rows represents different spins and columns are different times and the elements are the field Gx * x + Gy * y + Gz * z values.
Arguments
Δt
: (1 x NΔt ::Matrix{Float64}
, [s]
) delta time 1-row arrayx
: (Ns x (NΔt+1) ::Matrix{Float64}
, [T]
) magnitude of the field Gx * x + Gy * y + Gz * zReturns
y
: (Ns x 1 ::Matrix{Float64}
, [T*s]
) vector where every element is the integral of (Gx * x + Gy * y + Gz * z) * Δt for every spin of a phantomsource y = cumtrapz(Δt, x)
Trapezoidal cumulative integration over time for every spin of a phantom.
Arguments
Δt
: (1 x NΔt ::Matrix{Float64}
, [s]
) delta time 1-row arrayx
: (Ns x (NΔt+1) ::Matrix{Float64}
, [T]
) magnitude of the field Gx * x + Gy * y + Gz * zReturns
y
: (Ns x NΔt ::Matrix{Float64}
, [T*s]
) matrix where every column is the cumulative integration over time of (Gx * x + Gy * y + Gz * z) * Δt for every spin of a phantomsource array_of_ranges = kfoldperm(N, k; breaks=[])
Divides a list of indices from 1 to N
into k
groups.
Arguments
N
: (::Integer
) number of elements to be orderedk
: (::Integer
) number of groups to divide the N
elements.Keywords
breaks
: (::Vector{<:Integer}
, =[]
) array of indices where predefined breakpoints are placed.Returns
array_of_ranges
: (::Vector{UnitRange{<:Integer}}
) array containing ranges of different groups. The target is k
groups, but this could increase by adding elements to the breaks
input arraysource PulseDesigner
A module to define different pulse sequences.
source seq = RF_hard(B1, T, sys; G=[0, 0, 0], Δf=0)
Returns a sequence with a RF excitation pulse.
Arguments
B1
: (::Number
, [T]
) RF pulse amplitudeT
: (::Real
, [s]
) RF pulse durationsys
: (::Scanner
) Scanner structKeywords
G
: (::Vector{Real}
, =[0, 0, 0]
, [T/m]
) gradient amplitudes for x, y, zΔf
: (::Real
, =0
, [Hz]
) RF pulse carrier frequency displacementReturns
seq
: (::Sequence
) Sequence struct with a RF pulseExamples
julia> sys = Scanner(); durRF = π / 2 / (2π * γ * sys.B1);
julia> seq = PulseDesigner.RF_hard(sys.B1, durRF, sys);
-julia> plot_seq(seq)
source seq = RF_sinc(B1, T, sys; G=[0, 0, 0], Δf=0, a=0.46, TBP=4)
Returns a sequence with a RF sinc waveform.
References
Matt A. Bernstein, Kevin F. King, Xiaohong Joe Zhou, Chapter 2 - Radiofrequency Pulse Shapes, Handbook of MRI Pulse Sequences, 2004, Pages 35-66, https://doi.org/10.1016/B978-012092861-3/50006-6.
Arguments
B1
: (::Number
, [T]
) RF sinc amplitudeT
: (::Real
, [s]
) RF sinc durationsys
: (::Scanner
) Scanner structKeywords
G
: (::Vector{Real}
, =[0, 0, 0]
, [T/m]
) gradient amplitudes for x, y, zΔf
: (::Real
, =0
, [Hz]
) RF pulse carrier frequency displacementa
: (::Real
, =0.46
) height appodization window parameterTBP
: (::Real
, =4
) width appodization window parameterReturns
seq
: (::Sequence
) Sequence struct with a RF pulseExamples
julia> sys = Scanner(); durRF = π / 2 / (2π * γ * sys.B1);
+julia> plot_seq(seq)
source seq = RF_sinc(B1, T, sys; G=[0, 0, 0], Δf=0, a=0.46, TBP=4)
Returns a sequence with a RF sinc waveform.
References
Matt A. Bernstein, Kevin F. King, Xiaohong Joe Zhou, Chapter 2 - Radiofrequency Pulse Shapes, Handbook of MRI Pulse Sequences, 2004, Pages 35-66, https://doi.org/10.1016/B978-012092861-3/50006-6.
Arguments
B1
: (::Number
, [T]
) RF sinc amplitudeT
: (::Real
, [s]
) RF sinc durationsys
: (::Scanner
) Scanner structKeywords
G
: (::Vector{Real}
, =[0, 0, 0]
, [T/m]
) gradient amplitudes for x, y, zΔf
: (::Real
, =0
, [Hz]
) RF pulse carrier frequency displacementa
: (::Real
, =0.46
) height appodization window parameterTBP
: (::Real
, =4
) width appodization window parameterReturns
seq
: (::Sequence
) Sequence struct with a RF pulseExamples
julia> sys = Scanner(); durRF = π / 2 / (2π * γ * sys.B1);
julia> seq = PulseDesigner.RF_sinc(sys.B1, durRF, sys);
-julia> plot_seq(seq)
source seq = EPI(FOV::Real, N::Integer, sys::Scanner)
Returns a sequence with EPI gradients.
Arguments
FOV
: (::Real
, [m]
) field of viewN
: (::Integer
) number of pixels in the x and y axissys
: (::Scanner
) Scanner structReturns
seq
: (::Sequence
) Sequence struct with EPI gradientsExamples
julia> sys, FOV, N = Scanner(), 23e-2, 101
+julia> plot_seq(seq)
source seq = EPI(FOV::Real, N::Integer, sys::Scanner)
Returns a sequence with EPI gradients.
Arguments
FOV
: (::Real
, [m]
) field of viewN
: (::Integer
) number of pixels in the x and y axissys
: (::Scanner
) Scanner structReturns
seq
: (::Sequence
) Sequence struct with EPI gradientsExamples
julia> sys, FOV, N = Scanner(), 23e-2, 101
julia> seq = PulseDesigner.EPI(FOV, N, sys)
julia> plot_seq(seq)
-julia> plot_kspace(seq)
source seq = radial_base(FOV::Real, Nr::Integer, sys::Scanner)
Returns a sequence with radial gradients for a single trajectory.
Arguments
FOV
: (::Real
, [m]
) field of viewN
: (::Integer
) number of pixels along the diametersys
: (::Scanner
) Scanner structReturns
seq
: (::Sequence
) Sequence struct of a single radial trajectoryExamples
julia> sys, FOV, N = Scanner(), 23e-2, 101
+julia> plot_kspace(seq)
source seq = radial_base(FOV::Real, Nr::Integer, sys::Scanner)
Returns a sequence with radial gradients for a single trajectory.
Arguments
FOV
: (::Real
, [m]
) field of viewN
: (::Integer
) number of pixels along the diametersys
: (::Scanner
) Scanner structReturns
seq
: (::Sequence
) Sequence struct of a single radial trajectoryExamples
julia> sys, FOV, N = Scanner(), 23e-2, 101
julia> seq = PulseDesigner.radial_base(FOV, N, sys)
julia> plot_seq(seq)
-julia> plot_kspace(seq)
source spiral = spiral_base(FOV, N, sys; S0=sys.Smax*2/3, Nint=8, λ=Nint/FOV, BW=60e3)
Definition of a spiral base sequence.
References
Glover, G.H. (1999), Simple analytic spiral K-space algorithm. Magn. Reson. Med., 42: 412-415. https://doi.org/10.1002/(SICI)1522-2594(199908)42:2<412::AID-MRM25>3.0.CO;2-U
Arguments
FOV
: (::Real
, [m]
) field of viewN
: (::Integer
) number of pixels along the radioussys
: (::Scanner
) Scanner structKeywords
S0
: (::Vector{Real}
, =sys.Smax*2/3
, [T/m/s]
) slew rate referenceNint
: (::Integer
, =8
) number of interleavesλ
: (::Real
, =Nint/FOV
, [1/m]
) kspace spiral parameterBW
: (::Real
, =60e3
, [Hz]
) adquisition parameterReturns
spiral
: (::Function
) function that returns a Sequence
struct when evaluatedExamples
julia> sys, FOV, N = Scanner(), 23e-2, 101
+julia> plot_kspace(seq)
source spiral = spiral_base(FOV, N, sys; S0=sys.Smax*2/3, Nint=8, λ=Nint/FOV, BW=60e3)
Definition of a spiral base sequence.
References
Glover, G.H. (1999), Simple analytic spiral K-space algorithm. Magn. Reson. Med., 42: 412-415. https://doi.org/10.1002/(SICI)1522-2594(199908)42:2<412::AID-MRM25>3.0.CO;2-U
Arguments
FOV
: (::Real
, [m]
) field of viewN
: (::Integer
) number of pixels along the radioussys
: (::Scanner
) Scanner structKeywords
S0
: (::Vector{Real}
, =sys.Smax*2/3
, [T/m/s]
) slew rate referenceNint
: (::Integer
, =8
) number of interleavesλ
: (::Real
, =Nint/FOV
, [1/m]
) kspace spiral parameterBW
: (::Real
, =60e3
, [Hz]
) adquisition parameterReturns
spiral
: (::Function
) function that returns a Sequence
struct when evaluatedExamples
julia> sys, FOV, N = Scanner(), 23e-2, 101
julia> spiral = PulseDesigner.spiral_base(FOV, N, sys)
julia> seq = spiral(0)
-julia> plot_seq(seq)
source seq = EPI_example(; sys=Scanner())
Returns a sequence suitable for acquiring the 2D brain example in the provided examples.
Keywords
sys
: (::Scanner
) Scanner structReturns
seq
: (::Sequence
) EPI example Sequence structExamples
julia> seq = PulseDesigner.EPI_example();
+julia> plot_seq(seq)
source seq = EPI_example(; sys=Scanner())
Returns a sequence suitable for acquiring the 2D brain example in the provided examples.
Keywords
sys
: (::Scanner
) Scanner structReturns
seq
: (::Sequence
) EPI example Sequence structExamples
julia> seq = PulseDesigner.EPI_example();
-julia> plot_seq(seq)
source
Theme
Automatic (OS) documenter-light documenter-dark catppuccin-latte catppuccin-frappe catppuccin-macchiato catppuccin-mocha
This document was generated with Documenter.jl version 1.7.0 on Thursday 3 October 2024 . Using Julia version 1.10.5.
+julia> plot_seq(seq)source
Theme
Automatic (OS) documenter-light documenter-dark catppuccin-latte catppuccin-frappe catppuccin-macchiato catppuccin-mocha
This document was generated with Documenter.jl version 1.7.0 on Thursday 3 October 2024 . Using Julia version 1.10.5.
diff --git a/dev/reference/3-koma-core/index.html b/dev/reference/3-koma-core/index.html
index 8d7116277..6fe701be3 100644
--- a/dev/reference/3-koma-core/index.html
+++ b/dev/reference/3-koma-core/index.html
@@ -1,12 +1,12 @@
-
KomaMRICore · KomaMRI.jl out = simulate(obj::Phantom, seq::Sequence, sys::Scanner; sim_params, w)
Returns the raw signal or the last state of the magnetization according to the value of the "return_type"
key of the sim_params
dictionary.
This is a wrapper function to run_sim_time_iter
, which converts the inputs to the appropriate types and discretizes the sequence before simulation. The reported simulation time only considers run_sim_time_iter
, as the preprocessing duration should be negligible compared to the simulation time (if this is not the case, please file a bug report).
Arguments
obj
: (::Phantom
) Phantom structseq
: (::Sequence
) Sequence structsys
: (::Scanner
) Scanner structKeywords
sim_params
: (::Dict{String,Any}
, =Dict{String,Any}()
) simulation parameter dictionaryw
: (::Blink.AtomShell.Window
, =nothing
) the window within which to display a progress bar in the Blink Window UI. If this variable is anything other than 'nothing', the progress bar will be consideredReturns
out
: (::Vector{Complex}
or ::SpinStateRepresentation
or ::RawAcquisitionData
) depending on whether "return_type" is "mat", "state" or "raw" (default), respectivelyExamples
julia> seq_file = joinpath(dirname(pathof(KomaMRI)), "../examples/5.koma_paper/comparison_accuracy/sequences/EPI/epi_100x100_TE100_FOV230.seq");
+KomaMRICore · KomaMRI.jl out = simulate(obj::Phantom, seq::Sequence, sys::Scanner; sim_params, w)
Returns the raw signal or the last state of the magnetization according to the value of the "return_type"
key of the sim_params
dictionary.
This is a wrapper function to run_sim_time_iter
, which converts the inputs to the appropriate types and discretizes the sequence before simulation. The reported simulation time only considers run_sim_time_iter
, as the preprocessing duration should be negligible compared to the simulation time (if this is not the case, please file a bug report).
Arguments
obj
: (::Phantom
) Phantom structseq
: (::Sequence
) Sequence structsys
: (::Scanner
) Scanner structKeywords
sim_params
: (::Dict{String,Any}
, =Dict{String,Any}()
) simulation parameter dictionaryw
: (::Blink.AtomShell.Window
, =nothing
) the window within which to display a progress bar in the Blink Window UI. If this variable is anything other than 'nothing', the progress bar will be consideredReturns
out
: (::Vector{Complex}
or ::SpinStateRepresentation
or ::RawAcquisitionData
) depending on whether "return_type" is "mat", "state" or "raw" (default), respectivelyExamples
julia> seq_file = joinpath(dirname(pathof(KomaMRI)), "../examples/5.koma_paper/comparison_accuracy/sequences/EPI/epi_100x100_TE100_FOV230.seq");
julia> sys, obj, seq = Scanner(), brain_phantom2D(), read_seq(seq_file)
julia> raw = simulate(obj, seq, sys)
-julia> plot_signal(raw)
source mag = simulate_slice_profile(seq; z, sim_params)
Returns magnetization of spins distributed along z
after running the Sequence struct.
Arguments
seq
: (::Sequence
) Sequence structKeywords
z
: (=range(-2e-2,2e-2,200)
) range for the z axissim_params
: (::Dict{String, Any}
, =Dict{String,Any}("Δt_rf"=>1e-6)
) dictionary with simulation parametersReturns
mag
: (::SpinStateRepresentation
) final state of the magnetization vectorsource sim_params = default_sim_params(sim_params=Dict{String,Any}())
This function returns a dictionary containing default simulation parameters while also allowing the user to define some of them.
Arguments
sim_params
: (::Dict{String,Any}
, =Dict{String,Any}()
) user-defined dictionary with simulation parameters. The following lists its keys along with their possible values:"return_type": defines the output of the simulate
function. Possible values are "raw"
, "mat"
, and "state"
, corresponding to outputting a MRIReco RawAcquisitionData
, the signal values, and the last magnetization state of the simulation, respectively "sim_method": defines the type of simulation. The default value is Bloch()
, but you can alternatively use the BlochDict()
simulation method. Moreover, you have the flexibility to create your own methods without altering the KomaMRI source code "Δt": raster time for gradients "Δt_rf": raster time for RFs "precision": defines the floating-point simulation precision. You can choose between "f32"
and "f64"
to use Float32
and Float64
primitive types, respectively. It's important to note that, especially for GPU operations, using "f32"
is generally much faster "Nblocks": divides the simulation into a specified number of time blocks. This parameter is designed to conserve RAM resources, as KomaMRI computes a series of simulations consecutively, each with the specified number of blocks determined by the value of "Nblocks"
"Nthreads": divides the Phantom into a specified number of threads. Because spins are modeled independently of each other, KomaMRI can solve simulations in parallel threads, speeding up the execution time "gpu": is a boolean that determines whether to use GPU or CPU hardware resources, as long as they are available on the host computer "gpu_device": default value is 'nothing'. If set to integer or device instance, calls the corresponding function to set the device of the available GPU in the host computer (e.g. CUDA.device!) Returns
sim_params
: (::Dict{String,Any}
) dictionary with simulation parameterssource get_backend(use_gpu)
Gets the simulation backend to use. If use_gpu=false or there are no available GPU backends, returns CPU(), else, returns the GPU backend (currently either CUDABackend(), MetalBackend(), ROCBackend(), or oneAPIBackend()).
The GPU package for the corresponding backend (CUDA.jl, Metal.jl, AMDGPU.jl, or oneAPI.jl) must be loaded and functional, otherwise KomaMRI will default to using the CPU.
Arguments
'use_gpu': ('::Bool') If true, attempt to use GPU and check for available backends Returns
'backend': (::KernelAbstractions.backend) The backend to use source print_devices()
Simple function to print available devices. Calls internal get_backend() function to get the appropriate GPU / CPU backend and prints device information.
Arguments
'use_gpu': ('::Bool') If true, check for loaded / functional GPU backends and print appropriate warnings if no GPU backends have been loaded source gpu(x)
Moves 'x' to the GPU. For this function to work, a GPU backend will need to be loaded with 'using AMDGPU / CUDA / Metal / oneAPI.
This works for functions, and any struct marked with @functor
.
Use cpu
to copy back to ordinary Array
s.
See also f32
and f64
to change element type only.
Examples
using CUDA
-x = x |> gpu
source gpu(x, backend)
Tries to move x
to the GPU backend specified in the 'backend' parameter.
This works for functions, and any struct marked with @functor
.
Use cpu
to copy back to ordinary Array
s.
See also f32
and f64
to change element type only.
Examples
x = gpu(x, CUDABackend())
source cpu(x)
Tries to move object to CPU. This works for functions, and any struct marked with @functor
.
See also gpu
.
Examples
x = x |> cpu
source f32(m)
Converts the eltype
of model's parameters to Float32
Recurses into structs marked with @functor
.
See also f64
.
source f64(m)
Converts the eltype
of model's parameters to Float64
(which is Koma's default).. Recurses into structs marked with @functor
.
See also f32
.
source raw = signal_to_raw_data(signal, seq; phantom_name, sys, sim_params)
Transforms the raw signal into a RawAcquisitionData struct (nearly equivalent to the ISMRMRD format) used for reconstruction with MRIReco.
Arguments
signal
: (::Matrix{Complex}
) raw signal matrixseq
: (::Sequence
) Sequence structKeywords
phantom_name
: (::String
, ="Phantom"
) phantom namesys
: (::Scanner
, =Scanner()
) Scanner structsim_params
: (::Dict{String, Any}
, =Dict{String,Any}()
) simulation parameter dictionaryReturns
raw
: (::RawAcquisitionData
) RawAcquisitionData structExamples
julia> seq_file = joinpath(dirname(pathof(KomaMRI)), "../examples/1.sequences/epi_se.seq")
+julia> plot_signal(raw)
source mag = simulate_slice_profile(seq; z, sim_params)
Returns magnetization of spins distributed along z
after running the Sequence struct.
Arguments
seq
: (::Sequence
) Sequence structKeywords
z
: (=range(-2e-2,2e-2,200)
) range for the z axissim_params
: (::Dict{String, Any}
, =Dict{String,Any}("Δt_rf"=>1e-6)
) dictionary with simulation parametersReturns
mag
: (::SpinStateRepresentation
) final state of the magnetization vectorsource sim_params = default_sim_params(sim_params=Dict{String,Any}())
This function returns a dictionary containing default simulation parameters while also allowing the user to define some of them.
Arguments
sim_params
: (::Dict{String,Any}
, =Dict{String,Any}()
) user-defined dictionary with simulation parameters. The following lists its keys along with their possible values:"return_type": defines the output of the simulate
function. Possible values are "raw"
, "mat"
, and "state"
, corresponding to outputting a MRIReco RawAcquisitionData
, the signal values, and the last magnetization state of the simulation, respectively "sim_method": defines the type of simulation. The default value is Bloch()
, but you can alternatively use the BlochDict()
simulation method. Moreover, you have the flexibility to create your own methods without altering the KomaMRI source code "Δt": raster time for gradients "Δt_rf": raster time for RFs "precision": defines the floating-point simulation precision. You can choose between "f32"
and "f64"
to use Float32
and Float64
primitive types, respectively. It's important to note that, especially for GPU operations, using "f32"
is generally much faster "Nblocks": divides the simulation into a specified number of time blocks. This parameter is designed to conserve RAM resources, as KomaMRI computes a series of simulations consecutively, each with the specified number of blocks determined by the value of "Nblocks"
"Nthreads": divides the Phantom into a specified number of threads. Because spins are modeled independently of each other, KomaMRI can solve simulations in parallel threads, speeding up the execution time "gpu": is a boolean that determines whether to use GPU or CPU hardware resources, as long as they are available on the host computer "gpu_device": default value is 'nothing'. If set to integer or device instance, calls the corresponding function to set the device of the available GPU in the host computer (e.g. CUDA.device!) Returns
sim_params
: (::Dict{String,Any}
) dictionary with simulation parameterssource get_backend(use_gpu)
Gets the simulation backend to use. If use_gpu=false or there are no available GPU backends, returns CPU(), else, returns the GPU backend (currently either CUDABackend(), MetalBackend(), ROCBackend(), or oneAPIBackend()).
The GPU package for the corresponding backend (CUDA.jl, Metal.jl, AMDGPU.jl, or oneAPI.jl) must be loaded and functional, otherwise KomaMRI will default to using the CPU.
Arguments
'use_gpu': ('::Bool') If true, attempt to use GPU and check for available backends Returns
'backend': (::KernelAbstractions.backend) The backend to use source print_devices()
Simple function to print available devices. Calls internal get_backend() function to get the appropriate GPU / CPU backend and prints device information.
Arguments
'use_gpu': ('::Bool') If true, check for loaded / functional GPU backends and print appropriate warnings if no GPU backends have been loaded source gpu(x)
Moves 'x' to the GPU. For this function to work, a GPU backend will need to be loaded with 'using AMDGPU / CUDA / Metal / oneAPI.
This works for functions, and any struct marked with @functor
.
Use cpu
to copy back to ordinary Array
s.
See also f32
and f64
to change element type only.
Examples
using CUDA
+x = x |> gpu
source gpu(x, backend)
Tries to move x
to the GPU backend specified in the 'backend' parameter.
This works for functions, and any struct marked with @functor
.
Use cpu
to copy back to ordinary Array
s.
See also f32
and f64
to change element type only.
Examples
x = gpu(x, CUDABackend())
source cpu(x)
Tries to move object to CPU. This works for functions, and any struct marked with @functor
.
See also gpu
.
Examples
x = x |> cpu
source f32(m)
Converts the eltype
of model's parameters to Float32
Recurses into structs marked with @functor
.
See also f64
.
source f64(m)
Converts the eltype
of model's parameters to Float64
(which is Koma's default).. Recurses into structs marked with @functor
.
See also f32
.
source raw = signal_to_raw_data(signal, seq; phantom_name, sys, sim_params)
Transforms the raw signal into a RawAcquisitionData struct (nearly equivalent to the ISMRMRD format) used for reconstruction with MRIReco.
Arguments
signal
: (::Matrix{Complex}
) raw signal matrixseq
: (::Sequence
) Sequence structKeywords
phantom_name
: (::String
, ="Phantom"
) phantom namesys
: (::Scanner
, =Scanner()
) Scanner structsim_params
: (::Dict{String, Any}
, =Dict{String,Any}()
) simulation parameter dictionaryReturns
raw
: (::RawAcquisitionData
) RawAcquisitionData structExamples
julia> seq_file = joinpath(dirname(pathof(KomaMRI)), "../examples/1.sequences/epi_se.seq")
julia> sys, obj, seq = Scanner(), brain_phantom2D(), read_seq(seq_file)
@@ -16,8 +16,8 @@
julia> raw = signal_to_raw_data(signal, seq)
-julia> plot_signal(raw)
source mag = Mag(xy::Complex, z::Real)
The Magnetization struct.
Arguments
xy
: (::Complex{Float64}
) magnetization of a spin in the xy planez
: (::Real
) magnetization of a spin in the z planeReturns
mag
: (::Mag
) Magnetization structsource spinor = Spinor(α, β)
Spinor(α, β) with Cayley-Klein parameters α and β. Based on "Introduction to the Shinnar-Le Roux algorithm", Patrick Le Roux (1995). A spinor is a way to represent 3D rotations, the underlying representation is a 2 X 2 complex unitary matrix ($\alpha,\beta\in\mathbb{C}$ ):
\[R=\left[\begin{array}{cc}
+julia> plot_signal(raw)
source mag = Mag(xy::Complex, z::Real)
The Magnetization struct.
Arguments
xy
: (::Complex{Float64}
) magnetization of a spin in the xy planez
: (::Real
) magnetization of a spin in the z planeReturns
mag
: (::Mag
) Magnetization structsource spinor = Spinor(α, β)
Spinor(α, β) with Cayley-Klein parameters α and β. Based on "Introduction to the Shinnar-Le Roux algorithm", Patrick Le Roux (1995). A spinor is a way to represent 3D rotations, the underlying representation is a 2 X 2 complex unitary matrix ($\alpha,\beta\in\mathbb{C}$ ):
\[R=\left[\begin{array}{cc}
\alpha & -\beta^{*}\\
\beta & \alpha^{*}
-\end{array}\right],\]
with $|\alpha|^2+|\beta|^2 = 1$ .
This later operates on the $2\times2$ representation of $(x,y,z)$ as follows $V^{+} = R V R^{*}$ .
Arguments
α
: (::Complex{Float64}
) Cayley-Klein parameter αβ
: (::Complex{Float64}
) Cayley-Klein parameter βReturns
spinor
: (::Spinor
) Spinor structsource s = Q(φ, nxy, nz)
Spinor rotation matrix. Counter-clockwise rotation of φ
with respect to the axis of rotation n=(nx, ny, nz).
Pauly, J., Le Roux, P., Nishimura, D., & Macovski, A. (1991). Parameter relations for the Shinnar-Le Roux selective excitation pulse design algorithm (NMR imaging). IEEE Transactions on Medical Imaging, 10(1), 53-65. doi:10.1109/42.75611
\[\varphi=-\gamma\Delta t\sqrt{\left|B_{1}\right|^{2}+\left(\boldsymbol{G}\cdot\boldsymbol{x}
-\right)^{2}}=-\gamma\Delta t\left\Vert \boldsymbol{B}\right\Vert\]
\[\boldsymbol{n}=\boldsymbol{B}/\left\Vert \boldsymbol{B}\right\Vert\]
Arguments
φ
: (::Real
, [rad]
) φ anglenxy
: (::Real
) nxy factornz
: (::Real
) nz factorReturns
s
: (::Spinor
) spinnor struct that represents the Q
rotation matrixsource Rodrigues' formula: Rotation matrix that when applied rotates with respect to "n" in an angle θ anti clock-wise
source s = Rx(θ)
Spinor counter-clockwise rotation matrix with angle θ
with respect to x-axis.
Arguments
θ
: (::Real
, [rad]
) angle with respect to x-axisReturns
s
: (::Spinor
) spinor struct that represents the Rx
rotation matrixsource s = Ry(θ)
Spinor counter-clockwise rotation matrix with angle θ
with respect to y-axis.
Arguments
θ
: (::Real
, [rad]
) angle with respect to y-axisReturns
s
: (::Spinor
) spinor struct that represents the Ry
rotation matrixsource s = Rz(φ)
Spinor counter-clockwise rotation matrix with angle φ
with respect to z-axis.
Arguments
φ
: (::Real
, [rad]
) angle with respect to z-axisReturns
s
: (::Spinor
) spinnor struct that represents the Rz
rotation matrixsource
Theme
Automatic (OS) documenter-light documenter-dark catppuccin-latte catppuccin-frappe catppuccin-macchiato catppuccin-mocha
This document was generated with Documenter.jl version 1.7.0 on Thursday 3 October 2024 . Using Julia version 1.10.5.
+\end{array}\right],\]with $|\alpha|^2+|\beta|^2 = 1$ .
This later operates on the $2\times2$ representation of $(x,y,z)$ as follows $V^{+} = R V R^{*}$ .
Arguments
α
: (::Complex{Float64}
) Cayley-Klein parameter αβ
: (::Complex{Float64}
) Cayley-Klein parameter βReturns
spinor
: (::Spinor
) Spinor struct
source s = Q(φ, nxy, nz)
Spinor rotation matrix. Counter-clockwise rotation of φ
with respect to the axis of rotation n=(nx, ny, nz).
Pauly, J., Le Roux, P., Nishimura, D., & Macovski, A. (1991). Parameter relations for the Shinnar-Le Roux selective excitation pulse design algorithm (NMR imaging). IEEE Transactions on Medical Imaging, 10(1), 53-65. doi:10.1109/42.75611
\[\varphi=-\gamma\Delta t\sqrt{\left|B_{1}\right|^{2}+\left(\boldsymbol{G}\cdot\boldsymbol{x}
+\right)^{2}}=-\gamma\Delta t\left\Vert \boldsymbol{B}\right\Vert\]
\[\boldsymbol{n}=\boldsymbol{B}/\left\Vert \boldsymbol{B}\right\Vert\]
Arguments
φ
: (::Real
, [rad]
) φ anglenxy
: (::Real
) nxy factornz
: (::Real
) nz factorReturns
s
: (::Spinor
) spinnor struct that represents the Q
rotation matrixsource Rodrigues' formula: Rotation matrix that when applied rotates with respect to "n" in an angle θ anti clock-wise
source s = Rx(θ)
Spinor counter-clockwise rotation matrix with angle θ
with respect to x-axis.
Arguments
θ
: (::Real
, [rad]
) angle with respect to x-axisReturns
s
: (::Spinor
) spinor struct that represents the Rx
rotation matrixsource s = Ry(θ)
Spinor counter-clockwise rotation matrix with angle θ
with respect to y-axis.
Arguments
θ
: (::Real
, [rad]
) angle with respect to y-axisReturns
s
: (::Spinor
) spinor struct that represents the Ry
rotation matrixsource s = Rz(φ)
Spinor counter-clockwise rotation matrix with angle φ
with respect to z-axis.
Arguments
φ
: (::Real
, [rad]
) angle with respect to z-axisReturns
s
: (::Spinor
) spinnor struct that represents the Rz
rotation matrixsource
Theme
Automatic (OS) documenter-light documenter-dark catppuccin-latte catppuccin-frappe catppuccin-macchiato catppuccin-mocha
This document was generated with Documenter.jl version 1.7.0 on Thursday 3 October 2024 . Using Julia version 1.10.5.
diff --git a/dev/reference/4-koma-files/index.html b/dev/reference/4-koma-files/index.html
index c625e894f..9d8047e09 100644
--- a/dev/reference/4-koma-files/index.html
+++ b/dev/reference/4-koma-files/index.html
@@ -1,14 +1,14 @@
-
KomaMRIFiles · KomaMRI.jl seq = read_seq(filename)
Returns the Sequence struct from a Pulseq file with .seq
extension.
Arguments
filename
: (::String
) absolute or relative path of the sequence file .seq
Returns
seq
: (::Sequence
) Sequence structExamples
julia> seq_file = joinpath(dirname(pathof(KomaMRI)), "../examples/1.sequences/spiral.seq")
+KomaMRIFiles · KomaMRI.jl seq = read_seq(filename)
Returns the Sequence struct from a Pulseq file with .seq
extension.
Arguments
filename
: (::String
) absolute or relative path of the sequence file .seq
Returns
seq
: (::Sequence
) Sequence structExamples
julia> seq_file = joinpath(dirname(pathof(KomaMRI)), "../examples/1.sequences/spiral.seq")
julia> seq = read_seq(seq_file)
-julia> plot_seq(seq)
source obj = read_phantom_jemris(filename)
Returns the Phantom struct from a JEMRIS phantom file .h5
.
Arguments
filename
: (::String
) the absolute or relative path of the phantom file .h5
Returns
obj
: (::Phantom
) Phantom structExamples
julia> obj_file = joinpath(dirname(pathof(KomaMRI)), "../examples/2.phantoms/brain.h5")
+julia> plot_seq(seq)
source obj = read_phantom_jemris(filename)
Returns the Phantom struct from a JEMRIS phantom file .h5
.
Arguments
filename
: (::String
) the absolute or relative path of the phantom file .h5
Returns
obj
: (::Phantom
) Phantom structExamples
julia> obj_file = joinpath(dirname(pathof(KomaMRI)), "../examples/2.phantoms/brain.h5")
julia> obj = read_phantom_jemris(obj_file)
-julia> plot_phantom_map(obj, :ρ)
source obj = read_phantom_MRiLab(filename)
Returns the Phantom struct from a MRiLab phantom file .mat
.
Arguments
filename
: (::String
) the absolute or relative path of the phantom file .mat
Returns
obj
: (::Phantom
) Phantom structExamples
julia> obj_file = joinpath(dirname(pathof(KomaMRI)), "../examples/2.phantoms/brain.mat")
+julia> plot_phantom_map(obj, :ρ)
source obj = read_phantom_MRiLab(filename)
Returns the Phantom struct from a MRiLab phantom file .mat
.
Arguments
filename
: (::String
) the absolute or relative path of the phantom file .mat
Returns
obj
: (::Phantom
) Phantom structExamples
julia> obj_file = joinpath(dirname(pathof(KomaMRI)), "../examples/2.phantoms/brain.mat")
julia> obj = read_phantom_MRiLab(obj_file)
-julia> plot_phantom_map(obj, :ρ)
source phantom = read_phantom(filename)
Reads a (.phantom) file and creates a Phantom structure from it
source phantom = write_phantom(ph,filename)
Writes a (.phantom) file from a Phantom struct.
source
Theme
Automatic (OS) documenter-light documenter-dark catppuccin-latte catppuccin-frappe catppuccin-macchiato catppuccin-mocha
This document was generated with Documenter.jl version 1.7.0 on Thursday 3 October 2024 . Using Julia version 1.10.5.
+julia> plot_phantom_map(obj, :ρ)
source phantom = read_phantom(filename)
Reads a (.phantom) file and creates a Phantom structure from it
source phantom = write_phantom(ph,filename)
Writes a (.phantom) file from a Phantom struct.
source
Theme
Automatic (OS) documenter-light documenter-dark catppuccin-latte catppuccin-frappe catppuccin-macchiato catppuccin-mocha
This document was generated with Documenter.jl version 1.7.0 on Thursday 3 October 2024 . Using Julia version 1.10.5.
diff --git a/dev/reference/5-koma-plots/index.html b/dev/reference/5-koma-plots/index.html
index 64233abc7..942826b7c 100644
--- a/dev/reference/5-koma-plots/index.html
+++ b/dev/reference/5-koma-plots/index.html
@@ -1,44 +1,44 @@
-
KomaMRIPlots · KomaMRI.jl p = plot_phantom_map(obj::Phantom, key::Symbol; kwargs...)
Plots a phantom map for a specific spin parameter given by key
.
Arguments
obj
: (::Phantom
) Phantom structkey
: (::Symbol
, opts: [:ρ
, :T1
, :T2
, :T2s
, :x
, :y
, :z
]) symbol for displaying different parameters of the phantom spinsKeywords
height
: (::Integer
, =600
) plot heightwidth
: (::Integer
, =nothing
) plot widthdarkmode
: (::Bool
, =false
) boolean to indicate whether to display darkmode styleview_2d
: (::Bool
, =false
) boolean to indicate whether to use a 2D scatter plotcolorbar
: (::Bool
, =true
) boolean to indicate whether to display a colorbarmax_spins
:(::Int
, =100_000
) maximum number of displayed spinstime_samples
:(::Int
, =0
) intermediate time samples between motion t_start
and t_end
max_time_samples
:(::Int
, =100
) maximum number of time samplesframe_duration_ms
:(::Int
, =250
) time in miliseconds between two frames Returns
p
: (::PlotlyJS.SyncPlot
) plot of the phantom map for a specific spin parameterReferences
Colormaps from https://github.com/markgriswold/MRFColormaps Towards Unified Colormaps for Quantitative MRF Data, Mark Griswold, et al. (2018).
Examples
julia> obj2D, obj3D = brain_phantom2D(), brain_phantom3D();
+KomaMRIPlots · KomaMRI.jl p = plot_phantom_map(obj::Phantom, key::Symbol; kwargs...)
Plots a phantom map for a specific spin parameter given by key
.
Arguments
obj
: (::Phantom
) Phantom structkey
: (::Symbol
, opts: [:ρ
, :T1
, :T2
, :T2s
, :x
, :y
, :z
]) symbol for displaying different parameters of the phantom spinsKeywords
height
: (::Integer
, =600
) plot heightwidth
: (::Integer
, =nothing
) plot widthdarkmode
: (::Bool
, =false
) boolean to indicate whether to display darkmode styleview_2d
: (::Bool
, =false
) boolean to indicate whether to use a 2D scatter plotcolorbar
: (::Bool
, =true
) boolean to indicate whether to display a colorbarmax_spins
:(::Int
, =100_000
) maximum number of displayed spinstime_samples
:(::Int
, =0
) intermediate time samples between motion t_start
and t_end
max_time_samples
:(::Int
, =100
) maximum number of time samplesframe_duration_ms
:(::Int
, =250
) time in miliseconds between two frames Returns
p
: (::PlotlyJS.SyncPlot
) plot of the phantom map for a specific spin parameterReferences
Colormaps from https://github.com/markgriswold/MRFColormaps Towards Unified Colormaps for Quantitative MRF Data, Mark Griswold, et al. (2018).
Examples
julia> obj2D, obj3D = brain_phantom2D(), brain_phantom3D();
julia> plot_phantom_map(obj2D, :ρ)
-julia> plot_phantom_map(obj3D, :ρ)
source p = plot_seq(seq::Sequence; kwargs...)
Plots a sequence struct.
Arguments
seq
: (::Sequence
) Sequence structKeywords
width
: (::Integer
, =nothing
) plot widthheight
: (::Integer
, =nothing
) plot heightslider
: (::Bool
, =true
) boolean to indicate whether to display a slidershow_seq_blocks
: (::Bool
, =false
) boolean to indicate whether to display sequence blocksdarkmode
: (::Bool
, =false
) boolean to indicate whether to display darkmode stylerange
: (::Vector{Real}
, =[]
) time range to be displayed initiallytitle
: (::String
, =""
) plot titlefreq_in_phase
: (::Bool
, =true
) Include FM modulation in RF phasegl
: (::Bool
, =false
) use PlotlyJS.scattergl
backend (faster)max_rf_samples
: (::Integer
, =100
) maximum number of RF samplesshow_adc
: (::Bool
, =false
) plot ADC samples with markersReturns
p
: (::PlotlyJS.SyncPlot
) plot of the Sequence structExamples
julia> seq_file = joinpath(dirname(pathof(KomaMRI)), "../examples/1.sequences/spiral.seq")
+julia> plot_phantom_map(obj3D, :ρ)
source p = plot_seq(seq::Sequence; kwargs...)
Plots a sequence struct.
Arguments
seq
: (::Sequence
) Sequence structKeywords
width
: (::Integer
, =nothing
) plot widthheight
: (::Integer
, =nothing
) plot heightslider
: (::Bool
, =true
) boolean to indicate whether to display a slidershow_seq_blocks
: (::Bool
, =false
) boolean to indicate whether to display sequence blocksdarkmode
: (::Bool
, =false
) boolean to indicate whether to display darkmode stylerange
: (::Vector{Real}
, =[]
) time range to be displayed initiallytitle
: (::String
, =""
) plot titlefreq_in_phase
: (::Bool
, =true
) Include FM modulation in RF phasegl
: (::Bool
, =false
) use PlotlyJS.scattergl
backend (faster)max_rf_samples
: (::Integer
, =100
) maximum number of RF samplesshow_adc
: (::Bool
, =false
) plot ADC samples with markersReturns
p
: (::PlotlyJS.SyncPlot
) plot of the Sequence structExamples
julia> seq_file = joinpath(dirname(pathof(KomaMRI)), "../examples/1.sequences/spiral.seq")
julia> seq = read_seq(seq_file)
-julia> plot_seq(seq)
source p = plot_kspace(seq::Sequence; width=nothing, height=nothing, darkmode=false)
Plots the k-space of a Sequence struct.
Arguments
seq
: (::Sequence
) Sequence structKeywords
width
: (::Integer
, =nothing
) plot widthheight
: (::Integer
, =nothing
) plot heightdarkmode
: (::Bool
, =false
) boolean to indicate whether to display darkmode styleReturns
p
: (::PlotlyJS.SyncPlot
) plot of the k-space of the Sequence structExamples
julia> seq_file = joinpath(dirname(pathof(KomaMRI)), "../examples/1.sequences/spiral.seq")
+julia> plot_seq(seq)
source p = plot_kspace(seq::Sequence; width=nothing, height=nothing, darkmode=false)
Plots the k-space of a Sequence struct.
Arguments
seq
: (::Sequence
) Sequence structKeywords
width
: (::Integer
, =nothing
) plot widthheight
: (::Integer
, =nothing
) plot heightdarkmode
: (::Bool
, =false
) boolean to indicate whether to display darkmode styleReturns
p
: (::PlotlyJS.SyncPlot
) plot of the k-space of the Sequence structExamples
julia> seq_file = joinpath(dirname(pathof(KomaMRI)), "../examples/1.sequences/spiral.seq")
julia> seq = read_seq(seq_file)
-julia> plot_kspace(seq)
source p = plot_M0(seq::Sequence; kwargs...)
Plots the zero order moment (M0) of a Sequence struct.
Arguments
seq
: (::Sequence
) Sequence structKeywords
width
: (::Integer
, =nothing
) plot widthheight
: (::Integer
, =nothing
) plot heightslider
: (::Bool
, =true
) boolean to indicate whether to display a slidershow_seq_blocks
: (::Bool
, =false
) boolean to indicate whether to display sequence blocksdarkmode
: (::Bool
, =false
) boolean to indicate whether to display darkmode stylerange
: (::Vector{Real}
, =[]
) time range to be displayed initiallytitle
: (::String
, =""
) plot titleReturns
p
: (::PlotlyJS.SyncPlot
) plot of the moment M0 of the Sequence structExamples
julia> seq_file = joinpath(dirname(pathof(KomaMRI)), "../examples/1.sequences/spiral.seq")
+julia> plot_kspace(seq)
source p = plot_M0(seq::Sequence; kwargs...)
Plots the zero order moment (M0) of a Sequence struct.
Arguments
seq
: (::Sequence
) Sequence structKeywords
width
: (::Integer
, =nothing
) plot widthheight
: (::Integer
, =nothing
) plot heightslider
: (::Bool
, =true
) boolean to indicate whether to display a slidershow_seq_blocks
: (::Bool
, =false
) boolean to indicate whether to display sequence blocksdarkmode
: (::Bool
, =false
) boolean to indicate whether to display darkmode stylerange
: (::Vector{Real}
, =[]
) time range to be displayed initiallytitle
: (::String
, =""
) plot titleReturns
p
: (::PlotlyJS.SyncPlot
) plot of the moment M0 of the Sequence structExamples
julia> seq_file = joinpath(dirname(pathof(KomaMRI)), "../examples/1.sequences/spiral.seq")
julia> seq = read_seq(seq_file)
-julia> plot_M0(seq)
source p = plot_M1(seq::Sequence; kwargs...)
Plots the first order moment (M1) of a Sequence struct.
Arguments
seq
: (::Sequence
) Sequence structKeywords
width
: (::Integer
, =nothing
) plot widthheight
: (::Integer
, =nothing
) plot heightslider
: (::Bool
, =true
) boolean to indicate whether to display a slidershow_seq_blocks
: (::Bool
, =false
) boolean to indicate whether to display sequence blocksdarkmode
: (::Bool
, =false
) boolean to indicate whether to display darkmode stylerange
: (::Vector{Real}
, =[]
) time range to be displayed initiallytitle
: (::String
, =""
) plot titleReturns
p
: (::PlotlyJS.SyncPlot
) plot of the moment M1 of the Sequence structExamples
julia> seq_file = joinpath(dirname(pathof(KomaMRI)), "../examples/1.sequences/spiral.seq")
+julia> plot_M0(seq)
source p = plot_M1(seq::Sequence; kwargs...)
Plots the first order moment (M1) of a Sequence struct.
Arguments
seq
: (::Sequence
) Sequence structKeywords
width
: (::Integer
, =nothing
) plot widthheight
: (::Integer
, =nothing
) plot heightslider
: (::Bool
, =true
) boolean to indicate whether to display a slidershow_seq_blocks
: (::Bool
, =false
) boolean to indicate whether to display sequence blocksdarkmode
: (::Bool
, =false
) boolean to indicate whether to display darkmode stylerange
: (::Vector{Real}
, =[]
) time range to be displayed initiallytitle
: (::String
, =""
) plot titleReturns
p
: (::PlotlyJS.SyncPlot
) plot of the moment M1 of the Sequence structExamples
julia> seq_file = joinpath(dirname(pathof(KomaMRI)), "../examples/1.sequences/spiral.seq")
julia> seq = read_seq(seq_file)
-julia> plot_M1(seq)
source p = plot_M2(seq::Sequence; kwargs...)
Plots the second order moment (M2) of a Sequence struct.
Arguments
seq
: (::Sequence
) Sequence structKeywords
width
: (::Integer
, =nothing
) plot widthheight
: (::Integer
, =nothing
) plot heightslider
: (::Bool
, =true
) boolean to indicate whether to display a slidershow_seq_blocks
: (::Bool
, =false
) boolean to indicate whether to display sequence blocksdarkmode
: (::Bool
, =false
) boolean to indicate whether to display darkmode stylerange
: (::Vector{Real}
, =[]
) time range to be displayed initiallytitle
: (::String
, =""
) plot titleReturns
p
: (::PlotlyJS.SyncPlot
) plot of the moment M2 of the Sequence structExamples
julia> seq_file = joinpath(dirname(pathof(KomaMRI)), "../examples/1.sequences/spiral.seq")
+julia> plot_M1(seq)
source p = plot_M2(seq::Sequence; kwargs...)
Plots the second order moment (M2) of a Sequence struct.
Arguments
seq
: (::Sequence
) Sequence structKeywords
width
: (::Integer
, =nothing
) plot widthheight
: (::Integer
, =nothing
) plot heightslider
: (::Bool
, =true
) boolean to indicate whether to display a slidershow_seq_blocks
: (::Bool
, =false
) boolean to indicate whether to display sequence blocksdarkmode
: (::Bool
, =false
) boolean to indicate whether to display darkmode stylerange
: (::Vector{Real}
, =[]
) time range to be displayed initiallytitle
: (::String
, =""
) plot titleReturns
p
: (::PlotlyJS.SyncPlot
) plot of the moment M2 of the Sequence structExamples
julia> seq_file = joinpath(dirname(pathof(KomaMRI)), "../examples/1.sequences/spiral.seq")
julia> seq = read_seq(seq_file)
-julia> plot_M2(seq)
source p = plot_eddy_currents(seq::Sequence, λ; kwargs...)
Plots the eddy currents of a Sequence struct.
Arguments
seq
: (::Sequence
) Sequence structλ
: (::Real
, [s]
) time constant for the decay of Eddy currentsKeywords
α
: (::Vector{Real}
, =ones(size(λ))
) eddy currents factorswidth
: (::Integer
, =nothing
) plot widthheight
: (::Integer
, =nothing
) plot heightslider
: (::Bool
, =true
) boolean to indicate whether to display a slidershow_seq_blocks
: (::Bool
, =false
) boolean to indicate whether to display sequence blocksdarkmode
: (::Bool
, =false
) boolean to indicate whether to display darkmode stylerange
: (::Vector{Real}
, =[]
) time range to be displayed initiallytitle
: (::String
, =""
) plot titleReturns
p
: (::PlotlyJS.SyncPlot
) plot of the Eddy currents of the Sequence structExamples
julia> seq_file = joinpath(dirname(pathof(KomaMRI)), "../examples/1.sequences/spiral.seq")
+julia> plot_M2(seq)
source p = plot_eddy_currents(seq::Sequence, λ; kwargs...)
Plots the eddy currents of a Sequence struct.
Arguments
seq
: (::Sequence
) Sequence structλ
: (::Real
, [s]
) time constant for the decay of Eddy currentsKeywords
α
: (::Vector{Real}
, =ones(size(λ))
) eddy currents factorswidth
: (::Integer
, =nothing
) plot widthheight
: (::Integer
, =nothing
) plot heightslider
: (::Bool
, =true
) boolean to indicate whether to display a slidershow_seq_blocks
: (::Bool
, =false
) boolean to indicate whether to display sequence blocksdarkmode
: (::Bool
, =false
) boolean to indicate whether to display darkmode stylerange
: (::Vector{Real}
, =[]
) time range to be displayed initiallytitle
: (::String
, =""
) plot titleReturns
p
: (::PlotlyJS.SyncPlot
) plot of the Eddy currents of the Sequence structExamples
julia> seq_file = joinpath(dirname(pathof(KomaMRI)), "../examples/1.sequences/spiral.seq")
julia> seq = read_seq(seq_file)
-julia> plot_eddy_currents(seq, 80e-3)
source p = plot_slew_rate(seq::Sequence; kwargs...)
Plots the slew rate currents of a Sequence struct.
Arguments
seq
: (::Sequence
) Sequence structKeywords
width
: (::Integer
, =nothing
) plot widthheight
: (::Integer
, =nothing
) plot heightslider
: (::Bool
, =true
) boolean to indicate whether to display a slidershow_seq_blocks
: (::Bool
, =false
) boolean to indicate whether to display sequence blocksdarkmode
: (::Bool
, =false
) boolean to indicate whether to display darkmode stylerange
: (::Vector{Real}
, =[]
) time range to be displayed initiallytitle
: (::String
, =""
) plot titleReturns
p
: (::PlotlyJS.SyncPlot
) plot of the slew rate currents of the Sequence structExamples
julia> seq_file = joinpath(dirname(pathof(KomaMRI)), "../examples/1.sequences/spiral.seq")
+julia> plot_eddy_currents(seq, 80e-3)
source p = plot_slew_rate(seq::Sequence; kwargs...)
Plots the slew rate currents of a Sequence struct.
Arguments
seq
: (::Sequence
) Sequence structKeywords
width
: (::Integer
, =nothing
) plot widthheight
: (::Integer
, =nothing
) plot heightslider
: (::Bool
, =true
) boolean to indicate whether to display a slidershow_seq_blocks
: (::Bool
, =false
) boolean to indicate whether to display sequence blocksdarkmode
: (::Bool
, =false
) boolean to indicate whether to display darkmode stylerange
: (::Vector{Real}
, =[]
) time range to be displayed initiallytitle
: (::String
, =""
) plot titleReturns
p
: (::PlotlyJS.SyncPlot
) plot of the slew rate currents of the Sequence structExamples
julia> seq_file = joinpath(dirname(pathof(KomaMRI)), "../examples/1.sequences/spiral.seq")
julia> seq = read_seq(seq_file)
-julia> plot_slew_rate(seq)
source p = plot_seqd(seq::Sequence; sampling_params=KomaMRIBase.default_sampling_params())
Plots a sampled sequence struct.
Arguments
seq
: (::Sequence
) Sequence structKeywords
sampling_params
: (::Dict{String,Any}()
, =KomaMRIBase.default_sampling_params()
) dictionary of sampling parametersReturns
p
: (::PlotlyJS.SyncPlot
) plot of the sampled Sequence structExamples
julia> seq_file = joinpath(dirname(pathof(KomaMRI)), "../examples/1.sequences/spiral.seq")
+julia> plot_slew_rate(seq)
source p = plot_seqd(seq::Sequence; sampling_params=KomaMRIBase.default_sampling_params())
Plots a sampled sequence struct.
Arguments
seq
: (::Sequence
) Sequence structKeywords
sampling_params
: (::Dict{String,Any}()
, =KomaMRIBase.default_sampling_params()
) dictionary of sampling parametersReturns
p
: (::PlotlyJS.SyncPlot
) plot of the sampled Sequence structExamples
julia> seq_file = joinpath(dirname(pathof(KomaMRI)), "../examples/1.sequences/spiral.seq")
julia> seq = read_seq(seq_file)
-julia> plot_seqd(seq)
source p = plot_signal(raw::RawAcquisitionData; kwargs...)
Plots a raw signal in ISMRMRD format.
Arguments
raw
: (::RawAcquisitionData
) RawAcquisitionData struct (raw signal in ISMRMRD format)Keywords
width
: (::Integer
, =nothing
) plot widthheight
: (::Integer
, =nothing
) plot heightslider
: (::Bool
, =true
) boolean to indicate whether to display a slidershow_sim_blocks
: (::Bool
, =false
) boolean to indicate whether to display sequence blocksdarkmode
: (::Bool
, =false
) boolean to indicate whether to display darkmode stylerange
: (::Vector{Real}
, =[]
) time range to be displayed initiallyReturns
p
: (::PlotlyJS.SyncPlot
) plot of the raw signalExamples
julia> seq_file = joinpath(dirname(pathof(KomaMRI)), "../examples/5.koma_paper/comparison_accuracy/sequences/EPI/epi_100x100_TE100_FOV230.seq");
+julia> plot_seqd(seq)
source p = plot_signal(raw::RawAcquisitionData; kwargs...)
Plots a raw signal in ISMRMRD format.
Arguments
raw
: (::RawAcquisitionData
) RawAcquisitionData struct (raw signal in ISMRMRD format)Keywords
width
: (::Integer
, =nothing
) plot widthheight
: (::Integer
, =nothing
) plot heightslider
: (::Bool
, =true
) boolean to indicate whether to display a slidershow_sim_blocks
: (::Bool
, =false
) boolean to indicate whether to display sequence blocksdarkmode
: (::Bool
, =false
) boolean to indicate whether to display darkmode stylerange
: (::Vector{Real}
, =[]
) time range to be displayed initiallyReturns
p
: (::PlotlyJS.SyncPlot
) plot of the raw signalExamples
julia> seq_file = joinpath(dirname(pathof(KomaMRI)), "../examples/5.koma_paper/comparison_accuracy/sequences/EPI/epi_100x100_TE100_FOV230.seq");
julia> sys, obj, seq = Scanner(), brain_phantom2D(), read_seq(seq_file)
julia> raw = simulate(obj, seq, sys)
-julia> plot_signal(raw)
source p = plot_image(image; height, width, zmin, zmax, darkmode, title)
Plots an image matrix.
Arguments
image
: (::Matrix{Number}
) image matrixKeywords
width
: (::Integer
, =nothing
) plot widthheight
: (::Integer
, =nothing
) plot heightzmin
: (::Real
, =minimum(abs.(image[:]))
) reference value for minimum colorzmax
: (::Real
, =maximum(abs.(image[:]))
) reference value for maximum colordarkmode
: (::Bool
, =false
) boolean to indicate whether to display darkmode styletitle
: (::String
, =""
) plot titleReturns
p
: (::PlotlyJS.SyncPlot
) plot of the image matrixsource str = plot_dict(dict::Dict)
Generates an HTML table based on the dictionary dict
.
Arguments
dict
: (::Dict
) dictionaryReturns
str
: (::String
) dictionary as an HTML tablesource
Theme
Automatic (OS) documenter-light documenter-dark catppuccin-latte catppuccin-frappe catppuccin-macchiato catppuccin-mocha
This document was generated with Documenter.jl version 1.7.0 on Thursday 3 October 2024 . Using Julia version 1.10.5.
+julia> plot_signal(raw)
source p = plot_image(image; height, width, zmin, zmax, darkmode, title)
Plots an image matrix.
Arguments
image
: (::Matrix{Number}
) image matrixKeywords
width
: (::Integer
, =nothing
) plot widthheight
: (::Integer
, =nothing
) plot heightzmin
: (::Real
, =minimum(abs.(image[:]))
) reference value for minimum colorzmax
: (::Real
, =maximum(abs.(image[:]))
) reference value for maximum colordarkmode
: (::Bool
, =false
) boolean to indicate whether to display darkmode styletitle
: (::String
, =""
) plot titleReturns
p
: (::PlotlyJS.SyncPlot
) plot of the image matrixsource str = plot_dict(dict::Dict)
Generates an HTML table based on the dictionary dict
.
Arguments
dict
: (::Dict
) dictionaryReturns
str
: (::String
) dictionary as an HTML tablesource
Theme
Automatic (OS) documenter-light documenter-dark catppuccin-latte catppuccin-frappe catppuccin-macchiato catppuccin-mocha
This document was generated with Documenter.jl version 1.7.0 on Thursday 3 October 2024 . Using Julia version 1.10.5.
diff --git a/dev/reference/6-koma-mri/index.html b/dev/reference/6-koma-mri/index.html
index 8d2e9904d..4da22341c 100644
--- a/dev/reference/6-koma-mri/index.html
+++ b/dev/reference/6-koma-mri/index.html
@@ -1,2 +1,2 @@
-
KomaMRI · KomaMRI.jl out = KomaUI(; kwargs...)
Launch the Koma's UI.
Keywords
darkmode
: (::Bool
, =true
) define dark mode style for the UIframe
: (::Bool
, =true
) display the upper frame of the Blink windowphantom_mode
: (::String
, ="2D"
, opts=["2D"
, "3D"
]) load the default phantom as a 2D or 3D brain examplesim
: (::Dict{String,Any}
, =Dict{String,Any}()
) simulation parameters dictionaryrec
: (::Dict{Symbol,Any}
, =Dict{Symbol,Any}()
) reconstruction parameters dictionaryreturn_window
: (::Bool
, =false
) make the out
be either 'nothing' or the Blink window, depending on whether the return_window
keyword argument is set to trueshow_window
: (::Bool
, =true
) display the Blink windowReturns
out
: (::Nothing
or ::Blink.AtomShell.Window
) returns either 'nothing' or the Blink window, depending on whether the return_window
keyword argument is set to true.Examples
julia> KomaUI()
source
Theme
Automatic (OS) documenter-light documenter-dark catppuccin-latte catppuccin-frappe catppuccin-macchiato catppuccin-mocha
This document was generated with Documenter.jl version 1.7.0 on Thursday 3 October 2024 . Using Julia version 1.10.5.
+
KomaMRI · KomaMRI.jl out = KomaUI(; kwargs...)
Launch the Koma's UI.
Keywords
darkmode
: (::Bool
, =true
) define dark mode style for the UIframe
: (::Bool
, =true
) display the upper frame of the Blink windowphantom_mode
: (::String
, ="2D"
, opts=["2D"
, "3D"
]) load the default phantom as a 2D or 3D brain examplesim
: (::Dict{String,Any}
, =Dict{String,Any}()
) simulation parameters dictionaryrec
: (::Dict{Symbol,Any}
, =Dict{Symbol,Any}()
) reconstruction parameters dictionaryreturn_window
: (::Bool
, =false
) make the out
be either 'nothing' or the Blink window, depending on whether the return_window
keyword argument is set to trueshow_window
: (::Bool
, =true
) display the Blink windowReturns
out
: (::Nothing
or ::Blink.AtomShell.Window
) returns either 'nothing' or the Blink window, depending on whether the return_window
keyword argument is set to true.Examples
julia> KomaUI()
source
Theme
Automatic (OS) documenter-light documenter-dark catppuccin-latte catppuccin-frappe catppuccin-macchiato catppuccin-mocha
This document was generated with Documenter.jl version 1.7.0 on Thursday 3 October 2024 . Using Julia version 1.10.5.
diff --git a/dev/search_index.js b/dev/search_index.js
index c291fda4c..2d5eef332 100644
--- a/dev/search_index.js
+++ b/dev/search_index.js
@@ -1,3 +1,3 @@
var documenterSearchIndex = {"docs":
-[{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"EditURL = \"lit-04-3DSliceSelective.jl\"","category":"page"},{"location":"tutorial/04-3DSliceSelective/#Slice-Selective-Acquisition-of-3D-Phantom","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"","category":"section"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"using KomaMRI # hide\nsys = Scanner() # hide","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"While in the previous examples we simulated using hard RF pulses, in this demonstration we will illustrate the principles of slice selection. First, let's import a 3D phantom, in this case a brain slab (thickness of 2mathrmcm), by calling the function brain_phantom3D.","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"obj = brain_phantom3D()\nobj.Δw .= 0 # Removes the off-resonance\np1 = plot_phantom_map(obj, :T2 ; height=400)\nsavefig(p1, \"../assets/3-phantom.html\") # hide","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"
","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"Now, we are going to import a sequence which acquires 3 slices in the longitudinal axis. Note that the sequence contains three EPIs to acquire 3 slices of the phantom.","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"seq_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/1.sequences/epi_multislice.seq\")\nseq = read_seq(seq_file)\np2 = plot_seq(seq; range=[0,10], height=400)\nsavefig(p2, \"../assets/3-seq.html\") # hide","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"
","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"We can take a look to the slice profiles by using the function simulate_slice_profile:","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"z = range(-2., 2., 200) * 1e-2; # -2 to 2 cm\nrf1, rf2, rf3 = findall(is_RF_on.(seq))\nM1 = simulate_slice_profile(seq[rf1]; z)\nM2 = simulate_slice_profile(seq[rf2]; z)\nM3 = simulate_slice_profile(seq[rf3]; z)\n\nusing PlotlyJS # hide\npa = scatter(x=z*1e2, y=abs.(M1.xy), name=\"Slice 1\") # hide\npb = scatter(x=z*1e2, y=abs.(M2.xy), name=\"Slice 2\") # hide\npc = scatter(x=z*1e2, y=abs.(M3.xy), name=\"Slice 3\") # hide\npd = plot([pa,pb,pc], Layout(xaxis=attr(title=\"z [cm]\"), height=300,margin=attr(t=40,l=0,r=0), title=\"Slice profiles for the slice-selective sequence\")) # hide\nsavefig(pd, \"../assets/3-profile.html\") # hide","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"
","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"Now let's simulate the acquisition. Notice the three echoes, one for every slice excitation.","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"raw = simulate(obj, seq, sys; sim_params=Dict{String,Any}(\"Nblocks\"=>20))\np3 = plot_signal(raw; slider=false, height=300)\nsavefig(p3, \"../assets/3-signal.html\") # hide","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"
","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"Finally, we reconstruct the acquiered images.","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"# Get the acquisition data\nacq = AcquisitionData(raw)\n\n# Setting up the reconstruction parameters and perform reconstruction\nNx, Ny = raw.params[\"reconSize\"][1:2]\nreconParams = Dict{Symbol,Any}(:reco=>\"direct\", :reconSize=>(Nx, Ny))\nimage = reconstruction(acq, reconParams)\n\n# Plotting the slices\np4 = plot_image(abs.(image[:, :, 1]); height=360, title=\"Slice 1\")\np5 = plot_image(abs.(image[:, :, 2]); height=360, title=\"Slice 2\")\np6 = plot_image(abs.(image[:, :, 3]); height=360, title=\"Slice 3\")\nsavefig(p4, \"../assets/3-recon1.html\") # hide\nsavefig(p5, \"../assets/3-recon2.html\") # hide\nsavefig(p6, \"../assets/3-recon3.html\") # hide","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"
","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"
","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"This page was generated using Literate.jl.","category":"page"},{"location":"tutorial-pluto/README/","page":"-","title":"-","text":"This folder is intentionally left empty. It will be filled by docs/make.jl in the gh-pages branch. ","category":"page"},{"location":"tutorial-pluto/README/","page":"-","title":"-","text":"Files matching the pluto-*.jl pattern anywhere in examples/4.reproducible_notebooks will be included.","category":"page"},{"location":"tutorial-pluto/README/","page":"-","title":"-","text":"All files included in this folder will be ignored.","category":"page"},{"location":"tutorial-pluto/01-gradient-echo-spin-echo/#Understanding-basic-MRI-sequences","page":"Understanding basic MRI sequences","title":"Understanding basic MRI sequences","text":"","category":"section"},{"location":"tutorial-pluto/01-gradient-echo-spin-echo/","page":"Understanding basic MRI sequences","title":"Understanding basic MRI sequences","text":"(Image: ) (Image: )","category":"page"},{"location":"tutorial-pluto/01-gradient-echo-spin-echo/","page":"Understanding basic MRI sequences","title":"Understanding basic MRI sequences","text":"
","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"EditURL = \"lit-06-DiffusionMotion.jl\"","category":"page"},{"location":"tutorial/06-DiffusionMotion/#Diffusion-induced-Signal-Attenuation","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"","category":"section"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"using KomaMRI # hide\nusing PlotlyJS # hide\nusing Random # hide","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"The purpose of this tutorial is to showcase the simulation of diffusion-related effects. For this, we are going to define a Path motion to simulate the Brownian motion of spins. This is not the most efficient way of simulating diffusion, but it is a good way to understand the phenomenon. In particular, we will going to simulate isotropic diffusion, characterized by the Apparent Diffusion Coefficient (ADC).","category":"page"},{"location":"tutorial/06-DiffusionMotion/#Creating-a-phantom-with-isotropic-diffusion","page":"Diffusion-induced Signal Attenuation","title":"Creating a phantom with isotropic diffusion","text":"","category":"section"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"First we will define a Phantom without motion containing 10000 spins. The spins will have the same relaxation times T_1 = 1000mathrmms and T_2 = 100mathrmms, and will be placed at the origin.","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"Nspins = 10_000\nobj = Phantom(;\n x = zeros(Nspins),\n T1 = ones(Nspins) * 1000e-3,\n T2 = ones(Nspins) * 100e-3,\n)","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"Now we will define the Brownian motion of the spins using the Path motion definition. The motion will be defined by the displacements in the x, y, and z directions (dx, dy, and dz) of the spins. The displacements will be generated by a random walk with mean square displacement","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"mathbbEleftx^2right=2D Δt","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"where D is the diffusion coefficient and Δt is time step duration.","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"D = 2e-9 # Diffusion Coefficient of water in m^2/s\nT = 100e-3 # Duration of the motion\nNt = 100 # Number of time steps\nΔt = T / (Nt - 1) # Time sep\nΔr = sqrt(2 * D * Δt) # √ Mean square displacement","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"Random walk is defined as the cumulative sum of random displacements:","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"rng = MersenneTwister(1234) # Setting up the random seed\ndx = cumsum([zeros(Nspins) Δr .* randn(rng, Nspins, Nt - 1)]; dims=2)\ndy = cumsum([zeros(Nspins) Δr .* randn(rng, Nspins, Nt - 1)]; dims=2)\ndz = cumsum([zeros(Nspins) Δr .* randn(rng, Nspins, Nt - 1)]; dims=2)","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"Including the random_walk into the Phantom definition:","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"random_walk = Path(dx, dy, dz, TimeRange(0.0, T))\nobj.motion = MotionList(random_walk)\np1 = plot_phantom_map(obj, :T1; time_samples=Nt÷4, height=450)\n\nsavefig(p1, \"../assets/6-displacements.html\") # hide","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"
","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"The plot shows the random walk of spins due to diffusion, also known as Brownian motion. This motion was named after Robert Brown, who first described the phenomenon in 1827 while looking at pollen suspended in water under a microscope.","category":"page"},{"location":"tutorial/06-DiffusionMotion/#Pulse-Gradient-Spin-Echo-(PGSE)-sequence","page":"Diffusion-induced Signal Attenuation","title":"Pulse Gradient Spin Echo (PGSE) sequence","text":"","category":"section"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"The classical sequence used to measure diffusion is the pulse gradient spin echo (PGSE) introduced by Stejskal and Tanner in 1965. This sequence is characterized by the use of two diffusion gradients, placed right before and right after the inversion RF pulse. The duration of each gradient is defined by the δ parameter and the distance between the beginning of both gradients is described by the Δ parameter. In this tutorial square-shaped gradients will be used.","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"First, we generate the RF pulses:","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"sys = Scanner()\ndurRF = 1e-3\nB1 = (π / 2) / (2π * γ * durRF)\nrf90 = PulseDesigner.RF_hard(B1, durRF, sys)\nrf180 = (0.0 + 2im) * rf90","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"Now we generate the gradients:","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"G = 30e-3 # Gradient amplitude\nδ = 30e-3 # Duration of the gradient\nΔ = durRF + δ # Time between the two gradients\ngx_diff = Grad(G, δ)","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"Finally, we generate the ADC:","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"adc_dwell_time = 1e-6\nadc = ADC(1, adc_dwell_time, durRF/2 - adc_dwell_time/2) # ADCs with N=1 are positioned at the center","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"Obtaining the PGSE sequence:","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"seq = Sequence()\nseq += rf90\nseq += gx_diff\nseq += rf180\nseq += gx_diff\nseq += adc\np2 = plot_seq(seq; show_adc=true) # Plotting the sequence\n\nsavefig(p2, \"../assets/6-pgse_sequence.html\") # hide","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"
","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"For the isotropic diffusion, the signal attenuation is given by the Stejskal-Tanner formula:","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"E = expleft(-b Dright)","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"where (b) is the b-value, defined as:","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"b = (gamma G delta)^2 cdot left(Delta - delta3right)","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"where gamma is the gyromagnetic ratio, G is the gradient amplitude, delta is the gradient duration, and Delta is the time between the two gradients.","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"function bvalue(seq)\n block, axis = 2, 1 # Gx from second block\n G = seq.GR[axis, block].A\n δ = seq.GR[axis, block].T\n Δ = dur(seq[2:3]) # Because there are no gaps\n b = (2π * γ * G * δ)^2 * (Δ - δ/3)\n return b * 1e-6\nend","category":"page"},{"location":"tutorial/06-DiffusionMotion/#Diffusion-Weighted-Imaging-(DWI)","page":"Diffusion-induced Signal Attenuation","title":"Diffusion Weighted Imaging (DWI)","text":"","category":"section"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"For DWI, multiple b-values are acquired to determine the tissue's ADC. For this, we will scale the gradient's amplitude of the previous sequence to obtain a desired b-value. We will store the sequences in a vector seqs and simulate the signal for each one of them.","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"seqs = Sequence[] # Vector of sequences\nbvals = [0, 250, 500, 1000, 1500, 2000] # b-values in s/mm^2\nfor bval_target in bvals\n gradient_scaling = sqrt(bval_target / bvalue(seq))\n seq_b = gradient_scaling * seq\n push!(seqs, seq_b)\nend","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"To simulate, we will broadcast the simulate function over the sequences and store the signals in a vector Sb. The Ref's are used to avoid broadcasting the obj and sys arguments (they will remain constant for all seqs).","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"sim_params = KomaMRICore.default_sim_params()\nsim_params[\"return_type\"] = \"mat\"\nsim_params[\"Δt\"] = Δt # Set max. grad. time step to fit diffusion time step\n\nsignals = simulate.(Ref(obj), seqs, Ref(sys); sim_params) # simulate broadcasted over seqs\n\nSb = [sb[1] for sb in signals] # Reshaping the simulated signals\nbvals_si = bvals .* 1e6 # Convert b-values from s/mm^2 to s/m^2\n\nE_simulated = abs.(Sb) ./ abs.(Sb[1])\nE_theoretical = exp.(-bvals_si .* D)\n\ns_sim = scatter(x=bvals, y=E_simulated, name=\"Simulated\") # hide\ns_theo = scatter(x=bvals, y=E_theoretical, name=\"exp(-b D)\", line=attr(dash=\"dash\")) # hide\nlayout = Layout(title=\"Diffusion-induced signal attenuation E(b)\", xaxis=attr(title=\"b-value [s/mm^2]\")) # hide\np3 = plot([s_sim, s_theo], layout) # hide\n\nsavefig(p3, \"../assets/6-pgse_signal_attenuation.html\") # hide","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"
","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"The plot shows the signal attenuation as a function of the b-value. The simulated signal attenuation matches the theoretical curve, showing the expected exponential decay with the b-value.","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"This page was generated using Literate.jl.","category":"page"},{"location":"reference/5-koma-plots/#KomaMRIPlots","page":"KomaMRIPlots","title":"KomaMRIPlots","text":"","category":"section"},{"location":"reference/5-koma-plots/","page":"KomaMRIPlots","title":"KomaMRIPlots","text":"CurrentModule = KomaMRIPlots","category":"page"},{"location":"reference/5-koma-plots/#Plotting-Phantom","page":"KomaMRIPlots","title":"Plotting Phantom","text":"","category":"section"},{"location":"reference/5-koma-plots/","page":"KomaMRIPlots","title":"KomaMRIPlots","text":"plot_phantom_map","category":"page"},{"location":"reference/5-koma-plots/#KomaMRIPlots.plot_phantom_map","page":"KomaMRIPlots","title":"KomaMRIPlots.plot_phantom_map","text":"p = plot_phantom_map(obj::Phantom, key::Symbol; kwargs...)\n\nPlots a phantom map for a specific spin parameter given by key.\n\nArguments\n\nobj: (::Phantom) Phantom struct\nkey: (::Symbol, opts: [:ρ, :T1, :T2, :T2s, :x, :y, :z]) symbol for displaying different parameters of the phantom spins\n\nKeywords\n\nheight: (::Integer, =600) plot height\nwidth: (::Integer, =nothing) plot width\ndarkmode: (::Bool, =false) boolean to indicate whether to display darkmode style\nview_2d: (::Bool, =false) boolean to indicate whether to use a 2D scatter plot\ncolorbar: (::Bool, =true) boolean to indicate whether to display a colorbar\nmax_spins:(::Int, =100_000) maximum number of displayed spins\ntime_samples:(::Int, =0) intermediate time samples between motion t_start and t_end\nmax_time_samples:(::Int, =100) maximum number of time samples\nframe_duration_ms:(::Int, =250) time in miliseconds between two frames \n\nReturns\n\np: (::PlotlyJS.SyncPlot) plot of the phantom map for a specific spin parameter\n\nReferences\n\nColormaps from https://github.com/markgriswold/MRFColormaps Towards Unified Colormaps for Quantitative MRF Data, Mark Griswold, et al. (2018).\n\nExamples\n\njulia> obj2D, obj3D = brain_phantom2D(), brain_phantom3D();\n\njulia> plot_phantom_map(obj2D, :ρ)\n\njulia> plot_phantom_map(obj3D, :ρ)\n\n\n\n\n\n","category":"function"},{"location":"reference/5-koma-plots/#Plotting-Sequence","page":"KomaMRIPlots","title":"Plotting Sequence","text":"","category":"section"},{"location":"reference/5-koma-plots/","page":"KomaMRIPlots","title":"KomaMRIPlots","text":"plot_seq\nplot_kspace\nplot_M0\nplot_M1\nplot_M2\nplot_eddy_currents\nplot_slew_rate\nplot_seqd","category":"page"},{"location":"reference/5-koma-plots/#KomaMRIPlots.plot_seq","page":"KomaMRIPlots","title":"KomaMRIPlots.plot_seq","text":"p = plot_seq(seq::Sequence; kwargs...)\n\nPlots a sequence struct.\n\nArguments\n\nseq: (::Sequence) Sequence struct\n\nKeywords\n\nwidth: (::Integer, =nothing) plot width\nheight: (::Integer, =nothing) plot height\nslider: (::Bool, =true) boolean to indicate whether to display a slider\nshow_seq_blocks: (::Bool, =false) boolean to indicate whether to display sequence blocks\ndarkmode: (::Bool, =false) boolean to indicate whether to display darkmode style\nrange: (::Vector{Real}, =[]) time range to be displayed initially\ntitle: (::String, =\"\") plot title\nfreq_in_phase: (::Bool, =true) Include FM modulation in RF phase\ngl: (::Bool, =false) use PlotlyJS.scattergl backend (faster)\nmax_rf_samples: (::Integer, =100) maximum number of RF samples\nshow_adc: (::Bool, =false) plot ADC samples with markers\n\nReturns\n\np: (::PlotlyJS.SyncPlot) plot of the Sequence struct\n\nExamples\n\njulia> seq_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/1.sequences/spiral.seq\")\n\njulia> seq = read_seq(seq_file)\n\njulia> plot_seq(seq)\n\n\n\n\n\n","category":"function"},{"location":"reference/5-koma-plots/#KomaMRIPlots.plot_kspace","page":"KomaMRIPlots","title":"KomaMRIPlots.plot_kspace","text":"p = plot_kspace(seq::Sequence; width=nothing, height=nothing, darkmode=false)\n\nPlots the k-space of a Sequence struct.\n\nArguments\n\nseq: (::Sequence) Sequence struct\n\nKeywords\n\nwidth: (::Integer, =nothing) plot width\nheight: (::Integer, =nothing) plot height\ndarkmode: (::Bool, =false) boolean to indicate whether to display darkmode style\n\nReturns\n\np: (::PlotlyJS.SyncPlot) plot of the k-space of the Sequence struct\n\nExamples\n\njulia> seq_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/1.sequences/spiral.seq\")\n\njulia> seq = read_seq(seq_file)\n\njulia> plot_kspace(seq)\n\n\n\n\n\n","category":"function"},{"location":"reference/5-koma-plots/#KomaMRIPlots.plot_M0","page":"KomaMRIPlots","title":"KomaMRIPlots.plot_M0","text":"p = plot_M0(seq::Sequence; kwargs...)\n\nPlots the zero order moment (M0) of a Sequence struct.\n\nArguments\n\nseq: (::Sequence) Sequence struct\n\nKeywords\n\nwidth: (::Integer, =nothing) plot width\nheight: (::Integer, =nothing) plot height\nslider: (::Bool, =true) boolean to indicate whether to display a slider\nshow_seq_blocks: (::Bool, =false) boolean to indicate whether to display sequence blocks\ndarkmode: (::Bool, =false) boolean to indicate whether to display darkmode style\nrange: (::Vector{Real}, =[]) time range to be displayed initially\ntitle: (::String, =\"\") plot title\n\nReturns\n\np: (::PlotlyJS.SyncPlot) plot of the moment M0 of the Sequence struct\n\nExamples\n\njulia> seq_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/1.sequences/spiral.seq\")\n\njulia> seq = read_seq(seq_file)\n\njulia> plot_M0(seq)\n\n\n\n\n\n","category":"function"},{"location":"reference/5-koma-plots/#KomaMRIPlots.plot_M1","page":"KomaMRIPlots","title":"KomaMRIPlots.plot_M1","text":"p = plot_M1(seq::Sequence; kwargs...)\n\nPlots the first order moment (M1) of a Sequence struct.\n\nArguments\n\nseq: (::Sequence) Sequence struct\n\nKeywords\n\nwidth: (::Integer, =nothing) plot width\nheight: (::Integer, =nothing) plot height\nslider: (::Bool, =true) boolean to indicate whether to display a slider\nshow_seq_blocks: (::Bool, =false) boolean to indicate whether to display sequence blocks\ndarkmode: (::Bool, =false) boolean to indicate whether to display darkmode style\nrange: (::Vector{Real}, =[]) time range to be displayed initially\ntitle: (::String, =\"\") plot title\n\nReturns\n\np: (::PlotlyJS.SyncPlot) plot of the moment M1 of the Sequence struct\n\nExamples\n\njulia> seq_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/1.sequences/spiral.seq\")\n\njulia> seq = read_seq(seq_file)\n\njulia> plot_M1(seq)\n\n\n\n\n\n","category":"function"},{"location":"reference/5-koma-plots/#KomaMRIPlots.plot_M2","page":"KomaMRIPlots","title":"KomaMRIPlots.plot_M2","text":"p = plot_M2(seq::Sequence; kwargs...)\n\nPlots the second order moment (M2) of a Sequence struct.\n\nArguments\n\nseq: (::Sequence) Sequence struct\n\nKeywords\n\nwidth: (::Integer, =nothing) plot width\nheight: (::Integer, =nothing) plot height\nslider: (::Bool, =true) boolean to indicate whether to display a slider\nshow_seq_blocks: (::Bool, =false) boolean to indicate whether to display sequence blocks\ndarkmode: (::Bool, =false) boolean to indicate whether to display darkmode style\nrange: (::Vector{Real}, =[]) time range to be displayed initially\ntitle: (::String, =\"\") plot title\n\nReturns\n\np: (::PlotlyJS.SyncPlot) plot of the moment M2 of the Sequence struct\n\nExamples\n\njulia> seq_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/1.sequences/spiral.seq\")\n\njulia> seq = read_seq(seq_file)\n\njulia> plot_M2(seq)\n\n\n\n\n\n","category":"function"},{"location":"reference/5-koma-plots/#KomaMRIPlots.plot_eddy_currents","page":"KomaMRIPlots","title":"KomaMRIPlots.plot_eddy_currents","text":"p = plot_eddy_currents(seq::Sequence, λ; kwargs...)\n\nPlots the eddy currents of a Sequence struct.\n\nArguments\n\nseq: (::Sequence) Sequence struct\nλ: (::Real, [s]) time constant for the decay of Eddy currents\n\nKeywords\n\nα: (::Vector{Real}, =ones(size(λ))) eddy currents factors\nwidth: (::Integer, =nothing) plot width\nheight: (::Integer, =nothing) plot height\nslider: (::Bool, =true) boolean to indicate whether to display a slider\nshow_seq_blocks: (::Bool, =false) boolean to indicate whether to display sequence blocks\ndarkmode: (::Bool, =false) boolean to indicate whether to display darkmode style\nrange: (::Vector{Real}, =[]) time range to be displayed initially\ntitle: (::String, =\"\") plot title\n\nReturns\n\np: (::PlotlyJS.SyncPlot) plot of the Eddy currents of the Sequence struct\n\nExamples\n\njulia> seq_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/1.sequences/spiral.seq\")\n\njulia> seq = read_seq(seq_file)\n\njulia> plot_eddy_currents(seq, 80e-3)\n\n\n\n\n\n","category":"function"},{"location":"reference/5-koma-plots/#KomaMRIPlots.plot_slew_rate","page":"KomaMRIPlots","title":"KomaMRIPlots.plot_slew_rate","text":"p = plot_slew_rate(seq::Sequence; kwargs...)\n\nPlots the slew rate currents of a Sequence struct.\n\nArguments\n\nseq: (::Sequence) Sequence struct\n\nKeywords\n\nwidth: (::Integer, =nothing) plot width\nheight: (::Integer, =nothing) plot height\nslider: (::Bool, =true) boolean to indicate whether to display a slider\nshow_seq_blocks: (::Bool, =false) boolean to indicate whether to display sequence blocks\ndarkmode: (::Bool, =false) boolean to indicate whether to display darkmode style\nrange: (::Vector{Real}, =[]) time range to be displayed initially\ntitle: (::String, =\"\") plot title\n\nReturns\n\np: (::PlotlyJS.SyncPlot) plot of the slew rate currents of the Sequence struct\n\nExamples\n\njulia> seq_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/1.sequences/spiral.seq\")\n\njulia> seq = read_seq(seq_file)\n\njulia> plot_slew_rate(seq)\n\n\n\n\n\n","category":"function"},{"location":"reference/5-koma-plots/#KomaMRIPlots.plot_seqd","page":"KomaMRIPlots","title":"KomaMRIPlots.plot_seqd","text":"p = plot_seqd(seq::Sequence; sampling_params=KomaMRIBase.default_sampling_params())\n\nPlots a sampled sequence struct.\n\nArguments\n\nseq: (::Sequence) Sequence struct\n\nKeywords\n\nsampling_params: (::Dict{String,Any}(), =KomaMRIBase.default_sampling_params()) dictionary of sampling parameters\n\nReturns\n\np: (::PlotlyJS.SyncPlot) plot of the sampled Sequence struct\n\nExamples\n\njulia> seq_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/1.sequences/spiral.seq\")\n\njulia> seq = read_seq(seq_file)\n\njulia> plot_seqd(seq)\n\n\n\n\n\n","category":"function"},{"location":"reference/5-koma-plots/#Plotting-RawAcquisitionData","page":"KomaMRIPlots","title":"Plotting RawAcquisitionData","text":"","category":"section"},{"location":"reference/5-koma-plots/","page":"KomaMRIPlots","title":"KomaMRIPlots","text":"plot_signal","category":"page"},{"location":"reference/5-koma-plots/#KomaMRIPlots.plot_signal","page":"KomaMRIPlots","title":"KomaMRIPlots.plot_signal","text":"p = plot_signal(raw::RawAcquisitionData; kwargs...)\n\nPlots a raw signal in ISMRMRD format.\n\nArguments\n\nraw: (::RawAcquisitionData) RawAcquisitionData struct (raw signal in ISMRMRD format)\n\nKeywords\n\nwidth: (::Integer, =nothing) plot width\nheight: (::Integer, =nothing) plot height\nslider: (::Bool, =true) boolean to indicate whether to display a slider\nshow_sim_blocks: (::Bool, =false) boolean to indicate whether to display sequence blocks\ndarkmode: (::Bool, =false) boolean to indicate whether to display darkmode style\nrange: (::Vector{Real}, =[]) time range to be displayed initially\n\nReturns\n\np: (::PlotlyJS.SyncPlot) plot of the raw signal\n\nExamples\n\njulia> seq_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/5.koma_paper/comparison_accuracy/sequences/EPI/epi_100x100_TE100_FOV230.seq\");\n\njulia> sys, obj, seq = Scanner(), brain_phantom2D(), read_seq(seq_file)\n\njulia> raw = simulate(obj, seq, sys)\n\njulia> plot_signal(raw)\n\n\n\n\n\n","category":"function"},{"location":"reference/5-koma-plots/#Plotting-images","page":"KomaMRIPlots","title":"Plotting images","text":"","category":"section"},{"location":"reference/5-koma-plots/","page":"KomaMRIPlots","title":"KomaMRIPlots","text":"plot_image","category":"page"},{"location":"reference/5-koma-plots/#KomaMRIPlots.plot_image","page":"KomaMRIPlots","title":"KomaMRIPlots.plot_image","text":"p = plot_image(image; height, width, zmin, zmax, darkmode, title)\n\nPlots an image matrix.\n\nArguments\n\nimage: (::Matrix{Number}) image matrix\n\nKeywords\n\nwidth: (::Integer, =nothing) plot width\nheight: (::Integer, =nothing) plot height\nzmin: (::Real, =minimum(abs.(image[:]))) reference value for minimum color\nzmax: (::Real, =maximum(abs.(image[:]))) reference value for maximum color\ndarkmode: (::Bool, =false) boolean to indicate whether to display darkmode style\ntitle: (::String, =\"\") plot title\n\nReturns\n\np: (::PlotlyJS.SyncPlot) plot of the image matrix\n\n\n\n\n\n","category":"function"},{"location":"reference/5-koma-plots/#Others","page":"KomaMRIPlots","title":"Others","text":"","category":"section"},{"location":"reference/5-koma-plots/","page":"KomaMRIPlots","title":"KomaMRIPlots","text":"plot_dict","category":"page"},{"location":"reference/5-koma-plots/#KomaMRIPlots.plot_dict","page":"KomaMRIPlots","title":"KomaMRIPlots.plot_dict","text":"str = plot_dict(dict::Dict)\n\nGenerates an HTML table based on the dictionary dict.\n\nArguments\n\ndict: (::Dict) dictionary\n\nReturns\n\nstr: (::String) dictionary as an HTML table\n\n\n\n\n\n","category":"function"},{"location":"explanation/3-simulation/#Simulation","page":"Simulation","title":"Simulation","text":"","category":"section"},{"location":"explanation/3-simulation/#General-Overview","page":"Simulation","title":"General Overview","text":"","category":"section"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"KomaMRI simulates the magnetization of each spin of a Phantom for variable magnetic fields given by a Sequence. It is assumed that a single spin is independent of the state of the other spins in the system (a key feature that enables parallelization). Furthermore, there are defined two regimes in the Sequence: excitation and precession. During the latter, the excitation fields are nulled and are useful for simplifying some physical equations.","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"The are more internal considerations in the KomaMRI implementation. The Figure 1 summarizes the functions called to perform the simulation.","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"
","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"Figure 1: The sequence seq is discretized after calculating the required time points in the wrapper function simulate. The time points are then divided into Nblocks to reduce the amount of memory used. The phantom obj is divided into Nthreads, and KomaMRI will use either run_spin_excitation! or run_spin_precession! depending on the regime. If an ADC object is present, the simulator will add the signal contributions of each thread to construct the acquired signal sig[t]. All the parameters: Nthreads, Nblocks, Δt_rf, and Δt, are passed through a dictionary called sim_params as an optional parameter of the simulate function.","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"From the programming perspective, it is needed to call the simulate function with the sim_params dictionary keyword argument. A user can change the values of the following keys:","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"Parameter Description\n\"return_type\" defines the output of the simulate function. Possible values are \"raw\", \"mat\", and \"state\", corresponding to outputting a MRIReco RawAcquisitionData, the signal values, and the last magnetization state of the simulation, respectively.\n\"sim_method\" defines the type of simulation. The default value is Bloch(), but you can alternatively use the BlochDict() simulation method. Moreover, you have the flexibility to create your own methods without altering the KomaMRI source code; for further details, refer to the Simulation Method Extensibility section.\n\"Δt\" raster time for gradients.\n\"Δt_rf\" raster time for RFs.\n\"precision\" defines the floating-point simulation precision. You can choose between \"f32\" and \"f64\" to use Float32 and Float64 primitive types, respectively. It's important to note that, especially for GPU operations, using \"f32\" is generally much faster.\n\"Nblocks\" divides the simulation into a specified number of time blocks. This parameter is designed to conserve RAM resources, as KomaMRI computes a series of simulations consecutively, each with the specified number of blocks determined by the value of \"Nblocks\".\n\"Nthreads\" divides the Phantom into a specified number of threads. Because spins are modeled independently of each other, KomaMRI can solve simulations in parallel threads, speeding up the execution time.\n\"gpu\" is a boolean that determines whether to use GPU or CPU hardware resources, as long as they are available on the host computer.\n\"gpu_device\" sets the index ID of the available GPU in the host computer.","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"For instance, if you want to perform a simulation on the CPU with float64 precision using the BlochDict() method (assuming you have already defined obj and seq), you can do so like this:","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"# Set non-default simulation parameters and run simulation\nsim_params = KomaMRICore.default_sim_params() \nsim_params[\"gpu\"] = false\nsim_params[\"precision\"] = \"f64\"\nsim_params[\"sim_method\"] = BlochDict()\nraw = simulate(obj, seq, sys; sim_params)","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"Additionally, the user must be aware of the functions run_spin_excitation! and run_spin_precession! which defines the algorithm for excitation and precession regimes respectively and can be changed by the user without modifying the source code (more details at Simulation Method Extensibility).","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"Previous simulation, the Sequence is discretized to consider specific time points which are critical for simulation. The user can control the time between intermediate gradient samples with the parameter Δt. Similarly, the parameter Δt_rf manages the time between RF samples, and can be relatively large for 2D imaging where the slice profile is less relevant.","category":"page"},{"location":"explanation/3-simulation/#Computation-Efficiency","page":"Simulation","title":"Computation Efficiency","text":"","category":"section"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"To reduce the memory usage of our simulator, we subdivided time into Nblocks. KomaMRI classifies each block in either the excitation regime or the precession regime before the simulation.","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"We increased the simulation speed by separating the calculations into Nthreads and then performing the GPU parallel operations with CUDA.jl . This separation is possible as all magnetization vectors are independent of one another.","category":"page"},{"location":"explanation/3-simulation/#Simulation-Method-Extensibility","page":"Simulation","title":"Simulation Method Extensibility","text":"","category":"section"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"In Julia, functions use different methods based on the input types via multiple dispatch. We used this to specialize the simulation functions for a given sim_method <:SimulationMethod specified in sim_params. For a given simulation method, the function initialize_spin_state outputs a variable Xt <: SpinStateRepresentation that is passed through the simulation (Figure 1). For the default simulation method Bloch, the spin state is of type Mag, but can be extended to a custom representation, like for example EPGs44 or others. Then, the functions run_spin_excitation! and run_spin_precession! can be described externally for custom types sim_method and Xt, extending Koma’s functionalities without the need of modifying the source code and taking advantage of all of Koma’s features.","category":"page"},{"location":"explanation/3-simulation/#Bloch-Simulation-Method","page":"Simulation","title":"Bloch Simulation Method","text":"","category":"section"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"This is the default simulation method used by KomaMRI, however it can always be specified by setting the sim_method = Bloch() entry of the sim_params dictionary. In the following subsection, we will explain the physical and mathematical background and some considerations and assumptions that enables to speed up the simulation.","category":"page"},{"location":"explanation/3-simulation/#Physical-and-Mathematical-Background","page":"Simulation","title":"Physical and Mathematical Background","text":"","category":"section"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"The Bloch method of KomaMRI simulates the magnetization of each spin by solving the Bloch equations in the rotating frame:","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"beginalign tag1\n\nfracmathrmd boldsymbolMmathrmd t =\n gamma boldsymbolM times boldsymbolB\n- fracM_x hatx + M_y hatyT_2\n- fracM_z hatx + M_0 hatyT_1 \n\nendalign","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"with gamma the gyromagnetic ratio, boldsymbolM = M_x M_y M_z^T the magnetization vector, and","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"boldsymbolB = B_1x(t) B_1y(t) boldsymbolG(t) cdot boldsymbolx + Delta omega(t)^T","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"the effective magnetic field. M_0 is the proton density, T_1 and T_2 are the relaxation times, and Delta omega is the off-resonance, for each position.","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"The Bloch Simulation Method also uses the technique of operator splitting to simplify the solution of Equation (1). This reflects mathematically the intuition of separating the Bloch equations in a rotation operator described by","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"beginalign tag2\n\nfracmathrmdmathrmdt boldsymbolM =\nbeginbmatrix\n 0 gamma B_z -gamma B_y \n-gamma B_z 0 gamma B_x \n gamma B_y -gamma B_x 0\nendbmatrix\nboldsymbolM \n\nendalign","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"and a relaxation operator described by","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"beginalign tag3\n\nfracmathrmdmathrmdt boldsymbolM =\nbeginbmatrix\n-tfrac1T_2 0 0 \n0 -tfrac1T_2 0 \n0 0 -tfrac1T_1\nendbmatrix\nboldsymbolM\n+\nbeginbmatrix\n0 \n0 \ntfracM_0T_1\nendbmatrix \n\nendalign","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"The evolution of the magnetization can then be described as a two-step process for each time step Delta t (Figure 2).","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"
\n\n \n Figure 2 : Solution of the Bloch equations for one time step can be described by (2) a rotation and (3) a relaxation step. \n \n
","category":"page"},{"location":"explanation/3-simulation/#Bloch()-Method-Example","page":"Simulation","title":"Bloch() Method Example","text":"","category":"section"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"We will consider an RF pulse that excites a phantom with 3 spins, and then we acquire the data:","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"
View code ","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"# Import modules\nusing KomaMRI\n\n# Define sequence\nampRF = 2e-6 # 2 uT RF amplitude\ndurRF = π / 2 / (2π * γ * ampRF) # required duration for a 90 deg RF pulse\nexc = RF(ampRF, durRF)\n\nnADC = 8192 # number of acquisition samples\ndurADC = 4000e-3 # duration of the acquisition\ndelay = 1e-3 # small delay\nacq = ADC(nADC, durADC, delay)\n\nseq = Sequence() # empty sequence\nseq += exc # adding RF-only block\nseq += acq # adding ADC-only block","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"julia> obj = Phantom(x=[-0.5e-3; 0.0; 0.5e-3], T1=[1000e-3; 2000e-3; 500e-3], T2=[500e-3; 1000e-3; 2000e-3]);","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"julia> plot_seq(seq; slider=false)","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"
","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"The resulting signal from the Bloch() method is the sum of magnetizations in the transverse plane (x, y):","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"# Configure Bloch() simulation method and run simulation\nsim_params = KomaMRICore.default_sim_params()\nsim_params[\"return_type\"] = \"mat\"\nsim_params[\"sim_method\"] = Bloch()\nsig = simulate(obj, seq, sys; sim_params)","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"julia> plot(abs.(sig[:,1,1]))","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"
","category":"page"},{"location":"explanation/3-simulation/#BlochDict-Simulation-Method","page":"Simulation","title":"BlochDict Simulation Method","text":"","category":"section"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"This is another simulation method defined in the source code of KomaMRI. You can specify it by setting the sim_method = BlochDict() entry in the sim_params dictionary. Additionally, it offers the option to save the resulting signal in the z-component by using sim_method = BlochDict(save_Mz=true). This method allows you to store the magnetizations of all spins in both the transverse plane (x, y) and the longitudinal axis (z) if specified.","category":"page"},{"location":"explanation/3-simulation/#BlochDict()-Method-Example","page":"Simulation","title":"BlochDict() Method Example","text":"","category":"section"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"We are going to consider the same setup as in the Bloch() Method Example. This includes the same excitation, acquisition, and the same 3-spin phantom:","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"
View code ","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"# Import modules\nusing KomaMRI, PlotlyJS\n\n# Define sequence\nampRF = 2e-6 # 2 uT RF amplitude\ndurRF = π / 2 / (2π * γ * ampRF) # required duration for a 90 deg RF pulse\nexc = RF(ampRF, durRF)\n\nnADC = 8192 # number of acquisition samples\ndurADC = 4000e-3 # duration of the acquisition\ndelay = 1e-3 # small delay\nacq = ADC(nADC, durADC, delay)\n\nseq = Sequence() # empty sequence\nseq += exc # adding RF-only block\nseq += acq # adding ADC-only block","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"julia> obj = Phantom(x=[-0.5e-3; 0.0; 0.5e-3], T1=[1000e-3; 2000e-3; 500e-3], T2=[500e-3; 1000e-3; 2000e-3]);","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"julia> plot_seq(seq; slider=false)","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"
","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"The resulting signal from the BlochDict() method comprises the individual magnetizations of all spins in both the transverse plane (x, y) and the longitudinal axis (z):","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"# Configure BlochDict() simulation method and run simulation\nsim_params = KomaMRICore.default_sim_params()\nsim_params[\"return_type\"] = \"mat\"\nsim_params[\"sim_method\"] = BlochDict(save_Mz=true)\nsig = simulate(obj, seq, sys; sim_params)\n\n# Define the plots for traverse and longitudinal magnetizations\npxy = plot(abs.(sig[:,:,1]));\npz = plot(abs.(sig[:,:,2]));","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"julia> [pxy pz]","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"
","category":"page"},{"location":"how-to/3-create-your-own-phantom/#Create-Your-Own-Phantom","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"","category":"section"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"In this section, we will create a custom Phantom struct. While the example is presented in 2D, the concepts discussed here can be readily extended to 3D phantoms.","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"In KomaMRI, the creation of a Phantom struct involves defining spin position arrays (x, y, z) and spin property arrays. The indices of these arrays are then associated with independent spins.","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"For instance, you can create a Phantom with one spin like so:","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"# Define arrays of positions (spin at zero position)\nx = [0.0]\ny = [0.0]\nz = [0.0]\n\n# Define arrays of properties (for CSF tissue)\nρ = [1.0]\nT1 = [2.569]\nT2 = [0.329]\nT2s = [0.058]\n\n# Define the phantom\nspin = Phantom(name=\"spin\", x=x, y=y, z=z, ρ=ρ, T1=T1, T2=T2, T2s=T2s)","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"Phantom{Float64}\n name: String \"spin\"\n x: Array{Float64}((1,)) [0.0]\n y: Array{Float64}((1,)) [0.0]\n z: Array{Float64}((1,)) [0.0]\n ρ: Array{Float64}((1,)) [1.0]\n T1: Array{Float64}((1,)) [2.569]\n T2: Array{Float64}((1,)) [0.329]\n T2s: Array{Float64}((1,)) [0.058]\n Δw: Array{Float64}((1,)) [0.0]\n Dλ1: Array{Float64}((1,)) [0.0]\n Dλ2: Array{Float64}((1,)) [0.0]\n Dθ: Array{Float64}((1,)) [0.0]\n ux: #122 (function of type KomaMRICore.var\"#122#136\")\n uy: #123 (function of type KomaMRICore.var\"#123#137\")\n uz: #124 (function of type KomaMRICore.var\"#124#138\")","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"You can add more properties to the Phantom, such as off-resonance, diffusion parameters, and even functions of motion. However, we won't be utilizing them (except for the off-resonance parameter) to maintain simplicity.","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"If you are familiar with the MRI world, you likely have a 2D or 3D array, where each element contains an ID number identifying a different class of tissue. In this setup, the array axes represent spatial positions, while the elements are used for tissue identification.","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"In this example, we will utilize a .mat file containing arrays with such arrangements. The file is readily available upon installing KomaMRI. Let's read the file and store the 2D data in an array called class:\"","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"# Import necessary modules\nusing KomaMRI, MAT\n\n# Get data from a .mat file\npath_koma = dirname(dirname(pathof(KomaMRI)))\npath_phantom_mat = joinpath(path_koma, \"KomaMRIBase\", \"src\", \"datatypes\", \"phantom\", \"pelvis2D.mat\")\ndata = MAT.matread(path_phantom_mat)\nclass = data[\"pelvis3D_slice\"]","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"You can visualize the tissue map using the plot_image function:","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"plot_image(class)","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"
","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"Let's define the position arrays. You need to know the distance between the spins in the original array (in this case, it is 0.5mm), and then you can determine all the positions like this (the z-component is not calculated since this is a 2D example):","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"# Define spin position arrays\nΔx = .5e-3 # 0.5mm\nM, N = size(class) # Number of spins in x and y\nFOVx = (M-1)*Δx # Field of view in x\nFOVy = (N-1)*Δx # Field of view in y\nx = -FOVx/2:Δx:FOVx/2 # x spin coordinates vector\ny = -FOVy/2:Δx:FOVy/2 # y spin coordinates vector\nx, y = x .+ y'*0, x*0 .+ y' # x and y grid points","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"Now, let's define the arrays for the properties. It's essential to have prior knowledge of the property values for different tissue classes. For example, for soft tissue, we use ρ = 0.9, T1 = 1200 * 1e-3, T2 = 80 * 1e-3, and T2s = 80 * 1e-3. Additionally, we create an array mask to identify the location of a tissue's ID. For soft tissue with ID = 153, the mask is (class .== 153). Finally, to obtain a property, sum all the masks with values for all tissue classes. This process is illustrated below: ","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"# Define the proton density array\nρ = (class.==102)*.86 .+ # Fat\n (class.==153)*.9 .+ # SoftTissue\n (class.==204)*.4 .+ # SpongyBone\n (class.==255)*.2 # CorticalBone\n\n# Define the T1 decay array\nT1 = (class.==102)*366 .+ # Fat\n (class.==153)*1200 .+ # SoftTissue\n (class.==204)*381 .+ # SpongyBone\n (class.==255)*100 # CorticalBone\n\n# Define the T2 decay array\nT2 = (class.==102)*70 .+ # Fat\n (class.==153)*80 .+ # SoftTissue\n (class.==204)*52 .+ # SpongyBone\n (class.==255)*.3 # CorticalBone\n\n# Define the T2s decay array\nT2s = (class.==102)*70 .+ # Fat\n (class.==153)*80 .+ # SoftTissue\n (class.==204)*52 .+ # SpongyBone\n (class.==255)*.3 # CorticalBone\n\n# Define off-resonance array\nΔw_fat = -220 * 2π\nΔw = (class.==102) * Δw_fat # FAT1\n\n# Adjust with scaling factor\nT1 = T1*1e-3\nT2 = T2*1e-3\nT2s = T2s*1e-3","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"Finally, we can invoke the Phantom constructor. However, before doing so, we choose not to store spins where the proton density is zero to avoid unnecessary data storage. This is achieved by applying the mask ρ.!=0 to the arrays. Additionally, please note that we set the z-position array filled with zeros.","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"# Define the phantom\nobj = Phantom{Float64}(\n name = \"custom-pelvis\",\n\tx = x[ρ.!=0],\n\ty = y[ρ.!=0],\n\tz = 0*x[ρ.!=0],\n\tρ = ρ[ρ.!=0],\n\tT1 = T1[ρ.!=0],\n\tT2 = T2[ρ.!=0],\n\tT2s = T2s[ρ.!=0],\n\tΔw = Δw[ρ.!=0],\n)","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"We can display the Phantom struct with the plot_phantom_map function. In this case we select the T1 decay to be displayed, but you can choose other property to be displayed:","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"plot_phantom_map(obj, :T1)","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"
","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"EditURL = \"lit-01-FID.jl\"","category":"page"},{"location":"tutorial/01-FID/#Free-Induction-Decay","page":"Free Induction Decay","title":"Free Induction Decay","text":"","category":"section"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"First of all, let's use the KomaMRI package and define the default scanner.","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"using KomaMRI\nsys = Scanner() # default hardware definition","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"The free induction decay is the simplest observable NMR signal. This signal is the one that follows a single tipping RF pulse. To recreate this experiment, we will need to define a Sequence with 2 blocks.","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"The first block containing an RF pulse with a flip-angle of 90 deg,","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"ampRF = 2e-6 # 2 uT RF amplitude\ndurRF = π / 2 / (2π * γ * ampRF) # required duration for a 90 deg RF pulse\nexc = RF(ampRF,durRF)","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"and the second block containing the ADC.","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"nADC = 8192 # number of acquisition samples\ndurADC = 250e-3 # duration of the acquisition\ndelay = 1e-3 # small delay\nacq = ADC(nADC, durADC, delay)","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"Finally, we concatenate the sequence blocks to create the final sequence.","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"seq = Sequence() # empty sequence\nseq += exc # adding RF-only block\nseq += acq # adding ADC-only block\np1 = plot_seq(seq; slider=false, height=300)\nsavefig(p1, \"../assets/1-seq.html\") # hide","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"
","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"Now, we will define a Phantom with a single spin at x=0 with T_1=1000mathrmms and T_2=100mathrmms.","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"obj = Phantom{Float64}(x=[0.], T1=[1000e-3], T2=[100e-3])","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"Finally, to simulate we will need to use the function simulate.","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"raw = simulate(obj, seq, sys)","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"To plot the results we will need to use the plot_signal function","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"p2 = plot_signal(raw; slider=false, height=300)\nsavefig(p2, \"../assets/1-signal.html\") # hide","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"
","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"Nice!, we can see that S(t) follows an exponential decay exp(-tT_2) as expected.","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"For a little bit of spiciness, let's add off-resonance to our example. We will use Delta f=-100mathrmHz. For this, we will need to add a definition for Δw in our Phantom","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"obj = Phantom{Float64}(x=[0.], T1=[1000e-3], T2=[100e-3], Δw=[-2π*100])# and simulate again.\n\nraw = simulate(obj, seq, sys)\np3 = plot_signal(raw; slider=false, height=300)\nsavefig(p3, \"../assets/1-signal2.html\") # hide","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"
","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"The signal now follows an exponential of the form exp(-tT_2)cdotexp(-iDeltaomega t). The addition of exp(-iDeltaomega t) to the signal will generate a shift in the image space (Fourier shifting property). This effect will be better visualized and explained in later examples.","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"This page was generated using Literate.jl.","category":"page"},{"location":"how-to/3-create-your-own-sequence/#Create-Your-Own-Sequence","page":"Create Your Own Sequence","title":"Create Your Own Sequence","text":"","category":"section"},{"location":"how-to/3-create-your-own-sequence/","page":"Create Your Own Sequence","title":"Create Your Own Sequence","text":"warning: Warning\nThis section is currently under construction, and some details on how to construct a Sequence may be missing.","category":"page"},{"location":"how-to/3-create-your-own-sequence/","page":"Create Your Own Sequence","title":"Create Your Own Sequence","text":"This is an example of how to create a Sequence struct:","category":"page"},{"location":"how-to/3-create-your-own-sequence/","page":"Create Your Own Sequence","title":"Create Your Own Sequence","text":"# Export necessary modules\nusing KomaMRI\n\n# Create the function that creates a phantom\nfunction sequence_example(FOV::Real, N::Integer)\n\n # Define initial paramters (TODO: consider when N is even)\n sys = Scanner()\n\tΔt = sys.ADC_Δt\n\tGmax = sys.Gmax\n\tNx = Ny = N #Square acquisition\n\tΔx = FOV/(Nx-1)\n\tTa = Δt*(Nx-1) #4-8 us\n Δτ = Ta/(Ny-1)\n\tGa = 1/(γ*Δt*FOV)\n\tζ = Ga / sys.Smax\n\tGa ≥ sys.Gmax ? error(\"Ga=$(Ga*1e3) mT/m exceeds Gmax=$(Gmax*1e3) mT/m, increase Δt to at least Δt_min=\"\n\t*string(round(1/(γ*Gmax*FOV),digits=2))*\" us.\") : 0\n\tϵ1 = Δτ/(Δτ+ζ)\n\n\t# EPI base\n\tEPI = Sequence(vcat(\n\t [mod(i,2)==0 ? Grad(Ga*(-1)^(i/2),Ta,ζ) : Grad(0.,Δτ,ζ) for i=0:2*Ny-2], #Gx\n\t \t[mod(i,2)==1 ? ϵ1*Grad(Ga,Δτ,ζ) : Grad(0.,Ta,ζ) for i=0:2*Ny-2])) #Gy\n\tEPI.ADC = [mod(i,2)==1 ? ADC(0,Δτ,ζ) : ADC(N,Ta,ζ) for i=0:2*Ny-2]\n\n\t# Pre-wind and wind gradients\n\tϵ2 = Ta/(Ta+ζ)\n PHASE = Sequence(reshape(1/2*[Grad( -Ga, Ta, ζ); ϵ2*Grad(-Ga, Ta, ζ)],:,1)) # This needs to be calculated differently\n\tDEPHASE = Sequence(reshape(1/2*[Grad((-1)^N*Ga, Ta, ζ); ϵ2*Grad(-Ga, Ta, ζ)],:,1)) # for even N\n\tseq = PHASE + EPI + DEPHASE\n\n\t# Saving parameters\n\tseq.DEF = Dict(\"Nx\"=>Nx,\"Ny\"=>Ny,\"Nz\"=>1,\"Name\"=>\"epi\")\n\n # Return the sequence\n\treturn seq\nend\n\n# Call the function to create a sequence\nFOV, N = 23e-2, 101\nseq = sequence_example(FOV, N)\n\n# Plot the sequence in time and its kspace\nplot_seq(seq; range=[0 30])\nplot_kspace(seq)","category":"page"},{"location":"how-to/3-create-your-own-sequence/","page":"Create Your Own Sequence","title":"Create Your Own Sequence","text":"
","category":"page"},{"location":"reference/3-koma-core/#KomaMRICore","page":"KomaMRICore","title":"KomaMRICore","text":"","category":"section"},{"location":"reference/3-koma-core/","page":"KomaMRICore","title":"KomaMRICore","text":"CurrentModule = KomaMRICore","category":"page"},{"location":"reference/3-koma-core/#Simulation-functions","page":"KomaMRICore","title":"Simulation functions","text":"","category":"section"},{"location":"reference/3-koma-core/","page":"KomaMRICore","title":"KomaMRICore","text":"simulate\nsimulate_slice_profile\ndefault_sim_params","category":"page"},{"location":"reference/3-koma-core/#KomaMRICore.simulate","page":"KomaMRICore","title":"KomaMRICore.simulate","text":"out = simulate(obj::Phantom, seq::Sequence, sys::Scanner; sim_params, w)\n\nReturns the raw signal or the last state of the magnetization according to the value of the \"return_type\" key of the sim_params dictionary. \n\nThis is a wrapper function to run_sim_time_iter, which converts the inputs to the appropriate types and discretizes the sequence before simulation. The reported simulation time only considers run_sim_time_iter, as the preprocessing duration should be negligible compared to the simulation time (if this is not the case, please file a bug report). \n\nArguments\n\nobj: (::Phantom) Phantom struct\nseq: (::Sequence) Sequence struct\nsys: (::Scanner) Scanner struct\n\nKeywords\n\nsim_params: (::Dict{String,Any}, =Dict{String,Any}()) simulation parameter dictionary\nw: (::Blink.AtomShell.Window, =nothing) the window within which to display a progress bar in the Blink Window UI. If this variable is anything other than 'nothing', the progress bar will be considered\n\nReturns\n\nout: (::Vector{Complex} or ::SpinStateRepresentation or ::RawAcquisitionData) depending on whether \"return_type\" is \"mat\", \"state\" or \"raw\" (default), respectively\n\nExamples\n\njulia> seq_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/5.koma_paper/comparison_accuracy/sequences/EPI/epi_100x100_TE100_FOV230.seq\");\n\njulia> sys, obj, seq = Scanner(), brain_phantom2D(), read_seq(seq_file)\n\njulia> raw = simulate(obj, seq, sys)\n\njulia> plot_signal(raw)\n\n\n\n\n\n","category":"function"},{"location":"reference/3-koma-core/#KomaMRICore.simulate_slice_profile","page":"KomaMRICore","title":"KomaMRICore.simulate_slice_profile","text":"mag = simulate_slice_profile(seq; z, sim_params)\n\nReturns magnetization of spins distributed along z after running the Sequence struct.\n\nArguments\n\nseq: (::Sequence) Sequence struct\n\nKeywords\n\nz: (=range(-2e-2,2e-2,200)) range for the z axis\nsim_params: (::Dict{String, Any}, =Dict{String,Any}(\"Δt_rf\"=>1e-6)) dictionary with simulation parameters\n\nReturns\n\nmag: (::SpinStateRepresentation) final state of the magnetization vector\n\n\n\n\n\n","category":"function"},{"location":"reference/3-koma-core/#KomaMRICore.default_sim_params","page":"KomaMRICore","title":"KomaMRICore.default_sim_params","text":"sim_params = default_sim_params(sim_params=Dict{String,Any}())\n\nThis function returns a dictionary containing default simulation parameters while also allowing the user to define some of them.\n\nArguments\n\nsim_params: (::Dict{String,Any}, =Dict{String,Any}()) user-defined dictionary with simulation parameters. The following lists its keys along with their possible values:\n\"return_type\": defines the output of the simulate function. Possible values are \"raw\", \"mat\", and \"state\", corresponding to outputting a MRIReco RawAcquisitionData, the signal values, and the last magnetization state of the simulation, respectively\n\"sim_method\": defines the type of simulation. The default value is Bloch(), but you can alternatively use the BlochDict() simulation method. Moreover, you have the flexibility to create your own methods without altering the KomaMRI source code\n\"Δt\": raster time for gradients\n\"Δt_rf\": raster time for RFs\n\"precision\": defines the floating-point simulation precision. You can choose between \"f32\" and \"f64\" to use Float32 and Float64 primitive types, respectively. It's important to note that, especially for GPU operations, using \"f32\" is generally much faster\n\"Nblocks\": divides the simulation into a specified number of time blocks. This parameter is designed to conserve RAM resources, as KomaMRI computes a series of simulations consecutively, each with the specified number of blocks determined by the value of \"Nblocks\"\n\"Nthreads\": divides the Phantom into a specified number of threads. Because spins are modeled independently of each other, KomaMRI can solve simulations in parallel threads, speeding up the execution time\n\"gpu\": is a boolean that determines whether to use GPU or CPU hardware resources, as long as they are available on the host computer\n\"gpu_device\": default value is 'nothing'. If set to integer or device instance, calls the corresponding function to set the device of the available GPU in the host computer (e.g. CUDA.device!)\n\nReturns\n\nsim_params: (::Dict{String,Any}) dictionary with simulation parameters\n\n\n\n\n\n","category":"function"},{"location":"reference/3-koma-core/#GPU-helper-functions","page":"KomaMRICore","title":"GPU helper functions","text":"","category":"section"},{"location":"reference/3-koma-core/","page":"KomaMRICore","title":"KomaMRICore","text":"get_backend\nprint_devices\ngpu\ncpu\nf32\nf64","category":"page"},{"location":"reference/3-koma-core/#KomaMRICore.get_backend","page":"KomaMRICore","title":"KomaMRICore.get_backend","text":"get_backend(use_gpu)\n\nGets the simulation backend to use. If use_gpu=false or there are no available GPU backends, returns CPU(), else, returns the GPU backend (currently either CUDABackend(), MetalBackend(), ROCBackend(), or oneAPIBackend()).\n\nThe GPU package for the corresponding backend (CUDA.jl, Metal.jl, AMDGPU.jl, or oneAPI.jl) must be loaded and functional, otherwise KomaMRI will default to using the CPU.\n\nArguments\n\n'use_gpu': ('::Bool') If true, attempt to use GPU and check for available backends\n\nReturns\n\n'backend': (::KernelAbstractions.backend) The backend to use\n\n\n\n\n\n","category":"function"},{"location":"reference/3-koma-core/#KomaMRICore.print_devices","page":"KomaMRICore","title":"KomaMRICore.print_devices","text":"print_devices()\n\nSimple function to print available devices. Calls internal get_backend() function to get the appropriate GPU / CPU backend and prints device information.\n\nArguments\n\n'use_gpu': ('::Bool') If true, check for loaded / functional GPU backends and print appropriate warnings if no GPU backends have been loaded\n\n\n\n\n\n","category":"function"},{"location":"reference/3-koma-core/#KomaMRICore.gpu","page":"KomaMRICore","title":"KomaMRICore.gpu","text":"gpu(x)\n\nMoves 'x' to the GPU. For this function to work, a GPU backend will need to be loaded with 'using AMDGPU / CUDA / Metal / oneAPI.\n\nThis works for functions, and any struct marked with @functor.\n\nUse cpu to copy back to ordinary Arrays.\n\nSee also f32 and f64 to change element type only.\n\nExamples\n\nusing CUDA\nx = x |> gpu\n\n\n\n\n\ngpu(x, backend)\n\nTries to move x to the GPU backend specified in the 'backend' parameter. \n\nThis works for functions, and any struct marked with @functor.\n\nUse cpu to copy back to ordinary Arrays.\n\nSee also f32 and f64 to change element type only.\n\nExamples\n\nx = gpu(x, CUDABackend())\n\n\n\n\n\n","category":"function"},{"location":"reference/3-koma-core/#KomaMRICore.cpu","page":"KomaMRICore","title":"KomaMRICore.cpu","text":"cpu(x)\n\nTries to move object to CPU. This works for functions, and any struct marked with @functor.\n\nSee also gpu.\n\nExamples\n\nx = x |> cpu\n\n\n\n\n\n","category":"function"},{"location":"reference/3-koma-core/#KomaMRICore.f32","page":"KomaMRICore","title":"KomaMRICore.f32","text":"f32(m)\n\nConverts the eltype of model's parameters to Float32 Recurses into structs marked with @functor.\n\nSee also f64.\n\n\n\n\n\n","category":"function"},{"location":"reference/3-koma-core/#KomaMRICore.f64","page":"KomaMRICore","title":"KomaMRICore.f64","text":"f64(m)\n\nConverts the eltype of model's parameters to Float64 (which is Koma's default).. Recurses into structs marked with @functor.\n\nSee also f32.\n\n\n\n\n\n","category":"function"},{"location":"reference/3-koma-core/#Signal-to-RawAquisitionData-(MRD)","page":"KomaMRICore","title":"Signal to RawAquisitionData (MRD)","text":"","category":"section"},{"location":"reference/3-koma-core/","page":"KomaMRICore","title":"KomaMRICore","text":"signal_to_raw_data","category":"page"},{"location":"reference/3-koma-core/#KomaMRICore.signal_to_raw_data","page":"KomaMRICore","title":"KomaMRICore.signal_to_raw_data","text":"raw = signal_to_raw_data(signal, seq; phantom_name, sys, sim_params)\n\nTransforms the raw signal into a RawAcquisitionData struct (nearly equivalent to the ISMRMRD format) used for reconstruction with MRIReco.\n\nArguments\n\nsignal: (::Matrix{Complex}) raw signal matrix\nseq: (::Sequence) Sequence struct\n\nKeywords\n\nphantom_name: (::String, =\"Phantom\") phantom name\nsys: (::Scanner, =Scanner()) Scanner struct\nsim_params: (::Dict{String, Any}, =Dict{String,Any}()) simulation parameter dictionary\n\nReturns\n\nraw: (::RawAcquisitionData) RawAcquisitionData struct\n\nExamples\n\njulia> seq_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/1.sequences/epi_se.seq\")\n\njulia> sys, obj, seq = Scanner(), brain_phantom2D(), read_seq(seq_file)\n\njulia> sim_params = KomaMRICore.default_sim_params(); sim_params[\"return_type\"] = \"mat\"\n\njulia> signal = simulate(obj, seq, sys; sim_params)\n\njulia> raw = signal_to_raw_data(signal, seq)\n\njulia> plot_signal(raw)\n\n\n\n\n\n","category":"function"},{"location":"reference/3-koma-core/#SpinRepresentationState's","page":"KomaMRICore","title":"SpinRepresentationState's","text":"","category":"section"},{"location":"reference/3-koma-core/","page":"KomaMRICore","title":"KomaMRICore","text":"Mag","category":"page"},{"location":"reference/3-koma-core/#KomaMRICore.Mag","page":"KomaMRICore","title":"KomaMRICore.Mag","text":"mag = Mag(xy::Complex, z::Real)\n\nThe Magnetization struct.\n\nArguments\n\nxy: (::Complex{Float64}) magnetization of a spin in the xy plane\nz: (::Real) magnetization of a spin in the z plane\n\nReturns\n\nmag: (::Mag) Magnetization struct\n\n\n\n\n\n","category":"type"},{"location":"reference/3-koma-core/#Spinor-rotation-matrix-(RF-excitation)","page":"KomaMRICore","title":"Spinor rotation matrix (RF excitation)","text":"","category":"section"},{"location":"reference/3-koma-core/","page":"KomaMRICore","title":"KomaMRICore","text":"Spinor\nQ\nUn\nRx\nRy\nRz","category":"page"},{"location":"reference/3-koma-core/#KomaMRICore.Spinor","page":"KomaMRICore","title":"KomaMRICore.Spinor","text":"spinor = Spinor(α, β)\n\nSpinor(α, β) with Cayley-Klein parameters α and β. Based on \"Introduction to the Shinnar-Le Roux algorithm\", Patrick Le Roux (1995). A spinor is a way to represent 3D rotations, the underlying representation is a 2 X 2 complex unitary matrix (alphabetainmathbbC):\n\nR=leftbeginarraycc\nalpha -beta^*\nbeta alpha^*\nendarrayright\n\nwith alpha^2+beta^2 = 1.\n\nThis later operates on the 2times2 representation of (xyz) as follows V^+ = R V R^*.\n\nArguments\n\nα: (::Complex{Float64}) Cayley-Klein parameter α\nβ: (::Complex{Float64}) Cayley-Klein parameter β\n\nReturns\n\nspinor: (::Spinor) Spinor struct\n\n\n\n\n\n","category":"type"},{"location":"reference/3-koma-core/#KomaMRICore.Q","page":"KomaMRICore","title":"KomaMRICore.Q","text":"s = Q(φ, nxy, nz)\n\nSpinor rotation matrix. Counter-clockwise rotation of φ with respect to the axis of rotation n=(nx, ny, nz).\n\nPauly, J., Le Roux, P., Nishimura, D., & Macovski, A. (1991). Parameter relations for the Shinnar-Le Roux selective excitation pulse design algorithm (NMR imaging). IEEE Transactions on Medical Imaging, 10(1), 53-65. doi:10.1109/42.75611\n\nvarphi=-gammaDelta tsqrtleftB_1right^2+left(boldsymbolGcdotboldsymbolx\nright)^2=-gammaDelta tleftVert boldsymbolBrightVert\n\nboldsymboln=boldsymbolBleftVert boldsymbolBrightVert\n\nArguments\n\nφ: (::Real, [rad]) φ angle\nnxy: (::Real) nxy factor\nnz: (::Real) nz factor\n\nReturns\n\ns: (::Spinor) spinnor struct that represents the Q rotation matrix\n\n\n\n\n\n","category":"function"},{"location":"reference/3-koma-core/#KomaMRICore.Un","page":"KomaMRICore","title":"KomaMRICore.Un","text":"Rodrigues' formula: Rotation matrix that when applied rotates with respect to \"n\" in an angle θ anti clock-wise\n\n\n\n\n\n","category":"function"},{"location":"reference/3-koma-core/#KomaMRICore.Rx","page":"KomaMRICore","title":"KomaMRICore.Rx","text":"s = Rx(θ)\n\nSpinor counter-clockwise rotation matrix with angle θ with respect to x-axis.\n\nArguments\n\nθ: (::Real, [rad]) angle with respect to x-axis\n\nReturns\n\ns: (::Spinor) spinor struct that represents the Rx rotation matrix\n\n\n\n\n\n","category":"function"},{"location":"reference/3-koma-core/#KomaMRICore.Ry","page":"KomaMRICore","title":"KomaMRICore.Ry","text":"s = Ry(θ)\n\nSpinor counter-clockwise rotation matrix with angle θ with respect to y-axis.\n\nArguments\n\nθ: (::Real, [rad]) angle with respect to y-axis\n\nReturns\n\ns: (::Spinor) spinor struct that represents the Ry rotation matrix\n\n\n\n\n\n","category":"function"},{"location":"reference/3-koma-core/#KomaMRICore.Rz","page":"KomaMRICore","title":"KomaMRICore.Rz","text":"s = Rz(φ)\n\nSpinor counter-clockwise rotation matrix with angle φ with respect to z-axis.\n\nArguments\n\nφ: (::Real, [rad]) angle with respect to z-axis\n\nReturns\n\ns: (::Spinor) spinnor struct that represents the Rz rotation matrix\n\n\n\n\n\n","category":"function"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"EditURL = \"lit-02-SmallTipApproximation.jl\"","category":"page"},{"location":"tutorial/02-SmallTipApproximation/#Small-Tip-Angle-Approximation","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"","category":"section"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"Based on the results in page 41 of the book \"Handbook of MRI Pulse Sequences\" by Bernstein et al.","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"using KomaMRI # hide\nsys = Scanner() # hide\nsys.Smax = 50 # hide","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"In this example, we will showcase a common approximation in MRI, the small tip angle approximation. For this, we will simulate a slice profile for spins with positions zin-22mathrmcm and with a gradient G_z so their frequencies are mapped to fin-55mathrmkHz. To start, we define an RF pulse with a flip angle of 30 deg and pulse duration of T_mathrmrf=32mathrmms.","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"B1 = 4.92e-6\nTrf = 3.2e-3\nzmax = 2e-2\nfmax = 5e3\nz = range(-zmax, zmax, 400)\nGz = fmax / (γ * zmax)\nf = γ * Gz * z # hide","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"The designed RF pulse is presented in the figure below, where the additional gradient refocuses the spins' phase after the excitation.","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"seq = PulseDesigner.RF_sinc(B1, Trf, sys; G=[0;0;Gz], TBP=8)\np2 = plot_seq(seq; max_rf_samples=Inf, slider=false)\nsavefig(p2, \"../assets/42-seq.html\") # hide","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"
","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"Now we will perform the simulation using the function simulate_slice_profile. Note that we modified Δt_rf in sim_params to match the resolution of the waveform.","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"sim_params = Dict{String, Any}(\"Δt_rf\" => Trf / length(seq.RF.A[1]))\nM = simulate_slice_profile(seq; z, sim_params)\n\nusing PlotlyJS # hide\ns1 = scatter(x=f, y=real.(M.xy), name=\"Mx\") # hide\ns2 = scatter(x=f, y=imag.(M.xy), name=\"My\") # hide\ndat = seq.RF.A[1] # hide\nN = length(dat) # hide\ndat_pad = [zeros(floor(Int64,N)); dat; zeros(floor(Int64,N))] # hide\nN_pad = length(dat_pad) # hide\nU = 1 / (Trf) * N / N_pad #hide\nu = range(0, (N_pad - 1) * U; step=U) # hide\nu = u .- maximum(u) / 2 .- U/2 # hide\nFT_dat_pad = abs.(KomaMRI.fftc(dat_pad; dims=1)) # hide\nscale_factor = maximum(abs.(M.xy)) / maximum(FT_dat_pad) # hide\ns3 = scatter(x=u, y=FT_dat_pad*scale_factor, name=\"|FT(B₁(t))|\", line=attr(dash=\"dash\")) # hide\npb = plot([s1,s2,s3], Layout(title=\"30 deg SINC pulse (TBP=8, Hamming)\", xaxis_title=\"Frequency [Hz]\", xaxis_range=[-fmax,fmax])) # hide\nsavefig(pb, \"../assets/4b-profile.html\") # hide","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"This produces the following slice profile:","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"
","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"As you can see, for a flip angle of 30 deg, the slice profile is very close to the small tip angle approximation (the Fourier transform of B_1(t)).","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"But what will happen if we use a flip angle of 120 deg instead?","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"α_desired = 120 + 0im # The multiplication of a complex number scales the RF pulse of a Sequence\nα = get_flip_angles(seq)[1] # Previous FA approx 30 deg\nseq = (α_desired / α) * seq # Scaling the pulse to have a flip angle of 120\nM = simulate_slice_profile(seq; z, sim_params)\n\ns1 = scatter(x=f, y=abs.(M.xy), name=\"|Mxy|\") # hide\ndat = seq.RF.A[1] # hide\nN = length(dat) # hide\ndat_pad = [zeros(floor(Int64,N)); dat; zeros(floor(Int64,N))] # hide\nN_pad = length(dat_pad) # hide\nU = 1 / (Trf) * N / N_pad #hide\nu = range(0, (N_pad - 1) * U; step=U) # hide\nu = u .- maximum(u) / 2 .- U/2 # hide\nFT_dat_pad = abs.(KomaMRI.fftc(dat_pad; dims=1)) # hide\nscale_factor = maximum(abs.(M.xy)) / maximum(FT_dat_pad) # hide\ns2 = scatter(x=u, y=FT_dat_pad*scale_factor, name=\"|FT(B₁(t))|\", line=attr(dash=\"dash\")) # hide\npa = plot([s1,s2], Layout(title=\"120 deg SINC pulse (TBP=8, Hamming)\", xaxis_title=\"Frequency [Hz]\", xaxis_range=[-fmax,fmax])) # hide\nsavefig(pa, \"../assets/4a-profile.html\") # hide","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"
","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"For this case, the small tip angle approximation breaks 😢, thus, the reason for its name!","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"This basic sinc pulse is not designed to be B_1-insensitive. Some adiabatic RF pulses have been proposed to achieve this. Watch out for a future example showing these adiabatic RF pulses 👀.","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"This page was generated using Literate.jl.","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"EditURL = \"lit-05-SimpleMotion.jl\"","category":"page"},{"location":"tutorial/05-SimpleMotion/#Patient's-Motion-During-Acquisition","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"","category":"section"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"using KomaMRI # hide\nusing PlotlyJS # hide\nsys = Scanner() # hide","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"It can also be interesting to see the effect of the patient's motion during an MRI scan. For this, Koma provides the ability to add motion <: AbstractMotion to the phantom. In this tutorial, we will show how to add a Translate motion to a 2D brain phantom.","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"First, let's load the 2D brain phantom used in the previous tutorials:","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"obj = brain_phantom2D()\nobj.Δw .= 0 # hide","category":"page"},{"location":"tutorial/05-SimpleMotion/#Head-Translation","page":"Patient's Motion During Acquisition","title":"Head Translation","text":"","category":"section"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"In this example, we will add a Translate of 2 cm in x, with duration of 200 ms (v = 0.1 m/s):","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"obj.motion = MotionList(\n Translate(2e-2, 0.0, 0.0, TimeRange(t_start=0.0, t_end=200e-3))\n)\np1 = plot_phantom_map(obj, :T2 ; height=450, time_samples=4) # hide\n\nsavefig(p1, \"../assets/5-phantom1.html\") # hide","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"
","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"# Read Sequence # hide\nseq_file1 = joinpath(dirname(pathof(KomaMRI)), \"../examples/5.koma_paper/comparison_accuracy/sequences/EPI/epi_100x100_TE100_FOV230.seq\") # hide\nseq1 = read_seq(seq_file1) # hide\n\n# Simulate # hide\nraw1 = simulate(obj, seq1, sys) # hide\n\n# Recon # hide\nacq1 = AcquisitionData(raw1) # hide\nacq1.traj[1].circular = false # hide\nNx, Ny = raw1.params[\"reconSize\"][1:2] # hide\nreconParams = Dict{Symbol,Any}(:reco=>\"direct\", :reconSize=>(Nx, Ny)) # hide\nimage1 = reconstruction(acq1, reconParams) # hide","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"If we simulate an EPI sequence with acquisition duration (183.989 ms) comparable with the motion's duration (200 ms), we will observe motion-induced artifacts in the reconstructed image.","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"# Plotting the recon # hide\np2 = plot_image(abs.(image1[:, :, 1]); height=400) # hide\nsavefig(p2, \"../assets/5-recon1.html\") # hide","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"
\n \n ","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"The severity of the artifacts can vary depending on the acquisition duration and k-space trajectory.","category":"page"},{"location":"tutorial/05-SimpleMotion/#Motion-Corrected-Reconstruction","page":"Patient's Motion During Acquisition","title":"Motion-Corrected Reconstruction","text":"","category":"section"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"To correct for the motion-induced artifacts we can perform a motion-corrected reconstruction. This can be achieved by multiplying each sample of the acquired signal S(t) by a phase shift Deltaphi_mathrmcorr proportional to the displacement boldsymbolu(t) [Godenschweger, 2016]:","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"S_mathrmMCleft(tright)=Sleft(tright)cdotmathrme^mathrmiDeltaphi_mathrmcorr=Sleft(tright)cdotmathrme^mathrmi2piboldsymbolkleft(tright)cdotboldsymboluleft(tright)","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"In practice, we would need to estimate or measure the motion before performing a motion-corrected reconstruction, but for this example, we will directly use the displacement functions boldsymbolu(boldsymbolx t) defined by obj.motion::MotionList. Since translations are rigid motions (boldsymbolu(boldsymbolx t)=boldsymbolu(t) no position dependence), we can obtain the required displacements by calculating boldsymbolu(boldsymbolx=boldsymbol0 t=t_mathrmadc).","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"sample_times = get_adc_sampling_times(seq1)\ndisplacements = hcat(get_spin_coords(obj.motion, [0.0], [0.0], [0.0], sample_times)...)\n\np3 = plot( # hide\n sample_times, # hide\n displacements .* 1e2, # hide\n Layout( # hide\n title = \"Head displacement in x, y and z\", # hide\n xaxis_title = \"time (s)\", # hide\n yaxis_title = \"Displacement (cm)\" # hide\n )) # hide\nrestyle!(p3,1:3, name=[\"ux(t)\", \"uy(t)\", \"uz(t)\"]) # hide\n\nsavefig(p3, \"../assets/5-displacements.html\") # hide","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"
","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"We can now get the necessary phase shift for each sample:","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"_, kspace = get_kspace(seq1)\nΔΦ = 2π*sum(kspace .* displacements, dims=2)","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"And apply it to the acquired signal to correct its phase:","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"acq1.kdata[1] .*= exp.(im*ΔΦ)\n\nimage2 = reconstruction(acq1, reconParams) # hide\n\np4 = plot_image(abs.(image2[:, :, 1]); height=400) # hide\n\nsavefig(p4, \"../assets/5-recon2.html\") # hide","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"Finally, we compare the original image ▶️ and the motion-corrected reconstruction ⏸️:","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"
","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"This page was generated using Literate.jl.","category":"page"},{"location":"reference/6-koma-mri/#KomaMRI","page":"KomaMRI","title":"KomaMRI","text":"","category":"section"},{"location":"reference/6-koma-mri/","page":"KomaMRI","title":"KomaMRI","text":"CurrentModule = KomaMRI","category":"page"},{"location":"reference/6-koma-mri/#User-Interface","page":"KomaMRI","title":"User Interface","text":"","category":"section"},{"location":"reference/6-koma-mri/","page":"KomaMRI","title":"KomaMRI","text":"KomaUI","category":"page"},{"location":"reference/6-koma-mri/#KomaMRI.KomaUI","page":"KomaMRI","title":"KomaMRI.KomaUI","text":"out = KomaUI(; kwargs...)\n\nLaunch the Koma's UI.\n\nKeywords\n\ndarkmode: (::Bool, =true) define dark mode style for the UI\nframe: (::Bool, =true) display the upper frame of the Blink window\nphantom_mode: (::String, =\"2D\", opts=[\"2D\", \"3D\"]) load the default phantom as a 2D or 3D brain example\nsim: (::Dict{String,Any}, =Dict{String,Any}()) simulation parameters dictionary\nrec: (::Dict{Symbol,Any}, =Dict{Symbol,Any}()) reconstruction parameters dictionary\nreturn_window: (::Bool, =false) make the out be either 'nothing' or the Blink window, depending on whether the return_window keyword argument is set to true\nshow_window: (::Bool, =true) display the Blink window\n\nReturns\n\nout: (::Nothing or ::Blink.AtomShell.Window) returns either 'nothing' or the Blink window, depending on whether the return_window keyword argument is set to true.\n\nExamples\n\njulia> KomaUI()\n\n\n\n\n\n","category":"function"},{"location":"explanation/4-gpu-explanation/#GPU-Parallelization","page":"GPU Parallelization","title":"GPU Parallelization","text":"","category":"section"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"KomaMRI uses a vendor agnostic approach to GPU parallelization in order to support multiple GPU backends. Currently, the following backends are supported:","category":"page"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"CUDA.jl (Nvidia)\nMetal.jl (Apple)\nAMDGPU.jl (AMD)\noneAPI.jl (Intel)","category":"page"},{"location":"explanation/4-gpu-explanation/#Choosing-a-GPU-Backend","page":"GPU Parallelization","title":"Choosing a GPU Backend","text":"","category":"section"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"To determine which backend to use, KomaMRI uses package extensions (introduced in Julia 1.9) to avoid having the packages for each GPU backend as explicit dependencies. This means that the user is responsible for loading the backend package (e.g. using CUDA) at the beginning of their code, or prior to calling KomaUI(), otherwise, Koma will default back to the CPU:","category":"page"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"using KomaMRI\nusing CUDA # loading CUDA will load KomaMRICoreCUDAExt, selecting the backend","category":"page"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"Once this is done, no further action is needed! The simulation objects will automatically be moved to the GPU and back once the simulation is finished. When the simulation is run a message will be shown with either the GPU device being used or the number of CPU threads if running on the CPU.","category":"page"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"Of course, it is still possible to move objects to the GPU manually, and control precision using the f32 and f64 functions:","category":"page"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"x = rand(100)\nx |> f32 |> gpu # Float32 CuArray","category":"page"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"To change the precision level used for the entire simulation, the sim_params[\"precision\"] parameter can be set to either f32 or f64 (Note that for most GPUs, Float32 operations are considerably faster compared with Float64). In addition, the sim_params[\"gpu\"] option can be set to true or false to enable / disable the gpu functionality (if set to true, the backend package will still need to be loaded beforehand):","category":"page"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"using KomaMRI\nusing CUDA\nsys = Scanner\nobj = brain_phantom2D()\nseq = PulseDesigner.EPI_example()\n\n#Simulate on the GPU using 32-bit floating point values\nsim_params = Dict{String,Any}(\n \"Nblocks\" => 20,\n \"gpu\" => true,\n \"precision\" => \"f32\"\n \"sim_method\" => Bloch(),\n)\nsimulate(obj, seq, sys; sim_params)","category":"page"},{"location":"explanation/4-gpu-explanation/#How-Objects-are-moved-to-the-GPU","page":"GPU Parallelization","title":"How Objects are moved to the GPU","text":"","category":"section"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"Koma's gpu function implementation calls a separate gpu function with a backend parameter of type <:KernelAbstractions.GPU for the backend it is using. This function then calls the fmap function from package Functors.jl to recursively call adapt from package Adapt.jl on each field of the object being transferred. This is similar to how many other Julia packages, such as Flux.jl, transfer data to the GPU. However, an important difference is that KomaMRI adapts directly to the KernelAbstractions.Backend type in order to use the adapt_storage functions defined in each backend package, rather than defining custom adapters, resulting in an implementation with fewer lines of code.","category":"page"},{"location":"explanation/4-gpu-explanation/#Inside-the-Simulation","page":"GPU Parallelization","title":"Inside the Simulation","text":"","category":"section"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"KomaMRI has three different simulation methods, all of which can run on the GPU: ","category":"page"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"BlochSimple: BlochSimple.jl\nBlochDict: BlochDict.jl\nBloch: BlochCPU.jl / BlochGPU.jl","category":"page"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"BlochSimple is the simplest method and prioritizes readability. ","category":"page"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"BlochDict can be understood as an extension to BlochSimple that outputs a more detailed signal.","category":"page"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"Bloch is equivalent to BlochSimple in the operations it performs, but is much faster since it has been optimized both for the CPU and GPU. The CPU implementation prioritizes conserving memory, and makes extensive use of pre-allocation for the simulation arrays. Unlike the GPU implementation, it does not allocate a matrix of size Number of Spins x Number of Time Points in each block, instead using a for loop to step through time.","category":"page"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"In contrast, the GPU implementation divides work among as many threads as possible at the beginning of the run_spin_precession! and run_spin_excitation! functions. For the CPU implementation, this would not be beneficial since there are far less CPU threads available compared with the GPU. Preallocation is also used via the same prealloc function used in BlochCPU.jl, where a struct of arrays is allocated at the beginning of the simulation that can be re-used in each simulation block. In addition, a precalc function is called before moving the simulation objects to the GPU to do certain calculations that are faster on the CPU beforehand.","category":"page"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"Compared with BlochSimple, which only uses array broadcasting for parallelization, Bloch also uses kernel-based methods in its run_spin_excitation! function for operations which need to be done sequentially. The kernel implementation uses shared memory to store the necessary arrays for applying the spin excitation for fast memory access, and separates the complex arrays into real and imaginary components to avoid bank conflicts.","category":"page"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"The performance differences between Bloch and BlochSimple can be seen on the KomaMRI benchmarks page. The first data point is from when Bloch was what is now BlochSimple, before a more optimized implementation was created. The following three pull requests are primarily responsible for the performance differences between Bloch and BlochSimple:","category":"page"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"(443) Optimize runspinprecession! and runspinexcitation! for CPU\n(459) Optimize runspinprecession! for GPU\n(462) Optimize runspinexcitation! for GPU","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"EditURL = \"lit-03-ChemicalShiftEPI.jl\"","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/#Chemical-Shift-in-an-EPI-sequence","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"","category":"section"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"using KomaMRI # hide\nsys = Scanner() # hide","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"For a more realistic example, we will use a brain phantom.","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"obj = brain_phantom2D() # a slice of a brain\np1 = plot_phantom_map(obj, :T2 ; height=400, width=400, view_2d=true)\np2 = plot_phantom_map(obj, :Δw ; height=400, width=400, view_2d=true)\nsavefig(p1, \"../assets/2-phantom1.html\") # hide\nsavefig(p2, \"../assets/2-phantom2.html\") # hide","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"At the left, you can see the T_2 map of the phantom, and at the right, the off-resonance Deltaomega. In this example, the fat is the only source of off-resonance (with Delta f = -220mathrmHz) and you can see it in black in the off-resonance map.","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"
","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"Then, we will load an EPI sequence, that is well known for being affected by off-resonance. With this sequence, we will be able visualize the effect of the chemical shift.","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"seq_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/5.koma_paper/comparison_accuracy/sequences/EPI/epi_100x100_TE100_FOV230.seq\")\nseq = read_seq(seq_file)\np3 = plot_seq(seq; range=[0 40], slider=true, height=300)\nsavefig(p3, \"../assets/2-seq.html\") # hide","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"Feel free to explore the sequence's plot 🔍 below!","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"
","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"If we simulate this sequence we will end up with the following signal.","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"raw = simulate(obj, seq, sys)\np4 = plot_signal(raw; range=[98.4 103.4] , height=300)\nsavefig(p4, \"../assets/2-signal.html\") # hide","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"
","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"Now, we need to inspect what effect the off-resonance had in the reconstructed image. As you can see, the fat layer is now shifted to a different position 🤯, this is why the effect is called chemical shift!","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"# Get the acquisition data\nacq = AcquisitionData(raw)\nacq.traj[1].circular = false #This is to remove the circular mask\n\n# Setting up the reconstruction parameters\nNx, Ny = raw.params[\"reconSize\"][1:2]\nreconParams = Dict{Symbol,Any}(:reco=>\"direct\", :reconSize=>(Nx, Ny))\nimage = reconstruction(acq, reconParams)\n\n# Plotting the recon\nslice_abs = abs.(image[:, :, 1])\np5 = plot_image(slice_abs; height=400)\nsavefig(p5, \"../assets/2-recon.html\") # hide","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"
","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"how-to/1-getting-started/#Getting-Started","page":"🏃 Getting Started","title":"Getting Started","text":"","category":"section"},{"location":"how-to/1-getting-started/#Installing-Julia","page":"🏃 Getting Started","title":"Installing Julia","text":"","category":"section"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"KomaMRI was written in Julia, so the first thing you should do is to install it! The latest version of Julia can be downloaded at the Julia Downloads page. It is advisable you add julia to the PATH, which can be done during the installation process.","category":"page"},{"location":"how-to/1-getting-started/#Installing-KomaMRI","page":"🏃 Getting Started","title":"Installing KomaMRI","text":"","category":"section"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"Once Julia is installed, open the Julia REPL, and add the KomaMRI package by typing the following commands:","category":"page"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"Press the ] key and then press enter to bring up Julia's package manager.\nType add KomaMRI and then press enter in the package manager session.","category":"page"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"This process should take about 5 minutes in a fresh Julia installation. Here is how it looks in the Julia REPL:","category":"page"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"julia> ]\n\n(@v1.9) pkg> add KomaMRI","category":"page"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"Then press Ctrl+C or backspace to return to the julia> prompt.","category":"page"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"","category":"page"},{"location":"how-to/1-getting-started/#My-First-MRI-Simulation","page":"🏃 Getting Started","title":"My First MRI Simulation","text":"","category":"section"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"For our first simulation we will use KomaMRI's graphical user interface (GUI). For this, you will first need to load KomaMRI by typing using KomaMRI, and then launch the GUI with the KomaUI function. Note that if you want to run simulations on the GPU (for example, using CUDA), then using CUDA is also necessary (see GPU Parallelization). ","category":"page"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"julia> using KomaMRI, CUDA\n\njulia> KomaUI()","category":"page"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"The first time you use this command it may take more time than usual, but a window with the Koma GUI will pop up:","category":"page"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"(Image: )","category":"page"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"The user interface has some basic definitions for the scanner, phantom, and sequence already preloaded. So you can immediately interact with the simulation and reconstruction processes, and then visualize the results.","category":"page"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"As a simple demonstration, press the Simulate! button and wait until the simulation is ready. Now you have acquired the Raw Signal and you should see the following:","category":"page"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"(Image: )","category":"page"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"Then, press the Reconstruct! button and wait until the reconstruction ends. Now you have reconstructed an Image from the Raw Signal and you should see the following in the GUI:","category":"page"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"(Image: )","category":"page"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"Congratulations, you successfully simulated an MRI acquisition! 🎊","category":"page"},{"location":"explanation/2-seq-events/#Sequence-Events","page":"Sequence Events","title":"Sequence Events","text":"","category":"section"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"As we already know, a Sequence struct contains field names that store arrays of RF, Grad, and ADC structs. In the context of MRI, we refer to RF, Grad, and ADC as \"events.\" To create a Sequence, it's essential to understand how to create these fundamental events.","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"In the following subsections, we will provide detailed explanations of event parameters and guide you through the process of creating a Sequence using RF, Grad, and ADC events.","category":"page"},{"location":"explanation/2-seq-events/#RF","page":"Sequence Events","title":"RF","text":"","category":"section"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"The RF struct is defined in the source code of KomaMRI as follows:","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"mutable struct RF\n A\n T\n Δf\n delay::Real\nend","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"As you can see, it has 4 field names: ''A'' defines amplitude, ''T'' defines duration time, ''delay'' is the distance between the 0 time and the first waveform sample and ''Δf'' is the displacement respect to the main field carrier frequency (this is for advanced users).","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"''A'' and ''T'' can be numbers or vectors of numbers. Depending on the length of the ''A'' and ''T'', KomaMRI interprets different waveforms: ","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"Pulse Waveform: A and T are numbers\nUniformly-Sampled Waveform: A is a vector and T is a number\nTime-Shaped Waveform: A and T are both vectors with the same length (zero-order-hold)","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"In the image below, we provide a summary of how you can define RF events:","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"
","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"Let's look at some basic examples of creating these RF structs and including them in a Sequence struct. The examples should be self-explanatory.","category":"page"},{"location":"explanation/2-seq-events/#RF-Pulse-Waveform","page":"Sequence Events","title":"RF Pulse Waveform","text":"","category":"section"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"julia> A, T, delay = 10e-3, 0.5e-3, 0.1e-3;\n\njulia> rf = RF(A, T, 0, delay)\n←0.1 ms→ RF(10000.0 uT, 0.5 ms, 0.0 Hz)\n\njulia> seq = Sequence(); seq += rf\nSequence[ τ = 0.6 ms | blocks: 1 | ADC: 0 | GR: 0 | RF: 1 | DEF: 0 ]\n\njulia> plot_seq(seq; slider=false)","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"
","category":"page"},{"location":"explanation/2-seq-events/#RF-Uniformly-Sampled-Waveform","page":"Sequence Events","title":"RF Uniformly-Sampled Waveform","text":"","category":"section"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"julia> tl = -3:0.2:-0.2; tr = 0.2:0.2:3;\n\njulia> A = (10e-3)*[sin.(π*tl)./(π*tl); 1; sin.(π*tr)./(π*tr)];\n\njulia> T, delay = 0.5e-3, 0.1e-3;\n\njulia> rf = RF(A, T, 0, delay)\n←0.1 ms→ RF(∿ uT, 0.5 ms, 0.0 Hz)\n\njulia> seq = Sequence(); seq += rf\nSequence[ τ = 0.6 ms | blocks: 1 | ADC: 0 | GR: 0 | RF: 1 | DEF: 0 ]\n\njulia> plot_seq(seq; slider=false)","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"
","category":"page"},{"location":"explanation/2-seq-events/#RF-Time-Shaped-Waveform","page":"Sequence Events","title":"RF Time-Shaped Waveform","text":"","category":"section"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"julia> tl = -4:0.2:-0.2; tr = 0.2:0.2:4\n\njulia> A = (10e-3)*[sin.(π*tl)./(π*tl); 1; 1; sin.(π*tr)./(π*tr)]\n\njulia> T = [0.05e-3*ones(length(tl)); 2e-3; 0.05e-3*ones(length(tl))]\n\njulia> delay = 0.1e-3;\n\njulia> rf = RF(A, T, 0, delay)\n←0.1 ms→ RF(∿ uT, 4.0 ms, 0.0 Hz)\n\njulia> seq = Sequence(); seq += rf\nSequence[ τ = 4.1 ms | blocks: 1 | ADC: 0 | GR: 0 | RF: 1 | DEF: 0 ]\n\njulia> plot_seq(seq; slider=false)","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"
","category":"page"},{"location":"explanation/2-seq-events/#Gradient","page":"Sequence Events","title":"Gradient","text":"","category":"section"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"The Grad struct is defined as follows in the source code of KomaMRI:","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"mutable struct Grad\n A\n T\n rise::Real\n fall::Real\n delay::Real\nend","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"As you can see, it has 5 field names: ''A'' defines amplitude, ''T'' defines duration time, ''delay'' is the distance between the 0 time and the first waveform sample, ''rise'' and ''fall'' are the time durations of the first and last gradient ramps.","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"Just like the RF, ''A'' and ''T'' in the Grad struct can be numbers or vectors of numbers. Depending on the length of the ''A'' and ''T'', KomaMRI interprets different waveforms: ","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"Trapezoidal Waveform: A and T are numbers\nUniformly-Sampled Waveform: A is a vector and T is a number\nTime-Shaped Waveform: A and T are both vectors, A has one sample more the T (linear interpolation)","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"In the image below, we provide a summary of how you can define Grad events:","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"
","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"Let's look at some basic examples of creating these Grad structs and including them in a Sequence struct, focusing on the ''x'' component of the gradients. The examples should be self-explanatory.","category":"page"},{"location":"explanation/2-seq-events/#Gradient-Trapezoidal-Waveform","page":"Sequence Events","title":"Gradient Trapezoidal Waveform","text":"","category":"section"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"julia> A, T, delay, rise, fall = 50*10e-6, 5e-3, 2e-3, 1e-3, 1e-3;\n\njulia> gr = Grad(A, T, rise, fall, delay)\n←2.0 ms→ Grad(0.5 mT, 0.5 ms, ↑1.0 ms, ↓1.0 ms)\n\njulia> seq = Sequence([gr])\nSequence[ τ = 9.0 ms | blocks: 1 | ADC: 0 | GR: 1 | RF: 0 | DEF: 0 ]\n\njulia> plot_seq(seq; slider=false)","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"
","category":"page"},{"location":"explanation/2-seq-events/#Gradient-Uniformly-Sampled-Waveform","page":"Sequence Events","title":"Gradient Uniformly-Sampled Waveform","text":"","category":"section"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"julia> t = 0:0.25:7.5\n\njulia> A = 10*10e-6 * sqrt.(π*t) .* sin.(π*t)\n\njulia> T = 10e-3;\n\njulia> delay, rise, fall = 1e-3, 0, 1e-3;\n\njulia> gr = Grad(A, T, rise, fall, delay)\n←1.0 ms→ Grad(∿ mT, 10.0 ms, ↑0.0 ms, ↓1.0 ms)\n\njulia> seq = Sequence([gr])\nSequence[ τ = 12.0 ms | blocks: 1 | ADC: 0 | GR: 1 | RF: 0 | DEF: 0 ]\n\njulia> plot_seq(seq; slider=false)","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"
","category":"page"},{"location":"explanation/2-seq-events/#Gradient-Time-Shaped-Waveform","page":"Sequence Events","title":"Gradient Time-Shaped Waveform","text":"","category":"section"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"julia> A = 50*10e-6*[1; 1; 0.8; 0.8; 1; 1];\n\njulia> T = 1e-3*[5; 0.2; 5; 0.2; 5];\n\njulia> delay, rise, fall = 1e-3, 1e-3, 1e-3;\n\njulia> gr = Grad(A, T, rise, fall, delay)\n←1.0 ms→ Grad(∿ mT, 15.4 ms, ↑1.0 ms, ↓1.0 ms)\n\njulia> seq = Sequence([gr])\nSequence[ τ = 10.75 ms | blocks: 1 | ADC: 0 | GR: 1 | RF: 0 | DEF: 0 ]\n\njulia> plot_seq(seq; slider=false)","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"
","category":"page"},{"location":"explanation/2-seq-events/#ADC","page":"Sequence Events","title":"ADC","text":"","category":"section"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"The ADC struct is defined in the KomaMRI source code as follows:","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"mutable struct ADC\n N::Integer\n T::Real\n delay::Real\n Δf::Real\n ϕ::Real\nend","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"As you can see, it has 5 field names: ''N'' defines number of samples, ''T'' defines total acquisition duration, ''delay'' is the distance between the 0 time and the first sampled signal, ''Δf'' and ''ϕ' are factor to correct signal acquisition (for advanced users).","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"In the image below you can see how to define an ADC event:","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"
","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"Let's look at a basic example of defining an ADC struct and including it in a Sequence struct:","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"julia> N, T, delay = 16, 5e-3, 1e-3;\n\njulia> adc = ADC(N, T, delay)\nADC(16, 0.005, 0.001, 0.0, 0.0)\n\njulia> seq = Sequence(); seq += adc\nSequence[ τ = 6.0 ms | blocks: 1 | ADC: 1 | GR: 0 | RF: 0 | DEF: 0 ]\n\njulia> plot_seq(seq; slider=false)","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"
","category":"page"},{"location":"explanation/2-seq-events/#Combination-of-Events","page":"Sequence Events","title":"Combination of Events","text":"","category":"section"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"We can include multiple events within a single block of a sequence. The example below demonstrates how to combine an RF struct, three Grad structs for the x-y-z components, and an ADC struct in a single block of a sequence:","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"# Define an RF struct\nA, T = 1e-6*[0; -0.1; 0.2; -0.5; 1; -0.5; 0.2; -0.1; 0], 0.5e-3;\nrf = RF(A, T)\n\n# Define a Grad struct for Gx\nA, T, rise = 50*10e-6, 5e-3, 1e-3\ngx = Grad(A, T, rise)\n\n# Define a Grad struct for Gy\nA = 50*10e-6*[0; 0.5; 0.9; 1; 0.9; 0.5; 0; -0.5; -0.9; -1]\nT, rise = 5e-3, 2e-3;\ngy = Grad(A, T, rise)\n\n# Define a Grad struct for Gz\nA = 50*10e-6*[0; 0.5; 0.9; 1; 0.9; 0.5; 0; -0.5; -0.9; -1]\nT = 5e-3*[0.0; 0.1; 0.3; 0.2; 0.1; 0.2; 0.3; 0.2; 0.1]\ngz = Grad(A, T)\n\n# Define an ADC struct\nN, T, delay = 16, 5e-3, 1e-3\nadc = ADC(N, T, delay)","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"julia> seq = Sequence([gx; gy; gz;;], [rf;;], [adc])\nSequence[ τ = 9.0 ms | blocks: 1 | ADC: 1 | GR: 3 | RF: 1 | DEF: 0 ]\n\njulia> plot_seq(seq; slider=false)","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"
","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"Once the struct events are defined, it's important to note that to create a single block sequence, you need to provide 2D matrices of Grad and RF structs, as well as a vector of ADC structs as arguments in the Sequence constructor.","category":"page"},{"location":"explanation/2-seq-events/#Algebraic-manipulation","page":"Sequence Events","title":"Algebraic manipulation","text":"","category":"section"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"Certain mathematical operations can be directly applied to events and sequence structs. This proves helpful when constructing sequences using reference structs and manipulating them algebraically to create new structs. Below, we provide a list of operations you can perform, along with examples where we check the equivalence of two different struct definitions:","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"RF scaling","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"# Define params\nA, T = 10e-6, 0.5e-3 # Define base RF params \nα = (1 + im*1)/sqrt(2) # Define a complex scaling factor\n\n# Create two equivalent RFs in different ways\nra = RF(α * A, T)\nrb = α * RF(A, T)","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"julia> ra ≈ rb\ntrue","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"Gradient scaling","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"# Define params\nA, T = 10e-3, 0.5e-3 # Define base gradient params \nα = 2 # Define a scaling factor\n\n# Create two equivalent gradients in different ways\nga = Grad(α * A, T)\ngb = α * Grad(A, T)","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"julia> ga ≈ gb\ntrue","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"Gradient addition","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"# Define params\nT = 0.5e-3 # Define common duration of the gradients\nA1 = 5e-3 # Define base amplitude for gradient \nA2 = 10e-3 # Define another base amplitude for gradient \n\n# Create two equivalent gradients in different ways\nga = Grad(A1 + A2, T)\ngb = Grad(A1, T) + Grad(A2, T)","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"julia> ga ≈ gb\ntrue","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"Gradient array multiplication by a matrix","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"# Define params\nT = 0.5e-3 # Define common duration of the gradients\nAx, Ay, Az = 10e-3, 20e-3, 5e-3 # Define base amplitude for gradients \ngx, gy, gz = Grad(Ax, T), Grad(Ay, T), Grad(Az, T) # Define gradients\nR = [0 1. 0; 0 0 1.; 1. 0 0] # Define matrix (a rotation matrix in this example)\n\n# Create two equivalent gradient vectors in different ways\nga = [gy; gz; gx]\ngb = R * [gx; gy; gz]\n\n# Create two equivalent gradient matrices in different ways\ngc = [gy 2*gy; gz 2*gz; gx 2*gx]\ngd = R * [gx 2*gx; gy 2*gy; gz 2*gz]","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"julia> all(ga .≈ gb)\ntrue\n\njulia> all(gc .≈ gd)\ntrue","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"Sequence rotation","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"# Define params\nT = 0.5e-3 # Define common duration of the gradients\nAx, Ay, Az = 10e-3, 20e-3, 5e-3 # Define base amplitude for gradients \ngx, gy, gz = Grad(Ax, T), Grad(Ay, T), Grad(Az, T) # Define gradients\nR = [0 1. 0; 0 0 1.; 1. 0 0] # Define matrix (a rotation matrix in this example)\n\n# Create two equivalent sequences in different ways\nsa = Sequence(R * [gx; gy; gz;;])\nsb = R * Sequence([gx; gy; gz;;])","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"julia> all(sa.GR .≈ sb.GR)\ntrue","category":"page"},{"location":"tutorial-pluto/02-low-field-cmra-optimization/#Low-Field-CMRA-Optimization","page":"Low-Field CMRA Optimization","title":"Low-Field CMRA Optimization","text":"","category":"section"},{"location":"tutorial-pluto/02-low-field-cmra-optimization/","page":"Low-Field CMRA Optimization","title":"Low-Field CMRA Optimization","text":"(Image: ) (Image: )","category":"page"},{"location":"tutorial-pluto/02-low-field-cmra-optimization/","page":"Low-Field CMRA Optimization","title":"Low-Field CMRA Optimization","text":"
","category":"page"},{"location":"tutorial/README/","page":"-","title":"-","text":"This folder is intentionally left empty. It will be filled by docs/make.jl in the gh-pages branch. ","category":"page"},{"location":"tutorial/README/","page":"-","title":"-","text":"Files matching the lit-*.jl pattern anywhere in examples/3.tutorials will be included.","category":"page"},{"location":"tutorial/README/","page":"-","title":"-","text":"All files included in this folder will be ignored.","category":"page"},{"location":"how-to/2-1-use-koma-ui/#Use-Koma's-User-Interface","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"","category":"section"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"This section provides a comprehensive guide on using the User Interface of the KomaMRI package and delves into the internal processes that occur during interaction. By the end of this section, you will be equipped to execute a complete workflow even without any prior programming experience.","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/#Basic-Workflow","page":"Use Koma's User Interface","title":"Basic Workflow","text":"","category":"section"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"(You can also go to analog steps using Scripts)","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"As a general overview, remember the following workflow steps when using KomaMRI:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"Loading Simulation Inputs: Scanner, Phantom, Sequence\nRunning Simulation\nReconstructing Image using MRIReco","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"In the following subsections, we will cover all the mentioned steps. First, open the Julia REPL and enter the following commands to include the KomaMRI package and launch the user interface:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"julia> using KomaMRI\n\njulia> KomaUI()","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/#Loading-Simulation-Inputs","page":"Use Koma's User Interface","title":"Loading Simulation Inputs","text":"","category":"section"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"(You can also go to analog steps using Scripts)","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"The user interface has preloaded certain inputs into RAM, including the Scanner, Phantom, and Sequence structs. In the following subsections, we will demonstrate how to visualize these inputs.","category":"page"},{"location":"how-to/2-1-use-koma-ui/#Scanner","page":"Use Koma's User Interface","title":"Scanner","text":"","category":"section"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"You can visualize the preloaded Scanner struct by clicking on the Scanner dropdown and then pressing the View Scanner button. The Scanner struct contains hardware-related information, such as the main magnetic field's magnitude:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/#Phantom","page":"Use Koma's User Interface","title":"Phantom","text":"","category":"section"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"To see the phantom already stored in RAM, simply click on the Phantom dropdown an then press the View Phantom button. The preloaded phantom is a slice of a brain:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"It is also possible to load .h5 phantom files. The KomaMRI.jl has some examples stored at ~/.julia/packages/KomaMRI/
/examples/2.phantoms/. For instance, let's load the sphere_chemical_shift.h5 file:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"Note that you can select different spin parameters to visualize like ρ, T1, T2, among others. ","category":"page"},{"location":"how-to/2-1-use-koma-ui/#Sequence","page":"Use Koma's User Interface","title":"Sequence","text":"","category":"section"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"There are two options to visualize the sequence already preloaded in RAM: in the time domain or in the k-space. The preloaded sequence is a single-shot EPI.","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"For visualization of the sequence in the time domain, click on the Sequence dropdown and then press the Sequence (MPS) button:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"For visualization of the sequence in the k-space, click on the Sequence dropdown and then press the k-space button:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"You can also display the Moments related to the Sequence by pressing the View Moments and then pressing the buttons for zero, first and second moments.","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"It is also possible to load Pulseq compatible .seq sequence files. The KomaMRI has some examples stored at ~/.julia/packages/KomaMRI//examples/1.sequences/. For instance, let's load the spiral.seq file and view it the time domain and k-space:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"And remember, you are free to interact with the plots:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/#Running-Simulation","page":"Use Koma's User Interface","title":"Running Simulation","text":"","category":"section"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"(You can also go to analog steps using Scripts)","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"Once the inputs are loaded in RAM, it is possible to perform the simulation to get the Raw Signal.","category":"page"},{"location":"how-to/2-1-use-koma-ui/#Simulation-Parameters","page":"Use Koma's User Interface","title":"Simulation Parameters","text":"","category":"section"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"To visualize the default simulation parameters, click on the Simulate! dropdown and then press the View Options button:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/#Visualization-of-the-Raw-Signal","page":"Use Koma's User Interface","title":"Visualization of the Raw Signal","text":"","category":"section"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"Press the Simulate! button to perform the simulation (this may take a while). Automatically the generated Raw Signal should be displayed or you can click on the Raw Data dropdown and then press the View Raw Data button:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/#Reconstructing-Image-using-MRIReco","page":"Use Koma's User Interface","title":"Reconstructing Image using MRIReco","text":"","category":"section"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"(You can also go to analog steps using Scripts)","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"Once the Raw Signal is loaded in RAM, it is possible to reconstruct the image.","category":"page"},{"location":"how-to/2-1-use-koma-ui/#Reconstruction-Parameters","page":"Use Koma's User Interface","title":"Reconstruction Parameters","text":"","category":"section"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"To visualize the default reconstruction parameters, click on the Reconstruct! dropdown and then press the View Options button:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/#Visualization-of-the-Image","page":"Use Koma's User Interface","title":"Visualization of the Image","text":"","category":"section"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"Press the Reconstruct! button to perform the reconstruction (this may take a while). Automatically the generated Image should be displayed or you can click on the he Reconstruct! dropdown and then press the |Image| button:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/#Exporting-Results-to-.mat-File","page":"Use Koma's User Interface","title":"Exporting Results to .mat File","text":"","category":"section"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"(You can also go to analog steps using Scripts)","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"The user interface has the option to save the results in .mat format. Simply click on the Export to .mat and you have the alternatives to get data independently or you can press the All button to have all the results given by the simulator:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"So far, and due to limitations of the user interface dependencies, the .mat files are saved in the temporal directory of your computer OS, which can be found by typing the tempdir() command in the Julia REPL:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/#REPL-and-UI-communication","page":"Use Koma's User Interface","title":"REPL and UI communication","text":"","category":"section"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"An amazing feature of KomaMRI is that it allows you to modify certain variables in the Julia REPL, and then the user interface automatically updates its plots in real-time:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"The variables that update the interface are:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"seq_ui[] for the Sequence\nobj_ui[] for the Phantom\nsys_ui[] for the Scanner\nraw_ui[] for the Raw Signal\nimg_ui[] for the Image","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"Don't forget to add the brackets [] to these variables, otherwise it won't work.","category":"page"},{"location":"how-to/2-3-use-koma-scripts/#Use-Koma-in-Julia-Scripts","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"","category":"section"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"You should already be familiar with the Graphical User Interface of KomaMRI. However, you can also use this package directly from the Julia REPL or write your own Julia scripts. This allows you to unlock the full potential of KomaMRI, enabling you to utilize more of its functionalities and even test your own MRI ideas.","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"This section demonstrates a basic workflow with KomaMRI through writing your own scripts or entering commands directly into the Julia REPL. Let's begin.","category":"page"},{"location":"how-to/2-3-use-koma-scripts/#Basic-Workflow","page":"Use Koma in Julia Scripts","title":"Basic Workflow","text":"","category":"section"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"(You can also go to analog steps using UI)","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"As a general overview, remember the following workflow steps when using KomaMRI:","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"Loading Simulation Inputs: Scanner, Phantom, Sequence\nRunning Simulation\nReconstructing Image using MRIReco","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"Let's replicate these previous steps in a Julia script. You will obtain the following code, which you can copy and paste into the Julia REPL:","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"# Import the package\nusing KomaMRI\n\n# Define scanner, object and sequence\nsys = Scanner()\nobj = brain_phantom2D()\nseq = PulseDesigner.EPI_example()\n\n# Define simulation parameters and perform simulation\nsim_params = KomaMRICore.default_sim_params() \nraw = simulate(obj, seq, sys; sim_params)\n\n# Auxiliary function for reconstruction\nfunction reconstruct_2d_image(raw::RawAcquisitionData)\n acqData = AcquisitionData(raw)\n acqData.traj[1].circular = false #Removing circular window\n C = maximum(2*abs.(acqData.traj[1].nodes[:])) #Normalize k-space to -.5 to .5 for NUFFT\n acqData.traj[1].nodes = acqData.traj[1].nodes[1:2,:] ./ C\n Nx, Ny = raw.params[\"reconSize\"][1:2]\n recParams = Dict{Symbol,Any}()\n recParams[:reconSize] = (Nx, Ny)\n recParams[:densityWeighting] = true\n rec = reconstruction(acqData, recParams)\n image3d = reshape(rec.data, Nx, Ny, :)\n image2d = (abs.(image3d) * prod(size(image3d)[1:2]))[:,:,1]\n return image2d\nend\n\n# Perform reconstruction to get the image\nimage = reconstruct_2d_image(raw)","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"Let's go through this script step by step.","category":"page"},{"location":"how-to/2-3-use-koma-scripts/#Loading-Simulation-Inputs","page":"Use Koma in Julia Scripts","title":"Loading Simulation Inputs","text":"","category":"section"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"(You can also go to analog steps using UI)","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"The inputs of the simulation are created in the following part of the script: ","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"# Define scanner, object and sequence\nsys = Scanner()\nobj = brain_phantom2D()\nseq = PulseDesigner.EPI_example()","category":"page"},{"location":"how-to/2-3-use-koma-scripts/#Scanner","page":"Use Koma in Julia Scripts","title":"Scanner","text":"","category":"section"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"The previously created Scanner struct contains default parameters. In your initial simulations, you will likely use this default struct without making any modifications. You can view all the parameters by displaying the struct variable in the Julia REPL. The Scanner's parameters include hardware limitations such as the main magnetic field, maximum gradient values, minimum raster times, and more. You may want to adjust these values for your future custom simulations.","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"julia> sys\nScanner\n B0: Float64 1.5\n B1: Float64 1.0e-5\n Gmax: Float64 0.06\n Smax: Int64 500\n ADC_Δt: Float64 2.0e-6\n seq_Δt: Float64 1.0e-5\n GR_Δt: Float64 1.0e-5\n RF_Δt: Float64 1.0e-6\n RF_ring_down_T: Float64 2.0e-5\n RF_dead_time_T: Float64 0.0001\n ADC_dead_time_T: Float64 1.0e-5","category":"page"},{"location":"how-to/2-3-use-koma-scripts/#Phantom","page":"Use Koma in Julia Scripts","title":"Phantom","text":"","category":"section"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"The Phantom struct created in this example represents a slice of a brain. To create it, we use the function brain_phantom2D, which is part of the subdependency KomaMRICore. While KomaMRI provides some phantom examples for experimentation, you may also want to create your custom Phantom struct tailored to your specific requirements.","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"The Phantom struct contains MRI parameters related to the magnetization properties of an object. These parameters include magnetization positions, proton density, relaxation times, off-resonance, among others. To view all the keys and values of the object, you can do so in the Julia REPL as follows:","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"julia> obj\nPhantom{Float64}\n name: String \"brain2D_axial\"\n x: Array{Float64}((6506,)) [-0.084, -0.084, … 0.086, 0.086]\n y: Array{Float64}((6506,)) [-0.03, -0.028, … 0.0, 0.002]\n z: Array{Float64}((6506,)) [-0.0, -0.0, … 0.0, 0.0]\n ρ: Array{Float64}((6506,)) [0.7, 0.7, … 0.7, 0.7]\n T1: Array{Float64}((6506,)) [0.569, 0.569, … 0.569, 0.569]\n T2: Array{Float64}((6506,)) [0.329, 0.329, … 0.329, 0.329]\n T2s: Array{Float64}((6506,)) [0.058, 0.058, … 0.058, 0.058]\n Δw: Array{Float64}((6506,)) [-0.0, -0.0, … -0.0, -0.0]\n Dλ1: Array{Float64}((6506,)) [0.0, 0.0, … 0.0, 0.0]\n Dλ2: Array{Float64}((6506,)) [0.0, 0.0, … 0.0, 0.0]\n Dθ: Array{Float64}((6506,)) [0.0, 0.0, … 0.0, 0.0]\n...","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"As you can see, attributes of the Phantom struct are vectors representing object properties, with each element holding a value associated with a single magnetization.","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"You can also visualize the Phantom struct using the plot_phantom_map function, which is part of the KomaMRIPlots subdependency. This function plots the magnitude of a property for each magnetization at a specific spatial position. You can observe properties such as proton density and relaxation times, so feel free to replace the :ρ symbol with another property of the phantom in the example below:","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"julia> plot_phantom_map(obj, :ρ)","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":" ","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"To utilize test phantoms included with KomaMRI, navigate to the \"examples\" folder and use the read_phantom_jemris function to read a phantom in .h5 format. The following steps outline how to do this in Julia:","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"julia> path_koma = dirname(dirname(pathof(KomaMRI)))\njulia> path_sphere = joinpath(path_koma, \"examples\", \"2.phantoms\", \"sphere_chemical_shift.h5\")\njulia> sphere = read_phantom_jemris(path_sphere)\njulia> plot_phantom_map(sphere, :T2)","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":" ","category":"page"},{"location":"how-to/2-3-use-koma-scripts/#Sequence","page":"Use Koma in Julia Scripts","title":"Sequence","text":"","category":"section"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"The Sequence struct in the example represents one of the most basic MRI sequences. It excites the object with a 90° RF pulse and then uses EPI gradients to fill the k-space in a \"square\" manner. While you may want to create your sequences for experiments, you can always use some of the examples already available in KomaMRI.","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"In MRI, the sequence must be carefully designed with precise timing to obtain an image. It includes subcomponents such as gradients, radio-frequency excitation signals, and sample acquisition. For more information on constructing a Sequence struct, refer to the Sequence section.","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"You can view general information about a Sequence struct by displaying it in the Julia REPL:","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"julia> seq\nSequence[ τ = 62.846 ms | blocks: 204 | ADC: 101 | GR: 205 | RF: 1 | DEF: 5 ]","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"For more precise timing checks, you can use the plot_seq function:","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"julia> plot_seq(seq; range=[0 30])","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":" ","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"It is important to consider how the sequence traverses through k-space. The plot_kspace function does precisely that:","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"julia> plot_kspace(seq)","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":" ","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"Additionally, there are helpful sequence construction functions within a submodule of KomaMRI called PulseDesigner. These functions include PulseDesigner.RF_hard, PulseDesigner.RF_sinc, PulseDesigner.EPI, PulseDesigner.radial_base and PulseDesigner.spiral_base. For more details on how to use them, refer to the API documentation.","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"KomaMRI is also compatible with Pulseq. The package installation includes some .seq files in Pulseq format, which can be read and used as a Sequence struct. Here's how to read a spiral Pulseq file stored in the \"examples\" folder of KomaMRI:","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"julia> path_koma = dirname(dirname(pathof(KomaMRI)))\njulia> path_spiral = joinpath(path_koma, \"examples\", \"1.sequences\", \"spiral.seq\")\njulia> spiral = read_seq(path_spiral)\njulia> plot_seq(spiral)\njulia> plot_kspace(spiral)","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":" ","category":"page"},{"location":"how-to/2-3-use-koma-scripts/#Running-Simulation","page":"Use Koma in Julia Scripts","title":"Running Simulation","text":"","category":"section"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"(You can also go to analog steps using UI)","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"The following lines in the example script configure and perform the simulation:","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"# Define simulation parameters and perform simulation\nsim_params = KomaMRICore.default_sim_params() \nraw = simulate(obj, seq, sys; sim_params)","category":"page"},{"location":"how-to/2-3-use-koma-scripts/#Simulation-Parameters","page":"Use Koma in Julia Scripts","title":"Simulation Parameters","text":"","category":"section"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"To perform simulations, KomaMRI requires certain parameters. You can use the default parameters for testing, but you also have the option to customize specific simulation aspects. In the example, we use the KomaMRICore.default_sim_params function to create a dictionary with default simulation parameters. You can view the keys that can be modified by displaying the sim_params variable:","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"julia> sim_params\nDict{String, Any} with 9 entries:\n \"return_type\" => \"raw\"\n \"Nblocks\" => 20\n \"gpu\" => true\n \"Nthreads\" => 1\n \"gpu_device\" => 0\n \"sim_method\" => Bloch()\n \"precision\" => \"f32\"\n \"Δt\" => 0.001\n \"Δt_rf\" => 5.0e-5","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"All of these parameters deserve special attention. We will explain some of the most important ones here. For instance, \"Δt\" and \"Δt_rf\" represent the raster times for the gradients and RFs. \"return_type\" specifies the type of variable returned by the simulator (by default, it returns an object ready for use with MRIReco for reconstruction, but you can use the value \"mat\" to return a simple vector). \"gpu\" indicates whether you want to use your GPU device for simulations, and \"precision\" sets the floating-point precision. For more details on how to set these parameters, please refer to the Simulation Parameters Section.","category":"page"},{"location":"how-to/2-3-use-koma-scripts/#Raw-Signal","page":"Use Koma in Julia Scripts","title":"Raw Signal","text":"","category":"section"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"The simulation is performed using the simulate function, which requires three arguments: a Scanner struct, a Phantom struct, and a Sequence struct. Optionally, you can include the keyword argument sim_params if you wish to use custom simulation parameters.","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"In the example, we can see that the output of the simulation is a special struct:","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"julia> typeof(raw)\nRawAcquisitionData\n\njulia> raw\nRawAcquisitionData[SeqName: epi | 101 Profile(s) of 101×1]","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"You can plot the simulation result with the plot_signal function like so:","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"julia> plot_signal(raw)","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":" ","category":"page"},{"location":"how-to/2-3-use-koma-scripts/#Reconstructing-Image-using-MRIReco","page":"Use Koma in Julia Scripts","title":"Reconstructing Image using MRIReco","text":"","category":"section"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"(You can also go to analog steps using UI)","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"KomaMRI does not handle reconstruction; instead, you should utilize the MRIReco package to generate an image. For convenience, when you install KomaMRI, you also install MRIReco, allowing you to access functions from that package. You should pay special attention to the RawAcquisitionData and AcquisitionData structs, as well as the reconstruction function.","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"In the example below, we define an auxiliary function, reconstruct_2d_image, which takes a raw signal struct, RawAcquisitionData, as input and returns a 2D Array representing an image. Within this function, we create an AcquisitionData struct and set some reconstruction parameters, which serve as inputs for the reconstruction function. The latter function is responsible for the image generation process.","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"# Auxiliary function for reconstruction\nfunction reconstruct_2d_image(raw::RawAcquisitionData)\n acqData = AcquisitionData(raw)\n acqData.traj[1].circular = false #Removing circular window\n C = maximum(2*abs.(acqData.traj[1].nodes[:])) #Normalize k-space to -.5 to .5 for NUFFT\n acqData.traj[1].nodes = acqData.traj[1].nodes[1:2,:] ./ C\n Nx, Ny = raw.params[\"reconSize\"][1:2]\n recParams = Dict{Symbol,Any}()\n recParams[:reconSize] = (Nx, Ny)\n recParams[:densityWeighting] = true\n rec = reconstruction(acqData, recParams)\n image3d = reshape(rec.data, Nx, Ny, :)\n image2d = (abs.(image3d) * prod(size(image3d)[1:2]))[:,:,1]\n return image2d\nend\n\n# Perform reconstruction to get the image\nimage = reconstruct_2d_image(raw)","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"If you need more information about how to use the AcquisitionData and the how to fill the reconstruction parameters, you need to visit the MRIReco webpage).","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"To display the image, you can use the plot_image function which is part of the KomaMRIPlots subpackage:","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"julia> plot_image(image)","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":" ","category":"page"},{"location":"how-to/2-3-use-koma-scripts/#Exporting-Results-to-.mat-File","page":"Use Koma in Julia Scripts","title":"Exporting Results to .mat File","text":"","category":"section"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"(You can also go to analog steps using UI)","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"Many people in the MRI community uses MATLAB, probably you are one of them and you want to process the raw signal in the MATLAB environment after simulation is done with KomaMRI. Here we show you an example of how to save a .mat file with the information of the raw signal thank to the help of the MAT package:","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"Many people in the MRI community use MATLAB; you might be one of them and may want to process the Raw Signal in the MATLAB environment after simulation is completed with KomaMRI. Here, we provide an example of how to save a .mat file containing the Raw Signal information using the MAT package.","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"# Use the MAT package\nusing MAT\n\n# Perform simulation to return an Array type\nsim_params[\"return_type\"] = \"mat\"\nraw = simulate(obj, seq, sys; sim_params)\n\n# Save the .mat file in the temp directory\nmatwrite(joinpath(tempdir(), \"koma-raw.mat\"), Dict(\"raw\" => raw))","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"Note that we need to simulate to return an array type (not the default RawAcquisitionData), and then we utilize the matwrite function to save a file named \"koma-raw.mat\" in your computer's temporary directory. Now, you can navigate to your temporary directory (which you can find by displaying the result of tempdir() in the Julia REPL) and locate the \"koma-raw.mat\" file.","category":"page"},{"location":"reference/4-koma-files/#KomaMRIFiles","page":"KomaMRIFiles","title":"KomaMRIFiles","text":"","category":"section"},{"location":"reference/4-koma-files/","page":"KomaMRIFiles","title":"KomaMRIFiles","text":"CurrentModule = KomaMRIFiles","category":"page"},{"location":"reference/4-koma-files/#Sequence","page":"KomaMRIFiles","title":"Sequence","text":"","category":"section"},{"location":"reference/4-koma-files/","page":"KomaMRIFiles","title":"KomaMRIFiles","text":"read_seq","category":"page"},{"location":"reference/4-koma-files/#KomaMRIFiles.read_seq","page":"KomaMRIFiles","title":"KomaMRIFiles.read_seq","text":"seq = read_seq(filename)\n\nReturns the Sequence struct from a Pulseq file with .seq extension.\n\nArguments\n\nfilename: (::String) absolute or relative path of the sequence file .seq\n\nReturns\n\nseq: (::Sequence) Sequence struct\n\nExamples\n\njulia> seq_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/1.sequences/spiral.seq\")\n\njulia> seq = read_seq(seq_file)\n\njulia> plot_seq(seq)\n\n\n\n\n\n","category":"function"},{"location":"reference/4-koma-files/#Phantom","page":"KomaMRIFiles","title":"Phantom","text":"","category":"section"},{"location":"reference/4-koma-files/","page":"KomaMRIFiles","title":"KomaMRIFiles","text":"read_phantom_jemris\nread_phantom_MRiLab\nread_phantom\nwrite_phantom","category":"page"},{"location":"reference/4-koma-files/#KomaMRIFiles.read_phantom_jemris","page":"KomaMRIFiles","title":"KomaMRIFiles.read_phantom_jemris","text":"obj = read_phantom_jemris(filename)\n\nReturns the Phantom struct from a JEMRIS phantom file .h5.\n\nArguments\n\nfilename: (::String) the absolute or relative path of the phantom file .h5\n\nReturns\n\nobj: (::Phantom) Phantom struct\n\nExamples\n\njulia> obj_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/2.phantoms/brain.h5\")\n\njulia> obj = read_phantom_jemris(obj_file)\n\njulia> plot_phantom_map(obj, :ρ)\n\n\n\n\n\n","category":"function"},{"location":"reference/4-koma-files/#KomaMRIFiles.read_phantom_MRiLab","page":"KomaMRIFiles","title":"KomaMRIFiles.read_phantom_MRiLab","text":"obj = read_phantom_MRiLab(filename)\n\nReturns the Phantom struct from a MRiLab phantom file .mat.\n\nArguments\n\nfilename: (::String) the absolute or relative path of the phantom file .mat\n\nReturns\n\nobj: (::Phantom) Phantom struct\n\nExamples\n\njulia> obj_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/2.phantoms/brain.mat\")\n\njulia> obj = read_phantom_MRiLab(obj_file)\n\njulia> plot_phantom_map(obj, :ρ)\n\n\n\n\n\n","category":"function"},{"location":"reference/4-koma-files/#KomaMRIFiles.read_phantom","page":"KomaMRIFiles","title":"KomaMRIFiles.read_phantom","text":"phantom = read_phantom(filename)\n\nReads a (.phantom) file and creates a Phantom structure from it\n\n\n\n\n\n","category":"function"},{"location":"reference/4-koma-files/#KomaMRIFiles.write_phantom","page":"KomaMRIFiles","title":"KomaMRIFiles.write_phantom","text":"phantom = write_phantom(ph,filename)\n\nWrites a (.phantom) file from a Phantom struct.\n\n\n\n\n\n","category":"function"},{"location":"how-to/2-2-use-koma-notebooks/#Use-Koma-in-Notebooks","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"","category":"section"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"You can use KomaMRI with popular programming environments such as Pluto and Jupyter notebooks. The following sections show how to set up these notebooks and test KomaMRI with them.","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/#Pluto","page":"Use Koma in Notebooks","title":"Pluto","text":"","category":"section"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"First, install the Pluto module in your Julia environment. Remember to press the ] button to open the Package Manager Session:","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"julia>\n\n@(1.9) pkg> add Pluto","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"Afterward, return to the Julia Session by pressing the backspace button, and then execute the Pluto.run() function:","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"julia> using Pluto\n\njulia> Pluto.run()","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"This should automatically open the Pluto dashboard in your default web browser:","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":" ","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"Next, create a new notebook by clicking on + Create a new notebook:","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":" ","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"Write and run the following code, which is identical to the Free Induction Decay example. Pluto automatically installs the required modules if they are not present on your system. Additionally, note that we do not directly use KomaMRI since we won't be utilizing the KomaUI function. Instead, we rely on the KomaMRICore and KomaMRIPlots dependencies. To display plots in Pluto, ensure that you import the PlutoPlotly package, as KomaMRIPlots requires its backend to display figures in Pluto:","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"One of the most outstanding features of Pluto is its ability to ensure reproducibility by storing the information necessary to recreate the package environment in the notebook file. When others open your notebook with Pluto, it automatically ensures they use the exact same package environment, guaranteeing seamless functionality on their computers.","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/#Jupyter","page":"Use Koma in Notebooks","title":"Jupyter","text":"","category":"section"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"Ensure you have Jupyter installed on your computer. Follow this tutorial for installation using Anaconda.","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"Next, install the IJulia module in your Julia environment. Remember to press the ] key to open the Package Manager Session:","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"julia>\n\n(@v1.9) pkg> add IJulia","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"For this example, make sure to install KomaMRICore and KomaMRIPlots (we do not use KomaMRI directly since we won't be utilizing the KomaUI() function):","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"(@v1.9) pkg> add KomaMRICore\n\n(@v1.9) pkg> add KomaMRIPlots","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"Next, open Jupyter, navigate to a working folder, and create a new notebook by clicking on New, then Julia 1.9.3.\"","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":" ","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"A new, empty notebook will appear:","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":" ","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"Proceed to write and execute the provided example:","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"View code ","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"# Import modules\nusing KomaMRICore, KomaMRIPlots\n\n# Define sequence\nampRF = 2e-6 # 2 uT RF amplitude\ndurRF = π / 2 / (2π * γ * ampRF) # required duration for a 90 deg RF pulse\nexc = RF(ampRF, durRF)\n\nnADC = 8192 # number of acquisition samples\ndurADC = 250e-3 # duration of the acquisition\ndelay = 1e-3 # small delay\nacq = ADC(nADC, durADC, delay)\n\nseq = Sequence() # empty sequence\nseq += exc # adding RF-only block\nseq += acq # adding ADC-only block\n\n# Plot the sequence\nplot_seq(seq; slider=false, height=300)","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":" ","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":" ","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"This should be sufficient, and now you can start working with KomaMRI using Jupyter notebooks.","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"If you encounter the issue of WebIO not being detected:","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":" ","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"Refer to this IJulia documentation and this troubleshooting guide for details. Essentially, you need to install a WebIO extension depending on your Jupyter installation.","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase","page":"KomaMRIBase","title":"KomaMRIBase","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"CurrentModule = KomaMRIBase","category":"page"},{"location":"reference/2-koma-base/#Scanner-related-functions","page":"KomaMRIBase","title":"Scanner-related functions","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"Scanner","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.Scanner","page":"KomaMRIBase","title":"KomaMRIBase.Scanner","text":"sys = Scanner(B0, B1, Gmax, Smax, ADC_Δt, seq_Δt, GR_Δt, RF_Δt,\n RF_ring_down_T, RF_dead_time_T, ADC_dead_time_T)\n\nThe Scanner struct. It contains hardware limitations of the MRI resonator. It is an input for the simulation.\n\nArguments\n\nB0: (::Real, =1.5, [T]) main magnetic field strength\nB1: (::Real, =10e-6, [T]) maximum RF amplitude\nGmax: (::Real, =60e-3, [T/m]) maximum gradient amplitude\nSmax: (::Real, =500, [mT/m/ms]) gradient's maximum slew-rate\nADC_Δt: (::Real, =2e-6, [s]) ADC raster time\nseq_Δt: (::Real, =1e-5, [s]) sequence-block raster time\nGR_Δt: (::Real, =1e-5, [s]) gradient raster time\nRF_Δt: (::Real, =1e-6, [s]) RF raster time\nRF_ring_down_T: (::Real, =20e-6, [s]) RF ring down time\nRF_dead_time_T: (::Real, =100e-6, [s]) RF dead time\nADC_dead_time_T: (::Real, =10e-6, [s]) ADC dead time\n\nReturns\n\nsys: (::Scanner) Scanner struct\n\nExamples\n\njulia> sys = Scanner()\n\njulia> sys.B0\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#Phantom-related-functions","page":"KomaMRIBase","title":"Phantom-related functions","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"Phantom\nbrain_phantom2D\nbrain_phantom3D\npelvis_phantom2D\nheart_phantom","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.Phantom","page":"KomaMRIBase","title":"KomaMRIBase.Phantom","text":"obj = Phantom(name, x, y, z, ρ, T1, T2, T2s, Δw, Dλ1, Dλ2, Dθ, motion)\n\nThe Phantom struct. Most of its field names are vectors, with each element associated with a property value representing a spin. This struct serves as an input for the simulation.\n\nArguments\n\nname: (::String) phantom name\nx: (::AbstractVector{T<:Real}, [m]) spin x-position vector\ny: (::AbstractVector{T<:Real}, [m]) spin y-position vector\nz: (::AbstractVector{T<:Real}, [m]) spin z-position vector\nρ: (::AbstractVector{T<:Real}) spin proton density vector\nT1: (::AbstractVector{T<:Real}, [s]) spin T1 parameter vector\nT2: (::AbstractVector{T<:Real}, [s]) spin T2 parameter vector\nT2s: (::AbstractVector{T<:Real}, [s]) spin T2s parameter vector\nΔw: (::AbstractVector{T<:Real}, [rad/s]) spin off-resonance parameter vector\nDλ1: (::AbstractVector{T<:Real}) spin Dλ1 (diffusion) parameter vector\nDλ2: (::AbstractVector{T<:Real}) spin Dλ2 (diffusion) parameter vector\nDθ: (::AbstractVector{T<:Real}) spin Dθ (diffusion) parameter vector\nmotion: (::AbstractMotion{T<:Real}) motion\n\nReturns\n\nobj: (::Phantom) Phantom struct\n\nExamples\n\njulia> obj = Phantom(x=[0.0])\n\njulia> obj.ρ\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.brain_phantom2D","page":"KomaMRIBase","title":"KomaMRIBase.brain_phantom2D","text":"phantom = brain_phantom2D(;axis=\"axial\", ss=4)\n\nCreates a two-dimensional brain Phantom struct. Default ss=4 sample spacing is 2 mm. Original file (ss=1) sample spacing is .5 mm.\n\nReferences\n\nB. Aubert-Broche, D.L. Collins, A.C. Evans: \"A new improved version of the realistic digital brain phantom\" NeuroImage, in review - 2006\nB. Aubert-Broche, M. Griffin, G.B. Pike, A.C. Evans and D.L. Collins: \"20 new digital brain phantoms for creation of validation image data bases\" IEEE TMI, in review - 2006\nhttps://brainweb.bic.mni.mcgill.ca/brainweb/tissuemrparameters.txt\n\nKeywords\n\naxis: (::String, =\"axial\", opts=[\"axial\", \"coronal\", \"sagittal\"]) orientation of the phantom\nss: (::Integer or ::Vector{Integer}, =4) subsampling parameter for all axes if scaler, per axis if 2 element vector [ssx, ssy]\nus: (::Integer or ::Vector{Integer}, =1) upsampling parameter for all axes if scaler, per axis if 2 element vector [usx, usy], if used ss is set to ss=1\n\nReturns\n\nobj: (::Phantom) Phantom struct\n\nExamples\n\njulia> obj = brain_phantom2D(; axis=\"sagittal\", ss=1)\n\njulia> obj = brain_phantom2D(; axis=\"axial\", us=[1, 2])\n\njulia> plot_phantom_map(obj, :ρ)\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.brain_phantom3D","page":"KomaMRIBase","title":"KomaMRIBase.brain_phantom3D","text":"obj = brain_phantom3D(; ss=4, us=1, start_end=[160,200])\n\nCreates a three-dimentional brain Phantom struct. Default ss=4 sample spacing is 2 mm. Original file (ss=1) sample spacing is .5 mm. \n\nReferences\n\nB. Aubert-Broche, D.L. Collins, A.C. Evans: \"A new improved version of the realistic digital brain phantom\" NeuroImage, in review - 2006\nB. Aubert-Broche, M. Griffin, G.B. Pike, A.C. Evans and D.L. Collins: \"20 new digital brain phantoms for creation of validation image data bases\" IEEE TMI, in review - 2006\nhttps://brainweb.bic.mni.mcgill.ca/brainweb/tissuemrparameters.txt\n\nKeywords\n\nss: (::Integer or ::Vector{Integer}, =4) subsampling parameter for all axes if scaler, per axis if 3 element vector [ssx, ssy, ssz]\nus: (::Integer or ::Vector{Integer}, =1) upsampling parameter for all axes if scaler, per axis if 3 element vector [usx, usy, usz]\nstart_end: (::Vector{Integer}, =[160,200]) z index range of presampled phantom, 180 is center\n\nReturns\n\nobj: (::Phantom) 3D Phantom struct\n\nExamples\n\njulia> obj = brain_phantom3D(; ss=5)\n\njulia> obj = brain_phantom3D(; us=[2, 2, 1])\n\njulia> plot_phantom_map(obj, :ρ)\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.pelvis_phantom2D","page":"KomaMRIBase","title":"KomaMRIBase.pelvis_phantom2D","text":"obj = pelvis_phantom2D(; ss=4, us=1)\n\nCreates a two-dimensional pelvis Phantom struct. Default ss=4 sample spacing is 2 mm. Original file (ss=1) sample spacing is .5 mm.\n\nKeywords\n\nss: (::Integer or ::Vector{Integer}, =4) subsampling parameter for all axes if scaler, per axis if 2 element vector [ssx, ssy]\nus: (::Integer or ::Vector{Integer}, =1) upsampling parameter for all axes if scaler, per axis if 2 element vector [usx, usy]\n\nReturns\n\nobj: (::Phantom) Phantom struct\n\nExamples\n\njulia> obj = pelvis_phantom2D(; ss=2])\n\njulia> obj = pelvis_phantom2D(; us=[1, 2])\n\njulia> pelvis_phantom2D(obj, :ρ)\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.heart_phantom","page":"KomaMRIBase","title":"KomaMRIBase.heart_phantom","text":"obj = heart_phantom(\n circumferential_strain, radial_strain, rotation_angle; \n heart_rate, asymmetry\n)\n\nHeart-like LV 2D phantom. The variable circumferential_strain and radial_strain are for streching (if positive) or contraction (if negative). rotation_angle is for rotation.\n\nKeywords\n\ncircumferential_strain: (::Real, =-0.3) contraction parameter. Between -1 and 1\nradial_strain: (::Real, =-0.3) contraction parameter. Between -1 and 1\nrotation_angle: (::Real, =15.0, [º]) maximum rotation angle\nheart_rate: (::Real, =60, [bpm]) heartbeat frequency\ntemporal_asymmetry: (::Real, =0.2) time fraction of the period in which the systole occurs. Therefore, diastole lasts for period * (1 - temporal_asymmetry)\n\nReturns\n\nobj: (::Phantom) Heart-like LV phantom struct\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#Motion-related-functions","page":"KomaMRIBase","title":"Motion-related functions","text":"","category":"section"},{"location":"reference/2-koma-base/#AbstractMotion-types-and-related-functions","page":"KomaMRIBase","title":"AbstractMotion types and related functions","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"NoMotion\nMotionList\nget_spin_coords","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.NoMotion","page":"KomaMRIBase","title":"KomaMRIBase.NoMotion","text":"nomotion = NoMotion{T<:Real}()\n\nNoMotion struct. It is used to create static phantoms.\n\nReturns\n\nnomotion: (::NoMotion) NoMotion struct\n\nExamples\n\njulia> nomotion = NoMotion{Float64}()\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.MotionList","page":"KomaMRIBase","title":"KomaMRIBase.MotionList","text":"motionlist = MotionList(motions...)\n\nMotionList struct. The other option, instead of NoMotion, is to define a dynamic phantom by means of the MotionList struct. It is composed by one or more Motion instances. \n\nArguments\n\nmotions: (::Vector{Motion{T<:Real}}) vector of Motion instances\n\nReturns\n\nmotionlist: (::MotionList) MotionList struct\n\nExamples\n\njulia> motionlist = MotionList(\n Motion(\n action = Translate(0.01, 0.0, 0.02),\n time = TimeRange(0.0, 1.0),\n spins = AllSpins()\n ),\n Motion(\n action = Rotate(0.0, 0.0, 45.0),\n time = Periodic(1.0),\n spins = SpinRange(1:10)\n )\n )\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.get_spin_coords","page":"KomaMRIBase","title":"KomaMRIBase.get_spin_coords","text":"x, y, z = get_spin_coords(motionset, x, y, z, t)\n\nCalculates the position of each spin at a set of arbitrary time instants, i.e. the time steps of the simulation. For each dimension (x, y, z), the output matrix has N_\tspins rows and length(t) columns.\n\nArguments\n\nmotionset: (::AbstractMotion{T<:Real}) phantom motion\nx: (::AbstractVector{T<:Real}, [m]) spin x-position vector\ny: (::AbstractVector{T<:Real}, [m]) spin y-position vector\nz: (::AbstractVector{T<:Real}, [m]) spin z-position vector\nt: horizontal array of time instants\n\nReturns\n\nx, y, z: (::Tuple{AbstractArray, AbstractArray, AbstractArray}) spin positions over time\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#Motion","page":"KomaMRIBase","title":"Motion","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"Motion","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.Motion","page":"KomaMRIBase","title":"KomaMRIBase.Motion","text":"motion = Motion(action)\nmotion = Motion(action, time)\nmotion = Motion(action, time, spins)\n\nMotion struct. It defines the motion, during a certain time interval, of a given group of spins. It is composed by three fields: action, which defines the motion itself, time, which accounts for the time during which the motion takes place, and spins, which indicates the spins that are affected by that motion.\n\nArguments\n\naction: (::AbstractAction{T<:Real}) action, such as Translate or Rotate\ntime: (::AbstractTimeSpan{T<:Real}, =TimeRange(0.0)) time information about the motion\nspins: (::AbstractSpinSpan, =AllSpins()) spin indexes affected by the motion\n\nReturns\n\nmotion: (::Motion) Motion struct\n\nExamples\n\njulia> motion = Motion(\n action = Translate(0.01, 0.0, 0.02),\n time = TimeRange(0.0, 1.0),\n spins = SpinRange(1:10)\n )\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#AbstractAction-types","page":"KomaMRIBase","title":"AbstractAction types","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"Translate\nTranslate(dx, dy, dz, time, spins)\nRotate\nRotate(pitch, roll, yaw, time, spins)\nHeartBeat\nHeartBeat(circumferential_strain, radial_strain, longitudinal_strain, time, spins)\nPath\nPath(dx, dy, dz, time, spins)\nFlowPath\nFlowPath(dx, dy, dz, spin_reset, time, spins)","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.Translate","page":"KomaMRIBase","title":"KomaMRIBase.Translate","text":"translate = Translate(dx, dy, dz)\n\nTranslate struct. It produces a linear translation. Its fields are the final displacements in the three axes (dx, dy, dz).\n\nArguments\n\ndx: (::Real, [m]) translation in x\ndy: (::Real, [m]) translation in y \ndz: (::Real, [m]) translation in z\n\nReturns\n\ntranslate: (::Translate) Translate struct\n\nExamples\n\njulia> translate = Translate(dx=0.01, dy=0.02, dz=0.03)\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.Translate-NTuple{5, Any}","page":"KomaMRIBase","title":"KomaMRIBase.Translate","text":"translate = Translate(dx, dy, dz, time, spins)\n\nArguments\n\ndx: (::Real, [m]) translation in x\ndy: (::Real, [m]) translation in y \ndz: (::Real, [m]) translation in z\ntime: (::AbstractTimeSpan{T<:Real}) time information about the motion\nspins: (::AbstractSpinSpan) spin indexes affected by the motion\n\nReturns\n\ntranslate: (::Motion) Motion struct\n\nExamples\n\njulia> translate = Translate(0.01, 0.02, 0.03, TimeRange(0.0, 1.0), SpinRange(1:10))\n\n\n\n\n\n","category":"method"},{"location":"reference/2-koma-base/#KomaMRIBase.Rotate","page":"KomaMRIBase","title":"KomaMRIBase.Rotate","text":"rotate = Rotate(pitch, roll, yaw)\n\nRotate struct. It produces a rotation in the three axes: x (pitch), y (roll), and z (yaw). We follow the RAS (Right-Anterior-Superior) orientation, and the rotations are applied following the right-hand rule (counter-clockwise):\n\n(Image: Head Rotation Axis)\n\nThe applied rotation matrix is obtained as follows: \n\nbeginequation\nbeginaligned\nR = R_z(alpha) R_y(beta) R_x(gamma) \n = beginbmatrix\ncos alpha -sin alpha 0 \nsin alpha cos alpha 0 \n0 0 1\nendbmatrix\nbeginbmatrix\ncos beta 0 sin beta \n0 1 0 \n-sin beta 0 cos beta\nendbmatrix\nbeginbmatrix\n1 0 0 \n0 cos gamma -sin gamma \n0 sin gamma cos gamma\nendbmatrix \n = beginbmatrix\ncos alpha cos beta cos alpha sin beta sin gamma - sin alpha cos gamma cos alpha sin beta cos gamma + sin alpha sin gamma \nsin alpha cos beta sin alpha sin beta sin gamma + cos alpha cos gamma sin alpha sin beta cos gamma - cos alpha sin gamma \n-sin beta cos beta sin gamma cos beta cos gamma\nendbmatrix\nendaligned\nendequation\n\nArguments\n\npitch: (::Real, [º]) rotation in x\nroll: (::Real, [º]) rotation in y \nyaw: (::Real, [º]) rotation in z\n\nReturns\n\nrotate: (::Rotate) Rotate struct\n\nExamples\n\njulia> rotate = Rotate(pitch=15.0, roll=0.0, yaw=20.0)\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.Rotate-NTuple{5, Any}","page":"KomaMRIBase","title":"KomaMRIBase.Rotate","text":"rotate = Rotate(pitch, roll, yaw, spins)\n\nArguments\n\npitch: (::Real, [º]) rotation in x\nroll: (::Real, [º]) rotation in y \nyaw: (::Real, [º]) rotation in z\ntime: (::AbstractTimeSpan{T<:Real}) time information about the motion\nspins: (::AbstractSpinSpan) spin indexes affected by the motion\n\nReturns\n\nrotate: (::Motion) Motion struct with Rotate action\n\nExamples\n\njulia> rotate = Rotate(15.0, 0.0, 20.0, TimeRange(0.0, 1.0), SpinRange(1:10))\n\n\n\n\n\n","category":"method"},{"location":"reference/2-koma-base/#KomaMRIBase.HeartBeat","page":"KomaMRIBase","title":"KomaMRIBase.HeartBeat","text":"heartbeat = HeartBeat(circumferential_strain, radial_strain, longitudinal_strain)\n\nHeartBeat struct. It produces a heartbeat-like motion, characterised by three types of strain: circumferential, radial and longitudinal\n\nArguments\n\ncircumferential_strain: (::Real) contraction parameter\nradial_strain: (::Real) contraction parameter\nlongitudinal_strain: (::Real) contraction parameter\n\nReturns\n\nheartbeat: (::HeartBeat) HeartBeat struct\n\nExamples\n\njulia> heartbeat = HeartBeat(circumferential_strain=-0.3, radial_strain=-0.2, longitudinal_strain=0.0)\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.HeartBeat-NTuple{5, Any}","page":"KomaMRIBase","title":"KomaMRIBase.HeartBeat","text":"heartbeat = HeartBeat(circumferential_strain, radial_strain, longitudinal_strainl, time, spins)\n\nArguments\n\ncircumferential_strain: (::Real) contraction parameter\nradial_strain: (::Real) contraction parameter\nlongitudinal_strain: (::Real) contraction parameter\ntime: (::AbstractTimeSpan{T<:Real}) time information about the motion\nspins: (::AbstractSpinSpan) spin indexes affected by the motion\n\nReturns\n\nheartbeat: (::Motion) Motion struct with HeartBeat action\n\nExamples\n\njulia> heartbeat = HeartBeat(-0.3, -0.2, 0.0, TimeRange(0.0, 1.0), SpinRange(1:10))\n\n\n\n\n\n","category":"method"},{"location":"reference/2-koma-base/#KomaMRIBase.Path","page":"KomaMRIBase","title":"KomaMRIBase.Path","text":"path = Path(dx, dy, dz)\n\nPath struct. For this action (and for FlowPath), motion is not defined solely on the basis of three numerical parameters, one for each spatial direction, as occurs for the Translate, Rotate and HeartBeat actions.\n\nFor this action, it is necessary to define motion for each spin independently, in x (dx), y (dy) and z (dz). dx, dy and dz are now three matrixes, of (N_spins* times N_discretetimes) each. This means that each row corresponds to a spin trajectory over a set of discrete time instants.\n\nnote: Note\n*When creating a motion with Flow or FlowPath, you must make sure that the number of rows of the matrices dx, dy and dz matches the number of spins that are affected by the motion. Remember that the range of spins affected by a motion is defined by the spins field of the Motion structexample:julia> motion = Motion(\n action = Path(\n dx=[0.01 0.02; 0.02 0.03], # 2 rows\n dy=[0.02 0.03; 0.03 0.04], \n dz=[0.03 0.04; 0.04 0.05]),\n time = TimeRange(0.0, 1.0),\n spins = SpinRange(1:2) # 2 spins\n)\n\nArguments\n\ndx: (::AbstractArray{T<:Real}, [m]) displacements in x\ndy: (::AbstractArray{T<:Real}, [m]) displacements in y \ndz: (::AbstractArray{T<:Real}, [m]) displacements in z\n\nReturns\n\npath: (::Path) Path struct\n\nExamples\n\njulia> path = Path(\n dx=[0.01 0.02; 0.02 0.03], \n dy=[0.02 0.03; 0.03 0.04], \n dz=[0.03 0.04; 0.04 0.05]\n )\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.Path-NTuple{5, Any}","page":"KomaMRIBase","title":"KomaMRIBase.Path","text":"path = Path(dx, dy, dz, time, spins)\n\nArguments\n\ndx: (::AbstractArray{T<:Real}, [m]) displacements in x\ndy: (::AbstractArray{T<:Real}, [m]) displacements in y \ndz: (::AbstractArray{T<:Real}, [m]) displacements in z\ntime: (::AbstractTimeSpan{T<:Real}) time information about the motion\nspins: (::AbstractSpinSpan) spin indexes affected by the motion\n\nReturns\n\npath: (::Motion) Motion struct with Path action\n\nExamples\n\njulia> path = Path(\n [0.01 0.02; 0.02 0.03], \n [0.02 0.03; 0.03 0.04], \n [0.03 0.04; 0.04 0.05], \n TimeRange(0.0, 1.0), \n SpinRange(1:10)\n )\n\n\n\n\n\n","category":"method"},{"location":"reference/2-koma-base/#KomaMRIBase.FlowPath","page":"KomaMRIBase","title":"KomaMRIBase.FlowPath","text":"flowpath = FlowPath(dx, dy, dz, spin_reset)\n\nFlowPath struct. This action is the same as Path, except that it includes an additional field, called spin_reset, which accounts for spins leaving the volume and being remapped to another input position. When this happens, the magnetization state of these spins must be reset during the simulation. \n\nAs with the dx, dy and dz matrices, spin_reset has a size of (N_spins times N_discretetimes).\n\nArguments\n\ndx: (::AbstractArray{T<:Real}, [m]) displacements in x\ndy: (::AbstractArray{T<:Real}, [m]) displacements in y \ndz: (::AbstractArray{T<:Real}, [m]) displacements in z\nspin_reset: (::AbstractArray{Bool}) reset spin state flags\n\nReturns\n\nflowpath: (::FlowPath) FlowPath struct\n\nExamples\n\njulia> flowpath = FlowPath(\n dx=[0.01 0.02; 0.02 0.03], \n dy=[0.02 0.03; 0.03 0.04], \n dz=[0.03 0.04; 0.04 -0.04],\n spin_reset=[false false; false true]\n )\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.FlowPath-NTuple{6, Any}","page":"KomaMRIBase","title":"KomaMRIBase.FlowPath","text":"flowpath = FlowPath(dx, dy, dz, spin_reset, time, spins)\n\nArguments\n\ndx: (::AbstractArray{T<:Real}, [m]) displacements in x\ndy: (::AbstractArray{T<:Real}, [m]) displacements in y \ndz: (::AbstractArray{T<:Real}, [m]) displacements in z\nspin_reset: (::AbstractArray{Bool}) reset spin state flags\ntime: (::AbstractTimeSpan{T<:Real}) time information about the motion\nspins: (::AbstractSpinSpan) spin indexes affected by the motion\n\nReturns\n\nflowpath: (::Motion) Motion struct with FlowPath action\n\nExamples\n\njulia> flowpath = FlowPath(\n [0.01 0.02; 0.02 0.03], \n [0.02 0.03; 0.03 0.04], \n [0.03 0.04; 0.04 0.05], \n [false false; false true],\n TimeRange(0.0, 1.0), \n SpinRange(1:10)\n )\n\n\n\n\n\n","category":"method"},{"location":"reference/2-koma-base/#AbstractTimeSpan-types-and-related-functions","page":"KomaMRIBase","title":"AbstractTimeSpan types and related functions","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"TimeRange\nPeriodic\nunit_time","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.TimeRange","page":"KomaMRIBase","title":"KomaMRIBase.TimeRange","text":"timerange = TimeRange(t_start, t_end)\n\nTimeRange struct. It is a specialized type that inherits from AbstractTimeSpan and defines a time interval, with start and end times.\n\nArguments\n\nt_start: (::Real, [s]) start time\nt_end: (::Real, [s]) end time\n\nReturns\n\ntimerange: (::TimeRange) TimeRange struct\n\nExamples\n\njulia> timerange = TimeRange(0.0, 1.0)\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.Periodic","page":"KomaMRIBase","title":"KomaMRIBase.Periodic","text":"periodic = Periodic(period, asymmetry)\n\nPeriodic struct. It is a specialized type that inherits from AbstractTimeSpan, designed to work with time intervals that repeat periodically. It includes a measure of asymmetry in order to recreate a asymmetric period.\n\nArguments\n\nperiod: (::Real, [s]) period duration\nasymmetry: (::Real, =0.5) temporal asymmetry factor. Between 0 and 1.\n\nReturns\n\nperiodic: (::Periodic) Periodic struct\n\nExamples\n\njulia> periodic = Periodic(1.0, 0.2)\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.unit_time","page":"KomaMRIBase","title":"KomaMRIBase.unit_time","text":"t_unit = unit_time(t, time_range)\n\nThe unit_time function normalizes a given array of time values t to a unit interval [0, 1] based on a specified start time t_start and end time t_end. This function is used for non-periodic motions, where each element of t is transformed to fit within the range [0, 1] based on the provided start and end times.\n\n(Image: Unit Time)\n\nArguments\n\nt: (::AbstractArray{T<:Real}, [s]) array of time values to be normalized\ntime_range: (::TimeRange{T<:Real}, [s]) time interval (defined by t_start and t_end) over which we want to normalise\n\nReturns\n\nt_unit: (::AbstractArray{T<:Real}, [s]) array of normalized time values\n\nExamples\n\njulia> t_unit = KomaMRIBase.unit_time([0.0, 1.0, 2.0, 3.0, 4.0, 5.0], TimeRange(1.0, 4.0))\n6-element Vector{Float64}:\n 0.0\n 0.0\n 0.333\n 0.666\n 1.0\n 1.0\n\n\n\n\n\nt_unit = unit_time(t, periodic)\n\nThe unit_time function normalizes a given array of time values t to a unit interval [0, 1] for periodic motions, based on a specified period and an asymmetry factor. This function is useful for creating triangular waveforms or normalizing time values in periodic processes.\n\n(Image: Unit Time Triangular)\n\nArguments\n\nt: (::AbstractArray{T<:Real}, [s]) array of time values to be normalized\nperiodic: (::Periodic{T<:Real}, [s]) information about the period and the temporal asymmetry\n\nReturns\n\nt_unit: (::AbstractArray{T<:Real}, [s]) array of normalized time values\n\nExamples\n\njulia> t_unit = KomaMRIBase.unit_time([0.0, 1.0, 2.0, 3.0, 4.0, 5.0], Periodic(4.0, 0.5))\n6-element Vector{Float64}:\n 0.0\n 0.5\n 1.0\n 0.5\n 0.0\n 0.5\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#AbstractSpinSapn-types","page":"KomaMRIBase","title":"AbstractSpinSapn types","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"AllSpins\nSpinRange","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.AllSpins","page":"KomaMRIBase","title":"KomaMRIBase.AllSpins","text":"allspins = AllSpins()\n\nAllSpins struct. It is a specialized type that inherits from AbstractSpinSpan and is used to cover all the spins of a phantom.\n\nReturns\n\nallspins: (::AllSpins) AllSpins struct\n\nExamples\n\njulia> allspins = AllSpins()\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.SpinRange","page":"KomaMRIBase","title":"KomaMRIBase.SpinRange","text":"spinrange = SpinRange(range)\n\nSpinRange struct. It is a specialized type that inherits from AbstractSpinSpan and is used to select a certain range and number of spins.\n\nArguments\n\nrange: (::AbstractVector) spin id's. This argument can be a Range, a Vector or a BitVector\n\nReturns\n\nspinrange: (::SpinRange) SpinRange struct\n\nExamples\n\njulia> spinrange = SpinRange(1:10)\njulia> spinrange = SpinRange([1, 3, 5, 7])\njulia> spinrange = SpinRange(obj.x .> 0)\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#Sequence-related-functions","page":"KomaMRIBase","title":"Sequence-related functions","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"Sequence\ndur\nget_block_start_times\nget_flip_angles","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.Sequence","page":"KomaMRIBase","title":"KomaMRIBase.Sequence","text":"seq = Sequence()\nseq = Sequence(GR)\nseq = Sequence(GR, RF)\nseq = Sequence(GR, RF, ADC)\nseq = Sequence(GR, RF, ADC, DUR)\nseq = Sequence(GR::Array{Grad,1})\nseq = Sequence(GR::Array{Grad,1}, RF::Array{RF,1})\nseq = Sequence(GR::Array{Grad,1}, RF::Array{RF,1}, A::ADC, DUR, DEF)\n\nThe Sequence struct. It contains events of an MRI sequence. Most field names (except for the DEF field) consist of matrices or vectors, where each column index represents a sequence block. This struct serves as an input for the simulation.\n\nArguments\n\nGR: (::Matrix{Grad}) gradient matrix. Rows for x-y-z amplitudes and columns are for blocks\nRF: (::Matrix{RF}) RF matrix. The 1 row is for the coil and columns are for blocks\nADC: (::Array{ADC,1}) ADC block vector\nDUR: (::Vector, [s]) duration block vector\nDEF: (::Dict{String, Any}) dictionary with relevant information of the sequence. Possible keys could be [\"AdcRasterTime\", \"GradientRasterTime\", \"Name\", \"Nz\", \"Num_Blocks\", \"Nx\", \"Ny\", \"PulseqVersion\", \"BlockDurationRaster\", \"FileName\", \"RadiofrequencyRasterTime\"]\n\nReturns\n\nseq: (::Sequence) Sequence struct\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.dur","page":"KomaMRIBase","title":"KomaMRIBase.dur","text":"y = dur(x::Grad)\ny = dur(x::Vector{Grad})\ny = dur(x::Matrix{Grad})\n\nDuration time in [s] of Grad struct or Grad Array.\n\nArguments\n\nx: (::Grad or ::Vector{Grad} or ::Matrix{Grad}) Grad struct or Grad Array\n\nReturns\n\ny: (::Float64, [s]) duration of the Grad struct or Grad Array\n\n\n\n\n\ny = dur(x::RF)\ny = dur(x::Vector{RF})\ny = dur(x::Matrix{RF})\n\nDuration time in [s] of RF struct or RF Array.\n\nArguments\n\nx: (::RF or ::Vector{RF} or ::Matrix{RF}) RF struct or RF array\n\nReturns\n\ny: (::Float64, [s]) duration of the RF struct or RF array\n\n\n\n\n\nT = dur(x::Sequence)\n\nThe total duration of the sequence in [s].\n\nArguments\n\nx: (::Sequence) Sequence struct\n\nReturns\n\nT: (::Real, [s]) total duration of the sequence\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.get_block_start_times","page":"KomaMRIBase","title":"KomaMRIBase.get_block_start_times","text":"T0 = get_block_start_times(seq::Sequence)\n\nReturns a vector containing the start times of blocks in a sequence. The initial time is always zero, and the final time corresponds to the duration of the sequence.\n\nArguments\n\nseq: (::Sequence) Sequence struct\n\nReturns\n\nT0: (::Vector, [s]) start times of the blocks in a sequence\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.get_flip_angles","page":"KomaMRIBase","title":"KomaMRIBase.get_flip_angles","text":"y = get_flip_angles(x::Sequence)\n\nReturns all the flip angles of the RF pulses in the sequence x.\n\nArguments\n\nx: (::Sequence) Sequence struct\n\nReturns\n\ny: (::Vector{Float64}, [deg]) flip angles\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#Grad","page":"KomaMRIBase","title":"Grad","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"Grad\nGrad(::Function, ::Real, ::Int64)","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.Grad","page":"KomaMRIBase","title":"KomaMRIBase.Grad","text":"gr = Grad(A, T)\ngr = Grad(A, T, rise)\ngr = Grad(A, T, rise, delay)\ngr = Grad(A, T, rise, fall, delay)\ngr = Grad(A, T, rise, fall, delay, first, last)\n\nThe Grad struct represents a gradient of a sequence event.\n\nArguments\n\nA: (::Real or ::Vector, [T/m]) amplitude of the gradient\nT: (::Real or ::Vector, [s]) duration of the flat-top\nrise: (::Real, [s]) duration of the rise\nfall: (::Real, [s]) duration of the fall\ndelay: (::Real, [s]) duration of the delay\n\nReturns\n\ngr: (::Grad) gradient struct\n\nExamples\n\njulia> gr = Grad(1, 1, 0.1, 0.1, 0.2)\n\njulia> seq = Sequence([gr]); plot_seq(seq)\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.Grad-Tuple{Function, Real, Int64}","page":"KomaMRIBase","title":"KomaMRIBase.Grad","text":"gr = Grad(f::Function, T::Real, N::Integer; delay::Real)\n\nGenerates an arbitrary gradient waveform defined by the function f in the interval t ∈ [0,T]. The time separation between two consecutive samples is given by T/(N-1).\n\nArguments\n\nf: (::Function) function that describes the gradient waveform\nT: (::Real, [s]) duration of the gradient waveform\nN: (::Integer, =300) number of samples of the gradient waveform\n\nKeywords\n\ndelay: (::Real, =0, [s]) delay time of the waveform\n\nReturns\n\ngr: (::Grad) gradient struct\n\nExamples\n\njulia> gx = Grad(t -> sin(π*t / 0.8), 0.8)\n\njulia> seq = Sequence([gx]); plot_seq(seq)\n\n\n\n\n\n","category":"method"},{"location":"reference/2-koma-base/#RF","page":"KomaMRIBase","title":"RF","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"RF\nRF(::Function, ::Real, ::Int64)\nget_flip_angle","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.RF","page":"KomaMRIBase","title":"KomaMRIBase.RF","text":"rf = RF(A, T)\nrf = RF(A, T, Δf)\nrf = RF(A, T, Δf, delay)\n\nThe RF struct represents a Radio Frequency excitation of a sequence event.\n\nArguments\n\nA: (::Complex, [T]) RF complex amplitud modulation (AM), B_1(t) = B_1(t) e^iphi(t) = B_1(t) + iB_1y(t)\nT: (::Real, [s]) RF duration\nΔf: (::Real or ::Vector, [Hz]) RF frequency difference with respect to the Larmor frequency. This can be a number but also a vector to represent frequency modulated signals (FM).\ndelay: (::Real, [s]) RF delay time\n\nReturns\n\nrf: (::RF) the RF struct\n\nExamples\n\njulia> rf = RF(1, 1, 0, 0.2)\n\njulia> seq = Sequence(); seq += rf; plot_seq(seq)\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.RF-Tuple{Function, Real, Int64}","page":"KomaMRIBase","title":"KomaMRIBase.RF","text":"rf = RF_fun(f::Function, T::Real, N::Int64)\n\nGenerate an RF sequence with amplitudes sampled from a function waveform.\n\nnote: Note\nThis function is not being used in this KomaMRI version.\n\nArguments\n\nf: (::Function, [T]) function for the RF amplitud waveform\nT: (::Real, [s]) duration of the RF pulse\nN: (::Int64) number of samples of the RF pulse\n\nReturns\n\nrf:(::RF) RF struct with amplitud defined by the function f\n\n\n\n\n\n","category":"method"},{"location":"reference/2-koma-base/#KomaMRIBase.get_flip_angle","page":"KomaMRIBase","title":"KomaMRIBase.get_flip_angle","text":"α = get_flip_angle(x::RF)\n\nCalculates the flip angle α [deg] of an RF struct. α = γ ∫ B1(τ) dτ\n\nArguments\n\nx: (::RF) RF struct\n\nReturns\n\nα: (::Int64, [deg]) flip angle RF struct x\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#ADC","page":"KomaMRIBase","title":"ADC","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"ADC\nget_adc_sampling_times\nget_adc_phase_compensation","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.ADC","page":"KomaMRIBase","title":"KomaMRIBase.ADC","text":"adc = ADC(N, T)\nadc = ADC(N, T, delay)\nadc = ADC(N, T, delay, Δf, ϕ)\n\nThe ADC struct represents the Analog to Digital Converter (ADC) of a sequence event.\n\nArguments\n\nN: (::Int64) number of acquired samples\nT: (::Float64, [s]) duration to acquire the samples\ndelay: (::Float64, [s]) delay time to start the acquisition\nΔf: (::Float64, [Hz]) delta frequency. It is meant to compensate RF pulse phases\nϕ: (::Float64, [rad]) phase. It is meant to compensate RF pulse phases\n\nReturns\n\nadc: (::ADC) ADC struct\n\nExamples\n\njulia> adc = ADC(16, 1, 0.1)\n\njulia> seq = Sequence(); seq += adc; plot_seq(seq)\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.get_adc_sampling_times","page":"KomaMRIBase","title":"KomaMRIBase.get_adc_sampling_times","text":"times = get_adc_sampling_times(seq)\n\nReturns an array of times when the samples of the sequence seq are acquired.\n\nArguments\n\nseq: (::Sequence) sequence struct\n\nReturns\n\ntimes: (::Vector{Float64}, [s]) time array when samples are acquired\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.get_adc_phase_compensation","page":"KomaMRIBase","title":"KomaMRIBase.get_adc_phase_compensation","text":"comp = get_adc_phase_compensation(seq)\n\nReturns an array of phase compensation factors, exp(-mathrmivarphi), which are used to compensate the acquired signal S by applying the operation S_mathrmcomp = S exp(-mathrmivarphi) after the simulation. This compensation is necessary because the signal typically exhibits a phase offset of varphi following RF excitation with a phase of varphi. Such pulses are commonly employed in sequences involving RF spoiling.\n\nArguments\n\nseq: (::Sequence) sequence struct\n\nReturns\n\ncomp: (::Vector{Complex}, [rad]) array of phase compensations for every acquired sample\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#Delay","page":"KomaMRIBase","title":"Delay","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"Delay","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.Delay","page":"KomaMRIBase","title":"KomaMRIBase.Delay","text":"delay = Delay(T)\n\nThe Delay struct is meant to add a delay to a sequence by using a sum operator.\n\nArguments\n\nT: (::Real, [s]) time delay value\n\nReturns\n\ndelay: (::Delay) delay struct\n\nExamples\n\njulia> delay = Delay(0.5)\n\njulia> s = Sequence([Grad(1, 1, 0.1)])\n\njulia> seq = delay + s; plot_seq(seq)\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#Rotation-matrices","page":"KomaMRIBase","title":"Rotation matrices","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"rotx\nroty\nrotz","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.rotx","page":"KomaMRIBase","title":"KomaMRIBase.rotx","text":"Rx = rotx(θ::Real)\n\nRotates vector counter-clockwise with respect to the x-axis.\n\nArguments\n\nθ: (::Real, [rad]) rotation angle\n\nReturns\n\nRx: (::Matrix{Int64}) rotation matrix\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.roty","page":"KomaMRIBase","title":"KomaMRIBase.roty","text":"Ry = roty(θ::Real)\n\nRotates vector counter-clockwise with respect to the y-axis.\n\nArguments\n\nθ: (::Real, [rad]) rotation angle\n\nReturns\n\nRy: (::Matrix{Int64}) rotation matrix\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.rotz","page":"KomaMRIBase","title":"KomaMRIBase.rotz","text":"Rz = rotz(θ::Real)\n\nRotates vector counter-clockwise with respect to the z-axis.\n\nArguments\n\nθ: (::Real, [rad]) rotation angle\n\nReturns\n\nRz: (::Matrix{Int64}) rotation matrix\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#Moments","page":"KomaMRIBase","title":"Moments","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"get_Mk\nget_kspace\nget_M0\nget_M1\nget_M2","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.get_Mk","page":"KomaMRIBase","title":"KomaMRIBase.get_Mk","text":"Mk, Mk_adc = get_Mk(seq::Sequence, k; Δt=1, skip_rf=zeros(Bool, sum(is_RF_on.(seq))))\n\nComputes the kth-order moment of the Sequence seq given by the formula int_0^T t^k G(t) dt.\n\nArguments\n\nseq: (::Sequence) Sequence struct\nk: (::Integer) order of the moment to be computed\nΔt: (::Real, =1, [s]) nominal delta time separation between two time samples for ADC acquisition and Gradients\nskip_rf: (::Vector{Bool}, =zeros(Bool, sum(is_RF_on.(seq)))) boolean vector which indicates whether to skip the computation for resetting the integral for excitation or refocusing RF type\n\nReturns\n\nMk: (3-column ::Matrix{Real}) kth-order moment\nMk_adc: (3-column ::Matrix{Real}) kth-order moment sampled at ADC times\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.get_kspace","page":"KomaMRIBase","title":"KomaMRIBase.get_kspace","text":"Computes the k-space trajectory of the Sequence seq. Refer to get_Mk and get_M0\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.get_M0","page":"KomaMRIBase","title":"KomaMRIBase.get_M0","text":"Computes the zero-order moment of the Sequence seq. Refer to get_Mk and get_kspace\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.get_M1","page":"KomaMRIBase","title":"KomaMRIBase.get_M1","text":"Computes the 1st-order moment of the Sequence seq. Refer to get_Mk\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.get_M2","page":"KomaMRIBase","title":"KomaMRIBase.get_M2","text":"Computes the 2nd-order moment of the Sequence seq. Refer to get_Mk\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#Event-checks","page":"KomaMRIBase","title":"Event checks","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"is_RF_on\nis_GR_on\nis_Gx_on\nis_Gy_on\nis_Gz_on\nis_ADC_on","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.is_RF_on","page":"KomaMRIBase","title":"KomaMRIBase.is_RF_on","text":"y = is_RF_on(x::Sequence)\ny = is_RF_on(x::Sequence, t::Vector{Float64})\n\nTells if the sequence seq has elements with RF active, or active during time t.\n\nArguments\n\nx: (::Sequence) Sequence struct\nt: (::Vector{Float64}, [s]) time to check\n\nReturns\n\ny: (::Bool) boolean that tells whether or not the RF in the sequence is active\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.is_GR_on","page":"KomaMRIBase","title":"KomaMRIBase.is_GR_on","text":"y = is_GR_on(x::Sequence)\n\nTells if the sequence seq has elements with GR active.\n\nArguments\n\nx: (::Sequence) Sequence struct\n\nReturns\n\ny: (::Bool) boolean that tells whether or not the GR in the sequence is active\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.is_Gx_on","page":"KomaMRIBase","title":"KomaMRIBase.is_Gx_on","text":"y = is_Gx_on(x::Sequence)\n\nTells if the sequence seq has elements with GR active in x direction.\n\nArguments\n\nx: (::Sequence) Sequence struct\n\nReturns\n\ny: (::Bool) boolean that tells whether or not the GRx in the sequence is active\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.is_Gy_on","page":"KomaMRIBase","title":"KomaMRIBase.is_Gy_on","text":"y = is_Gy_on(x::Sequence)\n\nTells if the sequence seq has elements with GR active in y direction.\n\nArguments\n\nx: (::Sequence) Sequence struct\n\nReturns\n\ny: (::Bool) boolean that tells whether or not the GRy in the sequence is active\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.is_Gz_on","page":"KomaMRIBase","title":"KomaMRIBase.is_Gz_on","text":"y = is_Gz_on(x::Sequence)\n\nTells if the sequence seq has elements with GR active in z direction.\n\nArguments\n\nx: (::Sequence) Sequence struct\n\nReturns\n\ny: (::Bool) boolean that tells whether or not the GRz in the sequence is active\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.is_ADC_on","page":"KomaMRIBase","title":"KomaMRIBase.is_ADC_on","text":"y = is_ADC_on(x::Sequence)\ny = is_ADC_on(x::Sequence, t::Union{Array{Float64,1}, Array{Float64,2}})\n\nTells if the sequence seq has elements with ADC active, or active during time t.\n\nArguments\n\nx: (::Sequence) sequence struct\nt: (::Union{Array{Float64,1}, Array{Float64,2}}, [s]) time to check\n\nReturns\n\ny: (::Bool) boolean that tells whether or not the ADC in the sequence is active\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#DiscreteSequence","page":"KomaMRIBase","title":"DiscreteSequence","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"DiscreteSequence\ndiscretize\nget_samples\ntimes\nampls\nfreqs","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.DiscreteSequence","page":"KomaMRIBase","title":"KomaMRIBase.DiscreteSequence","text":"seqd = DiscreteSequence(Gx, Gy, Gz, B1, Δf, ADC, t, Δt)\n\nA sampled version of a Sequence struct, containing vectors for event amplitudes at specified times. DiscreteSequence is the struct used for simulation.\n\nArguments\n\nGx: (::AbstractVector{T<:Real}, [T/m]) x-gradient vector\nGy: (::AbstractVector{T<:Real}, [T/m]) y-gradient vector\nGz: (::AbstractVector{T<:Real}, [T/m]) z-gradient vector\nB1: (::AbstractVector{Complex{T<:Real}}, [T]) RF amplitude vector\nΔf: (::AbstractVector{T<:Real}, [Hz]) RF carrier frequency displacement vector\nADC: (::AbstractVector{Bool}) ADC sample vector\nt: (::AbstractVector{T<:Real}, [s]) time vector\nΔt: (::AbstractVector{T<:Real}, [s]) delta time vector\n\nReturns\n\nseqd: (::DiscreteSequence) DiscreteSequence struct\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.discretize","page":"KomaMRIBase","title":"KomaMRIBase.discretize","text":"seqd = discretize(seq::Sequence; sampling_params=default_sampling_params())\n\nThis function returns a sampled Sequence struct with RF and gradient time refinements based on simulation parameters.\n\nArguments\n\nseq: (::Sequence) sequence\n\nKeywords\n\nsampling_params: (::Dict{String, Any}, =default_sampling_params()) sampling parameter dictionary\n\nReturns\n\nseqd: (::DiscreteSequence) DiscreteSequence struct\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.get_samples","page":"KomaMRIBase","title":"KomaMRIBase.get_samples","text":"samples = get_samples(seq::Sequence; off_val=0, max_rf_samples=Inf)\n\nReturns the samples of the events in seq.\n\nArguments\n\nseq: (::Sequence) Sequence struct\n\nKeywords\n\noff_val: (::Number, =0) offset value for amplitude. Typically used to hide points in plots by setting it to Inf\nmax_rf_samples: (::Integer, =Inf) maximum number of samples for the RF struct\n\nReturns\n\nsamples: (::NamedTuple) contains samples for gx, gy, gz, rf, and adc events. Each event, represented by e::NamedTuple, includes time samples (e.t) and amplitude samples (e.A)\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.times","page":"KomaMRIBase","title":"KomaMRIBase.times","text":"t = times(gr::Grad)\nt = times(rf::RF)\nt = times(adc::ADC)\n\nGet time samples of MRI sequence event.\n\nArguments\n\ngr: (::Grad) Gradient struct\nrf: (::RF) RF struct\nadc: (::ADC) ADC struct\n\nReturns\n\nt: (::Vector{Number}) vector with time samples\n\n\n\n\n\ntimes = times(motion)\n\n\n\n\n\ntimes \n\n\n\n\n\ntimes \n\n\n\n\n\ntimes = times(motion)\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.ampls","page":"KomaMRIBase","title":"KomaMRIBase.ampls","text":"A = ampls(g::Grad)\nA = ampls(r::RF)\nA = ampls(d::ADC)\n\nGet amplitude samples of MRI sequence event.\n\nArguments\n\ngr: (::Grad) Gradient struct\nrf: (::RF) RF struct\nadc: (::ADC) ADC struct\n\nReturns\n\nA: (::Vector{Number}) vector with amplitude samples\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.freqs","page":"KomaMRIBase","title":"KomaMRIBase.freqs","text":"f = freqs(r::RF)\n\nGet frequency samples of MRI sequence event.\n\nArguments\n\nrf: (::RF) RF struct\n\nReturns\n\nf: (::Vector{Number}) vector with frequency samples\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#Other-functions","page":"KomaMRIBase","title":"Other functions","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"trapz\ncumtrapz\nkfoldperm","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.trapz","page":"KomaMRIBase","title":"KomaMRIBase.trapz","text":"y = trapz(Δt, x)\n\nTrapezoidal integration for every spin of a phantom.\n\nnote: Note\nIn practice, this function is used to integrate (Gx * x + Gy * y + Gz * z) * Δt for all the spins. NΔt is the length of Δt. Ns stands for the number of spins of a phantom. x is a matrix which rows represents different spins and columns are different times and the elements are the field Gx * x + Gy * y + Gz * z values.\n\nArguments\n\nΔt: (1 x NΔt ::Matrix{Float64}, [s]) delta time 1-row array\nx: (Ns x (NΔt+1) ::Matrix{Float64}, [T]) magnitude of the field Gx * x + Gy * y + Gz * z\n\nReturns\n\ny: (Ns x 1 ::Matrix{Float64}, [T*s]) vector where every element is the integral of (Gx * x + Gy * y + Gz * z) * Δt for every spin of a phantom\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.cumtrapz","page":"KomaMRIBase","title":"KomaMRIBase.cumtrapz","text":"y = cumtrapz(Δt, x)\n\nTrapezoidal cumulative integration over time for every spin of a phantom.\n\nArguments\n\nΔt: (1 x NΔt ::Matrix{Float64}, [s]) delta time 1-row array\nx: (Ns x (NΔt+1) ::Matrix{Float64}, [T]) magnitude of the field Gx * x + Gy * y + Gz * z\n\nReturns\n\ny: (Ns x NΔt ::Matrix{Float64}, [T*s]) matrix where every column is the cumulative integration over time of (Gx * x + Gy * y + Gz * z) * Δt for every spin of a phantom\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.kfoldperm","page":"KomaMRIBase","title":"KomaMRIBase.kfoldperm","text":"array_of_ranges = kfoldperm(N, k; breaks=[])\n\nDivides a list of indices from 1 to N into k groups.\n\nArguments\n\nN: (::Integer) number of elements to be ordered\nk: (::Integer) number of groups to divide the N elements.\n\nKeywords\n\nbreaks: (::Vector{<:Integer}, =[]) array of indices where predefined breakpoints are placed.\n\nReturns\n\narray_of_ranges: (::Vector{UnitRange{<:Integer}}) array containing ranges of different groups. The target is k groups, but this could increase by adding elements to the breaks input array\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#Sequence-Building-Blocks-(SBB)","page":"KomaMRIBase","title":"Sequence Building Blocks (SBB)","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"PulseDesigner\nPulseDesigner.RF_hard\nPulseDesigner.RF_sinc\nPulseDesigner.EPI\nPulseDesigner.radial_base\nPulseDesigner.spiral_base\nPulseDesigner.EPI_example","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.PulseDesigner","page":"KomaMRIBase","title":"KomaMRIBase.PulseDesigner","text":"PulseDesigner\n\nA module to define different pulse sequences.\n\n\n\n\n\n","category":"module"},{"location":"reference/2-koma-base/#KomaMRIBase.PulseDesigner.RF_hard","page":"KomaMRIBase","title":"KomaMRIBase.PulseDesigner.RF_hard","text":"seq = RF_hard(B1, T, sys; G=[0, 0, 0], Δf=0)\n\nReturns a sequence with a RF excitation pulse.\n\nArguments\n\nB1: (::Number, [T]) RF pulse amplitude\nT: (::Real, [s]) RF pulse duration\nsys: (::Scanner) Scanner struct\n\nKeywords\n\nG: (::Vector{Real}, =[0, 0, 0], [T/m]) gradient amplitudes for x, y, z\nΔf: (::Real, =0, [Hz]) RF pulse carrier frequency displacement\n\nReturns\n\nseq: (::Sequence) Sequence struct with a RF pulse\n\nExamples\n\njulia> sys = Scanner(); durRF = π / 2 / (2π * γ * sys.B1);\n\njulia> seq = PulseDesigner.RF_hard(sys.B1, durRF, sys);\n\njulia> plot_seq(seq)\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.PulseDesigner.RF_sinc","page":"KomaMRIBase","title":"KomaMRIBase.PulseDesigner.RF_sinc","text":"seq = RF_sinc(B1, T, sys; G=[0, 0, 0], Δf=0, a=0.46, TBP=4)\n\nReturns a sequence with a RF sinc waveform.\n\nReferences\n\nMatt A. Bernstein, Kevin F. King, Xiaohong Joe Zhou, Chapter 2 - Radiofrequency Pulse\n\nShapes, Handbook of MRI Pulse Sequences, 2004, Pages 35-66, https://doi.org/10.1016/B978-012092861-3/50006-6.\n\nArguments\n\nB1: (::Number, [T]) RF sinc amplitude\nT: (::Real, [s]) RF sinc duration\nsys: (::Scanner) Scanner struct\n\nKeywords\n\nG: (::Vector{Real}, =[0, 0, 0], [T/m]) gradient amplitudes for x, y, z\nΔf: (::Real, =0, [Hz]) RF pulse carrier frequency displacement\na: (::Real, =0.46) height appodization window parameter\nTBP: (::Real, =4) width appodization window parameter\n\nReturns\n\nseq: (::Sequence) Sequence struct with a RF pulse\n\nExamples\n\njulia> sys = Scanner(); durRF = π / 2 / (2π * γ * sys.B1);\n\njulia> seq = PulseDesigner.RF_sinc(sys.B1, durRF, sys);\n\njulia> plot_seq(seq)\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.PulseDesigner.EPI","page":"KomaMRIBase","title":"KomaMRIBase.PulseDesigner.EPI","text":"seq = EPI(FOV::Real, N::Integer, sys::Scanner)\n\nReturns a sequence with EPI gradients.\n\nArguments\n\nFOV: (::Real, [m]) field of view\nN: (::Integer) number of pixels in the x and y axis\nsys: (::Scanner) Scanner struct\n\nReturns\n\nseq: (::Sequence) Sequence struct with EPI gradients\n\nExamples\n\njulia> sys, FOV, N = Scanner(), 23e-2, 101\n\njulia> seq = PulseDesigner.EPI(FOV, N, sys)\n\njulia> plot_seq(seq)\n\njulia> plot_kspace(seq)\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.PulseDesigner.radial_base","page":"KomaMRIBase","title":"KomaMRIBase.PulseDesigner.radial_base","text":"seq = radial_base(FOV::Real, Nr::Integer, sys::Scanner)\n\nReturns a sequence with radial gradients for a single trajectory.\n\nArguments\n\nFOV: (::Real, [m]) field of view\nN: (::Integer) number of pixels along the diameter\nsys: (::Scanner) Scanner struct\n\nReturns\n\nseq: (::Sequence) Sequence struct of a single radial trajectory\n\nExamples\n\njulia> sys, FOV, N = Scanner(), 23e-2, 101\n\njulia> seq = PulseDesigner.radial_base(FOV, N, sys)\n\njulia> plot_seq(seq)\n\njulia> plot_kspace(seq)\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.PulseDesigner.spiral_base","page":"KomaMRIBase","title":"KomaMRIBase.PulseDesigner.spiral_base","text":"spiral = spiral_base(FOV, N, sys; S0=sys.Smax*2/3, Nint=8, λ=Nint/FOV, BW=60e3)\n\nDefinition of a spiral base sequence.\n\nReferences\n\nGlover, G.H. (1999), Simple analytic spiral K-space algorithm. Magn. Reson. Med.,\n\n42: 412-415. https://doi.org/10.1002/(SICI)1522-2594(199908)42:2<412::AID-MRM25>3.0.CO;2-U\n\nArguments\n\nFOV: (::Real, [m]) field of view\nN: (::Integer) number of pixels along the radious\nsys: (::Scanner) Scanner struct\n\nKeywords\n\nS0: (::Vector{Real}, =sys.Smax*2/3, [T/m/s]) slew rate reference\nNint: (::Integer, =8) number of interleaves\nλ: (::Real, =Nint/FOV, [1/m]) kspace spiral parameter\nBW: (::Real, =60e3, [Hz]) adquisition parameter\n\nReturns\n\nspiral: (::Function) function that returns a Sequence struct when evaluated\n\nExamples\n\njulia> sys, FOV, N = Scanner(), 23e-2, 101\n\njulia> spiral = PulseDesigner.spiral_base(FOV, N, sys)\n\njulia> seq = spiral(0)\n\njulia> plot_seq(seq)\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.PulseDesigner.EPI_example","page":"KomaMRIBase","title":"KomaMRIBase.PulseDesigner.EPI_example","text":"seq = EPI_example(; sys=Scanner())\n\nReturns a sequence suitable for acquiring the 2D brain example in the provided examples.\n\nKeywords\n\nsys: (::Scanner) Scanner struct\n\nReturns\n\nseq: (::Sequence) EPI example Sequence struct\n\nExamples\n\njulia> seq = PulseDesigner.EPI_example();\n\njulia> plot_seq(seq)\n\n\n\n\n\n","category":"function"},{"location":"how-to/4-run-distributed-simulations/#Run-Distributed-Simulations","page":"Run Distributed Simulations","title":"Run Distributed Simulations","text":"","category":"section"},{"location":"how-to/4-run-distributed-simulations/","page":"Run Distributed Simulations","title":"Run Distributed Simulations","text":"While KomaMRI provides built-in support for CPU and GPU parallelization, it is sometimes desirable to distribute simulation work even further across multiple GPUs or compute nodes. This can be done by using Distributed.jl and making use of the independent spin property: each spin in the system is independent from the rest, so the phantom spins can be subdivided into separate simulations and results recombined, as in the diagram below:","category":"page"},{"location":"how-to/4-run-distributed-simulations/","page":"Run Distributed Simulations","title":"Run Distributed Simulations","text":"
","category":"page"},{"location":"how-to/4-run-distributed-simulations/","page":"Run Distributed Simulations","title":"Run Distributed Simulations","text":"The following two examples demonstrate how to use Distributed.jl to run a simulation using multiple GPUS, and using multiple nodes in an HPC cluster.","category":"page"},{"location":"how-to/4-run-distributed-simulations/#Using-Multiple-GPUs","page":"Run Distributed Simulations","title":"Using Multiple GPUs","text":"","category":"section"},{"location":"how-to/4-run-distributed-simulations/","page":"Run Distributed Simulations","title":"Run Distributed Simulations","text":"To run a simulation using multiple GPUs, the phantom object can be divided using the kfoldperm function. Distributed.jl can then be used to start one Julia worker process per available device so that each device simulates a different part of the object. The results can then be fetched asynchronously by the main process and combined to produce a final signal. This is shown in the following diagram: ","category":"page"},{"location":"how-to/4-run-distributed-simulations/","page":"Run Distributed Simulations","title":"Run Distributed Simulations","text":"
","category":"page"},{"location":"how-to/4-run-distributed-simulations/","page":"Run Distributed Simulations","title":"Run Distributed Simulations","text":"The SLURM SBATCH script below requests 4 GPUs, all on a single computer. The Julia code then distributes work among each GPU:","category":"page"},{"location":"how-to/4-run-distributed-simulations/","page":"Run Distributed Simulations","title":"Run Distributed Simulations","text":"details: SLURM Script Requesting Multiple GPUs\n#!/bin/bash\n#SBATCH --job-name KomaDistributed # Job name\n#SBATCH -t 0-00:30 # Max runtime for job\n#SBATCH -p batch # Enter partition on which to run the job\n#SBATCH --ntasks=1 # 1 task\n#SBATCH --cpus-per-task=1 # Request 1 CPU\n#SBATCH --gpus=4 # Request 4 GPUs\n#SBATCH -o /mnt/workspace/%u/slurm-out/%test.out # Enter file path to write stdout to\n#SBATCH -e /mnt/workspace/%u/slurm-out/%test.err # Enter file path to write stderr to\n\nmodule load julia/1.10.2\njulia script.jl","category":"page"},{"location":"how-to/4-run-distributed-simulations/","page":"Run Distributed Simulations","title":"Run Distributed Simulations","text":"using Distributed\nusing CUDA\n\n#Add workers based on the number of available devices\naddprocs(length(devices()))\n\n#Define inputs on each worker process\n@everywhere begin\n using KomaMRI, CUDA\n sys = Scanner()\n seq = PulseDesigner.EPI_example()\n obj = brain_phantom2D()\n #Divide phantom\n parts = kfoldperm(length(obj), nworkers())\nend\n\n#Distribute simulation across workers\nraw = Distributed.@distributed (+) for i=1:nworkers()\n KomaMRICore.set_device!(i-1) #Sets device for this worker, note that CUDA devices are indexed from 0\n simulate(obj[parts[i]], seq, sys)\nend","category":"page"},{"location":"how-to/4-run-distributed-simulations/#Using-Multiple-Nodes-in-an-HPC-Cluster","page":"Run Distributed Simulations","title":"Using Multiple Nodes in an HPC Cluster","text":"","category":"section"},{"location":"how-to/4-run-distributed-simulations/","page":"Run Distributed Simulations","title":"Run Distributed Simulations","text":"This example uses the package ClusterManagers.jl to initialize worker processes on a SLURM cluster based on the number of tasks specified in the #SBATCH –ntasks directive. This can be useful to divide simulation work among multiple compute nodes if the problem is too large to fit into memory for a single computer, or if the number of desired workers is greater than the typical number of CPU cores available. An illustration of this is shown below:","category":"page"},{"location":"how-to/4-run-distributed-simulations/","page":"Run Distributed Simulations","title":"Run Distributed Simulations","text":"
","category":"page"},{"location":"how-to/4-run-distributed-simulations/","page":"Run Distributed Simulations","title":"Run Distributed Simulations","text":"This SBATCH script requests 20 separate nodes, with each taking a single task. The Julia code is similar to the example for multiple GPUs, but initializes the processes slightly differently:","category":"page"},{"location":"how-to/4-run-distributed-simulations/","page":"Run Distributed Simulations","title":"Run Distributed Simulations","text":"details: SLURM Script Requesting Multiple Nodes\n#!/bin/bash\n#SBATCH --job-name KomaDistributed # Job name\n#SBATCH -t 0-00:30 # Max runtime for job\n#SBATCH -p batch # Enter partition on which to run the job\n#SBATCH --nodes=20 # 20 nodes\n#SBATCH --ntasks=20 # 20 tasks\n#SBATCH --ntasks-per-node=1 # 1 task per node\n#SBATCH --cpus-per-task=4 # 4 CPUs per task\n#SBATCH -o /mnt/workspace/%u/slurm-out/%test.out # Enter file path to write stdout to\n#SBATCH -e /mnt/workspace/%u/slurm-out/%test.err # Enter file path to write stderr to\n\nmodule load julia/1.10.2\njulia script.jl","category":"page"},{"location":"how-to/4-run-distributed-simulations/","page":"Run Distributed Simulations","title":"Run Distributed Simulations","text":"using Distributed\nusing ClusterManagers\n\n#Add workers based on the specified number of SLURM tasks\naddprocs(SlurmManager(parse(Int, ENV[\"SLURM_NTASKS\"])))\n\n#Define inputs on each worker process\n@everywhere begin\n using KomaMRI\n sys = Scanner()\n seq = PulseDesigner.EPI_example()\n obj = brain_phantom2D()\n parts = kfoldperm(length(obj), nworkers())\nend\n\n#Distribute simulation across workers\nraw = Distributed.@distributed (+) for i=1:nworkers()\n simulate(obj[parts[i]], seq, sys)\nend","category":"page"},{"location":"#Introduction","page":"🏠 Home","title":"Introduction","text":"","category":"section"},{"location":"","page":"🏠 Home","title":"🏠 Home","text":"KomaMRI is a Julia package meant to simulate general Magnetic Resonance Imaging (MRI) scenarios. Its name comes from the Japanese word for spinning-top こま (ko-ma) as they precess due to gravity like spins in a magnetic field.","category":"page"},{"location":"","page":"🏠 Home","title":"🏠 Home","text":"KomaMRI generates raw data by solving the Bloch equations using the specified scanner, phantom and sequence. It also provides a Graphical User Interface (GUI) that encapsulates the whole imaging pipeline (simulation and reconstruction).","category":"page"},{"location":"","page":"🏠 Home","title":"🏠 Home","text":"
\n
","category":"page"},{"location":"","page":"🏠 Home","title":"🏠 Home","text":"We organized the documentation following the philosophy presented by David Laing.","category":"page"},{"location":"","page":"🏠 Home","title":"🏠 Home","text":"details: How to Cite Koma\nIf you use Koma, please cite our paper:Plain Text:Castillo-Passi, C, Coronado, R, Varela-Mattatall, G, Alberola-López, C, Botnar, R, Irarrazaval, P. KomaMRI.jl: An open-source framework for general MRI simulations with GPU acceleration. Magn Reson Med. 2023; 1- 14. doi: 10.1002/mrm.29635BibTex:@article{https://doi.org/10.1002/mrm.29635,\n author = {Castillo-Passi, Carlos and Coronado, Ronal and Varela-Mattatall, Gabriel and Alberola-López, Carlos and Botnar, René and Irarrazaval, Pablo},\n title = {KomaMRI.jl: An open-source framework for general MRI simulations with GPU acceleration},\n journal = {Magnetic Resonance in Medicine},\n keywords = {Bloch equations, GPU, GUI, Julia, open source, simulation},\n doi = {https://doi.org/10.1002/mrm.29635},\n url = {https://onlinelibrary.wiley.com/doi/abs/10.1002/mrm.29635},\n eprint = {https://onlinelibrary.wiley.com/doi/pdf/10.1002/mrm.29635},\n}","category":"page"},{"location":"#Features","page":"🏠 Home","title":"Features","text":"","category":"section"},{"location":"","page":"🏠 Home","title":"🏠 Home","text":"Fast simulations by using CPU and GPU parallelization 🏃💨.\nOpen Source, so anyone can include additional features 🆙.\nCompatibility with community-standards 🤝 like Pulseq .seq and ISMRMRD .mrd.\nCompatibility with Pluto and Jupyter notebooks 🎈\nInteractive visualizations using PlotlyJS.jl 📲\nCross-platform 🌐 thanks to the use of the Julia programming language.\nFriendly user interface for people with no programming skills 😌.\nFlexible API for advanced users 👨💻.","category":"page"},{"location":"#Potential-Use-Cases","page":"🏠 Home","title":"Potential Use Cases","text":"","category":"section"},{"location":"","page":"🏠 Home","title":"🏠 Home","text":"The generation of synthetic data to train Machine Learning models.\nTo test novel pulse sequences before implementing them directly in a real scanner (with a Pulseq sequence).\nTeaching exercises for MRI acquisition or reconstruction.","category":"page"},{"location":"explanation/1-sequence/#Sequence","page":"Sequence","title":"Sequence","text":"","category":"section"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"This section delves into some details about how a sequence is constructed. The sequence definition in KomaMRI is strongly related to the Pulseq definition. After reading this section, you should be able to create your own Sequence structs for conducting custom simulations using the KomaMRI package.","category":"page"},{"location":"explanation/1-sequence/#Sequence-Overview","page":"Sequence","title":"Sequence Overview","text":"","category":"section"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"Let's introduce the following simple sequence figure to expand from a visual example to a more general sequence definition:","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"
","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"A sequence can be thought of as an ordered concatenation of blocks over time. Each block is essentially a sequence with a length of 1. Every block consists of an RF pulse, the (xyz) gradients, and the acquisition of samples. Each block also has an associated time duration. To simplify, we will refer to these components as follows:","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"beginmatrix*l\ntextseqi textblock i of the sequence \ntextseqRFi textRF pulse at the i block \ntextseqGRxi textgradient x at the i block \ntextseqGRyi textgradient y at the i block \ntextseqGRzi textgradient z at the i block \ntextseqADCi textacquisition at the i block \ntextseqDURi textduration at the i block\nendmatrix*","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"The best way to understand the Sequence struct in KomaMRI is by examining the source code where this struct is defined:","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"mutable struct Sequence\n GR::Array{Grad,2}\n RF::Array{RF,2}\n ADC::Array{ADC,1}\n DUR::Array{Any,1}\n DEF::Dict{String,Any}\nend","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"As you can see, a Sequence struct contains 5 field names: ''DEF'' contains information for reconstruction steps (so it is not mandatory to fill it), ''DUR'' is a vector that contains the time durations of each block, ''ADC'' is also a vector with the acquisition samples for every block (an vector of ADC structs), ''GR'' is a 2D matrix which 3 rows representing the x-y-z gradients and columns having the samples of each block (a matrix of Grad structs) and ''RF'' is also a 2D matrix where each row represents a different coil and the columns are for different block samples too (a matrix of RF structs). The RF, Grad and ADC are MRI events that will be explained in the section Events Definitions.","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"warning: Warning\nSo far, KomaMRI can only manage one coil for RF excitations. However, in future versions, parallel transmit pTX will be managed by adding more ``rows'' to the RF matrix of the Sequence field name.","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"In order to understand how a Sequence struct can be manipulated in Julia, let's use the EPI sequence example. You can display basic information of the Sequence variable in the Julia REPL:","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"julia> seq = PulseDesigner.EPI_example()\nSequence[ τ = 62.846 ms | blocks: 204 | ADC: 101 | GR: 205 | RF: 1 | DEF: 5 ]","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"As you can see, this Sequence has 204 blocks, 1 of these blocks has an RF struct with values different from zero, there are 205 number of Grad structs considering the x-y-z components, 101 ADC structs acquire samples of some blocks and 62.846 ms is the total time duration of the complete Sequence.","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"To display the sequence in an graph, we can use the plot_seq function:","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"julia> plot_seq(seq; slider=false)","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":" ","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"This way, you can see exactly where the RF, Grad and ADC structs are located in time.","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"You can access and filter information for the RF, Grad, ADC, and DUR field names of a Sequence using the dot notation. This allows you to display helpful information about the organization of the Sequence struct:","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"julia> seq.RF\n1×204 Matrix{RF}:\n ⊓(0.5872 ms) ⇿(0.0 ms) ⇿(0.0 ms) … ⇿(0.0 ms) ⇿(0.0 ms) \n\njulia> seq.GR\n3×204 Matrix{Grad}:\n ⇿(0.5872 ms) ⊓(0.4042 ms) ⊓(0.4042 ms) … ⇿(0.2062 ms) ⊓(0.4042 ms) ⊓(0.4042 ms)\n ⇿(0.5872 ms) ⊓(0.4042 ms) ⇿(0.4042 ms) ⊓(0.2062 ms) ⇿(0.4042 ms) ⊓(0.4042 ms)\n ⇿(0.5872 ms) ⇿(0.0 ms) ⇿(0.0 ms) ⇿(0.0 ms) ⇿(0.0 ms) ⇿(0.0 ms)\n\njulia> seq.ADC\n204-element Vector{ADC}:\n ADC(0, 0.0, 0.0, 0.0, 0.0)\n ADC(0, 0.0, 0.0, 0.0, 0.0)\n ADC(101, 0.00019999999999999998, 0.00010211565434713023, 0.0, 0.0)\n ⋮\n ADC(101, 0.00019999999999999998, 0.00010211565434713023, 0.0, 0.0)\n ADC(0, 0.0, 0.0, 0.0, 0.0)\n\njulia> seq.DUR\n204-element Vector{Float64}:\n 0.0005871650124959989\n 0.0004042313086942605\n 0.0004042313086942605\n ⋮\n 0.0004042313086942605\n 0.0004042313086942605","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"Additionally, you can access a subset of blocks in a Sequence by slicing or indexing. The result will also be a Sequence struct, allowing you to perform the same operations as you would with a full Sequence. For example, if you want to analyze the first 11 blocks, you can do the following:","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"julia> seq[1:11]\nSequence[ τ = 3.837 ms | blocks: 11 | ADC: 5 | GR: 11 | RF: 1 | DEF: 5 ]\n\njulia> seq[1:11].GR\n3×11 Matrix{Grad}:\n ⇿(0.5872 ms) ⊓(0.4042 ms) ⊓(0.4042 ms) … ⊓(0.4042 ms) ⇿(0.2062 ms) ⊓(0.4042 ms)\n ⇿(0.5872 ms) ⊓(0.4042 ms) ⇿(0.4042 ms) ⇿(0.4042 ms) ⊓(0.2062 ms) ⇿(0.4042 ms)\n ⇿(0.5872 ms) ⇿(0.0 ms) ⇿(0.0 ms) ⇿(0.0 ms) ⇿(0.0 ms) ⇿(0.0 ms)\n\njulia> plot_seq(seq[1:11]; slider=false)","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":" ","category":"page"},{"location":"explanation/1-sequence/#Concatenation-of-Sequences","page":"Sequence","title":"Concatenation of Sequences","text":"","category":"section"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"Sequences can be concatenated side by side. The example below demonstrates how to concatenate sequences:","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"julia> s = PulseDesigner.EPI_example()[1:11]\nSequence[ τ = 3.837 ms | blocks: 11 | ADC: 5 | GR: 11 | RF: 1 | DEF: 5 ]\n\njulia> seq = s + s + s\nSequence[ τ = 11.512 ms | blocks: 33 | ADC: 15 | GR: 33 | RF: 3 | DEF: 5 ]\n\njulia> plot_seq(seq; slider=false)","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":" ","category":"page"},{"location":"reference/1-api/#API-Overview","page":"API Overview","title":"API Overview","text":"","category":"section"},{"location":"reference/1-api/","page":"API Overview","title":"API Overview","text":"
","category":"page"},{"location":"reference/1-api/","page":"API Overview","title":"API Overview","text":"KomaMRI is divided into the following sub-packages:","category":"page"},{"location":"reference/1-api/","page":"API Overview","title":"API Overview","text":"KomaMRIBase: Custom types and functions\nKomaMRICore: Simulation functions\nKomaMRIFiles: File I/O functions\nKomaMRIPlots: Plotting functions\nKomaMRI: User Interface","category":"page"},{"location":"reference/1-api/","page":"API Overview","title":"API Overview","text":"The idea of separating the package into sub-packages is to make it easier to maintain and to allow users to use only the parts they need. Two common use-cases can be:","category":"page"},{"location":"reference/1-api/","page":"API Overview","title":"API Overview","text":"GUI users: They will use the KomaMRI package to interact with the GUI. Internally this includes al the others.\nAdvanced users: They will use the sub-packages directly to build their own scripts or notebooks, for simulation only KomaMRICore is required.","category":"page"}]
+[{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"EditURL = \"lit-04-3DSliceSelective.jl\"","category":"page"},{"location":"tutorial/04-3DSliceSelective/#Slice-Selective-Acquisition-of-3D-Phantom","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"","category":"section"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"using KomaMRI # hide\nsys = Scanner() # hide","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"While in the previous examples we simulated using hard RF pulses, in this demonstration we will illustrate the principles of slice selection. First, let's import a 3D phantom, in this case a brain slab (thickness of 2mathrmcm), by calling the function brain_phantom3D.","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"obj = brain_phantom3D()\nobj.Δw .= 0 # Removes the off-resonance\np1 = plot_phantom_map(obj, :T2 ; height=400)\nsavefig(p1, \"../assets/3-phantom.html\") # hide","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":" ","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"Now, we are going to import a sequence which acquires 3 slices in the longitudinal axis. Note that the sequence contains three EPIs to acquire 3 slices of the phantom.","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"seq_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/1.sequences/epi_multislice.seq\")\nseq = read_seq(seq_file)\np2 = plot_seq(seq; range=[0,10], height=400)\nsavefig(p2, \"../assets/3-seq.html\") # hide","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":" ","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"We can take a look to the slice profiles by using the function simulate_slice_profile:","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"z = range(-2., 2., 200) * 1e-2; # -2 to 2 cm\nrf1, rf2, rf3 = findall(is_RF_on.(seq))\nM1 = simulate_slice_profile(seq[rf1]; z)\nM2 = simulate_slice_profile(seq[rf2]; z)\nM3 = simulate_slice_profile(seq[rf3]; z)\n\nusing PlotlyJS # hide\npa = scatter(x=z*1e2, y=abs.(M1.xy), name=\"Slice 1\") # hide\npb = scatter(x=z*1e2, y=abs.(M2.xy), name=\"Slice 2\") # hide\npc = scatter(x=z*1e2, y=abs.(M3.xy), name=\"Slice 3\") # hide\npd = plot([pa,pb,pc], Layout(xaxis=attr(title=\"z [cm]\"), height=300,margin=attr(t=40,l=0,r=0), title=\"Slice profiles for the slice-selective sequence\")) # hide\nsavefig(pd, \"../assets/3-profile.html\") # hide","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":" ","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"Now let's simulate the acquisition. Notice the three echoes, one for every slice excitation.","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"raw = simulate(obj, seq, sys; sim_params=Dict{String,Any}(\"Nblocks\"=>20))\np3 = plot_signal(raw; slider=false, height=300)\nsavefig(p3, \"../assets/3-signal.html\") # hide","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":" ","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"Finally, we reconstruct the acquiered images.","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"# Get the acquisition data\nacq = AcquisitionData(raw)\n\n# Setting up the reconstruction parameters and perform reconstruction\nNx, Ny = raw.params[\"reconSize\"][1:2]\nreconParams = Dict{Symbol,Any}(:reco=>\"direct\", :reconSize=>(Nx, Ny))\nimage = reconstruction(acq, reconParams)\n\n# Plotting the slices\np4 = plot_image(abs.(image[:, :, 1]); height=360, title=\"Slice 1\")\np5 = plot_image(abs.(image[:, :, 2]); height=360, title=\"Slice 2\")\np6 = plot_image(abs.(image[:, :, 3]); height=360, title=\"Slice 3\")\nsavefig(p4, \"../assets/3-recon1.html\") # hide\nsavefig(p5, \"../assets/3-recon2.html\") # hide\nsavefig(p6, \"../assets/3-recon3.html\") # hide","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":" ","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":" ","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"","category":"page"},{"location":"tutorial/04-3DSliceSelective/","page":"Slice-Selective Acquisition of 3D Phantom","title":"Slice-Selective Acquisition of 3D Phantom","text":"This page was generated using Literate.jl.","category":"page"},{"location":"tutorial-pluto/README/","page":"-","title":"-","text":"This folder is intentionally left empty. It will be filled by docs/make.jl in the gh-pages branch. ","category":"page"},{"location":"tutorial-pluto/README/","page":"-","title":"-","text":"Files matching the pluto-*.jl pattern anywhere in examples/4.reproducible_notebooks will be included.","category":"page"},{"location":"tutorial-pluto/README/","page":"-","title":"-","text":"All files included in this folder will be ignored.","category":"page"},{"location":"tutorial-pluto/01-gradient-echo-spin-echo/#Understanding-basic-MRI-sequences","page":"Understanding basic MRI sequences","title":"Understanding basic MRI sequences","text":"","category":"section"},{"location":"tutorial-pluto/01-gradient-echo-spin-echo/","page":"Understanding basic MRI sequences","title":"Understanding basic MRI sequences","text":"(Image: ) (Image: )","category":"page"},{"location":"tutorial-pluto/01-gradient-echo-spin-echo/","page":"Understanding basic MRI sequences","title":"Understanding basic MRI sequences","text":"","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"EditURL = \"lit-06-DiffusionMotion.jl\"","category":"page"},{"location":"tutorial/06-DiffusionMotion/#Diffusion-induced-Signal-Attenuation","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"","category":"section"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"using KomaMRI # hide\nusing PlotlyJS # hide\nusing Random # hide","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"The purpose of this tutorial is to showcase the simulation of diffusion-related effects. For this, we are going to define a Path motion to simulate the Brownian motion of spins. This is not the most efficient way of simulating diffusion, but it is a good way to understand the phenomenon. In particular, we will going to simulate isotropic diffusion, characterized by the Apparent Diffusion Coefficient (ADC).","category":"page"},{"location":"tutorial/06-DiffusionMotion/#Creating-a-phantom-with-isotropic-diffusion","page":"Diffusion-induced Signal Attenuation","title":"Creating a phantom with isotropic diffusion","text":"","category":"section"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"First we will define a Phantom without motion containing 10000 spins. The spins will have the same relaxation times T_1 = 1000mathrmms and T_2 = 100mathrmms, and will be placed at the origin.","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"Nspins = 10_000\nobj = Phantom(;\n x = zeros(Nspins),\n T1 = ones(Nspins) * 1000e-3,\n T2 = ones(Nspins) * 100e-3,\n)","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"Now we will define the Brownian motion of the spins using the Path motion definition. The motion will be defined by the displacements in the x, y, and z directions (dx, dy, and dz) of the spins. The displacements will be generated by a random walk with mean square displacement","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"mathbbEleftx^2right=2D Δt","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"where D is the diffusion coefficient and Δt is time step duration.","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"D = 2e-9 # Diffusion Coefficient of water in m^2/s\nT = 100e-3 # Duration of the motion\nNt = 100 # Number of time steps\nΔt = T / (Nt - 1) # Time sep\nΔr = sqrt(2 * D * Δt) # √ Mean square displacement","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"Random walk is defined as the cumulative sum of random displacements:","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"rng = MersenneTwister(1234) # Setting up the random seed\ndx = cumsum([zeros(Nspins) Δr .* randn(rng, Nspins, Nt - 1)]; dims=2)\ndy = cumsum([zeros(Nspins) Δr .* randn(rng, Nspins, Nt - 1)]; dims=2)\ndz = cumsum([zeros(Nspins) Δr .* randn(rng, Nspins, Nt - 1)]; dims=2)","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"Including the random_walk into the Phantom definition:","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"random_walk = Path(dx, dy, dz, TimeRange(0.0, T))\nobj.motion = MotionList(random_walk)\np1 = plot_phantom_map(obj, :T1; time_samples=Nt÷4, height=450)\n\nsavefig(p1, \"../assets/6-displacements.html\") # hide","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":" ","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"The plot shows the random walk of spins due to diffusion, also known as Brownian motion. This motion was named after Robert Brown, who first described the phenomenon in 1827 while looking at pollen suspended in water under a microscope.","category":"page"},{"location":"tutorial/06-DiffusionMotion/#Pulse-Gradient-Spin-Echo-(PGSE)-sequence","page":"Diffusion-induced Signal Attenuation","title":"Pulse Gradient Spin Echo (PGSE) sequence","text":"","category":"section"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"The classical sequence used to measure diffusion is the pulse gradient spin echo (PGSE) introduced by Stejskal and Tanner in 1965. This sequence is characterized by the use of two diffusion gradients, placed right before and right after the inversion RF pulse. The duration of each gradient is defined by the δ parameter and the distance between the beginning of both gradients is described by the Δ parameter. In this tutorial square-shaped gradients will be used.","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"First, we generate the RF pulses:","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"sys = Scanner()\ndurRF = 1e-3\nB1 = (π / 2) / (2π * γ * durRF)\nrf90 = PulseDesigner.RF_hard(B1, durRF, sys)\nrf180 = (0.0 + 2im) * rf90","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"Now we generate the gradients:","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"G = 30e-3 # Gradient amplitude\nδ = 30e-3 # Duration of the gradient\nΔ = durRF + δ # Time between the two gradients\ngx_diff = Grad(G, δ)","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"Finally, we generate the ADC:","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"adc_dwell_time = 1e-6\nadc = ADC(1, adc_dwell_time, durRF/2 - adc_dwell_time/2) # ADCs with N=1 are positioned at the center","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"Obtaining the PGSE sequence:","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"seq = Sequence()\nseq += rf90\nseq += gx_diff\nseq += rf180\nseq += gx_diff\nseq += adc\np2 = plot_seq(seq; show_adc=true) # Plotting the sequence\n\nsavefig(p2, \"../assets/6-pgse_sequence.html\") # hide","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":" ","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"For the isotropic diffusion, the signal attenuation is given by the Stejskal-Tanner formula:","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"E = expleft(-b Dright)","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"where (b) is the b-value, defined as:","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"b = (gamma G delta)^2 cdot left(Delta - delta3right)","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"where gamma is the gyromagnetic ratio, G is the gradient amplitude, delta is the gradient duration, and Delta is the time between the two gradients.","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"function bvalue(seq)\n block, axis = 2, 1 # Gx from second block\n G = seq.GR[axis, block].A\n δ = seq.GR[axis, block].T\n Δ = dur(seq[2:3]) # Because there are no gaps\n b = (2π * γ * G * δ)^2 * (Δ - δ/3)\n return b * 1e-6\nend","category":"page"},{"location":"tutorial/06-DiffusionMotion/#Diffusion-Weighted-Imaging-(DWI)","page":"Diffusion-induced Signal Attenuation","title":"Diffusion Weighted Imaging (DWI)","text":"","category":"section"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"For DWI, multiple b-values are acquired to determine the tissue's ADC. For this, we will scale the gradient's amplitude of the previous sequence to obtain a desired b-value. We will store the sequences in a vector seqs and simulate the signal for each one of them.","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"seqs = Sequence[] # Vector of sequences\nbvals = [0, 250, 500, 1000, 1500, 2000] # b-values in s/mm^2\nfor bval_target in bvals\n gradient_scaling = sqrt(bval_target / bvalue(seq))\n seq_b = gradient_scaling * seq\n push!(seqs, seq_b)\nend","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"To simulate, we will broadcast the simulate function over the sequences and store the signals in a vector Sb. The Ref's are used to avoid broadcasting the obj and sys arguments (they will remain constant for all seqs).","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"sim_params = KomaMRICore.default_sim_params()\nsim_params[\"return_type\"] = \"mat\"\nsim_params[\"Δt\"] = Δt # Set max. grad. time step to fit diffusion time step\n\nsignals = simulate.(Ref(obj), seqs, Ref(sys); sim_params) # simulate broadcasted over seqs\n\nSb = [sb[1] for sb in signals] # Reshaping the simulated signals\nbvals_si = bvals .* 1e6 # Convert b-values from s/mm^2 to s/m^2\n\nE_simulated = abs.(Sb) ./ abs.(Sb[1])\nE_theoretical = exp.(-bvals_si .* D)\n\ns_sim = scatter(x=bvals, y=E_simulated, name=\"Simulated\") # hide\ns_theo = scatter(x=bvals, y=E_theoretical, name=\"exp(-b D)\", line=attr(dash=\"dash\")) # hide\nlayout = Layout(title=\"Diffusion-induced signal attenuation E(b)\", xaxis=attr(title=\"b-value [s/mm^2]\")) # hide\np3 = plot([s_sim, s_theo], layout) # hide\n\nsavefig(p3, \"../assets/6-pgse_signal_attenuation.html\") # hide","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":" ","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"The plot shows the signal attenuation as a function of the b-value. The simulated signal attenuation matches the theoretical curve, showing the expected exponential decay with the b-value.","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"","category":"page"},{"location":"tutorial/06-DiffusionMotion/","page":"Diffusion-induced Signal Attenuation","title":"Diffusion-induced Signal Attenuation","text":"This page was generated using Literate.jl.","category":"page"},{"location":"reference/5-koma-plots/#KomaMRIPlots","page":"KomaMRIPlots","title":"KomaMRIPlots","text":"","category":"section"},{"location":"reference/5-koma-plots/","page":"KomaMRIPlots","title":"KomaMRIPlots","text":"CurrentModule = KomaMRIPlots","category":"page"},{"location":"reference/5-koma-plots/#Plotting-Phantom","page":"KomaMRIPlots","title":"Plotting Phantom","text":"","category":"section"},{"location":"reference/5-koma-plots/","page":"KomaMRIPlots","title":"KomaMRIPlots","text":"plot_phantom_map","category":"page"},{"location":"reference/5-koma-plots/#KomaMRIPlots.plot_phantom_map","page":"KomaMRIPlots","title":"KomaMRIPlots.plot_phantom_map","text":"p = plot_phantom_map(obj::Phantom, key::Symbol; kwargs...)\n\nPlots a phantom map for a specific spin parameter given by key.\n\nArguments\n\nobj: (::Phantom) Phantom struct\nkey: (::Symbol, opts: [:ρ, :T1, :T2, :T2s, :x, :y, :z]) symbol for displaying different parameters of the phantom spins\n\nKeywords\n\nheight: (::Integer, =600) plot height\nwidth: (::Integer, =nothing) plot width\ndarkmode: (::Bool, =false) boolean to indicate whether to display darkmode style\nview_2d: (::Bool, =false) boolean to indicate whether to use a 2D scatter plot\ncolorbar: (::Bool, =true) boolean to indicate whether to display a colorbar\nmax_spins:(::Int, =100_000) maximum number of displayed spins\ntime_samples:(::Int, =0) intermediate time samples between motion t_start and t_end\nmax_time_samples:(::Int, =100) maximum number of time samples\nframe_duration_ms:(::Int, =250) time in miliseconds between two frames \n\nReturns\n\np: (::PlotlyJS.SyncPlot) plot of the phantom map for a specific spin parameter\n\nReferences\n\nColormaps from https://github.com/markgriswold/MRFColormaps Towards Unified Colormaps for Quantitative MRF Data, Mark Griswold, et al. (2018).\n\nExamples\n\njulia> obj2D, obj3D = brain_phantom2D(), brain_phantom3D();\n\njulia> plot_phantom_map(obj2D, :ρ)\n\njulia> plot_phantom_map(obj3D, :ρ)\n\n\n\n\n\n","category":"function"},{"location":"reference/5-koma-plots/#Plotting-Sequence","page":"KomaMRIPlots","title":"Plotting Sequence","text":"","category":"section"},{"location":"reference/5-koma-plots/","page":"KomaMRIPlots","title":"KomaMRIPlots","text":"plot_seq\nplot_kspace\nplot_M0\nplot_M1\nplot_M2\nplot_eddy_currents\nplot_slew_rate\nplot_seqd","category":"page"},{"location":"reference/5-koma-plots/#KomaMRIPlots.plot_seq","page":"KomaMRIPlots","title":"KomaMRIPlots.plot_seq","text":"p = plot_seq(seq::Sequence; kwargs...)\n\nPlots a sequence struct.\n\nArguments\n\nseq: (::Sequence) Sequence struct\n\nKeywords\n\nwidth: (::Integer, =nothing) plot width\nheight: (::Integer, =nothing) plot height\nslider: (::Bool, =true) boolean to indicate whether to display a slider\nshow_seq_blocks: (::Bool, =false) boolean to indicate whether to display sequence blocks\ndarkmode: (::Bool, =false) boolean to indicate whether to display darkmode style\nrange: (::Vector{Real}, =[]) time range to be displayed initially\ntitle: (::String, =\"\") plot title\nfreq_in_phase: (::Bool, =true) Include FM modulation in RF phase\ngl: (::Bool, =false) use PlotlyJS.scattergl backend (faster)\nmax_rf_samples: (::Integer, =100) maximum number of RF samples\nshow_adc: (::Bool, =false) plot ADC samples with markers\n\nReturns\n\np: (::PlotlyJS.SyncPlot) plot of the Sequence struct\n\nExamples\n\njulia> seq_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/1.sequences/spiral.seq\")\n\njulia> seq = read_seq(seq_file)\n\njulia> plot_seq(seq)\n\n\n\n\n\n","category":"function"},{"location":"reference/5-koma-plots/#KomaMRIPlots.plot_kspace","page":"KomaMRIPlots","title":"KomaMRIPlots.plot_kspace","text":"p = plot_kspace(seq::Sequence; width=nothing, height=nothing, darkmode=false)\n\nPlots the k-space of a Sequence struct.\n\nArguments\n\nseq: (::Sequence) Sequence struct\n\nKeywords\n\nwidth: (::Integer, =nothing) plot width\nheight: (::Integer, =nothing) plot height\ndarkmode: (::Bool, =false) boolean to indicate whether to display darkmode style\n\nReturns\n\np: (::PlotlyJS.SyncPlot) plot of the k-space of the Sequence struct\n\nExamples\n\njulia> seq_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/1.sequences/spiral.seq\")\n\njulia> seq = read_seq(seq_file)\n\njulia> plot_kspace(seq)\n\n\n\n\n\n","category":"function"},{"location":"reference/5-koma-plots/#KomaMRIPlots.plot_M0","page":"KomaMRIPlots","title":"KomaMRIPlots.plot_M0","text":"p = plot_M0(seq::Sequence; kwargs...)\n\nPlots the zero order moment (M0) of a Sequence struct.\n\nArguments\n\nseq: (::Sequence) Sequence struct\n\nKeywords\n\nwidth: (::Integer, =nothing) plot width\nheight: (::Integer, =nothing) plot height\nslider: (::Bool, =true) boolean to indicate whether to display a slider\nshow_seq_blocks: (::Bool, =false) boolean to indicate whether to display sequence blocks\ndarkmode: (::Bool, =false) boolean to indicate whether to display darkmode style\nrange: (::Vector{Real}, =[]) time range to be displayed initially\ntitle: (::String, =\"\") plot title\n\nReturns\n\np: (::PlotlyJS.SyncPlot) plot of the moment M0 of the Sequence struct\n\nExamples\n\njulia> seq_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/1.sequences/spiral.seq\")\n\njulia> seq = read_seq(seq_file)\n\njulia> plot_M0(seq)\n\n\n\n\n\n","category":"function"},{"location":"reference/5-koma-plots/#KomaMRIPlots.plot_M1","page":"KomaMRIPlots","title":"KomaMRIPlots.plot_M1","text":"p = plot_M1(seq::Sequence; kwargs...)\n\nPlots the first order moment (M1) of a Sequence struct.\n\nArguments\n\nseq: (::Sequence) Sequence struct\n\nKeywords\n\nwidth: (::Integer, =nothing) plot width\nheight: (::Integer, =nothing) plot height\nslider: (::Bool, =true) boolean to indicate whether to display a slider\nshow_seq_blocks: (::Bool, =false) boolean to indicate whether to display sequence blocks\ndarkmode: (::Bool, =false) boolean to indicate whether to display darkmode style\nrange: (::Vector{Real}, =[]) time range to be displayed initially\ntitle: (::String, =\"\") plot title\n\nReturns\n\np: (::PlotlyJS.SyncPlot) plot of the moment M1 of the Sequence struct\n\nExamples\n\njulia> seq_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/1.sequences/spiral.seq\")\n\njulia> seq = read_seq(seq_file)\n\njulia> plot_M1(seq)\n\n\n\n\n\n","category":"function"},{"location":"reference/5-koma-plots/#KomaMRIPlots.plot_M2","page":"KomaMRIPlots","title":"KomaMRIPlots.plot_M2","text":"p = plot_M2(seq::Sequence; kwargs...)\n\nPlots the second order moment (M2) of a Sequence struct.\n\nArguments\n\nseq: (::Sequence) Sequence struct\n\nKeywords\n\nwidth: (::Integer, =nothing) plot width\nheight: (::Integer, =nothing) plot height\nslider: (::Bool, =true) boolean to indicate whether to display a slider\nshow_seq_blocks: (::Bool, =false) boolean to indicate whether to display sequence blocks\ndarkmode: (::Bool, =false) boolean to indicate whether to display darkmode style\nrange: (::Vector{Real}, =[]) time range to be displayed initially\ntitle: (::String, =\"\") plot title\n\nReturns\n\np: (::PlotlyJS.SyncPlot) plot of the moment M2 of the Sequence struct\n\nExamples\n\njulia> seq_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/1.sequences/spiral.seq\")\n\njulia> seq = read_seq(seq_file)\n\njulia> plot_M2(seq)\n\n\n\n\n\n","category":"function"},{"location":"reference/5-koma-plots/#KomaMRIPlots.plot_eddy_currents","page":"KomaMRIPlots","title":"KomaMRIPlots.plot_eddy_currents","text":"p = plot_eddy_currents(seq::Sequence, λ; kwargs...)\n\nPlots the eddy currents of a Sequence struct.\n\nArguments\n\nseq: (::Sequence) Sequence struct\nλ: (::Real, [s]) time constant for the decay of Eddy currents\n\nKeywords\n\nα: (::Vector{Real}, =ones(size(λ))) eddy currents factors\nwidth: (::Integer, =nothing) plot width\nheight: (::Integer, =nothing) plot height\nslider: (::Bool, =true) boolean to indicate whether to display a slider\nshow_seq_blocks: (::Bool, =false) boolean to indicate whether to display sequence blocks\ndarkmode: (::Bool, =false) boolean to indicate whether to display darkmode style\nrange: (::Vector{Real}, =[]) time range to be displayed initially\ntitle: (::String, =\"\") plot title\n\nReturns\n\np: (::PlotlyJS.SyncPlot) plot of the Eddy currents of the Sequence struct\n\nExamples\n\njulia> seq_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/1.sequences/spiral.seq\")\n\njulia> seq = read_seq(seq_file)\n\njulia> plot_eddy_currents(seq, 80e-3)\n\n\n\n\n\n","category":"function"},{"location":"reference/5-koma-plots/#KomaMRIPlots.plot_slew_rate","page":"KomaMRIPlots","title":"KomaMRIPlots.plot_slew_rate","text":"p = plot_slew_rate(seq::Sequence; kwargs...)\n\nPlots the slew rate currents of a Sequence struct.\n\nArguments\n\nseq: (::Sequence) Sequence struct\n\nKeywords\n\nwidth: (::Integer, =nothing) plot width\nheight: (::Integer, =nothing) plot height\nslider: (::Bool, =true) boolean to indicate whether to display a slider\nshow_seq_blocks: (::Bool, =false) boolean to indicate whether to display sequence blocks\ndarkmode: (::Bool, =false) boolean to indicate whether to display darkmode style\nrange: (::Vector{Real}, =[]) time range to be displayed initially\ntitle: (::String, =\"\") plot title\n\nReturns\n\np: (::PlotlyJS.SyncPlot) plot of the slew rate currents of the Sequence struct\n\nExamples\n\njulia> seq_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/1.sequences/spiral.seq\")\n\njulia> seq = read_seq(seq_file)\n\njulia> plot_slew_rate(seq)\n\n\n\n\n\n","category":"function"},{"location":"reference/5-koma-plots/#KomaMRIPlots.plot_seqd","page":"KomaMRIPlots","title":"KomaMRIPlots.plot_seqd","text":"p = plot_seqd(seq::Sequence; sampling_params=KomaMRIBase.default_sampling_params())\n\nPlots a sampled sequence struct.\n\nArguments\n\nseq: (::Sequence) Sequence struct\n\nKeywords\n\nsampling_params: (::Dict{String,Any}(), =KomaMRIBase.default_sampling_params()) dictionary of sampling parameters\n\nReturns\n\np: (::PlotlyJS.SyncPlot) plot of the sampled Sequence struct\n\nExamples\n\njulia> seq_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/1.sequences/spiral.seq\")\n\njulia> seq = read_seq(seq_file)\n\njulia> plot_seqd(seq)\n\n\n\n\n\n","category":"function"},{"location":"reference/5-koma-plots/#Plotting-RawAcquisitionData","page":"KomaMRIPlots","title":"Plotting RawAcquisitionData","text":"","category":"section"},{"location":"reference/5-koma-plots/","page":"KomaMRIPlots","title":"KomaMRIPlots","text":"plot_signal","category":"page"},{"location":"reference/5-koma-plots/#KomaMRIPlots.plot_signal","page":"KomaMRIPlots","title":"KomaMRIPlots.plot_signal","text":"p = plot_signal(raw::RawAcquisitionData; kwargs...)\n\nPlots a raw signal in ISMRMRD format.\n\nArguments\n\nraw: (::RawAcquisitionData) RawAcquisitionData struct (raw signal in ISMRMRD format)\n\nKeywords\n\nwidth: (::Integer, =nothing) plot width\nheight: (::Integer, =nothing) plot height\nslider: (::Bool, =true) boolean to indicate whether to display a slider\nshow_sim_blocks: (::Bool, =false) boolean to indicate whether to display sequence blocks\ndarkmode: (::Bool, =false) boolean to indicate whether to display darkmode style\nrange: (::Vector{Real}, =[]) time range to be displayed initially\n\nReturns\n\np: (::PlotlyJS.SyncPlot) plot of the raw signal\n\nExamples\n\njulia> seq_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/5.koma_paper/comparison_accuracy/sequences/EPI/epi_100x100_TE100_FOV230.seq\");\n\njulia> sys, obj, seq = Scanner(), brain_phantom2D(), read_seq(seq_file)\n\njulia> raw = simulate(obj, seq, sys)\n\njulia> plot_signal(raw)\n\n\n\n\n\n","category":"function"},{"location":"reference/5-koma-plots/#Plotting-images","page":"KomaMRIPlots","title":"Plotting images","text":"","category":"section"},{"location":"reference/5-koma-plots/","page":"KomaMRIPlots","title":"KomaMRIPlots","text":"plot_image","category":"page"},{"location":"reference/5-koma-plots/#KomaMRIPlots.plot_image","page":"KomaMRIPlots","title":"KomaMRIPlots.plot_image","text":"p = plot_image(image; height, width, zmin, zmax, darkmode, title)\n\nPlots an image matrix.\n\nArguments\n\nimage: (::Matrix{Number}) image matrix\n\nKeywords\n\nwidth: (::Integer, =nothing) plot width\nheight: (::Integer, =nothing) plot height\nzmin: (::Real, =minimum(abs.(image[:]))) reference value for minimum color\nzmax: (::Real, =maximum(abs.(image[:]))) reference value for maximum color\ndarkmode: (::Bool, =false) boolean to indicate whether to display darkmode style\ntitle: (::String, =\"\") plot title\n\nReturns\n\np: (::PlotlyJS.SyncPlot) plot of the image matrix\n\n\n\n\n\n","category":"function"},{"location":"reference/5-koma-plots/#Others","page":"KomaMRIPlots","title":"Others","text":"","category":"section"},{"location":"reference/5-koma-plots/","page":"KomaMRIPlots","title":"KomaMRIPlots","text":"plot_dict","category":"page"},{"location":"reference/5-koma-plots/#KomaMRIPlots.plot_dict","page":"KomaMRIPlots","title":"KomaMRIPlots.plot_dict","text":"str = plot_dict(dict::Dict)\n\nGenerates an HTML table based on the dictionary dict.\n\nArguments\n\ndict: (::Dict) dictionary\n\nReturns\n\nstr: (::String) dictionary as an HTML table\n\n\n\n\n\n","category":"function"},{"location":"explanation/3-simulation/#Simulation","page":"Simulation","title":"Simulation","text":"","category":"section"},{"location":"explanation/3-simulation/#General-Overview","page":"Simulation","title":"General Overview","text":"","category":"section"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"KomaMRI simulates the magnetization of each spin of a Phantom for variable magnetic fields given by a Sequence. It is assumed that a single spin is independent of the state of the other spins in the system (a key feature that enables parallelization). Furthermore, there are defined two regimes in the Sequence: excitation and precession. During the latter, the excitation fields are nulled and are useful for simplifying some physical equations.","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"The are more internal considerations in the KomaMRI implementation. The Figure 1 summarizes the functions called to perform the simulation.","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":" ","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"Figure 1: The sequence seq is discretized after calculating the required time points in the wrapper function simulate. The time points are then divided into Nblocks to reduce the amount of memory used. The phantom obj is divided into Nthreads, and KomaMRI will use either run_spin_excitation! or run_spin_precession! depending on the regime. If an ADC object is present, the simulator will add the signal contributions of each thread to construct the acquired signal sig[t]. All the parameters: Nthreads, Nblocks, Δt_rf, and Δt, are passed through a dictionary called sim_params as an optional parameter of the simulate function.","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"From the programming perspective, it is needed to call the simulate function with the sim_params dictionary keyword argument. A user can change the values of the following keys:","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"Parameter Description\n\"return_type\" defines the output of the simulate function. Possible values are \"raw\", \"mat\", and \"state\", corresponding to outputting a MRIReco RawAcquisitionData, the signal values, and the last magnetization state of the simulation, respectively.\n\"sim_method\" defines the type of simulation. The default value is Bloch(), but you can alternatively use the BlochDict() simulation method. Moreover, you have the flexibility to create your own methods without altering the KomaMRI source code; for further details, refer to the Simulation Method Extensibility section.\n\"Δt\" raster time for gradients.\n\"Δt_rf\" raster time for RFs.\n\"precision\" defines the floating-point simulation precision. You can choose between \"f32\" and \"f64\" to use Float32 and Float64 primitive types, respectively. It's important to note that, especially for GPU operations, using \"f32\" is generally much faster.\n\"Nblocks\" divides the simulation into a specified number of time blocks. This parameter is designed to conserve RAM resources, as KomaMRI computes a series of simulations consecutively, each with the specified number of blocks determined by the value of \"Nblocks\".\n\"Nthreads\" divides the Phantom into a specified number of threads. Because spins are modeled independently of each other, KomaMRI can solve simulations in parallel threads, speeding up the execution time.\n\"gpu\" is a boolean that determines whether to use GPU or CPU hardware resources, as long as they are available on the host computer.\n\"gpu_device\" sets the index ID of the available GPU in the host computer.","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"For instance, if you want to perform a simulation on the CPU with float64 precision using the BlochDict() method (assuming you have already defined obj and seq), you can do so like this:","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"# Set non-default simulation parameters and run simulation\nsim_params = KomaMRICore.default_sim_params() \nsim_params[\"gpu\"] = false\nsim_params[\"precision\"] = \"f64\"\nsim_params[\"sim_method\"] = BlochDict()\nraw = simulate(obj, seq, sys; sim_params)","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"Additionally, the user must be aware of the functions run_spin_excitation! and run_spin_precession! which defines the algorithm for excitation and precession regimes respectively and can be changed by the user without modifying the source code (more details at Simulation Method Extensibility).","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"Previous simulation, the Sequence is discretized to consider specific time points which are critical for simulation. The user can control the time between intermediate gradient samples with the parameter Δt. Similarly, the parameter Δt_rf manages the time between RF samples, and can be relatively large for 2D imaging where the slice profile is less relevant.","category":"page"},{"location":"explanation/3-simulation/#Computation-Efficiency","page":"Simulation","title":"Computation Efficiency","text":"","category":"section"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"To reduce the memory usage of our simulator, we subdivided time into Nblocks. KomaMRI classifies each block in either the excitation regime or the precession regime before the simulation.","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"We increased the simulation speed by separating the calculations into Nthreads and then performing the GPU parallel operations with CUDA.jl . This separation is possible as all magnetization vectors are independent of one another.","category":"page"},{"location":"explanation/3-simulation/#Simulation-Method-Extensibility","page":"Simulation","title":"Simulation Method Extensibility","text":"","category":"section"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"In Julia, functions use different methods based on the input types via multiple dispatch. We used this to specialize the simulation functions for a given sim_method <:SimulationMethod specified in sim_params. For a given simulation method, the function initialize_spin_state outputs a variable Xt <: SpinStateRepresentation that is passed through the simulation (Figure 1). For the default simulation method Bloch, the spin state is of type Mag, but can be extended to a custom representation, like for example EPGs44 or others. Then, the functions run_spin_excitation! and run_spin_precession! can be described externally for custom types sim_method and Xt, extending Koma’s functionalities without the need of modifying the source code and taking advantage of all of Koma’s features.","category":"page"},{"location":"explanation/3-simulation/#Bloch-Simulation-Method","page":"Simulation","title":"Bloch Simulation Method","text":"","category":"section"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"This is the default simulation method used by KomaMRI, however it can always be specified by setting the sim_method = Bloch() entry of the sim_params dictionary. In the following subsection, we will explain the physical and mathematical background and some considerations and assumptions that enables to speed up the simulation.","category":"page"},{"location":"explanation/3-simulation/#Physical-and-Mathematical-Background","page":"Simulation","title":"Physical and Mathematical Background","text":"","category":"section"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"The Bloch method of KomaMRI simulates the magnetization of each spin by solving the Bloch equations in the rotating frame:","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"beginalign tag1\n\nfracmathrmd boldsymbolMmathrmd t =\n gamma boldsymbolM times boldsymbolB\n- fracM_x hatx + M_y hatyT_2\n- fracM_z hatx + M_0 hatyT_1 \n\nendalign","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"with gamma the gyromagnetic ratio, boldsymbolM = M_x M_y M_z^T the magnetization vector, and","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"boldsymbolB = B_1x(t) B_1y(t) boldsymbolG(t) cdot boldsymbolx + Delta omega(t)^T","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"the effective magnetic field. M_0 is the proton density, T_1 and T_2 are the relaxation times, and Delta omega is the off-resonance, for each position.","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"The Bloch Simulation Method also uses the technique of operator splitting to simplify the solution of Equation (1). This reflects mathematically the intuition of separating the Bloch equations in a rotation operator described by","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"beginalign tag2\n\nfracmathrmdmathrmdt boldsymbolM =\nbeginbmatrix\n 0 gamma B_z -gamma B_y \n-gamma B_z 0 gamma B_x \n gamma B_y -gamma B_x 0\nendbmatrix\nboldsymbolM \n\nendalign","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"and a relaxation operator described by","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"beginalign tag3\n\nfracmathrmdmathrmdt boldsymbolM =\nbeginbmatrix\n-tfrac1T_2 0 0 \n0 -tfrac1T_2 0 \n0 0 -tfrac1T_1\nendbmatrix\nboldsymbolM\n+\nbeginbmatrix\n0 \n0 \ntfracM_0T_1\nendbmatrix \n\nendalign","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"The evolution of the magnetization can then be described as a two-step process for each time step Delta t (Figure 2).","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"\n\n \n Figure 2 : Solution of the Bloch equations for one time step can be described by (2) a rotation and (3) a relaxation step. \n \n
","category":"page"},{"location":"explanation/3-simulation/#Bloch()-Method-Example","page":"Simulation","title":"Bloch() Method Example","text":"","category":"section"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"We will consider an RF pulse that excites a phantom with 3 spins, and then we acquire the data:","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"View code ","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"# Import modules\nusing KomaMRI\n\n# Define sequence\nampRF = 2e-6 # 2 uT RF amplitude\ndurRF = π / 2 / (2π * γ * ampRF) # required duration for a 90 deg RF pulse\nexc = RF(ampRF, durRF)\n\nnADC = 8192 # number of acquisition samples\ndurADC = 4000e-3 # duration of the acquisition\ndelay = 1e-3 # small delay\nacq = ADC(nADC, durADC, delay)\n\nseq = Sequence() # empty sequence\nseq += exc # adding RF-only block\nseq += acq # adding ADC-only block","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":" ","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"julia> obj = Phantom(x=[-0.5e-3; 0.0; 0.5e-3], T1=[1000e-3; 2000e-3; 500e-3], T2=[500e-3; 1000e-3; 2000e-3]);","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"julia> plot_seq(seq; slider=false)","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":" ","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"The resulting signal from the Bloch() method is the sum of magnetizations in the transverse plane (x, y):","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"# Configure Bloch() simulation method and run simulation\nsim_params = KomaMRICore.default_sim_params()\nsim_params[\"return_type\"] = \"mat\"\nsim_params[\"sim_method\"] = Bloch()\nsig = simulate(obj, seq, sys; sim_params)","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"julia> plot(abs.(sig[:,1,1]))","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":" ","category":"page"},{"location":"explanation/3-simulation/#BlochDict-Simulation-Method","page":"Simulation","title":"BlochDict Simulation Method","text":"","category":"section"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"This is another simulation method defined in the source code of KomaMRI. You can specify it by setting the sim_method = BlochDict() entry in the sim_params dictionary. Additionally, it offers the option to save the resulting signal in the z-component by using sim_method = BlochDict(save_Mz=true). This method allows you to store the magnetizations of all spins in both the transverse plane (x, y) and the longitudinal axis (z) if specified.","category":"page"},{"location":"explanation/3-simulation/#BlochDict()-Method-Example","page":"Simulation","title":"BlochDict() Method Example","text":"","category":"section"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"We are going to consider the same setup as in the Bloch() Method Example. This includes the same excitation, acquisition, and the same 3-spin phantom:","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"View code ","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"# Import modules\nusing KomaMRI, PlotlyJS\n\n# Define sequence\nampRF = 2e-6 # 2 uT RF amplitude\ndurRF = π / 2 / (2π * γ * ampRF) # required duration for a 90 deg RF pulse\nexc = RF(ampRF, durRF)\n\nnADC = 8192 # number of acquisition samples\ndurADC = 4000e-3 # duration of the acquisition\ndelay = 1e-3 # small delay\nacq = ADC(nADC, durADC, delay)\n\nseq = Sequence() # empty sequence\nseq += exc # adding RF-only block\nseq += acq # adding ADC-only block","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":" ","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"julia> obj = Phantom(x=[-0.5e-3; 0.0; 0.5e-3], T1=[1000e-3; 2000e-3; 500e-3], T2=[500e-3; 1000e-3; 2000e-3]);","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"julia> plot_seq(seq; slider=false)","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":" ","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"The resulting signal from the BlochDict() method comprises the individual magnetizations of all spins in both the transverse plane (x, y) and the longitudinal axis (z):","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"# Configure BlochDict() simulation method and run simulation\nsim_params = KomaMRICore.default_sim_params()\nsim_params[\"return_type\"] = \"mat\"\nsim_params[\"sim_method\"] = BlochDict(save_Mz=true)\nsig = simulate(obj, seq, sys; sim_params)\n\n# Define the plots for traverse and longitudinal magnetizations\npxy = plot(abs.(sig[:,:,1]));\npz = plot(abs.(sig[:,:,2]));","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":"julia> [pxy pz]","category":"page"},{"location":"explanation/3-simulation/","page":"Simulation","title":"Simulation","text":" ","category":"page"},{"location":"how-to/3-create-your-own-phantom/#Create-Your-Own-Phantom","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"","category":"section"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"In this section, we will create a custom Phantom struct. While the example is presented in 2D, the concepts discussed here can be readily extended to 3D phantoms.","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"In KomaMRI, the creation of a Phantom struct involves defining spin position arrays (x, y, z) and spin property arrays. The indices of these arrays are then associated with independent spins.","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"For instance, you can create a Phantom with one spin like so:","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"# Define arrays of positions (spin at zero position)\nx = [0.0]\ny = [0.0]\nz = [0.0]\n\n# Define arrays of properties (for CSF tissue)\nρ = [1.0]\nT1 = [2.569]\nT2 = [0.329]\nT2s = [0.058]\n\n# Define the phantom\nspin = Phantom(name=\"spin\", x=x, y=y, z=z, ρ=ρ, T1=T1, T2=T2, T2s=T2s)","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"Phantom{Float64}\n name: String \"spin\"\n x: Array{Float64}((1,)) [0.0]\n y: Array{Float64}((1,)) [0.0]\n z: Array{Float64}((1,)) [0.0]\n ρ: Array{Float64}((1,)) [1.0]\n T1: Array{Float64}((1,)) [2.569]\n T2: Array{Float64}((1,)) [0.329]\n T2s: Array{Float64}((1,)) [0.058]\n Δw: Array{Float64}((1,)) [0.0]\n Dλ1: Array{Float64}((1,)) [0.0]\n Dλ2: Array{Float64}((1,)) [0.0]\n Dθ: Array{Float64}((1,)) [0.0]\n ux: #122 (function of type KomaMRICore.var\"#122#136\")\n uy: #123 (function of type KomaMRICore.var\"#123#137\")\n uz: #124 (function of type KomaMRICore.var\"#124#138\")","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"You can add more properties to the Phantom, such as off-resonance, diffusion parameters, and even functions of motion. However, we won't be utilizing them (except for the off-resonance parameter) to maintain simplicity.","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"If you are familiar with the MRI world, you likely have a 2D or 3D array, where each element contains an ID number identifying a different class of tissue. In this setup, the array axes represent spatial positions, while the elements are used for tissue identification.","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"In this example, we will utilize a .mat file containing arrays with such arrangements. The file is readily available upon installing KomaMRI. Let's read the file and store the 2D data in an array called class:\"","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"# Import necessary modules\nusing KomaMRI, MAT\n\n# Get data from a .mat file\npath_koma = dirname(dirname(pathof(KomaMRI)))\npath_phantom_mat = joinpath(path_koma, \"KomaMRIBase\", \"src\", \"datatypes\", \"phantom\", \"pelvis2D.mat\")\ndata = MAT.matread(path_phantom_mat)\nclass = data[\"pelvis3D_slice\"]","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"You can visualize the tissue map using the plot_image function:","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"plot_image(class)","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":" ","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"Let's define the position arrays. You need to know the distance between the spins in the original array (in this case, it is 0.5mm), and then you can determine all the positions like this (the z-component is not calculated since this is a 2D example):","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"# Define spin position arrays\nΔx = .5e-3 # 0.5mm\nM, N = size(class) # Number of spins in x and y\nFOVx = (M-1)*Δx # Field of view in x\nFOVy = (N-1)*Δx # Field of view in y\nx = -FOVx/2:Δx:FOVx/2 # x spin coordinates vector\ny = -FOVy/2:Δx:FOVy/2 # y spin coordinates vector\nx, y = x .+ y'*0, x*0 .+ y' # x and y grid points","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"Now, let's define the arrays for the properties. It's essential to have prior knowledge of the property values for different tissue classes. For example, for soft tissue, we use ρ = 0.9, T1 = 1200 * 1e-3, T2 = 80 * 1e-3, and T2s = 80 * 1e-3. Additionally, we create an array mask to identify the location of a tissue's ID. For soft tissue with ID = 153, the mask is (class .== 153). Finally, to obtain a property, sum all the masks with values for all tissue classes. This process is illustrated below: ","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"# Define the proton density array\nρ = (class.==102)*.86 .+ # Fat\n (class.==153)*.9 .+ # SoftTissue\n (class.==204)*.4 .+ # SpongyBone\n (class.==255)*.2 # CorticalBone\n\n# Define the T1 decay array\nT1 = (class.==102)*366 .+ # Fat\n (class.==153)*1200 .+ # SoftTissue\n (class.==204)*381 .+ # SpongyBone\n (class.==255)*100 # CorticalBone\n\n# Define the T2 decay array\nT2 = (class.==102)*70 .+ # Fat\n (class.==153)*80 .+ # SoftTissue\n (class.==204)*52 .+ # SpongyBone\n (class.==255)*.3 # CorticalBone\n\n# Define the T2s decay array\nT2s = (class.==102)*70 .+ # Fat\n (class.==153)*80 .+ # SoftTissue\n (class.==204)*52 .+ # SpongyBone\n (class.==255)*.3 # CorticalBone\n\n# Define off-resonance array\nΔw_fat = -220 * 2π\nΔw = (class.==102) * Δw_fat # FAT1\n\n# Adjust with scaling factor\nT1 = T1*1e-3\nT2 = T2*1e-3\nT2s = T2s*1e-3","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"Finally, we can invoke the Phantom constructor. However, before doing so, we choose not to store spins where the proton density is zero to avoid unnecessary data storage. This is achieved by applying the mask ρ.!=0 to the arrays. Additionally, please note that we set the z-position array filled with zeros.","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"# Define the phantom\nobj = Phantom{Float64}(\n name = \"custom-pelvis\",\n\tx = x[ρ.!=0],\n\ty = y[ρ.!=0],\n\tz = 0*x[ρ.!=0],\n\tρ = ρ[ρ.!=0],\n\tT1 = T1[ρ.!=0],\n\tT2 = T2[ρ.!=0],\n\tT2s = T2s[ρ.!=0],\n\tΔw = Δw[ρ.!=0],\n)","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"We can display the Phantom struct with the plot_phantom_map function. In this case we select the T1 decay to be displayed, but you can choose other property to be displayed:","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":"plot_phantom_map(obj, :T1)","category":"page"},{"location":"how-to/3-create-your-own-phantom/","page":"Create Your Own Phantom","title":"Create Your Own Phantom","text":" ","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"EditURL = \"lit-01-FID.jl\"","category":"page"},{"location":"tutorial/01-FID/#Free-Induction-Decay","page":"Free Induction Decay","title":"Free Induction Decay","text":"","category":"section"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"First of all, let's use the KomaMRI package and define the default scanner.","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"using KomaMRI\nsys = Scanner() # default hardware definition","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"The free induction decay is the simplest observable NMR signal. This signal is the one that follows a single tipping RF pulse. To recreate this experiment, we will need to define a Sequence with 2 blocks.","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"The first block containing an RF pulse with a flip-angle of 90 deg,","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"ampRF = 2e-6 # 2 uT RF amplitude\ndurRF = π / 2 / (2π * γ * ampRF) # required duration for a 90 deg RF pulse\nexc = RF(ampRF,durRF)","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"and the second block containing the ADC.","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"nADC = 8192 # number of acquisition samples\ndurADC = 250e-3 # duration of the acquisition\ndelay = 1e-3 # small delay\nacq = ADC(nADC, durADC, delay)","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"Finally, we concatenate the sequence blocks to create the final sequence.","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"seq = Sequence() # empty sequence\nseq += exc # adding RF-only block\nseq += acq # adding ADC-only block\np1 = plot_seq(seq; slider=false, height=300)\nsavefig(p1, \"../assets/1-seq.html\") # hide","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":" ","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"Now, we will define a Phantom with a single spin at x=0 with T_1=1000mathrmms and T_2=100mathrmms.","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"obj = Phantom{Float64}(x=[0.], T1=[1000e-3], T2=[100e-3])","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"Finally, to simulate we will need to use the function simulate.","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"raw = simulate(obj, seq, sys)","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"To plot the results we will need to use the plot_signal function","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"p2 = plot_signal(raw; slider=false, height=300)\nsavefig(p2, \"../assets/1-signal.html\") # hide","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":" ","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"Nice!, we can see that S(t) follows an exponential decay exp(-tT_2) as expected.","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"For a little bit of spiciness, let's add off-resonance to our example. We will use Delta f=-100mathrmHz. For this, we will need to add a definition for Δw in our Phantom","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"obj = Phantom{Float64}(x=[0.], T1=[1000e-3], T2=[100e-3], Δw=[-2π*100])# and simulate again.\n\nraw = simulate(obj, seq, sys)\np3 = plot_signal(raw; slider=false, height=300)\nsavefig(p3, \"../assets/1-signal2.html\") # hide","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":" ","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"The signal now follows an exponential of the form exp(-tT_2)cdotexp(-iDeltaomega t). The addition of exp(-iDeltaomega t) to the signal will generate a shift in the image space (Fourier shifting property). This effect will be better visualized and explained in later examples.","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"","category":"page"},{"location":"tutorial/01-FID/","page":"Free Induction Decay","title":"Free Induction Decay","text":"This page was generated using Literate.jl.","category":"page"},{"location":"how-to/3-create-your-own-sequence/#Create-Your-Own-Sequence","page":"Create Your Own Sequence","title":"Create Your Own Sequence","text":"","category":"section"},{"location":"how-to/3-create-your-own-sequence/","page":"Create Your Own Sequence","title":"Create Your Own Sequence","text":"warning: Warning\nThis section is currently under construction, and some details on how to construct a Sequence may be missing.","category":"page"},{"location":"how-to/3-create-your-own-sequence/","page":"Create Your Own Sequence","title":"Create Your Own Sequence","text":"This is an example of how to create a Sequence struct:","category":"page"},{"location":"how-to/3-create-your-own-sequence/","page":"Create Your Own Sequence","title":"Create Your Own Sequence","text":"# Export necessary modules\nusing KomaMRI\n\n# Create the function that creates a phantom\nfunction sequence_example(FOV::Real, N::Integer)\n\n # Define initial paramters (TODO: consider when N is even)\n sys = Scanner()\n\tΔt = sys.ADC_Δt\n\tGmax = sys.Gmax\n\tNx = Ny = N #Square acquisition\n\tΔx = FOV/(Nx-1)\n\tTa = Δt*(Nx-1) #4-8 us\n Δτ = Ta/(Ny-1)\n\tGa = 1/(γ*Δt*FOV)\n\tζ = Ga / sys.Smax\n\tGa ≥ sys.Gmax ? error(\"Ga=$(Ga*1e3) mT/m exceeds Gmax=$(Gmax*1e3) mT/m, increase Δt to at least Δt_min=\"\n\t*string(round(1/(γ*Gmax*FOV),digits=2))*\" us.\") : 0\n\tϵ1 = Δτ/(Δτ+ζ)\n\n\t# EPI base\n\tEPI = Sequence(vcat(\n\t [mod(i,2)==0 ? Grad(Ga*(-1)^(i/2),Ta,ζ) : Grad(0.,Δτ,ζ) for i=0:2*Ny-2], #Gx\n\t \t[mod(i,2)==1 ? ϵ1*Grad(Ga,Δτ,ζ) : Grad(0.,Ta,ζ) for i=0:2*Ny-2])) #Gy\n\tEPI.ADC = [mod(i,2)==1 ? ADC(0,Δτ,ζ) : ADC(N,Ta,ζ) for i=0:2*Ny-2]\n\n\t# Pre-wind and wind gradients\n\tϵ2 = Ta/(Ta+ζ)\n PHASE = Sequence(reshape(1/2*[Grad( -Ga, Ta, ζ); ϵ2*Grad(-Ga, Ta, ζ)],:,1)) # This needs to be calculated differently\n\tDEPHASE = Sequence(reshape(1/2*[Grad((-1)^N*Ga, Ta, ζ); ϵ2*Grad(-Ga, Ta, ζ)],:,1)) # for even N\n\tseq = PHASE + EPI + DEPHASE\n\n\t# Saving parameters\n\tseq.DEF = Dict(\"Nx\"=>Nx,\"Ny\"=>Ny,\"Nz\"=>1,\"Name\"=>\"epi\")\n\n # Return the sequence\n\treturn seq\nend\n\n# Call the function to create a sequence\nFOV, N = 23e-2, 101\nseq = sequence_example(FOV, N)\n\n# Plot the sequence in time and its kspace\nplot_seq(seq; range=[0 30])\nplot_kspace(seq)","category":"page"},{"location":"how-to/3-create-your-own-sequence/","page":"Create Your Own Sequence","title":"Create Your Own Sequence","text":" ","category":"page"},{"location":"reference/3-koma-core/#KomaMRICore","page":"KomaMRICore","title":"KomaMRICore","text":"","category":"section"},{"location":"reference/3-koma-core/","page":"KomaMRICore","title":"KomaMRICore","text":"CurrentModule = KomaMRICore","category":"page"},{"location":"reference/3-koma-core/#Simulation-functions","page":"KomaMRICore","title":"Simulation functions","text":"","category":"section"},{"location":"reference/3-koma-core/","page":"KomaMRICore","title":"KomaMRICore","text":"simulate\nsimulate_slice_profile\ndefault_sim_params","category":"page"},{"location":"reference/3-koma-core/#KomaMRICore.simulate","page":"KomaMRICore","title":"KomaMRICore.simulate","text":"out = simulate(obj::Phantom, seq::Sequence, sys::Scanner; sim_params, w)\n\nReturns the raw signal or the last state of the magnetization according to the value of the \"return_type\" key of the sim_params dictionary. \n\nThis is a wrapper function to run_sim_time_iter, which converts the inputs to the appropriate types and discretizes the sequence before simulation. The reported simulation time only considers run_sim_time_iter, as the preprocessing duration should be negligible compared to the simulation time (if this is not the case, please file a bug report). \n\nArguments\n\nobj: (::Phantom) Phantom struct\nseq: (::Sequence) Sequence struct\nsys: (::Scanner) Scanner struct\n\nKeywords\n\nsim_params: (::Dict{String,Any}, =Dict{String,Any}()) simulation parameter dictionary\nw: (::Blink.AtomShell.Window, =nothing) the window within which to display a progress bar in the Blink Window UI. If this variable is anything other than 'nothing', the progress bar will be considered\n\nReturns\n\nout: (::Vector{Complex} or ::SpinStateRepresentation or ::RawAcquisitionData) depending on whether \"return_type\" is \"mat\", \"state\" or \"raw\" (default), respectively\n\nExamples\n\njulia> seq_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/5.koma_paper/comparison_accuracy/sequences/EPI/epi_100x100_TE100_FOV230.seq\");\n\njulia> sys, obj, seq = Scanner(), brain_phantom2D(), read_seq(seq_file)\n\njulia> raw = simulate(obj, seq, sys)\n\njulia> plot_signal(raw)\n\n\n\n\n\n","category":"function"},{"location":"reference/3-koma-core/#KomaMRICore.simulate_slice_profile","page":"KomaMRICore","title":"KomaMRICore.simulate_slice_profile","text":"mag = simulate_slice_profile(seq; z, sim_params)\n\nReturns magnetization of spins distributed along z after running the Sequence struct.\n\nArguments\n\nseq: (::Sequence) Sequence struct\n\nKeywords\n\nz: (=range(-2e-2,2e-2,200)) range for the z axis\nsim_params: (::Dict{String, Any}, =Dict{String,Any}(\"Δt_rf\"=>1e-6)) dictionary with simulation parameters\n\nReturns\n\nmag: (::SpinStateRepresentation) final state of the magnetization vector\n\n\n\n\n\n","category":"function"},{"location":"reference/3-koma-core/#KomaMRICore.default_sim_params","page":"KomaMRICore","title":"KomaMRICore.default_sim_params","text":"sim_params = default_sim_params(sim_params=Dict{String,Any}())\n\nThis function returns a dictionary containing default simulation parameters while also allowing the user to define some of them.\n\nArguments\n\nsim_params: (::Dict{String,Any}, =Dict{String,Any}()) user-defined dictionary with simulation parameters. The following lists its keys along with their possible values:\n\"return_type\": defines the output of the simulate function. Possible values are \"raw\", \"mat\", and \"state\", corresponding to outputting a MRIReco RawAcquisitionData, the signal values, and the last magnetization state of the simulation, respectively\n\"sim_method\": defines the type of simulation. The default value is Bloch(), but you can alternatively use the BlochDict() simulation method. Moreover, you have the flexibility to create your own methods without altering the KomaMRI source code\n\"Δt\": raster time for gradients\n\"Δt_rf\": raster time for RFs\n\"precision\": defines the floating-point simulation precision. You can choose between \"f32\" and \"f64\" to use Float32 and Float64 primitive types, respectively. It's important to note that, especially for GPU operations, using \"f32\" is generally much faster\n\"Nblocks\": divides the simulation into a specified number of time blocks. This parameter is designed to conserve RAM resources, as KomaMRI computes a series of simulations consecutively, each with the specified number of blocks determined by the value of \"Nblocks\"\n\"Nthreads\": divides the Phantom into a specified number of threads. Because spins are modeled independently of each other, KomaMRI can solve simulations in parallel threads, speeding up the execution time\n\"gpu\": is a boolean that determines whether to use GPU or CPU hardware resources, as long as they are available on the host computer\n\"gpu_device\": default value is 'nothing'. If set to integer or device instance, calls the corresponding function to set the device of the available GPU in the host computer (e.g. CUDA.device!)\n\nReturns\n\nsim_params: (::Dict{String,Any}) dictionary with simulation parameters\n\n\n\n\n\n","category":"function"},{"location":"reference/3-koma-core/#GPU-helper-functions","page":"KomaMRICore","title":"GPU helper functions","text":"","category":"section"},{"location":"reference/3-koma-core/","page":"KomaMRICore","title":"KomaMRICore","text":"get_backend\nprint_devices\ngpu\ncpu\nf32\nf64","category":"page"},{"location":"reference/3-koma-core/#KomaMRICore.get_backend","page":"KomaMRICore","title":"KomaMRICore.get_backend","text":"get_backend(use_gpu)\n\nGets the simulation backend to use. If use_gpu=false or there are no available GPU backends, returns CPU(), else, returns the GPU backend (currently either CUDABackend(), MetalBackend(), ROCBackend(), or oneAPIBackend()).\n\nThe GPU package for the corresponding backend (CUDA.jl, Metal.jl, AMDGPU.jl, or oneAPI.jl) must be loaded and functional, otherwise KomaMRI will default to using the CPU.\n\nArguments\n\n'use_gpu': ('::Bool') If true, attempt to use GPU and check for available backends\n\nReturns\n\n'backend': (::KernelAbstractions.backend) The backend to use\n\n\n\n\n\n","category":"function"},{"location":"reference/3-koma-core/#KomaMRICore.print_devices","page":"KomaMRICore","title":"KomaMRICore.print_devices","text":"print_devices()\n\nSimple function to print available devices. Calls internal get_backend() function to get the appropriate GPU / CPU backend and prints device information.\n\nArguments\n\n'use_gpu': ('::Bool') If true, check for loaded / functional GPU backends and print appropriate warnings if no GPU backends have been loaded\n\n\n\n\n\n","category":"function"},{"location":"reference/3-koma-core/#KomaMRICore.gpu","page":"KomaMRICore","title":"KomaMRICore.gpu","text":"gpu(x)\n\nMoves 'x' to the GPU. For this function to work, a GPU backend will need to be loaded with 'using AMDGPU / CUDA / Metal / oneAPI.\n\nThis works for functions, and any struct marked with @functor.\n\nUse cpu to copy back to ordinary Arrays.\n\nSee also f32 and f64 to change element type only.\n\nExamples\n\nusing CUDA\nx = x |> gpu\n\n\n\n\n\ngpu(x, backend)\n\nTries to move x to the GPU backend specified in the 'backend' parameter. \n\nThis works for functions, and any struct marked with @functor.\n\nUse cpu to copy back to ordinary Arrays.\n\nSee also f32 and f64 to change element type only.\n\nExamples\n\nx = gpu(x, CUDABackend())\n\n\n\n\n\n","category":"function"},{"location":"reference/3-koma-core/#KomaMRICore.cpu","page":"KomaMRICore","title":"KomaMRICore.cpu","text":"cpu(x)\n\nTries to move object to CPU. This works for functions, and any struct marked with @functor.\n\nSee also gpu.\n\nExamples\n\nx = x |> cpu\n\n\n\n\n\n","category":"function"},{"location":"reference/3-koma-core/#KomaMRICore.f32","page":"KomaMRICore","title":"KomaMRICore.f32","text":"f32(m)\n\nConverts the eltype of model's parameters to Float32 Recurses into structs marked with @functor.\n\nSee also f64.\n\n\n\n\n\n","category":"function"},{"location":"reference/3-koma-core/#KomaMRICore.f64","page":"KomaMRICore","title":"KomaMRICore.f64","text":"f64(m)\n\nConverts the eltype of model's parameters to Float64 (which is Koma's default).. Recurses into structs marked with @functor.\n\nSee also f32.\n\n\n\n\n\n","category":"function"},{"location":"reference/3-koma-core/#Signal-to-RawAquisitionData-(MRD)","page":"KomaMRICore","title":"Signal to RawAquisitionData (MRD)","text":"","category":"section"},{"location":"reference/3-koma-core/","page":"KomaMRICore","title":"KomaMRICore","text":"signal_to_raw_data","category":"page"},{"location":"reference/3-koma-core/#KomaMRICore.signal_to_raw_data","page":"KomaMRICore","title":"KomaMRICore.signal_to_raw_data","text":"raw = signal_to_raw_data(signal, seq; phantom_name, sys, sim_params)\n\nTransforms the raw signal into a RawAcquisitionData struct (nearly equivalent to the ISMRMRD format) used for reconstruction with MRIReco.\n\nArguments\n\nsignal: (::Matrix{Complex}) raw signal matrix\nseq: (::Sequence) Sequence struct\n\nKeywords\n\nphantom_name: (::String, =\"Phantom\") phantom name\nsys: (::Scanner, =Scanner()) Scanner struct\nsim_params: (::Dict{String, Any}, =Dict{String,Any}()) simulation parameter dictionary\n\nReturns\n\nraw: (::RawAcquisitionData) RawAcquisitionData struct\n\nExamples\n\njulia> seq_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/1.sequences/epi_se.seq\")\n\njulia> sys, obj, seq = Scanner(), brain_phantom2D(), read_seq(seq_file)\n\njulia> sim_params = KomaMRICore.default_sim_params(); sim_params[\"return_type\"] = \"mat\"\n\njulia> signal = simulate(obj, seq, sys; sim_params)\n\njulia> raw = signal_to_raw_data(signal, seq)\n\njulia> plot_signal(raw)\n\n\n\n\n\n","category":"function"},{"location":"reference/3-koma-core/#SpinRepresentationState's","page":"KomaMRICore","title":"SpinRepresentationState's","text":"","category":"section"},{"location":"reference/3-koma-core/","page":"KomaMRICore","title":"KomaMRICore","text":"Mag","category":"page"},{"location":"reference/3-koma-core/#KomaMRICore.Mag","page":"KomaMRICore","title":"KomaMRICore.Mag","text":"mag = Mag(xy::Complex, z::Real)\n\nThe Magnetization struct.\n\nArguments\n\nxy: (::Complex{Float64}) magnetization of a spin in the xy plane\nz: (::Real) magnetization of a spin in the z plane\n\nReturns\n\nmag: (::Mag) Magnetization struct\n\n\n\n\n\n","category":"type"},{"location":"reference/3-koma-core/#Spinor-rotation-matrix-(RF-excitation)","page":"KomaMRICore","title":"Spinor rotation matrix (RF excitation)","text":"","category":"section"},{"location":"reference/3-koma-core/","page":"KomaMRICore","title":"KomaMRICore","text":"Spinor\nQ\nUn\nRx\nRy\nRz","category":"page"},{"location":"reference/3-koma-core/#KomaMRICore.Spinor","page":"KomaMRICore","title":"KomaMRICore.Spinor","text":"spinor = Spinor(α, β)\n\nSpinor(α, β) with Cayley-Klein parameters α and β. Based on \"Introduction to the Shinnar-Le Roux algorithm\", Patrick Le Roux (1995). A spinor is a way to represent 3D rotations, the underlying representation is a 2 X 2 complex unitary matrix (alphabetainmathbbC):\n\nR=leftbeginarraycc\nalpha -beta^*\nbeta alpha^*\nendarrayright\n\nwith alpha^2+beta^2 = 1.\n\nThis later operates on the 2times2 representation of (xyz) as follows V^+ = R V R^*.\n\nArguments\n\nα: (::Complex{Float64}) Cayley-Klein parameter α\nβ: (::Complex{Float64}) Cayley-Klein parameter β\n\nReturns\n\nspinor: (::Spinor) Spinor struct\n\n\n\n\n\n","category":"type"},{"location":"reference/3-koma-core/#KomaMRICore.Q","page":"KomaMRICore","title":"KomaMRICore.Q","text":"s = Q(φ, nxy, nz)\n\nSpinor rotation matrix. Counter-clockwise rotation of φ with respect to the axis of rotation n=(nx, ny, nz).\n\nPauly, J., Le Roux, P., Nishimura, D., & Macovski, A. (1991). Parameter relations for the Shinnar-Le Roux selective excitation pulse design algorithm (NMR imaging). IEEE Transactions on Medical Imaging, 10(1), 53-65. doi:10.1109/42.75611\n\nvarphi=-gammaDelta tsqrtleftB_1right^2+left(boldsymbolGcdotboldsymbolx\nright)^2=-gammaDelta tleftVert boldsymbolBrightVert\n\nboldsymboln=boldsymbolBleftVert boldsymbolBrightVert\n\nArguments\n\nφ: (::Real, [rad]) φ angle\nnxy: (::Real) nxy factor\nnz: (::Real) nz factor\n\nReturns\n\ns: (::Spinor) spinnor struct that represents the Q rotation matrix\n\n\n\n\n\n","category":"function"},{"location":"reference/3-koma-core/#KomaMRICore.Un","page":"KomaMRICore","title":"KomaMRICore.Un","text":"Rodrigues' formula: Rotation matrix that when applied rotates with respect to \"n\" in an angle θ anti clock-wise\n\n\n\n\n\n","category":"function"},{"location":"reference/3-koma-core/#KomaMRICore.Rx","page":"KomaMRICore","title":"KomaMRICore.Rx","text":"s = Rx(θ)\n\nSpinor counter-clockwise rotation matrix with angle θ with respect to x-axis.\n\nArguments\n\nθ: (::Real, [rad]) angle with respect to x-axis\n\nReturns\n\ns: (::Spinor) spinor struct that represents the Rx rotation matrix\n\n\n\n\n\n","category":"function"},{"location":"reference/3-koma-core/#KomaMRICore.Ry","page":"KomaMRICore","title":"KomaMRICore.Ry","text":"s = Ry(θ)\n\nSpinor counter-clockwise rotation matrix with angle θ with respect to y-axis.\n\nArguments\n\nθ: (::Real, [rad]) angle with respect to y-axis\n\nReturns\n\ns: (::Spinor) spinor struct that represents the Ry rotation matrix\n\n\n\n\n\n","category":"function"},{"location":"reference/3-koma-core/#KomaMRICore.Rz","page":"KomaMRICore","title":"KomaMRICore.Rz","text":"s = Rz(φ)\n\nSpinor counter-clockwise rotation matrix with angle φ with respect to z-axis.\n\nArguments\n\nφ: (::Real, [rad]) angle with respect to z-axis\n\nReturns\n\ns: (::Spinor) spinnor struct that represents the Rz rotation matrix\n\n\n\n\n\n","category":"function"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"EditURL = \"lit-02-SmallTipApproximation.jl\"","category":"page"},{"location":"tutorial/02-SmallTipApproximation/#Small-Tip-Angle-Approximation","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"","category":"section"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"Based on the results in page 41 of the book \"Handbook of MRI Pulse Sequences\" by Bernstein et al.","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"using KomaMRI # hide\nsys = Scanner() # hide\nsys.Smax = 50 # hide","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"In this example, we will showcase a common approximation in MRI, the small tip angle approximation. For this, we will simulate a slice profile for spins with positions zin-22mathrmcm and with a gradient G_z so their frequencies are mapped to fin-55mathrmkHz. To start, we define an RF pulse with a flip angle of 30 deg and pulse duration of T_mathrmrf=32mathrmms.","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"B1 = 4.92e-6\nTrf = 3.2e-3\nzmax = 2e-2\nfmax = 5e3\nz = range(-zmax, zmax, 400)\nGz = fmax / (γ * zmax)\nf = γ * Gz * z # hide","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"The designed RF pulse is presented in the figure below, where the additional gradient refocuses the spins' phase after the excitation.","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"seq = PulseDesigner.RF_sinc(B1, Trf, sys; G=[0;0;Gz], TBP=8)\np2 = plot_seq(seq; max_rf_samples=Inf, slider=false)\nsavefig(p2, \"../assets/42-seq.html\") # hide","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":" ","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"Now we will perform the simulation using the function simulate_slice_profile. Note that we modified Δt_rf in sim_params to match the resolution of the waveform.","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"sim_params = Dict{String, Any}(\"Δt_rf\" => Trf / length(seq.RF.A[1]))\nM = simulate_slice_profile(seq; z, sim_params)\n\nusing PlotlyJS # hide\ns1 = scatter(x=f, y=real.(M.xy), name=\"Mx\") # hide\ns2 = scatter(x=f, y=imag.(M.xy), name=\"My\") # hide\ndat = seq.RF.A[1] # hide\nN = length(dat) # hide\ndat_pad = [zeros(floor(Int64,N)); dat; zeros(floor(Int64,N))] # hide\nN_pad = length(dat_pad) # hide\nU = 1 / (Trf) * N / N_pad #hide\nu = range(0, (N_pad - 1) * U; step=U) # hide\nu = u .- maximum(u) / 2 .- U/2 # hide\nFT_dat_pad = abs.(KomaMRI.fftc(dat_pad; dims=1)) # hide\nscale_factor = maximum(abs.(M.xy)) / maximum(FT_dat_pad) # hide\ns3 = scatter(x=u, y=FT_dat_pad*scale_factor, name=\"|FT(B₁(t))|\", line=attr(dash=\"dash\")) # hide\npb = plot([s1,s2,s3], Layout(title=\"30 deg SINC pulse (TBP=8, Hamming)\", xaxis_title=\"Frequency [Hz]\", xaxis_range=[-fmax,fmax])) # hide\nsavefig(pb, \"../assets/4b-profile.html\") # hide","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"This produces the following slice profile:","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":" ","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"As you can see, for a flip angle of 30 deg, the slice profile is very close to the small tip angle approximation (the Fourier transform of B_1(t)).","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"But what will happen if we use a flip angle of 120 deg instead?","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"α_desired = 120 + 0im # The multiplication of a complex number scales the RF pulse of a Sequence\nα = get_flip_angles(seq)[1] # Previous FA approx 30 deg\nseq = (α_desired / α) * seq # Scaling the pulse to have a flip angle of 120\nM = simulate_slice_profile(seq; z, sim_params)\n\ns1 = scatter(x=f, y=abs.(M.xy), name=\"|Mxy|\") # hide\ndat = seq.RF.A[1] # hide\nN = length(dat) # hide\ndat_pad = [zeros(floor(Int64,N)); dat; zeros(floor(Int64,N))] # hide\nN_pad = length(dat_pad) # hide\nU = 1 / (Trf) * N / N_pad #hide\nu = range(0, (N_pad - 1) * U; step=U) # hide\nu = u .- maximum(u) / 2 .- U/2 # hide\nFT_dat_pad = abs.(KomaMRI.fftc(dat_pad; dims=1)) # hide\nscale_factor = maximum(abs.(M.xy)) / maximum(FT_dat_pad) # hide\ns2 = scatter(x=u, y=FT_dat_pad*scale_factor, name=\"|FT(B₁(t))|\", line=attr(dash=\"dash\")) # hide\npa = plot([s1,s2], Layout(title=\"120 deg SINC pulse (TBP=8, Hamming)\", xaxis_title=\"Frequency [Hz]\", xaxis_range=[-fmax,fmax])) # hide\nsavefig(pa, \"../assets/4a-profile.html\") # hide","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":" ","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"For this case, the small tip angle approximation breaks 😢, thus, the reason for its name!","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"This basic sinc pulse is not designed to be B_1-insensitive. Some adiabatic RF pulses have been proposed to achieve this. Watch out for a future example showing these adiabatic RF pulses 👀.","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"","category":"page"},{"location":"tutorial/02-SmallTipApproximation/","page":"Small Tip Angle Approximation","title":"Small Tip Angle Approximation","text":"This page was generated using Literate.jl.","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"EditURL = \"lit-05-SimpleMotion.jl\"","category":"page"},{"location":"tutorial/05-SimpleMotion/#Patient's-Motion-During-Acquisition","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"","category":"section"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"using KomaMRI # hide\nusing PlotlyJS # hide\nsys = Scanner() # hide","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"It can also be interesting to see the effect of the patient's motion during an MRI scan. For this, Koma provides the ability to add motion <: AbstractMotion to the phantom. In this tutorial, we will show how to add a Translate motion to a 2D brain phantom.","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"First, let's load the 2D brain phantom used in the previous tutorials:","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"obj = brain_phantom2D()\nobj.Δw .= 0 # hide","category":"page"},{"location":"tutorial/05-SimpleMotion/#Head-Translation","page":"Patient's Motion During Acquisition","title":"Head Translation","text":"","category":"section"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"In this example, we will add a Translate of 2 cm in x, with duration of 200 ms (v = 0.1 m/s):","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"obj.motion = MotionList(\n Translate(2e-2, 0.0, 0.0, TimeRange(t_start=0.0, t_end=200e-3))\n)\np1 = plot_phantom_map(obj, :T2 ; height=450, time_samples=4) # hide\n\nsavefig(p1, \"../assets/5-phantom1.html\") # hide","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":" ","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"# Read Sequence # hide\nseq_file1 = joinpath(dirname(pathof(KomaMRI)), \"../examples/5.koma_paper/comparison_accuracy/sequences/EPI/epi_100x100_TE100_FOV230.seq\") # hide\nseq1 = read_seq(seq_file1) # hide\n\n# Simulate # hide\nraw1 = simulate(obj, seq1, sys) # hide\n\n# Recon # hide\nacq1 = AcquisitionData(raw1) # hide\nacq1.traj[1].circular = false # hide\nNx, Ny = raw1.params[\"reconSize\"][1:2] # hide\nreconParams = Dict{Symbol,Any}(:reco=>\"direct\", :reconSize=>(Nx, Ny)) # hide\nimage1 = reconstruction(acq1, reconParams) # hide","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"If we simulate an EPI sequence with acquisition duration (183.989 ms) comparable with the motion's duration (200 ms), we will observe motion-induced artifacts in the reconstructed image.","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"# Plotting the recon # hide\np2 = plot_image(abs.(image1[:, :, 1]); height=400) # hide\nsavefig(p2, \"../assets/5-recon1.html\") # hide","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"\n \n ","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"The severity of the artifacts can vary depending on the acquisition duration and k-space trajectory.","category":"page"},{"location":"tutorial/05-SimpleMotion/#Motion-Corrected-Reconstruction","page":"Patient's Motion During Acquisition","title":"Motion-Corrected Reconstruction","text":"","category":"section"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"To correct for the motion-induced artifacts we can perform a motion-corrected reconstruction. This can be achieved by multiplying each sample of the acquired signal S(t) by a phase shift Deltaphi_mathrmcorr proportional to the displacement boldsymbolu(t) [Godenschweger, 2016]:","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"S_mathrmMCleft(tright)=Sleft(tright)cdotmathrme^mathrmiDeltaphi_mathrmcorr=Sleft(tright)cdotmathrme^mathrmi2piboldsymbolkleft(tright)cdotboldsymboluleft(tright)","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"In practice, we would need to estimate or measure the motion before performing a motion-corrected reconstruction, but for this example, we will directly use the displacement functions boldsymbolu(boldsymbolx t) defined by obj.motion::MotionList. Since translations are rigid motions (boldsymbolu(boldsymbolx t)=boldsymbolu(t) no position dependence), we can obtain the required displacements by calculating boldsymbolu(boldsymbolx=boldsymbol0 t=t_mathrmadc).","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"sample_times = get_adc_sampling_times(seq1)\ndisplacements = hcat(get_spin_coords(obj.motion, [0.0], [0.0], [0.0], sample_times)...)\n\np3 = plot( # hide\n sample_times, # hide\n displacements .* 1e2, # hide\n Layout( # hide\n title = \"Head displacement in x, y and z\", # hide\n xaxis_title = \"time (s)\", # hide\n yaxis_title = \"Displacement (cm)\" # hide\n )) # hide\nrestyle!(p3,1:3, name=[\"ux(t)\", \"uy(t)\", \"uz(t)\"]) # hide\n\nsavefig(p3, \"../assets/5-displacements.html\") # hide","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":" ","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"We can now get the necessary phase shift for each sample:","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"_, kspace = get_kspace(seq1)\nΔΦ = 2π*sum(kspace .* displacements, dims=2)","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"And apply it to the acquired signal to correct its phase:","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"acq1.kdata[1] .*= exp.(im*ΔΦ)\n\nimage2 = reconstruction(acq1, reconParams) # hide\n\np4 = plot_image(abs.(image2[:, :, 1]); height=400) # hide\n\nsavefig(p4, \"../assets/5-recon2.html\") # hide","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"Finally, we compare the original image ▶️ and the motion-corrected reconstruction ⏸️:","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":" ","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"","category":"page"},{"location":"tutorial/05-SimpleMotion/","page":"Patient's Motion During Acquisition","title":"Patient's Motion During Acquisition","text":"This page was generated using Literate.jl.","category":"page"},{"location":"reference/6-koma-mri/#KomaMRI","page":"KomaMRI","title":"KomaMRI","text":"","category":"section"},{"location":"reference/6-koma-mri/","page":"KomaMRI","title":"KomaMRI","text":"CurrentModule = KomaMRI","category":"page"},{"location":"reference/6-koma-mri/#User-Interface","page":"KomaMRI","title":"User Interface","text":"","category":"section"},{"location":"reference/6-koma-mri/","page":"KomaMRI","title":"KomaMRI","text":"KomaUI","category":"page"},{"location":"reference/6-koma-mri/#KomaMRI.KomaUI","page":"KomaMRI","title":"KomaMRI.KomaUI","text":"out = KomaUI(; kwargs...)\n\nLaunch the Koma's UI.\n\nKeywords\n\ndarkmode: (::Bool, =true) define dark mode style for the UI\nframe: (::Bool, =true) display the upper frame of the Blink window\nphantom_mode: (::String, =\"2D\", opts=[\"2D\", \"3D\"]) load the default phantom as a 2D or 3D brain example\nsim: (::Dict{String,Any}, =Dict{String,Any}()) simulation parameters dictionary\nrec: (::Dict{Symbol,Any}, =Dict{Symbol,Any}()) reconstruction parameters dictionary\nreturn_window: (::Bool, =false) make the out be either 'nothing' or the Blink window, depending on whether the return_window keyword argument is set to true\nshow_window: (::Bool, =true) display the Blink window\n\nReturns\n\nout: (::Nothing or ::Blink.AtomShell.Window) returns either 'nothing' or the Blink window, depending on whether the return_window keyword argument is set to true.\n\nExamples\n\njulia> KomaUI()\n\n\n\n\n\n","category":"function"},{"location":"explanation/4-gpu-explanation/#GPU-Parallelization","page":"GPU Parallelization","title":"GPU Parallelization","text":"","category":"section"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"KomaMRI uses a vendor agnostic approach to GPU parallelization in order to support multiple GPU backends. Currently, the following backends are supported:","category":"page"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"CUDA.jl (Nvidia)\nMetal.jl (Apple)\nAMDGPU.jl (AMD)\noneAPI.jl (Intel)","category":"page"},{"location":"explanation/4-gpu-explanation/#Choosing-a-GPU-Backend","page":"GPU Parallelization","title":"Choosing a GPU Backend","text":"","category":"section"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"To determine which backend to use, KomaMRI uses package extensions (introduced in Julia 1.9) to avoid having the packages for each GPU backend as explicit dependencies. This means that the user is responsible for loading the backend package (e.g. using CUDA) at the beginning of their code, or prior to calling KomaUI(), otherwise, Koma will default back to the CPU:","category":"page"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"using KomaMRI\nusing CUDA # loading CUDA will load KomaMRICoreCUDAExt, selecting the backend","category":"page"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"Once this is done, no further action is needed! The simulation objects will automatically be moved to the GPU and back once the simulation is finished. When the simulation is run a message will be shown with either the GPU device being used or the number of CPU threads if running on the CPU.","category":"page"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"Of course, it is still possible to move objects to the GPU manually, and control precision using the f32 and f64 functions:","category":"page"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"x = rand(100)\nx |> f32 |> gpu # Float32 CuArray","category":"page"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"To change the precision level used for the entire simulation, the sim_params[\"precision\"] parameter can be set to either f32 or f64 (Note that for most GPUs, Float32 operations are considerably faster compared with Float64). In addition, the sim_params[\"gpu\"] option can be set to true or false to enable / disable the gpu functionality (if set to true, the backend package will still need to be loaded beforehand):","category":"page"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"using KomaMRI\nusing CUDA\nsys = Scanner\nobj = brain_phantom2D()\nseq = PulseDesigner.EPI_example()\n\n#Simulate on the GPU using 32-bit floating point values\nsim_params = Dict{String,Any}(\n \"Nblocks\" => 20,\n \"gpu\" => true,\n \"precision\" => \"f32\"\n \"sim_method\" => Bloch(),\n)\nsimulate(obj, seq, sys; sim_params)","category":"page"},{"location":"explanation/4-gpu-explanation/#How-Objects-are-moved-to-the-GPU","page":"GPU Parallelization","title":"How Objects are moved to the GPU","text":"","category":"section"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"Koma's gpu function implementation calls a separate gpu function with a backend parameter of type <:KernelAbstractions.GPU for the backend it is using. This function then calls the fmap function from package Functors.jl to recursively call adapt from package Adapt.jl on each field of the object being transferred. This is similar to how many other Julia packages, such as Flux.jl, transfer data to the GPU. However, an important difference is that KomaMRI adapts directly to the KernelAbstractions.Backend type in order to use the adapt_storage functions defined in each backend package, rather than defining custom adapters, resulting in an implementation with fewer lines of code.","category":"page"},{"location":"explanation/4-gpu-explanation/#Inside-the-Simulation","page":"GPU Parallelization","title":"Inside the Simulation","text":"","category":"section"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"KomaMRI has three different simulation methods, all of which can run on the GPU: ","category":"page"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"BlochSimple: BlochSimple.jl\nBlochDict: BlochDict.jl\nBloch: BlochCPU.jl / BlochGPU.jl","category":"page"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"BlochSimple is the simplest method and prioritizes readability. ","category":"page"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"BlochDict can be understood as an extension to BlochSimple that outputs a more detailed signal.","category":"page"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"Bloch is equivalent to BlochSimple in the operations it performs, but is much faster since it has been optimized both for the CPU and GPU. The CPU implementation prioritizes conserving memory, and makes extensive use of pre-allocation for the simulation arrays. Unlike the GPU implementation, it does not allocate a matrix of size Number of Spins x Number of Time Points in each block, instead using a for loop to step through time.","category":"page"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"In contrast, the GPU implementation divides work among as many threads as possible at the beginning of the run_spin_precession! and run_spin_excitation! functions. For the CPU implementation, this would not be beneficial since there are far less CPU threads available compared with the GPU. Preallocation is also used via the same prealloc function used in BlochCPU.jl, where a struct of arrays is allocated at the beginning of the simulation that can be re-used in each simulation block. In addition, a precalc function is called before moving the simulation objects to the GPU to do certain calculations that are faster on the CPU beforehand.","category":"page"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"Compared with BlochSimple, which only uses array broadcasting for parallelization, Bloch also uses kernel-based methods in its run_spin_excitation! function for operations which need to be done sequentially. The kernel implementation uses shared memory to store the necessary arrays for applying the spin excitation for fast memory access, and separates the complex arrays into real and imaginary components to avoid bank conflicts.","category":"page"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"The performance differences between Bloch and BlochSimple can be seen on the KomaMRI benchmarks page. The first data point is from when Bloch was what is now BlochSimple, before a more optimized implementation was created. The following three pull requests are primarily responsible for the performance differences between Bloch and BlochSimple:","category":"page"},{"location":"explanation/4-gpu-explanation/","page":"GPU Parallelization","title":"GPU Parallelization","text":"(443) Optimize runspinprecession! and runspinexcitation! for CPU\n(459) Optimize runspinprecession! for GPU\n(462) Optimize runspinexcitation! for GPU","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"EditURL = \"lit-03-ChemicalShiftEPI.jl\"","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/#Chemical-Shift-in-an-EPI-sequence","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"","category":"section"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"using KomaMRI # hide\nsys = Scanner() # hide","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"For a more realistic example, we will use a brain phantom.","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"obj = brain_phantom2D() # a slice of a brain\np1 = plot_phantom_map(obj, :T2 ; height=400, width=400, view_2d=true)\np2 = plot_phantom_map(obj, :Δw ; height=400, width=400, view_2d=true)\nsavefig(p1, \"../assets/2-phantom1.html\") # hide\nsavefig(p2, \"../assets/2-phantom2.html\") # hide","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"At the left, you can see the T_2 map of the phantom, and at the right, the off-resonance Deltaomega. In this example, the fat is the only source of off-resonance (with Delta f = -220mathrmHz) and you can see it in black in the off-resonance map.","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":" ","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"Then, we will load an EPI sequence, that is well known for being affected by off-resonance. With this sequence, we will be able visualize the effect of the chemical shift.","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"seq_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/5.koma_paper/comparison_accuracy/sequences/EPI/epi_100x100_TE100_FOV230.seq\")\nseq = read_seq(seq_file)\np3 = plot_seq(seq; range=[0 40], slider=true, height=300)\nsavefig(p3, \"../assets/2-seq.html\") # hide","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"Feel free to explore the sequence's plot 🔍 below!","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":" ","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"If we simulate this sequence we will end up with the following signal.","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"raw = simulate(obj, seq, sys)\np4 = plot_signal(raw; range=[98.4 103.4] , height=300)\nsavefig(p4, \"../assets/2-signal.html\") # hide","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":" ","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"Now, we need to inspect what effect the off-resonance had in the reconstructed image. As you can see, the fat layer is now shifted to a different position 🤯, this is why the effect is called chemical shift!","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"# Get the acquisition data\nacq = AcquisitionData(raw)\nacq.traj[1].circular = false #This is to remove the circular mask\n\n# Setting up the reconstruction parameters\nNx, Ny = raw.params[\"reconSize\"][1:2]\nreconParams = Dict{Symbol,Any}(:reco=>\"direct\", :reconSize=>(Nx, Ny))\nimage = reconstruction(acq, reconParams)\n\n# Plotting the recon\nslice_abs = abs.(image[:, :, 1])\np5 = plot_image(slice_abs; height=400)\nsavefig(p5, \"../assets/2-recon.html\") # hide","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":" ","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"","category":"page"},{"location":"tutorial/03-ChemicalShiftEPI/","page":"Chemical Shift in an EPI sequence","title":"Chemical Shift in an EPI sequence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"how-to/1-getting-started/#Getting-Started","page":"🏃 Getting Started","title":"Getting Started","text":"","category":"section"},{"location":"how-to/1-getting-started/#Installing-Julia","page":"🏃 Getting Started","title":"Installing Julia","text":"","category":"section"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"KomaMRI was written in Julia, so the first thing you should do is to install it! The latest version of Julia can be downloaded at the Julia Downloads page. It is advisable you add julia to the PATH, which can be done during the installation process.","category":"page"},{"location":"how-to/1-getting-started/#Installing-KomaMRI","page":"🏃 Getting Started","title":"Installing KomaMRI","text":"","category":"section"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"Once Julia is installed, open the Julia REPL, and add the KomaMRI package by typing the following commands:","category":"page"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"Press the ] key and then press enter to bring up Julia's package manager.\nType add KomaMRI and then press enter in the package manager session.","category":"page"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"This process should take about 5 minutes in a fresh Julia installation. Here is how it looks in the Julia REPL:","category":"page"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"julia> ]\n\n(@v1.9) pkg> add KomaMRI","category":"page"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"Then press Ctrl+C or backspace to return to the julia> prompt.","category":"page"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"","category":"page"},{"location":"how-to/1-getting-started/#My-First-MRI-Simulation","page":"🏃 Getting Started","title":"My First MRI Simulation","text":"","category":"section"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"For our first simulation we will use KomaMRI's graphical user interface (GUI). For this, you will first need to load KomaMRI by typing using KomaMRI, and then launch the GUI with the KomaUI function. Note that if you want to run simulations on the GPU (for example, using CUDA), then using CUDA is also necessary (see GPU Parallelization). ","category":"page"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"julia> using KomaMRI, CUDA\n\njulia> KomaUI()","category":"page"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"The first time you use this command it may take more time than usual, but a window with the Koma GUI will pop up:","category":"page"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"(Image: )","category":"page"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"The user interface has some basic definitions for the scanner, phantom, and sequence already preloaded. So you can immediately interact with the simulation and reconstruction processes, and then visualize the results.","category":"page"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"As a simple demonstration, press the Simulate! button and wait until the simulation is ready. Now you have acquired the Raw Signal and you should see the following:","category":"page"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"(Image: )","category":"page"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"Then, press the Reconstruct! button and wait until the reconstruction ends. Now you have reconstructed an Image from the Raw Signal and you should see the following in the GUI:","category":"page"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"(Image: )","category":"page"},{"location":"how-to/1-getting-started/","page":"🏃 Getting Started","title":"🏃 Getting Started","text":"Congratulations, you successfully simulated an MRI acquisition! 🎊","category":"page"},{"location":"explanation/2-seq-events/#Sequence-Events","page":"Sequence Events","title":"Sequence Events","text":"","category":"section"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"As we already know, a Sequence struct contains field names that store arrays of RF, Grad, and ADC structs. In the context of MRI, we refer to RF, Grad, and ADC as \"events.\" To create a Sequence, it's essential to understand how to create these fundamental events.","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"In the following subsections, we will provide detailed explanations of event parameters and guide you through the process of creating a Sequence using RF, Grad, and ADC events.","category":"page"},{"location":"explanation/2-seq-events/#RF","page":"Sequence Events","title":"RF","text":"","category":"section"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"The RF struct is defined in the source code of KomaMRI as follows:","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"mutable struct RF\n A\n T\n Δf\n delay::Real\nend","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"As you can see, it has 4 field names: ''A'' defines amplitude, ''T'' defines duration time, ''delay'' is the distance between the 0 time and the first waveform sample and ''Δf'' is the displacement respect to the main field carrier frequency (this is for advanced users).","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"''A'' and ''T'' can be numbers or vectors of numbers. Depending on the length of the ''A'' and ''T'', KomaMRI interprets different waveforms: ","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"Pulse Waveform: A and T are numbers\nUniformly-Sampled Waveform: A is a vector and T is a number\nTime-Shaped Waveform: A and T are both vectors with the same length (zero-order-hold)","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"In the image below, we provide a summary of how you can define RF events:","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"
","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"Let's look at some basic examples of creating these RF structs and including them in a Sequence struct. The examples should be self-explanatory.","category":"page"},{"location":"explanation/2-seq-events/#RF-Pulse-Waveform","page":"Sequence Events","title":"RF Pulse Waveform","text":"","category":"section"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"julia> A, T, delay = 10e-3, 0.5e-3, 0.1e-3;\n\njulia> rf = RF(A, T, 0, delay)\n←0.1 ms→ RF(10000.0 uT, 0.5 ms, 0.0 Hz)\n\njulia> seq = Sequence(); seq += rf\nSequence[ τ = 0.6 ms | blocks: 1 | ADC: 0 | GR: 0 | RF: 1 | DEF: 0 ]\n\njulia> plot_seq(seq; slider=false)","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":" ","category":"page"},{"location":"explanation/2-seq-events/#RF-Uniformly-Sampled-Waveform","page":"Sequence Events","title":"RF Uniformly-Sampled Waveform","text":"","category":"section"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"julia> tl = -3:0.2:-0.2; tr = 0.2:0.2:3;\n\njulia> A = (10e-3)*[sin.(π*tl)./(π*tl); 1; sin.(π*tr)./(π*tr)];\n\njulia> T, delay = 0.5e-3, 0.1e-3;\n\njulia> rf = RF(A, T, 0, delay)\n←0.1 ms→ RF(∿ uT, 0.5 ms, 0.0 Hz)\n\njulia> seq = Sequence(); seq += rf\nSequence[ τ = 0.6 ms | blocks: 1 | ADC: 0 | GR: 0 | RF: 1 | DEF: 0 ]\n\njulia> plot_seq(seq; slider=false)","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":" ","category":"page"},{"location":"explanation/2-seq-events/#RF-Time-Shaped-Waveform","page":"Sequence Events","title":"RF Time-Shaped Waveform","text":"","category":"section"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"julia> tl = -4:0.2:-0.2; tr = 0.2:0.2:4\n\njulia> A = (10e-3)*[sin.(π*tl)./(π*tl); 1; 1; sin.(π*tr)./(π*tr)]\n\njulia> T = [0.05e-3*ones(length(tl)); 2e-3; 0.05e-3*ones(length(tl))]\n\njulia> delay = 0.1e-3;\n\njulia> rf = RF(A, T, 0, delay)\n←0.1 ms→ RF(∿ uT, 4.0 ms, 0.0 Hz)\n\njulia> seq = Sequence(); seq += rf\nSequence[ τ = 4.1 ms | blocks: 1 | ADC: 0 | GR: 0 | RF: 1 | DEF: 0 ]\n\njulia> plot_seq(seq; slider=false)","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":" ","category":"page"},{"location":"explanation/2-seq-events/#Gradient","page":"Sequence Events","title":"Gradient","text":"","category":"section"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"The Grad struct is defined as follows in the source code of KomaMRI:","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"mutable struct Grad\n A\n T\n rise::Real\n fall::Real\n delay::Real\nend","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"As you can see, it has 5 field names: ''A'' defines amplitude, ''T'' defines duration time, ''delay'' is the distance between the 0 time and the first waveform sample, ''rise'' and ''fall'' are the time durations of the first and last gradient ramps.","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"Just like the RF, ''A'' and ''T'' in the Grad struct can be numbers or vectors of numbers. Depending on the length of the ''A'' and ''T'', KomaMRI interprets different waveforms: ","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"Trapezoidal Waveform: A and T are numbers\nUniformly-Sampled Waveform: A is a vector and T is a number\nTime-Shaped Waveform: A and T are both vectors, A has one sample more the T (linear interpolation)","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"In the image below, we provide a summary of how you can define Grad events:","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"
","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"Let's look at some basic examples of creating these Grad structs and including them in a Sequence struct, focusing on the ''x'' component of the gradients. The examples should be self-explanatory.","category":"page"},{"location":"explanation/2-seq-events/#Gradient-Trapezoidal-Waveform","page":"Sequence Events","title":"Gradient Trapezoidal Waveform","text":"","category":"section"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"julia> A, T, delay, rise, fall = 50*10e-6, 5e-3, 2e-3, 1e-3, 1e-3;\n\njulia> gr = Grad(A, T, rise, fall, delay)\n←2.0 ms→ Grad(0.5 mT, 0.5 ms, ↑1.0 ms, ↓1.0 ms)\n\njulia> seq = Sequence([gr])\nSequence[ τ = 9.0 ms | blocks: 1 | ADC: 0 | GR: 1 | RF: 0 | DEF: 0 ]\n\njulia> plot_seq(seq; slider=false)","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":" ","category":"page"},{"location":"explanation/2-seq-events/#Gradient-Uniformly-Sampled-Waveform","page":"Sequence Events","title":"Gradient Uniformly-Sampled Waveform","text":"","category":"section"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"julia> t = 0:0.25:7.5\n\njulia> A = 10*10e-6 * sqrt.(π*t) .* sin.(π*t)\n\njulia> T = 10e-3;\n\njulia> delay, rise, fall = 1e-3, 0, 1e-3;\n\njulia> gr = Grad(A, T, rise, fall, delay)\n←1.0 ms→ Grad(∿ mT, 10.0 ms, ↑0.0 ms, ↓1.0 ms)\n\njulia> seq = Sequence([gr])\nSequence[ τ = 12.0 ms | blocks: 1 | ADC: 0 | GR: 1 | RF: 0 | DEF: 0 ]\n\njulia> plot_seq(seq; slider=false)","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":" ","category":"page"},{"location":"explanation/2-seq-events/#Gradient-Time-Shaped-Waveform","page":"Sequence Events","title":"Gradient Time-Shaped Waveform","text":"","category":"section"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"julia> A = 50*10e-6*[1; 1; 0.8; 0.8; 1; 1];\n\njulia> T = 1e-3*[5; 0.2; 5; 0.2; 5];\n\njulia> delay, rise, fall = 1e-3, 1e-3, 1e-3;\n\njulia> gr = Grad(A, T, rise, fall, delay)\n←1.0 ms→ Grad(∿ mT, 15.4 ms, ↑1.0 ms, ↓1.0 ms)\n\njulia> seq = Sequence([gr])\nSequence[ τ = 10.75 ms | blocks: 1 | ADC: 0 | GR: 1 | RF: 0 | DEF: 0 ]\n\njulia> plot_seq(seq; slider=false)","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":" ","category":"page"},{"location":"explanation/2-seq-events/#ADC","page":"Sequence Events","title":"ADC","text":"","category":"section"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"The ADC struct is defined in the KomaMRI source code as follows:","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"mutable struct ADC\n N::Integer\n T::Real\n delay::Real\n Δf::Real\n ϕ::Real\nend","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"As you can see, it has 5 field names: ''N'' defines number of samples, ''T'' defines total acquisition duration, ''delay'' is the distance between the 0 time and the first sampled signal, ''Δf'' and ''ϕ' are factor to correct signal acquisition (for advanced users).","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"In the image below you can see how to define an ADC event:","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"
","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"Let's look at a basic example of defining an ADC struct and including it in a Sequence struct:","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"julia> N, T, delay = 16, 5e-3, 1e-3;\n\njulia> adc = ADC(N, T, delay)\nADC(16, 0.005, 0.001, 0.0, 0.0)\n\njulia> seq = Sequence(); seq += adc\nSequence[ τ = 6.0 ms | blocks: 1 | ADC: 1 | GR: 0 | RF: 0 | DEF: 0 ]\n\njulia> plot_seq(seq; slider=false)","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":" ","category":"page"},{"location":"explanation/2-seq-events/#Combination-of-Events","page":"Sequence Events","title":"Combination of Events","text":"","category":"section"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"We can include multiple events within a single block of a sequence. The example below demonstrates how to combine an RF struct, three Grad structs for the x-y-z components, and an ADC struct in a single block of a sequence:","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"# Define an RF struct\nA, T = 1e-6*[0; -0.1; 0.2; -0.5; 1; -0.5; 0.2; -0.1; 0], 0.5e-3;\nrf = RF(A, T)\n\n# Define a Grad struct for Gx\nA, T, rise = 50*10e-6, 5e-3, 1e-3\ngx = Grad(A, T, rise)\n\n# Define a Grad struct for Gy\nA = 50*10e-6*[0; 0.5; 0.9; 1; 0.9; 0.5; 0; -0.5; -0.9; -1]\nT, rise = 5e-3, 2e-3;\ngy = Grad(A, T, rise)\n\n# Define a Grad struct for Gz\nA = 50*10e-6*[0; 0.5; 0.9; 1; 0.9; 0.5; 0; -0.5; -0.9; -1]\nT = 5e-3*[0.0; 0.1; 0.3; 0.2; 0.1; 0.2; 0.3; 0.2; 0.1]\ngz = Grad(A, T)\n\n# Define an ADC struct\nN, T, delay = 16, 5e-3, 1e-3\nadc = ADC(N, T, delay)","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"julia> seq = Sequence([gx; gy; gz;;], [rf;;], [adc])\nSequence[ τ = 9.0 ms | blocks: 1 | ADC: 1 | GR: 3 | RF: 1 | DEF: 0 ]\n\njulia> plot_seq(seq; slider=false)","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":" ","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"Once the struct events are defined, it's important to note that to create a single block sequence, you need to provide 2D matrices of Grad and RF structs, as well as a vector of ADC structs as arguments in the Sequence constructor.","category":"page"},{"location":"explanation/2-seq-events/#Algebraic-manipulation","page":"Sequence Events","title":"Algebraic manipulation","text":"","category":"section"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"Certain mathematical operations can be directly applied to events and sequence structs. This proves helpful when constructing sequences using reference structs and manipulating them algebraically to create new structs. Below, we provide a list of operations you can perform, along with examples where we check the equivalence of two different struct definitions:","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"RF scaling","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"# Define params\nA, T = 10e-6, 0.5e-3 # Define base RF params \nα = (1 + im*1)/sqrt(2) # Define a complex scaling factor\n\n# Create two equivalent RFs in different ways\nra = RF(α * A, T)\nrb = α * RF(A, T)","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"julia> ra ≈ rb\ntrue","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"Gradient scaling","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"# Define params\nA, T = 10e-3, 0.5e-3 # Define base gradient params \nα = 2 # Define a scaling factor\n\n# Create two equivalent gradients in different ways\nga = Grad(α * A, T)\ngb = α * Grad(A, T)","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"julia> ga ≈ gb\ntrue","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"Gradient addition","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"# Define params\nT = 0.5e-3 # Define common duration of the gradients\nA1 = 5e-3 # Define base amplitude for gradient \nA2 = 10e-3 # Define another base amplitude for gradient \n\n# Create two equivalent gradients in different ways\nga = Grad(A1 + A2, T)\ngb = Grad(A1, T) + Grad(A2, T)","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"julia> ga ≈ gb\ntrue","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"Gradient array multiplication by a matrix","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"# Define params\nT = 0.5e-3 # Define common duration of the gradients\nAx, Ay, Az = 10e-3, 20e-3, 5e-3 # Define base amplitude for gradients \ngx, gy, gz = Grad(Ax, T), Grad(Ay, T), Grad(Az, T) # Define gradients\nR = [0 1. 0; 0 0 1.; 1. 0 0] # Define matrix (a rotation matrix in this example)\n\n# Create two equivalent gradient vectors in different ways\nga = [gy; gz; gx]\ngb = R * [gx; gy; gz]\n\n# Create two equivalent gradient matrices in different ways\ngc = [gy 2*gy; gz 2*gz; gx 2*gx]\ngd = R * [gx 2*gx; gy 2*gy; gz 2*gz]","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"julia> all(ga .≈ gb)\ntrue\n\njulia> all(gc .≈ gd)\ntrue","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"Sequence rotation","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"# Define params\nT = 0.5e-3 # Define common duration of the gradients\nAx, Ay, Az = 10e-3, 20e-3, 5e-3 # Define base amplitude for gradients \ngx, gy, gz = Grad(Ax, T), Grad(Ay, T), Grad(Az, T) # Define gradients\nR = [0 1. 0; 0 0 1.; 1. 0 0] # Define matrix (a rotation matrix in this example)\n\n# Create two equivalent sequences in different ways\nsa = Sequence(R * [gx; gy; gz;;])\nsb = R * Sequence([gx; gy; gz;;])","category":"page"},{"location":"explanation/2-seq-events/","page":"Sequence Events","title":"Sequence Events","text":"julia> all(sa.GR .≈ sb.GR)\ntrue","category":"page"},{"location":"tutorial-pluto/02-low-field-cmra-optimization/#Low-Field-CMRA-Optimization","page":"Low-Field CMRA Optimization","title":"Low-Field CMRA Optimization","text":"","category":"section"},{"location":"tutorial-pluto/02-low-field-cmra-optimization/","page":"Low-Field CMRA Optimization","title":"Low-Field CMRA Optimization","text":"(Image: ) (Image: )","category":"page"},{"location":"tutorial-pluto/02-low-field-cmra-optimization/","page":"Low-Field CMRA Optimization","title":"Low-Field CMRA Optimization","text":"","category":"page"},{"location":"tutorial/README/","page":"-","title":"-","text":"This folder is intentionally left empty. It will be filled by docs/make.jl in the gh-pages branch. ","category":"page"},{"location":"tutorial/README/","page":"-","title":"-","text":"Files matching the lit-*.jl pattern anywhere in examples/3.tutorials will be included.","category":"page"},{"location":"tutorial/README/","page":"-","title":"-","text":"All files included in this folder will be ignored.","category":"page"},{"location":"how-to/2-1-use-koma-ui/#Use-Koma's-User-Interface","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"","category":"section"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"This section provides a comprehensive guide on using the User Interface of the KomaMRI package and delves into the internal processes that occur during interaction. By the end of this section, you will be equipped to execute a complete workflow even without any prior programming experience.","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/#Basic-Workflow","page":"Use Koma's User Interface","title":"Basic Workflow","text":"","category":"section"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"(You can also go to analog steps using Scripts)","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"As a general overview, remember the following workflow steps when using KomaMRI:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"Loading Simulation Inputs: Scanner, Phantom, Sequence\nRunning Simulation\nReconstructing Image using MRIReco","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"In the following subsections, we will cover all the mentioned steps. First, open the Julia REPL and enter the following commands to include the KomaMRI package and launch the user interface:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"julia> using KomaMRI\n\njulia> KomaUI()","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/#Loading-Simulation-Inputs","page":"Use Koma's User Interface","title":"Loading Simulation Inputs","text":"","category":"section"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"(You can also go to analog steps using Scripts)","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"The user interface has preloaded certain inputs into RAM, including the Scanner, Phantom, and Sequence structs. In the following subsections, we will demonstrate how to visualize these inputs.","category":"page"},{"location":"how-to/2-1-use-koma-ui/#Scanner","page":"Use Koma's User Interface","title":"Scanner","text":"","category":"section"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"You can visualize the preloaded Scanner struct by clicking on the Scanner dropdown and then pressing the View Scanner button. The Scanner struct contains hardware-related information, such as the main magnetic field's magnitude:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/#Phantom","page":"Use Koma's User Interface","title":"Phantom","text":"","category":"section"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"To see the phantom already stored in RAM, simply click on the Phantom dropdown an then press the View Phantom button. The preloaded phantom is a slice of a brain:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"It is also possible to load .h5 phantom files. The KomaMRI.jl has some examples stored at ~/.julia/packages/KomaMRI//examples/2.phantoms/. For instance, let's load the sphere_chemical_shift.h5 file:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"Note that you can select different spin parameters to visualize like ρ, T1, T2, among others. ","category":"page"},{"location":"how-to/2-1-use-koma-ui/#Sequence","page":"Use Koma's User Interface","title":"Sequence","text":"","category":"section"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"There are two options to visualize the sequence already preloaded in RAM: in the time domain or in the k-space. The preloaded sequence is a single-shot EPI.","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"For visualization of the sequence in the time domain, click on the Sequence dropdown and then press the Sequence (MPS) button:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"For visualization of the sequence in the k-space, click on the Sequence dropdown and then press the k-space button:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"You can also display the Moments related to the Sequence by pressing the View Moments and then pressing the buttons for zero, first and second moments.","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"It is also possible to load Pulseq compatible .seq sequence files. The KomaMRI has some examples stored at ~/.julia/packages/KomaMRI//examples/1.sequences/. For instance, let's load the spiral.seq file and view it the time domain and k-space:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"And remember, you are free to interact with the plots:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/#Running-Simulation","page":"Use Koma's User Interface","title":"Running Simulation","text":"","category":"section"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"(You can also go to analog steps using Scripts)","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"Once the inputs are loaded in RAM, it is possible to perform the simulation to get the Raw Signal.","category":"page"},{"location":"how-to/2-1-use-koma-ui/#Simulation-Parameters","page":"Use Koma's User Interface","title":"Simulation Parameters","text":"","category":"section"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"To visualize the default simulation parameters, click on the Simulate! dropdown and then press the View Options button:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/#Visualization-of-the-Raw-Signal","page":"Use Koma's User Interface","title":"Visualization of the Raw Signal","text":"","category":"section"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"Press the Simulate! button to perform the simulation (this may take a while). Automatically the generated Raw Signal should be displayed or you can click on the Raw Data dropdown and then press the View Raw Data button:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/#Reconstructing-Image-using-MRIReco","page":"Use Koma's User Interface","title":"Reconstructing Image using MRIReco","text":"","category":"section"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"(You can also go to analog steps using Scripts)","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"Once the Raw Signal is loaded in RAM, it is possible to reconstruct the image.","category":"page"},{"location":"how-to/2-1-use-koma-ui/#Reconstruction-Parameters","page":"Use Koma's User Interface","title":"Reconstruction Parameters","text":"","category":"section"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"To visualize the default reconstruction parameters, click on the Reconstruct! dropdown and then press the View Options button:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/#Visualization-of-the-Image","page":"Use Koma's User Interface","title":"Visualization of the Image","text":"","category":"section"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"Press the Reconstruct! button to perform the reconstruction (this may take a while). Automatically the generated Image should be displayed or you can click on the he Reconstruct! dropdown and then press the |Image| button:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/#Exporting-Results-to-.mat-File","page":"Use Koma's User Interface","title":"Exporting Results to .mat File","text":"","category":"section"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"(You can also go to analog steps using Scripts)","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"The user interface has the option to save the results in .mat format. Simply click on the Export to .mat and you have the alternatives to get data independently or you can press the All button to have all the results given by the simulator:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"So far, and due to limitations of the user interface dependencies, the .mat files are saved in the temporal directory of your computer OS, which can be found by typing the tempdir() command in the Julia REPL:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/#REPL-and-UI-communication","page":"Use Koma's User Interface","title":"REPL and UI communication","text":"","category":"section"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"An amazing feature of KomaMRI is that it allows you to modify certain variables in the Julia REPL, and then the user interface automatically updates its plots in real-time:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"
","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"The variables that update the interface are:","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"seq_ui[] for the Sequence\nobj_ui[] for the Phantom\nsys_ui[] for the Scanner\nraw_ui[] for the Raw Signal\nimg_ui[] for the Image","category":"page"},{"location":"how-to/2-1-use-koma-ui/","page":"Use Koma's User Interface","title":"Use Koma's User Interface","text":"Don't forget to add the brackets [] to these variables, otherwise it won't work.","category":"page"},{"location":"tutorial-pluto/03-low-field-boost-optimization/#Low-Field-CMRA-Optimization","page":"Low-Field CMRA Optimization","title":"Low-Field CMRA Optimization","text":"","category":"section"},{"location":"tutorial-pluto/03-low-field-boost-optimization/","page":"Low-Field CMRA Optimization","title":"Low-Field CMRA Optimization","text":"(Image: ) (Image: )","category":"page"},{"location":"tutorial-pluto/03-low-field-boost-optimization/","page":"Low-Field CMRA Optimization","title":"Low-Field CMRA Optimization","text":"","category":"page"},{"location":"how-to/2-3-use-koma-scripts/#Use-Koma-in-Julia-Scripts","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"","category":"section"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"You should already be familiar with the Graphical User Interface of KomaMRI. However, you can also use this package directly from the Julia REPL or write your own Julia scripts. This allows you to unlock the full potential of KomaMRI, enabling you to utilize more of its functionalities and even test your own MRI ideas.","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"This section demonstrates a basic workflow with KomaMRI through writing your own scripts or entering commands directly into the Julia REPL. Let's begin.","category":"page"},{"location":"how-to/2-3-use-koma-scripts/#Basic-Workflow","page":"Use Koma in Julia Scripts","title":"Basic Workflow","text":"","category":"section"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"(You can also go to analog steps using UI)","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"As a general overview, remember the following workflow steps when using KomaMRI:","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"Loading Simulation Inputs: Scanner, Phantom, Sequence\nRunning Simulation\nReconstructing Image using MRIReco","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"Let's replicate these previous steps in a Julia script. You will obtain the following code, which you can copy and paste into the Julia REPL:","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"# Import the package\nusing KomaMRI\n\n# Define scanner, object and sequence\nsys = Scanner()\nobj = brain_phantom2D()\nseq = PulseDesigner.EPI_example()\n\n# Define simulation parameters and perform simulation\nsim_params = KomaMRICore.default_sim_params() \nraw = simulate(obj, seq, sys; sim_params)\n\n# Auxiliary function for reconstruction\nfunction reconstruct_2d_image(raw::RawAcquisitionData)\n acqData = AcquisitionData(raw)\n acqData.traj[1].circular = false #Removing circular window\n C = maximum(2*abs.(acqData.traj[1].nodes[:])) #Normalize k-space to -.5 to .5 for NUFFT\n acqData.traj[1].nodes = acqData.traj[1].nodes[1:2,:] ./ C\n Nx, Ny = raw.params[\"reconSize\"][1:2]\n recParams = Dict{Symbol,Any}()\n recParams[:reconSize] = (Nx, Ny)\n recParams[:densityWeighting] = true\n rec = reconstruction(acqData, recParams)\n image3d = reshape(rec.data, Nx, Ny, :)\n image2d = (abs.(image3d) * prod(size(image3d)[1:2]))[:,:,1]\n return image2d\nend\n\n# Perform reconstruction to get the image\nimage = reconstruct_2d_image(raw)","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"Let's go through this script step by step.","category":"page"},{"location":"how-to/2-3-use-koma-scripts/#Loading-Simulation-Inputs","page":"Use Koma in Julia Scripts","title":"Loading Simulation Inputs","text":"","category":"section"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"(You can also go to analog steps using UI)","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"The inputs of the simulation are created in the following part of the script: ","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"# Define scanner, object and sequence\nsys = Scanner()\nobj = brain_phantom2D()\nseq = PulseDesigner.EPI_example()","category":"page"},{"location":"how-to/2-3-use-koma-scripts/#Scanner","page":"Use Koma in Julia Scripts","title":"Scanner","text":"","category":"section"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"The previously created Scanner struct contains default parameters. In your initial simulations, you will likely use this default struct without making any modifications. You can view all the parameters by displaying the struct variable in the Julia REPL. The Scanner's parameters include hardware limitations such as the main magnetic field, maximum gradient values, minimum raster times, and more. You may want to adjust these values for your future custom simulations.","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"julia> sys\nScanner\n B0: Float64 1.5\n B1: Float64 1.0e-5\n Gmax: Float64 0.06\n Smax: Int64 500\n ADC_Δt: Float64 2.0e-6\n seq_Δt: Float64 1.0e-5\n GR_Δt: Float64 1.0e-5\n RF_Δt: Float64 1.0e-6\n RF_ring_down_T: Float64 2.0e-5\n RF_dead_time_T: Float64 0.0001\n ADC_dead_time_T: Float64 1.0e-5","category":"page"},{"location":"how-to/2-3-use-koma-scripts/#Phantom","page":"Use Koma in Julia Scripts","title":"Phantom","text":"","category":"section"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"The Phantom struct created in this example represents a slice of a brain. To create it, we use the function brain_phantom2D, which is part of the subdependency KomaMRICore. While KomaMRI provides some phantom examples for experimentation, you may also want to create your custom Phantom struct tailored to your specific requirements.","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"The Phantom struct contains MRI parameters related to the magnetization properties of an object. These parameters include magnetization positions, proton density, relaxation times, off-resonance, among others. To view all the keys and values of the object, you can do so in the Julia REPL as follows:","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"julia> obj\nPhantom{Float64}\n name: String \"brain2D_axial\"\n x: Array{Float64}((6506,)) [-0.084, -0.084, … 0.086, 0.086]\n y: Array{Float64}((6506,)) [-0.03, -0.028, … 0.0, 0.002]\n z: Array{Float64}((6506,)) [-0.0, -0.0, … 0.0, 0.0]\n ρ: Array{Float64}((6506,)) [0.7, 0.7, … 0.7, 0.7]\n T1: Array{Float64}((6506,)) [0.569, 0.569, … 0.569, 0.569]\n T2: Array{Float64}((6506,)) [0.329, 0.329, … 0.329, 0.329]\n T2s: Array{Float64}((6506,)) [0.058, 0.058, … 0.058, 0.058]\n Δw: Array{Float64}((6506,)) [-0.0, -0.0, … -0.0, -0.0]\n Dλ1: Array{Float64}((6506,)) [0.0, 0.0, … 0.0, 0.0]\n Dλ2: Array{Float64}((6506,)) [0.0, 0.0, … 0.0, 0.0]\n Dθ: Array{Float64}((6506,)) [0.0, 0.0, … 0.0, 0.0]\n...","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"As you can see, attributes of the Phantom struct are vectors representing object properties, with each element holding a value associated with a single magnetization.","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"You can also visualize the Phantom struct using the plot_phantom_map function, which is part of the KomaMRIPlots subdependency. This function plots the magnitude of a property for each magnetization at a specific spatial position. You can observe properties such as proton density and relaxation times, so feel free to replace the :ρ symbol with another property of the phantom in the example below:","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"julia> plot_phantom_map(obj, :ρ)","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":" ","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"To utilize test phantoms included with KomaMRI, navigate to the \"examples\" folder and use the read_phantom_jemris function to read a phantom in .h5 format. The following steps outline how to do this in Julia:","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"julia> path_koma = dirname(dirname(pathof(KomaMRI)))\njulia> path_sphere = joinpath(path_koma, \"examples\", \"2.phantoms\", \"sphere_chemical_shift.h5\")\njulia> sphere = read_phantom_jemris(path_sphere)\njulia> plot_phantom_map(sphere, :T2)","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":" ","category":"page"},{"location":"how-to/2-3-use-koma-scripts/#Sequence","page":"Use Koma in Julia Scripts","title":"Sequence","text":"","category":"section"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"The Sequence struct in the example represents one of the most basic MRI sequences. It excites the object with a 90° RF pulse and then uses EPI gradients to fill the k-space in a \"square\" manner. While you may want to create your sequences for experiments, you can always use some of the examples already available in KomaMRI.","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"In MRI, the sequence must be carefully designed with precise timing to obtain an image. It includes subcomponents such as gradients, radio-frequency excitation signals, and sample acquisition. For more information on constructing a Sequence struct, refer to the Sequence section.","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"You can view general information about a Sequence struct by displaying it in the Julia REPL:","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"julia> seq\nSequence[ τ = 62.846 ms | blocks: 204 | ADC: 101 | GR: 205 | RF: 1 | DEF: 5 ]","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"For more precise timing checks, you can use the plot_seq function:","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"julia> plot_seq(seq; range=[0 30])","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":" ","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"It is important to consider how the sequence traverses through k-space. The plot_kspace function does precisely that:","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"julia> plot_kspace(seq)","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":" ","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"Additionally, there are helpful sequence construction functions within a submodule of KomaMRI called PulseDesigner. These functions include PulseDesigner.RF_hard, PulseDesigner.RF_sinc, PulseDesigner.EPI, PulseDesigner.radial_base and PulseDesigner.spiral_base. For more details on how to use them, refer to the API documentation.","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"KomaMRI is also compatible with Pulseq. The package installation includes some .seq files in Pulseq format, which can be read and used as a Sequence struct. Here's how to read a spiral Pulseq file stored in the \"examples\" folder of KomaMRI:","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"julia> path_koma = dirname(dirname(pathof(KomaMRI)))\njulia> path_spiral = joinpath(path_koma, \"examples\", \"1.sequences\", \"spiral.seq\")\njulia> spiral = read_seq(path_spiral)\njulia> plot_seq(spiral)\njulia> plot_kspace(spiral)","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":" ","category":"page"},{"location":"how-to/2-3-use-koma-scripts/#Running-Simulation","page":"Use Koma in Julia Scripts","title":"Running Simulation","text":"","category":"section"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"(You can also go to analog steps using UI)","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"The following lines in the example script configure and perform the simulation:","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"# Define simulation parameters and perform simulation\nsim_params = KomaMRICore.default_sim_params() \nraw = simulate(obj, seq, sys; sim_params)","category":"page"},{"location":"how-to/2-3-use-koma-scripts/#Simulation-Parameters","page":"Use Koma in Julia Scripts","title":"Simulation Parameters","text":"","category":"section"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"To perform simulations, KomaMRI requires certain parameters. You can use the default parameters for testing, but you also have the option to customize specific simulation aspects. In the example, we use the KomaMRICore.default_sim_params function to create a dictionary with default simulation parameters. You can view the keys that can be modified by displaying the sim_params variable:","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"julia> sim_params\nDict{String, Any} with 9 entries:\n \"return_type\" => \"raw\"\n \"Nblocks\" => 20\n \"gpu\" => true\n \"Nthreads\" => 1\n \"gpu_device\" => 0\n \"sim_method\" => Bloch()\n \"precision\" => \"f32\"\n \"Δt\" => 0.001\n \"Δt_rf\" => 5.0e-5","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"All of these parameters deserve special attention. We will explain some of the most important ones here. For instance, \"Δt\" and \"Δt_rf\" represent the raster times for the gradients and RFs. \"return_type\" specifies the type of variable returned by the simulator (by default, it returns an object ready for use with MRIReco for reconstruction, but you can use the value \"mat\" to return a simple vector). \"gpu\" indicates whether you want to use your GPU device for simulations, and \"precision\" sets the floating-point precision. For more details on how to set these parameters, please refer to the Simulation Parameters Section.","category":"page"},{"location":"how-to/2-3-use-koma-scripts/#Raw-Signal","page":"Use Koma in Julia Scripts","title":"Raw Signal","text":"","category":"section"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"The simulation is performed using the simulate function, which requires three arguments: a Scanner struct, a Phantom struct, and a Sequence struct. Optionally, you can include the keyword argument sim_params if you wish to use custom simulation parameters.","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"In the example, we can see that the output of the simulation is a special struct:","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"julia> typeof(raw)\nRawAcquisitionData\n\njulia> raw\nRawAcquisitionData[SeqName: epi | 101 Profile(s) of 101×1]","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"You can plot the simulation result with the plot_signal function like so:","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"julia> plot_signal(raw)","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":" ","category":"page"},{"location":"how-to/2-3-use-koma-scripts/#Reconstructing-Image-using-MRIReco","page":"Use Koma in Julia Scripts","title":"Reconstructing Image using MRIReco","text":"","category":"section"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"(You can also go to analog steps using UI)","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"KomaMRI does not handle reconstruction; instead, you should utilize the MRIReco package to generate an image. For convenience, when you install KomaMRI, you also install MRIReco, allowing you to access functions from that package. You should pay special attention to the RawAcquisitionData and AcquisitionData structs, as well as the reconstruction function.","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"In the example below, we define an auxiliary function, reconstruct_2d_image, which takes a raw signal struct, RawAcquisitionData, as input and returns a 2D Array representing an image. Within this function, we create an AcquisitionData struct and set some reconstruction parameters, which serve as inputs for the reconstruction function. The latter function is responsible for the image generation process.","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"# Auxiliary function for reconstruction\nfunction reconstruct_2d_image(raw::RawAcquisitionData)\n acqData = AcquisitionData(raw)\n acqData.traj[1].circular = false #Removing circular window\n C = maximum(2*abs.(acqData.traj[1].nodes[:])) #Normalize k-space to -.5 to .5 for NUFFT\n acqData.traj[1].nodes = acqData.traj[1].nodes[1:2,:] ./ C\n Nx, Ny = raw.params[\"reconSize\"][1:2]\n recParams = Dict{Symbol,Any}()\n recParams[:reconSize] = (Nx, Ny)\n recParams[:densityWeighting] = true\n rec = reconstruction(acqData, recParams)\n image3d = reshape(rec.data, Nx, Ny, :)\n image2d = (abs.(image3d) * prod(size(image3d)[1:2]))[:,:,1]\n return image2d\nend\n\n# Perform reconstruction to get the image\nimage = reconstruct_2d_image(raw)","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"If you need more information about how to use the AcquisitionData and the how to fill the reconstruction parameters, you need to visit the MRIReco webpage).","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"To display the image, you can use the plot_image function which is part of the KomaMRIPlots subpackage:","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"julia> plot_image(image)","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":" ","category":"page"},{"location":"how-to/2-3-use-koma-scripts/#Exporting-Results-to-.mat-File","page":"Use Koma in Julia Scripts","title":"Exporting Results to .mat File","text":"","category":"section"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"(You can also go to analog steps using UI)","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"Many people in the MRI community uses MATLAB, probably you are one of them and you want to process the raw signal in the MATLAB environment after simulation is done with KomaMRI. Here we show you an example of how to save a .mat file with the information of the raw signal thank to the help of the MAT package:","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"Many people in the MRI community use MATLAB; you might be one of them and may want to process the Raw Signal in the MATLAB environment after simulation is completed with KomaMRI. Here, we provide an example of how to save a .mat file containing the Raw Signal information using the MAT package.","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"# Use the MAT package\nusing MAT\n\n# Perform simulation to return an Array type\nsim_params[\"return_type\"] = \"mat\"\nraw = simulate(obj, seq, sys; sim_params)\n\n# Save the .mat file in the temp directory\nmatwrite(joinpath(tempdir(), \"koma-raw.mat\"), Dict(\"raw\" => raw))","category":"page"},{"location":"how-to/2-3-use-koma-scripts/","page":"Use Koma in Julia Scripts","title":"Use Koma in Julia Scripts","text":"Note that we need to simulate to return an array type (not the default RawAcquisitionData), and then we utilize the matwrite function to save a file named \"koma-raw.mat\" in your computer's temporary directory. Now, you can navigate to your temporary directory (which you can find by displaying the result of tempdir() in the Julia REPL) and locate the \"koma-raw.mat\" file.","category":"page"},{"location":"reference/4-koma-files/#KomaMRIFiles","page":"KomaMRIFiles","title":"KomaMRIFiles","text":"","category":"section"},{"location":"reference/4-koma-files/","page":"KomaMRIFiles","title":"KomaMRIFiles","text":"CurrentModule = KomaMRIFiles","category":"page"},{"location":"reference/4-koma-files/#Sequence","page":"KomaMRIFiles","title":"Sequence","text":"","category":"section"},{"location":"reference/4-koma-files/","page":"KomaMRIFiles","title":"KomaMRIFiles","text":"read_seq","category":"page"},{"location":"reference/4-koma-files/#KomaMRIFiles.read_seq","page":"KomaMRIFiles","title":"KomaMRIFiles.read_seq","text":"seq = read_seq(filename)\n\nReturns the Sequence struct from a Pulseq file with .seq extension.\n\nArguments\n\nfilename: (::String) absolute or relative path of the sequence file .seq\n\nReturns\n\nseq: (::Sequence) Sequence struct\n\nExamples\n\njulia> seq_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/1.sequences/spiral.seq\")\n\njulia> seq = read_seq(seq_file)\n\njulia> plot_seq(seq)\n\n\n\n\n\n","category":"function"},{"location":"reference/4-koma-files/#Phantom","page":"KomaMRIFiles","title":"Phantom","text":"","category":"section"},{"location":"reference/4-koma-files/","page":"KomaMRIFiles","title":"KomaMRIFiles","text":"read_phantom_jemris\nread_phantom_MRiLab\nread_phantom\nwrite_phantom","category":"page"},{"location":"reference/4-koma-files/#KomaMRIFiles.read_phantom_jemris","page":"KomaMRIFiles","title":"KomaMRIFiles.read_phantom_jemris","text":"obj = read_phantom_jemris(filename)\n\nReturns the Phantom struct from a JEMRIS phantom file .h5.\n\nArguments\n\nfilename: (::String) the absolute or relative path of the phantom file .h5\n\nReturns\n\nobj: (::Phantom) Phantom struct\n\nExamples\n\njulia> obj_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/2.phantoms/brain.h5\")\n\njulia> obj = read_phantom_jemris(obj_file)\n\njulia> plot_phantom_map(obj, :ρ)\n\n\n\n\n\n","category":"function"},{"location":"reference/4-koma-files/#KomaMRIFiles.read_phantom_MRiLab","page":"KomaMRIFiles","title":"KomaMRIFiles.read_phantom_MRiLab","text":"obj = read_phantom_MRiLab(filename)\n\nReturns the Phantom struct from a MRiLab phantom file .mat.\n\nArguments\n\nfilename: (::String) the absolute or relative path of the phantom file .mat\n\nReturns\n\nobj: (::Phantom) Phantom struct\n\nExamples\n\njulia> obj_file = joinpath(dirname(pathof(KomaMRI)), \"../examples/2.phantoms/brain.mat\")\n\njulia> obj = read_phantom_MRiLab(obj_file)\n\njulia> plot_phantom_map(obj, :ρ)\n\n\n\n\n\n","category":"function"},{"location":"reference/4-koma-files/#KomaMRIFiles.read_phantom","page":"KomaMRIFiles","title":"KomaMRIFiles.read_phantom","text":"phantom = read_phantom(filename)\n\nReads a (.phantom) file and creates a Phantom structure from it\n\n\n\n\n\n","category":"function"},{"location":"reference/4-koma-files/#KomaMRIFiles.write_phantom","page":"KomaMRIFiles","title":"KomaMRIFiles.write_phantom","text":"phantom = write_phantom(ph,filename)\n\nWrites a (.phantom) file from a Phantom struct.\n\n\n\n\n\n","category":"function"},{"location":"how-to/2-2-use-koma-notebooks/#Use-Koma-in-Notebooks","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"","category":"section"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"You can use KomaMRI with popular programming environments such as Pluto and Jupyter notebooks. The following sections show how to set up these notebooks and test KomaMRI with them.","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/#Pluto","page":"Use Koma in Notebooks","title":"Pluto","text":"","category":"section"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"First, install the Pluto module in your Julia environment. Remember to press the ] button to open the Package Manager Session:","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"julia>\n\n@(1.9) pkg> add Pluto","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"Afterward, return to the Julia Session by pressing the backspace button, and then execute the Pluto.run() function:","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"julia> using Pluto\n\njulia> Pluto.run()","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"This should automatically open the Pluto dashboard in your default web browser:","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":" ","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"Next, create a new notebook by clicking on + Create a new notebook:","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":" ","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"Write and run the following code, which is identical to the Free Induction Decay example. Pluto automatically installs the required modules if they are not present on your system. Additionally, note that we do not directly use KomaMRI since we won't be utilizing the KomaUI function. Instead, we rely on the KomaMRICore and KomaMRIPlots dependencies. To display plots in Pluto, ensure that you import the PlutoPlotly package, as KomaMRIPlots requires its backend to display figures in Pluto:","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"One of the most outstanding features of Pluto is its ability to ensure reproducibility by storing the information necessary to recreate the package environment in the notebook file. When others open your notebook with Pluto, it automatically ensures they use the exact same package environment, guaranteeing seamless functionality on their computers.","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/#Jupyter","page":"Use Koma in Notebooks","title":"Jupyter","text":"","category":"section"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"Ensure you have Jupyter installed on your computer. Follow this tutorial for installation using Anaconda.","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"Next, install the IJulia module in your Julia environment. Remember to press the ] key to open the Package Manager Session:","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"julia>\n\n(@v1.9) pkg> add IJulia","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"For this example, make sure to install KomaMRICore and KomaMRIPlots (we do not use KomaMRI directly since we won't be utilizing the KomaUI() function):","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"(@v1.9) pkg> add KomaMRICore\n\n(@v1.9) pkg> add KomaMRIPlots","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"Next, open Jupyter, navigate to a working folder, and create a new notebook by clicking on New, then Julia 1.9.3.\"","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":" ","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"A new, empty notebook will appear:","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":" ","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"Proceed to write and execute the provided example:","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"View code ","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"# Import modules\nusing KomaMRICore, KomaMRIPlots\n\n# Define sequence\nampRF = 2e-6 # 2 uT RF amplitude\ndurRF = π / 2 / (2π * γ * ampRF) # required duration for a 90 deg RF pulse\nexc = RF(ampRF, durRF)\n\nnADC = 8192 # number of acquisition samples\ndurADC = 250e-3 # duration of the acquisition\ndelay = 1e-3 # small delay\nacq = ADC(nADC, durADC, delay)\n\nseq = Sequence() # empty sequence\nseq += exc # adding RF-only block\nseq += acq # adding ADC-only block\n\n# Plot the sequence\nplot_seq(seq; slider=false, height=300)","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":" ","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":" ","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"This should be sufficient, and now you can start working with KomaMRI using Jupyter notebooks.","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"If you encounter the issue of WebIO not being detected:","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":" ","category":"page"},{"location":"how-to/2-2-use-koma-notebooks/","page":"Use Koma in Notebooks","title":"Use Koma in Notebooks","text":"Refer to this IJulia documentation and this troubleshooting guide for details. Essentially, you need to install a WebIO extension depending on your Jupyter installation.","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase","page":"KomaMRIBase","title":"KomaMRIBase","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"CurrentModule = KomaMRIBase","category":"page"},{"location":"reference/2-koma-base/#Scanner-related-functions","page":"KomaMRIBase","title":"Scanner-related functions","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"Scanner","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.Scanner","page":"KomaMRIBase","title":"KomaMRIBase.Scanner","text":"sys = Scanner(B0, B1, Gmax, Smax, ADC_Δt, seq_Δt, GR_Δt, RF_Δt,\n RF_ring_down_T, RF_dead_time_T, ADC_dead_time_T)\n\nThe Scanner struct. It contains hardware limitations of the MRI resonator. It is an input for the simulation.\n\nArguments\n\nB0: (::Real, =1.5, [T]) main magnetic field strength\nB1: (::Real, =10e-6, [T]) maximum RF amplitude\nGmax: (::Real, =60e-3, [T/m]) maximum gradient amplitude\nSmax: (::Real, =500, [mT/m/ms]) gradient's maximum slew-rate\nADC_Δt: (::Real, =2e-6, [s]) ADC raster time\nseq_Δt: (::Real, =1e-5, [s]) sequence-block raster time\nGR_Δt: (::Real, =1e-5, [s]) gradient raster time\nRF_Δt: (::Real, =1e-6, [s]) RF raster time\nRF_ring_down_T: (::Real, =20e-6, [s]) RF ring down time\nRF_dead_time_T: (::Real, =100e-6, [s]) RF dead time\nADC_dead_time_T: (::Real, =10e-6, [s]) ADC dead time\n\nReturns\n\nsys: (::Scanner) Scanner struct\n\nExamples\n\njulia> sys = Scanner()\n\njulia> sys.B0\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#Phantom-related-functions","page":"KomaMRIBase","title":"Phantom-related functions","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"Phantom\nbrain_phantom2D\nbrain_phantom3D\npelvis_phantom2D\nheart_phantom","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.Phantom","page":"KomaMRIBase","title":"KomaMRIBase.Phantom","text":"obj = Phantom(name, x, y, z, ρ, T1, T2, T2s, Δw, Dλ1, Dλ2, Dθ, motion)\n\nThe Phantom struct. Most of its field names are vectors, with each element associated with a property value representing a spin. This struct serves as an input for the simulation.\n\nArguments\n\nname: (::String) phantom name\nx: (::AbstractVector{T<:Real}, [m]) spin x-position vector\ny: (::AbstractVector{T<:Real}, [m]) spin y-position vector\nz: (::AbstractVector{T<:Real}, [m]) spin z-position vector\nρ: (::AbstractVector{T<:Real}) spin proton density vector\nT1: (::AbstractVector{T<:Real}, [s]) spin T1 parameter vector\nT2: (::AbstractVector{T<:Real}, [s]) spin T2 parameter vector\nT2s: (::AbstractVector{T<:Real}, [s]) spin T2s parameter vector\nΔw: (::AbstractVector{T<:Real}, [rad/s]) spin off-resonance parameter vector\nDλ1: (::AbstractVector{T<:Real}) spin Dλ1 (diffusion) parameter vector\nDλ2: (::AbstractVector{T<:Real}) spin Dλ2 (diffusion) parameter vector\nDθ: (::AbstractVector{T<:Real}) spin Dθ (diffusion) parameter vector\nmotion: (::AbstractMotion{T<:Real}) motion\n\nReturns\n\nobj: (::Phantom) Phantom struct\n\nExamples\n\njulia> obj = Phantom(x=[0.0])\n\njulia> obj.ρ\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.brain_phantom2D","page":"KomaMRIBase","title":"KomaMRIBase.brain_phantom2D","text":"phantom = brain_phantom2D(;axis=\"axial\", ss=4)\n\nCreates a two-dimensional brain Phantom struct. Default ss=4 sample spacing is 2 mm. Original file (ss=1) sample spacing is .5 mm.\n\nReferences\n\nB. Aubert-Broche, D.L. Collins, A.C. Evans: \"A new improved version of the realistic digital brain phantom\" NeuroImage, in review - 2006\nB. Aubert-Broche, M. Griffin, G.B. Pike, A.C. Evans and D.L. Collins: \"20 new digital brain phantoms for creation of validation image data bases\" IEEE TMI, in review - 2006\nhttps://brainweb.bic.mni.mcgill.ca/brainweb/tissuemrparameters.txt\n\nKeywords\n\naxis: (::String, =\"axial\", opts=[\"axial\", \"coronal\", \"sagittal\"]) orientation of the phantom\nss: (::Integer or ::Vector{Integer}, =4) subsampling parameter for all axes if scaler, per axis if 2 element vector [ssx, ssy]\nus: (::Integer or ::Vector{Integer}, =1) upsampling parameter for all axes if scaler, per axis if 2 element vector [usx, usy], if used ss is set to ss=1\n\nReturns\n\nobj: (::Phantom) Phantom struct\n\nExamples\n\njulia> obj = brain_phantom2D(; axis=\"sagittal\", ss=1)\n\njulia> obj = brain_phantom2D(; axis=\"axial\", us=[1, 2])\n\njulia> plot_phantom_map(obj, :ρ)\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.brain_phantom3D","page":"KomaMRIBase","title":"KomaMRIBase.brain_phantom3D","text":"obj = brain_phantom3D(; ss=4, us=1, start_end=[160,200])\n\nCreates a three-dimentional brain Phantom struct. Default ss=4 sample spacing is 2 mm. Original file (ss=1) sample spacing is .5 mm. \n\nReferences\n\nB. Aubert-Broche, D.L. Collins, A.C. Evans: \"A new improved version of the realistic digital brain phantom\" NeuroImage, in review - 2006\nB. Aubert-Broche, M. Griffin, G.B. Pike, A.C. Evans and D.L. Collins: \"20 new digital brain phantoms for creation of validation image data bases\" IEEE TMI, in review - 2006\nhttps://brainweb.bic.mni.mcgill.ca/brainweb/tissuemrparameters.txt\n\nKeywords\n\nss: (::Integer or ::Vector{Integer}, =4) subsampling parameter for all axes if scaler, per axis if 3 element vector [ssx, ssy, ssz]\nus: (::Integer or ::Vector{Integer}, =1) upsampling parameter for all axes if scaler, per axis if 3 element vector [usx, usy, usz]\nstart_end: (::Vector{Integer}, =[160,200]) z index range of presampled phantom, 180 is center\n\nReturns\n\nobj: (::Phantom) 3D Phantom struct\n\nExamples\n\njulia> obj = brain_phantom3D(; ss=5)\n\njulia> obj = brain_phantom3D(; us=[2, 2, 1])\n\njulia> plot_phantom_map(obj, :ρ)\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.pelvis_phantom2D","page":"KomaMRIBase","title":"KomaMRIBase.pelvis_phantom2D","text":"obj = pelvis_phantom2D(; ss=4, us=1)\n\nCreates a two-dimensional pelvis Phantom struct. Default ss=4 sample spacing is 2 mm. Original file (ss=1) sample spacing is .5 mm.\n\nKeywords\n\nss: (::Integer or ::Vector{Integer}, =4) subsampling parameter for all axes if scaler, per axis if 2 element vector [ssx, ssy]\nus: (::Integer or ::Vector{Integer}, =1) upsampling parameter for all axes if scaler, per axis if 2 element vector [usx, usy]\n\nReturns\n\nobj: (::Phantom) Phantom struct\n\nExamples\n\njulia> obj = pelvis_phantom2D(; ss=2])\n\njulia> obj = pelvis_phantom2D(; us=[1, 2])\n\njulia> pelvis_phantom2D(obj, :ρ)\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.heart_phantom","page":"KomaMRIBase","title":"KomaMRIBase.heart_phantom","text":"obj = heart_phantom(\n circumferential_strain, radial_strain, rotation_angle; \n heart_rate, asymmetry\n)\n\nHeart-like LV 2D phantom. The variable circumferential_strain and radial_strain are for streching (if positive) or contraction (if negative). rotation_angle is for rotation.\n\nKeywords\n\ncircumferential_strain: (::Real, =-0.3) contraction parameter. Between -1 and 1\nradial_strain: (::Real, =-0.3) contraction parameter. Between -1 and 1\nrotation_angle: (::Real, =15.0, [º]) maximum rotation angle\nheart_rate: (::Real, =60, [bpm]) heartbeat frequency\ntemporal_asymmetry: (::Real, =0.2) time fraction of the period in which the systole occurs. Therefore, diastole lasts for period * (1 - temporal_asymmetry)\n\nReturns\n\nobj: (::Phantom) Heart-like LV phantom struct\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#Motion-related-functions","page":"KomaMRIBase","title":"Motion-related functions","text":"","category":"section"},{"location":"reference/2-koma-base/#AbstractMotion-types-and-related-functions","page":"KomaMRIBase","title":"AbstractMotion types and related functions","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"NoMotion\nMotionList\nget_spin_coords","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.NoMotion","page":"KomaMRIBase","title":"KomaMRIBase.NoMotion","text":"nomotion = NoMotion{T<:Real}()\n\nNoMotion struct. It is used to create static phantoms.\n\nReturns\n\nnomotion: (::NoMotion) NoMotion struct\n\nExamples\n\njulia> nomotion = NoMotion{Float64}()\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.MotionList","page":"KomaMRIBase","title":"KomaMRIBase.MotionList","text":"motionlist = MotionList(motions...)\n\nMotionList struct. The other option, instead of NoMotion, is to define a dynamic phantom by means of the MotionList struct. It is composed by one or more Motion instances. \n\nArguments\n\nmotions: (::Vector{Motion{T<:Real}}) vector of Motion instances\n\nReturns\n\nmotionlist: (::MotionList) MotionList struct\n\nExamples\n\njulia> motionlist = MotionList(\n Motion(\n action = Translate(0.01, 0.0, 0.02),\n time = TimeRange(0.0, 1.0),\n spins = AllSpins()\n ),\n Motion(\n action = Rotate(0.0, 0.0, 45.0),\n time = Periodic(1.0),\n spins = SpinRange(1:10)\n )\n )\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.get_spin_coords","page":"KomaMRIBase","title":"KomaMRIBase.get_spin_coords","text":"x, y, z = get_spin_coords(motionset, x, y, z, t)\n\nCalculates the position of each spin at a set of arbitrary time instants, i.e. the time steps of the simulation. For each dimension (x, y, z), the output matrix has N_\tspins rows and length(t) columns.\n\nArguments\n\nmotionset: (::AbstractMotion{T<:Real}) phantom motion\nx: (::AbstractVector{T<:Real}, [m]) spin x-position vector\ny: (::AbstractVector{T<:Real}, [m]) spin y-position vector\nz: (::AbstractVector{T<:Real}, [m]) spin z-position vector\nt: horizontal array of time instants\n\nReturns\n\nx, y, z: (::Tuple{AbstractArray, AbstractArray, AbstractArray}) spin positions over time\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#Motion","page":"KomaMRIBase","title":"Motion","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"Motion","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.Motion","page":"KomaMRIBase","title":"KomaMRIBase.Motion","text":"motion = Motion(action)\nmotion = Motion(action, time)\nmotion = Motion(action, time, spins)\n\nMotion struct. It defines the motion, during a certain time interval, of a given group of spins. It is composed by three fields: action, which defines the motion itself, time, which accounts for the time during which the motion takes place, and spins, which indicates the spins that are affected by that motion.\n\nArguments\n\naction: (::AbstractAction{T<:Real}) action, such as Translate or Rotate\ntime: (::AbstractTimeSpan{T<:Real}, =TimeRange(0.0)) time information about the motion\nspins: (::AbstractSpinSpan, =AllSpins()) spin indexes affected by the motion\n\nReturns\n\nmotion: (::Motion) Motion struct\n\nExamples\n\njulia> motion = Motion(\n action = Translate(0.01, 0.0, 0.02),\n time = TimeRange(0.0, 1.0),\n spins = SpinRange(1:10)\n )\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#AbstractAction-types","page":"KomaMRIBase","title":"AbstractAction types","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"Translate\nTranslate(dx, dy, dz, time, spins)\nRotate\nRotate(pitch, roll, yaw, time, spins)\nHeartBeat\nHeartBeat(circumferential_strain, radial_strain, longitudinal_strain, time, spins)\nPath\nPath(dx, dy, dz, time, spins)\nFlowPath\nFlowPath(dx, dy, dz, spin_reset, time, spins)","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.Translate","page":"KomaMRIBase","title":"KomaMRIBase.Translate","text":"translate = Translate(dx, dy, dz)\n\nTranslate struct. It produces a linear translation. Its fields are the final displacements in the three axes (dx, dy, dz).\n\nArguments\n\ndx: (::Real, [m]) translation in x\ndy: (::Real, [m]) translation in y \ndz: (::Real, [m]) translation in z\n\nReturns\n\ntranslate: (::Translate) Translate struct\n\nExamples\n\njulia> translate = Translate(dx=0.01, dy=0.02, dz=0.03)\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.Translate-NTuple{5, Any}","page":"KomaMRIBase","title":"KomaMRIBase.Translate","text":"translate = Translate(dx, dy, dz, time, spins)\n\nArguments\n\ndx: (::Real, [m]) translation in x\ndy: (::Real, [m]) translation in y \ndz: (::Real, [m]) translation in z\ntime: (::AbstractTimeSpan{T<:Real}) time information about the motion\nspins: (::AbstractSpinSpan) spin indexes affected by the motion\n\nReturns\n\ntranslate: (::Motion) Motion struct\n\nExamples\n\njulia> translate = Translate(0.01, 0.02, 0.03, TimeRange(0.0, 1.0), SpinRange(1:10))\n\n\n\n\n\n","category":"method"},{"location":"reference/2-koma-base/#KomaMRIBase.Rotate","page":"KomaMRIBase","title":"KomaMRIBase.Rotate","text":"rotate = Rotate(pitch, roll, yaw)\n\nRotate struct. It produces a rotation in the three axes: x (pitch), y (roll), and z (yaw). We follow the RAS (Right-Anterior-Superior) orientation, and the rotations are applied following the right-hand rule (counter-clockwise):\n\n(Image: Head Rotation Axis)\n\nThe applied rotation matrix is obtained as follows: \n\nbeginequation\nbeginaligned\nR = R_z(alpha) R_y(beta) R_x(gamma) \n = beginbmatrix\ncos alpha -sin alpha 0 \nsin alpha cos alpha 0 \n0 0 1\nendbmatrix\nbeginbmatrix\ncos beta 0 sin beta \n0 1 0 \n-sin beta 0 cos beta\nendbmatrix\nbeginbmatrix\n1 0 0 \n0 cos gamma -sin gamma \n0 sin gamma cos gamma\nendbmatrix \n = beginbmatrix\ncos alpha cos beta cos alpha sin beta sin gamma - sin alpha cos gamma cos alpha sin beta cos gamma + sin alpha sin gamma \nsin alpha cos beta sin alpha sin beta sin gamma + cos alpha cos gamma sin alpha sin beta cos gamma - cos alpha sin gamma \n-sin beta cos beta sin gamma cos beta cos gamma\nendbmatrix\nendaligned\nendequation\n\nArguments\n\npitch: (::Real, [º]) rotation in x\nroll: (::Real, [º]) rotation in y \nyaw: (::Real, [º]) rotation in z\n\nReturns\n\nrotate: (::Rotate) Rotate struct\n\nExamples\n\njulia> rotate = Rotate(pitch=15.0, roll=0.0, yaw=20.0)\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.Rotate-NTuple{5, Any}","page":"KomaMRIBase","title":"KomaMRIBase.Rotate","text":"rotate = Rotate(pitch, roll, yaw, spins)\n\nArguments\n\npitch: (::Real, [º]) rotation in x\nroll: (::Real, [º]) rotation in y \nyaw: (::Real, [º]) rotation in z\ntime: (::AbstractTimeSpan{T<:Real}) time information about the motion\nspins: (::AbstractSpinSpan) spin indexes affected by the motion\n\nReturns\n\nrotate: (::Motion) Motion struct with Rotate action\n\nExamples\n\njulia> rotate = Rotate(15.0, 0.0, 20.0, TimeRange(0.0, 1.0), SpinRange(1:10))\n\n\n\n\n\n","category":"method"},{"location":"reference/2-koma-base/#KomaMRIBase.HeartBeat","page":"KomaMRIBase","title":"KomaMRIBase.HeartBeat","text":"heartbeat = HeartBeat(circumferential_strain, radial_strain, longitudinal_strain)\n\nHeartBeat struct. It produces a heartbeat-like motion, characterised by three types of strain: circumferential, radial and longitudinal\n\nArguments\n\ncircumferential_strain: (::Real) contraction parameter\nradial_strain: (::Real) contraction parameter\nlongitudinal_strain: (::Real) contraction parameter\n\nReturns\n\nheartbeat: (::HeartBeat) HeartBeat struct\n\nExamples\n\njulia> heartbeat = HeartBeat(circumferential_strain=-0.3, radial_strain=-0.2, longitudinal_strain=0.0)\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.HeartBeat-NTuple{5, Any}","page":"KomaMRIBase","title":"KomaMRIBase.HeartBeat","text":"heartbeat = HeartBeat(circumferential_strain, radial_strain, longitudinal_strainl, time, spins)\n\nArguments\n\ncircumferential_strain: (::Real) contraction parameter\nradial_strain: (::Real) contraction parameter\nlongitudinal_strain: (::Real) contraction parameter\ntime: (::AbstractTimeSpan{T<:Real}) time information about the motion\nspins: (::AbstractSpinSpan) spin indexes affected by the motion\n\nReturns\n\nheartbeat: (::Motion) Motion struct with HeartBeat action\n\nExamples\n\njulia> heartbeat = HeartBeat(-0.3, -0.2, 0.0, TimeRange(0.0, 1.0), SpinRange(1:10))\n\n\n\n\n\n","category":"method"},{"location":"reference/2-koma-base/#KomaMRIBase.Path","page":"KomaMRIBase","title":"KomaMRIBase.Path","text":"path = Path(dx, dy, dz)\n\nPath struct. For this action (and for FlowPath), motion is not defined solely on the basis of three numerical parameters, one for each spatial direction, as occurs for the Translate, Rotate and HeartBeat actions.\n\nFor this action, it is necessary to define motion for each spin independently, in x (dx), y (dy) and z (dz). dx, dy and dz are now three matrixes, of (N_spins* times N_discretetimes) each. This means that each row corresponds to a spin trajectory over a set of discrete time instants.\n\nnote: Note\n*When creating a motion with Flow or FlowPath, you must make sure that the number of rows of the matrices dx, dy and dz matches the number of spins that are affected by the motion. Remember that the range of spins affected by a motion is defined by the spins field of the Motion structexample:julia> motion = Motion(\n action = Path(\n dx=[0.01 0.02; 0.02 0.03], # 2 rows\n dy=[0.02 0.03; 0.03 0.04], \n dz=[0.03 0.04; 0.04 0.05]),\n time = TimeRange(0.0, 1.0),\n spins = SpinRange(1:2) # 2 spins\n)\n\nArguments\n\ndx: (::AbstractArray{T<:Real}, [m]) displacements in x\ndy: (::AbstractArray{T<:Real}, [m]) displacements in y \ndz: (::AbstractArray{T<:Real}, [m]) displacements in z\n\nReturns\n\npath: (::Path) Path struct\n\nExamples\n\njulia> path = Path(\n dx=[0.01 0.02; 0.02 0.03], \n dy=[0.02 0.03; 0.03 0.04], \n dz=[0.03 0.04; 0.04 0.05]\n )\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.Path-NTuple{5, Any}","page":"KomaMRIBase","title":"KomaMRIBase.Path","text":"path = Path(dx, dy, dz, time, spins)\n\nArguments\n\ndx: (::AbstractArray{T<:Real}, [m]) displacements in x\ndy: (::AbstractArray{T<:Real}, [m]) displacements in y \ndz: (::AbstractArray{T<:Real}, [m]) displacements in z\ntime: (::AbstractTimeSpan{T<:Real}) time information about the motion\nspins: (::AbstractSpinSpan) spin indexes affected by the motion\n\nReturns\n\npath: (::Motion) Motion struct with Path action\n\nExamples\n\njulia> path = Path(\n [0.01 0.02; 0.02 0.03], \n [0.02 0.03; 0.03 0.04], \n [0.03 0.04; 0.04 0.05], \n TimeRange(0.0, 1.0), \n SpinRange(1:10)\n )\n\n\n\n\n\n","category":"method"},{"location":"reference/2-koma-base/#KomaMRIBase.FlowPath","page":"KomaMRIBase","title":"KomaMRIBase.FlowPath","text":"flowpath = FlowPath(dx, dy, dz, spin_reset)\n\nFlowPath struct. This action is the same as Path, except that it includes an additional field, called spin_reset, which accounts for spins leaving the volume and being remapped to another input position. When this happens, the magnetization state of these spins must be reset during the simulation. \n\nAs with the dx, dy and dz matrices, spin_reset has a size of (N_spins times N_discretetimes).\n\nArguments\n\ndx: (::AbstractArray{T<:Real}, [m]) displacements in x\ndy: (::AbstractArray{T<:Real}, [m]) displacements in y \ndz: (::AbstractArray{T<:Real}, [m]) displacements in z\nspin_reset: (::AbstractArray{Bool}) reset spin state flags\n\nReturns\n\nflowpath: (::FlowPath) FlowPath struct\n\nExamples\n\njulia> flowpath = FlowPath(\n dx=[0.01 0.02; 0.02 0.03], \n dy=[0.02 0.03; 0.03 0.04], \n dz=[0.03 0.04; 0.04 -0.04],\n spin_reset=[false false; false true]\n )\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.FlowPath-NTuple{6, Any}","page":"KomaMRIBase","title":"KomaMRIBase.FlowPath","text":"flowpath = FlowPath(dx, dy, dz, spin_reset, time, spins)\n\nArguments\n\ndx: (::AbstractArray{T<:Real}, [m]) displacements in x\ndy: (::AbstractArray{T<:Real}, [m]) displacements in y \ndz: (::AbstractArray{T<:Real}, [m]) displacements in z\nspin_reset: (::AbstractArray{Bool}) reset spin state flags\ntime: (::AbstractTimeSpan{T<:Real}) time information about the motion\nspins: (::AbstractSpinSpan) spin indexes affected by the motion\n\nReturns\n\nflowpath: (::Motion) Motion struct with FlowPath action\n\nExamples\n\njulia> flowpath = FlowPath(\n [0.01 0.02; 0.02 0.03], \n [0.02 0.03; 0.03 0.04], \n [0.03 0.04; 0.04 0.05], \n [false false; false true],\n TimeRange(0.0, 1.0), \n SpinRange(1:10)\n )\n\n\n\n\n\n","category":"method"},{"location":"reference/2-koma-base/#AbstractTimeSpan-types-and-related-functions","page":"KomaMRIBase","title":"AbstractTimeSpan types and related functions","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"TimeRange\nPeriodic\nunit_time","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.TimeRange","page":"KomaMRIBase","title":"KomaMRIBase.TimeRange","text":"timerange = TimeRange(t_start, t_end)\n\nTimeRange struct. It is a specialized type that inherits from AbstractTimeSpan and defines a time interval, with start and end times.\n\nArguments\n\nt_start: (::Real, [s]) start time\nt_end: (::Real, [s]) end time\n\nReturns\n\ntimerange: (::TimeRange) TimeRange struct\n\nExamples\n\njulia> timerange = TimeRange(0.0, 1.0)\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.Periodic","page":"KomaMRIBase","title":"KomaMRIBase.Periodic","text":"periodic = Periodic(period, asymmetry)\n\nPeriodic struct. It is a specialized type that inherits from AbstractTimeSpan, designed to work with time intervals that repeat periodically. It includes a measure of asymmetry in order to recreate a asymmetric period.\n\nArguments\n\nperiod: (::Real, [s]) period duration\nasymmetry: (::Real, =0.5) temporal asymmetry factor. Between 0 and 1.\n\nReturns\n\nperiodic: (::Periodic) Periodic struct\n\nExamples\n\njulia> periodic = Periodic(1.0, 0.2)\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.unit_time","page":"KomaMRIBase","title":"KomaMRIBase.unit_time","text":"t_unit = unit_time(t, time_range)\n\nThe unit_time function normalizes a given array of time values t to a unit interval [0, 1] based on a specified start time t_start and end time t_end. This function is used for non-periodic motions, where each element of t is transformed to fit within the range [0, 1] based on the provided start and end times.\n\n(Image: Unit Time)\n\nArguments\n\nt: (::AbstractArray{T<:Real}, [s]) array of time values to be normalized\ntime_range: (::TimeRange{T<:Real}, [s]) time interval (defined by t_start and t_end) over which we want to normalise\n\nReturns\n\nt_unit: (::AbstractArray{T<:Real}, [s]) array of normalized time values\n\nExamples\n\njulia> t_unit = KomaMRIBase.unit_time([0.0, 1.0, 2.0, 3.0, 4.0, 5.0], TimeRange(1.0, 4.0))\n6-element Vector{Float64}:\n 0.0\n 0.0\n 0.333\n 0.666\n 1.0\n 1.0\n\n\n\n\n\nt_unit = unit_time(t, periodic)\n\nThe unit_time function normalizes a given array of time values t to a unit interval [0, 1] for periodic motions, based on a specified period and an asymmetry factor. This function is useful for creating triangular waveforms or normalizing time values in periodic processes.\n\n(Image: Unit Time Triangular)\n\nArguments\n\nt: (::AbstractArray{T<:Real}, [s]) array of time values to be normalized\nperiodic: (::Periodic{T<:Real}, [s]) information about the period and the temporal asymmetry\n\nReturns\n\nt_unit: (::AbstractArray{T<:Real}, [s]) array of normalized time values\n\nExamples\n\njulia> t_unit = KomaMRIBase.unit_time([0.0, 1.0, 2.0, 3.0, 4.0, 5.0], Periodic(4.0, 0.5))\n6-element Vector{Float64}:\n 0.0\n 0.5\n 1.0\n 0.5\n 0.0\n 0.5\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#AbstractSpinSapn-types","page":"KomaMRIBase","title":"AbstractSpinSapn types","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"AllSpins\nSpinRange","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.AllSpins","page":"KomaMRIBase","title":"KomaMRIBase.AllSpins","text":"allspins = AllSpins()\n\nAllSpins struct. It is a specialized type that inherits from AbstractSpinSpan and is used to cover all the spins of a phantom.\n\nReturns\n\nallspins: (::AllSpins) AllSpins struct\n\nExamples\n\njulia> allspins = AllSpins()\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.SpinRange","page":"KomaMRIBase","title":"KomaMRIBase.SpinRange","text":"spinrange = SpinRange(range)\n\nSpinRange struct. It is a specialized type that inherits from AbstractSpinSpan and is used to select a certain range and number of spins.\n\nArguments\n\nrange: (::AbstractVector) spin id's. This argument can be a Range, a Vector or a BitVector\n\nReturns\n\nspinrange: (::SpinRange) SpinRange struct\n\nExamples\n\njulia> spinrange = SpinRange(1:10)\njulia> spinrange = SpinRange([1, 3, 5, 7])\njulia> spinrange = SpinRange(obj.x .> 0)\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#Sequence-related-functions","page":"KomaMRIBase","title":"Sequence-related functions","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"Sequence\ndur\nget_block_start_times\nget_flip_angles","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.Sequence","page":"KomaMRIBase","title":"KomaMRIBase.Sequence","text":"seq = Sequence()\nseq = Sequence(GR)\nseq = Sequence(GR, RF)\nseq = Sequence(GR, RF, ADC)\nseq = Sequence(GR, RF, ADC, DUR)\nseq = Sequence(GR::Array{Grad,1})\nseq = Sequence(GR::Array{Grad,1}, RF::Array{RF,1})\nseq = Sequence(GR::Array{Grad,1}, RF::Array{RF,1}, A::ADC, DUR, DEF)\n\nThe Sequence struct. It contains events of an MRI sequence. Most field names (except for the DEF field) consist of matrices or vectors, where each column index represents a sequence block. This struct serves as an input for the simulation.\n\nArguments\n\nGR: (::Matrix{Grad}) gradient matrix. Rows for x-y-z amplitudes and columns are for blocks\nRF: (::Matrix{RF}) RF matrix. The 1 row is for the coil and columns are for blocks\nADC: (::Array{ADC,1}) ADC block vector\nDUR: (::Vector, [s]) duration block vector\nDEF: (::Dict{String, Any}) dictionary with relevant information of the sequence. Possible keys could be [\"AdcRasterTime\", \"GradientRasterTime\", \"Name\", \"Nz\", \"Num_Blocks\", \"Nx\", \"Ny\", \"PulseqVersion\", \"BlockDurationRaster\", \"FileName\", \"RadiofrequencyRasterTime\"]\n\nReturns\n\nseq: (::Sequence) Sequence struct\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.dur","page":"KomaMRIBase","title":"KomaMRIBase.dur","text":"y = dur(x::Grad)\ny = dur(x::Vector{Grad})\ny = dur(x::Matrix{Grad})\n\nDuration time in [s] of Grad struct or Grad Array.\n\nArguments\n\nx: (::Grad or ::Vector{Grad} or ::Matrix{Grad}) Grad struct or Grad Array\n\nReturns\n\ny: (::Float64, [s]) duration of the Grad struct or Grad Array\n\n\n\n\n\ny = dur(x::RF)\ny = dur(x::Vector{RF})\ny = dur(x::Matrix{RF})\n\nDuration time in [s] of RF struct or RF Array.\n\nArguments\n\nx: (::RF or ::Vector{RF} or ::Matrix{RF}) RF struct or RF array\n\nReturns\n\ny: (::Float64, [s]) duration of the RF struct or RF array\n\n\n\n\n\nT = dur(x::Sequence)\n\nThe total duration of the sequence in [s].\n\nArguments\n\nx: (::Sequence) Sequence struct\n\nReturns\n\nT: (::Real, [s]) total duration of the sequence\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.get_block_start_times","page":"KomaMRIBase","title":"KomaMRIBase.get_block_start_times","text":"T0 = get_block_start_times(seq::Sequence)\n\nReturns a vector containing the start times of blocks in a sequence. The initial time is always zero, and the final time corresponds to the duration of the sequence.\n\nArguments\n\nseq: (::Sequence) Sequence struct\n\nReturns\n\nT0: (::Vector, [s]) start times of the blocks in a sequence\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.get_flip_angles","page":"KomaMRIBase","title":"KomaMRIBase.get_flip_angles","text":"y = get_flip_angles(x::Sequence)\n\nReturns all the flip angles of the RF pulses in the sequence x.\n\nArguments\n\nx: (::Sequence) Sequence struct\n\nReturns\n\ny: (::Vector{Float64}, [deg]) flip angles\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#Grad","page":"KomaMRIBase","title":"Grad","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"Grad\nGrad(::Function, ::Real, ::Int64)","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.Grad","page":"KomaMRIBase","title":"KomaMRIBase.Grad","text":"gr = Grad(A, T)\ngr = Grad(A, T, rise)\ngr = Grad(A, T, rise, delay)\ngr = Grad(A, T, rise, fall, delay)\ngr = Grad(A, T, rise, fall, delay, first, last)\n\nThe Grad struct represents a gradient of a sequence event.\n\nArguments\n\nA: (::Real or ::Vector, [T/m]) amplitude of the gradient\nT: (::Real or ::Vector, [s]) duration of the flat-top\nrise: (::Real, [s]) duration of the rise\nfall: (::Real, [s]) duration of the fall\ndelay: (::Real, [s]) duration of the delay\n\nReturns\n\ngr: (::Grad) gradient struct\n\nExamples\n\njulia> gr = Grad(1, 1, 0.1, 0.1, 0.2)\n\njulia> seq = Sequence([gr]); plot_seq(seq)\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.Grad-Tuple{Function, Real, Int64}","page":"KomaMRIBase","title":"KomaMRIBase.Grad","text":"gr = Grad(f::Function, T::Real, N::Integer; delay::Real)\n\nGenerates an arbitrary gradient waveform defined by the function f in the interval t ∈ [0,T]. The time separation between two consecutive samples is given by T/(N-1).\n\nArguments\n\nf: (::Function) function that describes the gradient waveform\nT: (::Real, [s]) duration of the gradient waveform\nN: (::Integer, =300) number of samples of the gradient waveform\n\nKeywords\n\ndelay: (::Real, =0, [s]) delay time of the waveform\n\nReturns\n\ngr: (::Grad) gradient struct\n\nExamples\n\njulia> gx = Grad(t -> sin(π*t / 0.8), 0.8)\n\njulia> seq = Sequence([gx]); plot_seq(seq)\n\n\n\n\n\n","category":"method"},{"location":"reference/2-koma-base/#RF","page":"KomaMRIBase","title":"RF","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"RF\nRF(::Function, ::Real, ::Int64)\nget_flip_angle","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.RF","page":"KomaMRIBase","title":"KomaMRIBase.RF","text":"rf = RF(A, T)\nrf = RF(A, T, Δf)\nrf = RF(A, T, Δf, delay)\n\nThe RF struct represents a Radio Frequency excitation of a sequence event.\n\nArguments\n\nA: (::Complex, [T]) RF complex amplitud modulation (AM), B_1(t) = B_1(t) e^iphi(t) = B_1(t) + iB_1y(t)\nT: (::Real, [s]) RF duration\nΔf: (::Real or ::Vector, [Hz]) RF frequency difference with respect to the Larmor frequency. This can be a number but also a vector to represent frequency modulated signals (FM).\ndelay: (::Real, [s]) RF delay time\n\nReturns\n\nrf: (::RF) the RF struct\n\nExamples\n\njulia> rf = RF(1, 1, 0, 0.2)\n\njulia> seq = Sequence(); seq += rf; plot_seq(seq)\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.RF-Tuple{Function, Real, Int64}","page":"KomaMRIBase","title":"KomaMRIBase.RF","text":"rf = RF_fun(f::Function, T::Real, N::Int64)\n\nGenerate an RF sequence with amplitudes sampled from a function waveform.\n\nnote: Note\nThis function is not being used in this KomaMRI version.\n\nArguments\n\nf: (::Function, [T]) function for the RF amplitud waveform\nT: (::Real, [s]) duration of the RF pulse\nN: (::Int64) number of samples of the RF pulse\n\nReturns\n\nrf:(::RF) RF struct with amplitud defined by the function f\n\n\n\n\n\n","category":"method"},{"location":"reference/2-koma-base/#KomaMRIBase.get_flip_angle","page":"KomaMRIBase","title":"KomaMRIBase.get_flip_angle","text":"α = get_flip_angle(x::RF)\n\nCalculates the flip angle α [deg] of an RF struct. α = γ ∫ B1(τ) dτ\n\nArguments\n\nx: (::RF) RF struct\n\nReturns\n\nα: (::Int64, [deg]) flip angle RF struct x\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#ADC","page":"KomaMRIBase","title":"ADC","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"ADC\nget_adc_sampling_times\nget_adc_phase_compensation","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.ADC","page":"KomaMRIBase","title":"KomaMRIBase.ADC","text":"adc = ADC(N, T)\nadc = ADC(N, T, delay)\nadc = ADC(N, T, delay, Δf, ϕ)\n\nThe ADC struct represents the Analog to Digital Converter (ADC) of a sequence event.\n\nArguments\n\nN: (::Int64) number of acquired samples\nT: (::Float64, [s]) duration to acquire the samples\ndelay: (::Float64, [s]) delay time to start the acquisition\nΔf: (::Float64, [Hz]) delta frequency. It is meant to compensate RF pulse phases\nϕ: (::Float64, [rad]) phase. It is meant to compensate RF pulse phases\n\nReturns\n\nadc: (::ADC) ADC struct\n\nExamples\n\njulia> adc = ADC(16, 1, 0.1)\n\njulia> seq = Sequence(); seq += adc; plot_seq(seq)\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.get_adc_sampling_times","page":"KomaMRIBase","title":"KomaMRIBase.get_adc_sampling_times","text":"times = get_adc_sampling_times(seq)\n\nReturns an array of times when the samples of the sequence seq are acquired.\n\nArguments\n\nseq: (::Sequence) sequence struct\n\nReturns\n\ntimes: (::Vector{Float64}, [s]) time array when samples are acquired\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.get_adc_phase_compensation","page":"KomaMRIBase","title":"KomaMRIBase.get_adc_phase_compensation","text":"comp = get_adc_phase_compensation(seq)\n\nReturns an array of phase compensation factors, exp(-mathrmivarphi), which are used to compensate the acquired signal S by applying the operation S_mathrmcomp = S exp(-mathrmivarphi) after the simulation. This compensation is necessary because the signal typically exhibits a phase offset of varphi following RF excitation with a phase of varphi. Such pulses are commonly employed in sequences involving RF spoiling.\n\nArguments\n\nseq: (::Sequence) sequence struct\n\nReturns\n\ncomp: (::Vector{Complex}, [rad]) array of phase compensations for every acquired sample\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#Delay","page":"KomaMRIBase","title":"Delay","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"Delay","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.Delay","page":"KomaMRIBase","title":"KomaMRIBase.Delay","text":"delay = Delay(T)\n\nThe Delay struct is meant to add a delay to a sequence by using a sum operator.\n\nArguments\n\nT: (::Real, [s]) time delay value\n\nReturns\n\ndelay: (::Delay) delay struct\n\nExamples\n\njulia> delay = Delay(0.5)\n\njulia> s = Sequence([Grad(1, 1, 0.1)])\n\njulia> seq = delay + s; plot_seq(seq)\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#Rotation-matrices","page":"KomaMRIBase","title":"Rotation matrices","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"rotx\nroty\nrotz","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.rotx","page":"KomaMRIBase","title":"KomaMRIBase.rotx","text":"Rx = rotx(θ::Real)\n\nRotates vector counter-clockwise with respect to the x-axis.\n\nArguments\n\nθ: (::Real, [rad]) rotation angle\n\nReturns\n\nRx: (::Matrix{Int64}) rotation matrix\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.roty","page":"KomaMRIBase","title":"KomaMRIBase.roty","text":"Ry = roty(θ::Real)\n\nRotates vector counter-clockwise with respect to the y-axis.\n\nArguments\n\nθ: (::Real, [rad]) rotation angle\n\nReturns\n\nRy: (::Matrix{Int64}) rotation matrix\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.rotz","page":"KomaMRIBase","title":"KomaMRIBase.rotz","text":"Rz = rotz(θ::Real)\n\nRotates vector counter-clockwise with respect to the z-axis.\n\nArguments\n\nθ: (::Real, [rad]) rotation angle\n\nReturns\n\nRz: (::Matrix{Int64}) rotation matrix\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#Moments","page":"KomaMRIBase","title":"Moments","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"get_Mk\nget_kspace\nget_M0\nget_M1\nget_M2","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.get_Mk","page":"KomaMRIBase","title":"KomaMRIBase.get_Mk","text":"Mk, Mk_adc = get_Mk(seq::Sequence, k; Δt=1, skip_rf=zeros(Bool, sum(is_RF_on.(seq))))\n\nComputes the kth-order moment of the Sequence seq given by the formula int_0^T t^k G(t) dt.\n\nArguments\n\nseq: (::Sequence) Sequence struct\nk: (::Integer) order of the moment to be computed\nΔt: (::Real, =1, [s]) nominal delta time separation between two time samples for ADC acquisition and Gradients\nskip_rf: (::Vector{Bool}, =zeros(Bool, sum(is_RF_on.(seq)))) boolean vector which indicates whether to skip the computation for resetting the integral for excitation or refocusing RF type\n\nReturns\n\nMk: (3-column ::Matrix{Real}) kth-order moment\nMk_adc: (3-column ::Matrix{Real}) kth-order moment sampled at ADC times\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.get_kspace","page":"KomaMRIBase","title":"KomaMRIBase.get_kspace","text":"Computes the k-space trajectory of the Sequence seq. Refer to get_Mk and get_M0\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.get_M0","page":"KomaMRIBase","title":"KomaMRIBase.get_M0","text":"Computes the zero-order moment of the Sequence seq. Refer to get_Mk and get_kspace\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.get_M1","page":"KomaMRIBase","title":"KomaMRIBase.get_M1","text":"Computes the 1st-order moment of the Sequence seq. Refer to get_Mk\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.get_M2","page":"KomaMRIBase","title":"KomaMRIBase.get_M2","text":"Computes the 2nd-order moment of the Sequence seq. Refer to get_Mk\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#Event-checks","page":"KomaMRIBase","title":"Event checks","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"is_RF_on\nis_GR_on\nis_Gx_on\nis_Gy_on\nis_Gz_on\nis_ADC_on","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.is_RF_on","page":"KomaMRIBase","title":"KomaMRIBase.is_RF_on","text":"y = is_RF_on(x::Sequence)\ny = is_RF_on(x::Sequence, t::Vector{Float64})\n\nTells if the sequence seq has elements with RF active, or active during time t.\n\nArguments\n\nx: (::Sequence) Sequence struct\nt: (::Vector{Float64}, [s]) time to check\n\nReturns\n\ny: (::Bool) boolean that tells whether or not the RF in the sequence is active\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.is_GR_on","page":"KomaMRIBase","title":"KomaMRIBase.is_GR_on","text":"y = is_GR_on(x::Sequence)\n\nTells if the sequence seq has elements with GR active.\n\nArguments\n\nx: (::Sequence) Sequence struct\n\nReturns\n\ny: (::Bool) boolean that tells whether or not the GR in the sequence is active\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.is_Gx_on","page":"KomaMRIBase","title":"KomaMRIBase.is_Gx_on","text":"y = is_Gx_on(x::Sequence)\n\nTells if the sequence seq has elements with GR active in x direction.\n\nArguments\n\nx: (::Sequence) Sequence struct\n\nReturns\n\ny: (::Bool) boolean that tells whether or not the GRx in the sequence is active\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.is_Gy_on","page":"KomaMRIBase","title":"KomaMRIBase.is_Gy_on","text":"y = is_Gy_on(x::Sequence)\n\nTells if the sequence seq has elements with GR active in y direction.\n\nArguments\n\nx: (::Sequence) Sequence struct\n\nReturns\n\ny: (::Bool) boolean that tells whether or not the GRy in the sequence is active\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.is_Gz_on","page":"KomaMRIBase","title":"KomaMRIBase.is_Gz_on","text":"y = is_Gz_on(x::Sequence)\n\nTells if the sequence seq has elements with GR active in z direction.\n\nArguments\n\nx: (::Sequence) Sequence struct\n\nReturns\n\ny: (::Bool) boolean that tells whether or not the GRz in the sequence is active\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.is_ADC_on","page":"KomaMRIBase","title":"KomaMRIBase.is_ADC_on","text":"y = is_ADC_on(x::Sequence)\ny = is_ADC_on(x::Sequence, t::Union{Array{Float64,1}, Array{Float64,2}})\n\nTells if the sequence seq has elements with ADC active, or active during time t.\n\nArguments\n\nx: (::Sequence) sequence struct\nt: (::Union{Array{Float64,1}, Array{Float64,2}}, [s]) time to check\n\nReturns\n\ny: (::Bool) boolean that tells whether or not the ADC in the sequence is active\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#DiscreteSequence","page":"KomaMRIBase","title":"DiscreteSequence","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"DiscreteSequence\ndiscretize\nget_samples\ntimes\nampls\nfreqs","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.DiscreteSequence","page":"KomaMRIBase","title":"KomaMRIBase.DiscreteSequence","text":"seqd = DiscreteSequence(Gx, Gy, Gz, B1, Δf, ADC, t, Δt)\n\nA sampled version of a Sequence struct, containing vectors for event amplitudes at specified times. DiscreteSequence is the struct used for simulation.\n\nArguments\n\nGx: (::AbstractVector{T<:Real}, [T/m]) x-gradient vector\nGy: (::AbstractVector{T<:Real}, [T/m]) y-gradient vector\nGz: (::AbstractVector{T<:Real}, [T/m]) z-gradient vector\nB1: (::AbstractVector{Complex{T<:Real}}, [T]) RF amplitude vector\nΔf: (::AbstractVector{T<:Real}, [Hz]) RF carrier frequency displacement vector\nADC: (::AbstractVector{Bool}) ADC sample vector\nt: (::AbstractVector{T<:Real}, [s]) time vector\nΔt: (::AbstractVector{T<:Real}, [s]) delta time vector\n\nReturns\n\nseqd: (::DiscreteSequence) DiscreteSequence struct\n\n\n\n\n\n","category":"type"},{"location":"reference/2-koma-base/#KomaMRIBase.discretize","page":"KomaMRIBase","title":"KomaMRIBase.discretize","text":"seqd = discretize(seq::Sequence; sampling_params=default_sampling_params())\n\nThis function returns a sampled Sequence struct with RF and gradient time refinements based on simulation parameters.\n\nArguments\n\nseq: (::Sequence) sequence\n\nKeywords\n\nsampling_params: (::Dict{String, Any}, =default_sampling_params()) sampling parameter dictionary\n\nReturns\n\nseqd: (::DiscreteSequence) DiscreteSequence struct\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.get_samples","page":"KomaMRIBase","title":"KomaMRIBase.get_samples","text":"samples = get_samples(seq::Sequence; off_val=0, max_rf_samples=Inf)\n\nReturns the samples of the events in seq.\n\nArguments\n\nseq: (::Sequence) Sequence struct\n\nKeywords\n\noff_val: (::Number, =0) offset value for amplitude. Typically used to hide points in plots by setting it to Inf\nmax_rf_samples: (::Integer, =Inf) maximum number of samples for the RF struct\n\nReturns\n\nsamples: (::NamedTuple) contains samples for gx, gy, gz, rf, and adc events. Each event, represented by e::NamedTuple, includes time samples (e.t) and amplitude samples (e.A)\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.times","page":"KomaMRIBase","title":"KomaMRIBase.times","text":"t = times(gr::Grad)\nt = times(rf::RF)\nt = times(adc::ADC)\n\nGet time samples of MRI sequence event.\n\nArguments\n\ngr: (::Grad) Gradient struct\nrf: (::RF) RF struct\nadc: (::ADC) ADC struct\n\nReturns\n\nt: (::Vector{Number}) vector with time samples\n\n\n\n\n\ntimes = times(motion)\n\n\n\n\n\ntimes \n\n\n\n\n\ntimes \n\n\n\n\n\ntimes = times(motion)\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.ampls","page":"KomaMRIBase","title":"KomaMRIBase.ampls","text":"A = ampls(g::Grad)\nA = ampls(r::RF)\nA = ampls(d::ADC)\n\nGet amplitude samples of MRI sequence event.\n\nArguments\n\ngr: (::Grad) Gradient struct\nrf: (::RF) RF struct\nadc: (::ADC) ADC struct\n\nReturns\n\nA: (::Vector{Number}) vector with amplitude samples\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.freqs","page":"KomaMRIBase","title":"KomaMRIBase.freqs","text":"f = freqs(r::RF)\n\nGet frequency samples of MRI sequence event.\n\nArguments\n\nrf: (::RF) RF struct\n\nReturns\n\nf: (::Vector{Number}) vector with frequency samples\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#Other-functions","page":"KomaMRIBase","title":"Other functions","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"trapz\ncumtrapz\nkfoldperm","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.trapz","page":"KomaMRIBase","title":"KomaMRIBase.trapz","text":"y = trapz(Δt, x)\n\nTrapezoidal integration for every spin of a phantom.\n\nnote: Note\nIn practice, this function is used to integrate (Gx * x + Gy * y + Gz * z) * Δt for all the spins. NΔt is the length of Δt. Ns stands for the number of spins of a phantom. x is a matrix which rows represents different spins and columns are different times and the elements are the field Gx * x + Gy * y + Gz * z values.\n\nArguments\n\nΔt: (1 x NΔt ::Matrix{Float64}, [s]) delta time 1-row array\nx: (Ns x (NΔt+1) ::Matrix{Float64}, [T]) magnitude of the field Gx * x + Gy * y + Gz * z\n\nReturns\n\ny: (Ns x 1 ::Matrix{Float64}, [T*s]) vector where every element is the integral of (Gx * x + Gy * y + Gz * z) * Δt for every spin of a phantom\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.cumtrapz","page":"KomaMRIBase","title":"KomaMRIBase.cumtrapz","text":"y = cumtrapz(Δt, x)\n\nTrapezoidal cumulative integration over time for every spin of a phantom.\n\nArguments\n\nΔt: (1 x NΔt ::Matrix{Float64}, [s]) delta time 1-row array\nx: (Ns x (NΔt+1) ::Matrix{Float64}, [T]) magnitude of the field Gx * x + Gy * y + Gz * z\n\nReturns\n\ny: (Ns x NΔt ::Matrix{Float64}, [T*s]) matrix where every column is the cumulative integration over time of (Gx * x + Gy * y + Gz * z) * Δt for every spin of a phantom\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.kfoldperm","page":"KomaMRIBase","title":"KomaMRIBase.kfoldperm","text":"array_of_ranges = kfoldperm(N, k; breaks=[])\n\nDivides a list of indices from 1 to N into k groups.\n\nArguments\n\nN: (::Integer) number of elements to be ordered\nk: (::Integer) number of groups to divide the N elements.\n\nKeywords\n\nbreaks: (::Vector{<:Integer}, =[]) array of indices where predefined breakpoints are placed.\n\nReturns\n\narray_of_ranges: (::Vector{UnitRange{<:Integer}}) array containing ranges of different groups. The target is k groups, but this could increase by adding elements to the breaks input array\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#Sequence-Building-Blocks-(SBB)","page":"KomaMRIBase","title":"Sequence Building Blocks (SBB)","text":"","category":"section"},{"location":"reference/2-koma-base/","page":"KomaMRIBase","title":"KomaMRIBase","text":"PulseDesigner\nPulseDesigner.RF_hard\nPulseDesigner.RF_sinc\nPulseDesigner.EPI\nPulseDesigner.radial_base\nPulseDesigner.spiral_base\nPulseDesigner.EPI_example","category":"page"},{"location":"reference/2-koma-base/#KomaMRIBase.PulseDesigner","page":"KomaMRIBase","title":"KomaMRIBase.PulseDesigner","text":"PulseDesigner\n\nA module to define different pulse sequences.\n\n\n\n\n\n","category":"module"},{"location":"reference/2-koma-base/#KomaMRIBase.PulseDesigner.RF_hard","page":"KomaMRIBase","title":"KomaMRIBase.PulseDesigner.RF_hard","text":"seq = RF_hard(B1, T, sys; G=[0, 0, 0], Δf=0)\n\nReturns a sequence with a RF excitation pulse.\n\nArguments\n\nB1: (::Number, [T]) RF pulse amplitude\nT: (::Real, [s]) RF pulse duration\nsys: (::Scanner) Scanner struct\n\nKeywords\n\nG: (::Vector{Real}, =[0, 0, 0], [T/m]) gradient amplitudes for x, y, z\nΔf: (::Real, =0, [Hz]) RF pulse carrier frequency displacement\n\nReturns\n\nseq: (::Sequence) Sequence struct with a RF pulse\n\nExamples\n\njulia> sys = Scanner(); durRF = π / 2 / (2π * γ * sys.B1);\n\njulia> seq = PulseDesigner.RF_hard(sys.B1, durRF, sys);\n\njulia> plot_seq(seq)\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.PulseDesigner.RF_sinc","page":"KomaMRIBase","title":"KomaMRIBase.PulseDesigner.RF_sinc","text":"seq = RF_sinc(B1, T, sys; G=[0, 0, 0], Δf=0, a=0.46, TBP=4)\n\nReturns a sequence with a RF sinc waveform.\n\nReferences\n\nMatt A. Bernstein, Kevin F. King, Xiaohong Joe Zhou, Chapter 2 - Radiofrequency Pulse\n\nShapes, Handbook of MRI Pulse Sequences, 2004, Pages 35-66, https://doi.org/10.1016/B978-012092861-3/50006-6.\n\nArguments\n\nB1: (::Number, [T]) RF sinc amplitude\nT: (::Real, [s]) RF sinc duration\nsys: (::Scanner) Scanner struct\n\nKeywords\n\nG: (::Vector{Real}, =[0, 0, 0], [T/m]) gradient amplitudes for x, y, z\nΔf: (::Real, =0, [Hz]) RF pulse carrier frequency displacement\na: (::Real, =0.46) height appodization window parameter\nTBP: (::Real, =4) width appodization window parameter\n\nReturns\n\nseq: (::Sequence) Sequence struct with a RF pulse\n\nExamples\n\njulia> sys = Scanner(); durRF = π / 2 / (2π * γ * sys.B1);\n\njulia> seq = PulseDesigner.RF_sinc(sys.B1, durRF, sys);\n\njulia> plot_seq(seq)\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.PulseDesigner.EPI","page":"KomaMRIBase","title":"KomaMRIBase.PulseDesigner.EPI","text":"seq = EPI(FOV::Real, N::Integer, sys::Scanner)\n\nReturns a sequence with EPI gradients.\n\nArguments\n\nFOV: (::Real, [m]) field of view\nN: (::Integer) number of pixels in the x and y axis\nsys: (::Scanner) Scanner struct\n\nReturns\n\nseq: (::Sequence) Sequence struct with EPI gradients\n\nExamples\n\njulia> sys, FOV, N = Scanner(), 23e-2, 101\n\njulia> seq = PulseDesigner.EPI(FOV, N, sys)\n\njulia> plot_seq(seq)\n\njulia> plot_kspace(seq)\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.PulseDesigner.radial_base","page":"KomaMRIBase","title":"KomaMRIBase.PulseDesigner.radial_base","text":"seq = radial_base(FOV::Real, Nr::Integer, sys::Scanner)\n\nReturns a sequence with radial gradients for a single trajectory.\n\nArguments\n\nFOV: (::Real, [m]) field of view\nN: (::Integer) number of pixels along the diameter\nsys: (::Scanner) Scanner struct\n\nReturns\n\nseq: (::Sequence) Sequence struct of a single radial trajectory\n\nExamples\n\njulia> sys, FOV, N = Scanner(), 23e-2, 101\n\njulia> seq = PulseDesigner.radial_base(FOV, N, sys)\n\njulia> plot_seq(seq)\n\njulia> plot_kspace(seq)\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.PulseDesigner.spiral_base","page":"KomaMRIBase","title":"KomaMRIBase.PulseDesigner.spiral_base","text":"spiral = spiral_base(FOV, N, sys; S0=sys.Smax*2/3, Nint=8, λ=Nint/FOV, BW=60e3)\n\nDefinition of a spiral base sequence.\n\nReferences\n\nGlover, G.H. (1999), Simple analytic spiral K-space algorithm. Magn. Reson. Med.,\n\n42: 412-415. https://doi.org/10.1002/(SICI)1522-2594(199908)42:2<412::AID-MRM25>3.0.CO;2-U\n\nArguments\n\nFOV: (::Real, [m]) field of view\nN: (::Integer) number of pixels along the radious\nsys: (::Scanner) Scanner struct\n\nKeywords\n\nS0: (::Vector{Real}, =sys.Smax*2/3, [T/m/s]) slew rate reference\nNint: (::Integer, =8) number of interleaves\nλ: (::Real, =Nint/FOV, [1/m]) kspace spiral parameter\nBW: (::Real, =60e3, [Hz]) adquisition parameter\n\nReturns\n\nspiral: (::Function) function that returns a Sequence struct when evaluated\n\nExamples\n\njulia> sys, FOV, N = Scanner(), 23e-2, 101\n\njulia> spiral = PulseDesigner.spiral_base(FOV, N, sys)\n\njulia> seq = spiral(0)\n\njulia> plot_seq(seq)\n\n\n\n\n\n","category":"function"},{"location":"reference/2-koma-base/#KomaMRIBase.PulseDesigner.EPI_example","page":"KomaMRIBase","title":"KomaMRIBase.PulseDesigner.EPI_example","text":"seq = EPI_example(; sys=Scanner())\n\nReturns a sequence suitable for acquiring the 2D brain example in the provided examples.\n\nKeywords\n\nsys: (::Scanner) Scanner struct\n\nReturns\n\nseq: (::Sequence) EPI example Sequence struct\n\nExamples\n\njulia> seq = PulseDesigner.EPI_example();\n\njulia> plot_seq(seq)\n\n\n\n\n\n","category":"function"},{"location":"how-to/4-run-distributed-simulations/#Run-Distributed-Simulations","page":"Run Distributed Simulations","title":"Run Distributed Simulations","text":"","category":"section"},{"location":"how-to/4-run-distributed-simulations/","page":"Run Distributed Simulations","title":"Run Distributed Simulations","text":"While KomaMRI provides built-in support for CPU and GPU parallelization, it is sometimes desirable to distribute simulation work even further across multiple GPUs or compute nodes. This can be done by using Distributed.jl and making use of the independent spin property: each spin in the system is independent from the rest, so the phantom spins can be subdivided into separate simulations and results recombined, as in the diagram below:","category":"page"},{"location":"how-to/4-run-distributed-simulations/","page":"Run Distributed Simulations","title":"Run Distributed Simulations","text":"
","category":"page"},{"location":"how-to/4-run-distributed-simulations/","page":"Run Distributed Simulations","title":"Run Distributed Simulations","text":"The following two examples demonstrate how to use Distributed.jl to run a simulation using multiple GPUS, and using multiple nodes in an HPC cluster.","category":"page"},{"location":"how-to/4-run-distributed-simulations/#Using-Multiple-GPUs","page":"Run Distributed Simulations","title":"Using Multiple GPUs","text":"","category":"section"},{"location":"how-to/4-run-distributed-simulations/","page":"Run Distributed Simulations","title":"Run Distributed Simulations","text":"To run a simulation using multiple GPUs, the phantom object can be divided using the kfoldperm function. Distributed.jl can then be used to start one Julia worker process per available device so that each device simulates a different part of the object. The results can then be fetched asynchronously by the main process and combined to produce a final signal. This is shown in the following diagram: ","category":"page"},{"location":"how-to/4-run-distributed-simulations/","page":"Run Distributed Simulations","title":"Run Distributed Simulations","text":"
","category":"page"},{"location":"how-to/4-run-distributed-simulations/","page":"Run Distributed Simulations","title":"Run Distributed Simulations","text":"The SLURM SBATCH script below requests 4 GPUs, all on a single computer. The Julia code then distributes work among each GPU:","category":"page"},{"location":"how-to/4-run-distributed-simulations/","page":"Run Distributed Simulations","title":"Run Distributed Simulations","text":"details: SLURM Script Requesting Multiple GPUs\n#!/bin/bash\n#SBATCH --job-name KomaDistributed # Job name\n#SBATCH -t 0-00:30 # Max runtime for job\n#SBATCH -p batch # Enter partition on which to run the job\n#SBATCH --ntasks=1 # 1 task\n#SBATCH --cpus-per-task=1 # Request 1 CPU\n#SBATCH --gpus=4 # Request 4 GPUs\n#SBATCH -o /mnt/workspace/%u/slurm-out/%test.out # Enter file path to write stdout to\n#SBATCH -e /mnt/workspace/%u/slurm-out/%test.err # Enter file path to write stderr to\n\nmodule load julia/1.10.2\njulia script.jl","category":"page"},{"location":"how-to/4-run-distributed-simulations/","page":"Run Distributed Simulations","title":"Run Distributed Simulations","text":"using Distributed\nusing CUDA\n\n#Add workers based on the number of available devices\naddprocs(length(devices()))\n\n#Define inputs on each worker process\n@everywhere begin\n using KomaMRI, CUDA\n sys = Scanner()\n seq = PulseDesigner.EPI_example()\n obj = brain_phantom2D()\n #Divide phantom\n parts = kfoldperm(length(obj), nworkers())\nend\n\n#Distribute simulation across workers\nraw = Distributed.@distributed (+) for i=1:nworkers()\n KomaMRICore.set_device!(i-1) #Sets device for this worker, note that CUDA devices are indexed from 0\n simulate(obj[parts[i]], seq, sys)\nend","category":"page"},{"location":"how-to/4-run-distributed-simulations/#Using-Multiple-Nodes-in-an-HPC-Cluster","page":"Run Distributed Simulations","title":"Using Multiple Nodes in an HPC Cluster","text":"","category":"section"},{"location":"how-to/4-run-distributed-simulations/","page":"Run Distributed Simulations","title":"Run Distributed Simulations","text":"This example uses the package ClusterManagers.jl to initialize worker processes on a SLURM cluster based on the number of tasks specified in the #SBATCH –ntasks directive. This can be useful to divide simulation work among multiple compute nodes if the problem is too large to fit into memory for a single computer, or if the number of desired workers is greater than the typical number of CPU cores available. An illustration of this is shown below:","category":"page"},{"location":"how-to/4-run-distributed-simulations/","page":"Run Distributed Simulations","title":"Run Distributed Simulations","text":"
","category":"page"},{"location":"how-to/4-run-distributed-simulations/","page":"Run Distributed Simulations","title":"Run Distributed Simulations","text":"This SBATCH script requests 20 separate nodes, with each taking a single task. The Julia code is similar to the example for multiple GPUs, but initializes the processes slightly differently:","category":"page"},{"location":"how-to/4-run-distributed-simulations/","page":"Run Distributed Simulations","title":"Run Distributed Simulations","text":"details: SLURM Script Requesting Multiple Nodes\n#!/bin/bash\n#SBATCH --job-name KomaDistributed # Job name\n#SBATCH -t 0-00:30 # Max runtime for job\n#SBATCH -p batch # Enter partition on which to run the job\n#SBATCH --nodes=20 # 20 nodes\n#SBATCH --ntasks=20 # 20 tasks\n#SBATCH --ntasks-per-node=1 # 1 task per node\n#SBATCH --cpus-per-task=4 # 4 CPUs per task\n#SBATCH -o /mnt/workspace/%u/slurm-out/%test.out # Enter file path to write stdout to\n#SBATCH -e /mnt/workspace/%u/slurm-out/%test.err # Enter file path to write stderr to\n\nmodule load julia/1.10.2\njulia script.jl","category":"page"},{"location":"how-to/4-run-distributed-simulations/","page":"Run Distributed Simulations","title":"Run Distributed Simulations","text":"using Distributed\nusing ClusterManagers\n\n#Add workers based on the specified number of SLURM tasks\naddprocs(SlurmManager(parse(Int, ENV[\"SLURM_NTASKS\"])))\n\n#Define inputs on each worker process\n@everywhere begin\n using KomaMRI\n sys = Scanner()\n seq = PulseDesigner.EPI_example()\n obj = brain_phantom2D()\n parts = kfoldperm(length(obj), nworkers())\nend\n\n#Distribute simulation across workers\nraw = Distributed.@distributed (+) for i=1:nworkers()\n simulate(obj[parts[i]], seq, sys)\nend","category":"page"},{"location":"#Introduction","page":"🏠 Home","title":"Introduction","text":"","category":"section"},{"location":"","page":"🏠 Home","title":"🏠 Home","text":"KomaMRI is a Julia package meant to simulate general Magnetic Resonance Imaging (MRI) scenarios. Its name comes from the Japanese word for spinning-top こま (ko-ma) as they precess due to gravity like spins in a magnetic field.","category":"page"},{"location":"","page":"🏠 Home","title":"🏠 Home","text":"KomaMRI generates raw data by solving the Bloch equations using the specified scanner, phantom and sequence. It also provides a Graphical User Interface (GUI) that encapsulates the whole imaging pipeline (simulation and reconstruction).","category":"page"},{"location":"","page":"🏠 Home","title":"🏠 Home","text":"
\n
","category":"page"},{"location":"","page":"🏠 Home","title":"🏠 Home","text":"We organized the documentation following the philosophy presented by David Laing.","category":"page"},{"location":"","page":"🏠 Home","title":"🏠 Home","text":"details: How to Cite Koma\nIf you use Koma, please cite our paper:Plain Text:Castillo-Passi, C, Coronado, R, Varela-Mattatall, G, Alberola-López, C, Botnar, R, Irarrazaval, P. KomaMRI.jl: An open-source framework for general MRI simulations with GPU acceleration. Magn Reson Med. 2023; 1- 14. doi: 10.1002/mrm.29635BibTex:@article{https://doi.org/10.1002/mrm.29635,\n author = {Castillo-Passi, Carlos and Coronado, Ronal and Varela-Mattatall, Gabriel and Alberola-López, Carlos and Botnar, René and Irarrazaval, Pablo},\n title = {KomaMRI.jl: An open-source framework for general MRI simulations with GPU acceleration},\n journal = {Magnetic Resonance in Medicine},\n keywords = {Bloch equations, GPU, GUI, Julia, open source, simulation},\n doi = {https://doi.org/10.1002/mrm.29635},\n url = {https://onlinelibrary.wiley.com/doi/abs/10.1002/mrm.29635},\n eprint = {https://onlinelibrary.wiley.com/doi/pdf/10.1002/mrm.29635},\n}","category":"page"},{"location":"#Features","page":"🏠 Home","title":"Features","text":"","category":"section"},{"location":"","page":"🏠 Home","title":"🏠 Home","text":"Fast simulations by using CPU and GPU parallelization 🏃💨.\nOpen Source, so anyone can include additional features 🆙.\nCompatibility with community-standards 🤝 like Pulseq .seq and ISMRMRD .mrd.\nCompatibility with Pluto and Jupyter notebooks 🎈\nInteractive visualizations using PlotlyJS.jl 📲\nCross-platform 🌐 thanks to the use of the Julia programming language.\nFriendly user interface for people with no programming skills 😌.\nFlexible API for advanced users 👨💻.","category":"page"},{"location":"#Potential-Use-Cases","page":"🏠 Home","title":"Potential Use Cases","text":"","category":"section"},{"location":"","page":"🏠 Home","title":"🏠 Home","text":"The generation of synthetic data to train Machine Learning models.\nTo test novel pulse sequences before implementing them directly in a real scanner (with a Pulseq sequence).\nTeaching exercises for MRI acquisition or reconstruction.","category":"page"},{"location":"explanation/1-sequence/#Sequence","page":"Sequence","title":"Sequence","text":"","category":"section"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"This section delves into some details about how a sequence is constructed. The sequence definition in KomaMRI is strongly related to the Pulseq definition. After reading this section, you should be able to create your own Sequence structs for conducting custom simulations using the KomaMRI package.","category":"page"},{"location":"explanation/1-sequence/#Sequence-Overview","page":"Sequence","title":"Sequence Overview","text":"","category":"section"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"Let's introduce the following simple sequence figure to expand from a visual example to a more general sequence definition:","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"
","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"A sequence can be thought of as an ordered concatenation of blocks over time. Each block is essentially a sequence with a length of 1. Every block consists of an RF pulse, the (xyz) gradients, and the acquisition of samples. Each block also has an associated time duration. To simplify, we will refer to these components as follows:","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"beginmatrix*l\ntextseqi textblock i of the sequence \ntextseqRFi textRF pulse at the i block \ntextseqGRxi textgradient x at the i block \ntextseqGRyi textgradient y at the i block \ntextseqGRzi textgradient z at the i block \ntextseqADCi textacquisition at the i block \ntextseqDURi textduration at the i block\nendmatrix*","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"The best way to understand the Sequence struct in KomaMRI is by examining the source code where this struct is defined:","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"mutable struct Sequence\n GR::Array{Grad,2}\n RF::Array{RF,2}\n ADC::Array{ADC,1}\n DUR::Array{Any,1}\n DEF::Dict{String,Any}\nend","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"As you can see, a Sequence struct contains 5 field names: ''DEF'' contains information for reconstruction steps (so it is not mandatory to fill it), ''DUR'' is a vector that contains the time durations of each block, ''ADC'' is also a vector with the acquisition samples for every block (an vector of ADC structs), ''GR'' is a 2D matrix which 3 rows representing the x-y-z gradients and columns having the samples of each block (a matrix of Grad structs) and ''RF'' is also a 2D matrix where each row represents a different coil and the columns are for different block samples too (a matrix of RF structs). The RF, Grad and ADC are MRI events that will be explained in the section Events Definitions.","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"warning: Warning\nSo far, KomaMRI can only manage one coil for RF excitations. However, in future versions, parallel transmit pTX will be managed by adding more ``rows'' to the RF matrix of the Sequence field name.","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"In order to understand how a Sequence struct can be manipulated in Julia, let's use the EPI sequence example. You can display basic information of the Sequence variable in the Julia REPL:","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"julia> seq = PulseDesigner.EPI_example()\nSequence[ τ = 62.846 ms | blocks: 204 | ADC: 101 | GR: 205 | RF: 1 | DEF: 5 ]","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"As you can see, this Sequence has 204 blocks, 1 of these blocks has an RF struct with values different from zero, there are 205 number of Grad structs considering the x-y-z components, 101 ADC structs acquire samples of some blocks and 62.846 ms is the total time duration of the complete Sequence.","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"To display the sequence in an graph, we can use the plot_seq function:","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"julia> plot_seq(seq; slider=false)","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":" ","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"This way, you can see exactly where the RF, Grad and ADC structs are located in time.","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"You can access and filter information for the RF, Grad, ADC, and DUR field names of a Sequence using the dot notation. This allows you to display helpful information about the organization of the Sequence struct:","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"julia> seq.RF\n1×204 Matrix{RF}:\n ⊓(0.5872 ms) ⇿(0.0 ms) ⇿(0.0 ms) … ⇿(0.0 ms) ⇿(0.0 ms) \n\njulia> seq.GR\n3×204 Matrix{Grad}:\n ⇿(0.5872 ms) ⊓(0.4042 ms) ⊓(0.4042 ms) … ⇿(0.2062 ms) ⊓(0.4042 ms) ⊓(0.4042 ms)\n ⇿(0.5872 ms) ⊓(0.4042 ms) ⇿(0.4042 ms) ⊓(0.2062 ms) ⇿(0.4042 ms) ⊓(0.4042 ms)\n ⇿(0.5872 ms) ⇿(0.0 ms) ⇿(0.0 ms) ⇿(0.0 ms) ⇿(0.0 ms) ⇿(0.0 ms)\n\njulia> seq.ADC\n204-element Vector{ADC}:\n ADC(0, 0.0, 0.0, 0.0, 0.0)\n ADC(0, 0.0, 0.0, 0.0, 0.0)\n ADC(101, 0.00019999999999999998, 0.00010211565434713023, 0.0, 0.0)\n ⋮\n ADC(101, 0.00019999999999999998, 0.00010211565434713023, 0.0, 0.0)\n ADC(0, 0.0, 0.0, 0.0, 0.0)\n\njulia> seq.DUR\n204-element Vector{Float64}:\n 0.0005871650124959989\n 0.0004042313086942605\n 0.0004042313086942605\n ⋮\n 0.0004042313086942605\n 0.0004042313086942605","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"Additionally, you can access a subset of blocks in a Sequence by slicing or indexing. The result will also be a Sequence struct, allowing you to perform the same operations as you would with a full Sequence. For example, if you want to analyze the first 11 blocks, you can do the following:","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"julia> seq[1:11]\nSequence[ τ = 3.837 ms | blocks: 11 | ADC: 5 | GR: 11 | RF: 1 | DEF: 5 ]\n\njulia> seq[1:11].GR\n3×11 Matrix{Grad}:\n ⇿(0.5872 ms) ⊓(0.4042 ms) ⊓(0.4042 ms) … ⊓(0.4042 ms) ⇿(0.2062 ms) ⊓(0.4042 ms)\n ⇿(0.5872 ms) ⊓(0.4042 ms) ⇿(0.4042 ms) ⇿(0.4042 ms) ⊓(0.2062 ms) ⇿(0.4042 ms)\n ⇿(0.5872 ms) ⇿(0.0 ms) ⇿(0.0 ms) ⇿(0.0 ms) ⇿(0.0 ms) ⇿(0.0 ms)\n\njulia> plot_seq(seq[1:11]; slider=false)","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":" ","category":"page"},{"location":"explanation/1-sequence/#Concatenation-of-Sequences","page":"Sequence","title":"Concatenation of Sequences","text":"","category":"section"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"Sequences can be concatenated side by side. The example below demonstrates how to concatenate sequences:","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":"julia> s = PulseDesigner.EPI_example()[1:11]\nSequence[ τ = 3.837 ms | blocks: 11 | ADC: 5 | GR: 11 | RF: 1 | DEF: 5 ]\n\njulia> seq = s + s + s\nSequence[ τ = 11.512 ms | blocks: 33 | ADC: 15 | GR: 33 | RF: 3 | DEF: 5 ]\n\njulia> plot_seq(seq; slider=false)","category":"page"},{"location":"explanation/1-sequence/","page":"Sequence","title":"Sequence","text":" ","category":"page"},{"location":"reference/1-api/#API-Overview","page":"API Overview","title":"API Overview","text":"","category":"section"},{"location":"reference/1-api/","page":"API Overview","title":"API Overview","text":"
","category":"page"},{"location":"reference/1-api/","page":"API Overview","title":"API Overview","text":"KomaMRI is divided into the following sub-packages:","category":"page"},{"location":"reference/1-api/","page":"API Overview","title":"API Overview","text":"KomaMRIBase: Custom types and functions\nKomaMRICore: Simulation functions\nKomaMRIFiles: File I/O functions\nKomaMRIPlots: Plotting functions\nKomaMRI: User Interface","category":"page"},{"location":"reference/1-api/","page":"API Overview","title":"API Overview","text":"The idea of separating the package into sub-packages is to make it easier to maintain and to allow users to use only the parts they need. Two common use-cases can be:","category":"page"},{"location":"reference/1-api/","page":"API Overview","title":"API Overview","text":"GUI users: They will use the KomaMRI package to interact with the GUI. Internally this includes al the others.\nAdvanced users: They will use the sub-packages directly to build their own scripts or notebooks, for simulation only KomaMRICore is required.","category":"page"}]
}
diff --git a/dev/tutorial-pluto/01-gradient-echo-spin-echo.html b/dev/tutorial-pluto/01-gradient-echo-spin-echo.html
index 503cd6072..4ccd19432 100644
--- a/dev/tutorial-pluto/01-gradient-echo-spin-echo.html
+++ b/dev/tutorial-pluto/01-gradient-echo-spin-echo.html
@@ -13,7 +13,7 @@
window.pluto_disable_ui = true;
window.pluto_slider_server_url = undefined;
window.pluto_binder_url = "https://mybinder.org/v2/gh/fonsp/pluto-on-binder/v0.19.46";
-window.pluto_statefile = "data:;base64,3gARpWJvbmRzgKxjZWxsX3Jlc3VsdHPeAC7ZJDU4YmU0MTUwLTJiN2EtNGY5ZS1hN2Q3LTQwYTA4NmZkM2E1M4qmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnZdDxzY3JpcHQ+CmNvbnN0IHtkZWZhdWx0OiBjb25mZXR0aX0gPSBhd2FpdCBpbXBvcnQoImh0dHBzOi8vY2RuLnNreXBhY2suZGV2L2NhbnZhcy1jb25mZXR0aUAxIikKY29uZmV0dGkoKQo8L3NjcmlwdD4KpG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv6MVRVbBsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQ1OGJlNDE1MC0yYjdhLTRmOWUtYTdkNy00MGEwODZmZDNhNTO5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4ALxSztXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkZjExYTJmYTItZWZmOS00OTc5LWI3MzktM2RhMmIyNGE5YTQ1iqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedoCLjxkaXYgY2xhc3M9Im1hcmtkb3duIj48cD5HZW5lcmF0ZSBhIHZpcnR1YWwgb2JqZWN0OjwvcD4KPHVsPgo8bGk+PHA+JiM0MDsxLjQmIzQxOyBBIFBoYW50b20gd2l0aCAyMCBzcGlucywgd2l0aCBwcm9wZXJ0aWVzOjwvcD4KPHVsPgo8bGk+PHA+PGNvZGU+b2JqLng8L2NvZGU+ICAmIzYxOyAmIzkxOy0xLCAxJiM5MzsgbW0gJiM0MDsyMCBzcGlucyBhbG9uZyB0aGUgPHNwYW4gY2xhc3M9InRleCI+JHgkPC9zcGFuPi1heGlzJiM0MTs8L3A+CjwvbGk+CjxsaT48cD48Y29kZT5vYmouz4E8L2NvZGU+ICAuJiM2MTsgMTwvcD4KPC9saT4KPGxpPjxwPjxjb2RlPm9iai5UMTwvY29kZT4gLiYjNjE7IDUwMCBtczwvcD4KPC9saT4KPGxpPjxwPjxjb2RlPm9iai5UMjwvY29kZT4gLiYjNjE7IDUwIG1zPC9wPgo8L2xpPgo8L3VsPgo8L2xpPgo8bGk+PHA+JiM0MDsxLjUmIzQxOyBQbG90IHRoZSBnZW5lcmF0ZWQgPGNvZGU+UGhhbnRvbTwvY29kZT4gJiM0MDtjaGVjayA8Y29kZT5wbG90X3BoYW50b21fbWFwPC9jb2RlPiYjMzk7cyBkb2NzJiM0MTs8L3A+CjwvbGk+CjwvdWw+CjwvZGl2PqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b+i8H6Ab7BwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkZjExYTJmYTItZWZmOS00OTc5LWI3MzktM2RhMmIyNGE5YTQ1uWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAApTLbVwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDk3MTA0YzQ2LWU4MWYtNDQ0YS05NTdmLTBiYmIxYjAyZjFiOIqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnaCe48ZGl2IGNsYXNzPSJtYXJrZG93biI+PGgxPjMuIDxzcGFuIGNsYXNzPSJ0ZXgiPiRUXyYjMTIzOzImIzEyNTteJiMxMjM7KiYjMTI1OyQ8L3NwYW4+LWRlY2F5PC9oMT4KPHA+VGhlIDxzcGFuIGNsYXNzPSJ0ZXgiPiRUXyYjMTIzOzImIzEyNTteJiMxMjM7KiYjMTI1OyQ8L3NwYW4+LWRlY2F5IGlzIHRoZSBzaWduYWwgZGVjYXkgcHJvZHVjZWQgYnkgbWljcm9zY29waWMgZGlzdHJpYnV0aW9uIG9mIG9mZi1yZXNvbmFuY2UuPC9wPgo8aW1nIGNvbnRyb2xzPScnIHNyYz0naHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0xJQlJFaHViL01SSS1wcm9jZXNzaW5nLTIwMjMvbWFpbi8wMi1zaW11bGF0aW9uL0ZpZ3VyZXMvVDJzdGFyLnBuZycgdHlwZT0naW1hZ2UvcG5nJyB3aWR0aD0nNDAwcHgnPjwvaW1nPgo8cD5UaGUgZXhhY3QgZGlzdHJpYnV0aW9uIG9mIG9mZi1yZXNvbmFuY2UgaXM8L3A+CjxwIGNsYXNzPSJ0ZXgiPiQkcF8mIzEyMztcRGVsdGEgdyYjMTI1OyYjNDA7dyYjNDE7ICYjNjE7IFxmcmFjJiMxMjM7VF8yXiYjMTIzOyYjMzk7JiMxMjU7JiMxMjU7JiMxMjM7XHBpJiM0MDsxJiM0MztUXzJeJiMxMjM7JiMzOTsyJiMxMjU7IHdeMiYjNDE7JiMxMjU7LFxxdWFkXHRleHQmIzEyMzt3aXRoICYjMTI1O1xmcmFjJiMxMjM7MSYjMTI1OyYjMTIzO1RfMl4mIzEyMzsqJiMxMjU7JiMxMjU7ICYjNjE7IFxmcmFjJiMxMjM7MSYjMTI1OyYjMTIzO1RfMiYjMTI1OyAmIzQzOyBcZnJhYyYjMTIzOzEmIzEyNTsmIzEyMztUXzJeJiMxMjM7JiMzOTsmIzEyNTsmIzEyNTsuJCQ8L3A+CjxwPkluIHRoaXMgZXhjZXJjaXNlIHdlIHdpbGwgc2ltcGxpZnkgdGhpcyBkaXN0cmlidXRpb24sIGJ1dCB3ZSB3aWxsIG9idGFpbiBhIHNpbWlsYXIgZWZmZWN0LjwvcD4KPHVsPgo8bGk+PHA+JiM0MDszLjEmIzQxOyBDcmVhdGUgYSBuZXcgcGhhbnRvbSBuYW1lZCA8Y29kZT5vYmpfdDJzdGFyPC9jb2RlPiB3aXRoIHNwaW5zIGF0IHRoZSBzYW1lIHBvc2l0aW9ucyBhcyB0aGUgb3JpZ2luYWwgcGhhbnRvbSA8Y29kZT5vYmo8L2NvZGU+LCBlYWNoIGhhdmluZyBhIGxpbmVhciBkaXN0cmlidXRpb24gb2Ygb2ZmLXJlc29uYW5jZS4gVG8gYWNoaWV2ZSB0aGlzLCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPgo8dWw+CjxsaT48cD4mIzQwOzMuMS4xJiM0MTsgQ3JlYXRlIGFuIGVtcHR5IHBoYW50b20gY2FsbGVkIDxjb2RlPm9ial90MnN0YXI8L2NvZGU+LjwvcD4KPC9saT4KPGxpPjxwPiYjNDA7My4xLjImIzQxOyBDcmVhdGUgYSBsaW5lYXIgb2ZmLXJlc29uYW5jZSBkaXN0cmlidXRpb24gc3VjaCB0aGF0IHRoZSByYW5nZSA8c3BhbiBjbGFzcz0idGV4Ij4kMlxwaSAmIzkxOy0xMCwgMTAmIzkzO1wsXG1hdGhybSYjMTIzO3JhZC9zJiMxMjU7JDwvc3Bhbj4gaXMgY292ZXJlZCB1bmlmb3JtbHkgd2l0aCA8c3BhbiBjbGFzcz0idGV4Ij4kTl8mIzEyMztcbWF0aHJtJiMxMjM7aXNvY2hyb21hdHMmIzEyNTsmIzEyNTsgJiM2MTsgMjAkPC9zcGFuPiAmIzQwO3VzZSB0aGUgZnVuY3Rpb24gPGNvZGU+cmFuZ2UmIzQwO3N0YXJ0LCBzdG9wLCBsZW5ndGgmIzQxOzwvY29kZT4mIzQxOy48L3A+CjwvbGk+CjxsaT48cD4mIzQwOzMuMS4zJiM0MTsgSXRlcmF0ZSBvdmVyIHRoZSBlbGVtZW50cyA8Y29kZT5vZmY8L2NvZGU+IG9mIHRoZSBsaW5lYXIgZGlzdHJpYnV0aW9uICYjNDA7PGNvZGU+Zm9yPC9jb2RlPiBsb29wJiM0MTsgYW5kIGNyZWF0ZSBjb3BpZXMgb2YgdGhlIG9yaWdpbmFsIHBoYW50b20gJiM0MDs8Y29kZT5vYmpfYXV4ICYjNjE7IGNvcHkmIzQwO29iaiYjNDE7PC9jb2RlPiYjNDE7IGFuZCBzZXQgdGhlIG9mZi1yZXNvbmFuY2Ugb2YgdGhhdCBjb3B5IHRvIDxjb2RlPm9mZjwvY29kZT4gd2l0aCA8Y29kZT5vYmpfYXV4Ls6UdyAuJiM2MTsgb2ZmPC9jb2RlPi48L3A+CjwvbGk+CjxsaT48cD4mIzQwOzMuMS40JiM0MTsgVXBkYXRlIDxjb2RlPm9ial90MnN0YXI8L2NvZGU+IGJ5IGFwcGVuZGluZyB0aGUgbW9kaWZpZWQgY29waWVzIDxjb2RlPm9ial9hdXg8L2NvZGU+ICYjNDA7PGNvZGU+b2JqX3Qyc3RhciAmIzQzOyYjNjE7IG9ial9hdXg8L2NvZGU+JiM0MTsuPC9wPgo8L2xpPgo8bGk+PHA+JiM0MDszLjEuNSYjNDE7IEZpbmFsbHksIG91dHNpZGUgdGhlIGxvb3AsIGRpdmlkZSB0aGUgcHJvdG9uIGRlbnNpdHkgPGNvZGU+b2JqX3Qyc3Rhci7PgTwvY29kZT4gYnkgPHNwYW4gY2xhc3M9InRleCI+JE5fJiMxMjM7XG1hdGhybSYjMTIzO2lzb2Nocm9tYXRzJiMxMjU7JiMxMjU7ICYjNjE7IDIwJDwvc3Bhbj4gYW5kIHJlbmFtZSB0aGUgcGhhbnRvbSA8Y29kZT5vYmpfdDJzdGFyLm5hbWUgJiM2MTsgJnF1b3Q7VDIgc3RhciBwaGFudG9tJnF1b3Q7PC9jb2RlPi48L3A+CjwvbGk+CjwvdWw+CjwvbGk+CjxsaT48cD4mIzQwOzMuMiYjNDE7IFBsb3QgPGNvZGU+b2JqX3Qyc3RhcjwvY29kZT4gd2l0aCA8Y29kZT5wbG90X3BoYW50b21fbWFwJiM0MDtvYmpfdDJzdGFyLCA6zpR3JiM0MTs8L2NvZGU+IGFuZCB2ZXJpZnkgaXQgaXMgY29ycmVjdDwvcD4KPC9saT4KPC91bD4KPC9kaXY+pG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv6MUkefAsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQ5NzEwNGM0Ni1lODFmLTQ0NGEtOTU3Zi0wYmJiMWIwMmYxYji5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4AE2xTtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkZTRjODBjMjQtMjBmZC00MmU1LTlkY2QtYTY1OTU4NTY5YzAxiqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedoGkjxkaXYgY2xhc3M9Im1hcmtkb3duIj48aDE+Mi4gR3JhZGllbnQgRWNobzwvaDE+CjxpbWcgY29udHJvbHM9Jycgc3JjPSdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vTElCUkVodWIvTVJJLXByb2Nlc3NpbmctMjAyMy9tYWluLzAyLXNpbXVsYXRpb24vRmlndXJlcy9HUkUuZ2lmJyB0eXBlPSdpbWFnZS9naWYnIHdpZHRoPSc0MDBweCc+PC9pbWc+CjxwPlRoZSBncmFkaWVudCBlY2hvIGlzIG9uZSBvZiB0aGUgZmlyc3Qgc3RlcHMgdG8gY3JlYXRlIGFuIGltYWdlLiBUaGUgYmlnICBicmVha3Rocm91Z2ggd2FzIHRoZSBhZGRpdGlvbiBvZiBsaW5lYXJseSBpbmNyZWFzaW5nIG1hZ25ldGljIGZpZWxkcywgb3IgZ3JhZGllbnRzLCB0byBlbmNvZGUgdGhlIHNwaW4mIzM5O3MgcG9zaXRpb25zIGluIHRoZWlyIGZyZXF1ZW5jeSAmIzQwO01tbWgsIHNvbWVvbmUgc2FpZCBGb3VyaWVyPyYjNDE7LiBUaGlzIHdvcmtzIGR1ZSB0byB0aGUgZmFjdCB0aGF0IHRoZSBmcmVxdWVuY3kgPHNwYW4gY2xhc3M9InRleCI+JGYkPC9zcGFuPiBvZiBhIHNwaW4gaXMgPC9wPgo8cCBjbGFzcz0idGV4Ij4kJGYmIzQwO3gmIzQxOyAmIzYxOyBcZnJhYyYjMTIzO1xnYW1tYSYjMTI1OyYjMTIzOzJccGkmIzEyNTsgQl96JiM0MDt4JiM0MTsgJiM2MTsgXGZyYWMmIzEyMztcZ2FtbWEmIzEyNTsmIzEyMzsyXHBpJiMxMjU7IEdfeCB4LiQkPC9wPgo8cD5MZXQmIzM5O3MgY3JlYXRlIGEgZGlmZmVyZW50IHNlcXVlbmNlLjwvcD4KPHVsPgo8bGk+PHA+Q3JlYXRlIGEgOTAtZGVnIGhhcmQgUkYgcHVsc2UgYW5kIHB1dCBpdCBpbiBhIHZhcmlhYmxlIDxjb2RlPnNlcV9ncmU8L2NvZGU+PC9wPgo8L2xpPgo8bGk+PHA+JiM0MDsyLjEmIzQxOyBDcmVhdGUgYSBncmFkaWVudCB3aXRoIGFyZWEgPGNvZGU+LUF4PC9jb2RlPiB1c2luZyA8Y29kZT5neF9wcmUgJiM2MTsgR3JhZCYjNDA7QSxULHJpc2UsZmFsbCYjNDE7PC9jb2RlPiBhcHBlbmQgdG8gPGNvZGU+c2VxX2dyZTwvY29kZT4uIEFzIGFuIG9wdGlvbmFsIGNoYWxsZW5nZSwgcHV0IDxjb2RlPmd4X3ByZS5yaXNlPC9jb2RlPiBhbmQgPGNvZGU+Z3hfcHJlLmZhbGw8L2NvZGU+IHNvIHRoZSBzYXRpc2Z5IHRoZSA8Y29kZT5zeXM8L2NvZGU+IHJlcXVpZXJlbWVudHM8L3A+CjwvbGk+CjxsaT48cD4mIzQwOzIuMiYjNDE7IEFwcGVuZCBhIDxjb2RlPlNlcXVlbmNlPC9jb2RlPiBibG9jayBjYWxsZWQgPGNvZGU+cmVhZG91dDwvY29kZT4gdGhhdCBpbmNsdWRlczogPC9wPgo8dWw+CjxsaT48cD5BIGdyYWRpZW50IG9mIHR3aWNlIHRoZSBhcmVhLCBvciA8Y29kZT4yQXg8L2NvZGU+LiBDYWxsIGl0IDxjb2RlPmd4PC9jb2RlPjwvcD4KPC9saT4KPGxpPjxwPkFuIDxjb2RlPkFEQzwvY29kZT4gd2l0aCA8Y29kZT5hZGMyLmRlbGF5ICYjNjE7IGd4LnJpc2U8L2NvZGU+IGFuZCA8Y29kZT5hZGMyLlQgJiM2MTsgZ3guVDwvY29kZT48L3A+CjwvbGk+CjwvdWw+CjwvbGk+CjxsaT48cD4mIzQwOzIuMyYjNDE7IFBsb3QgPGNvZGU+c2VxX2dyZTwvY29kZT4gYW5kIGl0cyBrLXNwYWNlPC9wPgo8L2xpPgo8bGk+PHA+JiM0MDsyLjQmIzQxOyBQbG90IHRoZSA8c3BhbiBjbGFzcz0idGV4Ij4kayQ8L3NwYW4+LXNwYWNlIHdpdGggdGhlIDxjb2RlPnBsb3Rfa3NwYWNlPC9jb2RlPiBmdW5jdGlvbjwvcD4KPC9saT4KPC91bD4KPC9kaXY+pG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv6MTI4bksHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SRlNGM4MGMyNC0yMGZkLTQyZTUtOWRjZC1hNjU5NTg1NjljMDG5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4Ahp9ltXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkMThjODJmZjEtMGJkZS00ZmEwLTg0OGMtZDBlYjczZDFhYzdjiqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedpqiQk8c2NyaXB0IGlkPSdwbG90XzEnPgoJCS8vIFdlIHN0YXJ0IGJ5IHB1dHRpbmcgYWxsIHRoZSB2YXJpYWJsZSBpbnRlcnBvbGF0aW9uIGhlcmUgYXQgdGhlIGJlZ2lubmluZwoJCS8vIFdlIGhhdmUgdG8gY29udmVydCBhbGwgdHlwZWRhcnJheXMgaW4gdGhlIGxheW91dCB0byBub3JtYWwgYXJyYXlzLiBTZWUgSXNzdWUgIzI1CgkJLy8gV2UgdXNlIGxvZGFzaCBmb3IgdGhpcyBmb3IgY29tcGFjdG5lc3MKCQlmdW5jdGlvbiByZW1vdmVUeXBlZEFycmF5KG8pIHsKCQkJcmV0dXJuIF8uaXNUeXBlZEFycmF5KG8pID8gQXJyYXkuZnJvbShvKSA6CgkJCV8uaXNQbGFpbk9iamVjdChvKSA/IF8ubWFwVmFsdWVzKG8sIHJlbW92ZVR5cGVkQXJyYXkpIDogCgkJCW8KCQl9CgoJCS8vIFB1Ymxpc2ggdGhlIHBsb3Qgb2JqZWN0IHRvIEpTCgkJbGV0IHBsb3Rfb2JqID0gXy51cGRhdGUoLyogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBBYnN0cmFjdFBsdXRvRGluZ2V0amVzLkRpc3BsYXkucHVibGlzaGVkX3RvX2pzICovIGdldFB1Ymxpc2hlZE9iamVjdCgiYjNiODQwOGMtODE4MS0xMWVmLTE0ZWItZTFjNTY5YjhiYjI5LzgwMzZmODBmZWNkOWY4MTciKSwgImxheW91dCIsIHJlbW92ZVR5cGVkQXJyYXkpCgkJLy8gR2V0IHRoZSBwbG90bHkgbGlzdGVuZXJzCgkJY29uc3QgcGxvdGx5X2xpc3RlbmVycyA9IHt9CgkJLy8gR2V0IHRoZSBKUyBsaXN0ZW5lcnMKCQljb25zdCBqc19saXN0ZW5lcnMgPSB7fQoJCS8vIERlYWwgd2l0aCBldmVudHVhbCBjdXN0b20gY2xhc3NlcwoJCWxldCBjdXN0b21fY2xhc3NsaXN0ID0gW10KCgoJCS8vIExvYWQgdGhlIHBsb3RseSBsaWJyYXJ5CgkJbGV0IFBsb3RseSA9IHVuZGVmaW5lZAoJCXRyeSB7CgkJCWxldCBfbW9kID0gYXdhaXQgaW1wb3J0KCIuL3Bsb3RseWpzL3Bsb3RseWpzLTIuMjYuMi5taW4uanMiKQoJCQlQbG90bHkgPSBfbW9kLmRlZmF1bHQKCQl9IGNhdGNoIChlKSB7CgkJCWNvbnNvbGUubG9nKCJMb2NhbCBsb2FkIGZhaWxlZCwgdHJ5aW5nIHdpdGggdGhlIHdlYiBlc20uc2ggdmVyc2lvbiIpCgkJCWxldCBfbW9kID0gYXdhaXQgaW1wb3J0KCJodHRwczovL2VzbS5zaC92MTM1L3Bsb3RseS5qcy1kaXN0LW1pbkAyLjI2LjIvZXNuZXh0L3Bsb3RseS5qcy1kaXN0LW1pbi5tanMiKQoJCQlQbG90bHkgPSBfbW9kLmRlZmF1bHQKCQl9CgoJCS8vIENoZWNrIGlmIHdlIGhhdmUgdG8gZm9yY2UgbG9jYWwgbWF0aGpheCBmb250IGNhY2hlCgkJaWYgKGZhbHNlICYmIHdpbmRvdz8uTWF0aEpheD8uY29uZmlnPy5zdmc/LmZvbnRDYWNoZSA9PT0gJ2dsb2JhbCcpIHsKCQkJd2luZG93Lk1hdGhKYXguY29uZmlnLnN2Zy5mb250Q2FjaGUgPSAnbG9jYWwnCgkJfQoKCQkvLyBGbGFnIHRvIGNoZWNrIGlmIHRoaXMgY2VsbCB3YXMgIG1hbnVhbGx5IHJhbiBvciByZWFjdGl2ZWx5IHJhbgpjb25zdCBmaXJzdFJ1biA9IHRoaXMgPyBmYWxzZSA6IHRydWUKY29uc3QgQ09OVEFJTkVSID0gdGhpcyA/PyBodG1sYDxkaXYgY2xhc3M9J3BsdXRvcGxvdGx5LWNvbnRhaW5lcic+YApjb25zdCBQTE9UID0gQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoJy5qcy1wbG90bHktcGxvdCcpID8/IENPTlRBSU5FUi5hcHBlbmRDaGlsZChodG1sYDxkaXY+YCkKY29uc3QgcGFyZW50ID0gQ09OVEFJTkVSLnBhcmVudEVsZW1lbnQKLy8gV2UgdXNlIGEgY29udHJvbGxlciB0byByZW1vdmUgZXZlbnQgbGlzdGVuZXJzIHVwb24gaW52YWxpZGF0aW9uCmNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCkKLy8gV2UgaGF2ZSB0byBhZGQgdGhpcyB0byBrZWVwIHN1cHBvcnRpbmcgQGJpbmQgd2l0aCB0aGUgb2xkIEFQSSB1c2luZyBQTE9UClBMT1QuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoZSkgPT4gewoJQ09OVEFJTkVSLnZhbHVlID0gUExPVC52YWx1ZQoJaWYgKGUuYnViYmxlcykgewoJCXJldHVybgoJfQoJQ09OVEFJTkVSLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdpbnB1dCcpKQp9LCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSkKCgkvLyBUaGlzIGNyZWF0ZSB0aGUgc3R5bGUgc3ViZGl2IG9uIGZpcnN0IHJ1bgoJZmlyc3RSdW4gJiYgQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgCgk8c3R5bGU+CgkucGx1dG9wbG90bHktY29udGFpbmVyIHsKCQl3aWR0aDogMTAwJTsKCQloZWlnaHQ6IDEwMCU7CgkJbWluLWhlaWdodDogMDsKCQltaW4td2lkdGg6IDA7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyIC5qcy1wbG90bHktcGxvdCAucGxvdGx5IGRpdiB7CgkJbWFyZ2luOiAwIGF1dG87IC8vIFRoaXMgY2VudGVycyB0aGUgcGxvdAoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5wb3BwZWQtb3V0IHsKCQlvdmVyZmxvdzogYXV0bzsKCQl6LWluZGV4OiAxMDAwOwoJCXBvc2l0aW9uOiBmaXhlZDsKCQlyZXNpemU6IGJvdGg7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwcHg7CgkJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDBweDsKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIHsKCQlkaXNwbGF5OiBmbGV4OwoJCWZsZXgtZmxvdzogcm93IHdyYXA7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMTJweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMTJweDsKCQlwb3NpdGlvbjogZml4ZWQ7CgkJei1pbmRleDogMTAwMTsKCQljdXJzb3I6IG1vdmU7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCAtMTAwJSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgc3BhbiB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCWZsZXg6IDEKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyLmhpZGRlbiB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3BhbiB7CgkJcG9zaXRpb246IHJlbGF0aXZlOwoJfQoJLmNsaXBib2FyZC12YWx1ZSB7CgkJcGFkZGluZy1yaWdodDogNXB4OwoJCXBhZGRpbmctbGVmdDogMnB4OwoJCWN1cnNvcjogdGV4dDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZmlsZW5hbWUgewoJCWZsZXg6IDAgMCAxMDAlOwoJCXRleHQtYWxpZ246IGNlbnRlcjsKCQlib3JkZXItdG9wOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJbWFyZ2luLXRvcDogNXB4OwoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5maWxlbmFtZSB7CgkJbWFyZ2luLWxlZnQ6IDNweDsKCQl0ZXh0LWFsaWduOiBsZWZ0OwoJCW1pbi13aWR0aDogbWluKDYwJSwgbWluLWNvbnRlbnQpOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5maWxlc2F2ZSAuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgLmxhYmVsIHsKCQlmbGV4OiAwIDAgMDsKCX0KCS5jbGlwYm9hcmQtdmFsdWUuZm9ybWF0IHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7CgkJZmxleDogMSAwIGF1dG87CgkJbWluLXdpZHRoOiAzMHB4OwoJCW1hcmdpbi1yaWdodDogMTBweDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyB7CgkJZGlzcGxheTogaW5saW5lLWZsZXg7CgkJZmxleC1mbG93OiBjb2x1bW47CgkJcG9zaXRpb246IGFic29sdXRlOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJcGFkZGluZy1sZWZ0OiAzcHg7CgkJei1pbmRleDogMjAwMDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9uczpob3ZlciB7CgkJY3Vyc29yOiBwb2ludGVyOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCXBhZGRpbmc6IDNweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtM3B4LCAtNnB4KTsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyAuZm9ybWF0LW9wdGlvbiB7CgkJZGlzcGxheTogbm9uZTsKCX0KCWRpdi5mb3JtYXQtb3B0aW9uczpob3ZlciAuZm9ybWF0LW9wdGlvbiB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246bm90KC5zZWxlY3RlZCkgewoJCW1hcmdpbi10b3A6IDNweDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyAuZm9ybWF0LW9wdGlvbi5zZWxlY3RlZCB7CgkJb3JkZXI6IC0xOwoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5mb3JtYXQtb3B0aW9uOmhvdmVyIHsKCQliYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCX0KCXNwYW4uY29uZmlnLXZhbHVlIHsKCQlmb250LXdlaWdodDogbm9ybWFsOwoJCWNvbG9yOiB2YXIoLS1wbHV0by1vdXRwdXQtY29sb3IpOwoJCWRpc3BsYXk6IG5vbmU7CgkJcG9zaXRpb246IGFic29sdXRlOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCBjYWxjKC0xMDAlIC0gMTBweCkpOwoJCXBhZGRpbmc6IDVweDsKCX0KCS5sYWJlbCB7CgkJdXNlci1zZWxlY3Q6IG5vbmU7Cgl9CgkubGFiZWw6aG92ZXIgc3Bhbi5jb25maWctdmFsdWUgewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQltaW4td2lkdGg6IDE1MHB4OwoJfQoJLmNsaXBib2FyZC1zcGFuLm1hdGNoaW5nLWNvbmZpZyAubGFiZWwgewoJCWNvbG9yOiB2YXIoLS1jbS1tYWNyby1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZGlmZmVyZW50LWNvbmZpZyAubGFiZWwgewoJCWNvbG9yOiB2YXIoLS1jbS10YWctY29sb3IpOwoJCWZvbnQtd2VpZ2h0OiBib2xkOwoJfQo8L3N0eWxlPgpgKQoKbGV0IG9yaWdpbmFsX2hlaWdodCA9IHBsb3Rfb2JqLmxheW91dC5oZWlnaHQKbGV0IG9yaWdpbmFsX3dpZHRoID0gcGxvdF9vYmoubGF5b3V0LndpZHRoCi8vIEZvciB0aGUgaGVpZ2h0IHdlIGhhdmUgdG8gYWxzbyBwdXQgYSBmaXhlZCB2YWx1ZSBpbiBjYXNlIHRoZSBwbG90IGlzIHB1dCBvbiBhIG5vbi1maXhlZC1zaXplIGNvbnRhaW5lciAobGlrZSB0aGUgZGVmYXVsdCB3cmFwcGVyKQovLyBXZSBkZWZpbmUgYSB2YXJpYWJsZSB0byBjaGVjayB3aGV0aGVyIHdlIHN0aWxsIGhhdmUgdG8gcmVtb3ZlIHRoZSBmaXhlZCBoZWlnaHQKbGV0IHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IGZpcnN0UnVuCmxldCBjb250YWluZXJfaGVpZ2h0ID0gb3JpZ2luYWxfaGVpZ2h0ID8/IFBMT1QuY29udGFpbmVyX2hlaWdodCA/PyA0MDAKQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9IGNvbnRhaW5lcl9oZWlnaHQgKyAncHgnCgovLyBXZSBjcmVhdGUgYSBQcm9taXNlIHZlcnNpb24gb2Ygc2V0VGltZW91dApmdW5jdGlvbiBkZWxheShtcykgewogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpOwp9CgovLyBXZSBpbXBvcnQgaW50ZXJhY3QgZm9yIGRyYWdnaW5nL3Jlc2l6aW5nCmNvbnN0IHsgZGVmYXVsdDogaW50ZXJhY3QgfSA9IGF3YWl0IGltcG9ydCgnaHR0cHM6Ly9lc20uc2gvaW50ZXJhY3Rqc0AxLjEwLjE5JykKCgpmdW5jdGlvbiBnZXRJbWFnZU9wdGlvbnMoKSB7CiAgY29uc3QgbyA9IHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICByZXR1cm4gewogICAgZm9ybWF0OiBvLmZvcm1hdCA/PyAicG5nIiwKICAgIHdpZHRoOiBvLndpZHRoID8/IG9yaWdpbmFsX3dpZHRoLAogICAgaGVpZ2h0OiBvLmhlaWdodCA/PyBvcmlnaW5hbF9oZWlnaHQsCiAgICBzY2FsZTogby5zY2FsZSA/PyAxLAogICAgZmlsZW5hbWU6IG8uZmlsZW5hbWUgPz8gIm5ld3Bsb3QiLAogIH07Cn0KCmNvbnN0IENMSVBCT0FSRF9IRUFERVIgPQogIENPTlRBSU5FUi5xdWVyeVNlbGVjdG9yKCIucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciIpID8/CiAgQ09OVEFJTkVSLmluc2VydEFkamFjZW50RWxlbWVudCgKICAgICJhZnRlcmJlZ2luIiwKICAgIGh0bWxgPGRpdiBjbGFzcz0icGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBoaWRkZW4iPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gZm9ybWF0IgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZvcm1hdDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBmb3JtYXQiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gd2lkdGgiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+V2lkdGg6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgd2lkdGgiPjwvc3Bhbj5weDwvc3BhbgogICAgICA+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBoZWlnaHQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+SGVpZ2h0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGhlaWdodCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHNjYWxlIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPlNjYWxlOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIHNjYWxlIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2V0Ij5TZXQ8L2J1dHRvbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gdW5zZXQiPlVuc2V0PC9idXR0b24+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmaWxlbmFtZSIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5GaWxlbmFtZTo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBmaWxlbmFtZSI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICA8L2Rpdj5gCiAgKTsKCmZ1bmN0aW9uIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpIHsKICBjb25zdCB2YWxpZF9jbGFzc2VzID0gWwogICAgIm1pc3NpbmctY29uZmlnIiwKICAgICJtYXRjaGluZy1jb25maWciLAogICAgImRpZmZlcmVudC1jb25maWciLAogIF07CiAgZnVuY3Rpb24gc2V0Q2xhc3MoY2wpIHsKICAgIGZvciAoY29uc3QgbmFtZSBvZiB2YWxpZF9jbGFzc2VzKSB7CiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKG5hbWUsIG5hbWUgPT0gY2wpOwogICAgfQogIH0KICAvLyBXZSB1c2UgdGhlIGN1c3RvbSBnZXR0ZXJzIHdlJ2xsIHNldCB1cCBpbiB0aGUgY29udGFpbmVyCiAgY29uc3QgeyB1aV92YWx1ZSwgY29uZmlnX3ZhbHVlLCBjb25maWdfc3Bhbiwga2V5IH0gPSBjb250YWluZXI7CiAgaWYgKGNvbmZpZ192YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICBzZXRDbGFzcygibWlzc2luZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaXMgbm90IHByZXNlbnQgaW4gdGhlIGNvbmZpZy5gOwogIH0gZWxzZSBpZiAodWlfdmFsdWUgPT0gY29uZmlnX3ZhbHVlKSB7CiAgICBzZXRDbGFzcygibWF0Y2hpbmctY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGhhcyB0aGUgc2FtZSB2YWx1ZSBpbiB0aGUgY29uZmlnIGFuZCBpbiB0aGUgaGVhZGVyLmA7CiAgfSBlbHNlIHsKICAgIHNldENsYXNzKCJkaWZmZXJlbnQtY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGhhcyBhIGRpZmZlcmVudCB2YWx1ZSAoPGVtPiR7Y29uZmlnX3ZhbHVlfTwvZW0+KSBpbiB0aGUgY29uZmlnLmA7CiAgfQogIC8vIEFkZCBpbmZvIGFib3V0IHNldHRpbmcgYW5kIHVuc2V0dGluZwogIGNvbmZpZ19zcGFuLmluc2VydEFkamFjZW50SFRNTCgKICAgICJiZWZvcmVlbmQiLAogICAgYDxicj5DbGljayBvbiB0aGUgbGFiZWwgPGVtPjxiPm9uY2U8L2I+PC9lbT4gdG8gc2V0IHRoZSBjdXJyZW50IFVJIHZhbHVlIGluIHRoZSBjb25maWcuYAogICk7CiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIDxlbT48Yj50d2ljZTwvYj48L2VtPiB0byByZW1vdmUgdGhpcyBrZXkgZnJvbSB0aGUgY29uZmlnLmAKICApOwp9Cgpjb25zdCB2YWxpZF9mb3JtYXRzID0gWyJwbmciLCAic3ZnIiwgIndlYnAiLCAianBlZyIsICJmdWxsLWpzb24iXTsKZnVuY3Rpb24gaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHNwYW4sIGtleSwgdmFsdWUpIHsKICBjb25zdCBjb250YWluZXIgPSBzcGFuLmNsb3Nlc3QoIi5jbGlwYm9hcmQtc3BhbiIpOwogIHNwYW4uY29udGVudEVkaXRhYmxlID0ga2V5ID09PSAiZm9ybWF0IiA/ICJmYWxzZSIgOiAidHJ1ZSI7CiAgbGV0IHBhcnNlID0gKHgpID0+IHg7CiAgbGV0IHVwZGF0ZSA9ICh4KSA9PiAoc3Bhbi50ZXh0Q29udGVudCA9IHgpOwogIGlmIChrZXkgPT09ICJ3aWR0aCIgfHwga2V5ID09PSAiaGVpZ2h0IikgewogICAgcGFyc2UgPSAoeCkgPT4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KHgpKTsKICB9IGVsc2UgaWYgKGtleSA9PT0gInNjYWxlIikgewogICAgcGFyc2UgPSBwYXJzZUZsb2F0OwogIH0gZWxzZSBpZiAoa2V5ID09PSAiZm9ybWF0IikgewogICAgLy8gV2UgcmVtb3ZlIGNvbnRlbnRFZGl0YWJsZQogICAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSAiZmFsc2UiOwogICAgLy8gSGVyZSB3ZSBmaXJzdCBhZGQgdGhlIHN1YnNwYW5zIGZvciBlYWNoIG9wdGlvbgogICAgY29uc3Qgb3B0c19kaXYgPSBzcGFuLmFwcGVuZENoaWxkKGh0bWxgPGRpdiBjbGFzcz0iZm9ybWF0LW9wdGlvbnMiPjwvZGl2PmApOwogICAgZm9yIChjb25zdCBmbXQgb2YgdmFsaWRfZm9ybWF0cykgewogICAgICBjb25zdCBvcHQgPSBvcHRzX2Rpdi5hcHBlbmRDaGlsZCgKICAgICAgICBodG1sYDxzcGFuIGNsYXNzPSJmb3JtYXQtb3B0aW9uICR7Zm10fSI+JHtmbXR9PC9zcGFuPmAKICAgICAgKTsKICAgICAgb3B0Lm9uY2xpY2sgPSAoZSkgPT4gewogICAgICAgIHNwYW4udmFsdWUgPSBvcHQudGV4dENvbnRlbnQ7CiAgICAgIH07CiAgICB9CiAgICBwYXJzZSA9ICh4KSA9PiB7CiAgICAgIHJldHVybiB2YWxpZF9mb3JtYXRzLmluY2x1ZGVzKHgpID8geCA6IGxvY2FsVmFsdWU7CiAgICB9OwogICAgdXBkYXRlID0gKHgpID0+IHsKICAgICAgZm9yIChjb25zdCBvcHQgb2Ygb3B0c19kaXYuY2hpbGRyZW4pIHsKICAgICAgICBvcHQuY2xhc3NMaXN0LnRvZ2dsZSgic2VsZWN0ZWQiLCBvcHQudGV4dENvbnRlbnQgPT09IHgpOwogICAgICB9CiAgICB9OwogIH0gZWxzZSB7CiAgICAvLyBXZSBvbmx5IGhhdmUgZmlsZW5hbWUgaGVyZQogIH0KICBsZXQgbG9jYWxWYWx1ZTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBsb2NhbFZhbHVlOwogICAgfSwKICAgIHNldDogKHZhbCkgPT4gewogICAgICBpZiAodmFsICE9PSAiIikgewogICAgICAgIGxvY2FsVmFsdWUgPSBwYXJzZSh2YWwpOwogICAgICB9CiAgICAgIHVwZGF0ZShsb2NhbFZhbHVlKTsKICAgICAgY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcik7CiAgICB9LAogIH0pOwogIC8vIFdlIGFsc28gYXNzaWduIGEgbGlzdGVuZXIgc28gdGhhdCB0aGUgZWRpdGFibGUgaXMgYmx1cnJlZCB3aGVuIGVudGVyIGlzIHByZXNzZWQKICBzcGFuLm9ua2V5ZG93biA9IChlKSA9PiB7CiAgICBpZiAoZS5rZXlDb2RlID09PSAxMykgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHNwYW4uYmx1cigpOwogICAgfQogIH07CiAgc3Bhbi52YWx1ZSA9IHZhbHVlOwp9CgpmdW5jdGlvbiBpbml0aWFsaXplQ29uZmlnVmFsdWVTcGFuKHNwYW4sIGtleSkgewogIC8vIEhlcmUgd2UgbW9zdGx5IHdhbnQgdG8gZGVmaW5lIHRoZSBzZXR0ZXIgYW5kIGdldHRlcgogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwYW4sICJ2YWx1ZSIsIHsKICAgIGdldDogKCkgPT4gewogICAgICByZXR1cm4gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV07CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIC8vIGlmIHVuZGVmaW5lZCBpcyBwYXNzZWQsIHdlIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgb3B0aW9ucwogICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsKICAgICAgICBkZWxldGUgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV0gPSB2YWw7CiAgICAgIH0KICAgICAgY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcik7CiAgICB9LAogIH0pOwp9Cgpjb25zdCBjb25maWdfc3BhbnMgPSB7fTsKZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZ2V0SW1hZ2VPcHRpb25zKCkpKSB7CiAgY29uc3QgY29udGFpbmVyID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKGAuY2xpcGJvYXJkLXNwYW4uJHtrZXl9YCk7CiAgY29uc3QgbGFiZWwgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmxhYmVsIik7CiAgLy8gV2UgZ2l2ZSB0aGUgbGFiZWwgYSBmdW5jdGlvbiB0aGF0IG9uIHNpbmdsZSBjbGljayB3aWxsIHNldCB0aGUgY3VycmVudCB2YWx1ZSBhbmQgd2l0aCBkb3VibGUgY2xpY2sgd2lsbCB1bnNldCBpdAogIGxhYmVsLm9uY2xpY2sgPSBEdWFsQ2xpY2soCiAgICAoKSA9PiB7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBjb250YWluZXIudWlfdmFsdWU7CiAgICB9LAogICAgKGUpID0+IHsKICAgICAgY29uc29sZS5sb2coImUiLCBlKTsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gdW5kZWZpbmVkOwogICAgfQogICk7CiAgY29uc3QgdWlfdmFsdWVfc3BhbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXZhbHVlIik7CiAgY29uc3QgY29uZmlnX3ZhbHVlX3NwYW4gPQogICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jb25maWctdmFsdWUiKSA/PwogICAgbGFiZWwuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgICAiYWZ0ZXJiZWdpbiIsCiAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImNvbmZpZy12YWx1ZSI+PC9zcGFuPmAKICAgICk7CiAgLy8gQXNzaW5nIHRoZSB0d28gc3BhbnMgYXMgcHJvcGVydGllcyBvZiB0aGUgY29udGFpbmluZyBzcGFuCiAgY29udGFpbmVyLnVpX3NwYW4gPSB1aV92YWx1ZV9zcGFuOwogIGNvbnRhaW5lci5jb25maWdfc3BhbiA9IGNvbmZpZ192YWx1ZV9zcGFuOwogIGNvbnRhaW5lci5rZXkgPSBrZXk7CiAgY29uZmlnX3NwYW5zW2tleV0gPSBjb250YWluZXI7CiAgaWYgKGZpcnN0UnVuKSB7CiAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPQogICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPz8ge307CiAgICAvLyBXZSBkbyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHZhbHVlIHNwYW4KICAgIGluaXRpYWxpemVVSVZhbHVlU3Bhbih1aV92YWx1ZV9zcGFuLCBrZXksIHZhbHVlKTsKICAgIC8vIFRoZW4gd2UgaW5pdGlhbGl6ZSB0aGUgY29uZmlnIHZhbHVlCiAgICBpbml0aWFsaXplQ29uZmlnVmFsdWVTcGFuKGNvbmZpZ192YWx1ZV9zcGFuLCBrZXkpOwogICAgLy8gV2UgcHV0IHNvbWUgY29udmVuaWVuY2UgZ2V0dGVycy9zZXR0ZXJzCiAgICAvLyB1aV92YWx1ZSBmb3J3YXJkCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAidWlfdmFsdWUiLCB7CiAgICAgIGdldDogKCkgPT4gdWlfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgdWlfdmFsdWVfc3Bhbi52YWx1ZSA9IHZhbDsKICAgICAgfSwKICAgIH0pOwogICAgLy8gY29uZmlnX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJjb25maWdfdmFsdWUiLCB7CiAgICAgIGdldDogKCkgPT4gY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUsCiAgICAgIHNldDogKHZhbCkgPT4gewogICAgICAgIGNvbmZpZ192YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgfQp9CgovLyBUaGVzZSBvYmplY3RzIHdpbGwgY29udGFpbiB0aGUgZGVmYXVsdCB2YWx1ZQoKLy8gVGhpcyBjb2RlIHVwZGF0ZXMgdGhlIGltYWdlIG9wdGlvbnMgaW4gdGhlIFBMT1QgY29uZmlnIHdpdGggdGhlIHByb3ZpZGVkIG9uZXMKZnVuY3Rpb24gc2V0SW1hZ2VPcHRpb25zKG8pIHsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IG9ba2V5XTsKICB9Cn0KZnVuY3Rpb24gdW5zZXRJbWFnZU9wdGlvbnMoKSB7CiAgc2V0SW1hZ2VPcHRpb25zKHt9KTsKfQoKY29uc3Qgc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnNldCIpOwpjb25zdCB1bnNldF9idXR0b24gPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtc3Bhbi51bnNldCIpOwppZiAoZmlyc3RSdW4pIHsKICBzZXRfYnV0dG9uLm9uY2xpY2sgPSAoZSkgPT4gewogICAgZm9yIChjb25zdCBjb250YWluZXIgb2YgT2JqZWN0LnZhbHVlcyhjb25maWdfc3BhbnMpKSB7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBjb250YWluZXIudWlfdmFsdWU7CiAgICB9CiAgfTsKICB1bnNldF9idXR0b24ub25jbGljayA9IHVuc2V0SW1hZ2VPcHRpb25zOwp9CgovLyBXZSBhZGQgYSBmdW5jdGlvbiB0byBjaGVjayBpZiB0aGUgY2xpcGJvYXJkIGlzIHBvcHBlZCBvdXQKQ09OVEFJTkVSLmlzUG9wcGVkT3V0ID0gKCkgPT4gewogIHJldHVybiBDT05UQUlORVIuY2xhc3NMaXN0LmNvbnRhaW5zKCJwb3BwZWQtb3V0Iik7Cn07CgpDTElQQk9BUkRfSEVBREVSLm9ubW91c2Vkb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgaWYgKGV2ZW50LnRhcmdldC5tYXRjaGVzKCJzcGFuLmNsaXBib2FyZC12YWx1ZSIpKSB7CiAgICBjb25zb2xlLmxvZygiV2UgZG9uJ3QgbW92ZSEiKTsKICAgIHJldHVybjsKICB9CiAgY29uc3Qgc3RhcnQgPSB7CiAgICBsZWZ0OiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS5sZWZ0KSwKICAgIHRvcDogcGFyc2VGbG9hdChDT05UQUlORVIuc3R5bGUudG9wKSwKICAgIFg6IGV2ZW50LnBhZ2VYLAogICAgWTogZXZlbnQucGFnZVksCiAgfTsKICBmdW5jdGlvbiBtb3ZlQXQoZXZlbnQsIHN0YXJ0KSB7CiAgICBjb25zdCB0b3AgPSBldmVudC5wYWdlWSAtIHN0YXJ0LlkgKyBzdGFydC50b3AgKyAicHgiOwogICAgY29uc3QgbGVmdCA9IGV2ZW50LnBhZ2VYIC0gc3RhcnQuWCArIHN0YXJ0LmxlZnQgKyAicHgiOwogICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gbGVmdDsKICAgIENPTlRBSU5FUi5zdHlsZS5sZWZ0ID0gbGVmdDsKICAgIENPTlRBSU5FUi5zdHlsZS50b3AgPSB0b3A7CiAgfQoKICAvLyBtb3ZlIG91ciBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYmFsbCB1bmRlciB0aGUgcG9pbnRlcgogIG1vdmVBdChldmVudCwgc3RhcnQpOwogIGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGV2ZW50KSB7CiAgICBtb3ZlQXQoZXZlbnQsIHN0YXJ0KTsKICB9CgogIC8vIFdlIHVzZSB0aGlzIHRvIHJlbW92ZSB0aGUgbW91c2Vtb3ZlIHdoZW4gY2xpY2tpbmcgb3V0c2lkZSBvZiB0aGUgY29udGFpbmVyCiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgLy8gbW92ZSB0aGUgY29udGFpbmVyIG9uIG1vdXNlbW92ZQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIG9uTW91c2VNb3ZlLCB7CiAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLAogIH0pOwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAibW91c2Vkb3duIiwKICAgIChlKSA9PiB7CiAgICAgIGlmIChlLnRhcmdldC5jbG9zZXN0KCIucGx1dG9wbG90bHktY29udGFpbmVyIikgIT09IENPTlRBSU5FUikgewogICAgICAgIGNsZWFuVXAoKTsKICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9LAogICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0KICApOwoKICBmdW5jdGlvbiBjbGVhblVwKCkgewogICAgY29uc29sZS5sb2coImNsZWFuaW5nIHVwIHRoZSBwbG90IG1vdmUgbGlzdGVuZXIiKTsKICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gbnVsbDsKICB9CgogIC8vICgzKSBkcm9wIHRoZSBiYWxsLCByZW1vdmUgdW5uZWVkZWQgaGFuZGxlcnMKICBDTElQQk9BUkRfSEVBREVSLm9ubW91c2V1cCA9IGNsZWFuVXA7Cn07CgpmdW5jdGlvbiBzZW5kVG9DbGlwYm9hcmQoYmxvYikgewogIGlmICghbmF2aWdhdG9yLmNsaXBib2FyZCkgewogICAgYWxlcnQoCiAgICAgICJUaGUgQ2xpcGJvYXJkIEFQSSBkb2VzIG5vdCBzZWVtIHRvIGJlIGF2YWlsYWJsZSwgbWFrZSBzdXJlIHRoZSBQbHV0byBub3RlYm9vayBpcyBiZWluZyB1c2VkIGZyb20gZWl0aGVyIGxvY2FsaG9zdCBvciBhbiBodHRwcyBzb3VyY2UuIgogICAgKTsKICB9CiAgbmF2aWdhdG9yLmNsaXBib2FyZAogICAgLndyaXRlKFsKICAgICAgbmV3IENsaXBib2FyZEl0ZW0oewogICAgICAgIC8vIFRoZSBrZXkgaXMgZGV0ZXJtaW5lZCBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgYmxvYidzIHR5cGUuCiAgICAgICAgW2Jsb2IudHlwZV06IGJsb2IsCiAgICAgIH0pLAogICAgXSkKICAgIC50aGVuKAogICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgY29uc29sZS5sb2coIkFzeW5jOiBDb3B5aW5nIHRvIGNsaXBib2FyZCB3YXMgc3VjY2Vzc2Z1bCEiKTsKICAgICAgfSwKICAgICAgZnVuY3Rpb24gKGVycikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkFzeW5jOiBDb3VsZCBub3QgY29weSB0ZXh0OiAiLCBlcnIpOwogICAgICB9CiAgICApOwp9CgpmdW5jdGlvbiBjb3B5SW1hZ2VUb0NsaXBib2FyZCgpIHsKICAvLyBXZSBleHRyYWN0IHRoZSBpbWFnZSBvcHRpb25zIGZyb20gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMgKGlmIHRoZXkgZXhpc3QpCiAgY29uc3QgY29uZmlnID0ge307CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGxldCB2YWwgPQogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID8/CiAgICAgIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IGNvbnRhaW5lci51aV92YWx1ZSA6IHVuZGVmaW5lZCk7CiAgICAvLyBJZiB3ZSBoYXZlIHVuZGVmaW5lZCB3ZSBkb24ndCBjcmVhdGUgdGhlIGtleS4gV2UgYWxzbyBpZ25vcmUgZm9ybWF0IGJlY2F1c2UgdGhlIGNsaXBib2FyZCBvbmx5IHN1cHBvcnRzIHBuZy4KICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS50b0ltYWdlKFBMT1QsIGNvbmZpZykudGhlbihmdW5jdGlvbiAoZGF0YVVybCkgewogICAgZmV0Y2goZGF0YVVybCkKICAgICAgLnRoZW4oKHJlcykgPT4gcmVzLmJsb2IoKSkKICAgICAgLnRoZW4oKGJsb2IpID0+IHsKICAgICAgICBjb25zdCBwYXN0ZV9yZWNlaXZlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3Bhc3RlLXJlY2VpdmVyLnBsdXRvcGxvdGx5JykKICAgICAgICBpZiAocGFzdGVfcmVjZWl2ZXIpIHsKICAgICAgICAgIHBhc3RlX3JlY2VpdmVyLmF0dGFjaEltYWdlKGRhdGFVcmwsIENPTlRBSU5FUikKICAgICAgICB9CiAgICAgICAgc2VuZFRvQ2xpcGJvYXJkKGJsb2IpCiAgICAgIH0pOwogIH0pOwp9CgpmdW5jdGlvbiBzYXZlSW1hZ2VUb0ZpbGUoKSB7CiAgY29uc3QgY29uZmlnID0ge307CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGxldCB2YWwgPQogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID8/CiAgICAgIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IGNvbnRhaW5lci51aV92YWx1ZSA6IHVuZGVmaW5lZCk7CiAgICAvLyBJZiB3ZSBoYXZlIHVuZGVmaW5lZCB3ZSBkb24ndCBjcmVhdGUgdGhlIGtleS4KICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbmZpZ1trZXldID0gdmFsOwogIH0KICBQbG90bHkuZG93bmxvYWRJbWFnZShQTE9ULCBjb25maWcpOwp9CgpsZXQgY29udGFpbmVyX3JlY3QgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAsIHRvcDogMCwgbGVmdDogMCB9OwpmdW5jdGlvbiB1bnBvcF9jb250YWluZXIoY2wpIHsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZSgicG9wcGVkLW91dCIsIGZhbHNlKTsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgZmFsc2UpOwogIC8vIFdlIGZpeCB0aGUgaGVpZ2h0IGJhY2sgdG8gdGhlIHZhbHVlIGl0IGhhZCBiZWZvcmUgcG9wb3V0LCBhbHNvIHNldHRpbmcgdGhlIGZsYWcgdG8gc2lnbmFsIHRoYXQgdXBvbiBmaXJzdCByZXNpemUgd2UgcmVtb3ZlIHRoZSBmaXhlZCBpbmxpbmUtc3R5bGUKICBDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0ICsgInB4IjsKICByZW1vdmVfY29udGFpbmVyX3NpemUgPSB0cnVlOwogIC8vIFdlIHNldCB0aGUgb3RoZXIgZml4ZWQgaW5saW5lLXN0eWxlcyB0byBudWxsCiAgQ09OVEFJTkVSLnN0eWxlLndpZHRoID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9ICIiOwogIENPTlRBSU5FUi5zdHlsZS5sZWZ0ID0gIiI7CiAgLy8gV2UgYWxzbyByZW1vdmUgdGhlIENMSVBCT0FSRF9IRUFERVIKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLndpZHRoID0gIiI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gIiI7CiAgLy8gRmluYWxseSB3ZSByZW1vdmUgdGhlIGhpZGRlbiBjbGFzcyB0byB0aGUgaGVhZGVyCiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCB0cnVlKTsKICByZXR1cm47Cn0KZnVuY3Rpb24gcG9wb3V0X2NvbnRhaW5lcihvcHRzKSB7CiAgY29uc3QgY2wgPSBvcHRzPy5jbDsKICBjb25zdCB0YXJnZXRfY29udGFpbmVyX3NpemUgPSBvcHRzPy50YXJnZXRfY29udGFpbmVyX3NpemUgPz8ge307CiAgY29uc3QgdGFyZ2V0X3Bsb3Rfc2l6ZSA9IG9wdHM/LnRhcmdldF9wbG90X3NpemUgPz8ge307CiAgaWYgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICByZXR1cm4gdW5wb3BfY29udGFpbmVyKGNsKTsKICB9CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoY2wsIGNsID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IHRydWUpOwogIC8vIFdlIGV4dHJhY3QgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgY29udGFpbmVyLCBzYXZlIHRoZW0gYW5kIGZpeCB0aGVtCiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfSA9IENPTlRBSU5FUi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICBjb250YWluZXJfcmVjdCA9IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH07CiAgLy8gV2Ugc2F2ZSB0aGUgY3VycmVudCBwbG90IHNpemUgYmVmb3JlIHdlIHBvcCBhcyBpdCB3aWxsIGZpbGwgdGhlIHNjcmVlbgogIGNvbnN0IGN1cnJlbnRfcGxvdF9zaXplID0gewogICAgd2lkdGg6IFBMT1QuX2Z1bGxMYXlvdXQud2lkdGgsCiAgICBoZWlnaHQ6IFBMT1QuX2Z1bGxMYXlvdXQuaGVpZ2h0LAogIH07CiAgLy8gV2UgaGF2ZSB0byBzYXZlIHRoZSBwYWQgZGF0YSBiZWZvcmUgcG9wcGluZyBzbyB3ZSBjYW4gcmVzaXplIHByZWNpc2VseQogIGNvbnN0IHBhZCA9IHt9OwogIHBhZC51bnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZSgicG9wcGVkLW91dCIsIHRydWUpOwogIHBhZC5wb3BwZWQgPSBnZXRTaXplRGF0YSgpLmNvbnRhaW5lcl9wYWQ7CiAgLy8gV2UgZG8gdG9wIGFuZCBsZWZ0IGJhc2VkIG9uIHRoZSBjdXJyZW50IHJlY3QKICBmb3IgKGNvbnN0IGtleSBvZiBbInRvcCIsICJsZWZ0Il0pIHsKICAgIGNvbnN0IHN0YXJ0X3ZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNvbnRhaW5lcl9yZWN0W2tleV07CiAgICBsZXQgb2Zmc2V0ID0gMDsKICAgIGZvciAoY29uc3Qga2luZCBvZiBbInBhZGRpbmciLCAiYm9yZGVyIl0pIHsKICAgICAgb2Zmc2V0ICs9IHBhZC5wb3BwZWRba2luZF1ba2V5XSAtIHBhZC51bnBvcHBlZFtraW5kXVtrZXldOwogICAgfQogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSBzdGFydF92YWwgLSBvZmZzZXQgKyAicHgiOwogICAgaWYgKGtleSA9PT0gImxlZnQiKSB7CiAgICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGVba2V5XSA9IENPTlRBSU5FUi5zdHlsZVtrZXldOwogICAgfQogIH0KICAvLyBXZSBjb21wdXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGRlcGVuZGluZyBvbiBldmVudHVhbCBjb25maWcgZGF0YQogIGNvbnN0IGNzeiA9IGNvbXB1dGVDb250YWluZXJTaXplKHsKICAgIHdpZHRoOgogICAgICB0YXJnZXRfcGxvdF9zaXplLndpZHRoID8/CiAgICAgIGNvbmZpZ19zcGFucy53aWR0aC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6CiAgICAgIHRhcmdldF9wbG90X3NpemUuaGVpZ2h0ID8/CiAgICAgIGNvbmZpZ19zcGFucy5oZWlnaHQuY29uZmlnX3ZhbHVlID8/CiAgICAgIGN1cnJlbnRfcGxvdF9zaXplLmhlaWdodCwKICB9KTsKICBmb3IgKGNvbnN0IGtleSBvZiBbIndpZHRoIiwgImhlaWdodCJdKSB7CiAgICBjb25zdCB2YWwgPSB0YXJnZXRfY29udGFpbmVyX3NpemVba2V5XSA/PyBjc3pba2V5XTsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gdmFsICsgInB4IjsKICAgIGlmIChrZXkgPT09ICJ3aWR0aCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIENMSVBCT0FSRF9IRUFERVIuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgZmFsc2UpOwogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CgogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAibW91c2Vkb3duIiwKICAgIChlKSA9PiB7CiAgICAgIGlmIChlLnRhcmdldC5jbG9zZXN0KCIucGx1dG9wbG90bHktY29udGFpbmVyIikgIT09IENPTlRBSU5FUikgewogICAgICAgIHVucG9wX2NvbnRhaW5lcigpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7Cn0KCkNPTlRBSU5FUi5wb3BPdXQgPSBwb3BvdXRfY29udGFpbmVyOwoKZnVuY3Rpb24gRHVhbENsaWNrKHNpbmdsZV9mdW5jLCBkYmxfZnVuYykgewogIGxldCBuY2xpY2tzID0gMDsKICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHsKICAgIG5jbGlja3MgKz0gMTsKICAgIGlmIChuY2xpY2tzID4gMSkgewogICAgICBkYmxfZnVuYyguLi5hcmdzKTsKICAgICAgbmNsaWNrcyA9IDA7CiAgICB9IGVsc2UgewogICAgICBkZWxheSgzMDApLnRoZW4oKCkgPT4gewogICAgICAgIGlmIChuY2xpY2tzID09IDEpIHsKICAgICAgICAgIHNpbmdsZV9mdW5jKC4uLmFyZ3MpOwogICAgICAgIH0KICAgICAgICBuY2xpY2tzID0gMDsKICAgICAgfSk7CiAgICB9CiAgfTsKfQoKLy8gV2UgcmVtb3ZlIHRoZSBkZWZhdWx0IGRvd25sb2FkIGltYWdlIGJ1dHRvbgpwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSA9IF8udW5pb24oCiAgcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9SZW1vdmUsCiAgWyJ0b0ltYWdlIl0KKTsKLy8gV2UgYWRkIHRoZSBjdXN0b20gYnV0dG9uIHRvIHRoZSBtb2RlYmFyCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb0FkZCwKICBbCiAgICB7CiAgICAgIG5hbWU6ICJDb3B5IFBORyB0byBDbGlwYm9hcmQiLAogICAgICBpY29uOiB7CiAgICAgICAgaGVpZ2h0OiA1MjAsCiAgICAgICAgd2lkdGg6IDUyMCwKICAgICAgICBwYXRoOiAiTTI4MCA2NGg0MGMzNS4zIDAgNjQgMjguNyA2NCA2NFY0NDhjMCAzNS4zLTI4LjcgNjQtNjQgNjRINjRjLTM1LjMgMC02NC0yOC43LTY0LTY0VjEyOEMwIDkyLjcgMjguNyA2NCA2NCA2NGg0MCA5LjZDMTIxIDI3LjUgMTUzLjMgMCAxOTIgMHM3MSAyNy41IDc4LjQgNjRIMjgwek02NCAxMTJjLTguOCAwLTE2IDcuMi0xNiAxNlY0NDhjMCA4LjggNy4yIDE2IDE2IDE2SDMyMGM4LjggMCAxNi03LjIgMTYtMTZWMTI4YzAtOC44LTcuMi0xNi0xNi0xNkgzMDR2MjRjMCAxMy4zLTEwLjcgMjQtMjQgMjRIMTkyIDEwNGMtMTMuMyAwLTI0LTEwLjctMjQtMjRWMTEySDY0em0xMjgtOGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6IiwKICAgICAgfSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKGNvcHlJbWFnZVRvQ2xpcGJvYXJkLCAoKSA9PiB7CiAgICAgICAgcG9wb3V0X2NvbnRhaW5lcigpOwogICAgICB9KSwKICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICJEb3dubG9hZCBJbWFnZSIsCiAgICAgIGljb246IFBsb3RseS5JY29ucy5jYW1lcmEsCiAgICAgIGRpcmVjdGlvbjogInVwIiwKICAgICAgY2xpY2s6IER1YWxDbGljayhzYXZlSW1hZ2VUb0ZpbGUsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKHsgY2w6ICJmaWxlc2F2ZSIgfSk7CiAgICAgIH0pLAogICAgfSwKICBdCik7CgpmdW5jdGlvbiBnZXRPZmZzZXREYXRhKGVsKSB7CiAgbGV0IGNzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwsIG51bGwpOwogIGNvbnN0IG9kYXRhID0gewogICAgcGFkZGluZzogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdMZWZ0KSwKICAgICAgcmlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1JpZ2h0KSwKICAgICAgdG9wOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdUb3ApLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MucGFkZGluZ0JvdHRvbSksCiAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdMZWZ0KSArIHBhcnNlRmxvYXQoY3MucGFkZGluZ1JpZ2h0KSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdUb3ApICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgIH0sCiAgICBib3JkZXI6IHsKICAgICAgbGVmdDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgdG9wOiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSwKICAgICAgYm90dG9tOiBwYXJzZUZsb2F0KGNzLmJvcmRlckJvdHRvbVdpZHRoKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MuYm9yZGVyTGVmdFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyUmlnaHRXaWR0aCksCiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChjcy5ib3JkZXJUb3BXaWR0aCkgKyBwYXJzZUZsb2F0KGNzLmJvcmRlckJvdHRvbVdpZHRoKSwKICAgIH0KICB9OwogIGlmIChlbCA9PT0gUExPVCkgewogICAgLy8gRm9yIHRoZSBQTE9UIHdlIGFsc28gd2FudCB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgb2Zmc2V0CiAgICBvZGF0YS5vZmZzZXQgPSB7CiAgICAgIHRvcDogUExPVC5vZmZzZXRQYXJlbnQgPT0gQ09OVEFJTkVSID8gUExPVC5vZmZzZXRUb3AgOiAwLAogICAgICBsZWZ0OiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldExlZnQgOiAwLAogICAgfQogIH0KICByZXR1cm4gb2RhdGE7Cn0KZnVuY3Rpb24gZ2V0U2l6ZURhdGEoKSB7CiAgY29uc3QgZGF0YSA9IHsKICAgIHBsb3RfcGFkOiBnZXRPZmZzZXREYXRhKFBMT1QpLAogICAgcGxvdF9yZWN0OiBQTE9ULmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogICAgY29udGFpbmVyX3BhZDogZ2V0T2Zmc2V0RGF0YShDT05UQUlORVIpLAogICAgY29udGFpbmVyX3JlY3Q6IENPTlRBSU5FUi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICB9OwogIHJldHVybiBkYXRhOwp9CmZ1bmN0aW9uIGNvbXB1dGVDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICBjb25zdCBjb21wdXRlZF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICBjb25zdCBvZmZzZXRzID0gY29tcHV0ZWRfc2l6ZS5vZmZzZXRzOwoKICBjb25zdCBwbG90X2RhdGEgPSB7CiAgICB3aWR0aDogd2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCwKICAgIGhlaWdodDogaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH07CgogIHJldHVybiB7CiAgICB3aWR0aDogKHdpZHRoID8/IGNvbXB1dGVkX3NpemUud2lkdGgpICsgb2Zmc2V0cy53aWR0aCwKICAgIGhlaWdodDogKGhlaWdodCA/PyBjb21wdXRlZF9zaXplLmhlaWdodCkgKyBvZmZzZXRzLmhlaWdodCwKICAgIG5vQ2hhbmdlOiB3aWR0aCA9PSBjb21wdXRlZF9zaXplLndpZHRoICYmIGhlaWdodCA9PSBjb21wdXRlZF9zaXplLmhlaWdodCwKICB9Cn0KCi8vIFRoaXMgZnVuY3Rpb24gd2lsbCBjaGFuZ2UgdGhlIGNvbnRhaW5lciBzaXplIHNvIHRoYXQgdGhlIHJlc3VsdGluZyBwbG90IHdpbGwgYmUgbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIHNwZWNzCmZ1bmN0aW9uIGNoYW5nZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGlmICghQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIGNvbnNvbGUubG9nKCJUcmllZCB0byBjaGFuZ2UgY29udGFpbmVyIHNpemUgd2hlbiBub3QgcG9wcGVkLCBpZ25vcmluZyIpOwogICAgcmV0dXJuOwogIH0KCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhKTsKCiAgaWYgKGNzei5ub0NoYW5nZSkgewogICAgY29uc29sZS5sb2coIlNpemUgaXMgdGhlIHNhbWUgYXMgY3VycmVudCwgaWdub3JpbmciKTsKICAgIHJldHVybgogIH0KICAvLyBXZSBhcmUgbm93IGdvaW5nIHRvIHNldCBoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBjb250YWluZXIKICBmb3IgKGNvbnN0IGtleSBvZiBbIndpZHRoIiwgImhlaWdodCJdKSB7CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IGNzeltrZXldICsgInB4IjsKICB9Cn0KLy8gV2Ugbm93IGNyZWF0ZSB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIHVwZGF0ZSB0aGUgcGxvdCBiYXNlZCBvbiB0aGUgdmFsdWVzIHNwZWNpZmllZApmdW5jdGlvbiB1cGRhdGVGcm9tSGVhZGVyKCkgewogIGNvbnN0IGhlYWRlcl9kYXRhID0gewogICAgaGVpZ2h0OiBjb25maWdfc3BhbnMuaGVpZ2h0LnVpX3ZhbHVlLAogICAgd2lkdGg6IGNvbmZpZ19zcGFucy53aWR0aC51aV92YWx1ZSwKICB9OwogIGNoYW5nZUNvbnRhaW5lclNpemUoaGVhZGVyX2RhdGEpOwp9Ci8vIFdlIGFzc2lnbiB0aGlzIGZ1bmN0aW9uIHRvIHRoZSBvbmJsdXIgZXZlbnQgb2Ygd2lkdGggYW5kIGhlaWdodAppZiAoZmlyc3RSdW4pIHsKICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGNvbnRhaW5lci51aV9zcGFuLm9uYmx1ciA9IChlKSA9PiB7CiAgICAgIGNvbnRhaW5lci51aV92YWx1ZSA9IGNvbnRhaW5lci51aV9zcGFuLnRleHRDb250ZW50OwogICAgICB1cGRhdGVGcm9tSGVhZGVyKCk7CiAgICB9OwogIH0KfQovLyBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBwbG90IHNpemUgdG8gdXNlIGZvciByZWxheW91dCBhcyBhIGZ1bmN0aW9uIG9mIHRoZSBjb250YWluZXIgc2l6ZQpmdW5jdGlvbiBjb21wdXRlUGxvdFNpemUoZGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICAvLyBSZW1vdmUgUGFkZGluZwogIGNvbnN0IHsgY29udGFpbmVyX3BhZCwgcGxvdF9wYWQsIGNvbnRhaW5lcl9yZWN0IH0gPSBkYXRhOwogIGNvbnN0IG9mZnNldHMgPSB7CiAgICB3aWR0aDoKICAgICAgcGxvdF9wYWQucGFkZGluZy53aWR0aCArCiAgICAgIHBsb3RfcGFkLmJvcmRlci53aWR0aCArCiAgICAgIHBsb3RfcGFkLm9mZnNldC5sZWZ0ICsKICAgICAgY29udGFpbmVyX3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgY29udGFpbmVyX3BhZC5ib3JkZXIud2lkdGgsCiAgICBoZWlnaHQ6CiAgICAgIHBsb3RfcGFkLnBhZGRpbmcuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLmhlaWdodCArCiAgICAgIHBsb3RfcGFkLm9mZnNldC50b3AgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcuaGVpZ2h0ICsKICAgICAgY29udGFpbmVyX3BhZC5ib3JkZXIuaGVpZ2h0LAogIH07CiAgY29uc3Qgc3ogPSB7CiAgICB3aWR0aDogTWF0aC5yb3VuZChjb250YWluZXJfcmVjdC53aWR0aCAtIG9mZnNldHMud2lkdGgpLAogICAgaGVpZ2h0OiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LmhlaWdodCAtIG9mZnNldHMuaGVpZ2h0KSwKICAgIG9mZnNldHMsCiAgfTsKICByZXR1cm4gc3o7Cn0KCi8vIENyZWF0ZSB0aGUgcmVzaXplT2JzZXJ2ZXIgdG8gbWFrZSB0aGUgcGxvdCBldmVuIG1vcmUgcmVzcG9uc2l2ZSEgOm1hZ2ljOgpjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4gewogIGNvbnN0IHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKTsKICBjb25zdCB7Y29udGFpbmVyX3JlY3QsIGNvbnRhaW5lcl9wYWR9ID0gc2l6ZURhdGE7CiAgbGV0IHBsb3Rfc2l6ZSA9IGNvbXB1dGVQbG90U2l6ZShzaXplRGF0YSk7CiAgLy8gV2Ugc2F2ZSB0aGUgaGVpZ2h0IGluIHRoZSBQTE9UIG9iamVjdAogIFBMT1QuY29udGFpbmVyX2hlaWdodCA9IGNvbnRhaW5lcl9yZWN0LmhlaWdodDsKICAvLyBXZSBkZWFsIHdpdGggc29tZSBzdHVmZiBpZiB0aGUgY29udGFpbmVyIGlzIHBvcHBwZWQKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLndpZHRoID0gY29udGFpbmVyX3JlY3Qud2lkdGggKyAicHgiOwogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9IGNvbnRhaW5lcl9yZWN0LmxlZnQgKyAicHgiOwogIGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUgPSBwbG90X3NpemUuaGVpZ2h0OwogIGNvbmZpZ19zcGFucy53aWR0aC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS53aWR0aDsKICAvKiAKCQlUaGUgYWRkaXRpb24gb2YgdGhlIGludmFsaWQgYXJndW1lbnQgYHBsdXRvcmVzaXplYCBzZWVtcyB0byBmaXggdGhlIHByb2JsZW0gd2l0aCBjYWxsaW5nIGByZWxheW91dGAgc2ltcGx5IHdpdGggYHthdXRvc2l6ZTogdHJ1ZX1gIGFzIHVwZGF0ZSBicmVha2luZyBtb3VzZSByZWxheW91dCBldmVudHMgdHJhY2tpbmcuIAoJCVNlZSBodHRwczovL2dpdGh1Yi5jb20vcGxvdGx5L3Bsb3RseS5qcy9pc3N1ZXMvNjE1NiBmb3IgZGV0YWlscwoJCSovCiAgbGV0IGNvbmZpZyA9IHsKICAgIC8vIElmIHRoaXMgaXMgcG9wcGVkIG91dCwgd2UgaWdub3JlIHRoZSBvcmlnaW5hbCB3aWR0aC9oZWlnaHQKICAgIHdpZHRoOiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyB1bmRlZmluZWQgOiBvcmlnaW5hbF93aWR0aCkgPz8gcGxvdF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyB1bmRlZmluZWQgOiBvcmlnaW5hbF9oZWlnaHQpID8/IHBsb3Rfc2l6ZS5oZWlnaHQsCiAgICBwbHV0b3Jlc2l6ZTogdHJ1ZSwKICB9OwogIFBsb3RseS5yZWxheW91dChQTE9ULCBjb25maWcpLnRoZW4oKCkgPT4gewogICAgaWYgKHJlbW92ZV9jb250YWluZXJfc2l6ZSAmJiAhQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgdGhlIGZpcnN0IHJlc2l6ZSB1cG9uIHBsb3QgY3JlYXRpb24gdG8gYWxyZWFkeSBiZSB3aXRob3V0IGEgZml4ZWQgaGVpZ2h0CiAgICAgIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSAiIjsKICAgICAgQ09OVEFJTkVSLnN0eWxlLndpZHRoID0gIiI7CiAgICAgIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IGZhbHNlOwogICAgfQogIH0pOwp9KTsKCnJlc2l6ZU9ic2VydmVyLm9ic2VydmUoQ09OVEFJTkVSKTsKCgpQbG90bHkucmVhY3QoUExPVCwgcGxvdF9vYmopLnRoZW4oKCkgPT4gewoJLy8gQXNzaWduIHRoZSBQbG90bHkgZXZlbnQgbGlzdGVuZXJzCglmb3IgKGNvbnN0IFtrZXksIGxpc3RlbmVyX3ZlY10gb2YgT2JqZWN0LmVudHJpZXMocGxvdGx5X2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULm9uKGtleSwgbGlzdGVuZXIpCgkJfQoJfQoJLy8gQXNzaWduIHRoZSBKUyBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhqc19saXN0ZW5lcnMpKSB7CgkJZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcl92ZWMpIHsKCQkJUExPVC5hZGRFdmVudExpc3RlbmVyKGtleSwgbGlzdGVuZXIsIHsKCQkJCXNpZ25hbDogY29udHJvbGxlci5zaWduYWwKCQkJfSkKCQl9Cgl9Cn0KKQoKCmludmFsaWRhdGlvbi50aGVuKCgpID0+IHsKCS8vIFJlbW92ZSBhbGwgcGxvdGx5IGxpc3RlbmVycwoJUExPVC5yZW1vdmVBbGxMaXN0ZW5lcnMoKQoJLy8gUmVtb3ZlIGFsbCBKUyBsaXN0ZW5lcnMKCWNvbnRyb2xsZXIuYWJvcnQoKQoJLy8gUmVtb3ZlIHRoZSByZXNpemVPYnNlcnZlcgoJcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpCn0pCgoKCgkJcmV0dXJuIENPTlRBSU5FUgoJPC9zY3JpcHQ+CqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b+jFPGWnrBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkMThjODJmZjEtMGJkZS00ZmEwLTg0OGMtZDBlYjczZDFhYzdjuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOJZSxrrVwdWJsaXNoZWRfb2JqZWN0X2tleXOR2TViM2I4NDA4Yy04MTgxLTExZWYtMTRlYi1lMWM1NjliOGJiMjkvODAzNmY4MGZlY2Q5ZjgxN7hkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQxYzc5YjM3ZS1kNGUwLTQ5MGYtOTQ2Ni0yMGNlMjhmMDE3YWWKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52mqJCTxzY3JpcHQgaWQ9J3Bsb3RfMSc+CgkJLy8gV2Ugc3RhcnQgYnkgcHV0dGluZyBhbGwgdGhlIHZhcmlhYmxlIGludGVycG9sYXRpb24gaGVyZSBhdCB0aGUgYmVnaW5uaW5nCgkJLy8gV2UgaGF2ZSB0byBjb252ZXJ0IGFsbCB0eXBlZGFycmF5cyBpbiB0aGUgbGF5b3V0IHRvIG5vcm1hbCBhcnJheXMuIFNlZSBJc3N1ZSAjMjUKCQkvLyBXZSB1c2UgbG9kYXNoIGZvciB0aGlzIGZvciBjb21wYWN0bmVzcwoJCWZ1bmN0aW9uIHJlbW92ZVR5cGVkQXJyYXkobykgewoJCQlyZXR1cm4gXy5pc1R5cGVkQXJyYXkobykgPyBBcnJheS5mcm9tKG8pIDoKCQkJXy5pc1BsYWluT2JqZWN0KG8pID8gXy5tYXBWYWx1ZXMobywgcmVtb3ZlVHlwZWRBcnJheSkgOiAKCQkJbwoJCX0KCgkJLy8gUHVibGlzaCB0aGUgcGxvdCBvYmplY3QgdG8gSlMKCQlsZXQgcGxvdF9vYmogPSBfLnVwZGF0ZSgvKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIEFic3RyYWN0UGx1dG9EaW5nZXRqZXMuRGlzcGxheS5wdWJsaXNoZWRfdG9fanMgKi8gZ2V0UHVibGlzaGVkT2JqZWN0KCJiM2I4NDA4Yy04MTgxLTExZWYtMTRlYi1lMWM1NjliOGJiMjkvZDNmOGJjNmFlZjViYzkzNCIpLCAibGF5b3V0IiwgcmVtb3ZlVHlwZWRBcnJheSkKCQkvLyBHZXQgdGhlIHBsb3RseSBsaXN0ZW5lcnMKCQljb25zdCBwbG90bHlfbGlzdGVuZXJzID0ge30KCQkvLyBHZXQgdGhlIEpTIGxpc3RlbmVycwoJCWNvbnN0IGpzX2xpc3RlbmVycyA9IHt9CgkJLy8gRGVhbCB3aXRoIGV2ZW50dWFsIGN1c3RvbSBjbGFzc2VzCgkJbGV0IGN1c3RvbV9jbGFzc2xpc3QgPSBbXQoKCgkJLy8gTG9hZCB0aGUgcGxvdGx5IGxpYnJhcnkKCQlsZXQgUGxvdGx5ID0gdW5kZWZpbmVkCgkJdHJ5IHsKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoIi4vcGxvdGx5anMvcGxvdGx5anMtMi4yNi4yLm1pbi5qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0gY2F0Y2ggKGUpIHsKCQkJY29uc29sZS5sb2coIkxvY2FsIGxvYWQgZmFpbGVkLCB0cnlpbmcgd2l0aCB0aGUgd2ViIGVzbS5zaCB2ZXJzaW9uIikKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoImh0dHBzOi8vZXNtLnNoL3YxMzUvcGxvdGx5LmpzLWRpc3QtbWluQDIuMjYuMi9lc25leHQvcGxvdGx5LmpzLWRpc3QtbWluLm1qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0KCgkJLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0byBmb3JjZSBsb2NhbCBtYXRoamF4IGZvbnQgY2FjaGUKCQlpZiAoZmFsc2UgJiYgd2luZG93Py5NYXRoSmF4Py5jb25maWc/LnN2Zz8uZm9udENhY2hlID09PSAnZ2xvYmFsJykgewoJCQl3aW5kb3cuTWF0aEpheC5jb25maWcuc3ZnLmZvbnRDYWNoZSA9ICdsb2NhbCcKCQl9CgoJCS8vIEZsYWcgdG8gY2hlY2sgaWYgdGhpcyBjZWxsIHdhcyAgbWFudWFsbHkgcmFuIG9yIHJlYWN0aXZlbHkgcmFuCmNvbnN0IGZpcnN0UnVuID0gdGhpcyA/IGZhbHNlIDogdHJ1ZQpjb25zdCBDT05UQUlORVIgPSB0aGlzID8/IGh0bWxgPGRpdiBjbGFzcz0ncGx1dG9wbG90bHktY29udGFpbmVyJz5gCmNvbnN0IFBMT1QgPSBDT05UQUlORVIucXVlcnlTZWxlY3RvcignLmpzLXBsb3RseS1wbG90JykgPz8gQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgPGRpdj5gKQpjb25zdCBwYXJlbnQgPSBDT05UQUlORVIucGFyZW50RWxlbWVudAovLyBXZSB1c2UgYSBjb250cm9sbGVyIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lcnMgdXBvbiBpbnZhbGlkYXRpb24KY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKQovLyBXZSBoYXZlIHRvIGFkZCB0aGlzIHRvIGtlZXAgc3VwcG9ydGluZyBAYmluZCB3aXRoIHRoZSBvbGQgQVBJIHVzaW5nIFBMT1QKUExPVC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChlKSA9PiB7CglDT05UQUlORVIudmFsdWUgPSBQTE9ULnZhbHVlCglpZiAoZS5idWJibGVzKSB7CgkJcmV0dXJuCgl9CglDT05UQUlORVIuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2lucHV0JykpCn0sIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KQoKCS8vIFRoaXMgY3JlYXRlIHRoZSBzdHlsZSBzdWJkaXYgb24gZmlyc3QgcnVuCglmaXJzdFJ1biAmJiBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGAKCTxzdHlsZT4KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgewoJCXdpZHRoOiAxMDAlOwoJCWhlaWdodDogMTAwJTsKCQltaW4taGVpZ2h0OiAwOwoJCW1pbi13aWR0aDogMDsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgLmpzLXBsb3RseS1wbG90IC5wbG90bHkgZGl2IHsKCQltYXJnaW46IDAgYXV0bzsgLy8gVGhpcyBjZW50ZXJzIHRoZSBwbG90Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLnBvcHBlZC1vdXQgewoJCW92ZXJmbG93OiBhdXRvOwoJCXotaW5kZXg6IDEwMDA7CgkJcG9zaXRpb246IGZpeGVkOwoJCXJlc2l6ZTogYm90aDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDBweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMHB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgewoJCWRpc3BsYXk6IGZsZXg7CgkJZmxleC1mbG93OiByb3cgd3JhcDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAxMnB4OwoJCXBvc2l0aW9uOiBmaXhlZDsKCQl6LWluZGV4OiAxMDAxOwoJCWN1cnNvcjogbW92ZTsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIC0xMDAlKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBzcGFuIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJZmxleDogMQoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIuaGlkZGVuIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuIHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlIHsKCQlwYWRkaW5nLXJpZ2h0OiA1cHg7CgkJcGFkZGluZy1sZWZ0OiAycHg7CgkJY3Vyc29yOiB0ZXh0OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZmxleDogMCAwIDEwMCU7CgkJdGV4dC1hbGlnbjogY2VudGVyOwoJCWJvcmRlci10b3A6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQltYXJnaW4tdG9wOiA1cHg7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZpbGVuYW1lIHsKCQltYXJnaW4tbGVmdDogM3B4OwoJCXRleHQtYWxpZ246IGxlZnQ7CgkJbWluLXdpZHRoOiBtaW4oNjAlLCBtaW4tY29udGVudCk7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCAubGFiZWwgewoJCWZsZXg6IDAgMCAwOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5mb3JtYXQgewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCQlmbGV4OiAxIDAgYXV0bzsKCQltaW4td2lkdGg6IDMwcHg7CgkJbWFyZ2luLXJpZ2h0OiAxMHB4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCQlmbGV4LWZsb3c6IGNvbHVtbjsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlwYWRkaW5nLWxlZnQ6IDNweDsKCQl6LWluZGV4OiAyMDAwOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIHsKCQljdXJzb3I6IHBvaW50ZXI7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJcGFkZGluZzogM3B4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKC0zcHgsIC02cHgpOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpub3QoLnNlbGVjdGVkKSB7CgkJbWFyZ2luLXRvcDogM3B4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uLnNlbGVjdGVkIHsKCQlvcmRlcjogLTE7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246aG92ZXIgewoJCWJhY2tncm91bmQtY29sb3I6IHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJfQoJc3Bhbi5jb25maWctdmFsdWUgewoJCWZvbnQtd2VpZ2h0OiBub3JtYWw7CgkJY29sb3I6IHZhcigtLXBsdXRvLW91dHB1dC1jb2xvcik7CgkJZGlzcGxheTogbm9uZTsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIGNhbGMoLTEwMCUgLSAxMHB4KSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLmxhYmVsIHsKCQl1c2VyLXNlbGVjdDogbm9uZTsKCX0KCS5sYWJlbDpob3ZlciBzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCW1pbi13aWR0aDogMTUwcHg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4ubWF0Y2hpbmctY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLW1hY3JvLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5kaWZmZXJlbnQtY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLXRhZy1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9Cjwvc3R5bGU+CmApCgpsZXQgb3JpZ2luYWxfaGVpZ2h0ID0gcGxvdF9vYmoubGF5b3V0LmhlaWdodApsZXQgb3JpZ2luYWxfd2lkdGggPSBwbG90X29iai5sYXlvdXQud2lkdGgKLy8gRm9yIHRoZSBoZWlnaHQgd2UgaGF2ZSB0byBhbHNvIHB1dCBhIGZpeGVkIHZhbHVlIGluIGNhc2UgdGhlIHBsb3QgaXMgcHV0IG9uIGEgbm9uLWZpeGVkLXNpemUgY29udGFpbmVyIChsaWtlIHRoZSBkZWZhdWx0IHdyYXBwZXIpCi8vIFdlIGRlZmluZSBhIHZhcmlhYmxlIHRvIGNoZWNrIHdoZXRoZXIgd2Ugc3RpbGwgaGF2ZSB0byByZW1vdmUgdGhlIGZpeGVkIGhlaWdodApsZXQgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmlyc3RSdW4KbGV0IGNvbnRhaW5lcl9oZWlnaHQgPSBvcmlnaW5hbF9oZWlnaHQgPz8gUExPVC5jb250YWluZXJfaGVpZ2h0ID8/IDQwMApDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX2hlaWdodCArICdweCcKCi8vIFdlIGNyZWF0ZSBhIFByb21pc2UgdmVyc2lvbiBvZiBzZXRUaW1lb3V0CmZ1bmN0aW9uIGRlbGF5KG1zKSB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7Cn0KCi8vIFdlIGltcG9ydCBpbnRlcmFjdCBmb3IgZHJhZ2dpbmcvcmVzaXppbmcKY29uc3QgeyBkZWZhdWx0OiBpbnRlcmFjdCB9ID0gYXdhaXQgaW1wb3J0KCdodHRwczovL2VzbS5zaC9pbnRlcmFjdGpzQDEuMTAuMTknKQoKCmZ1bmN0aW9uIGdldEltYWdlT3B0aW9ucygpIHsKICBjb25zdCBvID0gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogIHJldHVybiB7CiAgICBmb3JtYXQ6IG8uZm9ybWF0ID8/ICJwbmciLAogICAgd2lkdGg6IG8ud2lkdGggPz8gb3JpZ2luYWxfd2lkdGgsCiAgICBoZWlnaHQ6IG8uaGVpZ2h0ID8/IG9yaWdpbmFsX2hlaWdodCwKICAgIHNjYWxlOiBvLnNjYWxlID8/IDEsCiAgICBmaWxlbmFtZTogby5maWxlbmFtZSA/PyAibmV3cGxvdCIsCiAgfTsKfQoKY29uc3QgQ0xJUEJPQVJEX0hFQURFUiA9CiAgQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoIi5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIikgPz8KICBDT05UQUlORVIuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgImFmdGVyYmVnaW4iLAogICAgaHRtbGA8ZGl2IGNsYXNzPSJwbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIGhpZGRlbiI+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmb3JtYXQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+Rm9ybWF0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZvcm1hdCI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB3aWR0aCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5XaWR0aDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSB3aWR0aCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGhlaWdodCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5IZWlnaHQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgaGVpZ2h0Ij48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2NhbGUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+U2NhbGU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgc2NhbGUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzZXQiPlNldDwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB1bnNldCI+VW5zZXQ8L2J1dHRvbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZpbGVuYW1lIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZpbGVuYW1lOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZpbGVuYW1lIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgIDwvZGl2PmAKICApOwoKZnVuY3Rpb24gY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcikgewogIGNvbnN0IHZhbGlkX2NsYXNzZXMgPSBbCiAgICAibWlzc2luZy1jb25maWciLAogICAgIm1hdGNoaW5nLWNvbmZpZyIsCiAgICAiZGlmZmVyZW50LWNvbmZpZyIsCiAgXTsKICBmdW5jdGlvbiBzZXRDbGFzcyhjbCkgewogICAgZm9yIChjb25zdCBuYW1lIG9mIHZhbGlkX2NsYXNzZXMpIHsKICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUobmFtZSwgbmFtZSA9PSBjbCk7CiAgICB9CiAgfQogIC8vIFdlIHVzZSB0aGUgY3VzdG9tIGdldHRlcnMgd2UnbGwgc2V0IHVwIGluIHRoZSBjb250YWluZXIKICBjb25zdCB7IHVpX3ZhbHVlLCBjb25maWdfdmFsdWUsIGNvbmZpZ19zcGFuLCBrZXkgfSA9IGNvbnRhaW5lcjsKICBpZiAoY29uZmlnX3ZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgIHNldENsYXNzKCJtaXNzaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBpcyBub3QgcHJlc2VudCBpbiB0aGUgY29uZmlnLmA7CiAgfSBlbHNlIGlmICh1aV92YWx1ZSA9PSBjb25maWdfdmFsdWUpIHsKICAgIHNldENsYXNzKCJtYXRjaGluZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIHRoZSBzYW1lIHZhbHVlIGluIHRoZSBjb25maWcgYW5kIGluIHRoZSBoZWFkZXIuYDsKICB9IGVsc2UgewogICAgc2V0Q2xhc3MoImRpZmZlcmVudC1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIGEgZGlmZmVyZW50IHZhbHVlICg8ZW0+JHtjb25maWdfdmFsdWV9PC9lbT4pIGluIHRoZSBjb25maWcuYDsKICB9CiAgLy8gQWRkIGluZm8gYWJvdXQgc2V0dGluZyBhbmQgdW5zZXR0aW5nCiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIG9uIHRoZSBsYWJlbCA8ZW0+PGI+b25jZTwvYj48L2VtPiB0byBzZXQgdGhlIGN1cnJlbnQgVUkgdmFsdWUgaW4gdGhlIGNvbmZpZy5gCiAgKTsKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgPGVtPjxiPnR3aWNlPC9iPjwvZW0+IHRvIHJlbW92ZSB0aGlzIGtleSBmcm9tIHRoZSBjb25maWcuYAogICk7Cn0KCmNvbnN0IHZhbGlkX2Zvcm1hdHMgPSBbInBuZyIsICJzdmciLCAid2VicCIsICJqcGVnIiwgImZ1bGwtanNvbiJdOwpmdW5jdGlvbiBpbml0aWFsaXplVUlWYWx1ZVNwYW4oc3Bhbiwga2V5LCB2YWx1ZSkgewogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSBrZXkgPT09ICJmb3JtYXQiID8gImZhbHNlIiA6ICJ0cnVlIjsKICBsZXQgcGFyc2UgPSAoeCkgPT4geDsKICBsZXQgdXBkYXRlID0gKHgpID0+IChzcGFuLnRleHRDb250ZW50ID0geCk7CiAgaWYgKGtleSA9PT0gIndpZHRoIiB8fCBrZXkgPT09ICJoZWlnaHQiKSB7CiAgICBwYXJzZSA9ICh4KSA9PiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoeCkpOwogIH0gZWxzZSBpZiAoa2V5ID09PSAic2NhbGUiKSB7CiAgICBwYXJzZSA9IHBhcnNlRmxvYXQ7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAvLyBXZSByZW1vdmUgY29udGVudEVkaXRhYmxlCiAgICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9ICJmYWxzZSI7CiAgICAvLyBIZXJlIHdlIGZpcnN0IGFkZCB0aGUgc3Vic3BhbnMgZm9yIGVhY2ggb3B0aW9uCiAgICBjb25zdCBvcHRzX2RpdiA9IHNwYW4uYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2IGNsYXNzPSJmb3JtYXQtb3B0aW9ucyI+PC9kaXY+YCk7CiAgICBmb3IgKGNvbnN0IGZtdCBvZiB2YWxpZF9mb3JtYXRzKSB7CiAgICAgIGNvbnN0IG9wdCA9IG9wdHNfZGl2LmFwcGVuZENoaWxkKAogICAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImZvcm1hdC1vcHRpb24gJHtmbXR9Ij4ke2ZtdH08L3NwYW4+YAogICAgICApOwogICAgICBvcHQub25jbGljayA9IChlKSA9PiB7CiAgICAgICAgc3Bhbi52YWx1ZSA9IG9wdC50ZXh0Q29udGVudDsKICAgICAgfTsKICAgIH0KICAgIHBhcnNlID0gKHgpID0+IHsKICAgICAgcmV0dXJuIHZhbGlkX2Zvcm1hdHMuaW5jbHVkZXMoeCkgPyB4IDogbG9jYWxWYWx1ZTsKICAgIH07CiAgICB1cGRhdGUgPSAoeCkgPT4gewogICAgICBmb3IgKGNvbnN0IG9wdCBvZiBvcHRzX2Rpdi5jaGlsZHJlbikgewogICAgICAgIG9wdC5jbGFzc0xpc3QudG9nZ2xlKCJzZWxlY3RlZCIsIG9wdC50ZXh0Q29udGVudCA9PT0geCk7CiAgICAgIH0KICAgIH07CiAgfSBlbHNlIHsKICAgIC8vIFdlIG9ubHkgaGF2ZSBmaWxlbmFtZSBoZXJlCiAgfQogIGxldCBsb2NhbFZhbHVlOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIGxvY2FsVmFsdWU7CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIGlmICh2YWwgIT09ICIiKSB7CiAgICAgICAgbG9jYWxWYWx1ZSA9IHBhcnNlKHZhbCk7CiAgICAgIH0KICAgICAgdXBkYXRlKGxvY2FsVmFsdWUpOwogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7CiAgLy8gV2UgYWxzbyBhc3NpZ24gYSBsaXN0ZW5lciBzbyB0aGF0IHRoZSBlZGl0YWJsZSBpcyBibHVycmVkIHdoZW4gZW50ZXIgaXMgcHJlc3NlZAogIHNwYW4ub25rZXlkb3duID0gKGUpID0+IHsKICAgIGlmIChlLmtleUNvZGUgPT09IDEzKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgc3Bhbi5ibHVyKCk7CiAgICB9CiAgfTsKICBzcGFuLnZhbHVlID0gdmFsdWU7Cn0KCmZ1bmN0aW9uIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oc3Bhbiwga2V5KSB7CiAgLy8gSGVyZSB3ZSBtb3N0bHkgd2FudCB0byBkZWZpbmUgdGhlIHNldHRlciBhbmQgZ2V0dGVyCiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgLy8gaWYgdW5kZWZpbmVkIGlzIHBhc3NlZCwgd2UgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBvcHRpb25zCiAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGRlbGV0ZSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XSA9IHZhbDsKICAgICAgfQogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7Cn0KCmNvbnN0IGNvbmZpZ19zcGFucyA9IHt9Owpmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhnZXRJbWFnZU9wdGlvbnMoKSkpIHsKICBjb25zdCBjb250YWluZXIgPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoYC5jbGlwYm9hcmQtc3Bhbi4ke2tleX1gKTsKICBjb25zdCBsYWJlbCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIubGFiZWwiKTsKICAvLyBXZSBnaXZlIHRoZSBsYWJlbCBhIGZ1bmN0aW9uIHRoYXQgb24gc2luZ2xlIGNsaWNrIHdpbGwgc2V0IHRoZSBjdXJyZW50IHZhbHVlIGFuZCB3aXRoIGRvdWJsZSBjbGljayB3aWxsIHVuc2V0IGl0CiAgbGFiZWwub25jbGljayA9IER1YWxDbGljaygKICAgICgpID0+IHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0sCiAgICAoZSkgPT4gewogICAgICBjb25zb2xlLmxvZygiZSIsIGUpOwogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSB1bmRlZmluZWQ7CiAgICB9CiAgKTsKICBjb25zdCB1aV92YWx1ZV9zcGFuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtdmFsdWUiKTsKICBjb25zdCBjb25maWdfdmFsdWVfc3BhbiA9CiAgICBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNvbmZpZy12YWx1ZSIpID8/CiAgICBsYWJlbC5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAgICJhZnRlcmJlZ2luIiwKICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iY29uZmlnLXZhbHVlIj48L3NwYW4+YAogICAgKTsKICAvLyBBc3NpbmcgdGhlIHR3byBzcGFucyBhcyBwcm9wZXJ0aWVzIG9mIHRoZSBjb250YWluaW5nIHNwYW4KICBjb250YWluZXIudWlfc3BhbiA9IHVpX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmNvbmZpZ19zcGFuID0gY29uZmlnX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmtleSA9IGtleTsKICBjb25maWdfc3BhbnNba2V5XSA9IGNvbnRhaW5lcjsKICBpZiAoZmlyc3RSdW4pIHsKICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA9CiAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICAgIC8vIFdlIGRvIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdmFsdWUgc3BhbgogICAgaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHVpX3ZhbHVlX3NwYW4sIGtleSwgdmFsdWUpOwogICAgLy8gVGhlbiB3ZSBpbml0aWFsaXplIHRoZSBjb25maWcgdmFsdWUKICAgIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oY29uZmlnX3ZhbHVlX3NwYW4sIGtleSk7CiAgICAvLyBXZSBwdXQgc29tZSBjb252ZW5pZW5jZSBnZXR0ZXJzL3NldHRlcnMKICAgIC8vIHVpX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJ1aV92YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiB1aV92YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICB1aV92YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgICAvLyBjb25maWdfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgImNvbmZpZ192YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICB9Cn0KCi8vIFRoZXNlIG9iamVjdHMgd2lsbCBjb250YWluIHRoZSBkZWZhdWx0IHZhbHVlCgovLyBUaGlzIGNvZGUgdXBkYXRlcyB0aGUgaW1hZ2Ugb3B0aW9ucyBpbiB0aGUgUExPVCBjb25maWcgd2l0aCB0aGUgcHJvdmlkZWQgb25lcwpmdW5jdGlvbiBzZXRJbWFnZU9wdGlvbnMobykgewogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gb1trZXldOwogIH0KfQpmdW5jdGlvbiB1bnNldEltYWdlT3B0aW9ucygpIHsKICBzZXRJbWFnZU9wdGlvbnMoe30pOwp9Cgpjb25zdCBzZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4uc2V0Iik7CmNvbnN0IHVuc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnVuc2V0Iik7CmlmIChmaXJzdFJ1bikgewogIHNldF9idXR0b24ub25jbGljayA9IChlKSA9PiB7CiAgICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0KICB9OwogIHVuc2V0X2J1dHRvbi5vbmNsaWNrID0gdW5zZXRJbWFnZU9wdGlvbnM7Cn0KCi8vIFdlIGFkZCBhIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBjbGlwYm9hcmQgaXMgcG9wcGVkIG91dApDT05UQUlORVIuaXNQb3BwZWRPdXQgPSAoKSA9PiB7CiAgcmV0dXJuIENPTlRBSU5FUi5jbGFzc0xpc3QuY29udGFpbnMoInBvcHBlZC1vdXQiKTsKfTsKCkNMSVBCT0FSRF9IRUFERVIub25tb3VzZWRvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHsKICBpZiAoZXZlbnQudGFyZ2V0Lm1hdGNoZXMoInNwYW4uY2xpcGJvYXJkLXZhbHVlIikpIHsKICAgIGNvbnNvbGUubG9nKCJXZSBkb24ndCBtb3ZlISIpOwogICAgcmV0dXJuOwogIH0KICBjb25zdCBzdGFydCA9IHsKICAgIGxlZnQ6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLmxlZnQpLAogICAgdG9wOiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS50b3ApLAogICAgWDogZXZlbnQucGFnZVgsCiAgICBZOiBldmVudC5wYWdlWSwKICB9OwogIGZ1bmN0aW9uIG1vdmVBdChldmVudCwgc3RhcnQpIHsKICAgIGNvbnN0IHRvcCA9IGV2ZW50LnBhZ2VZIC0gc3RhcnQuWSArIHN0YXJ0LnRvcCArICJweCI7CiAgICBjb25zdCBsZWZ0ID0gZXZlbnQucGFnZVggLSBzdGFydC5YICsgc3RhcnQubGVmdCArICJweCI7CiAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9IHRvcDsKICB9CgogIC8vIG1vdmUgb3VyIGFic29sdXRlbHkgcG9zaXRpb25lZCBiYWxsIHVuZGVyIHRoZSBwb2ludGVyCiAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQpIHsKICAgIG1vdmVBdChldmVudCwgc3RhcnQpOwogIH0KCiAgLy8gV2UgdXNlIHRoaXMgdG8gcmVtb3ZlIHRoZSBtb3VzZW1vdmUgd2hlbiBjbGlja2luZyBvdXRzaWRlIG9mIHRoZSBjb250YWluZXIKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICAvLyBtb3ZlIHRoZSBjb250YWluZXIgb24gbW91c2Vtb3ZlCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgb25Nb3VzZU1vdmUsIHsKICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsCiAgfSk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgY2xlYW5VcCgpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7CgogIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICBjb25zb2xlLmxvZygiY2xlYW5pbmcgdXAgdGhlIHBsb3QgbW92ZSBsaXN0ZW5lciIpOwogICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBudWxsOwogIH0KCiAgLy8gKDMpIGRyb3AgdGhlIGJhbGwsIHJlbW92ZSB1bm5lZWRlZCBoYW5kbGVycwogIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gY2xlYW5VcDsKfTsKCmZ1bmN0aW9uIHNlbmRUb0NsaXBib2FyZChibG9iKSB7CiAgaWYgKCFuYXZpZ2F0b3IuY2xpcGJvYXJkKSB7CiAgICBhbGVydCgKICAgICAgIlRoZSBDbGlwYm9hcmQgQVBJIGRvZXMgbm90IHNlZW0gdG8gYmUgYXZhaWxhYmxlLCBtYWtlIHN1cmUgdGhlIFBsdXRvIG5vdGVib29rIGlzIGJlaW5nIHVzZWQgZnJvbSBlaXRoZXIgbG9jYWxob3N0IG9yIGFuIGh0dHBzIHNvdXJjZS4iCiAgICApOwogIH0KICBuYXZpZ2F0b3IuY2xpcGJvYXJkCiAgICAud3JpdGUoWwogICAgICBuZXcgQ2xpcGJvYXJkSXRlbSh7CiAgICAgICAgLy8gVGhlIGtleSBpcyBkZXRlcm1pbmVkIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBibG9iJ3MgdHlwZS4KICAgICAgICBbYmxvYi50eXBlXTogYmxvYiwKICAgICAgfSksCiAgICBdKQogICAgLnRoZW4oCiAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICBjb25zb2xlLmxvZygiQXN5bmM6IENvcHlpbmcgdG8gY2xpcGJvYXJkIHdhcyBzdWNjZXNzZnVsISIpOwogICAgICB9LAogICAgICBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiQXN5bmM6IENvdWxkIG5vdCBjb3B5IHRleHQ6ICIsIGVycik7CiAgICAgIH0KICAgICk7Cn0KCmZ1bmN0aW9uIGNvcHlJbWFnZVRvQ2xpcGJvYXJkKCkgewogIC8vIFdlIGV4dHJhY3QgdGhlIGltYWdlIG9wdGlvbnMgZnJvbSB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycyAoaWYgdGhleSBleGlzdCkKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LiBXZSBhbHNvIGlnbm9yZSBmb3JtYXQgYmVjYXVzZSB0aGUgY2xpcGJvYXJkIG9ubHkgc3VwcG9ydHMgcG5nLgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gImZvcm1hdCIpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LnRvSW1hZ2UoUExPVCwgY29uZmlnKS50aGVuKGZ1bmN0aW9uIChkYXRhVXJsKSB7CiAgICBmZXRjaChkYXRhVXJsKQogICAgICAudGhlbigocmVzKSA9PiByZXMuYmxvYigpKQogICAgICAudGhlbigoYmxvYikgPT4gewogICAgICAgIGNvbnN0IHBhc3RlX3JlY2VpdmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigncGFzdGUtcmVjZWl2ZXIucGx1dG9wbG90bHknKQogICAgICAgIGlmIChwYXN0ZV9yZWNlaXZlcikgewogICAgICAgICAgcGFzdGVfcmVjZWl2ZXIuYXR0YWNoSW1hZ2UoZGF0YVVybCwgQ09OVEFJTkVSKQogICAgICAgIH0KICAgICAgICBzZW5kVG9DbGlwYm9hcmQoYmxvYikKICAgICAgfSk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHNhdmVJbWFnZVRvRmlsZSgpIHsKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS5kb3dubG9hZEltYWdlKFBMT1QsIGNvbmZpZyk7Cn0KCmxldCBjb250YWluZXJfcmVjdCA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCwgdG9wOiAwLCBsZWZ0OiAwIH07CmZ1bmN0aW9uIHVucG9wX2NvbnRhaW5lcihjbCkgewogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgZmFsc2UpOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBmYWxzZSk7CiAgLy8gV2UgZml4IHRoZSBoZWlnaHQgYmFjayB0byB0aGUgdmFsdWUgaXQgaGFkIGJlZm9yZSBwb3BvdXQsIGFsc28gc2V0dGluZyB0aGUgZmxhZyB0byBzaWduYWwgdGhhdCB1cG9uIGZpcnN0IHJlc2l6ZSB3ZSByZW1vdmUgdGhlIGZpeGVkIGlubGluZS1zdHlsZQogIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQgKyAicHgiOwogIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IHRydWU7CiAgLy8gV2Ugc2V0IHRoZSBvdGhlciBmaXhlZCBpbmxpbmUtc3R5bGVzIHRvIG51bGwKICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICBDT05UQUlORVIuc3R5bGUudG9wID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBXZSBhbHNvIHJlbW92ZSB0aGUgQ0xJUEJPQVJEX0hFQURFUgogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSAiIjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBGaW5hbGx5IHdlIHJlbW92ZSB0aGUgaGlkZGVuIGNsYXNzIHRvIHRoZSBoZWFkZXIKICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIHRydWUpOwogIHJldHVybjsKfQpmdW5jdGlvbiBwb3BvdXRfY29udGFpbmVyKG9wdHMpIHsKICBjb25zdCBjbCA9IG9wdHM/LmNsOwogIGNvbnN0IHRhcmdldF9jb250YWluZXJfc2l6ZSA9IG9wdHM/LnRhcmdldF9jb250YWluZXJfc2l6ZSA/PyB7fTsKICBjb25zdCB0YXJnZXRfcGxvdF9zaXplID0gb3B0cz8udGFyZ2V0X3Bsb3Rfc2l6ZSA/PyB7fTsKICBpZiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIHJldHVybiB1bnBvcF9jb250YWluZXIoY2wpOwogIH0KICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgY2wgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdHJ1ZSk7CiAgLy8gV2UgZXh0cmFjdCB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjb250YWluZXIsIHNhdmUgdGhlbSBhbmQgZml4IHRoZW0KICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9ID0gQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogIGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfTsKICAvLyBXZSBzYXZlIHRoZSBjdXJyZW50IHBsb3Qgc2l6ZSBiZWZvcmUgd2UgcG9wIGFzIGl0IHdpbGwgZmlsbCB0aGUgc2NyZWVuCiAgY29uc3QgY3VycmVudF9wbG90X3NpemUgPSB7CiAgICB3aWR0aDogUExPVC5fZnVsbExheW91dC53aWR0aCwKICAgIGhlaWdodDogUExPVC5fZnVsbExheW91dC5oZWlnaHQsCiAgfTsKICAvLyBXZSBoYXZlIHRvIHNhdmUgdGhlIHBhZCBkYXRhIGJlZm9yZSBwb3BwaW5nIHNvIHdlIGNhbiByZXNpemUgcHJlY2lzZWx5CiAgY29uc3QgcGFkID0ge307CiAgcGFkLnVucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgdHJ1ZSk7CiAgcGFkLnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICAvLyBXZSBkbyB0b3AgYW5kIGxlZnQgYmFzZWQgb24gdGhlIGN1cnJlbnQgcmVjdAogIGZvciAoY29uc3Qga2V5IG9mIFsidG9wIiwgImxlZnQiXSkgewogICAgY29uc3Qgc3RhcnRfdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY29udGFpbmVyX3JlY3Rba2V5XTsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgZm9yIChjb25zdCBraW5kIG9mIFsicGFkZGluZyIsICJib3JkZXIiXSkgewogICAgICBvZmZzZXQgKz0gcGFkLnBvcHBlZFtraW5kXVtrZXldIC0gcGFkLnVucG9wcGVkW2tpbmRdW2tleV07CiAgICB9CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHN0YXJ0X3ZhbCAtIG9mZnNldCArICJweCI7CiAgICBpZiAoa2V5ID09PSAibGVmdCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIC8vIFdlIGNvbXB1dGUgdGhlIHdpZHRoIGFuZCBoZWlnaHQgZGVwZW5kaW5nIG9uIGV2ZW50dWFsIGNvbmZpZyBkYXRhCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoewogICAgd2lkdGg6CiAgICAgIHRhcmdldF9wbG90X3NpemUud2lkdGggPz8KICAgICAgY29uZmlnX3NwYW5zLndpZHRoLmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS5oZWlnaHQgPz8KICAgICAgY29uZmlnX3NwYW5zLmhlaWdodC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUuaGVpZ2h0LAogIH0pOwogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIGNvbnN0IHZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNzeltrZXldOwogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSB2YWwgKyAicHgiOwogICAgaWYgKGtleSA9PT0gIndpZHRoIikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCBmYWxzZSk7CiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgdW5wb3BfY29udGFpbmVyKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKfQoKQ09OVEFJTkVSLnBvcE91dCA9IHBvcG91dF9jb250YWluZXI7CgpmdW5jdGlvbiBEdWFsQ2xpY2soc2luZ2xlX2Z1bmMsIGRibF9mdW5jKSB7CiAgbGV0IG5jbGlja3MgPSAwOwogIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykgewogICAgbmNsaWNrcyArPSAxOwogICAgaWYgKG5jbGlja3MgPiAxKSB7CiAgICAgIGRibF9mdW5jKC4uLmFyZ3MpOwogICAgICBuY2xpY2tzID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIGRlbGF5KDMwMCkudGhlbigoKSA9PiB7CiAgICAgICAgaWYgKG5jbGlja3MgPT0gMSkgewogICAgICAgICAgc2luZ2xlX2Z1bmMoLi4uYXJncyk7CiAgICAgICAgfQogICAgICAgIG5jbGlja3MgPSAwOwogICAgICB9KTsKICAgIH0KICB9Owp9CgovLyBXZSByZW1vdmUgdGhlIGRlZmF1bHQgZG93bmxvYWQgaW1hZ2UgYnV0dG9uCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSwKICBbInRvSW1hZ2UiXQopOwovLyBXZSBhZGQgdGhlIGN1c3RvbSBidXR0b24gdG8gdGhlIG1vZGViYXIKcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkLAogIFsKICAgIHsKICAgICAgbmFtZTogIkNvcHkgUE5HIHRvIENsaXBib2FyZCIsCiAgICAgIGljb246IHsKICAgICAgICBoZWlnaHQ6IDUyMCwKICAgICAgICB3aWR0aDogNTIwLAogICAgICAgIHBhdGg6ICJNMjgwIDY0aDQwYzM1LjMgMCA2NCAyOC43IDY0IDY0VjQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEg2NGMtMzUuMyAwLTY0LTI4LjctNjQtNjRWMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0aDQwIDkuNkMxMjEgMjcuNSAxNTMuMyAwIDE5MiAwczcxIDI3LjUgNzguNCA2NEgyODB6TTY0IDExMmMtOC44IDAtMTYgNy4yLTE2IDE2VjQ0OGMwIDguOCA3LjIgMTYgMTYgMTZIMzIwYzguOCAwIDE2LTcuMiAxNi0xNlYxMjhjMC04LjgtNy4yLTE2LTE2LTE2SDMwNHYyNGMwIDEzLjMtMTAuNyAyNC0yNCAyNEgxOTIgMTA0Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNFYxMTJINjR6bTEyOC04YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHoiLAogICAgICB9LAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soY29weUltYWdlVG9DbGlwYm9hcmQsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKCk7CiAgICAgIH0pLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIkRvd25sb2FkIEltYWdlIiwKICAgICAgaWNvbjogUGxvdGx5Lkljb25zLmNhbWVyYSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKHNhdmVJbWFnZVRvRmlsZSwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoeyBjbDogImZpbGVzYXZlIiB9KTsKICAgICAgfSksCiAgICB9LAogIF0KKTsKCmZ1bmN0aW9uIGdldE9mZnNldERhdGEoZWwpIHsKICBsZXQgY3MgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgbnVsbCk7CiAgY29uc3Qgb2RhdGEgPSB7CiAgICBwYWRkaW5nOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgfSwKICAgIGJvcmRlcjogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgfQogIH07CiAgaWYgKGVsID09PSBQTE9UKSB7CiAgICAvLyBGb3IgdGhlIFBMT1Qgd2UgYWxzbyB3YW50IHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBvZmZzZXQKICAgIG9kYXRhLm9mZnNldCA9IHsKICAgICAgdG9wOiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldFRvcCA6IDAsCiAgICAgIGxlZnQ6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0TGVmdCA6IDAsCiAgICB9CiAgfQogIHJldHVybiBvZGF0YTsKfQpmdW5jdGlvbiBnZXRTaXplRGF0YSgpIHsKICBjb25zdCBkYXRhID0gewogICAgcGxvdF9wYWQ6IGdldE9mZnNldERhdGEoUExPVCksCiAgICBwbG90X3JlY3Q6IFBMT1QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgICBjb250YWluZXJfcGFkOiBnZXRPZmZzZXREYXRhKENPTlRBSU5FUiksCiAgICBjb250YWluZXJfcmVjdDogQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogIH07CiAgcmV0dXJuIGRhdGE7Cn0KZnVuY3Rpb24gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGNvbnN0IGNvbXB1dGVkX3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIGNvbnN0IG9mZnNldHMgPSBjb21wdXRlZF9zaXplLm9mZnNldHM7CgogIGNvbnN0IHBsb3RfZGF0YSA9IHsKICAgIHdpZHRoOiB3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiBoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfTsKCiAgcmV0dXJuIHsKICAgIHdpZHRoOiAod2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCkgKyBvZmZzZXRzLndpZHRoLAogICAgaGVpZ2h0OiAoaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0KSArIG9mZnNldHMuaGVpZ2h0LAogICAgbm9DaGFuZ2U6IHdpZHRoID09IGNvbXB1dGVkX3NpemUud2lkdGggJiYgaGVpZ2h0ID09IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH0KfQoKLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGNoYW5nZSB0aGUgY29udGFpbmVyIHNpemUgc28gdGhhdCB0aGUgcmVzdWx0aW5nIHBsb3Qgd2lsbCBiZSBtYXRjaGluZyB0aGUgcHJvdmlkZWQgc3BlY3MKZnVuY3Rpb24gY2hhbmdlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgaWYgKCFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgY29uc29sZS5sb2coIlRyaWVkIHRvIGNoYW5nZSBjb250YWluZXIgc2l6ZSB3aGVuIG5vdCBwb3BwZWQsIGlnbm9yaW5nIik7CiAgICByZXR1cm47CiAgfQoKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEpOwoKICBpZiAoY3N6Lm5vQ2hhbmdlKSB7CiAgICBjb25zb2xlLmxvZygiU2l6ZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50LCBpZ25vcmluZyIpOwogICAgcmV0dXJuCiAgfQogIC8vIFdlIGFyZSBub3cgZ29pbmcgdG8gc2V0IGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGNvbnRhaW5lcgogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gY3N6W2tleV0gKyAicHgiOwogIH0KfQovLyBXZSBub3cgY3JlYXRlIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgdXBkYXRlIHRoZSBwbG90IGJhc2VkIG9uIHRoZSB2YWx1ZXMgc3BlY2lmaWVkCmZ1bmN0aW9uIHVwZGF0ZUZyb21IZWFkZXIoKSB7CiAgY29uc3QgaGVhZGVyX2RhdGEgPSB7CiAgICBoZWlnaHQ6IGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUsCiAgICB3aWR0aDogY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlLAogIH07CiAgY2hhbmdlQ29udGFpbmVyU2l6ZShoZWFkZXJfZGF0YSk7Cn0KLy8gV2UgYXNzaWduIHRoaXMgZnVuY3Rpb24gdG8gdGhlIG9uYmx1ciBldmVudCBvZiB3aWR0aCBhbmQgaGVpZ2h0CmlmIChmaXJzdFJ1bikgewogIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLnVpX3NwYW4ub25ibHVyID0gKGUpID0+IHsKICAgICAgY29udGFpbmVyLnVpX3ZhbHVlID0gY29udGFpbmVyLnVpX3NwYW4udGV4dENvbnRlbnQ7CiAgICAgIHVwZGF0ZUZyb21IZWFkZXIoKTsKICAgIH07CiAgfQp9Ci8vIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIHBsb3Qgc2l6ZSB0byB1c2UgZm9yIHJlbGF5b3V0IGFzIGEgZnVuY3Rpb24gb2YgdGhlIGNvbnRhaW5lciBzaXplCmZ1bmN0aW9uIGNvbXB1dGVQbG90U2l6ZShkYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIC8vIFJlbW92ZSBQYWRkaW5nCiAgY29uc3QgeyBjb250YWluZXJfcGFkLCBwbG90X3BhZCwgY29udGFpbmVyX3JlY3QgfSA9IGRhdGE7CiAgY29uc3Qgb2Zmc2V0cyA9IHsKICAgIHdpZHRoOgogICAgICBwbG90X3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLndpZHRoICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LmxlZnQgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci53aWR0aCwKICAgIGhlaWdodDoKICAgICAgcGxvdF9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBwbG90X3BhZC5ib3JkZXIuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LnRvcCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci5oZWlnaHQsCiAgfTsKICBjb25zdCBzeiA9IHsKICAgIHdpZHRoOiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LndpZHRoIC0gb2Zmc2V0cy53aWR0aCksCiAgICBoZWlnaHQ6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3QuaGVpZ2h0IC0gb2Zmc2V0cy5oZWlnaHQpLAogICAgb2Zmc2V0cywKICB9OwogIHJldHVybiBzejsKfQoKLy8gQ3JlYXRlIHRoZSByZXNpemVPYnNlcnZlciB0byBtYWtlIHRoZSBwbG90IGV2ZW4gbW9yZSByZXNwb25zaXZlISA6bWFnaWM6CmNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7CiAgY29uc3Qgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpOwogIGNvbnN0IHtjb250YWluZXJfcmVjdCwgY29udGFpbmVyX3BhZH0gPSBzaXplRGF0YTsKICBsZXQgcGxvdF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICAvLyBXZSBzYXZlIHRoZSBoZWlnaHQgaW4gdGhlIFBMT1Qgb2JqZWN0CiAgUExPVC5jb250YWluZXJfaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0OwogIC8vIFdlIGRlYWwgd2l0aCBzb21lIHN0dWZmIGlmIHRoZSBjb250YWluZXIgaXMgcG9wcHBlZAogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSBjb250YWluZXJfcmVjdC53aWR0aCArICJweCI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gY29udGFpbmVyX3JlY3QubGVmdCArICJweCI7CiAgY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS5oZWlnaHQ7CiAgY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlID0gcGxvdF9zaXplLndpZHRoOwogIC8qIAoJCVRoZSBhZGRpdGlvbiBvZiB0aGUgaW52YWxpZCBhcmd1bWVudCBgcGx1dG9yZXNpemVgIHNlZW1zIHRvIGZpeCB0aGUgcHJvYmxlbSB3aXRoIGNhbGxpbmcgYHJlbGF5b3V0YCBzaW1wbHkgd2l0aCBge2F1dG9zaXplOiB0cnVlfWAgYXMgdXBkYXRlIGJyZWFraW5nIG1vdXNlIHJlbGF5b3V0IGV2ZW50cyB0cmFja2luZy4gCgkJU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wbG90bHkvcGxvdGx5LmpzL2lzc3Vlcy82MTU2IGZvciBkZXRhaWxzCgkJKi8KICBsZXQgY29uZmlnID0gewogICAgLy8gSWYgdGhpcyBpcyBwb3BwZWQgb3V0LCB3ZSBpZ25vcmUgdGhlIG9yaWdpbmFsIHdpZHRoL2hlaWdodAogICAgd2lkdGg6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX3dpZHRoKSA/PyBwbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX2hlaWdodCkgPz8gcGxvdF9zaXplLmhlaWdodCwKICAgIHBsdXRvcmVzaXplOiB0cnVlLAogIH07CiAgUGxvdGx5LnJlbGF5b3V0KFBMT1QsIGNvbmZpZykudGhlbigoKSA9PiB7CiAgICBpZiAocmVtb3ZlX2NvbnRhaW5lcl9zaXplICYmICFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBhdm9pZCB0aGUgZmlyc3QgcmVzaXplIHVwb24gcGxvdCBjcmVhdGlvbiB0byBhbHJlYWR5IGJlIHdpdGhvdXQgYSBmaXhlZCBoZWlnaHQKICAgICAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9ICIiOwogICAgICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICAgICAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmFsc2U7CiAgICB9CiAgfSk7Cn0pOwoKcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShDT05UQUlORVIpOwoKClBsb3RseS5yZWFjdChQTE9ULCBwbG90X29iaikudGhlbigoKSA9PiB7CgkvLyBBc3NpZ24gdGhlIFBsb3RseSBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhwbG90bHlfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1Qub24oa2V5LCBsaXN0ZW5lcikKCQl9Cgl9CgkvLyBBc3NpZ24gdGhlIEpTIGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKGpzX2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULmFkZEV2ZW50TGlzdGVuZXIoa2V5LCBsaXN0ZW5lciwgewoJCQkJc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbAoJCQl9KQoJCX0KCX0KfQopCgoKaW52YWxpZGF0aW9uLnRoZW4oKCkgPT4gewoJLy8gUmVtb3ZlIGFsbCBwbG90bHkgbGlzdGVuZXJzCglQTE9ULnJlbW92ZUFsbExpc3RlbmVycygpCgkvLyBSZW1vdmUgYWxsIEpTIGxpc3RlbmVycwoJY29udHJvbGxlci5hYm9ydCgpCgkvLyBSZW1vdmUgdGhlIHJlc2l6ZU9ic2VydmVyCglyZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCkKfSkKCgoKCQlyZXR1cm4gQ09OVEFJTkVSCgk8L3NjcmlwdD4KpG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv6MVLMnRsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQxYzc5YjM3ZS1kNGUwLTQ5MGYtOTQ2Ni0yMGNlMjhmMDE3YWW5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4HS+DLtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5HZNWIzYjg0MDhjLTgxODEtMTFlZi0xNGViLWUxYzU2OWI4YmIyOS9kM2Y4YmM2YWVmNWJjOTM0uGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJGFiOGRjMWNlLWQxZWYtNDNhMC05NDk1LWRhYzkzMWI1MmFlY4qmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHmkdHJ1ZaRtaW1lqnRleHQvcGxhaW6scm9vdGFzc2lnbmVlsWFjdGl2aXR5X2ZpbmlzaGVksmxhc3RfcnVuX3RpbWVzdGFtcMtB2b+jFTu/d7BwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkYWI4ZGMxY2UtZDFlZi00M2EwLTk0OTUtZGFjOTMxYjUyYWVjuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXNN0K1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQ4YjRhMWFkOS0yZDZhLTRjOGYtYmI4ZS1mNDNjMmQwNTgxOTWKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52mqJCTxzY3JpcHQgaWQ9J3Bsb3RfMSc+CgkJLy8gV2Ugc3RhcnQgYnkgcHV0dGluZyBhbGwgdGhlIHZhcmlhYmxlIGludGVycG9sYXRpb24gaGVyZSBhdCB0aGUgYmVnaW5uaW5nCgkJLy8gV2UgaGF2ZSB0byBjb252ZXJ0IGFsbCB0eXBlZGFycmF5cyBpbiB0aGUgbGF5b3V0IHRvIG5vcm1hbCBhcnJheXMuIFNlZSBJc3N1ZSAjMjUKCQkvLyBXZSB1c2UgbG9kYXNoIGZvciB0aGlzIGZvciBjb21wYWN0bmVzcwoJCWZ1bmN0aW9uIHJlbW92ZVR5cGVkQXJyYXkobykgewoJCQlyZXR1cm4gXy5pc1R5cGVkQXJyYXkobykgPyBBcnJheS5mcm9tKG8pIDoKCQkJXy5pc1BsYWluT2JqZWN0KG8pID8gXy5tYXBWYWx1ZXMobywgcmVtb3ZlVHlwZWRBcnJheSkgOiAKCQkJbwoJCX0KCgkJLy8gUHVibGlzaCB0aGUgcGxvdCBvYmplY3QgdG8gSlMKCQlsZXQgcGxvdF9vYmogPSBfLnVwZGF0ZSgvKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIEFic3RyYWN0UGx1dG9EaW5nZXRqZXMuRGlzcGxheS5wdWJsaXNoZWRfdG9fanMgKi8gZ2V0UHVibGlzaGVkT2JqZWN0KCJiM2I4NDA4Yy04MTgxLTExZWYtMTRlYi1lMWM1NjliOGJiMjkvYjdiZjk2ZTRiMWIwMWM4YyIpLCAibGF5b3V0IiwgcmVtb3ZlVHlwZWRBcnJheSkKCQkvLyBHZXQgdGhlIHBsb3RseSBsaXN0ZW5lcnMKCQljb25zdCBwbG90bHlfbGlzdGVuZXJzID0ge30KCQkvLyBHZXQgdGhlIEpTIGxpc3RlbmVycwoJCWNvbnN0IGpzX2xpc3RlbmVycyA9IHt9CgkJLy8gRGVhbCB3aXRoIGV2ZW50dWFsIGN1c3RvbSBjbGFzc2VzCgkJbGV0IGN1c3RvbV9jbGFzc2xpc3QgPSBbXQoKCgkJLy8gTG9hZCB0aGUgcGxvdGx5IGxpYnJhcnkKCQlsZXQgUGxvdGx5ID0gdW5kZWZpbmVkCgkJdHJ5IHsKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoIi4vcGxvdGx5anMvcGxvdGx5anMtMi4yNi4yLm1pbi5qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0gY2F0Y2ggKGUpIHsKCQkJY29uc29sZS5sb2coIkxvY2FsIGxvYWQgZmFpbGVkLCB0cnlpbmcgd2l0aCB0aGUgd2ViIGVzbS5zaCB2ZXJzaW9uIikKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoImh0dHBzOi8vZXNtLnNoL3YxMzUvcGxvdGx5LmpzLWRpc3QtbWluQDIuMjYuMi9lc25leHQvcGxvdGx5LmpzLWRpc3QtbWluLm1qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0KCgkJLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0byBmb3JjZSBsb2NhbCBtYXRoamF4IGZvbnQgY2FjaGUKCQlpZiAoZmFsc2UgJiYgd2luZG93Py5NYXRoSmF4Py5jb25maWc/LnN2Zz8uZm9udENhY2hlID09PSAnZ2xvYmFsJykgewoJCQl3aW5kb3cuTWF0aEpheC5jb25maWcuc3ZnLmZvbnRDYWNoZSA9ICdsb2NhbCcKCQl9CgoJCS8vIEZsYWcgdG8gY2hlY2sgaWYgdGhpcyBjZWxsIHdhcyAgbWFudWFsbHkgcmFuIG9yIHJlYWN0aXZlbHkgcmFuCmNvbnN0IGZpcnN0UnVuID0gdGhpcyA/IGZhbHNlIDogdHJ1ZQpjb25zdCBDT05UQUlORVIgPSB0aGlzID8/IGh0bWxgPGRpdiBjbGFzcz0ncGx1dG9wbG90bHktY29udGFpbmVyJz5gCmNvbnN0IFBMT1QgPSBDT05UQUlORVIucXVlcnlTZWxlY3RvcignLmpzLXBsb3RseS1wbG90JykgPz8gQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgPGRpdj5gKQpjb25zdCBwYXJlbnQgPSBDT05UQUlORVIucGFyZW50RWxlbWVudAovLyBXZSB1c2UgYSBjb250cm9sbGVyIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lcnMgdXBvbiBpbnZhbGlkYXRpb24KY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKQovLyBXZSBoYXZlIHRvIGFkZCB0aGlzIHRvIGtlZXAgc3VwcG9ydGluZyBAYmluZCB3aXRoIHRoZSBvbGQgQVBJIHVzaW5nIFBMT1QKUExPVC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChlKSA9PiB7CglDT05UQUlORVIudmFsdWUgPSBQTE9ULnZhbHVlCglpZiAoZS5idWJibGVzKSB7CgkJcmV0dXJuCgl9CglDT05UQUlORVIuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2lucHV0JykpCn0sIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KQoKCS8vIFRoaXMgY3JlYXRlIHRoZSBzdHlsZSBzdWJkaXYgb24gZmlyc3QgcnVuCglmaXJzdFJ1biAmJiBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGAKCTxzdHlsZT4KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgewoJCXdpZHRoOiAxMDAlOwoJCWhlaWdodDogMTAwJTsKCQltaW4taGVpZ2h0OiAwOwoJCW1pbi13aWR0aDogMDsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgLmpzLXBsb3RseS1wbG90IC5wbG90bHkgZGl2IHsKCQltYXJnaW46IDAgYXV0bzsgLy8gVGhpcyBjZW50ZXJzIHRoZSBwbG90Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLnBvcHBlZC1vdXQgewoJCW92ZXJmbG93OiBhdXRvOwoJCXotaW5kZXg6IDEwMDA7CgkJcG9zaXRpb246IGZpeGVkOwoJCXJlc2l6ZTogYm90aDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDBweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMHB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgewoJCWRpc3BsYXk6IGZsZXg7CgkJZmxleC1mbG93OiByb3cgd3JhcDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAxMnB4OwoJCXBvc2l0aW9uOiBmaXhlZDsKCQl6LWluZGV4OiAxMDAxOwoJCWN1cnNvcjogbW92ZTsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIC0xMDAlKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBzcGFuIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJZmxleDogMQoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIuaGlkZGVuIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuIHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlIHsKCQlwYWRkaW5nLXJpZ2h0OiA1cHg7CgkJcGFkZGluZy1sZWZ0OiAycHg7CgkJY3Vyc29yOiB0ZXh0OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZmxleDogMCAwIDEwMCU7CgkJdGV4dC1hbGlnbjogY2VudGVyOwoJCWJvcmRlci10b3A6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQltYXJnaW4tdG9wOiA1cHg7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZpbGVuYW1lIHsKCQltYXJnaW4tbGVmdDogM3B4OwoJCXRleHQtYWxpZ246IGxlZnQ7CgkJbWluLXdpZHRoOiBtaW4oNjAlLCBtaW4tY29udGVudCk7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCAubGFiZWwgewoJCWZsZXg6IDAgMCAwOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5mb3JtYXQgewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCQlmbGV4OiAxIDAgYXV0bzsKCQltaW4td2lkdGg6IDMwcHg7CgkJbWFyZ2luLXJpZ2h0OiAxMHB4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCQlmbGV4LWZsb3c6IGNvbHVtbjsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlwYWRkaW5nLWxlZnQ6IDNweDsKCQl6LWluZGV4OiAyMDAwOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIHsKCQljdXJzb3I6IHBvaW50ZXI7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJcGFkZGluZzogM3B4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKC0zcHgsIC02cHgpOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpub3QoLnNlbGVjdGVkKSB7CgkJbWFyZ2luLXRvcDogM3B4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uLnNlbGVjdGVkIHsKCQlvcmRlcjogLTE7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246aG92ZXIgewoJCWJhY2tncm91bmQtY29sb3I6IHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJfQoJc3Bhbi5jb25maWctdmFsdWUgewoJCWZvbnQtd2VpZ2h0OiBub3JtYWw7CgkJY29sb3I6IHZhcigtLXBsdXRvLW91dHB1dC1jb2xvcik7CgkJZGlzcGxheTogbm9uZTsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIGNhbGMoLTEwMCUgLSAxMHB4KSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLmxhYmVsIHsKCQl1c2VyLXNlbGVjdDogbm9uZTsKCX0KCS5sYWJlbDpob3ZlciBzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCW1pbi13aWR0aDogMTUwcHg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4ubWF0Y2hpbmctY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLW1hY3JvLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5kaWZmZXJlbnQtY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLXRhZy1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9Cjwvc3R5bGU+CmApCgpsZXQgb3JpZ2luYWxfaGVpZ2h0ID0gcGxvdF9vYmoubGF5b3V0LmhlaWdodApsZXQgb3JpZ2luYWxfd2lkdGggPSBwbG90X29iai5sYXlvdXQud2lkdGgKLy8gRm9yIHRoZSBoZWlnaHQgd2UgaGF2ZSB0byBhbHNvIHB1dCBhIGZpeGVkIHZhbHVlIGluIGNhc2UgdGhlIHBsb3QgaXMgcHV0IG9uIGEgbm9uLWZpeGVkLXNpemUgY29udGFpbmVyIChsaWtlIHRoZSBkZWZhdWx0IHdyYXBwZXIpCi8vIFdlIGRlZmluZSBhIHZhcmlhYmxlIHRvIGNoZWNrIHdoZXRoZXIgd2Ugc3RpbGwgaGF2ZSB0byByZW1vdmUgdGhlIGZpeGVkIGhlaWdodApsZXQgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmlyc3RSdW4KbGV0IGNvbnRhaW5lcl9oZWlnaHQgPSBvcmlnaW5hbF9oZWlnaHQgPz8gUExPVC5jb250YWluZXJfaGVpZ2h0ID8/IDQwMApDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX2hlaWdodCArICdweCcKCi8vIFdlIGNyZWF0ZSBhIFByb21pc2UgdmVyc2lvbiBvZiBzZXRUaW1lb3V0CmZ1bmN0aW9uIGRlbGF5KG1zKSB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7Cn0KCi8vIFdlIGltcG9ydCBpbnRlcmFjdCBmb3IgZHJhZ2dpbmcvcmVzaXppbmcKY29uc3QgeyBkZWZhdWx0OiBpbnRlcmFjdCB9ID0gYXdhaXQgaW1wb3J0KCdodHRwczovL2VzbS5zaC9pbnRlcmFjdGpzQDEuMTAuMTknKQoKCmZ1bmN0aW9uIGdldEltYWdlT3B0aW9ucygpIHsKICBjb25zdCBvID0gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogIHJldHVybiB7CiAgICBmb3JtYXQ6IG8uZm9ybWF0ID8/ICJwbmciLAogICAgd2lkdGg6IG8ud2lkdGggPz8gb3JpZ2luYWxfd2lkdGgsCiAgICBoZWlnaHQ6IG8uaGVpZ2h0ID8/IG9yaWdpbmFsX2hlaWdodCwKICAgIHNjYWxlOiBvLnNjYWxlID8/IDEsCiAgICBmaWxlbmFtZTogby5maWxlbmFtZSA/PyAibmV3cGxvdCIsCiAgfTsKfQoKY29uc3QgQ0xJUEJPQVJEX0hFQURFUiA9CiAgQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoIi5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIikgPz8KICBDT05UQUlORVIuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgImFmdGVyYmVnaW4iLAogICAgaHRtbGA8ZGl2IGNsYXNzPSJwbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIGhpZGRlbiI+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmb3JtYXQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+Rm9ybWF0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZvcm1hdCI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB3aWR0aCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5XaWR0aDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSB3aWR0aCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGhlaWdodCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5IZWlnaHQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgaGVpZ2h0Ij48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2NhbGUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+U2NhbGU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgc2NhbGUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzZXQiPlNldDwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB1bnNldCI+VW5zZXQ8L2J1dHRvbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZpbGVuYW1lIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZpbGVuYW1lOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZpbGVuYW1lIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgIDwvZGl2PmAKICApOwoKZnVuY3Rpb24gY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcikgewogIGNvbnN0IHZhbGlkX2NsYXNzZXMgPSBbCiAgICAibWlzc2luZy1jb25maWciLAogICAgIm1hdGNoaW5nLWNvbmZpZyIsCiAgICAiZGlmZmVyZW50LWNvbmZpZyIsCiAgXTsKICBmdW5jdGlvbiBzZXRDbGFzcyhjbCkgewogICAgZm9yIChjb25zdCBuYW1lIG9mIHZhbGlkX2NsYXNzZXMpIHsKICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUobmFtZSwgbmFtZSA9PSBjbCk7CiAgICB9CiAgfQogIC8vIFdlIHVzZSB0aGUgY3VzdG9tIGdldHRlcnMgd2UnbGwgc2V0IHVwIGluIHRoZSBjb250YWluZXIKICBjb25zdCB7IHVpX3ZhbHVlLCBjb25maWdfdmFsdWUsIGNvbmZpZ19zcGFuLCBrZXkgfSA9IGNvbnRhaW5lcjsKICBpZiAoY29uZmlnX3ZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgIHNldENsYXNzKCJtaXNzaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBpcyBub3QgcHJlc2VudCBpbiB0aGUgY29uZmlnLmA7CiAgfSBlbHNlIGlmICh1aV92YWx1ZSA9PSBjb25maWdfdmFsdWUpIHsKICAgIHNldENsYXNzKCJtYXRjaGluZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIHRoZSBzYW1lIHZhbHVlIGluIHRoZSBjb25maWcgYW5kIGluIHRoZSBoZWFkZXIuYDsKICB9IGVsc2UgewogICAgc2V0Q2xhc3MoImRpZmZlcmVudC1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIGEgZGlmZmVyZW50IHZhbHVlICg8ZW0+JHtjb25maWdfdmFsdWV9PC9lbT4pIGluIHRoZSBjb25maWcuYDsKICB9CiAgLy8gQWRkIGluZm8gYWJvdXQgc2V0dGluZyBhbmQgdW5zZXR0aW5nCiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIG9uIHRoZSBsYWJlbCA8ZW0+PGI+b25jZTwvYj48L2VtPiB0byBzZXQgdGhlIGN1cnJlbnQgVUkgdmFsdWUgaW4gdGhlIGNvbmZpZy5gCiAgKTsKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgPGVtPjxiPnR3aWNlPC9iPjwvZW0+IHRvIHJlbW92ZSB0aGlzIGtleSBmcm9tIHRoZSBjb25maWcuYAogICk7Cn0KCmNvbnN0IHZhbGlkX2Zvcm1hdHMgPSBbInBuZyIsICJzdmciLCAid2VicCIsICJqcGVnIiwgImZ1bGwtanNvbiJdOwpmdW5jdGlvbiBpbml0aWFsaXplVUlWYWx1ZVNwYW4oc3Bhbiwga2V5LCB2YWx1ZSkgewogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSBrZXkgPT09ICJmb3JtYXQiID8gImZhbHNlIiA6ICJ0cnVlIjsKICBsZXQgcGFyc2UgPSAoeCkgPT4geDsKICBsZXQgdXBkYXRlID0gKHgpID0+IChzcGFuLnRleHRDb250ZW50ID0geCk7CiAgaWYgKGtleSA9PT0gIndpZHRoIiB8fCBrZXkgPT09ICJoZWlnaHQiKSB7CiAgICBwYXJzZSA9ICh4KSA9PiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoeCkpOwogIH0gZWxzZSBpZiAoa2V5ID09PSAic2NhbGUiKSB7CiAgICBwYXJzZSA9IHBhcnNlRmxvYXQ7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAvLyBXZSByZW1vdmUgY29udGVudEVkaXRhYmxlCiAgICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9ICJmYWxzZSI7CiAgICAvLyBIZXJlIHdlIGZpcnN0IGFkZCB0aGUgc3Vic3BhbnMgZm9yIGVhY2ggb3B0aW9uCiAgICBjb25zdCBvcHRzX2RpdiA9IHNwYW4uYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2IGNsYXNzPSJmb3JtYXQtb3B0aW9ucyI+PC9kaXY+YCk7CiAgICBmb3IgKGNvbnN0IGZtdCBvZiB2YWxpZF9mb3JtYXRzKSB7CiAgICAgIGNvbnN0IG9wdCA9IG9wdHNfZGl2LmFwcGVuZENoaWxkKAogICAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImZvcm1hdC1vcHRpb24gJHtmbXR9Ij4ke2ZtdH08L3NwYW4+YAogICAgICApOwogICAgICBvcHQub25jbGljayA9IChlKSA9PiB7CiAgICAgICAgc3Bhbi52YWx1ZSA9IG9wdC50ZXh0Q29udGVudDsKICAgICAgfTsKICAgIH0KICAgIHBhcnNlID0gKHgpID0+IHsKICAgICAgcmV0dXJuIHZhbGlkX2Zvcm1hdHMuaW5jbHVkZXMoeCkgPyB4IDogbG9jYWxWYWx1ZTsKICAgIH07CiAgICB1cGRhdGUgPSAoeCkgPT4gewogICAgICBmb3IgKGNvbnN0IG9wdCBvZiBvcHRzX2Rpdi5jaGlsZHJlbikgewogICAgICAgIG9wdC5jbGFzc0xpc3QudG9nZ2xlKCJzZWxlY3RlZCIsIG9wdC50ZXh0Q29udGVudCA9PT0geCk7CiAgICAgIH0KICAgIH07CiAgfSBlbHNlIHsKICAgIC8vIFdlIG9ubHkgaGF2ZSBmaWxlbmFtZSBoZXJlCiAgfQogIGxldCBsb2NhbFZhbHVlOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIGxvY2FsVmFsdWU7CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIGlmICh2YWwgIT09ICIiKSB7CiAgICAgICAgbG9jYWxWYWx1ZSA9IHBhcnNlKHZhbCk7CiAgICAgIH0KICAgICAgdXBkYXRlKGxvY2FsVmFsdWUpOwogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7CiAgLy8gV2UgYWxzbyBhc3NpZ24gYSBsaXN0ZW5lciBzbyB0aGF0IHRoZSBlZGl0YWJsZSBpcyBibHVycmVkIHdoZW4gZW50ZXIgaXMgcHJlc3NlZAogIHNwYW4ub25rZXlkb3duID0gKGUpID0+IHsKICAgIGlmIChlLmtleUNvZGUgPT09IDEzKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgc3Bhbi5ibHVyKCk7CiAgICB9CiAgfTsKICBzcGFuLnZhbHVlID0gdmFsdWU7Cn0KCmZ1bmN0aW9uIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oc3Bhbiwga2V5KSB7CiAgLy8gSGVyZSB3ZSBtb3N0bHkgd2FudCB0byBkZWZpbmUgdGhlIHNldHRlciBhbmQgZ2V0dGVyCiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgLy8gaWYgdW5kZWZpbmVkIGlzIHBhc3NlZCwgd2UgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBvcHRpb25zCiAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGRlbGV0ZSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XSA9IHZhbDsKICAgICAgfQogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7Cn0KCmNvbnN0IGNvbmZpZ19zcGFucyA9IHt9Owpmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhnZXRJbWFnZU9wdGlvbnMoKSkpIHsKICBjb25zdCBjb250YWluZXIgPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoYC5jbGlwYm9hcmQtc3Bhbi4ke2tleX1gKTsKICBjb25zdCBsYWJlbCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIubGFiZWwiKTsKICAvLyBXZSBnaXZlIHRoZSBsYWJlbCBhIGZ1bmN0aW9uIHRoYXQgb24gc2luZ2xlIGNsaWNrIHdpbGwgc2V0IHRoZSBjdXJyZW50IHZhbHVlIGFuZCB3aXRoIGRvdWJsZSBjbGljayB3aWxsIHVuc2V0IGl0CiAgbGFiZWwub25jbGljayA9IER1YWxDbGljaygKICAgICgpID0+IHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0sCiAgICAoZSkgPT4gewogICAgICBjb25zb2xlLmxvZygiZSIsIGUpOwogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSB1bmRlZmluZWQ7CiAgICB9CiAgKTsKICBjb25zdCB1aV92YWx1ZV9zcGFuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtdmFsdWUiKTsKICBjb25zdCBjb25maWdfdmFsdWVfc3BhbiA9CiAgICBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNvbmZpZy12YWx1ZSIpID8/CiAgICBsYWJlbC5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAgICJhZnRlcmJlZ2luIiwKICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iY29uZmlnLXZhbHVlIj48L3NwYW4+YAogICAgKTsKICAvLyBBc3NpbmcgdGhlIHR3byBzcGFucyBhcyBwcm9wZXJ0aWVzIG9mIHRoZSBjb250YWluaW5nIHNwYW4KICBjb250YWluZXIudWlfc3BhbiA9IHVpX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmNvbmZpZ19zcGFuID0gY29uZmlnX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmtleSA9IGtleTsKICBjb25maWdfc3BhbnNba2V5XSA9IGNvbnRhaW5lcjsKICBpZiAoZmlyc3RSdW4pIHsKICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA9CiAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICAgIC8vIFdlIGRvIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdmFsdWUgc3BhbgogICAgaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHVpX3ZhbHVlX3NwYW4sIGtleSwgdmFsdWUpOwogICAgLy8gVGhlbiB3ZSBpbml0aWFsaXplIHRoZSBjb25maWcgdmFsdWUKICAgIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oY29uZmlnX3ZhbHVlX3NwYW4sIGtleSk7CiAgICAvLyBXZSBwdXQgc29tZSBjb252ZW5pZW5jZSBnZXR0ZXJzL3NldHRlcnMKICAgIC8vIHVpX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJ1aV92YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiB1aV92YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICB1aV92YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgICAvLyBjb25maWdfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgImNvbmZpZ192YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICB9Cn0KCi8vIFRoZXNlIG9iamVjdHMgd2lsbCBjb250YWluIHRoZSBkZWZhdWx0IHZhbHVlCgovLyBUaGlzIGNvZGUgdXBkYXRlcyB0aGUgaW1hZ2Ugb3B0aW9ucyBpbiB0aGUgUExPVCBjb25maWcgd2l0aCB0aGUgcHJvdmlkZWQgb25lcwpmdW5jdGlvbiBzZXRJbWFnZU9wdGlvbnMobykgewogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gb1trZXldOwogIH0KfQpmdW5jdGlvbiB1bnNldEltYWdlT3B0aW9ucygpIHsKICBzZXRJbWFnZU9wdGlvbnMoe30pOwp9Cgpjb25zdCBzZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4uc2V0Iik7CmNvbnN0IHVuc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnVuc2V0Iik7CmlmIChmaXJzdFJ1bikgewogIHNldF9idXR0b24ub25jbGljayA9IChlKSA9PiB7CiAgICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0KICB9OwogIHVuc2V0X2J1dHRvbi5vbmNsaWNrID0gdW5zZXRJbWFnZU9wdGlvbnM7Cn0KCi8vIFdlIGFkZCBhIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBjbGlwYm9hcmQgaXMgcG9wcGVkIG91dApDT05UQUlORVIuaXNQb3BwZWRPdXQgPSAoKSA9PiB7CiAgcmV0dXJuIENPTlRBSU5FUi5jbGFzc0xpc3QuY29udGFpbnMoInBvcHBlZC1vdXQiKTsKfTsKCkNMSVBCT0FSRF9IRUFERVIub25tb3VzZWRvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHsKICBpZiAoZXZlbnQudGFyZ2V0Lm1hdGNoZXMoInNwYW4uY2xpcGJvYXJkLXZhbHVlIikpIHsKICAgIGNvbnNvbGUubG9nKCJXZSBkb24ndCBtb3ZlISIpOwogICAgcmV0dXJuOwogIH0KICBjb25zdCBzdGFydCA9IHsKICAgIGxlZnQ6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLmxlZnQpLAogICAgdG9wOiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS50b3ApLAogICAgWDogZXZlbnQucGFnZVgsCiAgICBZOiBldmVudC5wYWdlWSwKICB9OwogIGZ1bmN0aW9uIG1vdmVBdChldmVudCwgc3RhcnQpIHsKICAgIGNvbnN0IHRvcCA9IGV2ZW50LnBhZ2VZIC0gc3RhcnQuWSArIHN0YXJ0LnRvcCArICJweCI7CiAgICBjb25zdCBsZWZ0ID0gZXZlbnQucGFnZVggLSBzdGFydC5YICsgc3RhcnQubGVmdCArICJweCI7CiAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9IHRvcDsKICB9CgogIC8vIG1vdmUgb3VyIGFic29sdXRlbHkgcG9zaXRpb25lZCBiYWxsIHVuZGVyIHRoZSBwb2ludGVyCiAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQpIHsKICAgIG1vdmVBdChldmVudCwgc3RhcnQpOwogIH0KCiAgLy8gV2UgdXNlIHRoaXMgdG8gcmVtb3ZlIHRoZSBtb3VzZW1vdmUgd2hlbiBjbGlja2luZyBvdXRzaWRlIG9mIHRoZSBjb250YWluZXIKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICAvLyBtb3ZlIHRoZSBjb250YWluZXIgb24gbW91c2Vtb3ZlCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgb25Nb3VzZU1vdmUsIHsKICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsCiAgfSk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgY2xlYW5VcCgpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7CgogIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICBjb25zb2xlLmxvZygiY2xlYW5pbmcgdXAgdGhlIHBsb3QgbW92ZSBsaXN0ZW5lciIpOwogICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBudWxsOwogIH0KCiAgLy8gKDMpIGRyb3AgdGhlIGJhbGwsIHJlbW92ZSB1bm5lZWRlZCBoYW5kbGVycwogIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gY2xlYW5VcDsKfTsKCmZ1bmN0aW9uIHNlbmRUb0NsaXBib2FyZChibG9iKSB7CiAgaWYgKCFuYXZpZ2F0b3IuY2xpcGJvYXJkKSB7CiAgICBhbGVydCgKICAgICAgIlRoZSBDbGlwYm9hcmQgQVBJIGRvZXMgbm90IHNlZW0gdG8gYmUgYXZhaWxhYmxlLCBtYWtlIHN1cmUgdGhlIFBsdXRvIG5vdGVib29rIGlzIGJlaW5nIHVzZWQgZnJvbSBlaXRoZXIgbG9jYWxob3N0IG9yIGFuIGh0dHBzIHNvdXJjZS4iCiAgICApOwogIH0KICBuYXZpZ2F0b3IuY2xpcGJvYXJkCiAgICAud3JpdGUoWwogICAgICBuZXcgQ2xpcGJvYXJkSXRlbSh7CiAgICAgICAgLy8gVGhlIGtleSBpcyBkZXRlcm1pbmVkIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBibG9iJ3MgdHlwZS4KICAgICAgICBbYmxvYi50eXBlXTogYmxvYiwKICAgICAgfSksCiAgICBdKQogICAgLnRoZW4oCiAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICBjb25zb2xlLmxvZygiQXN5bmM6IENvcHlpbmcgdG8gY2xpcGJvYXJkIHdhcyBzdWNjZXNzZnVsISIpOwogICAgICB9LAogICAgICBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiQXN5bmM6IENvdWxkIG5vdCBjb3B5IHRleHQ6ICIsIGVycik7CiAgICAgIH0KICAgICk7Cn0KCmZ1bmN0aW9uIGNvcHlJbWFnZVRvQ2xpcGJvYXJkKCkgewogIC8vIFdlIGV4dHJhY3QgdGhlIGltYWdlIG9wdGlvbnMgZnJvbSB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycyAoaWYgdGhleSBleGlzdCkKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LiBXZSBhbHNvIGlnbm9yZSBmb3JtYXQgYmVjYXVzZSB0aGUgY2xpcGJvYXJkIG9ubHkgc3VwcG9ydHMgcG5nLgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gImZvcm1hdCIpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LnRvSW1hZ2UoUExPVCwgY29uZmlnKS50aGVuKGZ1bmN0aW9uIChkYXRhVXJsKSB7CiAgICBmZXRjaChkYXRhVXJsKQogICAgICAudGhlbigocmVzKSA9PiByZXMuYmxvYigpKQogICAgICAudGhlbigoYmxvYikgPT4gewogICAgICAgIGNvbnN0IHBhc3RlX3JlY2VpdmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigncGFzdGUtcmVjZWl2ZXIucGx1dG9wbG90bHknKQogICAgICAgIGlmIChwYXN0ZV9yZWNlaXZlcikgewogICAgICAgICAgcGFzdGVfcmVjZWl2ZXIuYXR0YWNoSW1hZ2UoZGF0YVVybCwgQ09OVEFJTkVSKQogICAgICAgIH0KICAgICAgICBzZW5kVG9DbGlwYm9hcmQoYmxvYikKICAgICAgfSk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHNhdmVJbWFnZVRvRmlsZSgpIHsKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS5kb3dubG9hZEltYWdlKFBMT1QsIGNvbmZpZyk7Cn0KCmxldCBjb250YWluZXJfcmVjdCA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCwgdG9wOiAwLCBsZWZ0OiAwIH07CmZ1bmN0aW9uIHVucG9wX2NvbnRhaW5lcihjbCkgewogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgZmFsc2UpOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBmYWxzZSk7CiAgLy8gV2UgZml4IHRoZSBoZWlnaHQgYmFjayB0byB0aGUgdmFsdWUgaXQgaGFkIGJlZm9yZSBwb3BvdXQsIGFsc28gc2V0dGluZyB0aGUgZmxhZyB0byBzaWduYWwgdGhhdCB1cG9uIGZpcnN0IHJlc2l6ZSB3ZSByZW1vdmUgdGhlIGZpeGVkIGlubGluZS1zdHlsZQogIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQgKyAicHgiOwogIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IHRydWU7CiAgLy8gV2Ugc2V0IHRoZSBvdGhlciBmaXhlZCBpbmxpbmUtc3R5bGVzIHRvIG51bGwKICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICBDT05UQUlORVIuc3R5bGUudG9wID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBXZSBhbHNvIHJlbW92ZSB0aGUgQ0xJUEJPQVJEX0hFQURFUgogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSAiIjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBGaW5hbGx5IHdlIHJlbW92ZSB0aGUgaGlkZGVuIGNsYXNzIHRvIHRoZSBoZWFkZXIKICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIHRydWUpOwogIHJldHVybjsKfQpmdW5jdGlvbiBwb3BvdXRfY29udGFpbmVyKG9wdHMpIHsKICBjb25zdCBjbCA9IG9wdHM/LmNsOwogIGNvbnN0IHRhcmdldF9jb250YWluZXJfc2l6ZSA9IG9wdHM/LnRhcmdldF9jb250YWluZXJfc2l6ZSA/PyB7fTsKICBjb25zdCB0YXJnZXRfcGxvdF9zaXplID0gb3B0cz8udGFyZ2V0X3Bsb3Rfc2l6ZSA/PyB7fTsKICBpZiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIHJldHVybiB1bnBvcF9jb250YWluZXIoY2wpOwogIH0KICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgY2wgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdHJ1ZSk7CiAgLy8gV2UgZXh0cmFjdCB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjb250YWluZXIsIHNhdmUgdGhlbSBhbmQgZml4IHRoZW0KICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9ID0gQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogIGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfTsKICAvLyBXZSBzYXZlIHRoZSBjdXJyZW50IHBsb3Qgc2l6ZSBiZWZvcmUgd2UgcG9wIGFzIGl0IHdpbGwgZmlsbCB0aGUgc2NyZWVuCiAgY29uc3QgY3VycmVudF9wbG90X3NpemUgPSB7CiAgICB3aWR0aDogUExPVC5fZnVsbExheW91dC53aWR0aCwKICAgIGhlaWdodDogUExPVC5fZnVsbExheW91dC5oZWlnaHQsCiAgfTsKICAvLyBXZSBoYXZlIHRvIHNhdmUgdGhlIHBhZCBkYXRhIGJlZm9yZSBwb3BwaW5nIHNvIHdlIGNhbiByZXNpemUgcHJlY2lzZWx5CiAgY29uc3QgcGFkID0ge307CiAgcGFkLnVucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgdHJ1ZSk7CiAgcGFkLnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICAvLyBXZSBkbyB0b3AgYW5kIGxlZnQgYmFzZWQgb24gdGhlIGN1cnJlbnQgcmVjdAogIGZvciAoY29uc3Qga2V5IG9mIFsidG9wIiwgImxlZnQiXSkgewogICAgY29uc3Qgc3RhcnRfdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY29udGFpbmVyX3JlY3Rba2V5XTsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgZm9yIChjb25zdCBraW5kIG9mIFsicGFkZGluZyIsICJib3JkZXIiXSkgewogICAgICBvZmZzZXQgKz0gcGFkLnBvcHBlZFtraW5kXVtrZXldIC0gcGFkLnVucG9wcGVkW2tpbmRdW2tleV07CiAgICB9CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHN0YXJ0X3ZhbCAtIG9mZnNldCArICJweCI7CiAgICBpZiAoa2V5ID09PSAibGVmdCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIC8vIFdlIGNvbXB1dGUgdGhlIHdpZHRoIGFuZCBoZWlnaHQgZGVwZW5kaW5nIG9uIGV2ZW50dWFsIGNvbmZpZyBkYXRhCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoewogICAgd2lkdGg6CiAgICAgIHRhcmdldF9wbG90X3NpemUud2lkdGggPz8KICAgICAgY29uZmlnX3NwYW5zLndpZHRoLmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS5oZWlnaHQgPz8KICAgICAgY29uZmlnX3NwYW5zLmhlaWdodC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUuaGVpZ2h0LAogIH0pOwogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIGNvbnN0IHZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNzeltrZXldOwogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSB2YWwgKyAicHgiOwogICAgaWYgKGtleSA9PT0gIndpZHRoIikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCBmYWxzZSk7CiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgdW5wb3BfY29udGFpbmVyKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKfQoKQ09OVEFJTkVSLnBvcE91dCA9IHBvcG91dF9jb250YWluZXI7CgpmdW5jdGlvbiBEdWFsQ2xpY2soc2luZ2xlX2Z1bmMsIGRibF9mdW5jKSB7CiAgbGV0IG5jbGlja3MgPSAwOwogIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykgewogICAgbmNsaWNrcyArPSAxOwogICAgaWYgKG5jbGlja3MgPiAxKSB7CiAgICAgIGRibF9mdW5jKC4uLmFyZ3MpOwogICAgICBuY2xpY2tzID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIGRlbGF5KDMwMCkudGhlbigoKSA9PiB7CiAgICAgICAgaWYgKG5jbGlja3MgPT0gMSkgewogICAgICAgICAgc2luZ2xlX2Z1bmMoLi4uYXJncyk7CiAgICAgICAgfQogICAgICAgIG5jbGlja3MgPSAwOwogICAgICB9KTsKICAgIH0KICB9Owp9CgovLyBXZSByZW1vdmUgdGhlIGRlZmF1bHQgZG93bmxvYWQgaW1hZ2UgYnV0dG9uCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSwKICBbInRvSW1hZ2UiXQopOwovLyBXZSBhZGQgdGhlIGN1c3RvbSBidXR0b24gdG8gdGhlIG1vZGViYXIKcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkLAogIFsKICAgIHsKICAgICAgbmFtZTogIkNvcHkgUE5HIHRvIENsaXBib2FyZCIsCiAgICAgIGljb246IHsKICAgICAgICBoZWlnaHQ6IDUyMCwKICAgICAgICB3aWR0aDogNTIwLAogICAgICAgIHBhdGg6ICJNMjgwIDY0aDQwYzM1LjMgMCA2NCAyOC43IDY0IDY0VjQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEg2NGMtMzUuMyAwLTY0LTI4LjctNjQtNjRWMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0aDQwIDkuNkMxMjEgMjcuNSAxNTMuMyAwIDE5MiAwczcxIDI3LjUgNzguNCA2NEgyODB6TTY0IDExMmMtOC44IDAtMTYgNy4yLTE2IDE2VjQ0OGMwIDguOCA3LjIgMTYgMTYgMTZIMzIwYzguOCAwIDE2LTcuMiAxNi0xNlYxMjhjMC04LjgtNy4yLTE2LTE2LTE2SDMwNHYyNGMwIDEzLjMtMTAuNyAyNC0yNCAyNEgxOTIgMTA0Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNFYxMTJINjR6bTEyOC04YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHoiLAogICAgICB9LAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soY29weUltYWdlVG9DbGlwYm9hcmQsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKCk7CiAgICAgIH0pLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIkRvd25sb2FkIEltYWdlIiwKICAgICAgaWNvbjogUGxvdGx5Lkljb25zLmNhbWVyYSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKHNhdmVJbWFnZVRvRmlsZSwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoeyBjbDogImZpbGVzYXZlIiB9KTsKICAgICAgfSksCiAgICB9LAogIF0KKTsKCmZ1bmN0aW9uIGdldE9mZnNldERhdGEoZWwpIHsKICBsZXQgY3MgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgbnVsbCk7CiAgY29uc3Qgb2RhdGEgPSB7CiAgICBwYWRkaW5nOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgfSwKICAgIGJvcmRlcjogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgfQogIH07CiAgaWYgKGVsID09PSBQTE9UKSB7CiAgICAvLyBGb3IgdGhlIFBMT1Qgd2UgYWxzbyB3YW50IHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBvZmZzZXQKICAgIG9kYXRhLm9mZnNldCA9IHsKICAgICAgdG9wOiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldFRvcCA6IDAsCiAgICAgIGxlZnQ6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0TGVmdCA6IDAsCiAgICB9CiAgfQogIHJldHVybiBvZGF0YTsKfQpmdW5jdGlvbiBnZXRTaXplRGF0YSgpIHsKICBjb25zdCBkYXRhID0gewogICAgcGxvdF9wYWQ6IGdldE9mZnNldERhdGEoUExPVCksCiAgICBwbG90X3JlY3Q6IFBMT1QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgICBjb250YWluZXJfcGFkOiBnZXRPZmZzZXREYXRhKENPTlRBSU5FUiksCiAgICBjb250YWluZXJfcmVjdDogQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogIH07CiAgcmV0dXJuIGRhdGE7Cn0KZnVuY3Rpb24gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGNvbnN0IGNvbXB1dGVkX3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIGNvbnN0IG9mZnNldHMgPSBjb21wdXRlZF9zaXplLm9mZnNldHM7CgogIGNvbnN0IHBsb3RfZGF0YSA9IHsKICAgIHdpZHRoOiB3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiBoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfTsKCiAgcmV0dXJuIHsKICAgIHdpZHRoOiAod2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCkgKyBvZmZzZXRzLndpZHRoLAogICAgaGVpZ2h0OiAoaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0KSArIG9mZnNldHMuaGVpZ2h0LAogICAgbm9DaGFuZ2U6IHdpZHRoID09IGNvbXB1dGVkX3NpemUud2lkdGggJiYgaGVpZ2h0ID09IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH0KfQoKLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGNoYW5nZSB0aGUgY29udGFpbmVyIHNpemUgc28gdGhhdCB0aGUgcmVzdWx0aW5nIHBsb3Qgd2lsbCBiZSBtYXRjaGluZyB0aGUgcHJvdmlkZWQgc3BlY3MKZnVuY3Rpb24gY2hhbmdlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgaWYgKCFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgY29uc29sZS5sb2coIlRyaWVkIHRvIGNoYW5nZSBjb250YWluZXIgc2l6ZSB3aGVuIG5vdCBwb3BwZWQsIGlnbm9yaW5nIik7CiAgICByZXR1cm47CiAgfQoKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEpOwoKICBpZiAoY3N6Lm5vQ2hhbmdlKSB7CiAgICBjb25zb2xlLmxvZygiU2l6ZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50LCBpZ25vcmluZyIpOwogICAgcmV0dXJuCiAgfQogIC8vIFdlIGFyZSBub3cgZ29pbmcgdG8gc2V0IGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGNvbnRhaW5lcgogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gY3N6W2tleV0gKyAicHgiOwogIH0KfQovLyBXZSBub3cgY3JlYXRlIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgdXBkYXRlIHRoZSBwbG90IGJhc2VkIG9uIHRoZSB2YWx1ZXMgc3BlY2lmaWVkCmZ1bmN0aW9uIHVwZGF0ZUZyb21IZWFkZXIoKSB7CiAgY29uc3QgaGVhZGVyX2RhdGEgPSB7CiAgICBoZWlnaHQ6IGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUsCiAgICB3aWR0aDogY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlLAogIH07CiAgY2hhbmdlQ29udGFpbmVyU2l6ZShoZWFkZXJfZGF0YSk7Cn0KLy8gV2UgYXNzaWduIHRoaXMgZnVuY3Rpb24gdG8gdGhlIG9uYmx1ciBldmVudCBvZiB3aWR0aCBhbmQgaGVpZ2h0CmlmIChmaXJzdFJ1bikgewogIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLnVpX3NwYW4ub25ibHVyID0gKGUpID0+IHsKICAgICAgY29udGFpbmVyLnVpX3ZhbHVlID0gY29udGFpbmVyLnVpX3NwYW4udGV4dENvbnRlbnQ7CiAgICAgIHVwZGF0ZUZyb21IZWFkZXIoKTsKICAgIH07CiAgfQp9Ci8vIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIHBsb3Qgc2l6ZSB0byB1c2UgZm9yIHJlbGF5b3V0IGFzIGEgZnVuY3Rpb24gb2YgdGhlIGNvbnRhaW5lciBzaXplCmZ1bmN0aW9uIGNvbXB1dGVQbG90U2l6ZShkYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIC8vIFJlbW92ZSBQYWRkaW5nCiAgY29uc3QgeyBjb250YWluZXJfcGFkLCBwbG90X3BhZCwgY29udGFpbmVyX3JlY3QgfSA9IGRhdGE7CiAgY29uc3Qgb2Zmc2V0cyA9IHsKICAgIHdpZHRoOgogICAgICBwbG90X3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLndpZHRoICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LmxlZnQgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci53aWR0aCwKICAgIGhlaWdodDoKICAgICAgcGxvdF9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBwbG90X3BhZC5ib3JkZXIuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LnRvcCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci5oZWlnaHQsCiAgfTsKICBjb25zdCBzeiA9IHsKICAgIHdpZHRoOiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LndpZHRoIC0gb2Zmc2V0cy53aWR0aCksCiAgICBoZWlnaHQ6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3QuaGVpZ2h0IC0gb2Zmc2V0cy5oZWlnaHQpLAogICAgb2Zmc2V0cywKICB9OwogIHJldHVybiBzejsKfQoKLy8gQ3JlYXRlIHRoZSByZXNpemVPYnNlcnZlciB0byBtYWtlIHRoZSBwbG90IGV2ZW4gbW9yZSByZXNwb25zaXZlISA6bWFnaWM6CmNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7CiAgY29uc3Qgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpOwogIGNvbnN0IHtjb250YWluZXJfcmVjdCwgY29udGFpbmVyX3BhZH0gPSBzaXplRGF0YTsKICBsZXQgcGxvdF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICAvLyBXZSBzYXZlIHRoZSBoZWlnaHQgaW4gdGhlIFBMT1Qgb2JqZWN0CiAgUExPVC5jb250YWluZXJfaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0OwogIC8vIFdlIGRlYWwgd2l0aCBzb21lIHN0dWZmIGlmIHRoZSBjb250YWluZXIgaXMgcG9wcHBlZAogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSBjb250YWluZXJfcmVjdC53aWR0aCArICJweCI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gY29udGFpbmVyX3JlY3QubGVmdCArICJweCI7CiAgY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS5oZWlnaHQ7CiAgY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlID0gcGxvdF9zaXplLndpZHRoOwogIC8qIAoJCVRoZSBhZGRpdGlvbiBvZiB0aGUgaW52YWxpZCBhcmd1bWVudCBgcGx1dG9yZXNpemVgIHNlZW1zIHRvIGZpeCB0aGUgcHJvYmxlbSB3aXRoIGNhbGxpbmcgYHJlbGF5b3V0YCBzaW1wbHkgd2l0aCBge2F1dG9zaXplOiB0cnVlfWAgYXMgdXBkYXRlIGJyZWFraW5nIG1vdXNlIHJlbGF5b3V0IGV2ZW50cyB0cmFja2luZy4gCgkJU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wbG90bHkvcGxvdGx5LmpzL2lzc3Vlcy82MTU2IGZvciBkZXRhaWxzCgkJKi8KICBsZXQgY29uZmlnID0gewogICAgLy8gSWYgdGhpcyBpcyBwb3BwZWQgb3V0LCB3ZSBpZ25vcmUgdGhlIG9yaWdpbmFsIHdpZHRoL2hlaWdodAogICAgd2lkdGg6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX3dpZHRoKSA/PyBwbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX2hlaWdodCkgPz8gcGxvdF9zaXplLmhlaWdodCwKICAgIHBsdXRvcmVzaXplOiB0cnVlLAogIH07CiAgUGxvdGx5LnJlbGF5b3V0KFBMT1QsIGNvbmZpZykudGhlbigoKSA9PiB7CiAgICBpZiAocmVtb3ZlX2NvbnRhaW5lcl9zaXplICYmICFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBhdm9pZCB0aGUgZmlyc3QgcmVzaXplIHVwb24gcGxvdCBjcmVhdGlvbiB0byBhbHJlYWR5IGJlIHdpdGhvdXQgYSBmaXhlZCBoZWlnaHQKICAgICAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9ICIiOwogICAgICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICAgICAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmFsc2U7CiAgICB9CiAgfSk7Cn0pOwoKcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShDT05UQUlORVIpOwoKClBsb3RseS5yZWFjdChQTE9ULCBwbG90X29iaikudGhlbigoKSA9PiB7CgkvLyBBc3NpZ24gdGhlIFBsb3RseSBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhwbG90bHlfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1Qub24oa2V5LCBsaXN0ZW5lcikKCQl9Cgl9CgkvLyBBc3NpZ24gdGhlIEpTIGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKGpzX2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULmFkZEV2ZW50TGlzdGVuZXIoa2V5LCBsaXN0ZW5lciwgewoJCQkJc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbAoJCQl9KQoJCX0KCX0KfQopCgoKaW52YWxpZGF0aW9uLnRoZW4oKCkgPT4gewoJLy8gUmVtb3ZlIGFsbCBwbG90bHkgbGlzdGVuZXJzCglQTE9ULnJlbW92ZUFsbExpc3RlbmVycygpCgkvLyBSZW1vdmUgYWxsIEpTIGxpc3RlbmVycwoJY29udHJvbGxlci5hYm9ydCgpCgkvLyBSZW1vdmUgdGhlIHJlc2l6ZU9ic2VydmVyCglyZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCkKfSkKCgoKCQlyZXR1cm4gQ09OVEFJTkVSCgk8L3NjcmlwdD4KpG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv6MTjXajsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQ4YjRhMWFkOS0yZDZhLTRjOGYtYmI4ZS1mNDNjMmQwNTgxOTW5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4L7Yq9tXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5HZNWIzYjg0MDhjLTgxODEtMTFlZi0xNGViLWUxYzU2OWI4YmIyOS9iN2JmOTZlNGIxYjAxYzhjuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDM1ZmYzNDAyLWRjMzYtNGI5MS1iZWM5LWI0ZDIxZmFmM2U2OIqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnaaokJPHNjcmlwdCBpZD0ncGxvdF8xJz4KCQkvLyBXZSBzdGFydCBieSBwdXR0aW5nIGFsbCB0aGUgdmFyaWFibGUgaW50ZXJwb2xhdGlvbiBoZXJlIGF0IHRoZSBiZWdpbm5pbmcKCQkvLyBXZSBoYXZlIHRvIGNvbnZlcnQgYWxsIHR5cGVkYXJyYXlzIGluIHRoZSBsYXlvdXQgdG8gbm9ybWFsIGFycmF5cy4gU2VlIElzc3VlICMyNQoJCS8vIFdlIHVzZSBsb2Rhc2ggZm9yIHRoaXMgZm9yIGNvbXBhY3RuZXNzCgkJZnVuY3Rpb24gcmVtb3ZlVHlwZWRBcnJheShvKSB7CgkJCXJldHVybiBfLmlzVHlwZWRBcnJheShvKSA/IEFycmF5LmZyb20obykgOgoJCQlfLmlzUGxhaW5PYmplY3QobykgPyBfLm1hcFZhbHVlcyhvLCByZW1vdmVUeXBlZEFycmF5KSA6IAoJCQlvCgkJfQoKCQkvLyBQdWJsaXNoIHRoZSBwbG90IG9iamVjdCB0byBKUwoJCWxldCBwbG90X29iaiA9IF8udXBkYXRlKC8qIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgQWJzdHJhY3RQbHV0b0RpbmdldGplcy5EaXNwbGF5LnB1Ymxpc2hlZF90b19qcyAqLyBnZXRQdWJsaXNoZWRPYmplY3QoImIzYjg0MDhjLTgxODEtMTFlZi0xNGViLWUxYzU2OWI4YmIyOS81NjZlMWIxNzRjYTNlMDM4IiksICJsYXlvdXQiLCByZW1vdmVUeXBlZEFycmF5KQoJCS8vIEdldCB0aGUgcGxvdGx5IGxpc3RlbmVycwoJCWNvbnN0IHBsb3RseV9saXN0ZW5lcnMgPSB7fQoJCS8vIEdldCB0aGUgSlMgbGlzdGVuZXJzCgkJY29uc3QganNfbGlzdGVuZXJzID0ge30KCQkvLyBEZWFsIHdpdGggZXZlbnR1YWwgY3VzdG9tIGNsYXNzZXMKCQlsZXQgY3VzdG9tX2NsYXNzbGlzdCA9IFtdCgoKCQkvLyBMb2FkIHRoZSBwbG90bHkgbGlicmFyeQoJCWxldCBQbG90bHkgPSB1bmRlZmluZWQKCQl0cnkgewoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiLi9wbG90bHlqcy9wbG90bHlqcy0yLjI2LjIubWluLmpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfSBjYXRjaCAoZSkgewoJCQljb25zb2xlLmxvZygiTG9jYWwgbG9hZCBmYWlsZWQsIHRyeWluZyB3aXRoIHRoZSB3ZWIgZXNtLnNoIHZlcnNpb24iKQoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiaHR0cHM6Ly9lc20uc2gvdjEzNS9wbG90bHkuanMtZGlzdC1taW5AMi4yNi4yL2VzbmV4dC9wbG90bHkuanMtZGlzdC1taW4ubWpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfQoKCQkvLyBDaGVjayBpZiB3ZSBoYXZlIHRvIGZvcmNlIGxvY2FsIG1hdGhqYXggZm9udCBjYWNoZQoJCWlmIChmYWxzZSAmJiB3aW5kb3c/Lk1hdGhKYXg/LmNvbmZpZz8uc3ZnPy5mb250Q2FjaGUgPT09ICdnbG9iYWwnKSB7CgkJCXdpbmRvdy5NYXRoSmF4LmNvbmZpZy5zdmcuZm9udENhY2hlID0gJ2xvY2FsJwoJCX0KCgkJLy8gRmxhZyB0byBjaGVjayBpZiB0aGlzIGNlbGwgd2FzICBtYW51YWxseSByYW4gb3IgcmVhY3RpdmVseSByYW4KY29uc3QgZmlyc3RSdW4gPSB0aGlzID8gZmFsc2UgOiB0cnVlCmNvbnN0IENPTlRBSU5FUiA9IHRoaXMgPz8gaHRtbGA8ZGl2IGNsYXNzPSdwbHV0b3Bsb3RseS1jb250YWluZXInPmAKY29uc3QgUExPVCA9IENPTlRBSU5FUi5xdWVyeVNlbGVjdG9yKCcuanMtcGxvdGx5LXBsb3QnKSA/PyBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2PmApCmNvbnN0IHBhcmVudCA9IENPTlRBSU5FUi5wYXJlbnRFbGVtZW50Ci8vIFdlIHVzZSBhIGNvbnRyb2xsZXIgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVycyB1cG9uIGludmFsaWRhdGlvbgpjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpCi8vIFdlIGhhdmUgdG8gYWRkIHRoaXMgdG8ga2VlcCBzdXBwb3J0aW5nIEBiaW5kIHdpdGggdGhlIG9sZCBBUEkgdXNpbmcgUExPVApQTE9ULmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGUpID0+IHsKCUNPTlRBSU5FUi52YWx1ZSA9IFBMT1QudmFsdWUKCWlmIChlLmJ1YmJsZXMpIHsKCQlyZXR1cm4KCX0KCUNPTlRBSU5FUi5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnaW5wdXQnKSkKfSwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pCgoJLy8gVGhpcyBjcmVhdGUgdGhlIHN0eWxlIHN1YmRpdiBvbiBmaXJzdCBydW4KCWZpcnN0UnVuICYmIENPTlRBSU5FUi5hcHBlbmRDaGlsZChodG1sYAoJPHN0eWxlPgoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciB7CgkJd2lkdGg6IDEwMCU7CgkJaGVpZ2h0OiAxMDAlOwoJCW1pbi1oZWlnaHQ6IDA7CgkJbWluLXdpZHRoOiAwOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciAuanMtcGxvdGx5LXBsb3QgLnBsb3RseSBkaXYgewoJCW1hcmdpbjogMCBhdXRvOyAvLyBUaGlzIGNlbnRlcnMgdGhlIHBsb3QKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIucG9wcGVkLW91dCB7CgkJb3ZlcmZsb3c6IGF1dG87CgkJei1pbmRleDogMTAwMDsKCQlwb3NpdGlvbjogZml4ZWQ7CgkJcmVzaXplOiBib3RoOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMHB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwcHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciB7CgkJZGlzcGxheTogZmxleDsKCQlmbGV4LWZsb3c6IHJvdyB3cmFwOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDEycHg7CgkJcG9zaXRpb246IGZpeGVkOwoJCXotaW5kZXg6IDEwMDE7CgkJY3Vyc29yOiBtb3ZlOwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgLTEwMCUpOwoJCXBhZGRpbmc6IDVweDsKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIHNwYW4gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQlmbGV4OiAxCgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlci5oaWRkZW4gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuY2xpcGJvYXJkLXNwYW4gewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCX0KCS5jbGlwYm9hcmQtdmFsdWUgewoJCXBhZGRpbmctcmlnaHQ6IDVweDsKCQlwYWRkaW5nLWxlZnQ6IDJweDsKCQljdXJzb3I6IHRleHQ7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlmbGV4OiAwIDAgMTAwJTsKCQl0ZXh0LWFsaWduOiBjZW50ZXI7CgkJYm9yZGVyLXRvcDogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCW1hcmdpbi10b3A6IDVweDsKCQlkaXNwbGF5OiBub25lOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5maWxlc2F2ZSAuY2xpcGJvYXJkLXNwYW4uZmlsZW5hbWUgewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5jbGlwYm9hcmQtdmFsdWUuZmlsZW5hbWUgewoJCW1hcmdpbi1sZWZ0OiAzcHg7CgkJdGV4dC1hbGlnbjogbGVmdDsKCQltaW4td2lkdGg6IG1pbig2MCUsIG1pbi1jb250ZW50KTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogaW5saW5lLWZsZXg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IC5sYWJlbCB7CgkJZmxleDogMCAwIDA7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZvcm1hdCB7CgkJcG9zaXRpb246IHJlbGF0aXZlOwoJCWZsZXg6IDEgMCBhdXRvOwoJCW1pbi13aWR0aDogMzBweDsKCQltYXJnaW4tcmlnaHQ6IDEwcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJCWZsZXgtZmxvdzogY29sdW1uOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXBhZGRpbmctbGVmdDogM3B4OwoJCXotaW5kZXg6IDIwMDA7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgewoJCWN1cnNvcjogcG9pbnRlcjsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlwYWRkaW5nOiAzcHg7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTNweCwgLTZweCk7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5mb3JtYXQtb3B0aW9uOm5vdCguc2VsZWN0ZWQpIHsKCQltYXJnaW4tdG9wOiAzcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24uc2VsZWN0ZWQgewoJCW9yZGVyOiAtMTsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpob3ZlciB7CgkJYmFja2dyb3VuZC1jb2xvcjogdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7Cgl9CglzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZm9udC13ZWlnaHQ6IG5vcm1hbDsKCQljb2xvcjogdmFyKC0tcGx1dG8tb3V0cHV0LWNvbG9yKTsKCQlkaXNwbGF5OiBub25lOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgY2FsYygtMTAwJSAtIDEwcHgpKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkubGFiZWwgewoJCXVzZXItc2VsZWN0OiBub25lOwoJfQoJLmxhYmVsOmhvdmVyIHNwYW4uY29uZmlnLXZhbHVlIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJbWluLXdpZHRoOiAxNTBweDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5tYXRjaGluZy1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tbWFjcm8tY29sb3IpOwoJCWZvbnQtd2VpZ2h0OiBib2xkOwoJfQoJLmNsaXBib2FyZC1zcGFuLmRpZmZlcmVudC1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tdGFnLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KPC9zdHlsZT4KYCkKCmxldCBvcmlnaW5hbF9oZWlnaHQgPSBwbG90X29iai5sYXlvdXQuaGVpZ2h0CmxldCBvcmlnaW5hbF93aWR0aCA9IHBsb3Rfb2JqLmxheW91dC53aWR0aAovLyBGb3IgdGhlIGhlaWdodCB3ZSBoYXZlIHRvIGFsc28gcHV0IGEgZml4ZWQgdmFsdWUgaW4gY2FzZSB0aGUgcGxvdCBpcyBwdXQgb24gYSBub24tZml4ZWQtc2l6ZSBjb250YWluZXIgKGxpa2UgdGhlIGRlZmF1bHQgd3JhcHBlcikKLy8gV2UgZGVmaW5lIGEgdmFyaWFibGUgdG8gY2hlY2sgd2hldGhlciB3ZSBzdGlsbCBoYXZlIHRvIHJlbW92ZSB0aGUgZml4ZWQgaGVpZ2h0CmxldCByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmaXJzdFJ1bgpsZXQgY29udGFpbmVyX2hlaWdodCA9IG9yaWdpbmFsX2hlaWdodCA/PyBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPz8gNDAwCkNPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfaGVpZ2h0ICsgJ3B4JwoKLy8gV2UgY3JlYXRlIGEgUHJvbWlzZSB2ZXJzaW9uIG9mIHNldFRpbWVvdXQKZnVuY3Rpb24gZGVsYXkobXMpIHsKICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTsKfQoKLy8gV2UgaW1wb3J0IGludGVyYWN0IGZvciBkcmFnZ2luZy9yZXNpemluZwpjb25zdCB7IGRlZmF1bHQ6IGludGVyYWN0IH0gPSBhd2FpdCBpbXBvcnQoJ2h0dHBzOi8vZXNtLnNoL2ludGVyYWN0anNAMS4xMC4xOScpCgoKZnVuY3Rpb24gZ2V0SW1hZ2VPcHRpb25zKCkgewogIGNvbnN0IG8gPSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPz8ge307CiAgcmV0dXJuIHsKICAgIGZvcm1hdDogby5mb3JtYXQgPz8gInBuZyIsCiAgICB3aWR0aDogby53aWR0aCA/PyBvcmlnaW5hbF93aWR0aCwKICAgIGhlaWdodDogby5oZWlnaHQgPz8gb3JpZ2luYWxfaGVpZ2h0LAogICAgc2NhbGU6IG8uc2NhbGUgPz8gMSwKICAgIGZpbGVuYW1lOiBvLmZpbGVuYW1lID8/ICJuZXdwbG90IiwKICB9Owp9Cgpjb25zdCBDTElQQk9BUkRfSEVBREVSID0KICBDT05UQUlORVIucXVlcnlTZWxlY3RvcigiLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIiKSA/PwogIENPTlRBSU5FUi5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAiYWZ0ZXJiZWdpbiIsCiAgICBodG1sYDxkaXYgY2xhc3M9InBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgaGlkZGVuIj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZvcm1hdCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5Gb3JtYXQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZm9ybWF0Ij48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHdpZHRoIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPldpZHRoOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIHdpZHRoIj48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gaGVpZ2h0IgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkhlaWdodDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBoZWlnaHQiPjwvc3Bhbj5weDwvc3BhbgogICAgICA+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzY2FsZSIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5TY2FsZTo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBzY2FsZSI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHNldCI+U2V0PC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHVuc2V0Ij5VbnNldDwvYnV0dG9uPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gZmlsZW5hbWUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+RmlsZW5hbWU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZmlsZW5hbWUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgPC9kaXY+YAogICk7CgpmdW5jdGlvbiBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKSB7CiAgY29uc3QgdmFsaWRfY2xhc3NlcyA9IFsKICAgICJtaXNzaW5nLWNvbmZpZyIsCiAgICAibWF0Y2hpbmctY29uZmlnIiwKICAgICJkaWZmZXJlbnQtY29uZmlnIiwKICBdOwogIGZ1bmN0aW9uIHNldENsYXNzKGNsKSB7CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgdmFsaWRfY2xhc3NlcykgewogICAgICBjb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZShuYW1lLCBuYW1lID09IGNsKTsKICAgIH0KICB9CiAgLy8gV2UgdXNlIHRoZSBjdXN0b20gZ2V0dGVycyB3ZSdsbCBzZXQgdXAgaW4gdGhlIGNvbnRhaW5lcgogIGNvbnN0IHsgdWlfdmFsdWUsIGNvbmZpZ192YWx1ZSwgY29uZmlnX3NwYW4sIGtleSB9ID0gY29udGFpbmVyOwogIGlmIChjb25maWdfdmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgc2V0Q2xhc3MoIm1pc3NpbmctY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGlzIG5vdCBwcmVzZW50IGluIHRoZSBjb25maWcuYDsKICB9IGVsc2UgaWYgKHVpX3ZhbHVlID09IGNvbmZpZ192YWx1ZSkgewogICAgc2V0Q2xhc3MoIm1hdGNoaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgdGhlIHNhbWUgdmFsdWUgaW4gdGhlIGNvbmZpZyBhbmQgaW4gdGhlIGhlYWRlci5gOwogIH0gZWxzZSB7CiAgICBzZXRDbGFzcygiZGlmZmVyZW50LWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgYSBkaWZmZXJlbnQgdmFsdWUgKDxlbT4ke2NvbmZpZ192YWx1ZX08L2VtPikgaW4gdGhlIGNvbmZpZy5gOwogIH0KICAvLyBBZGQgaW5mbyBhYm91dCBzZXR0aW5nIGFuZCB1bnNldHRpbmcKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgb24gdGhlIGxhYmVsIDxlbT48Yj5vbmNlPC9iPjwvZW0+IHRvIHNldCB0aGUgY3VycmVudCBVSSB2YWx1ZSBpbiB0aGUgY29uZmlnLmAKICApOwogIGNvbmZpZ19zcGFuLmluc2VydEFkamFjZW50SFRNTCgKICAgICJiZWZvcmVlbmQiLAogICAgYDxicj5DbGljayA8ZW0+PGI+dHdpY2U8L2I+PC9lbT4gdG8gcmVtb3ZlIHRoaXMga2V5IGZyb20gdGhlIGNvbmZpZy5gCiAgKTsKfQoKY29uc3QgdmFsaWRfZm9ybWF0cyA9IFsicG5nIiwgInN2ZyIsICJ3ZWJwIiwgImpwZWciLCAiZnVsbC1qc29uIl07CmZ1bmN0aW9uIGluaXRpYWxpemVVSVZhbHVlU3BhbihzcGFuLCBrZXksIHZhbHVlKSB7CiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9IGtleSA9PT0gImZvcm1hdCIgPyAiZmFsc2UiIDogInRydWUiOwogIGxldCBwYXJzZSA9ICh4KSA9PiB4OwogIGxldCB1cGRhdGUgPSAoeCkgPT4gKHNwYW4udGV4dENvbnRlbnQgPSB4KTsKICBpZiAoa2V5ID09PSAid2lkdGgiIHx8IGtleSA9PT0gImhlaWdodCIpIHsKICAgIHBhcnNlID0gKHgpID0+IE1hdGgucm91bmQocGFyc2VGbG9hdCh4KSk7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJzY2FsZSIpIHsKICAgIHBhcnNlID0gcGFyc2VGbG9hdDsKICB9IGVsc2UgaWYgKGtleSA9PT0gImZvcm1hdCIpIHsKICAgIC8vIFdlIHJlbW92ZSBjb250ZW50RWRpdGFibGUKICAgIHNwYW4uY29udGVudEVkaXRhYmxlID0gImZhbHNlIjsKICAgIC8vIEhlcmUgd2UgZmlyc3QgYWRkIHRoZSBzdWJzcGFucyBmb3IgZWFjaCBvcHRpb24KICAgIGNvbnN0IG9wdHNfZGl2ID0gc3Bhbi5hcHBlbmRDaGlsZChodG1sYDxkaXYgY2xhc3M9ImZvcm1hdC1vcHRpb25zIj48L2Rpdj5gKTsKICAgIGZvciAoY29uc3QgZm10IG9mIHZhbGlkX2Zvcm1hdHMpIHsKICAgICAgY29uc3Qgb3B0ID0gb3B0c19kaXYuYXBwZW5kQ2hpbGQoCiAgICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iZm9ybWF0LW9wdGlvbiAke2ZtdH0iPiR7Zm10fTwvc3Bhbj5gCiAgICAgICk7CiAgICAgIG9wdC5vbmNsaWNrID0gKGUpID0+IHsKICAgICAgICBzcGFuLnZhbHVlID0gb3B0LnRleHRDb250ZW50OwogICAgICB9OwogICAgfQogICAgcGFyc2UgPSAoeCkgPT4gewogICAgICByZXR1cm4gdmFsaWRfZm9ybWF0cy5pbmNsdWRlcyh4KSA/IHggOiBsb2NhbFZhbHVlOwogICAgfTsKICAgIHVwZGF0ZSA9ICh4KSA9PiB7CiAgICAgIGZvciAoY29uc3Qgb3B0IG9mIG9wdHNfZGl2LmNoaWxkcmVuKSB7CiAgICAgICAgb3B0LmNsYXNzTGlzdC50b2dnbGUoInNlbGVjdGVkIiwgb3B0LnRleHRDb250ZW50ID09PSB4KTsKICAgICAgfQogICAgfTsKICB9IGVsc2UgewogICAgLy8gV2Ugb25seSBoYXZlIGZpbGVuYW1lIGhlcmUKICB9CiAgbGV0IGxvY2FsVmFsdWU7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwYW4sICJ2YWx1ZSIsIHsKICAgIGdldDogKCkgPT4gewogICAgICByZXR1cm4gbG9jYWxWYWx1ZTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgaWYgKHZhbCAhPT0gIiIpIHsKICAgICAgICBsb2NhbFZhbHVlID0gcGFyc2UodmFsKTsKICAgICAgfQogICAgICB1cGRhdGUobG9jYWxWYWx1ZSk7CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKICAvLyBXZSBhbHNvIGFzc2lnbiBhIGxpc3RlbmVyIHNvIHRoYXQgdGhlIGVkaXRhYmxlIGlzIGJsdXJyZWQgd2hlbiBlbnRlciBpcyBwcmVzc2VkCiAgc3Bhbi5vbmtleWRvd24gPSAoZSkgPT4gewogICAgaWYgKGUua2V5Q29kZSA9PT0gMTMpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBzcGFuLmJsdXIoKTsKICAgIH0KICB9OwogIHNwYW4udmFsdWUgPSB2YWx1ZTsKfQoKZnVuY3Rpb24gaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3BhbihzcGFuLCBrZXkpIHsKICAvLyBIZXJlIHdlIG1vc3RseSB3YW50IHRvIGRlZmluZSB0aGUgc2V0dGVyIGFuZCBnZXR0ZXIKICBjb25zdCBjb250YWluZXIgPSBzcGFuLmNsb3Nlc3QoIi5jbGlwYm9hcmQtc3BhbiIpOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgfSwKICAgIHNldDogKHZhbCkgPT4gewogICAgICAvLyBpZiB1bmRlZmluZWQgaXMgcGFzc2VkLCB3ZSByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIG9wdGlvbnMKICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZGVsZXRlIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgICB9IGVsc2UgewogICAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldID0gdmFsOwogICAgICB9CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKfQoKY29uc3QgY29uZmlnX3NwYW5zID0ge307CmZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGdldEltYWdlT3B0aW9ucygpKSkgewogIGNvbnN0IGNvbnRhaW5lciA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcihgLmNsaXBib2FyZC1zcGFuLiR7a2V5fWApOwogIGNvbnN0IGxhYmVsID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5sYWJlbCIpOwogIC8vIFdlIGdpdmUgdGhlIGxhYmVsIGEgZnVuY3Rpb24gdGhhdCBvbiBzaW5nbGUgY2xpY2sgd2lsbCBzZXQgdGhlIGN1cnJlbnQgdmFsdWUgYW5kIHdpdGggZG91YmxlIGNsaWNrIHdpbGwgdW5zZXQgaXQKICBsYWJlbC5vbmNsaWNrID0gRHVhbENsaWNrKAogICAgKCkgPT4gewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfSwKICAgIChlKSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJlIiwgZSk7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IHVuZGVmaW5lZDsKICAgIH0KICApOwogIGNvbnN0IHVpX3ZhbHVlX3NwYW4gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC12YWx1ZSIpOwogIGNvbnN0IGNvbmZpZ192YWx1ZV9zcGFuID0KICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuY29uZmlnLXZhbHVlIikgPz8KICAgIGxhYmVsLmluc2VydEFkamFjZW50RWxlbWVudCgKICAgICAgImFmdGVyYmVnaW4iLAogICAgICBodG1sYDxzcGFuIGNsYXNzPSJjb25maWctdmFsdWUiPjwvc3Bhbj5gCiAgICApOwogIC8vIEFzc2luZyB0aGUgdHdvIHNwYW5zIGFzIHByb3BlcnRpZXMgb2YgdGhlIGNvbnRhaW5pbmcgc3BhbgogIGNvbnRhaW5lci51aV9zcGFuID0gdWlfdmFsdWVfc3BhbjsKICBjb250YWluZXIuY29uZmlnX3NwYW4gPSBjb25maWdfdmFsdWVfc3BhbjsKICBjb250YWluZXIua2V5ID0ga2V5OwogIGNvbmZpZ19zcGFuc1trZXldID0gY29udGFpbmVyOwogIGlmIChmaXJzdFJ1bikgewogICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID0KICAgICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogICAgLy8gV2UgZG8gdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSB2YWx1ZSBzcGFuCiAgICBpbml0aWFsaXplVUlWYWx1ZVNwYW4odWlfdmFsdWVfc3Bhbiwga2V5LCB2YWx1ZSk7CiAgICAvLyBUaGVuIHdlIGluaXRpYWxpemUgdGhlIGNvbmZpZyB2YWx1ZQogICAgaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3Bhbihjb25maWdfdmFsdWVfc3Bhbiwga2V5KTsKICAgIC8vIFdlIHB1dCBzb21lIGNvbnZlbmllbmNlIGdldHRlcnMvc2V0dGVycwogICAgLy8gdWlfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgInVpX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IHVpX3ZhbHVlX3NwYW4udmFsdWUsCiAgICAgIHNldDogKHZhbCkgPT4gewogICAgICAgIHVpX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICAgIC8vIGNvbmZpZ192YWx1ZSBmb3J3YXJkCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAiY29uZmlnX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IGNvbmZpZ192YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSA9IHZhbDsKICAgICAgfSwKICAgIH0pOwogIH0KfQoKLy8gVGhlc2Ugb2JqZWN0cyB3aWxsIGNvbnRhaW4gdGhlIGRlZmF1bHQgdmFsdWUKCi8vIFRoaXMgY29kZSB1cGRhdGVzIHRoZSBpbWFnZSBvcHRpb25zIGluIHRoZSBQTE9UIGNvbmZpZyB3aXRoIHRoZSBwcm92aWRlZCBvbmVzCmZ1bmN0aW9uIHNldEltYWdlT3B0aW9ucyhvKSB7CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBvW2tleV07CiAgfQp9CmZ1bmN0aW9uIHVuc2V0SW1hZ2VPcHRpb25zKCkgewogIHNldEltYWdlT3B0aW9ucyh7fSk7Cn0KCmNvbnN0IHNldF9idXR0b24gPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtc3Bhbi5zZXQiKTsKY29uc3QgdW5zZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4udW5zZXQiKTsKaWYgKGZpcnN0UnVuKSB7CiAgc2V0X2J1dHRvbi5vbmNsaWNrID0gKGUpID0+IHsKICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfQogIH07CiAgdW5zZXRfYnV0dG9uLm9uY2xpY2sgPSB1bnNldEltYWdlT3B0aW9uczsKfQoKLy8gV2UgYWRkIGEgZnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIGNsaXBib2FyZCBpcyBwb3BwZWQgb3V0CkNPTlRBSU5FUi5pc1BvcHBlZE91dCA9ICgpID0+IHsKICByZXR1cm4gQ09OVEFJTkVSLmNsYXNzTGlzdC5jb250YWlucygicG9wcGVkLW91dCIpOwp9OwoKQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNlZG93biA9IGZ1bmN0aW9uIChldmVudCkgewogIGlmIChldmVudC50YXJnZXQubWF0Y2hlcygic3Bhbi5jbGlwYm9hcmQtdmFsdWUiKSkgewogICAgY29uc29sZS5sb2coIldlIGRvbid0IG1vdmUhIik7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IHN0YXJ0ID0gewogICAgbGVmdDogcGFyc2VGbG9hdChDT05UQUlORVIuc3R5bGUubGVmdCksCiAgICB0b3A6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLnRvcCksCiAgICBYOiBldmVudC5wYWdlWCwKICAgIFk6IGV2ZW50LnBhZ2VZLAogIH07CiAgZnVuY3Rpb24gbW92ZUF0KGV2ZW50LCBzdGFydCkgewogICAgY29uc3QgdG9wID0gZXZlbnQucGFnZVkgLSBzdGFydC5ZICsgc3RhcnQudG9wICsgInB4IjsKICAgIGNvbnN0IGxlZnQgPSBldmVudC5wYWdlWCAtIHN0YXJ0LlggKyBzdGFydC5sZWZ0ICsgInB4IjsKICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUudG9wID0gdG9wOwogIH0KCiAgLy8gbW92ZSBvdXIgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGJhbGwgdW5kZXIgdGhlIHBvaW50ZXIKICBtb3ZlQXQoZXZlbnQsIHN0YXJ0KTsKICBmdW5jdGlvbiBvbk1vdXNlTW92ZShldmVudCkgewogICAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgfQoKICAvLyBXZSB1c2UgdGhpcyB0byByZW1vdmUgdGhlIG1vdXNlbW92ZSB3aGVuIGNsaWNraW5nIG91dHNpZGUgb2YgdGhlIGNvbnRhaW5lcgogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CgogIC8vIG1vdmUgdGhlIGNvbnRhaW5lciBvbiBtb3VzZW1vdmUKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCBvbk1vdXNlTW92ZSwgewogICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCwKICB9KTsKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICBjbGVhblVwKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKCiAgZnVuY3Rpb24gY2xlYW5VcCgpIHsKICAgIGNvbnNvbGUubG9nKCJjbGVhbmluZyB1cCB0aGUgcGxvdCBtb3ZlIGxpc3RlbmVyIik7CiAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICBDTElQQk9BUkRfSEVBREVSLm9ubW91c2V1cCA9IG51bGw7CiAgfQoKICAvLyAoMykgZHJvcCB0aGUgYmFsbCwgcmVtb3ZlIHVubmVlZGVkIGhhbmRsZXJzCiAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBjbGVhblVwOwp9OwoKZnVuY3Rpb24gc2VuZFRvQ2xpcGJvYXJkKGJsb2IpIHsKICBpZiAoIW5hdmlnYXRvci5jbGlwYm9hcmQpIHsKICAgIGFsZXJ0KAogICAgICAiVGhlIENsaXBib2FyZCBBUEkgZG9lcyBub3Qgc2VlbSB0byBiZSBhdmFpbGFibGUsIG1ha2Ugc3VyZSB0aGUgUGx1dG8gbm90ZWJvb2sgaXMgYmVpbmcgdXNlZCBmcm9tIGVpdGhlciBsb2NhbGhvc3Qgb3IgYW4gaHR0cHMgc291cmNlLiIKICAgICk7CiAgfQogIG5hdmlnYXRvci5jbGlwYm9hcmQKICAgIC53cml0ZShbCiAgICAgIG5ldyBDbGlwYm9hcmRJdGVtKHsKICAgICAgICAvLyBUaGUga2V5IGlzIGRldGVybWluZWQgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIGJsb2IncyB0eXBlLgogICAgICAgIFtibG9iLnR5cGVdOiBibG9iLAogICAgICB9KSwKICAgIF0pCiAgICAudGhlbigKICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgIGNvbnNvbGUubG9nKCJBc3luYzogQ29weWluZyB0byBjbGlwYm9hcmQgd2FzIHN1Y2Nlc3NmdWwhIik7CiAgICAgIH0sCiAgICAgIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJBc3luYzogQ291bGQgbm90IGNvcHkgdGV4dDogIiwgZXJyKTsKICAgICAgfQogICAgKTsKfQoKZnVuY3Rpb24gY29weUltYWdlVG9DbGlwYm9hcmQoKSB7CiAgLy8gV2UgZXh0cmFjdCB0aGUgaW1hZ2Ugb3B0aW9ucyBmcm9tIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzIChpZiB0aGV5IGV4aXN0KQogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuIFdlIGFsc28gaWdub3JlIGZvcm1hdCBiZWNhdXNlIHRoZSBjbGlwYm9hcmQgb25seSBzdXBwb3J0cyBwbmcuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwga2V5ID09PSAiZm9ybWF0IikgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbmZpZ1trZXldID0gdmFsOwogIH0KICBQbG90bHkudG9JbWFnZShQTE9ULCBjb25maWcpLnRoZW4oZnVuY3Rpb24gKGRhdGFVcmwpIHsKICAgIGZldGNoKGRhdGFVcmwpCiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5ibG9iKCkpCiAgICAgIC50aGVuKChibG9iKSA9PiB7CiAgICAgICAgY29uc3QgcGFzdGVfcmVjZWl2ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdwYXN0ZS1yZWNlaXZlci5wbHV0b3Bsb3RseScpCiAgICAgICAgaWYgKHBhc3RlX3JlY2VpdmVyKSB7CiAgICAgICAgICBwYXN0ZV9yZWNlaXZlci5hdHRhY2hJbWFnZShkYXRhVXJsLCBDT05UQUlORVIpCiAgICAgICAgfQogICAgICAgIHNlbmRUb0NsaXBib2FyZChibG9iKQogICAgICB9KTsKICB9KTsKfQoKZnVuY3Rpb24gc2F2ZUltYWdlVG9GaWxlKCkgewogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LmRvd25sb2FkSW1hZ2UoUExPVCwgY29uZmlnKTsKfQoKbGV0IGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwLCB0b3A6IDAsIGxlZnQ6IDAgfTsKZnVuY3Rpb24gdW5wb3BfY29udGFpbmVyKGNsKSB7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCBmYWxzZSk7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoY2wsIGZhbHNlKTsKICAvLyBXZSBmaXggdGhlIGhlaWdodCBiYWNrIHRvIHRoZSB2YWx1ZSBpdCBoYWQgYmVmb3JlIHBvcG91dCwgYWxzbyBzZXR0aW5nIHRoZSBmbGFnIHRvIHNpZ25hbCB0aGF0IHVwb24gZmlyc3QgcmVzaXplIHdlIHJlbW92ZSB0aGUgZml4ZWQgaW5saW5lLXN0eWxlCiAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9IGNvbnRhaW5lcl9yZWN0LmhlaWdodCArICJweCI7CiAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gdHJ1ZTsKICAvLyBXZSBzZXQgdGhlIG90aGVyIGZpeGVkIGlubGluZS1zdHlsZXMgdG8gbnVsbAogIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogIENPTlRBSU5FUi5zdHlsZS50b3AgPSAiIjsKICBDT05UQUlORVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIFdlIGFsc28gcmVtb3ZlIHRoZSBDTElQQk9BUkRfSEVBREVSCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9ICIiOwogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIEZpbmFsbHkgd2UgcmVtb3ZlIHRoZSBoaWRkZW4gY2xhc3MgdG8gdGhlIGhlYWRlcgogIENMSVBCT0FSRF9IRUFERVIuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgdHJ1ZSk7CiAgcmV0dXJuOwp9CmZ1bmN0aW9uIHBvcG91dF9jb250YWluZXIob3B0cykgewogIGNvbnN0IGNsID0gb3B0cz8uY2w7CiAgY29uc3QgdGFyZ2V0X2NvbnRhaW5lcl9zaXplID0gb3B0cz8udGFyZ2V0X2NvbnRhaW5lcl9zaXplID8/IHt9OwogIGNvbnN0IHRhcmdldF9wbG90X3NpemUgPSBvcHRzPy50YXJnZXRfcGxvdF9zaXplID8/IHt9OwogIGlmIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgcmV0dXJuIHVucG9wX2NvbnRhaW5lcihjbCk7CiAgfQogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBjbCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0cnVlKTsKICAvLyBXZSBleHRyYWN0IHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNvbnRhaW5lciwgc2F2ZSB0aGVtIGFuZCBmaXggdGhlbQogIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH0gPSBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgY29udGFpbmVyX3JlY3QgPSB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9OwogIC8vIFdlIHNhdmUgdGhlIGN1cnJlbnQgcGxvdCBzaXplIGJlZm9yZSB3ZSBwb3AgYXMgaXQgd2lsbCBmaWxsIHRoZSBzY3JlZW4KICBjb25zdCBjdXJyZW50X3Bsb3Rfc2l6ZSA9IHsKICAgIHdpZHRoOiBQTE9ULl9mdWxsTGF5b3V0LndpZHRoLAogICAgaGVpZ2h0OiBQTE9ULl9mdWxsTGF5b3V0LmhlaWdodCwKICB9OwogIC8vIFdlIGhhdmUgdG8gc2F2ZSB0aGUgcGFkIGRhdGEgYmVmb3JlIHBvcHBpbmcgc28gd2UgY2FuIHJlc2l6ZSBwcmVjaXNlbHkKICBjb25zdCBwYWQgPSB7fTsKICBwYWQudW5wb3BwZWQgPSBnZXRTaXplRGF0YSgpLmNvbnRhaW5lcl9wYWQ7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCB0cnVlKTsKICBwYWQucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIC8vIFdlIGRvIHRvcCBhbmQgbGVmdCBiYXNlZCBvbiB0aGUgY3VycmVudCByZWN0CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ0b3AiLCAibGVmdCJdKSB7CiAgICBjb25zdCBzdGFydF92YWwgPSB0YXJnZXRfY29udGFpbmVyX3NpemVba2V5XSA/PyBjb250YWluZXJfcmVjdFtrZXldOwogICAgbGV0IG9mZnNldCA9IDA7CiAgICBmb3IgKGNvbnN0IGtpbmQgb2YgWyJwYWRkaW5nIiwgImJvcmRlciJdKSB7CiAgICAgIG9mZnNldCArPSBwYWQucG9wcGVkW2tpbmRdW2tleV0gLSBwYWQudW5wb3BwZWRba2luZF1ba2V5XTsKICAgIH0KICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gc3RhcnRfdmFsIC0gb2Zmc2V0ICsgInB4IjsKICAgIGlmIChrZXkgPT09ICJsZWZ0IikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgLy8gV2UgY29tcHV0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBkZXBlbmRpbmcgb24gZXZlbnR1YWwgY29uZmlnIGRhdGEKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7CiAgICB3aWR0aDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS53aWR0aCA/PwogICAgICBjb25maWdfc3BhbnMud2lkdGguY29uZmlnX3ZhbHVlID8/CiAgICAgIGN1cnJlbnRfcGxvdF9zaXplLndpZHRoLAogICAgaGVpZ2h0OgogICAgICB0YXJnZXRfcGxvdF9zaXplLmhlaWdodCA/PwogICAgICBjb25maWdfc3BhbnMuaGVpZ2h0LmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS5oZWlnaHQsCiAgfSk7CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgY29uc3QgdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY3N6W2tleV07CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHZhbCArICJweCI7CiAgICBpZiAoa2V5ID09PSAid2lkdGgiKSB7CiAgICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGVba2V5XSA9IENPTlRBSU5FUi5zdHlsZVtrZXldOwogICAgfQogIH0KICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIGZhbHNlKTsKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICB1bnBvcF9jb250YWluZXIoKTsKICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9LAogICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0KICApOwp9CgpDT05UQUlORVIucG9wT3V0ID0gcG9wb3V0X2NvbnRhaW5lcjsKCmZ1bmN0aW9uIER1YWxDbGljayhzaW5nbGVfZnVuYywgZGJsX2Z1bmMpIHsKICBsZXQgbmNsaWNrcyA9IDA7CiAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7CiAgICBuY2xpY2tzICs9IDE7CiAgICBpZiAobmNsaWNrcyA+IDEpIHsKICAgICAgZGJsX2Z1bmMoLi4uYXJncyk7CiAgICAgIG5jbGlja3MgPSAwOwogICAgfSBlbHNlIHsKICAgICAgZGVsYXkoMzAwKS50aGVuKCgpID0+IHsKICAgICAgICBpZiAobmNsaWNrcyA9PSAxKSB7CiAgICAgICAgICBzaW5nbGVfZnVuYyguLi5hcmdzKTsKICAgICAgICB9CiAgICAgICAgbmNsaWNrcyA9IDA7CiAgICAgIH0pOwogICAgfQogIH07Cn0KCi8vIFdlIHJlbW92ZSB0aGUgZGVmYXVsdCBkb3dubG9hZCBpbWFnZSBidXR0b24KcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9SZW1vdmUgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlLAogIFsidG9JbWFnZSJdCik7Ci8vIFdlIGFkZCB0aGUgY3VzdG9tIGJ1dHRvbiB0byB0aGUgbW9kZWJhcgpwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb0FkZCA9IF8udW5pb24oCiAgcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQsCiAgWwogICAgewogICAgICBuYW1lOiAiQ29weSBQTkcgdG8gQ2xpcGJvYXJkIiwKICAgICAgaWNvbjogewogICAgICAgIGhlaWdodDogNTIwLAogICAgICAgIHdpZHRoOiA1MjAsCiAgICAgICAgcGF0aDogIk0yODAgNjRoNDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRWNDQ4YzAgMzUuMy0yOC43IDY0LTY0IDY0SDY0Yy0zNS4zIDAtNjQtMjguNy02NC02NFYxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRoNDAgOS42QzEyMSAyNy41IDE1My4zIDAgMTkyIDBzNzEgMjcuNSA3OC40IDY0SDI4MHpNNjQgMTEyYy04LjggMC0xNiA3LjItMTYgMTZWNDQ4YzAgOC44IDcuMiAxNiAxNiAxNkgzMjBjOC44IDAgMTYtNy4yIDE2LTE2VjEyOGMwLTguOC03LjItMTYtMTYtMTZIMzA0djI0YzAgMTMuMy0xMC43IDI0LTI0IDI0SDE5MiAxMDRjLTEzLjMgMC0yNC0xMC43LTI0LTI0VjExMkg2NHptMTI4LThhMjQgMjQgMCAxIDAgMC00OCAyNCAyNCAwIDEgMCAwIDQ4eiIsCiAgICAgIH0sCiAgICAgIGRpcmVjdGlvbjogInVwIiwKICAgICAgY2xpY2s6IER1YWxDbGljayhjb3B5SW1hZ2VUb0NsaXBib2FyZCwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoKTsKICAgICAgfSksCiAgICB9LAogICAgewogICAgICBuYW1lOiAiRG93bmxvYWQgSW1hZ2UiLAogICAgICBpY29uOiBQbG90bHkuSWNvbnMuY2FtZXJhLAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soc2F2ZUltYWdlVG9GaWxlLCAoKSA9PiB7CiAgICAgICAgcG9wb3V0X2NvbnRhaW5lcih7IGNsOiAiZmlsZXNhdmUiIH0pOwogICAgICB9KSwKICAgIH0sCiAgXQopOwoKZnVuY3Rpb24gZ2V0T2Zmc2V0RGF0YShlbCkgewogIGxldCBjcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsLCBudWxsKTsKICBjb25zdCBvZGF0YSA9IHsKICAgIHBhZGRpbmc6IHsKICAgICAgbGVmdDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSwKICAgICAgYm90dG9tOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSArIHBhcnNlRmxvYXQoY3MucGFkZGluZ0JvdHRvbSksCiAgICB9LAogICAgYm9yZGVyOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyTGVmdFdpZHRoKSwKICAgICAgcmlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyUmlnaHRXaWR0aCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5ib3JkZXJUb3BXaWR0aCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCkgKyBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICB9CiAgfTsKICBpZiAoZWwgPT09IFBMT1QpIHsKICAgIC8vIEZvciB0aGUgUExPVCB3ZSBhbHNvIHdhbnQgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIG9mZnNldAogICAgb2RhdGEub2Zmc2V0ID0gewogICAgICB0b3A6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0VG9wIDogMCwKICAgICAgbGVmdDogUExPVC5vZmZzZXRQYXJlbnQgPT0gQ09OVEFJTkVSID8gUExPVC5vZmZzZXRMZWZ0IDogMCwKICAgIH0KICB9CiAgcmV0dXJuIG9kYXRhOwp9CmZ1bmN0aW9uIGdldFNpemVEYXRhKCkgewogIGNvbnN0IGRhdGEgPSB7CiAgICBwbG90X3BhZDogZ2V0T2Zmc2V0RGF0YShQTE9UKSwKICAgIHBsb3RfcmVjdDogUExPVC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICAgIGNvbnRhaW5lcl9wYWQ6IGdldE9mZnNldERhdGEoQ09OVEFJTkVSKSwKICAgIGNvbnRhaW5lcl9yZWN0OiBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgfTsKICByZXR1cm4gZGF0YTsKfQpmdW5jdGlvbiBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgY29uc3QgY29tcHV0ZWRfc2l6ZSA9IGNvbXB1dGVQbG90U2l6ZShzaXplRGF0YSk7CiAgY29uc3Qgb2Zmc2V0cyA9IGNvbXB1dGVkX3NpemUub2Zmc2V0czsKCiAgY29uc3QgcGxvdF9kYXRhID0gewogICAgd2lkdGg6IHdpZHRoID8/IGNvbXB1dGVkX3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IGhlaWdodCA/PyBjb21wdXRlZF9zaXplLmhlaWdodCwKICB9OwoKICByZXR1cm4gewogICAgd2lkdGg6ICh3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoKSArIG9mZnNldHMud2lkdGgsCiAgICBoZWlnaHQ6IChoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQpICsgb2Zmc2V0cy5oZWlnaHQsCiAgICBub0NoYW5nZTogd2lkdGggPT0gY29tcHV0ZWRfc2l6ZS53aWR0aCAmJiBoZWlnaHQgPT0gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfQp9CgovLyBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hhbmdlIHRoZSBjb250YWluZXIgc2l6ZSBzbyB0aGF0IHRoZSByZXN1bHRpbmcgcGxvdCB3aWxsIGJlIG1hdGNoaW5nIHRoZSBwcm92aWRlZCBzcGVjcwpmdW5jdGlvbiBjaGFuZ2VDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICBpZiAoIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICBjb25zb2xlLmxvZygiVHJpZWQgdG8gY2hhbmdlIGNvbnRhaW5lciBzaXplIHdoZW4gbm90IHBvcHBlZCwgaWdub3JpbmciKTsKICAgIHJldHVybjsKICB9CgogIGNvbnN0IGNzeiA9IGNvbXB1dGVDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSk7CgogIGlmIChjc3oubm9DaGFuZ2UpIHsKICAgIGNvbnNvbGUubG9nKCJTaXplIGlzIHRoZSBzYW1lIGFzIGN1cnJlbnQsIGlnbm9yaW5nIik7CiAgICByZXR1cm4KICB9CiAgLy8gV2UgYXJlIG5vdyBnb2luZyB0byBzZXQgaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgY29udGFpbmVyCiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSBjc3pba2V5XSArICJweCI7CiAgfQp9Ci8vIFdlIG5vdyBjcmVhdGUgdGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCB1cGRhdGUgdGhlIHBsb3QgYmFzZWQgb24gdGhlIHZhbHVlcyBzcGVjaWZpZWQKZnVuY3Rpb24gdXBkYXRlRnJvbUhlYWRlcigpIHsKICBjb25zdCBoZWFkZXJfZGF0YSA9IHsKICAgIGhlaWdodDogY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSwKICAgIHdpZHRoOiBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUsCiAgfTsKICBjaGFuZ2VDb250YWluZXJTaXplKGhlYWRlcl9kYXRhKTsKfQovLyBXZSBhc3NpZ24gdGhpcyBmdW5jdGlvbiB0byB0aGUgb25ibHVyIGV2ZW50IG9mIHdpZHRoIGFuZCBoZWlnaHQKaWYgKGZpcnN0UnVuKSB7CiAgZm9yIChjb25zdCBjb250YWluZXIgb2YgT2JqZWN0LnZhbHVlcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIudWlfc3Bhbi5vbmJsdXIgPSAoZSkgPT4gewogICAgICBjb250YWluZXIudWlfdmFsdWUgPSBjb250YWluZXIudWlfc3Bhbi50ZXh0Q29udGVudDsKICAgICAgdXBkYXRlRnJvbUhlYWRlcigpOwogICAgfTsKICB9Cn0KLy8gVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgcGxvdCBzaXplIHRvIHVzZSBmb3IgcmVsYXlvdXQgYXMgYSBmdW5jdGlvbiBvZiB0aGUgY29udGFpbmVyIHNpemUKZnVuY3Rpb24gY29tcHV0ZVBsb3RTaXplKGRhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgLy8gUmVtb3ZlIFBhZGRpbmcKICBjb25zdCB7IGNvbnRhaW5lcl9wYWQsIHBsb3RfcGFkLCBjb250YWluZXJfcmVjdCB9ID0gZGF0YTsKICBjb25zdCBvZmZzZXRzID0gewogICAgd2lkdGg6CiAgICAgIHBsb3RfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBwbG90X3BhZC5ib3JkZXIud2lkdGggKwogICAgICBwbG90X3BhZC5vZmZzZXQubGVmdCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy53aWR0aCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLndpZHRoLAogICAgaGVpZ2h0OgogICAgICBwbG90X3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIHBsb3RfcGFkLmJvcmRlci5oZWlnaHQgKwogICAgICBwbG90X3BhZC5vZmZzZXQudG9wICsKICAgICAgY29udGFpbmVyX3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLmhlaWdodCwKICB9OwogIGNvbnN0IHN6ID0gewogICAgd2lkdGg6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3Qud2lkdGggLSBvZmZzZXRzLndpZHRoKSwKICAgIGhlaWdodDogTWF0aC5yb3VuZChjb250YWluZXJfcmVjdC5oZWlnaHQgLSBvZmZzZXRzLmhlaWdodCksCiAgICBvZmZzZXRzLAogIH07CiAgcmV0dXJuIHN6Owp9CgovLyBDcmVhdGUgdGhlIHJlc2l6ZU9ic2VydmVyIHRvIG1ha2UgdGhlIHBsb3QgZXZlbiBtb3JlIHJlc3BvbnNpdmUhIDptYWdpYzoKY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHsKICBjb25zdCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCk7CiAgY29uc3Qge2NvbnRhaW5lcl9yZWN0LCBjb250YWluZXJfcGFkfSA9IHNpemVEYXRhOwogIGxldCBwbG90X3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIC8vIFdlIHNhdmUgdGhlIGhlaWdodCBpbiB0aGUgUExPVCBvYmplY3QKICBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQ7CiAgLy8gV2UgZGVhbCB3aXRoIHNvbWUgc3R1ZmYgaWYgdGhlIGNvbnRhaW5lciBpcyBwb3BwcGVkCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9IGNvbnRhaW5lcl9yZWN0LndpZHRoICsgInB4IjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBjb250YWluZXJfcmVjdC5sZWZ0ICsgInB4IjsKICBjb25maWdfc3BhbnMuaGVpZ2h0LnVpX3ZhbHVlID0gcGxvdF9zaXplLmhlaWdodDsKICBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUgPSBwbG90X3NpemUud2lkdGg7CiAgLyogCgkJVGhlIGFkZGl0aW9uIG9mIHRoZSBpbnZhbGlkIGFyZ3VtZW50IGBwbHV0b3Jlc2l6ZWAgc2VlbXMgdG8gZml4IHRoZSBwcm9ibGVtIHdpdGggY2FsbGluZyBgcmVsYXlvdXRgIHNpbXBseSB3aXRoIGB7YXV0b3NpemU6IHRydWV9YCBhcyB1cGRhdGUgYnJlYWtpbmcgbW91c2UgcmVsYXlvdXQgZXZlbnRzIHRyYWNraW5nLiAKCQlTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Bsb3RseS9wbG90bHkuanMvaXNzdWVzLzYxNTYgZm9yIGRldGFpbHMKCQkqLwogIGxldCBjb25maWcgPSB7CiAgICAvLyBJZiB0aGlzIGlzIHBvcHBlZCBvdXQsIHdlIGlnbm9yZSB0aGUgb3JpZ2luYWwgd2lkdGgvaGVpZ2h0CiAgICB3aWR0aDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfd2lkdGgpID8/IHBsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfaGVpZ2h0KSA/PyBwbG90X3NpemUuaGVpZ2h0LAogICAgcGx1dG9yZXNpemU6IHRydWUsCiAgfTsKICBQbG90bHkucmVsYXlvdXQoUExPVCwgY29uZmlnKS50aGVuKCgpID0+IHsKICAgIGlmIChyZW1vdmVfY29udGFpbmVyX3NpemUgJiYgIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIHRoZSBmaXJzdCByZXNpemUgdXBvbiBwbG90IGNyZWF0aW9uIHRvIGFscmVhZHkgYmUgd2l0aG91dCBhIGZpeGVkIGhlaWdodAogICAgICBDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gIiI7CiAgICAgIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogICAgICByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmYWxzZTsKICAgIH0KICB9KTsKfSk7CgpyZXNpemVPYnNlcnZlci5vYnNlcnZlKENPTlRBSU5FUik7CgoKUGxvdGx5LnJlYWN0KFBMT1QsIHBsb3Rfb2JqKS50aGVuKCgpID0+IHsKCS8vIEFzc2lnbiB0aGUgUGxvdGx5IGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKHBsb3RseV9saXN0ZW5lcnMpKSB7CgkJZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcl92ZWMpIHsKCQkJUExPVC5vbihrZXksIGxpc3RlbmVyKQoJCX0KCX0KCS8vIEFzc2lnbiB0aGUgSlMgZXZlbnQgbGlzdGVuZXJzCglmb3IgKGNvbnN0IFtrZXksIGxpc3RlbmVyX3ZlY10gb2YgT2JqZWN0LmVudHJpZXMoanNfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1QuYWRkRXZlbnRMaXN0ZW5lcihrZXksIGxpc3RlbmVyLCB7CgkJCQlzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsCgkJCX0pCgkJfQoJfQp9CikKCgppbnZhbGlkYXRpb24udGhlbigoKSA9PiB7CgkvLyBSZW1vdmUgYWxsIHBsb3RseSBsaXN0ZW5lcnMKCVBMT1QucmVtb3ZlQWxsTGlzdGVuZXJzKCkKCS8vIFJlbW92ZSBhbGwgSlMgbGlzdGVuZXJzCgljb250cm9sbGVyLmFib3J0KCkKCS8vIFJlbW92ZSB0aGUgcmVzaXplT2JzZXJ2ZXIKCXJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKQp9KQoKCgoJCXJldHVybiBDT05UQUlORVIKCTwvc2NyaXB0PgqkbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/owyQ9tewcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJDM1ZmYzNDAyLWRjMzYtNGI5MS1iZWM5LWI0ZDIxZmFmM2U2OLlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzjVS4BO1cHVibGlzaGVkX29iamVjdF9rZXlzkdk1YjNiODQwOGMtODE4MS0xMWVmLTE0ZWItZTFjNTY5YjhiYjI5LzU2NmUxYjE3NGNhM2UwMzi4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkNGE0YTZiZDMtYjgyMC00NzljLTg5ZTMtZjNjZTc5YTMxNmRiiqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedpqiQk8c2NyaXB0IGlkPSdwbG90XzEnPgoJCS8vIFdlIHN0YXJ0IGJ5IHB1dHRpbmcgYWxsIHRoZSB2YXJpYWJsZSBpbnRlcnBvbGF0aW9uIGhlcmUgYXQgdGhlIGJlZ2lubmluZwoJCS8vIFdlIGhhdmUgdG8gY29udmVydCBhbGwgdHlwZWRhcnJheXMgaW4gdGhlIGxheW91dCB0byBub3JtYWwgYXJyYXlzLiBTZWUgSXNzdWUgIzI1CgkJLy8gV2UgdXNlIGxvZGFzaCBmb3IgdGhpcyBmb3IgY29tcGFjdG5lc3MKCQlmdW5jdGlvbiByZW1vdmVUeXBlZEFycmF5KG8pIHsKCQkJcmV0dXJuIF8uaXNUeXBlZEFycmF5KG8pID8gQXJyYXkuZnJvbShvKSA6CgkJCV8uaXNQbGFpbk9iamVjdChvKSA/IF8ubWFwVmFsdWVzKG8sIHJlbW92ZVR5cGVkQXJyYXkpIDogCgkJCW8KCQl9CgoJCS8vIFB1Ymxpc2ggdGhlIHBsb3Qgb2JqZWN0IHRvIEpTCgkJbGV0IHBsb3Rfb2JqID0gXy51cGRhdGUoLyogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBBYnN0cmFjdFBsdXRvRGluZ2V0amVzLkRpc3BsYXkucHVibGlzaGVkX3RvX2pzICovIGdldFB1Ymxpc2hlZE9iamVjdCgiYjNiODQwOGMtODE4MS0xMWVmLTE0ZWItZTFjNTY5YjhiYjI5L2I4NmM1NjgyNWNlZTIwNTciKSwgImxheW91dCIsIHJlbW92ZVR5cGVkQXJyYXkpCgkJLy8gR2V0IHRoZSBwbG90bHkgbGlzdGVuZXJzCgkJY29uc3QgcGxvdGx5X2xpc3RlbmVycyA9IHt9CgkJLy8gR2V0IHRoZSBKUyBsaXN0ZW5lcnMKCQljb25zdCBqc19saXN0ZW5lcnMgPSB7fQoJCS8vIERlYWwgd2l0aCBldmVudHVhbCBjdXN0b20gY2xhc3NlcwoJCWxldCBjdXN0b21fY2xhc3NsaXN0ID0gW10KCgoJCS8vIExvYWQgdGhlIHBsb3RseSBsaWJyYXJ5CgkJbGV0IFBsb3RseSA9IHVuZGVmaW5lZAoJCXRyeSB7CgkJCWxldCBfbW9kID0gYXdhaXQgaW1wb3J0KCIuL3Bsb3RseWpzL3Bsb3RseWpzLTIuMjYuMi5taW4uanMiKQoJCQlQbG90bHkgPSBfbW9kLmRlZmF1bHQKCQl9IGNhdGNoIChlKSB7CgkJCWNvbnNvbGUubG9nKCJMb2NhbCBsb2FkIGZhaWxlZCwgdHJ5aW5nIHdpdGggdGhlIHdlYiBlc20uc2ggdmVyc2lvbiIpCgkJCWxldCBfbW9kID0gYXdhaXQgaW1wb3J0KCJodHRwczovL2VzbS5zaC92MTM1L3Bsb3RseS5qcy1kaXN0LW1pbkAyLjI2LjIvZXNuZXh0L3Bsb3RseS5qcy1kaXN0LW1pbi5tanMiKQoJCQlQbG90bHkgPSBfbW9kLmRlZmF1bHQKCQl9CgoJCS8vIENoZWNrIGlmIHdlIGhhdmUgdG8gZm9yY2UgbG9jYWwgbWF0aGpheCBmb250IGNhY2hlCgkJaWYgKGZhbHNlICYmIHdpbmRvdz8uTWF0aEpheD8uY29uZmlnPy5zdmc/LmZvbnRDYWNoZSA9PT0gJ2dsb2JhbCcpIHsKCQkJd2luZG93Lk1hdGhKYXguY29uZmlnLnN2Zy5mb250Q2FjaGUgPSAnbG9jYWwnCgkJfQoKCQkvLyBGbGFnIHRvIGNoZWNrIGlmIHRoaXMgY2VsbCB3YXMgIG1hbnVhbGx5IHJhbiBvciByZWFjdGl2ZWx5IHJhbgpjb25zdCBmaXJzdFJ1biA9IHRoaXMgPyBmYWxzZSA6IHRydWUKY29uc3QgQ09OVEFJTkVSID0gdGhpcyA/PyBodG1sYDxkaXYgY2xhc3M9J3BsdXRvcGxvdGx5LWNvbnRhaW5lcic+YApjb25zdCBQTE9UID0gQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoJy5qcy1wbG90bHktcGxvdCcpID8/IENPTlRBSU5FUi5hcHBlbmRDaGlsZChodG1sYDxkaXY+YCkKY29uc3QgcGFyZW50ID0gQ09OVEFJTkVSLnBhcmVudEVsZW1lbnQKLy8gV2UgdXNlIGEgY29udHJvbGxlciB0byByZW1vdmUgZXZlbnQgbGlzdGVuZXJzIHVwb24gaW52YWxpZGF0aW9uCmNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCkKLy8gV2UgaGF2ZSB0byBhZGQgdGhpcyB0byBrZWVwIHN1cHBvcnRpbmcgQGJpbmQgd2l0aCB0aGUgb2xkIEFQSSB1c2luZyBQTE9UClBMT1QuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoZSkgPT4gewoJQ09OVEFJTkVSLnZhbHVlID0gUExPVC52YWx1ZQoJaWYgKGUuYnViYmxlcykgewoJCXJldHVybgoJfQoJQ09OVEFJTkVSLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdpbnB1dCcpKQp9LCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSkKCgkvLyBUaGlzIGNyZWF0ZSB0aGUgc3R5bGUgc3ViZGl2IG9uIGZpcnN0IHJ1bgoJZmlyc3RSdW4gJiYgQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgCgk8c3R5bGU+CgkucGx1dG9wbG90bHktY29udGFpbmVyIHsKCQl3aWR0aDogMTAwJTsKCQloZWlnaHQ6IDEwMCU7CgkJbWluLWhlaWdodDogMDsKCQltaW4td2lkdGg6IDA7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyIC5qcy1wbG90bHktcGxvdCAucGxvdGx5IGRpdiB7CgkJbWFyZ2luOiAwIGF1dG87IC8vIFRoaXMgY2VudGVycyB0aGUgcGxvdAoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5wb3BwZWQtb3V0IHsKCQlvdmVyZmxvdzogYXV0bzsKCQl6LWluZGV4OiAxMDAwOwoJCXBvc2l0aW9uOiBmaXhlZDsKCQlyZXNpemU6IGJvdGg7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwcHg7CgkJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDBweDsKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIHsKCQlkaXNwbGF5OiBmbGV4OwoJCWZsZXgtZmxvdzogcm93IHdyYXA7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMTJweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMTJweDsKCQlwb3NpdGlvbjogZml4ZWQ7CgkJei1pbmRleDogMTAwMTsKCQljdXJzb3I6IG1vdmU7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCAtMTAwJSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgc3BhbiB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCWZsZXg6IDEKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyLmhpZGRlbiB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3BhbiB7CgkJcG9zaXRpb246IHJlbGF0aXZlOwoJfQoJLmNsaXBib2FyZC12YWx1ZSB7CgkJcGFkZGluZy1yaWdodDogNXB4OwoJCXBhZGRpbmctbGVmdDogMnB4OwoJCWN1cnNvcjogdGV4dDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZmlsZW5hbWUgewoJCWZsZXg6IDAgMCAxMDAlOwoJCXRleHQtYWxpZ246IGNlbnRlcjsKCQlib3JkZXItdG9wOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJbWFyZ2luLXRvcDogNXB4OwoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5maWxlbmFtZSB7CgkJbWFyZ2luLWxlZnQ6IDNweDsKCQl0ZXh0LWFsaWduOiBsZWZ0OwoJCW1pbi13aWR0aDogbWluKDYwJSwgbWluLWNvbnRlbnQpOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5maWxlc2F2ZSAuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgLmxhYmVsIHsKCQlmbGV4OiAwIDAgMDsKCX0KCS5jbGlwYm9hcmQtdmFsdWUuZm9ybWF0IHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7CgkJZmxleDogMSAwIGF1dG87CgkJbWluLXdpZHRoOiAzMHB4OwoJCW1hcmdpbi1yaWdodDogMTBweDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyB7CgkJZGlzcGxheTogaW5saW5lLWZsZXg7CgkJZmxleC1mbG93OiBjb2x1bW47CgkJcG9zaXRpb246IGFic29sdXRlOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJcGFkZGluZy1sZWZ0OiAzcHg7CgkJei1pbmRleDogMjAwMDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9uczpob3ZlciB7CgkJY3Vyc29yOiBwb2ludGVyOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCXBhZGRpbmc6IDNweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtM3B4LCAtNnB4KTsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyAuZm9ybWF0LW9wdGlvbiB7CgkJZGlzcGxheTogbm9uZTsKCX0KCWRpdi5mb3JtYXQtb3B0aW9uczpob3ZlciAuZm9ybWF0LW9wdGlvbiB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246bm90KC5zZWxlY3RlZCkgewoJCW1hcmdpbi10b3A6IDNweDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyAuZm9ybWF0LW9wdGlvbi5zZWxlY3RlZCB7CgkJb3JkZXI6IC0xOwoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5mb3JtYXQtb3B0aW9uOmhvdmVyIHsKCQliYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCX0KCXNwYW4uY29uZmlnLXZhbHVlIHsKCQlmb250LXdlaWdodDogbm9ybWFsOwoJCWNvbG9yOiB2YXIoLS1wbHV0by1vdXRwdXQtY29sb3IpOwoJCWRpc3BsYXk6IG5vbmU7CgkJcG9zaXRpb246IGFic29sdXRlOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCBjYWxjKC0xMDAlIC0gMTBweCkpOwoJCXBhZGRpbmc6IDVweDsKCX0KCS5sYWJlbCB7CgkJdXNlci1zZWxlY3Q6IG5vbmU7Cgl9CgkubGFiZWw6aG92ZXIgc3Bhbi5jb25maWctdmFsdWUgewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQltaW4td2lkdGg6IDE1MHB4OwoJfQoJLmNsaXBib2FyZC1zcGFuLm1hdGNoaW5nLWNvbmZpZyAubGFiZWwgewoJCWNvbG9yOiB2YXIoLS1jbS1tYWNyby1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZGlmZmVyZW50LWNvbmZpZyAubGFiZWwgewoJCWNvbG9yOiB2YXIoLS1jbS10YWctY29sb3IpOwoJCWZvbnQtd2VpZ2h0OiBib2xkOwoJfQo8L3N0eWxlPgpgKQoKbGV0IG9yaWdpbmFsX2hlaWdodCA9IHBsb3Rfb2JqLmxheW91dC5oZWlnaHQKbGV0IG9yaWdpbmFsX3dpZHRoID0gcGxvdF9vYmoubGF5b3V0LndpZHRoCi8vIEZvciB0aGUgaGVpZ2h0IHdlIGhhdmUgdG8gYWxzbyBwdXQgYSBmaXhlZCB2YWx1ZSBpbiBjYXNlIHRoZSBwbG90IGlzIHB1dCBvbiBhIG5vbi1maXhlZC1zaXplIGNvbnRhaW5lciAobGlrZSB0aGUgZGVmYXVsdCB3cmFwcGVyKQovLyBXZSBkZWZpbmUgYSB2YXJpYWJsZSB0byBjaGVjayB3aGV0aGVyIHdlIHN0aWxsIGhhdmUgdG8gcmVtb3ZlIHRoZSBmaXhlZCBoZWlnaHQKbGV0IHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IGZpcnN0UnVuCmxldCBjb250YWluZXJfaGVpZ2h0ID0gb3JpZ2luYWxfaGVpZ2h0ID8/IFBMT1QuY29udGFpbmVyX2hlaWdodCA/PyA0MDAKQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9IGNvbnRhaW5lcl9oZWlnaHQgKyAncHgnCgovLyBXZSBjcmVhdGUgYSBQcm9taXNlIHZlcnNpb24gb2Ygc2V0VGltZW91dApmdW5jdGlvbiBkZWxheShtcykgewogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpOwp9CgovLyBXZSBpbXBvcnQgaW50ZXJhY3QgZm9yIGRyYWdnaW5nL3Jlc2l6aW5nCmNvbnN0IHsgZGVmYXVsdDogaW50ZXJhY3QgfSA9IGF3YWl0IGltcG9ydCgnaHR0cHM6Ly9lc20uc2gvaW50ZXJhY3Rqc0AxLjEwLjE5JykKCgpmdW5jdGlvbiBnZXRJbWFnZU9wdGlvbnMoKSB7CiAgY29uc3QgbyA9IHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICByZXR1cm4gewogICAgZm9ybWF0OiBvLmZvcm1hdCA/PyAicG5nIiwKICAgIHdpZHRoOiBvLndpZHRoID8/IG9yaWdpbmFsX3dpZHRoLAogICAgaGVpZ2h0OiBvLmhlaWdodCA/PyBvcmlnaW5hbF9oZWlnaHQsCiAgICBzY2FsZTogby5zY2FsZSA/PyAxLAogICAgZmlsZW5hbWU6IG8uZmlsZW5hbWUgPz8gIm5ld3Bsb3QiLAogIH07Cn0KCmNvbnN0IENMSVBCT0FSRF9IRUFERVIgPQogIENPTlRBSU5FUi5xdWVyeVNlbGVjdG9yKCIucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciIpID8/CiAgQ09OVEFJTkVSLmluc2VydEFkamFjZW50RWxlbWVudCgKICAgICJhZnRlcmJlZ2luIiwKICAgIGh0bWxgPGRpdiBjbGFzcz0icGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBoaWRkZW4iPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gZm9ybWF0IgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZvcm1hdDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBmb3JtYXQiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gd2lkdGgiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+V2lkdGg6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgd2lkdGgiPjwvc3Bhbj5weDwvc3BhbgogICAgICA+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBoZWlnaHQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+SGVpZ2h0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGhlaWdodCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHNjYWxlIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPlNjYWxlOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIHNjYWxlIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2V0Ij5TZXQ8L2J1dHRvbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gdW5zZXQiPlVuc2V0PC9idXR0b24+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmaWxlbmFtZSIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5GaWxlbmFtZTo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBmaWxlbmFtZSI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICA8L2Rpdj5gCiAgKTsKCmZ1bmN0aW9uIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpIHsKICBjb25zdCB2YWxpZF9jbGFzc2VzID0gWwogICAgIm1pc3NpbmctY29uZmlnIiwKICAgICJtYXRjaGluZy1jb25maWciLAogICAgImRpZmZlcmVudC1jb25maWciLAogIF07CiAgZnVuY3Rpb24gc2V0Q2xhc3MoY2wpIHsKICAgIGZvciAoY29uc3QgbmFtZSBvZiB2YWxpZF9jbGFzc2VzKSB7CiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKG5hbWUsIG5hbWUgPT0gY2wpOwogICAgfQogIH0KICAvLyBXZSB1c2UgdGhlIGN1c3RvbSBnZXR0ZXJzIHdlJ2xsIHNldCB1cCBpbiB0aGUgY29udGFpbmVyCiAgY29uc3QgeyB1aV92YWx1ZSwgY29uZmlnX3ZhbHVlLCBjb25maWdfc3Bhbiwga2V5IH0gPSBjb250YWluZXI7CiAgaWYgKGNvbmZpZ192YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICBzZXRDbGFzcygibWlzc2luZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaXMgbm90IHByZXNlbnQgaW4gdGhlIGNvbmZpZy5gOwogIH0gZWxzZSBpZiAodWlfdmFsdWUgPT0gY29uZmlnX3ZhbHVlKSB7CiAgICBzZXRDbGFzcygibWF0Y2hpbmctY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGhhcyB0aGUgc2FtZSB2YWx1ZSBpbiB0aGUgY29uZmlnIGFuZCBpbiB0aGUgaGVhZGVyLmA7CiAgfSBlbHNlIHsKICAgIHNldENsYXNzKCJkaWZmZXJlbnQtY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGhhcyBhIGRpZmZlcmVudCB2YWx1ZSAoPGVtPiR7Y29uZmlnX3ZhbHVlfTwvZW0+KSBpbiB0aGUgY29uZmlnLmA7CiAgfQogIC8vIEFkZCBpbmZvIGFib3V0IHNldHRpbmcgYW5kIHVuc2V0dGluZwogIGNvbmZpZ19zcGFuLmluc2VydEFkamFjZW50SFRNTCgKICAgICJiZWZvcmVlbmQiLAogICAgYDxicj5DbGljayBvbiB0aGUgbGFiZWwgPGVtPjxiPm9uY2U8L2I+PC9lbT4gdG8gc2V0IHRoZSBjdXJyZW50IFVJIHZhbHVlIGluIHRoZSBjb25maWcuYAogICk7CiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIDxlbT48Yj50d2ljZTwvYj48L2VtPiB0byByZW1vdmUgdGhpcyBrZXkgZnJvbSB0aGUgY29uZmlnLmAKICApOwp9Cgpjb25zdCB2YWxpZF9mb3JtYXRzID0gWyJwbmciLCAic3ZnIiwgIndlYnAiLCAianBlZyIsICJmdWxsLWpzb24iXTsKZnVuY3Rpb24gaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHNwYW4sIGtleSwgdmFsdWUpIHsKICBjb25zdCBjb250YWluZXIgPSBzcGFuLmNsb3Nlc3QoIi5jbGlwYm9hcmQtc3BhbiIpOwogIHNwYW4uY29udGVudEVkaXRhYmxlID0ga2V5ID09PSAiZm9ybWF0IiA/ICJmYWxzZSIgOiAidHJ1ZSI7CiAgbGV0IHBhcnNlID0gKHgpID0+IHg7CiAgbGV0IHVwZGF0ZSA9ICh4KSA9PiAoc3Bhbi50ZXh0Q29udGVudCA9IHgpOwogIGlmIChrZXkgPT09ICJ3aWR0aCIgfHwga2V5ID09PSAiaGVpZ2h0IikgewogICAgcGFyc2UgPSAoeCkgPT4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KHgpKTsKICB9IGVsc2UgaWYgKGtleSA9PT0gInNjYWxlIikgewogICAgcGFyc2UgPSBwYXJzZUZsb2F0OwogIH0gZWxzZSBpZiAoa2V5ID09PSAiZm9ybWF0IikgewogICAgLy8gV2UgcmVtb3ZlIGNvbnRlbnRFZGl0YWJsZQogICAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSAiZmFsc2UiOwogICAgLy8gSGVyZSB3ZSBmaXJzdCBhZGQgdGhlIHN1YnNwYW5zIGZvciBlYWNoIG9wdGlvbgogICAgY29uc3Qgb3B0c19kaXYgPSBzcGFuLmFwcGVuZENoaWxkKGh0bWxgPGRpdiBjbGFzcz0iZm9ybWF0LW9wdGlvbnMiPjwvZGl2PmApOwogICAgZm9yIChjb25zdCBmbXQgb2YgdmFsaWRfZm9ybWF0cykgewogICAgICBjb25zdCBvcHQgPSBvcHRzX2Rpdi5hcHBlbmRDaGlsZCgKICAgICAgICBodG1sYDxzcGFuIGNsYXNzPSJmb3JtYXQtb3B0aW9uICR7Zm10fSI+JHtmbXR9PC9zcGFuPmAKICAgICAgKTsKICAgICAgb3B0Lm9uY2xpY2sgPSAoZSkgPT4gewogICAgICAgIHNwYW4udmFsdWUgPSBvcHQudGV4dENvbnRlbnQ7CiAgICAgIH07CiAgICB9CiAgICBwYXJzZSA9ICh4KSA9PiB7CiAgICAgIHJldHVybiB2YWxpZF9mb3JtYXRzLmluY2x1ZGVzKHgpID8geCA6IGxvY2FsVmFsdWU7CiAgICB9OwogICAgdXBkYXRlID0gKHgpID0+IHsKICAgICAgZm9yIChjb25zdCBvcHQgb2Ygb3B0c19kaXYuY2hpbGRyZW4pIHsKICAgICAgICBvcHQuY2xhc3NMaXN0LnRvZ2dsZSgic2VsZWN0ZWQiLCBvcHQudGV4dENvbnRlbnQgPT09IHgpOwogICAgICB9CiAgICB9OwogIH0gZWxzZSB7CiAgICAvLyBXZSBvbmx5IGhhdmUgZmlsZW5hbWUgaGVyZQogIH0KICBsZXQgbG9jYWxWYWx1ZTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBsb2NhbFZhbHVlOwogICAgfSwKICAgIHNldDogKHZhbCkgPT4gewogICAgICBpZiAodmFsICE9PSAiIikgewogICAgICAgIGxvY2FsVmFsdWUgPSBwYXJzZSh2YWwpOwogICAgICB9CiAgICAgIHVwZGF0ZShsb2NhbFZhbHVlKTsKICAgICAgY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcik7CiAgICB9LAogIH0pOwogIC8vIFdlIGFsc28gYXNzaWduIGEgbGlzdGVuZXIgc28gdGhhdCB0aGUgZWRpdGFibGUgaXMgYmx1cnJlZCB3aGVuIGVudGVyIGlzIHByZXNzZWQKICBzcGFuLm9ua2V5ZG93biA9IChlKSA9PiB7CiAgICBpZiAoZS5rZXlDb2RlID09PSAxMykgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHNwYW4uYmx1cigpOwogICAgfQogIH07CiAgc3Bhbi52YWx1ZSA9IHZhbHVlOwp9CgpmdW5jdGlvbiBpbml0aWFsaXplQ29uZmlnVmFsdWVTcGFuKHNwYW4sIGtleSkgewogIC8vIEhlcmUgd2UgbW9zdGx5IHdhbnQgdG8gZGVmaW5lIHRoZSBzZXR0ZXIgYW5kIGdldHRlcgogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwYW4sICJ2YWx1ZSIsIHsKICAgIGdldDogKCkgPT4gewogICAgICByZXR1cm4gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV07CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIC8vIGlmIHVuZGVmaW5lZCBpcyBwYXNzZWQsIHdlIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgb3B0aW9ucwogICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsKICAgICAgICBkZWxldGUgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV0gPSB2YWw7CiAgICAgIH0KICAgICAgY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcik7CiAgICB9LAogIH0pOwp9Cgpjb25zdCBjb25maWdfc3BhbnMgPSB7fTsKZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZ2V0SW1hZ2VPcHRpb25zKCkpKSB7CiAgY29uc3QgY29udGFpbmVyID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKGAuY2xpcGJvYXJkLXNwYW4uJHtrZXl9YCk7CiAgY29uc3QgbGFiZWwgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmxhYmVsIik7CiAgLy8gV2UgZ2l2ZSB0aGUgbGFiZWwgYSBmdW5jdGlvbiB0aGF0IG9uIHNpbmdsZSBjbGljayB3aWxsIHNldCB0aGUgY3VycmVudCB2YWx1ZSBhbmQgd2l0aCBkb3VibGUgY2xpY2sgd2lsbCB1bnNldCBpdAogIGxhYmVsLm9uY2xpY2sgPSBEdWFsQ2xpY2soCiAgICAoKSA9PiB7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBjb250YWluZXIudWlfdmFsdWU7CiAgICB9LAogICAgKGUpID0+IHsKICAgICAgY29uc29sZS5sb2coImUiLCBlKTsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gdW5kZWZpbmVkOwogICAgfQogICk7CiAgY29uc3QgdWlfdmFsdWVfc3BhbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXZhbHVlIik7CiAgY29uc3QgY29uZmlnX3ZhbHVlX3NwYW4gPQogICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jb25maWctdmFsdWUiKSA/PwogICAgbGFiZWwuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgICAiYWZ0ZXJiZWdpbiIsCiAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImNvbmZpZy12YWx1ZSI+PC9zcGFuPmAKICAgICk7CiAgLy8gQXNzaW5nIHRoZSB0d28gc3BhbnMgYXMgcHJvcGVydGllcyBvZiB0aGUgY29udGFpbmluZyBzcGFuCiAgY29udGFpbmVyLnVpX3NwYW4gPSB1aV92YWx1ZV9zcGFuOwogIGNvbnRhaW5lci5jb25maWdfc3BhbiA9IGNvbmZpZ192YWx1ZV9zcGFuOwogIGNvbnRhaW5lci5rZXkgPSBrZXk7CiAgY29uZmlnX3NwYW5zW2tleV0gPSBjb250YWluZXI7CiAgaWYgKGZpcnN0UnVuKSB7CiAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPQogICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPz8ge307CiAgICAvLyBXZSBkbyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHZhbHVlIHNwYW4KICAgIGluaXRpYWxpemVVSVZhbHVlU3Bhbih1aV92YWx1ZV9zcGFuLCBrZXksIHZhbHVlKTsKICAgIC8vIFRoZW4gd2UgaW5pdGlhbGl6ZSB0aGUgY29uZmlnIHZhbHVlCiAgICBpbml0aWFsaXplQ29uZmlnVmFsdWVTcGFuKGNvbmZpZ192YWx1ZV9zcGFuLCBrZXkpOwogICAgLy8gV2UgcHV0IHNvbWUgY29udmVuaWVuY2UgZ2V0dGVycy9zZXR0ZXJzCiAgICAvLyB1aV92YWx1ZSBmb3J3YXJkCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAidWlfdmFsdWUiLCB7CiAgICAgIGdldDogKCkgPT4gdWlfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgdWlfdmFsdWVfc3Bhbi52YWx1ZSA9IHZhbDsKICAgICAgfSwKICAgIH0pOwogICAgLy8gY29uZmlnX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJjb25maWdfdmFsdWUiLCB7CiAgICAgIGdldDogKCkgPT4gY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUsCiAgICAgIHNldDogKHZhbCkgPT4gewogICAgICAgIGNvbmZpZ192YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgfQp9CgovLyBUaGVzZSBvYmplY3RzIHdpbGwgY29udGFpbiB0aGUgZGVmYXVsdCB2YWx1ZQoKLy8gVGhpcyBjb2RlIHVwZGF0ZXMgdGhlIGltYWdlIG9wdGlvbnMgaW4gdGhlIFBMT1QgY29uZmlnIHdpdGggdGhlIHByb3ZpZGVkIG9uZXMKZnVuY3Rpb24gc2V0SW1hZ2VPcHRpb25zKG8pIHsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IG9ba2V5XTsKICB9Cn0KZnVuY3Rpb24gdW5zZXRJbWFnZU9wdGlvbnMoKSB7CiAgc2V0SW1hZ2VPcHRpb25zKHt9KTsKfQoKY29uc3Qgc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnNldCIpOwpjb25zdCB1bnNldF9idXR0b24gPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtc3Bhbi51bnNldCIpOwppZiAoZmlyc3RSdW4pIHsKICBzZXRfYnV0dG9uLm9uY2xpY2sgPSAoZSkgPT4gewogICAgZm9yIChjb25zdCBjb250YWluZXIgb2YgT2JqZWN0LnZhbHVlcyhjb25maWdfc3BhbnMpKSB7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBjb250YWluZXIudWlfdmFsdWU7CiAgICB9CiAgfTsKICB1bnNldF9idXR0b24ub25jbGljayA9IHVuc2V0SW1hZ2VPcHRpb25zOwp9CgovLyBXZSBhZGQgYSBmdW5jdGlvbiB0byBjaGVjayBpZiB0aGUgY2xpcGJvYXJkIGlzIHBvcHBlZCBvdXQKQ09OVEFJTkVSLmlzUG9wcGVkT3V0ID0gKCkgPT4gewogIHJldHVybiBDT05UQUlORVIuY2xhc3NMaXN0LmNvbnRhaW5zKCJwb3BwZWQtb3V0Iik7Cn07CgpDTElQQk9BUkRfSEVBREVSLm9ubW91c2Vkb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgaWYgKGV2ZW50LnRhcmdldC5tYXRjaGVzKCJzcGFuLmNsaXBib2FyZC12YWx1ZSIpKSB7CiAgICBjb25zb2xlLmxvZygiV2UgZG9uJ3QgbW92ZSEiKTsKICAgIHJldHVybjsKICB9CiAgY29uc3Qgc3RhcnQgPSB7CiAgICBsZWZ0OiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS5sZWZ0KSwKICAgIHRvcDogcGFyc2VGbG9hdChDT05UQUlORVIuc3R5bGUudG9wKSwKICAgIFg6IGV2ZW50LnBhZ2VYLAogICAgWTogZXZlbnQucGFnZVksCiAgfTsKICBmdW5jdGlvbiBtb3ZlQXQoZXZlbnQsIHN0YXJ0KSB7CiAgICBjb25zdCB0b3AgPSBldmVudC5wYWdlWSAtIHN0YXJ0LlkgKyBzdGFydC50b3AgKyAicHgiOwogICAgY29uc3QgbGVmdCA9IGV2ZW50LnBhZ2VYIC0gc3RhcnQuWCArIHN0YXJ0LmxlZnQgKyAicHgiOwogICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gbGVmdDsKICAgIENPTlRBSU5FUi5zdHlsZS5sZWZ0ID0gbGVmdDsKICAgIENPTlRBSU5FUi5zdHlsZS50b3AgPSB0b3A7CiAgfQoKICAvLyBtb3ZlIG91ciBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYmFsbCB1bmRlciB0aGUgcG9pbnRlcgogIG1vdmVBdChldmVudCwgc3RhcnQpOwogIGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGV2ZW50KSB7CiAgICBtb3ZlQXQoZXZlbnQsIHN0YXJ0KTsKICB9CgogIC8vIFdlIHVzZSB0aGlzIHRvIHJlbW92ZSB0aGUgbW91c2Vtb3ZlIHdoZW4gY2xpY2tpbmcgb3V0c2lkZSBvZiB0aGUgY29udGFpbmVyCiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgLy8gbW92ZSB0aGUgY29udGFpbmVyIG9uIG1vdXNlbW92ZQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIG9uTW91c2VNb3ZlLCB7CiAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLAogIH0pOwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAibW91c2Vkb3duIiwKICAgIChlKSA9PiB7CiAgICAgIGlmIChlLnRhcmdldC5jbG9zZXN0KCIucGx1dG9wbG90bHktY29udGFpbmVyIikgIT09IENPTlRBSU5FUikgewogICAgICAgIGNsZWFuVXAoKTsKICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9LAogICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0KICApOwoKICBmdW5jdGlvbiBjbGVhblVwKCkgewogICAgY29uc29sZS5sb2coImNsZWFuaW5nIHVwIHRoZSBwbG90IG1vdmUgbGlzdGVuZXIiKTsKICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gbnVsbDsKICB9CgogIC8vICgzKSBkcm9wIHRoZSBiYWxsLCByZW1vdmUgdW5uZWVkZWQgaGFuZGxlcnMKICBDTElQQk9BUkRfSEVBREVSLm9ubW91c2V1cCA9IGNsZWFuVXA7Cn07CgpmdW5jdGlvbiBzZW5kVG9DbGlwYm9hcmQoYmxvYikgewogIGlmICghbmF2aWdhdG9yLmNsaXBib2FyZCkgewogICAgYWxlcnQoCiAgICAgICJUaGUgQ2xpcGJvYXJkIEFQSSBkb2VzIG5vdCBzZWVtIHRvIGJlIGF2YWlsYWJsZSwgbWFrZSBzdXJlIHRoZSBQbHV0byBub3RlYm9vayBpcyBiZWluZyB1c2VkIGZyb20gZWl0aGVyIGxvY2FsaG9zdCBvciBhbiBodHRwcyBzb3VyY2UuIgogICAgKTsKICB9CiAgbmF2aWdhdG9yLmNsaXBib2FyZAogICAgLndyaXRlKFsKICAgICAgbmV3IENsaXBib2FyZEl0ZW0oewogICAgICAgIC8vIFRoZSBrZXkgaXMgZGV0ZXJtaW5lZCBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgYmxvYidzIHR5cGUuCiAgICAgICAgW2Jsb2IudHlwZV06IGJsb2IsCiAgICAgIH0pLAogICAgXSkKICAgIC50aGVuKAogICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgY29uc29sZS5sb2coIkFzeW5jOiBDb3B5aW5nIHRvIGNsaXBib2FyZCB3YXMgc3VjY2Vzc2Z1bCEiKTsKICAgICAgfSwKICAgICAgZnVuY3Rpb24gKGVycikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkFzeW5jOiBDb3VsZCBub3QgY29weSB0ZXh0OiAiLCBlcnIpOwogICAgICB9CiAgICApOwp9CgpmdW5jdGlvbiBjb3B5SW1hZ2VUb0NsaXBib2FyZCgpIHsKICAvLyBXZSBleHRyYWN0IHRoZSBpbWFnZSBvcHRpb25zIGZyb20gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMgKGlmIHRoZXkgZXhpc3QpCiAgY29uc3QgY29uZmlnID0ge307CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGxldCB2YWwgPQogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID8/CiAgICAgIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IGNvbnRhaW5lci51aV92YWx1ZSA6IHVuZGVmaW5lZCk7CiAgICAvLyBJZiB3ZSBoYXZlIHVuZGVmaW5lZCB3ZSBkb24ndCBjcmVhdGUgdGhlIGtleS4gV2UgYWxzbyBpZ25vcmUgZm9ybWF0IGJlY2F1c2UgdGhlIGNsaXBib2FyZCBvbmx5IHN1cHBvcnRzIHBuZy4KICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS50b0ltYWdlKFBMT1QsIGNvbmZpZykudGhlbihmdW5jdGlvbiAoZGF0YVVybCkgewogICAgZmV0Y2goZGF0YVVybCkKICAgICAgLnRoZW4oKHJlcykgPT4gcmVzLmJsb2IoKSkKICAgICAgLnRoZW4oKGJsb2IpID0+IHsKICAgICAgICBjb25zdCBwYXN0ZV9yZWNlaXZlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3Bhc3RlLXJlY2VpdmVyLnBsdXRvcGxvdGx5JykKICAgICAgICBpZiAocGFzdGVfcmVjZWl2ZXIpIHsKICAgICAgICAgIHBhc3RlX3JlY2VpdmVyLmF0dGFjaEltYWdlKGRhdGFVcmwsIENPTlRBSU5FUikKICAgICAgICB9CiAgICAgICAgc2VuZFRvQ2xpcGJvYXJkKGJsb2IpCiAgICAgIH0pOwogIH0pOwp9CgpmdW5jdGlvbiBzYXZlSW1hZ2VUb0ZpbGUoKSB7CiAgY29uc3QgY29uZmlnID0ge307CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGxldCB2YWwgPQogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID8/CiAgICAgIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IGNvbnRhaW5lci51aV92YWx1ZSA6IHVuZGVmaW5lZCk7CiAgICAvLyBJZiB3ZSBoYXZlIHVuZGVmaW5lZCB3ZSBkb24ndCBjcmVhdGUgdGhlIGtleS4KICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbmZpZ1trZXldID0gdmFsOwogIH0KICBQbG90bHkuZG93bmxvYWRJbWFnZShQTE9ULCBjb25maWcpOwp9CgpsZXQgY29udGFpbmVyX3JlY3QgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAsIHRvcDogMCwgbGVmdDogMCB9OwpmdW5jdGlvbiB1bnBvcF9jb250YWluZXIoY2wpIHsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZSgicG9wcGVkLW91dCIsIGZhbHNlKTsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgZmFsc2UpOwogIC8vIFdlIGZpeCB0aGUgaGVpZ2h0IGJhY2sgdG8gdGhlIHZhbHVlIGl0IGhhZCBiZWZvcmUgcG9wb3V0LCBhbHNvIHNldHRpbmcgdGhlIGZsYWcgdG8gc2lnbmFsIHRoYXQgdXBvbiBmaXJzdCByZXNpemUgd2UgcmVtb3ZlIHRoZSBmaXhlZCBpbmxpbmUtc3R5bGUKICBDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0ICsgInB4IjsKICByZW1vdmVfY29udGFpbmVyX3NpemUgPSB0cnVlOwogIC8vIFdlIHNldCB0aGUgb3RoZXIgZml4ZWQgaW5saW5lLXN0eWxlcyB0byBudWxsCiAgQ09OVEFJTkVSLnN0eWxlLndpZHRoID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9ICIiOwogIENPTlRBSU5FUi5zdHlsZS5sZWZ0ID0gIiI7CiAgLy8gV2UgYWxzbyByZW1vdmUgdGhlIENMSVBCT0FSRF9IRUFERVIKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLndpZHRoID0gIiI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gIiI7CiAgLy8gRmluYWxseSB3ZSByZW1vdmUgdGhlIGhpZGRlbiBjbGFzcyB0byB0aGUgaGVhZGVyCiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCB0cnVlKTsKICByZXR1cm47Cn0KZnVuY3Rpb24gcG9wb3V0X2NvbnRhaW5lcihvcHRzKSB7CiAgY29uc3QgY2wgPSBvcHRzPy5jbDsKICBjb25zdCB0YXJnZXRfY29udGFpbmVyX3NpemUgPSBvcHRzPy50YXJnZXRfY29udGFpbmVyX3NpemUgPz8ge307CiAgY29uc3QgdGFyZ2V0X3Bsb3Rfc2l6ZSA9IG9wdHM/LnRhcmdldF9wbG90X3NpemUgPz8ge307CiAgaWYgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICByZXR1cm4gdW5wb3BfY29udGFpbmVyKGNsKTsKICB9CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoY2wsIGNsID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IHRydWUpOwogIC8vIFdlIGV4dHJhY3QgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgY29udGFpbmVyLCBzYXZlIHRoZW0gYW5kIGZpeCB0aGVtCiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfSA9IENPTlRBSU5FUi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICBjb250YWluZXJfcmVjdCA9IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH07CiAgLy8gV2Ugc2F2ZSB0aGUgY3VycmVudCBwbG90IHNpemUgYmVmb3JlIHdlIHBvcCBhcyBpdCB3aWxsIGZpbGwgdGhlIHNjcmVlbgogIGNvbnN0IGN1cnJlbnRfcGxvdF9zaXplID0gewogICAgd2lkdGg6IFBMT1QuX2Z1bGxMYXlvdXQud2lkdGgsCiAgICBoZWlnaHQ6IFBMT1QuX2Z1bGxMYXlvdXQuaGVpZ2h0LAogIH07CiAgLy8gV2UgaGF2ZSB0byBzYXZlIHRoZSBwYWQgZGF0YSBiZWZvcmUgcG9wcGluZyBzbyB3ZSBjYW4gcmVzaXplIHByZWNpc2VseQogIGNvbnN0IHBhZCA9IHt9OwogIHBhZC51bnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZSgicG9wcGVkLW91dCIsIHRydWUpOwogIHBhZC5wb3BwZWQgPSBnZXRTaXplRGF0YSgpLmNvbnRhaW5lcl9wYWQ7CiAgLy8gV2UgZG8gdG9wIGFuZCBsZWZ0IGJhc2VkIG9uIHRoZSBjdXJyZW50IHJlY3QKICBmb3IgKGNvbnN0IGtleSBvZiBbInRvcCIsICJsZWZ0Il0pIHsKICAgIGNvbnN0IHN0YXJ0X3ZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNvbnRhaW5lcl9yZWN0W2tleV07CiAgICBsZXQgb2Zmc2V0ID0gMDsKICAgIGZvciAoY29uc3Qga2luZCBvZiBbInBhZGRpbmciLCAiYm9yZGVyIl0pIHsKICAgICAgb2Zmc2V0ICs9IHBhZC5wb3BwZWRba2luZF1ba2V5XSAtIHBhZC51bnBvcHBlZFtraW5kXVtrZXldOwogICAgfQogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSBzdGFydF92YWwgLSBvZmZzZXQgKyAicHgiOwogICAgaWYgKGtleSA9PT0gImxlZnQiKSB7CiAgICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGVba2V5XSA9IENPTlRBSU5FUi5zdHlsZVtrZXldOwogICAgfQogIH0KICAvLyBXZSBjb21wdXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGRlcGVuZGluZyBvbiBldmVudHVhbCBjb25maWcgZGF0YQogIGNvbnN0IGNzeiA9IGNvbXB1dGVDb250YWluZXJTaXplKHsKICAgIHdpZHRoOgogICAgICB0YXJnZXRfcGxvdF9zaXplLndpZHRoID8/CiAgICAgIGNvbmZpZ19zcGFucy53aWR0aC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6CiAgICAgIHRhcmdldF9wbG90X3NpemUuaGVpZ2h0ID8/CiAgICAgIGNvbmZpZ19zcGFucy5oZWlnaHQuY29uZmlnX3ZhbHVlID8/CiAgICAgIGN1cnJlbnRfcGxvdF9zaXplLmhlaWdodCwKICB9KTsKICBmb3IgKGNvbnN0IGtleSBvZiBbIndpZHRoIiwgImhlaWdodCJdKSB7CiAgICBjb25zdCB2YWwgPSB0YXJnZXRfY29udGFpbmVyX3NpemVba2V5XSA/PyBjc3pba2V5XTsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gdmFsICsgInB4IjsKICAgIGlmIChrZXkgPT09ICJ3aWR0aCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIENMSVBCT0FSRF9IRUFERVIuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgZmFsc2UpOwogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CgogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAibW91c2Vkb3duIiwKICAgIChlKSA9PiB7CiAgICAgIGlmIChlLnRhcmdldC5jbG9zZXN0KCIucGx1dG9wbG90bHktY29udGFpbmVyIikgIT09IENPTlRBSU5FUikgewogICAgICAgIHVucG9wX2NvbnRhaW5lcigpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7Cn0KCkNPTlRBSU5FUi5wb3BPdXQgPSBwb3BvdXRfY29udGFpbmVyOwoKZnVuY3Rpb24gRHVhbENsaWNrKHNpbmdsZV9mdW5jLCBkYmxfZnVuYykgewogIGxldCBuY2xpY2tzID0gMDsKICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHsKICAgIG5jbGlja3MgKz0gMTsKICAgIGlmIChuY2xpY2tzID4gMSkgewogICAgICBkYmxfZnVuYyguLi5hcmdzKTsKICAgICAgbmNsaWNrcyA9IDA7CiAgICB9IGVsc2UgewogICAgICBkZWxheSgzMDApLnRoZW4oKCkgPT4gewogICAgICAgIGlmIChuY2xpY2tzID09IDEpIHsKICAgICAgICAgIHNpbmdsZV9mdW5jKC4uLmFyZ3MpOwogICAgICAgIH0KICAgICAgICBuY2xpY2tzID0gMDsKICAgICAgfSk7CiAgICB9CiAgfTsKfQoKLy8gV2UgcmVtb3ZlIHRoZSBkZWZhdWx0IGRvd25sb2FkIGltYWdlIGJ1dHRvbgpwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSA9IF8udW5pb24oCiAgcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9SZW1vdmUsCiAgWyJ0b0ltYWdlIl0KKTsKLy8gV2UgYWRkIHRoZSBjdXN0b20gYnV0dG9uIHRvIHRoZSBtb2RlYmFyCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb0FkZCwKICBbCiAgICB7CiAgICAgIG5hbWU6ICJDb3B5IFBORyB0byBDbGlwYm9hcmQiLAogICAgICBpY29uOiB7CiAgICAgICAgaGVpZ2h0OiA1MjAsCiAgICAgICAgd2lkdGg6IDUyMCwKICAgICAgICBwYXRoOiAiTTI4MCA2NGg0MGMzNS4zIDAgNjQgMjguNyA2NCA2NFY0NDhjMCAzNS4zLTI4LjcgNjQtNjQgNjRINjRjLTM1LjMgMC02NC0yOC43LTY0LTY0VjEyOEMwIDkyLjcgMjguNyA2NCA2NCA2NGg0MCA5LjZDMTIxIDI3LjUgMTUzLjMgMCAxOTIgMHM3MSAyNy41IDc4LjQgNjRIMjgwek02NCAxMTJjLTguOCAwLTE2IDcuMi0xNiAxNlY0NDhjMCA4LjggNy4yIDE2IDE2IDE2SDMyMGM4LjggMCAxNi03LjIgMTYtMTZWMTI4YzAtOC44LTcuMi0xNi0xNi0xNkgzMDR2MjRjMCAxMy4zLTEwLjcgMjQtMjQgMjRIMTkyIDEwNGMtMTMuMyAwLTI0LTEwLjctMjQtMjRWMTEySDY0em0xMjgtOGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6IiwKICAgICAgfSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKGNvcHlJbWFnZVRvQ2xpcGJvYXJkLCAoKSA9PiB7CiAgICAgICAgcG9wb3V0X2NvbnRhaW5lcigpOwogICAgICB9KSwKICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICJEb3dubG9hZCBJbWFnZSIsCiAgICAgIGljb246IFBsb3RseS5JY29ucy5jYW1lcmEsCiAgICAgIGRpcmVjdGlvbjogInVwIiwKICAgICAgY2xpY2s6IER1YWxDbGljayhzYXZlSW1hZ2VUb0ZpbGUsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKHsgY2w6ICJmaWxlc2F2ZSIgfSk7CiAgICAgIH0pLAogICAgfSwKICBdCik7CgpmdW5jdGlvbiBnZXRPZmZzZXREYXRhKGVsKSB7CiAgbGV0IGNzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwsIG51bGwpOwogIGNvbnN0IG9kYXRhID0gewogICAgcGFkZGluZzogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdMZWZ0KSwKICAgICAgcmlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1JpZ2h0KSwKICAgICAgdG9wOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdUb3ApLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MucGFkZGluZ0JvdHRvbSksCiAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdMZWZ0KSArIHBhcnNlRmxvYXQoY3MucGFkZGluZ1JpZ2h0KSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdUb3ApICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgIH0sCiAgICBib3JkZXI6IHsKICAgICAgbGVmdDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgdG9wOiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSwKICAgICAgYm90dG9tOiBwYXJzZUZsb2F0KGNzLmJvcmRlckJvdHRvbVdpZHRoKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MuYm9yZGVyTGVmdFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyUmlnaHRXaWR0aCksCiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChjcy5ib3JkZXJUb3BXaWR0aCkgKyBwYXJzZUZsb2F0KGNzLmJvcmRlckJvdHRvbVdpZHRoKSwKICAgIH0KICB9OwogIGlmIChlbCA9PT0gUExPVCkgewogICAgLy8gRm9yIHRoZSBQTE9UIHdlIGFsc28gd2FudCB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgb2Zmc2V0CiAgICBvZGF0YS5vZmZzZXQgPSB7CiAgICAgIHRvcDogUExPVC5vZmZzZXRQYXJlbnQgPT0gQ09OVEFJTkVSID8gUExPVC5vZmZzZXRUb3AgOiAwLAogICAgICBsZWZ0OiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldExlZnQgOiAwLAogICAgfQogIH0KICByZXR1cm4gb2RhdGE7Cn0KZnVuY3Rpb24gZ2V0U2l6ZURhdGEoKSB7CiAgY29uc3QgZGF0YSA9IHsKICAgIHBsb3RfcGFkOiBnZXRPZmZzZXREYXRhKFBMT1QpLAogICAgcGxvdF9yZWN0OiBQTE9ULmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogICAgY29udGFpbmVyX3BhZDogZ2V0T2Zmc2V0RGF0YShDT05UQUlORVIpLAogICAgY29udGFpbmVyX3JlY3Q6IENPTlRBSU5FUi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICB9OwogIHJldHVybiBkYXRhOwp9CmZ1bmN0aW9uIGNvbXB1dGVDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICBjb25zdCBjb21wdXRlZF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICBjb25zdCBvZmZzZXRzID0gY29tcHV0ZWRfc2l6ZS5vZmZzZXRzOwoKICBjb25zdCBwbG90X2RhdGEgPSB7CiAgICB3aWR0aDogd2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCwKICAgIGhlaWdodDogaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH07CgogIHJldHVybiB7CiAgICB3aWR0aDogKHdpZHRoID8/IGNvbXB1dGVkX3NpemUud2lkdGgpICsgb2Zmc2V0cy53aWR0aCwKICAgIGhlaWdodDogKGhlaWdodCA/PyBjb21wdXRlZF9zaXplLmhlaWdodCkgKyBvZmZzZXRzLmhlaWdodCwKICAgIG5vQ2hhbmdlOiB3aWR0aCA9PSBjb21wdXRlZF9zaXplLndpZHRoICYmIGhlaWdodCA9PSBjb21wdXRlZF9zaXplLmhlaWdodCwKICB9Cn0KCi8vIFRoaXMgZnVuY3Rpb24gd2lsbCBjaGFuZ2UgdGhlIGNvbnRhaW5lciBzaXplIHNvIHRoYXQgdGhlIHJlc3VsdGluZyBwbG90IHdpbGwgYmUgbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIHNwZWNzCmZ1bmN0aW9uIGNoYW5nZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGlmICghQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIGNvbnNvbGUubG9nKCJUcmllZCB0byBjaGFuZ2UgY29udGFpbmVyIHNpemUgd2hlbiBub3QgcG9wcGVkLCBpZ25vcmluZyIpOwogICAgcmV0dXJuOwogIH0KCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhKTsKCiAgaWYgKGNzei5ub0NoYW5nZSkgewogICAgY29uc29sZS5sb2coIlNpemUgaXMgdGhlIHNhbWUgYXMgY3VycmVudCwgaWdub3JpbmciKTsKICAgIHJldHVybgogIH0KICAvLyBXZSBhcmUgbm93IGdvaW5nIHRvIHNldCBoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBjb250YWluZXIKICBmb3IgKGNvbnN0IGtleSBvZiBbIndpZHRoIiwgImhlaWdodCJdKSB7CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IGNzeltrZXldICsgInB4IjsKICB9Cn0KLy8gV2Ugbm93IGNyZWF0ZSB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIHVwZGF0ZSB0aGUgcGxvdCBiYXNlZCBvbiB0aGUgdmFsdWVzIHNwZWNpZmllZApmdW5jdGlvbiB1cGRhdGVGcm9tSGVhZGVyKCkgewogIGNvbnN0IGhlYWRlcl9kYXRhID0gewogICAgaGVpZ2h0OiBjb25maWdfc3BhbnMuaGVpZ2h0LnVpX3ZhbHVlLAogICAgd2lkdGg6IGNvbmZpZ19zcGFucy53aWR0aC51aV92YWx1ZSwKICB9OwogIGNoYW5nZUNvbnRhaW5lclNpemUoaGVhZGVyX2RhdGEpOwp9Ci8vIFdlIGFzc2lnbiB0aGlzIGZ1bmN0aW9uIHRvIHRoZSBvbmJsdXIgZXZlbnQgb2Ygd2lkdGggYW5kIGhlaWdodAppZiAoZmlyc3RSdW4pIHsKICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGNvbnRhaW5lci51aV9zcGFuLm9uYmx1ciA9IChlKSA9PiB7CiAgICAgIGNvbnRhaW5lci51aV92YWx1ZSA9IGNvbnRhaW5lci51aV9zcGFuLnRleHRDb250ZW50OwogICAgICB1cGRhdGVGcm9tSGVhZGVyKCk7CiAgICB9OwogIH0KfQovLyBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBwbG90IHNpemUgdG8gdXNlIGZvciByZWxheW91dCBhcyBhIGZ1bmN0aW9uIG9mIHRoZSBjb250YWluZXIgc2l6ZQpmdW5jdGlvbiBjb21wdXRlUGxvdFNpemUoZGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICAvLyBSZW1vdmUgUGFkZGluZwogIGNvbnN0IHsgY29udGFpbmVyX3BhZCwgcGxvdF9wYWQsIGNvbnRhaW5lcl9yZWN0IH0gPSBkYXRhOwogIGNvbnN0IG9mZnNldHMgPSB7CiAgICB3aWR0aDoKICAgICAgcGxvdF9wYWQucGFkZGluZy53aWR0aCArCiAgICAgIHBsb3RfcGFkLmJvcmRlci53aWR0aCArCiAgICAgIHBsb3RfcGFkLm9mZnNldC5sZWZ0ICsKICAgICAgY29udGFpbmVyX3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgY29udGFpbmVyX3BhZC5ib3JkZXIud2lkdGgsCiAgICBoZWlnaHQ6CiAgICAgIHBsb3RfcGFkLnBhZGRpbmcuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLmhlaWdodCArCiAgICAgIHBsb3RfcGFkLm9mZnNldC50b3AgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcuaGVpZ2h0ICsKICAgICAgY29udGFpbmVyX3BhZC5ib3JkZXIuaGVpZ2h0LAogIH07CiAgY29uc3Qgc3ogPSB7CiAgICB3aWR0aDogTWF0aC5yb3VuZChjb250YWluZXJfcmVjdC53aWR0aCAtIG9mZnNldHMud2lkdGgpLAogICAgaGVpZ2h0OiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LmhlaWdodCAtIG9mZnNldHMuaGVpZ2h0KSwKICAgIG9mZnNldHMsCiAgfTsKICByZXR1cm4gc3o7Cn0KCi8vIENyZWF0ZSB0aGUgcmVzaXplT2JzZXJ2ZXIgdG8gbWFrZSB0aGUgcGxvdCBldmVuIG1vcmUgcmVzcG9uc2l2ZSEgOm1hZ2ljOgpjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4gewogIGNvbnN0IHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKTsKICBjb25zdCB7Y29udGFpbmVyX3JlY3QsIGNvbnRhaW5lcl9wYWR9ID0gc2l6ZURhdGE7CiAgbGV0IHBsb3Rfc2l6ZSA9IGNvbXB1dGVQbG90U2l6ZShzaXplRGF0YSk7CiAgLy8gV2Ugc2F2ZSB0aGUgaGVpZ2h0IGluIHRoZSBQTE9UIG9iamVjdAogIFBMT1QuY29udGFpbmVyX2hlaWdodCA9IGNvbnRhaW5lcl9yZWN0LmhlaWdodDsKICAvLyBXZSBkZWFsIHdpdGggc29tZSBzdHVmZiBpZiB0aGUgY29udGFpbmVyIGlzIHBvcHBwZWQKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLndpZHRoID0gY29udGFpbmVyX3JlY3Qud2lkdGggKyAicHgiOwogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9IGNvbnRhaW5lcl9yZWN0LmxlZnQgKyAicHgiOwogIGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUgPSBwbG90X3NpemUuaGVpZ2h0OwogIGNvbmZpZ19zcGFucy53aWR0aC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS53aWR0aDsKICAvKiAKCQlUaGUgYWRkaXRpb24gb2YgdGhlIGludmFsaWQgYXJndW1lbnQgYHBsdXRvcmVzaXplYCBzZWVtcyB0byBmaXggdGhlIHByb2JsZW0gd2l0aCBjYWxsaW5nIGByZWxheW91dGAgc2ltcGx5IHdpdGggYHthdXRvc2l6ZTogdHJ1ZX1gIGFzIHVwZGF0ZSBicmVha2luZyBtb3VzZSByZWxheW91dCBldmVudHMgdHJhY2tpbmcuIAoJCVNlZSBodHRwczovL2dpdGh1Yi5jb20vcGxvdGx5L3Bsb3RseS5qcy9pc3N1ZXMvNjE1NiBmb3IgZGV0YWlscwoJCSovCiAgbGV0IGNvbmZpZyA9IHsKICAgIC8vIElmIHRoaXMgaXMgcG9wcGVkIG91dCwgd2UgaWdub3JlIHRoZSBvcmlnaW5hbCB3aWR0aC9oZWlnaHQKICAgIHdpZHRoOiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyB1bmRlZmluZWQgOiBvcmlnaW5hbF93aWR0aCkgPz8gcGxvdF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyB1bmRlZmluZWQgOiBvcmlnaW5hbF9oZWlnaHQpID8/IHBsb3Rfc2l6ZS5oZWlnaHQsCiAgICBwbHV0b3Jlc2l6ZTogdHJ1ZSwKICB9OwogIFBsb3RseS5yZWxheW91dChQTE9ULCBjb25maWcpLnRoZW4oKCkgPT4gewogICAgaWYgKHJlbW92ZV9jb250YWluZXJfc2l6ZSAmJiAhQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgdGhlIGZpcnN0IHJlc2l6ZSB1cG9uIHBsb3QgY3JlYXRpb24gdG8gYWxyZWFkeSBiZSB3aXRob3V0IGEgZml4ZWQgaGVpZ2h0CiAgICAgIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSAiIjsKICAgICAgQ09OVEFJTkVSLnN0eWxlLndpZHRoID0gIiI7CiAgICAgIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IGZhbHNlOwogICAgfQogIH0pOwp9KTsKCnJlc2l6ZU9ic2VydmVyLm9ic2VydmUoQ09OVEFJTkVSKTsKCgpQbG90bHkucmVhY3QoUExPVCwgcGxvdF9vYmopLnRoZW4oKCkgPT4gewoJLy8gQXNzaWduIHRoZSBQbG90bHkgZXZlbnQgbGlzdGVuZXJzCglmb3IgKGNvbnN0IFtrZXksIGxpc3RlbmVyX3ZlY10gb2YgT2JqZWN0LmVudHJpZXMocGxvdGx5X2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULm9uKGtleSwgbGlzdGVuZXIpCgkJfQoJfQoJLy8gQXNzaWduIHRoZSBKUyBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhqc19saXN0ZW5lcnMpKSB7CgkJZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcl92ZWMpIHsKCQkJUExPVC5hZGRFdmVudExpc3RlbmVyKGtleSwgbGlzdGVuZXIsIHsKCQkJCXNpZ25hbDogY29udHJvbGxlci5zaWduYWwKCQkJfSkKCQl9Cgl9Cn0KKQoKCmludmFsaWRhdGlvbi50aGVuKCgpID0+IHsKCS8vIFJlbW92ZSBhbGwgcGxvdGx5IGxpc3RlbmVycwoJUExPVC5yZW1vdmVBbGxMaXN0ZW5lcnMoKQoJLy8gUmVtb3ZlIGFsbCBKUyBsaXN0ZW5lcnMKCWNvbnRyb2xsZXIuYWJvcnQoKQoJLy8gUmVtb3ZlIHRoZSByZXNpemVPYnNlcnZlcgoJcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpCn0pCgoKCgkJcmV0dXJuIENPTlRBSU5FUgoJPC9zY3JpcHQ+CqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWWxcmVjb25fdDJfc3Rhcl9ncmWybGFzdF9ydW5fdGltZXN0YW1wy0HZv6MU86jasHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQ0YTRhNmJkMy1iODIwLTQ3OWMtODllMy1mM2NlNzlhMzE2ZGK5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4ANV2qtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5HZNWIzYjg0MDhjLTgxODEtMTFlZi0xNGViLWUxYzU2OWI4YmIyOS9iODZjNTY4MjVjZWUyMDU3uGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDI3ZTY1NjgwLTIyYTAtNDA3OS1iNmRmLWQ2MGEzMjE4ZTUyZYqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnZSFNlcXVlbmNlWyDPhCA9IDMxLjE3NCBtcyB8IGJsb2NrczogNCB8IEFEQzogMSB8IEdSOiAyIHwgUkY6IDIgfCBERUY6IDAgXaRtaW1lqnRleHQvcGxhaW6scm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/oxUHIuqwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJDI3ZTY1NjgwLTIyYTAtNDA3OS1iNmRmLWQ2MGEzMjE4ZTUyZblkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgDYeje1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQwZjk2YTgzZC05NmVmLTQ3NjgtOTMzMC04N2M0NjZlMzVjOTOKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52V88Ym9uZCBkZWY9IkF4IiB1bmlxdWVfaWQ9Ilc1aXBNTjZYTUVycyI+PGlucHV0IHR5cGU9J3JhbmdlJyBtaW49JzEnIG1heD0nMjAnIHZhbHVlPScxMSc+PC9ib25kPqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b+jE1mWjbBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkMGY5NmE4M2QtOTZlZi00NzY4LTkzMzAtODdjNDY2ZTM1YzkzuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOFr3+MbVwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDVkZjk3ODc0LWYwOWMtNDE3My1hMmY2LTg5M2RiMzIyY2NhZoqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnZRzxkaXYgY2xhc3M9Im1hcmtkb3duIj48aDE+VW5kZXJzdGFuZGluZyBiYXNpYyBNUkkgc2VxdWVuY2VzPC9oMT4KPC9kaXY+pG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv6Lwfj0dsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQ1ZGY5Nzg3NC1mMDljLTQxNzMtYTJmNi04OTNkYjMyMmNjYWa5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4AAwJhtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkZTRlZjUxNDUtYTYzYy00ZjkxLWFjMDQtM2I1YmYxNmMwODQyiqZxdWV1ZWTCpGxvZ3OSiKRsaW5l/6Ntc2eS2S5SdW5uaW5nIHNpbXVsYXRpb24gaW4gdGhlIENQVSB3aXRoIDIgdGhyZWFkKHMpqnRleHQvcGxhaW6nY2VsbF9pZNkkZTRlZjUxNDUtYTYzYy00ZjkxLWFjMDQtM2I1YmYxNmMwODQypmt3YXJnc5WSrGtvbWFfdmVyc2lvbpKodiIwLjguMyKqdGV4dC9wbGFpbpKqc2ltX21ldGhvZJKFpnByZWZpeLFLb21hTVJJQ29yZS5CbG9jaKhlbGVtZW50c5CkdHlwZaZzdHJ1Y3SscHJlZml4X3Nob3J0pUJsb2NoqG9iamVjdGlksGZmZmZmZmZmMmRkZTk5MmPZIWFwcGxpY2F0aW9uL3ZuZC5wbHV0by50cmVlK29iamVjdJKlc3BpbnOSozQwMKp0ZXh0L3BsYWlukqt0aW1lX3BvaW50c5KjMTQ5qnRleHQvcGxhaW6SqmFkY19wb2ludHOSozEwMKp0ZXh0L3BsYWluomlktEtvbWFNUklDb3JlXzZiZmQ4OWVhpGZpbGXZTi9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvS29tYU1SSUNvcmUvd1Bnczcvc3JjL3NpbXVsYXRpb24vU2ltdWxhdG9yQ29yZS5qbKVncm91cK1TaW11bGF0b3JDb3JlpWxldmVspEluZm+IpGxpbmX/o21zZ5LZTiAgMC4wMjM0NjIgc2Vjb25kcyAoMjAuODEgayBhbGxvY2F0aW9uczogNC42MjMgTWlCLCAxNzIuMDUlIGNvbXBpbGF0aW9uIHRpbWUpCqp0ZXh0L3BsYWlup2NlbGxfaWTZJGU0ZWY1MTQ1LWE2M2MtNGY5MS1hYzA0LTNiNWJmMTZjMDg0MqZrd2FyZ3OQomlktFBsdXRvUnVubmVyX2QxYWNiODFlpGZpbGXZUi9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUGx1dG8vUnZlR0gvc3JjL3J1bm5lci9QbHV0b1J1bm5lci9zcmMvUGx1dG9SdW5uZXIuamylZ3JvdXCrUGx1dG9SdW5uZXKlbGV2ZWyuTG9nTGV2ZWwoLTU1NSmncnVubmluZ8Kmb3V0cHV0hqRib2R52TxSYXdBY3F1aXNpdGlvbkRhdGFbU2VxTmFtZTogTm9OYW1lIHwgMSBQcm9maWxlKHMpIG9mIDEwMMOXMV2kbWltZap0ZXh0L3BsYWlurHJvb3Rhc3NpZ25lZa9yYXdfdDJfc3Rhcl9ncmWybGFzdF9ydW5fdGltZXN0YW1wy0HZv6MUthSDsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SRlNGVmNTE0NS1hNjNjLTRmOTEtYWMwNC0zYjViZjE2YzA4NDK5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4EHn6RtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkN2E2NmFiNDctOTE4Zi00NTgyLTg5NWYtMWI0NjkwNTYyMDUxiqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedpqiQk8c2NyaXB0IGlkPSdwbG90XzEnPgoJCS8vIFdlIHN0YXJ0IGJ5IHB1dHRpbmcgYWxsIHRoZSB2YXJpYWJsZSBpbnRlcnBvbGF0aW9uIGhlcmUgYXQgdGhlIGJlZ2lubmluZwoJCS8vIFdlIGhhdmUgdG8gY29udmVydCBhbGwgdHlwZWRhcnJheXMgaW4gdGhlIGxheW91dCB0byBub3JtYWwgYXJyYXlzLiBTZWUgSXNzdWUgIzI1CgkJLy8gV2UgdXNlIGxvZGFzaCBmb3IgdGhpcyBmb3IgY29tcGFjdG5lc3MKCQlmdW5jdGlvbiByZW1vdmVUeXBlZEFycmF5KG8pIHsKCQkJcmV0dXJuIF8uaXNUeXBlZEFycmF5KG8pID8gQXJyYXkuZnJvbShvKSA6CgkJCV8uaXNQbGFpbk9iamVjdChvKSA/IF8ubWFwVmFsdWVzKG8sIHJlbW92ZVR5cGVkQXJyYXkpIDogCgkJCW8KCQl9CgoJCS8vIFB1Ymxpc2ggdGhlIHBsb3Qgb2JqZWN0IHRvIEpTCgkJbGV0IHBsb3Rfb2JqID0gXy51cGRhdGUoLyogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBBYnN0cmFjdFBsdXRvRGluZ2V0amVzLkRpc3BsYXkucHVibGlzaGVkX3RvX2pzICovIGdldFB1Ymxpc2hlZE9iamVjdCgiYjNiODQwOGMtODE4MS0xMWVmLTE0ZWItZTFjNTY5YjhiYjI5LzZkNTkyMzIxOGIzNDdhYjAiKSwgImxheW91dCIsIHJlbW92ZVR5cGVkQXJyYXkpCgkJLy8gR2V0IHRoZSBwbG90bHkgbGlzdGVuZXJzCgkJY29uc3QgcGxvdGx5X2xpc3RlbmVycyA9IHt9CgkJLy8gR2V0IHRoZSBKUyBsaXN0ZW5lcnMKCQljb25zdCBqc19saXN0ZW5lcnMgPSB7fQoJCS8vIERlYWwgd2l0aCBldmVudHVhbCBjdXN0b20gY2xhc3NlcwoJCWxldCBjdXN0b21fY2xhc3NsaXN0ID0gW10KCgoJCS8vIExvYWQgdGhlIHBsb3RseSBsaWJyYXJ5CgkJbGV0IFBsb3RseSA9IHVuZGVmaW5lZAoJCXRyeSB7CgkJCWxldCBfbW9kID0gYXdhaXQgaW1wb3J0KCIuL3Bsb3RseWpzL3Bsb3RseWpzLTIuMjYuMi5taW4uanMiKQoJCQlQbG90bHkgPSBfbW9kLmRlZmF1bHQKCQl9IGNhdGNoIChlKSB7CgkJCWNvbnNvbGUubG9nKCJMb2NhbCBsb2FkIGZhaWxlZCwgdHJ5aW5nIHdpdGggdGhlIHdlYiBlc20uc2ggdmVyc2lvbiIpCgkJCWxldCBfbW9kID0gYXdhaXQgaW1wb3J0KCJodHRwczovL2VzbS5zaC92MTM1L3Bsb3RseS5qcy1kaXN0LW1pbkAyLjI2LjIvZXNuZXh0L3Bsb3RseS5qcy1kaXN0LW1pbi5tanMiKQoJCQlQbG90bHkgPSBfbW9kLmRlZmF1bHQKCQl9CgoJCS8vIENoZWNrIGlmIHdlIGhhdmUgdG8gZm9yY2UgbG9jYWwgbWF0aGpheCBmb250IGNhY2hlCgkJaWYgKGZhbHNlICYmIHdpbmRvdz8uTWF0aEpheD8uY29uZmlnPy5zdmc/LmZvbnRDYWNoZSA9PT0gJ2dsb2JhbCcpIHsKCQkJd2luZG93Lk1hdGhKYXguY29uZmlnLnN2Zy5mb250Q2FjaGUgPSAnbG9jYWwnCgkJfQoKCQkvLyBGbGFnIHRvIGNoZWNrIGlmIHRoaXMgY2VsbCB3YXMgIG1hbnVhbGx5IHJhbiBvciByZWFjdGl2ZWx5IHJhbgpjb25zdCBmaXJzdFJ1biA9IHRoaXMgPyBmYWxzZSA6IHRydWUKY29uc3QgQ09OVEFJTkVSID0gdGhpcyA/PyBodG1sYDxkaXYgY2xhc3M9J3BsdXRvcGxvdGx5LWNvbnRhaW5lcic+YApjb25zdCBQTE9UID0gQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoJy5qcy1wbG90bHktcGxvdCcpID8/IENPTlRBSU5FUi5hcHBlbmRDaGlsZChodG1sYDxkaXY+YCkKY29uc3QgcGFyZW50ID0gQ09OVEFJTkVSLnBhcmVudEVsZW1lbnQKLy8gV2UgdXNlIGEgY29udHJvbGxlciB0byByZW1vdmUgZXZlbnQgbGlzdGVuZXJzIHVwb24gaW52YWxpZGF0aW9uCmNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCkKLy8gV2UgaGF2ZSB0byBhZGQgdGhpcyB0byBrZWVwIHN1cHBvcnRpbmcgQGJpbmQgd2l0aCB0aGUgb2xkIEFQSSB1c2luZyBQTE9UClBMT1QuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoZSkgPT4gewoJQ09OVEFJTkVSLnZhbHVlID0gUExPVC52YWx1ZQoJaWYgKGUuYnViYmxlcykgewoJCXJldHVybgoJfQoJQ09OVEFJTkVSLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdpbnB1dCcpKQp9LCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSkKCgkvLyBUaGlzIGNyZWF0ZSB0aGUgc3R5bGUgc3ViZGl2IG9uIGZpcnN0IHJ1bgoJZmlyc3RSdW4gJiYgQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgCgk8c3R5bGU+CgkucGx1dG9wbG90bHktY29udGFpbmVyIHsKCQl3aWR0aDogMTAwJTsKCQloZWlnaHQ6IDEwMCU7CgkJbWluLWhlaWdodDogMDsKCQltaW4td2lkdGg6IDA7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyIC5qcy1wbG90bHktcGxvdCAucGxvdGx5IGRpdiB7CgkJbWFyZ2luOiAwIGF1dG87IC8vIFRoaXMgY2VudGVycyB0aGUgcGxvdAoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5wb3BwZWQtb3V0IHsKCQlvdmVyZmxvdzogYXV0bzsKCQl6LWluZGV4OiAxMDAwOwoJCXBvc2l0aW9uOiBmaXhlZDsKCQlyZXNpemU6IGJvdGg7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwcHg7CgkJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDBweDsKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIHsKCQlkaXNwbGF5OiBmbGV4OwoJCWZsZXgtZmxvdzogcm93IHdyYXA7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMTJweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMTJweDsKCQlwb3NpdGlvbjogZml4ZWQ7CgkJei1pbmRleDogMTAwMTsKCQljdXJzb3I6IG1vdmU7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCAtMTAwJSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgc3BhbiB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCWZsZXg6IDEKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyLmhpZGRlbiB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3BhbiB7CgkJcG9zaXRpb246IHJlbGF0aXZlOwoJfQoJLmNsaXBib2FyZC12YWx1ZSB7CgkJcGFkZGluZy1yaWdodDogNXB4OwoJCXBhZGRpbmctbGVmdDogMnB4OwoJCWN1cnNvcjogdGV4dDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZmlsZW5hbWUgewoJCWZsZXg6IDAgMCAxMDAlOwoJCXRleHQtYWxpZ246IGNlbnRlcjsKCQlib3JkZXItdG9wOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJbWFyZ2luLXRvcDogNXB4OwoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5maWxlbmFtZSB7CgkJbWFyZ2luLWxlZnQ6IDNweDsKCQl0ZXh0LWFsaWduOiBsZWZ0OwoJCW1pbi13aWR0aDogbWluKDYwJSwgbWluLWNvbnRlbnQpOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5maWxlc2F2ZSAuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgLmxhYmVsIHsKCQlmbGV4OiAwIDAgMDsKCX0KCS5jbGlwYm9hcmQtdmFsdWUuZm9ybWF0IHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7CgkJZmxleDogMSAwIGF1dG87CgkJbWluLXdpZHRoOiAzMHB4OwoJCW1hcmdpbi1yaWdodDogMTBweDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyB7CgkJZGlzcGxheTogaW5saW5lLWZsZXg7CgkJZmxleC1mbG93OiBjb2x1bW47CgkJcG9zaXRpb246IGFic29sdXRlOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJcGFkZGluZy1sZWZ0OiAzcHg7CgkJei1pbmRleDogMjAwMDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9uczpob3ZlciB7CgkJY3Vyc29yOiBwb2ludGVyOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCXBhZGRpbmc6IDNweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtM3B4LCAtNnB4KTsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyAuZm9ybWF0LW9wdGlvbiB7CgkJZGlzcGxheTogbm9uZTsKCX0KCWRpdi5mb3JtYXQtb3B0aW9uczpob3ZlciAuZm9ybWF0LW9wdGlvbiB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246bm90KC5zZWxlY3RlZCkgewoJCW1hcmdpbi10b3A6IDNweDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyAuZm9ybWF0LW9wdGlvbi5zZWxlY3RlZCB7CgkJb3JkZXI6IC0xOwoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5mb3JtYXQtb3B0aW9uOmhvdmVyIHsKCQliYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCX0KCXNwYW4uY29uZmlnLXZhbHVlIHsKCQlmb250LXdlaWdodDogbm9ybWFsOwoJCWNvbG9yOiB2YXIoLS1wbHV0by1vdXRwdXQtY29sb3IpOwoJCWRpc3BsYXk6IG5vbmU7CgkJcG9zaXRpb246IGFic29sdXRlOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCBjYWxjKC0xMDAlIC0gMTBweCkpOwoJCXBhZGRpbmc6IDVweDsKCX0KCS5sYWJlbCB7CgkJdXNlci1zZWxlY3Q6IG5vbmU7Cgl9CgkubGFiZWw6aG92ZXIgc3Bhbi5jb25maWctdmFsdWUgewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQltaW4td2lkdGg6IDE1MHB4OwoJfQoJLmNsaXBib2FyZC1zcGFuLm1hdGNoaW5nLWNvbmZpZyAubGFiZWwgewoJCWNvbG9yOiB2YXIoLS1jbS1tYWNyby1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZGlmZmVyZW50LWNvbmZpZyAubGFiZWwgewoJCWNvbG9yOiB2YXIoLS1jbS10YWctY29sb3IpOwoJCWZvbnQtd2VpZ2h0OiBib2xkOwoJfQo8L3N0eWxlPgpgKQoKbGV0IG9yaWdpbmFsX2hlaWdodCA9IHBsb3Rfb2JqLmxheW91dC5oZWlnaHQKbGV0IG9yaWdpbmFsX3dpZHRoID0gcGxvdF9vYmoubGF5b3V0LndpZHRoCi8vIEZvciB0aGUgaGVpZ2h0IHdlIGhhdmUgdG8gYWxzbyBwdXQgYSBmaXhlZCB2YWx1ZSBpbiBjYXNlIHRoZSBwbG90IGlzIHB1dCBvbiBhIG5vbi1maXhlZC1zaXplIGNvbnRhaW5lciAobGlrZSB0aGUgZGVmYXVsdCB3cmFwcGVyKQovLyBXZSBkZWZpbmUgYSB2YXJpYWJsZSB0byBjaGVjayB3aGV0aGVyIHdlIHN0aWxsIGhhdmUgdG8gcmVtb3ZlIHRoZSBmaXhlZCBoZWlnaHQKbGV0IHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IGZpcnN0UnVuCmxldCBjb250YWluZXJfaGVpZ2h0ID0gb3JpZ2luYWxfaGVpZ2h0ID8/IFBMT1QuY29udGFpbmVyX2hlaWdodCA/PyA0MDAKQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9IGNvbnRhaW5lcl9oZWlnaHQgKyAncHgnCgovLyBXZSBjcmVhdGUgYSBQcm9taXNlIHZlcnNpb24gb2Ygc2V0VGltZW91dApmdW5jdGlvbiBkZWxheShtcykgewogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpOwp9CgovLyBXZSBpbXBvcnQgaW50ZXJhY3QgZm9yIGRyYWdnaW5nL3Jlc2l6aW5nCmNvbnN0IHsgZGVmYXVsdDogaW50ZXJhY3QgfSA9IGF3YWl0IGltcG9ydCgnaHR0cHM6Ly9lc20uc2gvaW50ZXJhY3Rqc0AxLjEwLjE5JykKCgpmdW5jdGlvbiBnZXRJbWFnZU9wdGlvbnMoKSB7CiAgY29uc3QgbyA9IHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICByZXR1cm4gewogICAgZm9ybWF0OiBvLmZvcm1hdCA/PyAicG5nIiwKICAgIHdpZHRoOiBvLndpZHRoID8/IG9yaWdpbmFsX3dpZHRoLAogICAgaGVpZ2h0OiBvLmhlaWdodCA/PyBvcmlnaW5hbF9oZWlnaHQsCiAgICBzY2FsZTogby5zY2FsZSA/PyAxLAogICAgZmlsZW5hbWU6IG8uZmlsZW5hbWUgPz8gIm5ld3Bsb3QiLAogIH07Cn0KCmNvbnN0IENMSVBCT0FSRF9IRUFERVIgPQogIENPTlRBSU5FUi5xdWVyeVNlbGVjdG9yKCIucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciIpID8/CiAgQ09OVEFJTkVSLmluc2VydEFkamFjZW50RWxlbWVudCgKICAgICJhZnRlcmJlZ2luIiwKICAgIGh0bWxgPGRpdiBjbGFzcz0icGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBoaWRkZW4iPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gZm9ybWF0IgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZvcm1hdDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBmb3JtYXQiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gd2lkdGgiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+V2lkdGg6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgd2lkdGgiPjwvc3Bhbj5weDwvc3BhbgogICAgICA+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBoZWlnaHQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+SGVpZ2h0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGhlaWdodCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHNjYWxlIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPlNjYWxlOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIHNjYWxlIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2V0Ij5TZXQ8L2J1dHRvbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gdW5zZXQiPlVuc2V0PC9idXR0b24+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmaWxlbmFtZSIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5GaWxlbmFtZTo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBmaWxlbmFtZSI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICA8L2Rpdj5gCiAgKTsKCmZ1bmN0aW9uIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpIHsKICBjb25zdCB2YWxpZF9jbGFzc2VzID0gWwogICAgIm1pc3NpbmctY29uZmlnIiwKICAgICJtYXRjaGluZy1jb25maWciLAogICAgImRpZmZlcmVudC1jb25maWciLAogIF07CiAgZnVuY3Rpb24gc2V0Q2xhc3MoY2wpIHsKICAgIGZvciAoY29uc3QgbmFtZSBvZiB2YWxpZF9jbGFzc2VzKSB7CiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKG5hbWUsIG5hbWUgPT0gY2wpOwogICAgfQogIH0KICAvLyBXZSB1c2UgdGhlIGN1c3RvbSBnZXR0ZXJzIHdlJ2xsIHNldCB1cCBpbiB0aGUgY29udGFpbmVyCiAgY29uc3QgeyB1aV92YWx1ZSwgY29uZmlnX3ZhbHVlLCBjb25maWdfc3Bhbiwga2V5IH0gPSBjb250YWluZXI7CiAgaWYgKGNvbmZpZ192YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICBzZXRDbGFzcygibWlzc2luZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaXMgbm90IHByZXNlbnQgaW4gdGhlIGNvbmZpZy5gOwogIH0gZWxzZSBpZiAodWlfdmFsdWUgPT0gY29uZmlnX3ZhbHVlKSB7CiAgICBzZXRDbGFzcygibWF0Y2hpbmctY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGhhcyB0aGUgc2FtZSB2YWx1ZSBpbiB0aGUgY29uZmlnIGFuZCBpbiB0aGUgaGVhZGVyLmA7CiAgfSBlbHNlIHsKICAgIHNldENsYXNzKCJkaWZmZXJlbnQtY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGhhcyBhIGRpZmZlcmVudCB2YWx1ZSAoPGVtPiR7Y29uZmlnX3ZhbHVlfTwvZW0+KSBpbiB0aGUgY29uZmlnLmA7CiAgfQogIC8vIEFkZCBpbmZvIGFib3V0IHNldHRpbmcgYW5kIHVuc2V0dGluZwogIGNvbmZpZ19zcGFuLmluc2VydEFkamFjZW50SFRNTCgKICAgICJiZWZvcmVlbmQiLAogICAgYDxicj5DbGljayBvbiB0aGUgbGFiZWwgPGVtPjxiPm9uY2U8L2I+PC9lbT4gdG8gc2V0IHRoZSBjdXJyZW50IFVJIHZhbHVlIGluIHRoZSBjb25maWcuYAogICk7CiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIDxlbT48Yj50d2ljZTwvYj48L2VtPiB0byByZW1vdmUgdGhpcyBrZXkgZnJvbSB0aGUgY29uZmlnLmAKICApOwp9Cgpjb25zdCB2YWxpZF9mb3JtYXRzID0gWyJwbmciLCAic3ZnIiwgIndlYnAiLCAianBlZyIsICJmdWxsLWpzb24iXTsKZnVuY3Rpb24gaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHNwYW4sIGtleSwgdmFsdWUpIHsKICBjb25zdCBjb250YWluZXIgPSBzcGFuLmNsb3Nlc3QoIi5jbGlwYm9hcmQtc3BhbiIpOwogIHNwYW4uY29udGVudEVkaXRhYmxlID0ga2V5ID09PSAiZm9ybWF0IiA/ICJmYWxzZSIgOiAidHJ1ZSI7CiAgbGV0IHBhcnNlID0gKHgpID0+IHg7CiAgbGV0IHVwZGF0ZSA9ICh4KSA9PiAoc3Bhbi50ZXh0Q29udGVudCA9IHgpOwogIGlmIChrZXkgPT09ICJ3aWR0aCIgfHwga2V5ID09PSAiaGVpZ2h0IikgewogICAgcGFyc2UgPSAoeCkgPT4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KHgpKTsKICB9IGVsc2UgaWYgKGtleSA9PT0gInNjYWxlIikgewogICAgcGFyc2UgPSBwYXJzZUZsb2F0OwogIH0gZWxzZSBpZiAoa2V5ID09PSAiZm9ybWF0IikgewogICAgLy8gV2UgcmVtb3ZlIGNvbnRlbnRFZGl0YWJsZQogICAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSAiZmFsc2UiOwogICAgLy8gSGVyZSB3ZSBmaXJzdCBhZGQgdGhlIHN1YnNwYW5zIGZvciBlYWNoIG9wdGlvbgogICAgY29uc3Qgb3B0c19kaXYgPSBzcGFuLmFwcGVuZENoaWxkKGh0bWxgPGRpdiBjbGFzcz0iZm9ybWF0LW9wdGlvbnMiPjwvZGl2PmApOwogICAgZm9yIChjb25zdCBmbXQgb2YgdmFsaWRfZm9ybWF0cykgewogICAgICBjb25zdCBvcHQgPSBvcHRzX2Rpdi5hcHBlbmRDaGlsZCgKICAgICAgICBodG1sYDxzcGFuIGNsYXNzPSJmb3JtYXQtb3B0aW9uICR7Zm10fSI+JHtmbXR9PC9zcGFuPmAKICAgICAgKTsKICAgICAgb3B0Lm9uY2xpY2sgPSAoZSkgPT4gewogICAgICAgIHNwYW4udmFsdWUgPSBvcHQudGV4dENvbnRlbnQ7CiAgICAgIH07CiAgICB9CiAgICBwYXJzZSA9ICh4KSA9PiB7CiAgICAgIHJldHVybiB2YWxpZF9mb3JtYXRzLmluY2x1ZGVzKHgpID8geCA6IGxvY2FsVmFsdWU7CiAgICB9OwogICAgdXBkYXRlID0gKHgpID0+IHsKICAgICAgZm9yIChjb25zdCBvcHQgb2Ygb3B0c19kaXYuY2hpbGRyZW4pIHsKICAgICAgICBvcHQuY2xhc3NMaXN0LnRvZ2dsZSgic2VsZWN0ZWQiLCBvcHQudGV4dENvbnRlbnQgPT09IHgpOwogICAgICB9CiAgICB9OwogIH0gZWxzZSB7CiAgICAvLyBXZSBvbmx5IGhhdmUgZmlsZW5hbWUgaGVyZQogIH0KICBsZXQgbG9jYWxWYWx1ZTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBsb2NhbFZhbHVlOwogICAgfSwKICAgIHNldDogKHZhbCkgPT4gewogICAgICBpZiAodmFsICE9PSAiIikgewogICAgICAgIGxvY2FsVmFsdWUgPSBwYXJzZSh2YWwpOwogICAgICB9CiAgICAgIHVwZGF0ZShsb2NhbFZhbHVlKTsKICAgICAgY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcik7CiAgICB9LAogIH0pOwogIC8vIFdlIGFsc28gYXNzaWduIGEgbGlzdGVuZXIgc28gdGhhdCB0aGUgZWRpdGFibGUgaXMgYmx1cnJlZCB3aGVuIGVudGVyIGlzIHByZXNzZWQKICBzcGFuLm9ua2V5ZG93biA9IChlKSA9PiB7CiAgICBpZiAoZS5rZXlDb2RlID09PSAxMykgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHNwYW4uYmx1cigpOwogICAgfQogIH07CiAgc3Bhbi52YWx1ZSA9IHZhbHVlOwp9CgpmdW5jdGlvbiBpbml0aWFsaXplQ29uZmlnVmFsdWVTcGFuKHNwYW4sIGtleSkgewogIC8vIEhlcmUgd2UgbW9zdGx5IHdhbnQgdG8gZGVmaW5lIHRoZSBzZXR0ZXIgYW5kIGdldHRlcgogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwYW4sICJ2YWx1ZSIsIHsKICAgIGdldDogKCkgPT4gewogICAgICByZXR1cm4gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV07CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIC8vIGlmIHVuZGVmaW5lZCBpcyBwYXNzZWQsIHdlIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgb3B0aW9ucwogICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsKICAgICAgICBkZWxldGUgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV0gPSB2YWw7CiAgICAgIH0KICAgICAgY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcik7CiAgICB9LAogIH0pOwp9Cgpjb25zdCBjb25maWdfc3BhbnMgPSB7fTsKZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZ2V0SW1hZ2VPcHRpb25zKCkpKSB7CiAgY29uc3QgY29udGFpbmVyID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKGAuY2xpcGJvYXJkLXNwYW4uJHtrZXl9YCk7CiAgY29uc3QgbGFiZWwgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmxhYmVsIik7CiAgLy8gV2UgZ2l2ZSB0aGUgbGFiZWwgYSBmdW5jdGlvbiB0aGF0IG9uIHNpbmdsZSBjbGljayB3aWxsIHNldCB0aGUgY3VycmVudCB2YWx1ZSBhbmQgd2l0aCBkb3VibGUgY2xpY2sgd2lsbCB1bnNldCBpdAogIGxhYmVsLm9uY2xpY2sgPSBEdWFsQ2xpY2soCiAgICAoKSA9PiB7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBjb250YWluZXIudWlfdmFsdWU7CiAgICB9LAogICAgKGUpID0+IHsKICAgICAgY29uc29sZS5sb2coImUiLCBlKTsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gdW5kZWZpbmVkOwogICAgfQogICk7CiAgY29uc3QgdWlfdmFsdWVfc3BhbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXZhbHVlIik7CiAgY29uc3QgY29uZmlnX3ZhbHVlX3NwYW4gPQogICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jb25maWctdmFsdWUiKSA/PwogICAgbGFiZWwuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgICAiYWZ0ZXJiZWdpbiIsCiAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImNvbmZpZy12YWx1ZSI+PC9zcGFuPmAKICAgICk7CiAgLy8gQXNzaW5nIHRoZSB0d28gc3BhbnMgYXMgcHJvcGVydGllcyBvZiB0aGUgY29udGFpbmluZyBzcGFuCiAgY29udGFpbmVyLnVpX3NwYW4gPSB1aV92YWx1ZV9zcGFuOwogIGNvbnRhaW5lci5jb25maWdfc3BhbiA9IGNvbmZpZ192YWx1ZV9zcGFuOwogIGNvbnRhaW5lci5rZXkgPSBrZXk7CiAgY29uZmlnX3NwYW5zW2tleV0gPSBjb250YWluZXI7CiAgaWYgKGZpcnN0UnVuKSB7CiAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPQogICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPz8ge307CiAgICAvLyBXZSBkbyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHZhbHVlIHNwYW4KICAgIGluaXRpYWxpemVVSVZhbHVlU3Bhbih1aV92YWx1ZV9zcGFuLCBrZXksIHZhbHVlKTsKICAgIC8vIFRoZW4gd2UgaW5pdGlhbGl6ZSB0aGUgY29uZmlnIHZhbHVlCiAgICBpbml0aWFsaXplQ29uZmlnVmFsdWVTcGFuKGNvbmZpZ192YWx1ZV9zcGFuLCBrZXkpOwogICAgLy8gV2UgcHV0IHNvbWUgY29udmVuaWVuY2UgZ2V0dGVycy9zZXR0ZXJzCiAgICAvLyB1aV92YWx1ZSBmb3J3YXJkCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAidWlfdmFsdWUiLCB7CiAgICAgIGdldDogKCkgPT4gdWlfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgdWlfdmFsdWVfc3Bhbi52YWx1ZSA9IHZhbDsKICAgICAgfSwKICAgIH0pOwogICAgLy8gY29uZmlnX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJjb25maWdfdmFsdWUiLCB7CiAgICAgIGdldDogKCkgPT4gY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUsCiAgICAgIHNldDogKHZhbCkgPT4gewogICAgICAgIGNvbmZpZ192YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgfQp9CgovLyBUaGVzZSBvYmplY3RzIHdpbGwgY29udGFpbiB0aGUgZGVmYXVsdCB2YWx1ZQoKLy8gVGhpcyBjb2RlIHVwZGF0ZXMgdGhlIGltYWdlIG9wdGlvbnMgaW4gdGhlIFBMT1QgY29uZmlnIHdpdGggdGhlIHByb3ZpZGVkIG9uZXMKZnVuY3Rpb24gc2V0SW1hZ2VPcHRpb25zKG8pIHsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IG9ba2V5XTsKICB9Cn0KZnVuY3Rpb24gdW5zZXRJbWFnZU9wdGlvbnMoKSB7CiAgc2V0SW1hZ2VPcHRpb25zKHt9KTsKfQoKY29uc3Qgc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnNldCIpOwpjb25zdCB1bnNldF9idXR0b24gPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtc3Bhbi51bnNldCIpOwppZiAoZmlyc3RSdW4pIHsKICBzZXRfYnV0dG9uLm9uY2xpY2sgPSAoZSkgPT4gewogICAgZm9yIChjb25zdCBjb250YWluZXIgb2YgT2JqZWN0LnZhbHVlcyhjb25maWdfc3BhbnMpKSB7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBjb250YWluZXIudWlfdmFsdWU7CiAgICB9CiAgfTsKICB1bnNldF9idXR0b24ub25jbGljayA9IHVuc2V0SW1hZ2VPcHRpb25zOwp9CgovLyBXZSBhZGQgYSBmdW5jdGlvbiB0byBjaGVjayBpZiB0aGUgY2xpcGJvYXJkIGlzIHBvcHBlZCBvdXQKQ09OVEFJTkVSLmlzUG9wcGVkT3V0ID0gKCkgPT4gewogIHJldHVybiBDT05UQUlORVIuY2xhc3NMaXN0LmNvbnRhaW5zKCJwb3BwZWQtb3V0Iik7Cn07CgpDTElQQk9BUkRfSEVBREVSLm9ubW91c2Vkb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgaWYgKGV2ZW50LnRhcmdldC5tYXRjaGVzKCJzcGFuLmNsaXBib2FyZC12YWx1ZSIpKSB7CiAgICBjb25zb2xlLmxvZygiV2UgZG9uJ3QgbW92ZSEiKTsKICAgIHJldHVybjsKICB9CiAgY29uc3Qgc3RhcnQgPSB7CiAgICBsZWZ0OiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS5sZWZ0KSwKICAgIHRvcDogcGFyc2VGbG9hdChDT05UQUlORVIuc3R5bGUudG9wKSwKICAgIFg6IGV2ZW50LnBhZ2VYLAogICAgWTogZXZlbnQucGFnZVksCiAgfTsKICBmdW5jdGlvbiBtb3ZlQXQoZXZlbnQsIHN0YXJ0KSB7CiAgICBjb25zdCB0b3AgPSBldmVudC5wYWdlWSAtIHN0YXJ0LlkgKyBzdGFydC50b3AgKyAicHgiOwogICAgY29uc3QgbGVmdCA9IGV2ZW50LnBhZ2VYIC0gc3RhcnQuWCArIHN0YXJ0LmxlZnQgKyAicHgiOwogICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gbGVmdDsKICAgIENPTlRBSU5FUi5zdHlsZS5sZWZ0ID0gbGVmdDsKICAgIENPTlRBSU5FUi5zdHlsZS50b3AgPSB0b3A7CiAgfQoKICAvLyBtb3ZlIG91ciBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYmFsbCB1bmRlciB0aGUgcG9pbnRlcgogIG1vdmVBdChldmVudCwgc3RhcnQpOwogIGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGV2ZW50KSB7CiAgICBtb3ZlQXQoZXZlbnQsIHN0YXJ0KTsKICB9CgogIC8vIFdlIHVzZSB0aGlzIHRvIHJlbW92ZSB0aGUgbW91c2Vtb3ZlIHdoZW4gY2xpY2tpbmcgb3V0c2lkZSBvZiB0aGUgY29udGFpbmVyCiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgLy8gbW92ZSB0aGUgY29udGFpbmVyIG9uIG1vdXNlbW92ZQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIG9uTW91c2VNb3ZlLCB7CiAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLAogIH0pOwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAibW91c2Vkb3duIiwKICAgIChlKSA9PiB7CiAgICAgIGlmIChlLnRhcmdldC5jbG9zZXN0KCIucGx1dG9wbG90bHktY29udGFpbmVyIikgIT09IENPTlRBSU5FUikgewogICAgICAgIGNsZWFuVXAoKTsKICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9LAogICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0KICApOwoKICBmdW5jdGlvbiBjbGVhblVwKCkgewogICAgY29uc29sZS5sb2coImNsZWFuaW5nIHVwIHRoZSBwbG90IG1vdmUgbGlzdGVuZXIiKTsKICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gbnVsbDsKICB9CgogIC8vICgzKSBkcm9wIHRoZSBiYWxsLCByZW1vdmUgdW5uZWVkZWQgaGFuZGxlcnMKICBDTElQQk9BUkRfSEVBREVSLm9ubW91c2V1cCA9IGNsZWFuVXA7Cn07CgpmdW5jdGlvbiBzZW5kVG9DbGlwYm9hcmQoYmxvYikgewogIGlmICghbmF2aWdhdG9yLmNsaXBib2FyZCkgewogICAgYWxlcnQoCiAgICAgICJUaGUgQ2xpcGJvYXJkIEFQSSBkb2VzIG5vdCBzZWVtIHRvIGJlIGF2YWlsYWJsZSwgbWFrZSBzdXJlIHRoZSBQbHV0byBub3RlYm9vayBpcyBiZWluZyB1c2VkIGZyb20gZWl0aGVyIGxvY2FsaG9zdCBvciBhbiBodHRwcyBzb3VyY2UuIgogICAgKTsKICB9CiAgbmF2aWdhdG9yLmNsaXBib2FyZAogICAgLndyaXRlKFsKICAgICAgbmV3IENsaXBib2FyZEl0ZW0oewogICAgICAgIC8vIFRoZSBrZXkgaXMgZGV0ZXJtaW5lZCBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgYmxvYidzIHR5cGUuCiAgICAgICAgW2Jsb2IudHlwZV06IGJsb2IsCiAgICAgIH0pLAogICAgXSkKICAgIC50aGVuKAogICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgY29uc29sZS5sb2coIkFzeW5jOiBDb3B5aW5nIHRvIGNsaXBib2FyZCB3YXMgc3VjY2Vzc2Z1bCEiKTsKICAgICAgfSwKICAgICAgZnVuY3Rpb24gKGVycikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkFzeW5jOiBDb3VsZCBub3QgY29weSB0ZXh0OiAiLCBlcnIpOwogICAgICB9CiAgICApOwp9CgpmdW5jdGlvbiBjb3B5SW1hZ2VUb0NsaXBib2FyZCgpIHsKICAvLyBXZSBleHRyYWN0IHRoZSBpbWFnZSBvcHRpb25zIGZyb20gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMgKGlmIHRoZXkgZXhpc3QpCiAgY29uc3QgY29uZmlnID0ge307CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGxldCB2YWwgPQogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID8/CiAgICAgIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IGNvbnRhaW5lci51aV92YWx1ZSA6IHVuZGVmaW5lZCk7CiAgICAvLyBJZiB3ZSBoYXZlIHVuZGVmaW5lZCB3ZSBkb24ndCBjcmVhdGUgdGhlIGtleS4gV2UgYWxzbyBpZ25vcmUgZm9ybWF0IGJlY2F1c2UgdGhlIGNsaXBib2FyZCBvbmx5IHN1cHBvcnRzIHBuZy4KICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS50b0ltYWdlKFBMT1QsIGNvbmZpZykudGhlbihmdW5jdGlvbiAoZGF0YVVybCkgewogICAgZmV0Y2goZGF0YVVybCkKICAgICAgLnRoZW4oKHJlcykgPT4gcmVzLmJsb2IoKSkKICAgICAgLnRoZW4oKGJsb2IpID0+IHsKICAgICAgICBjb25zdCBwYXN0ZV9yZWNlaXZlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3Bhc3RlLXJlY2VpdmVyLnBsdXRvcGxvdGx5JykKICAgICAgICBpZiAocGFzdGVfcmVjZWl2ZXIpIHsKICAgICAgICAgIHBhc3RlX3JlY2VpdmVyLmF0dGFjaEltYWdlKGRhdGFVcmwsIENPTlRBSU5FUikKICAgICAgICB9CiAgICAgICAgc2VuZFRvQ2xpcGJvYXJkKGJsb2IpCiAgICAgIH0pOwogIH0pOwp9CgpmdW5jdGlvbiBzYXZlSW1hZ2VUb0ZpbGUoKSB7CiAgY29uc3QgY29uZmlnID0ge307CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGxldCB2YWwgPQogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID8/CiAgICAgIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IGNvbnRhaW5lci51aV92YWx1ZSA6IHVuZGVmaW5lZCk7CiAgICAvLyBJZiB3ZSBoYXZlIHVuZGVmaW5lZCB3ZSBkb24ndCBjcmVhdGUgdGhlIGtleS4KICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbmZpZ1trZXldID0gdmFsOwogIH0KICBQbG90bHkuZG93bmxvYWRJbWFnZShQTE9ULCBjb25maWcpOwp9CgpsZXQgY29udGFpbmVyX3JlY3QgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAsIHRvcDogMCwgbGVmdDogMCB9OwpmdW5jdGlvbiB1bnBvcF9jb250YWluZXIoY2wpIHsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZSgicG9wcGVkLW91dCIsIGZhbHNlKTsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgZmFsc2UpOwogIC8vIFdlIGZpeCB0aGUgaGVpZ2h0IGJhY2sgdG8gdGhlIHZhbHVlIGl0IGhhZCBiZWZvcmUgcG9wb3V0LCBhbHNvIHNldHRpbmcgdGhlIGZsYWcgdG8gc2lnbmFsIHRoYXQgdXBvbiBmaXJzdCByZXNpemUgd2UgcmVtb3ZlIHRoZSBmaXhlZCBpbmxpbmUtc3R5bGUKICBDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0ICsgInB4IjsKICByZW1vdmVfY29udGFpbmVyX3NpemUgPSB0cnVlOwogIC8vIFdlIHNldCB0aGUgb3RoZXIgZml4ZWQgaW5saW5lLXN0eWxlcyB0byBudWxsCiAgQ09OVEFJTkVSLnN0eWxlLndpZHRoID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9ICIiOwogIENPTlRBSU5FUi5zdHlsZS5sZWZ0ID0gIiI7CiAgLy8gV2UgYWxzbyByZW1vdmUgdGhlIENMSVBCT0FSRF9IRUFERVIKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLndpZHRoID0gIiI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gIiI7CiAgLy8gRmluYWxseSB3ZSByZW1vdmUgdGhlIGhpZGRlbiBjbGFzcyB0byB0aGUgaGVhZGVyCiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCB0cnVlKTsKICByZXR1cm47Cn0KZnVuY3Rpb24gcG9wb3V0X2NvbnRhaW5lcihvcHRzKSB7CiAgY29uc3QgY2wgPSBvcHRzPy5jbDsKICBjb25zdCB0YXJnZXRfY29udGFpbmVyX3NpemUgPSBvcHRzPy50YXJnZXRfY29udGFpbmVyX3NpemUgPz8ge307CiAgY29uc3QgdGFyZ2V0X3Bsb3Rfc2l6ZSA9IG9wdHM/LnRhcmdldF9wbG90X3NpemUgPz8ge307CiAgaWYgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICByZXR1cm4gdW5wb3BfY29udGFpbmVyKGNsKTsKICB9CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoY2wsIGNsID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IHRydWUpOwogIC8vIFdlIGV4dHJhY3QgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgY29udGFpbmVyLCBzYXZlIHRoZW0gYW5kIGZpeCB0aGVtCiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfSA9IENPTlRBSU5FUi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICBjb250YWluZXJfcmVjdCA9IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH07CiAgLy8gV2Ugc2F2ZSB0aGUgY3VycmVudCBwbG90IHNpemUgYmVmb3JlIHdlIHBvcCBhcyBpdCB3aWxsIGZpbGwgdGhlIHNjcmVlbgogIGNvbnN0IGN1cnJlbnRfcGxvdF9zaXplID0gewogICAgd2lkdGg6IFBMT1QuX2Z1bGxMYXlvdXQud2lkdGgsCiAgICBoZWlnaHQ6IFBMT1QuX2Z1bGxMYXlvdXQuaGVpZ2h0LAogIH07CiAgLy8gV2UgaGF2ZSB0byBzYXZlIHRoZSBwYWQgZGF0YSBiZWZvcmUgcG9wcGluZyBzbyB3ZSBjYW4gcmVzaXplIHByZWNpc2VseQogIGNvbnN0IHBhZCA9IHt9OwogIHBhZC51bnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZSgicG9wcGVkLW91dCIsIHRydWUpOwogIHBhZC5wb3BwZWQgPSBnZXRTaXplRGF0YSgpLmNvbnRhaW5lcl9wYWQ7CiAgLy8gV2UgZG8gdG9wIGFuZCBsZWZ0IGJhc2VkIG9uIHRoZSBjdXJyZW50IHJlY3QKICBmb3IgKGNvbnN0IGtleSBvZiBbInRvcCIsICJsZWZ0Il0pIHsKICAgIGNvbnN0IHN0YXJ0X3ZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNvbnRhaW5lcl9yZWN0W2tleV07CiAgICBsZXQgb2Zmc2V0ID0gMDsKICAgIGZvciAoY29uc3Qga2luZCBvZiBbInBhZGRpbmciLCAiYm9yZGVyIl0pIHsKICAgICAgb2Zmc2V0ICs9IHBhZC5wb3BwZWRba2luZF1ba2V5XSAtIHBhZC51bnBvcHBlZFtraW5kXVtrZXldOwogICAgfQogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSBzdGFydF92YWwgLSBvZmZzZXQgKyAicHgiOwogICAgaWYgKGtleSA9PT0gImxlZnQiKSB7CiAgICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGVba2V5XSA9IENPTlRBSU5FUi5zdHlsZVtrZXldOwogICAgfQogIH0KICAvLyBXZSBjb21wdXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGRlcGVuZGluZyBvbiBldmVudHVhbCBjb25maWcgZGF0YQogIGNvbnN0IGNzeiA9IGNvbXB1dGVDb250YWluZXJTaXplKHsKICAgIHdpZHRoOgogICAgICB0YXJnZXRfcGxvdF9zaXplLndpZHRoID8/CiAgICAgIGNvbmZpZ19zcGFucy53aWR0aC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6CiAgICAgIHRhcmdldF9wbG90X3NpemUuaGVpZ2h0ID8/CiAgICAgIGNvbmZpZ19zcGFucy5oZWlnaHQuY29uZmlnX3ZhbHVlID8/CiAgICAgIGN1cnJlbnRfcGxvdF9zaXplLmhlaWdodCwKICB9KTsKICBmb3IgKGNvbnN0IGtleSBvZiBbIndpZHRoIiwgImhlaWdodCJdKSB7CiAgICBjb25zdCB2YWwgPSB0YXJnZXRfY29udGFpbmVyX3NpemVba2V5XSA/PyBjc3pba2V5XTsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gdmFsICsgInB4IjsKICAgIGlmIChrZXkgPT09ICJ3aWR0aCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIENMSVBCT0FSRF9IRUFERVIuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgZmFsc2UpOwogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CgogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAibW91c2Vkb3duIiwKICAgIChlKSA9PiB7CiAgICAgIGlmIChlLnRhcmdldC5jbG9zZXN0KCIucGx1dG9wbG90bHktY29udGFpbmVyIikgIT09IENPTlRBSU5FUikgewogICAgICAgIHVucG9wX2NvbnRhaW5lcigpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7Cn0KCkNPTlRBSU5FUi5wb3BPdXQgPSBwb3BvdXRfY29udGFpbmVyOwoKZnVuY3Rpb24gRHVhbENsaWNrKHNpbmdsZV9mdW5jLCBkYmxfZnVuYykgewogIGxldCBuY2xpY2tzID0gMDsKICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHsKICAgIG5jbGlja3MgKz0gMTsKICAgIGlmIChuY2xpY2tzID4gMSkgewogICAgICBkYmxfZnVuYyguLi5hcmdzKTsKICAgICAgbmNsaWNrcyA9IDA7CiAgICB9IGVsc2UgewogICAgICBkZWxheSgzMDApLnRoZW4oKCkgPT4gewogICAgICAgIGlmIChuY2xpY2tzID09IDEpIHsKICAgICAgICAgIHNpbmdsZV9mdW5jKC4uLmFyZ3MpOwogICAgICAgIH0KICAgICAgICBuY2xpY2tzID0gMDsKICAgICAgfSk7CiAgICB9CiAgfTsKfQoKLy8gV2UgcmVtb3ZlIHRoZSBkZWZhdWx0IGRvd25sb2FkIGltYWdlIGJ1dHRvbgpwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSA9IF8udW5pb24oCiAgcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9SZW1vdmUsCiAgWyJ0b0ltYWdlIl0KKTsKLy8gV2UgYWRkIHRoZSBjdXN0b20gYnV0dG9uIHRvIHRoZSBtb2RlYmFyCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb0FkZCwKICBbCiAgICB7CiAgICAgIG5hbWU6ICJDb3B5IFBORyB0byBDbGlwYm9hcmQiLAogICAgICBpY29uOiB7CiAgICAgICAgaGVpZ2h0OiA1MjAsCiAgICAgICAgd2lkdGg6IDUyMCwKICAgICAgICBwYXRoOiAiTTI4MCA2NGg0MGMzNS4zIDAgNjQgMjguNyA2NCA2NFY0NDhjMCAzNS4zLTI4LjcgNjQtNjQgNjRINjRjLTM1LjMgMC02NC0yOC43LTY0LTY0VjEyOEMwIDkyLjcgMjguNyA2NCA2NCA2NGg0MCA5LjZDMTIxIDI3LjUgMTUzLjMgMCAxOTIgMHM3MSAyNy41IDc4LjQgNjRIMjgwek02NCAxMTJjLTguOCAwLTE2IDcuMi0xNiAxNlY0NDhjMCA4LjggNy4yIDE2IDE2IDE2SDMyMGM4LjggMCAxNi03LjIgMTYtMTZWMTI4YzAtOC44LTcuMi0xNi0xNi0xNkgzMDR2MjRjMCAxMy4zLTEwLjcgMjQtMjQgMjRIMTkyIDEwNGMtMTMuMyAwLTI0LTEwLjctMjQtMjRWMTEySDY0em0xMjgtOGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6IiwKICAgICAgfSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKGNvcHlJbWFnZVRvQ2xpcGJvYXJkLCAoKSA9PiB7CiAgICAgICAgcG9wb3V0X2NvbnRhaW5lcigpOwogICAgICB9KSwKICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICJEb3dubG9hZCBJbWFnZSIsCiAgICAgIGljb246IFBsb3RseS5JY29ucy5jYW1lcmEsCiAgICAgIGRpcmVjdGlvbjogInVwIiwKICAgICAgY2xpY2s6IER1YWxDbGljayhzYXZlSW1hZ2VUb0ZpbGUsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKHsgY2w6ICJmaWxlc2F2ZSIgfSk7CiAgICAgIH0pLAogICAgfSwKICBdCik7CgpmdW5jdGlvbiBnZXRPZmZzZXREYXRhKGVsKSB7CiAgbGV0IGNzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwsIG51bGwpOwogIGNvbnN0IG9kYXRhID0gewogICAgcGFkZGluZzogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdMZWZ0KSwKICAgICAgcmlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1JpZ2h0KSwKICAgICAgdG9wOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdUb3ApLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MucGFkZGluZ0JvdHRvbSksCiAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdMZWZ0KSArIHBhcnNlRmxvYXQoY3MucGFkZGluZ1JpZ2h0KSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdUb3ApICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgIH0sCiAgICBib3JkZXI6IHsKICAgICAgbGVmdDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgdG9wOiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSwKICAgICAgYm90dG9tOiBwYXJzZUZsb2F0KGNzLmJvcmRlckJvdHRvbVdpZHRoKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MuYm9yZGVyTGVmdFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyUmlnaHRXaWR0aCksCiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChjcy5ib3JkZXJUb3BXaWR0aCkgKyBwYXJzZUZsb2F0KGNzLmJvcmRlckJvdHRvbVdpZHRoKSwKICAgIH0KICB9OwogIGlmIChlbCA9PT0gUExPVCkgewogICAgLy8gRm9yIHRoZSBQTE9UIHdlIGFsc28gd2FudCB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgb2Zmc2V0CiAgICBvZGF0YS5vZmZzZXQgPSB7CiAgICAgIHRvcDogUExPVC5vZmZzZXRQYXJlbnQgPT0gQ09OVEFJTkVSID8gUExPVC5vZmZzZXRUb3AgOiAwLAogICAgICBsZWZ0OiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldExlZnQgOiAwLAogICAgfQogIH0KICByZXR1cm4gb2RhdGE7Cn0KZnVuY3Rpb24gZ2V0U2l6ZURhdGEoKSB7CiAgY29uc3QgZGF0YSA9IHsKICAgIHBsb3RfcGFkOiBnZXRPZmZzZXREYXRhKFBMT1QpLAogICAgcGxvdF9yZWN0OiBQTE9ULmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogICAgY29udGFpbmVyX3BhZDogZ2V0T2Zmc2V0RGF0YShDT05UQUlORVIpLAogICAgY29udGFpbmVyX3JlY3Q6IENPTlRBSU5FUi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICB9OwogIHJldHVybiBkYXRhOwp9CmZ1bmN0aW9uIGNvbXB1dGVDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICBjb25zdCBjb21wdXRlZF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICBjb25zdCBvZmZzZXRzID0gY29tcHV0ZWRfc2l6ZS5vZmZzZXRzOwoKICBjb25zdCBwbG90X2RhdGEgPSB7CiAgICB3aWR0aDogd2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCwKICAgIGhlaWdodDogaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH07CgogIHJldHVybiB7CiAgICB3aWR0aDogKHdpZHRoID8/IGNvbXB1dGVkX3NpemUud2lkdGgpICsgb2Zmc2V0cy53aWR0aCwKICAgIGhlaWdodDogKGhlaWdodCA/PyBjb21wdXRlZF9zaXplLmhlaWdodCkgKyBvZmZzZXRzLmhlaWdodCwKICAgIG5vQ2hhbmdlOiB3aWR0aCA9PSBjb21wdXRlZF9zaXplLndpZHRoICYmIGhlaWdodCA9PSBjb21wdXRlZF9zaXplLmhlaWdodCwKICB9Cn0KCi8vIFRoaXMgZnVuY3Rpb24gd2lsbCBjaGFuZ2UgdGhlIGNvbnRhaW5lciBzaXplIHNvIHRoYXQgdGhlIHJlc3VsdGluZyBwbG90IHdpbGwgYmUgbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIHNwZWNzCmZ1bmN0aW9uIGNoYW5nZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGlmICghQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIGNvbnNvbGUubG9nKCJUcmllZCB0byBjaGFuZ2UgY29udGFpbmVyIHNpemUgd2hlbiBub3QgcG9wcGVkLCBpZ25vcmluZyIpOwogICAgcmV0dXJuOwogIH0KCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhKTsKCiAgaWYgKGNzei5ub0NoYW5nZSkgewogICAgY29uc29sZS5sb2coIlNpemUgaXMgdGhlIHNhbWUgYXMgY3VycmVudCwgaWdub3JpbmciKTsKICAgIHJldHVybgogIH0KICAvLyBXZSBhcmUgbm93IGdvaW5nIHRvIHNldCBoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBjb250YWluZXIKICBmb3IgKGNvbnN0IGtleSBvZiBbIndpZHRoIiwgImhlaWdodCJdKSB7CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IGNzeltrZXldICsgInB4IjsKICB9Cn0KLy8gV2Ugbm93IGNyZWF0ZSB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIHVwZGF0ZSB0aGUgcGxvdCBiYXNlZCBvbiB0aGUgdmFsdWVzIHNwZWNpZmllZApmdW5jdGlvbiB1cGRhdGVGcm9tSGVhZGVyKCkgewogIGNvbnN0IGhlYWRlcl9kYXRhID0gewogICAgaGVpZ2h0OiBjb25maWdfc3BhbnMuaGVpZ2h0LnVpX3ZhbHVlLAogICAgd2lkdGg6IGNvbmZpZ19zcGFucy53aWR0aC51aV92YWx1ZSwKICB9OwogIGNoYW5nZUNvbnRhaW5lclNpemUoaGVhZGVyX2RhdGEpOwp9Ci8vIFdlIGFzc2lnbiB0aGlzIGZ1bmN0aW9uIHRvIHRoZSBvbmJsdXIgZXZlbnQgb2Ygd2lkdGggYW5kIGhlaWdodAppZiAoZmlyc3RSdW4pIHsKICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGNvbnRhaW5lci51aV9zcGFuLm9uYmx1ciA9IChlKSA9PiB7CiAgICAgIGNvbnRhaW5lci51aV92YWx1ZSA9IGNvbnRhaW5lci51aV9zcGFuLnRleHRDb250ZW50OwogICAgICB1cGRhdGVGcm9tSGVhZGVyKCk7CiAgICB9OwogIH0KfQovLyBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBwbG90IHNpemUgdG8gdXNlIGZvciByZWxheW91dCBhcyBhIGZ1bmN0aW9uIG9mIHRoZSBjb250YWluZXIgc2l6ZQpmdW5jdGlvbiBjb21wdXRlUGxvdFNpemUoZGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICAvLyBSZW1vdmUgUGFkZGluZwogIGNvbnN0IHsgY29udGFpbmVyX3BhZCwgcGxvdF9wYWQsIGNvbnRhaW5lcl9yZWN0IH0gPSBkYXRhOwogIGNvbnN0IG9mZnNldHMgPSB7CiAgICB3aWR0aDoKICAgICAgcGxvdF9wYWQucGFkZGluZy53aWR0aCArCiAgICAgIHBsb3RfcGFkLmJvcmRlci53aWR0aCArCiAgICAgIHBsb3RfcGFkLm9mZnNldC5sZWZ0ICsKICAgICAgY29udGFpbmVyX3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgY29udGFpbmVyX3BhZC5ib3JkZXIud2lkdGgsCiAgICBoZWlnaHQ6CiAgICAgIHBsb3RfcGFkLnBhZGRpbmcuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLmhlaWdodCArCiAgICAgIHBsb3RfcGFkLm9mZnNldC50b3AgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcuaGVpZ2h0ICsKICAgICAgY29udGFpbmVyX3BhZC5ib3JkZXIuaGVpZ2h0LAogIH07CiAgY29uc3Qgc3ogPSB7CiAgICB3aWR0aDogTWF0aC5yb3VuZChjb250YWluZXJfcmVjdC53aWR0aCAtIG9mZnNldHMud2lkdGgpLAogICAgaGVpZ2h0OiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LmhlaWdodCAtIG9mZnNldHMuaGVpZ2h0KSwKICAgIG9mZnNldHMsCiAgfTsKICByZXR1cm4gc3o7Cn0KCi8vIENyZWF0ZSB0aGUgcmVzaXplT2JzZXJ2ZXIgdG8gbWFrZSB0aGUgcGxvdCBldmVuIG1vcmUgcmVzcG9uc2l2ZSEgOm1hZ2ljOgpjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4gewogIGNvbnN0IHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKTsKICBjb25zdCB7Y29udGFpbmVyX3JlY3QsIGNvbnRhaW5lcl9wYWR9ID0gc2l6ZURhdGE7CiAgbGV0IHBsb3Rfc2l6ZSA9IGNvbXB1dGVQbG90U2l6ZShzaXplRGF0YSk7CiAgLy8gV2Ugc2F2ZSB0aGUgaGVpZ2h0IGluIHRoZSBQTE9UIG9iamVjdAogIFBMT1QuY29udGFpbmVyX2hlaWdodCA9IGNvbnRhaW5lcl9yZWN0LmhlaWdodDsKICAvLyBXZSBkZWFsIHdpdGggc29tZSBzdHVmZiBpZiB0aGUgY29udGFpbmVyIGlzIHBvcHBwZWQKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLndpZHRoID0gY29udGFpbmVyX3JlY3Qud2lkdGggKyAicHgiOwogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9IGNvbnRhaW5lcl9yZWN0LmxlZnQgKyAicHgiOwogIGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUgPSBwbG90X3NpemUuaGVpZ2h0OwogIGNvbmZpZ19zcGFucy53aWR0aC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS53aWR0aDsKICAvKiAKCQlUaGUgYWRkaXRpb24gb2YgdGhlIGludmFsaWQgYXJndW1lbnQgYHBsdXRvcmVzaXplYCBzZWVtcyB0byBmaXggdGhlIHByb2JsZW0gd2l0aCBjYWxsaW5nIGByZWxheW91dGAgc2ltcGx5IHdpdGggYHthdXRvc2l6ZTogdHJ1ZX1gIGFzIHVwZGF0ZSBicmVha2luZyBtb3VzZSByZWxheW91dCBldmVudHMgdHJhY2tpbmcuIAoJCVNlZSBodHRwczovL2dpdGh1Yi5jb20vcGxvdGx5L3Bsb3RseS5qcy9pc3N1ZXMvNjE1NiBmb3IgZGV0YWlscwoJCSovCiAgbGV0IGNvbmZpZyA9IHsKICAgIC8vIElmIHRoaXMgaXMgcG9wcGVkIG91dCwgd2UgaWdub3JlIHRoZSBvcmlnaW5hbCB3aWR0aC9oZWlnaHQKICAgIHdpZHRoOiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyB1bmRlZmluZWQgOiBvcmlnaW5hbF93aWR0aCkgPz8gcGxvdF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyB1bmRlZmluZWQgOiBvcmlnaW5hbF9oZWlnaHQpID8/IHBsb3Rfc2l6ZS5oZWlnaHQsCiAgICBwbHV0b3Jlc2l6ZTogdHJ1ZSwKICB9OwogIFBsb3RseS5yZWxheW91dChQTE9ULCBjb25maWcpLnRoZW4oKCkgPT4gewogICAgaWYgKHJlbW92ZV9jb250YWluZXJfc2l6ZSAmJiAhQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgdGhlIGZpcnN0IHJlc2l6ZSB1cG9uIHBsb3QgY3JlYXRpb24gdG8gYWxyZWFkeSBiZSB3aXRob3V0IGEgZml4ZWQgaGVpZ2h0CiAgICAgIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSAiIjsKICAgICAgQ09OVEFJTkVSLnN0eWxlLndpZHRoID0gIiI7CiAgICAgIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IGZhbHNlOwogICAgfQogIH0pOwp9KTsKCnJlc2l6ZU9ic2VydmVyLm9ic2VydmUoQ09OVEFJTkVSKTsKCgpQbG90bHkucmVhY3QoUExPVCwgcGxvdF9vYmopLnRoZW4oKCkgPT4gewoJLy8gQXNzaWduIHRoZSBQbG90bHkgZXZlbnQgbGlzdGVuZXJzCglmb3IgKGNvbnN0IFtrZXksIGxpc3RlbmVyX3ZlY10gb2YgT2JqZWN0LmVudHJpZXMocGxvdGx5X2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULm9uKGtleSwgbGlzdGVuZXIpCgkJfQoJfQoJLy8gQXNzaWduIHRoZSBKUyBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhqc19saXN0ZW5lcnMpKSB7CgkJZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcl92ZWMpIHsKCQkJUExPVC5hZGRFdmVudExpc3RlbmVyKGtleSwgbGlzdGVuZXIsIHsKCQkJCXNpZ25hbDogY29udHJvbGxlci5zaWduYWwKCQkJfSkKCQl9Cgl9Cn0KKQoKCmludmFsaWRhdGlvbi50aGVuKCgpID0+IHsKCS8vIFJlbW92ZSBhbGwgcGxvdGx5IGxpc3RlbmVycwoJUExPVC5yZW1vdmVBbGxMaXN0ZW5lcnMoKQoJLy8gUmVtb3ZlIGFsbCBKUyBsaXN0ZW5lcnMKCWNvbnRyb2xsZXIuYWJvcnQoKQoJLy8gUmVtb3ZlIHRoZSByZXNpemVPYnNlcnZlcgoJcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpCn0pCgoKCgkJcmV0dXJuIENPTlRBSU5FUgoJPC9zY3JpcHQ+CqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b+jEvdDSrBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkN2E2NmFiNDctOTE4Zi00NTgyLTg5NWYtMWI0NjkwNTYyMDUxuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOGcaT6LVwdWJsaXNoZWRfb2JqZWN0X2tleXOR2TViM2I4NDA4Yy04MTgxLTExZWYtMTRlYi1lMWM1NjliOGJiMjkvNmQ1OTIzMjE4YjM0N2FiMLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SRkNmIxNzI5YS04NzRkLTExZWUtMTUxYS05YjBmY2NlMmM0ZmSKpnF1ZXVlZMKkbG9nc5GIpGxpbmX/o21zZ5LZK05ldyBLb21hTVJJUGxvdHMgYmFja2VuZCBzZXQ6IFBsdXRvUGxvdGx5LgqqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNmIxNzI5YS04NzRkLTExZWUtMTUxYS05YjBmY2NlMmM0ZmSma3dhcmdzkKJpZLVLb21hTVJJUGxvdHNfZjc2ZTQ2NmGkZmlsZdlGL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Lb21hTVJJUGxvdHMvZ2RNTGcvc3JjL3VpL1Bsb3RCYWNrZW5kcy5qbKVncm91cKxQbG90QmFja2VuZHOlbGV2ZWykSW5mb6dydW5uaW5nwqZvdXRwdXSGpGJvZHmgpG1pbWWqdGV4dC9wbGFpbqxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b+jBpk8rLBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkZDZiMTcyOWEtODc0ZC0xMWVlLTE1MWEtOWIwZmNjZTJjNGZkuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXPAAAAAQ4mLfa1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQ5YTg4YTU0Yi1iY2M3LTQxYWQtOGU2MC1mNGQ0NTBkY2NiMmSKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52mqJCTxzY3JpcHQgaWQ9J3Bsb3RfMSc+CgkJLy8gV2Ugc3RhcnQgYnkgcHV0dGluZyBhbGwgdGhlIHZhcmlhYmxlIGludGVycG9sYXRpb24gaGVyZSBhdCB0aGUgYmVnaW5uaW5nCgkJLy8gV2UgaGF2ZSB0byBjb252ZXJ0IGFsbCB0eXBlZGFycmF5cyBpbiB0aGUgbGF5b3V0IHRvIG5vcm1hbCBhcnJheXMuIFNlZSBJc3N1ZSAjMjUKCQkvLyBXZSB1c2UgbG9kYXNoIGZvciB0aGlzIGZvciBjb21wYWN0bmVzcwoJCWZ1bmN0aW9uIHJlbW92ZVR5cGVkQXJyYXkobykgewoJCQlyZXR1cm4gXy5pc1R5cGVkQXJyYXkobykgPyBBcnJheS5mcm9tKG8pIDoKCQkJXy5pc1BsYWluT2JqZWN0KG8pID8gXy5tYXBWYWx1ZXMobywgcmVtb3ZlVHlwZWRBcnJheSkgOiAKCQkJbwoJCX0KCgkJLy8gUHVibGlzaCB0aGUgcGxvdCBvYmplY3QgdG8gSlMKCQlsZXQgcGxvdF9vYmogPSBfLnVwZGF0ZSgvKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIEFic3RyYWN0UGx1dG9EaW5nZXRqZXMuRGlzcGxheS5wdWJsaXNoZWRfdG9fanMgKi8gZ2V0UHVibGlzaGVkT2JqZWN0KCJiM2I4NDA4Yy04MTgxLTExZWYtMTRlYi1lMWM1NjliOGJiMjkvZmQwMWJjNzRmMTUzMTZiNyIpLCAibGF5b3V0IiwgcmVtb3ZlVHlwZWRBcnJheSkKCQkvLyBHZXQgdGhlIHBsb3RseSBsaXN0ZW5lcnMKCQljb25zdCBwbG90bHlfbGlzdGVuZXJzID0ge30KCQkvLyBHZXQgdGhlIEpTIGxpc3RlbmVycwoJCWNvbnN0IGpzX2xpc3RlbmVycyA9IHt9CgkJLy8gRGVhbCB3aXRoIGV2ZW50dWFsIGN1c3RvbSBjbGFzc2VzCgkJbGV0IGN1c3RvbV9jbGFzc2xpc3QgPSBbXQoKCgkJLy8gTG9hZCB0aGUgcGxvdGx5IGxpYnJhcnkKCQlsZXQgUGxvdGx5ID0gdW5kZWZpbmVkCgkJdHJ5IHsKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoIi4vcGxvdGx5anMvcGxvdGx5anMtMi4yNi4yLm1pbi5qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0gY2F0Y2ggKGUpIHsKCQkJY29uc29sZS5sb2coIkxvY2FsIGxvYWQgZmFpbGVkLCB0cnlpbmcgd2l0aCB0aGUgd2ViIGVzbS5zaCB2ZXJzaW9uIikKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoImh0dHBzOi8vZXNtLnNoL3YxMzUvcGxvdGx5LmpzLWRpc3QtbWluQDIuMjYuMi9lc25leHQvcGxvdGx5LmpzLWRpc3QtbWluLm1qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0KCgkJLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0byBmb3JjZSBsb2NhbCBtYXRoamF4IGZvbnQgY2FjaGUKCQlpZiAoZmFsc2UgJiYgd2luZG93Py5NYXRoSmF4Py5jb25maWc/LnN2Zz8uZm9udENhY2hlID09PSAnZ2xvYmFsJykgewoJCQl3aW5kb3cuTWF0aEpheC5jb25maWcuc3ZnLmZvbnRDYWNoZSA9ICdsb2NhbCcKCQl9CgoJCS8vIEZsYWcgdG8gY2hlY2sgaWYgdGhpcyBjZWxsIHdhcyAgbWFudWFsbHkgcmFuIG9yIHJlYWN0aXZlbHkgcmFuCmNvbnN0IGZpcnN0UnVuID0gdGhpcyA/IGZhbHNlIDogdHJ1ZQpjb25zdCBDT05UQUlORVIgPSB0aGlzID8/IGh0bWxgPGRpdiBjbGFzcz0ncGx1dG9wbG90bHktY29udGFpbmVyJz5gCmNvbnN0IFBMT1QgPSBDT05UQUlORVIucXVlcnlTZWxlY3RvcignLmpzLXBsb3RseS1wbG90JykgPz8gQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgPGRpdj5gKQpjb25zdCBwYXJlbnQgPSBDT05UQUlORVIucGFyZW50RWxlbWVudAovLyBXZSB1c2UgYSBjb250cm9sbGVyIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lcnMgdXBvbiBpbnZhbGlkYXRpb24KY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKQovLyBXZSBoYXZlIHRvIGFkZCB0aGlzIHRvIGtlZXAgc3VwcG9ydGluZyBAYmluZCB3aXRoIHRoZSBvbGQgQVBJIHVzaW5nIFBMT1QKUExPVC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChlKSA9PiB7CglDT05UQUlORVIudmFsdWUgPSBQTE9ULnZhbHVlCglpZiAoZS5idWJibGVzKSB7CgkJcmV0dXJuCgl9CglDT05UQUlORVIuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2lucHV0JykpCn0sIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KQoKCS8vIFRoaXMgY3JlYXRlIHRoZSBzdHlsZSBzdWJkaXYgb24gZmlyc3QgcnVuCglmaXJzdFJ1biAmJiBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGAKCTxzdHlsZT4KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgewoJCXdpZHRoOiAxMDAlOwoJCWhlaWdodDogMTAwJTsKCQltaW4taGVpZ2h0OiAwOwoJCW1pbi13aWR0aDogMDsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgLmpzLXBsb3RseS1wbG90IC5wbG90bHkgZGl2IHsKCQltYXJnaW46IDAgYXV0bzsgLy8gVGhpcyBjZW50ZXJzIHRoZSBwbG90Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLnBvcHBlZC1vdXQgewoJCW92ZXJmbG93OiBhdXRvOwoJCXotaW5kZXg6IDEwMDA7CgkJcG9zaXRpb246IGZpeGVkOwoJCXJlc2l6ZTogYm90aDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDBweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMHB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgewoJCWRpc3BsYXk6IGZsZXg7CgkJZmxleC1mbG93OiByb3cgd3JhcDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAxMnB4OwoJCXBvc2l0aW9uOiBmaXhlZDsKCQl6LWluZGV4OiAxMDAxOwoJCWN1cnNvcjogbW92ZTsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIC0xMDAlKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBzcGFuIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJZmxleDogMQoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIuaGlkZGVuIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuIHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlIHsKCQlwYWRkaW5nLXJpZ2h0OiA1cHg7CgkJcGFkZGluZy1sZWZ0OiAycHg7CgkJY3Vyc29yOiB0ZXh0OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZmxleDogMCAwIDEwMCU7CgkJdGV4dC1hbGlnbjogY2VudGVyOwoJCWJvcmRlci10b3A6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQltYXJnaW4tdG9wOiA1cHg7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZpbGVuYW1lIHsKCQltYXJnaW4tbGVmdDogM3B4OwoJCXRleHQtYWxpZ246IGxlZnQ7CgkJbWluLXdpZHRoOiBtaW4oNjAlLCBtaW4tY29udGVudCk7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCAubGFiZWwgewoJCWZsZXg6IDAgMCAwOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5mb3JtYXQgewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCQlmbGV4OiAxIDAgYXV0bzsKCQltaW4td2lkdGg6IDMwcHg7CgkJbWFyZ2luLXJpZ2h0OiAxMHB4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCQlmbGV4LWZsb3c6IGNvbHVtbjsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlwYWRkaW5nLWxlZnQ6IDNweDsKCQl6LWluZGV4OiAyMDAwOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIHsKCQljdXJzb3I6IHBvaW50ZXI7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJcGFkZGluZzogM3B4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKC0zcHgsIC02cHgpOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpub3QoLnNlbGVjdGVkKSB7CgkJbWFyZ2luLXRvcDogM3B4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uLnNlbGVjdGVkIHsKCQlvcmRlcjogLTE7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246aG92ZXIgewoJCWJhY2tncm91bmQtY29sb3I6IHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJfQoJc3Bhbi5jb25maWctdmFsdWUgewoJCWZvbnQtd2VpZ2h0OiBub3JtYWw7CgkJY29sb3I6IHZhcigtLXBsdXRvLW91dHB1dC1jb2xvcik7CgkJZGlzcGxheTogbm9uZTsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIGNhbGMoLTEwMCUgLSAxMHB4KSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLmxhYmVsIHsKCQl1c2VyLXNlbGVjdDogbm9uZTsKCX0KCS5sYWJlbDpob3ZlciBzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCW1pbi13aWR0aDogMTUwcHg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4ubWF0Y2hpbmctY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLW1hY3JvLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5kaWZmZXJlbnQtY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLXRhZy1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9Cjwvc3R5bGU+CmApCgpsZXQgb3JpZ2luYWxfaGVpZ2h0ID0gcGxvdF9vYmoubGF5b3V0LmhlaWdodApsZXQgb3JpZ2luYWxfd2lkdGggPSBwbG90X29iai5sYXlvdXQud2lkdGgKLy8gRm9yIHRoZSBoZWlnaHQgd2UgaGF2ZSB0byBhbHNvIHB1dCBhIGZpeGVkIHZhbHVlIGluIGNhc2UgdGhlIHBsb3QgaXMgcHV0IG9uIGEgbm9uLWZpeGVkLXNpemUgY29udGFpbmVyIChsaWtlIHRoZSBkZWZhdWx0IHdyYXBwZXIpCi8vIFdlIGRlZmluZSBhIHZhcmlhYmxlIHRvIGNoZWNrIHdoZXRoZXIgd2Ugc3RpbGwgaGF2ZSB0byByZW1vdmUgdGhlIGZpeGVkIGhlaWdodApsZXQgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmlyc3RSdW4KbGV0IGNvbnRhaW5lcl9oZWlnaHQgPSBvcmlnaW5hbF9oZWlnaHQgPz8gUExPVC5jb250YWluZXJfaGVpZ2h0ID8/IDQwMApDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX2hlaWdodCArICdweCcKCi8vIFdlIGNyZWF0ZSBhIFByb21pc2UgdmVyc2lvbiBvZiBzZXRUaW1lb3V0CmZ1bmN0aW9uIGRlbGF5KG1zKSB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7Cn0KCi8vIFdlIGltcG9ydCBpbnRlcmFjdCBmb3IgZHJhZ2dpbmcvcmVzaXppbmcKY29uc3QgeyBkZWZhdWx0OiBpbnRlcmFjdCB9ID0gYXdhaXQgaW1wb3J0KCdodHRwczovL2VzbS5zaC9pbnRlcmFjdGpzQDEuMTAuMTknKQoKCmZ1bmN0aW9uIGdldEltYWdlT3B0aW9ucygpIHsKICBjb25zdCBvID0gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogIHJldHVybiB7CiAgICBmb3JtYXQ6IG8uZm9ybWF0ID8/ICJwbmciLAogICAgd2lkdGg6IG8ud2lkdGggPz8gb3JpZ2luYWxfd2lkdGgsCiAgICBoZWlnaHQ6IG8uaGVpZ2h0ID8/IG9yaWdpbmFsX2hlaWdodCwKICAgIHNjYWxlOiBvLnNjYWxlID8/IDEsCiAgICBmaWxlbmFtZTogby5maWxlbmFtZSA/PyAibmV3cGxvdCIsCiAgfTsKfQoKY29uc3QgQ0xJUEJPQVJEX0hFQURFUiA9CiAgQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoIi5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIikgPz8KICBDT05UQUlORVIuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgImFmdGVyYmVnaW4iLAogICAgaHRtbGA8ZGl2IGNsYXNzPSJwbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIGhpZGRlbiI+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmb3JtYXQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+Rm9ybWF0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZvcm1hdCI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB3aWR0aCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5XaWR0aDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSB3aWR0aCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGhlaWdodCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5IZWlnaHQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgaGVpZ2h0Ij48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2NhbGUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+U2NhbGU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgc2NhbGUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzZXQiPlNldDwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB1bnNldCI+VW5zZXQ8L2J1dHRvbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZpbGVuYW1lIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZpbGVuYW1lOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZpbGVuYW1lIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgIDwvZGl2PmAKICApOwoKZnVuY3Rpb24gY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcikgewogIGNvbnN0IHZhbGlkX2NsYXNzZXMgPSBbCiAgICAibWlzc2luZy1jb25maWciLAogICAgIm1hdGNoaW5nLWNvbmZpZyIsCiAgICAiZGlmZmVyZW50LWNvbmZpZyIsCiAgXTsKICBmdW5jdGlvbiBzZXRDbGFzcyhjbCkgewogICAgZm9yIChjb25zdCBuYW1lIG9mIHZhbGlkX2NsYXNzZXMpIHsKICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUobmFtZSwgbmFtZSA9PSBjbCk7CiAgICB9CiAgfQogIC8vIFdlIHVzZSB0aGUgY3VzdG9tIGdldHRlcnMgd2UnbGwgc2V0IHVwIGluIHRoZSBjb250YWluZXIKICBjb25zdCB7IHVpX3ZhbHVlLCBjb25maWdfdmFsdWUsIGNvbmZpZ19zcGFuLCBrZXkgfSA9IGNvbnRhaW5lcjsKICBpZiAoY29uZmlnX3ZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgIHNldENsYXNzKCJtaXNzaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBpcyBub3QgcHJlc2VudCBpbiB0aGUgY29uZmlnLmA7CiAgfSBlbHNlIGlmICh1aV92YWx1ZSA9PSBjb25maWdfdmFsdWUpIHsKICAgIHNldENsYXNzKCJtYXRjaGluZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIHRoZSBzYW1lIHZhbHVlIGluIHRoZSBjb25maWcgYW5kIGluIHRoZSBoZWFkZXIuYDsKICB9IGVsc2UgewogICAgc2V0Q2xhc3MoImRpZmZlcmVudC1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIGEgZGlmZmVyZW50IHZhbHVlICg8ZW0+JHtjb25maWdfdmFsdWV9PC9lbT4pIGluIHRoZSBjb25maWcuYDsKICB9CiAgLy8gQWRkIGluZm8gYWJvdXQgc2V0dGluZyBhbmQgdW5zZXR0aW5nCiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIG9uIHRoZSBsYWJlbCA8ZW0+PGI+b25jZTwvYj48L2VtPiB0byBzZXQgdGhlIGN1cnJlbnQgVUkgdmFsdWUgaW4gdGhlIGNvbmZpZy5gCiAgKTsKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgPGVtPjxiPnR3aWNlPC9iPjwvZW0+IHRvIHJlbW92ZSB0aGlzIGtleSBmcm9tIHRoZSBjb25maWcuYAogICk7Cn0KCmNvbnN0IHZhbGlkX2Zvcm1hdHMgPSBbInBuZyIsICJzdmciLCAid2VicCIsICJqcGVnIiwgImZ1bGwtanNvbiJdOwpmdW5jdGlvbiBpbml0aWFsaXplVUlWYWx1ZVNwYW4oc3Bhbiwga2V5LCB2YWx1ZSkgewogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSBrZXkgPT09ICJmb3JtYXQiID8gImZhbHNlIiA6ICJ0cnVlIjsKICBsZXQgcGFyc2UgPSAoeCkgPT4geDsKICBsZXQgdXBkYXRlID0gKHgpID0+IChzcGFuLnRleHRDb250ZW50ID0geCk7CiAgaWYgKGtleSA9PT0gIndpZHRoIiB8fCBrZXkgPT09ICJoZWlnaHQiKSB7CiAgICBwYXJzZSA9ICh4KSA9PiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoeCkpOwogIH0gZWxzZSBpZiAoa2V5ID09PSAic2NhbGUiKSB7CiAgICBwYXJzZSA9IHBhcnNlRmxvYXQ7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAvLyBXZSByZW1vdmUgY29udGVudEVkaXRhYmxlCiAgICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9ICJmYWxzZSI7CiAgICAvLyBIZXJlIHdlIGZpcnN0IGFkZCB0aGUgc3Vic3BhbnMgZm9yIGVhY2ggb3B0aW9uCiAgICBjb25zdCBvcHRzX2RpdiA9IHNwYW4uYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2IGNsYXNzPSJmb3JtYXQtb3B0aW9ucyI+PC9kaXY+YCk7CiAgICBmb3IgKGNvbnN0IGZtdCBvZiB2YWxpZF9mb3JtYXRzKSB7CiAgICAgIGNvbnN0IG9wdCA9IG9wdHNfZGl2LmFwcGVuZENoaWxkKAogICAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImZvcm1hdC1vcHRpb24gJHtmbXR9Ij4ke2ZtdH08L3NwYW4+YAogICAgICApOwogICAgICBvcHQub25jbGljayA9IChlKSA9PiB7CiAgICAgICAgc3Bhbi52YWx1ZSA9IG9wdC50ZXh0Q29udGVudDsKICAgICAgfTsKICAgIH0KICAgIHBhcnNlID0gKHgpID0+IHsKICAgICAgcmV0dXJuIHZhbGlkX2Zvcm1hdHMuaW5jbHVkZXMoeCkgPyB4IDogbG9jYWxWYWx1ZTsKICAgIH07CiAgICB1cGRhdGUgPSAoeCkgPT4gewogICAgICBmb3IgKGNvbnN0IG9wdCBvZiBvcHRzX2Rpdi5jaGlsZHJlbikgewogICAgICAgIG9wdC5jbGFzc0xpc3QudG9nZ2xlKCJzZWxlY3RlZCIsIG9wdC50ZXh0Q29udGVudCA9PT0geCk7CiAgICAgIH0KICAgIH07CiAgfSBlbHNlIHsKICAgIC8vIFdlIG9ubHkgaGF2ZSBmaWxlbmFtZSBoZXJlCiAgfQogIGxldCBsb2NhbFZhbHVlOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIGxvY2FsVmFsdWU7CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIGlmICh2YWwgIT09ICIiKSB7CiAgICAgICAgbG9jYWxWYWx1ZSA9IHBhcnNlKHZhbCk7CiAgICAgIH0KICAgICAgdXBkYXRlKGxvY2FsVmFsdWUpOwogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7CiAgLy8gV2UgYWxzbyBhc3NpZ24gYSBsaXN0ZW5lciBzbyB0aGF0IHRoZSBlZGl0YWJsZSBpcyBibHVycmVkIHdoZW4gZW50ZXIgaXMgcHJlc3NlZAogIHNwYW4ub25rZXlkb3duID0gKGUpID0+IHsKICAgIGlmIChlLmtleUNvZGUgPT09IDEzKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgc3Bhbi5ibHVyKCk7CiAgICB9CiAgfTsKICBzcGFuLnZhbHVlID0gdmFsdWU7Cn0KCmZ1bmN0aW9uIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oc3Bhbiwga2V5KSB7CiAgLy8gSGVyZSB3ZSBtb3N0bHkgd2FudCB0byBkZWZpbmUgdGhlIHNldHRlciBhbmQgZ2V0dGVyCiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgLy8gaWYgdW5kZWZpbmVkIGlzIHBhc3NlZCwgd2UgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBvcHRpb25zCiAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGRlbGV0ZSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XSA9IHZhbDsKICAgICAgfQogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7Cn0KCmNvbnN0IGNvbmZpZ19zcGFucyA9IHt9Owpmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhnZXRJbWFnZU9wdGlvbnMoKSkpIHsKICBjb25zdCBjb250YWluZXIgPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoYC5jbGlwYm9hcmQtc3Bhbi4ke2tleX1gKTsKICBjb25zdCBsYWJlbCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIubGFiZWwiKTsKICAvLyBXZSBnaXZlIHRoZSBsYWJlbCBhIGZ1bmN0aW9uIHRoYXQgb24gc2luZ2xlIGNsaWNrIHdpbGwgc2V0IHRoZSBjdXJyZW50IHZhbHVlIGFuZCB3aXRoIGRvdWJsZSBjbGljayB3aWxsIHVuc2V0IGl0CiAgbGFiZWwub25jbGljayA9IER1YWxDbGljaygKICAgICgpID0+IHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0sCiAgICAoZSkgPT4gewogICAgICBjb25zb2xlLmxvZygiZSIsIGUpOwogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSB1bmRlZmluZWQ7CiAgICB9CiAgKTsKICBjb25zdCB1aV92YWx1ZV9zcGFuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtdmFsdWUiKTsKICBjb25zdCBjb25maWdfdmFsdWVfc3BhbiA9CiAgICBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNvbmZpZy12YWx1ZSIpID8/CiAgICBsYWJlbC5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAgICJhZnRlcmJlZ2luIiwKICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iY29uZmlnLXZhbHVlIj48L3NwYW4+YAogICAgKTsKICAvLyBBc3NpbmcgdGhlIHR3byBzcGFucyBhcyBwcm9wZXJ0aWVzIG9mIHRoZSBjb250YWluaW5nIHNwYW4KICBjb250YWluZXIudWlfc3BhbiA9IHVpX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmNvbmZpZ19zcGFuID0gY29uZmlnX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmtleSA9IGtleTsKICBjb25maWdfc3BhbnNba2V5XSA9IGNvbnRhaW5lcjsKICBpZiAoZmlyc3RSdW4pIHsKICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA9CiAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICAgIC8vIFdlIGRvIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdmFsdWUgc3BhbgogICAgaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHVpX3ZhbHVlX3NwYW4sIGtleSwgdmFsdWUpOwogICAgLy8gVGhlbiB3ZSBpbml0aWFsaXplIHRoZSBjb25maWcgdmFsdWUKICAgIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oY29uZmlnX3ZhbHVlX3NwYW4sIGtleSk7CiAgICAvLyBXZSBwdXQgc29tZSBjb252ZW5pZW5jZSBnZXR0ZXJzL3NldHRlcnMKICAgIC8vIHVpX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJ1aV92YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiB1aV92YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICB1aV92YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgICAvLyBjb25maWdfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgImNvbmZpZ192YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICB9Cn0KCi8vIFRoZXNlIG9iamVjdHMgd2lsbCBjb250YWluIHRoZSBkZWZhdWx0IHZhbHVlCgovLyBUaGlzIGNvZGUgdXBkYXRlcyB0aGUgaW1hZ2Ugb3B0aW9ucyBpbiB0aGUgUExPVCBjb25maWcgd2l0aCB0aGUgcHJvdmlkZWQgb25lcwpmdW5jdGlvbiBzZXRJbWFnZU9wdGlvbnMobykgewogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gb1trZXldOwogIH0KfQpmdW5jdGlvbiB1bnNldEltYWdlT3B0aW9ucygpIHsKICBzZXRJbWFnZU9wdGlvbnMoe30pOwp9Cgpjb25zdCBzZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4uc2V0Iik7CmNvbnN0IHVuc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnVuc2V0Iik7CmlmIChmaXJzdFJ1bikgewogIHNldF9idXR0b24ub25jbGljayA9IChlKSA9PiB7CiAgICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0KICB9OwogIHVuc2V0X2J1dHRvbi5vbmNsaWNrID0gdW5zZXRJbWFnZU9wdGlvbnM7Cn0KCi8vIFdlIGFkZCBhIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBjbGlwYm9hcmQgaXMgcG9wcGVkIG91dApDT05UQUlORVIuaXNQb3BwZWRPdXQgPSAoKSA9PiB7CiAgcmV0dXJuIENPTlRBSU5FUi5jbGFzc0xpc3QuY29udGFpbnMoInBvcHBlZC1vdXQiKTsKfTsKCkNMSVBCT0FSRF9IRUFERVIub25tb3VzZWRvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHsKICBpZiAoZXZlbnQudGFyZ2V0Lm1hdGNoZXMoInNwYW4uY2xpcGJvYXJkLXZhbHVlIikpIHsKICAgIGNvbnNvbGUubG9nKCJXZSBkb24ndCBtb3ZlISIpOwogICAgcmV0dXJuOwogIH0KICBjb25zdCBzdGFydCA9IHsKICAgIGxlZnQ6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLmxlZnQpLAogICAgdG9wOiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS50b3ApLAogICAgWDogZXZlbnQucGFnZVgsCiAgICBZOiBldmVudC5wYWdlWSwKICB9OwogIGZ1bmN0aW9uIG1vdmVBdChldmVudCwgc3RhcnQpIHsKICAgIGNvbnN0IHRvcCA9IGV2ZW50LnBhZ2VZIC0gc3RhcnQuWSArIHN0YXJ0LnRvcCArICJweCI7CiAgICBjb25zdCBsZWZ0ID0gZXZlbnQucGFnZVggLSBzdGFydC5YICsgc3RhcnQubGVmdCArICJweCI7CiAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9IHRvcDsKICB9CgogIC8vIG1vdmUgb3VyIGFic29sdXRlbHkgcG9zaXRpb25lZCBiYWxsIHVuZGVyIHRoZSBwb2ludGVyCiAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQpIHsKICAgIG1vdmVBdChldmVudCwgc3RhcnQpOwogIH0KCiAgLy8gV2UgdXNlIHRoaXMgdG8gcmVtb3ZlIHRoZSBtb3VzZW1vdmUgd2hlbiBjbGlja2luZyBvdXRzaWRlIG9mIHRoZSBjb250YWluZXIKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICAvLyBtb3ZlIHRoZSBjb250YWluZXIgb24gbW91c2Vtb3ZlCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgb25Nb3VzZU1vdmUsIHsKICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsCiAgfSk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgY2xlYW5VcCgpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7CgogIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICBjb25zb2xlLmxvZygiY2xlYW5pbmcgdXAgdGhlIHBsb3QgbW92ZSBsaXN0ZW5lciIpOwogICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBudWxsOwogIH0KCiAgLy8gKDMpIGRyb3AgdGhlIGJhbGwsIHJlbW92ZSB1bm5lZWRlZCBoYW5kbGVycwogIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gY2xlYW5VcDsKfTsKCmZ1bmN0aW9uIHNlbmRUb0NsaXBib2FyZChibG9iKSB7CiAgaWYgKCFuYXZpZ2F0b3IuY2xpcGJvYXJkKSB7CiAgICBhbGVydCgKICAgICAgIlRoZSBDbGlwYm9hcmQgQVBJIGRvZXMgbm90IHNlZW0gdG8gYmUgYXZhaWxhYmxlLCBtYWtlIHN1cmUgdGhlIFBsdXRvIG5vdGVib29rIGlzIGJlaW5nIHVzZWQgZnJvbSBlaXRoZXIgbG9jYWxob3N0IG9yIGFuIGh0dHBzIHNvdXJjZS4iCiAgICApOwogIH0KICBuYXZpZ2F0b3IuY2xpcGJvYXJkCiAgICAud3JpdGUoWwogICAgICBuZXcgQ2xpcGJvYXJkSXRlbSh7CiAgICAgICAgLy8gVGhlIGtleSBpcyBkZXRlcm1pbmVkIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBibG9iJ3MgdHlwZS4KICAgICAgICBbYmxvYi50eXBlXTogYmxvYiwKICAgICAgfSksCiAgICBdKQogICAgLnRoZW4oCiAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICBjb25zb2xlLmxvZygiQXN5bmM6IENvcHlpbmcgdG8gY2xpcGJvYXJkIHdhcyBzdWNjZXNzZnVsISIpOwogICAgICB9LAogICAgICBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiQXN5bmM6IENvdWxkIG5vdCBjb3B5IHRleHQ6ICIsIGVycik7CiAgICAgIH0KICAgICk7Cn0KCmZ1bmN0aW9uIGNvcHlJbWFnZVRvQ2xpcGJvYXJkKCkgewogIC8vIFdlIGV4dHJhY3QgdGhlIGltYWdlIG9wdGlvbnMgZnJvbSB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycyAoaWYgdGhleSBleGlzdCkKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LiBXZSBhbHNvIGlnbm9yZSBmb3JtYXQgYmVjYXVzZSB0aGUgY2xpcGJvYXJkIG9ubHkgc3VwcG9ydHMgcG5nLgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gImZvcm1hdCIpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LnRvSW1hZ2UoUExPVCwgY29uZmlnKS50aGVuKGZ1bmN0aW9uIChkYXRhVXJsKSB7CiAgICBmZXRjaChkYXRhVXJsKQogICAgICAudGhlbigocmVzKSA9PiByZXMuYmxvYigpKQogICAgICAudGhlbigoYmxvYikgPT4gewogICAgICAgIGNvbnN0IHBhc3RlX3JlY2VpdmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigncGFzdGUtcmVjZWl2ZXIucGx1dG9wbG90bHknKQogICAgICAgIGlmIChwYXN0ZV9yZWNlaXZlcikgewogICAgICAgICAgcGFzdGVfcmVjZWl2ZXIuYXR0YWNoSW1hZ2UoZGF0YVVybCwgQ09OVEFJTkVSKQogICAgICAgIH0KICAgICAgICBzZW5kVG9DbGlwYm9hcmQoYmxvYikKICAgICAgfSk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHNhdmVJbWFnZVRvRmlsZSgpIHsKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS5kb3dubG9hZEltYWdlKFBMT1QsIGNvbmZpZyk7Cn0KCmxldCBjb250YWluZXJfcmVjdCA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCwgdG9wOiAwLCBsZWZ0OiAwIH07CmZ1bmN0aW9uIHVucG9wX2NvbnRhaW5lcihjbCkgewogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgZmFsc2UpOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBmYWxzZSk7CiAgLy8gV2UgZml4IHRoZSBoZWlnaHQgYmFjayB0byB0aGUgdmFsdWUgaXQgaGFkIGJlZm9yZSBwb3BvdXQsIGFsc28gc2V0dGluZyB0aGUgZmxhZyB0byBzaWduYWwgdGhhdCB1cG9uIGZpcnN0IHJlc2l6ZSB3ZSByZW1vdmUgdGhlIGZpeGVkIGlubGluZS1zdHlsZQogIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQgKyAicHgiOwogIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IHRydWU7CiAgLy8gV2Ugc2V0IHRoZSBvdGhlciBmaXhlZCBpbmxpbmUtc3R5bGVzIHRvIG51bGwKICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICBDT05UQUlORVIuc3R5bGUudG9wID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBXZSBhbHNvIHJlbW92ZSB0aGUgQ0xJUEJPQVJEX0hFQURFUgogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSAiIjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBGaW5hbGx5IHdlIHJlbW92ZSB0aGUgaGlkZGVuIGNsYXNzIHRvIHRoZSBoZWFkZXIKICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIHRydWUpOwogIHJldHVybjsKfQpmdW5jdGlvbiBwb3BvdXRfY29udGFpbmVyKG9wdHMpIHsKICBjb25zdCBjbCA9IG9wdHM/LmNsOwogIGNvbnN0IHRhcmdldF9jb250YWluZXJfc2l6ZSA9IG9wdHM/LnRhcmdldF9jb250YWluZXJfc2l6ZSA/PyB7fTsKICBjb25zdCB0YXJnZXRfcGxvdF9zaXplID0gb3B0cz8udGFyZ2V0X3Bsb3Rfc2l6ZSA/PyB7fTsKICBpZiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIHJldHVybiB1bnBvcF9jb250YWluZXIoY2wpOwogIH0KICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgY2wgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdHJ1ZSk7CiAgLy8gV2UgZXh0cmFjdCB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjb250YWluZXIsIHNhdmUgdGhlbSBhbmQgZml4IHRoZW0KICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9ID0gQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogIGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfTsKICAvLyBXZSBzYXZlIHRoZSBjdXJyZW50IHBsb3Qgc2l6ZSBiZWZvcmUgd2UgcG9wIGFzIGl0IHdpbGwgZmlsbCB0aGUgc2NyZWVuCiAgY29uc3QgY3VycmVudF9wbG90X3NpemUgPSB7CiAgICB3aWR0aDogUExPVC5fZnVsbExheW91dC53aWR0aCwKICAgIGhlaWdodDogUExPVC5fZnVsbExheW91dC5oZWlnaHQsCiAgfTsKICAvLyBXZSBoYXZlIHRvIHNhdmUgdGhlIHBhZCBkYXRhIGJlZm9yZSBwb3BwaW5nIHNvIHdlIGNhbiByZXNpemUgcHJlY2lzZWx5CiAgY29uc3QgcGFkID0ge307CiAgcGFkLnVucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgdHJ1ZSk7CiAgcGFkLnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICAvLyBXZSBkbyB0b3AgYW5kIGxlZnQgYmFzZWQgb24gdGhlIGN1cnJlbnQgcmVjdAogIGZvciAoY29uc3Qga2V5IG9mIFsidG9wIiwgImxlZnQiXSkgewogICAgY29uc3Qgc3RhcnRfdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY29udGFpbmVyX3JlY3Rba2V5XTsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgZm9yIChjb25zdCBraW5kIG9mIFsicGFkZGluZyIsICJib3JkZXIiXSkgewogICAgICBvZmZzZXQgKz0gcGFkLnBvcHBlZFtraW5kXVtrZXldIC0gcGFkLnVucG9wcGVkW2tpbmRdW2tleV07CiAgICB9CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHN0YXJ0X3ZhbCAtIG9mZnNldCArICJweCI7CiAgICBpZiAoa2V5ID09PSAibGVmdCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIC8vIFdlIGNvbXB1dGUgdGhlIHdpZHRoIGFuZCBoZWlnaHQgZGVwZW5kaW5nIG9uIGV2ZW50dWFsIGNvbmZpZyBkYXRhCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoewogICAgd2lkdGg6CiAgICAgIHRhcmdldF9wbG90X3NpemUud2lkdGggPz8KICAgICAgY29uZmlnX3NwYW5zLndpZHRoLmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS5oZWlnaHQgPz8KICAgICAgY29uZmlnX3NwYW5zLmhlaWdodC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUuaGVpZ2h0LAogIH0pOwogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIGNvbnN0IHZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNzeltrZXldOwogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSB2YWwgKyAicHgiOwogICAgaWYgKGtleSA9PT0gIndpZHRoIikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCBmYWxzZSk7CiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgdW5wb3BfY29udGFpbmVyKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKfQoKQ09OVEFJTkVSLnBvcE91dCA9IHBvcG91dF9jb250YWluZXI7CgpmdW5jdGlvbiBEdWFsQ2xpY2soc2luZ2xlX2Z1bmMsIGRibF9mdW5jKSB7CiAgbGV0IG5jbGlja3MgPSAwOwogIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykgewogICAgbmNsaWNrcyArPSAxOwogICAgaWYgKG5jbGlja3MgPiAxKSB7CiAgICAgIGRibF9mdW5jKC4uLmFyZ3MpOwogICAgICBuY2xpY2tzID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIGRlbGF5KDMwMCkudGhlbigoKSA9PiB7CiAgICAgICAgaWYgKG5jbGlja3MgPT0gMSkgewogICAgICAgICAgc2luZ2xlX2Z1bmMoLi4uYXJncyk7CiAgICAgICAgfQogICAgICAgIG5jbGlja3MgPSAwOwogICAgICB9KTsKICAgIH0KICB9Owp9CgovLyBXZSByZW1vdmUgdGhlIGRlZmF1bHQgZG93bmxvYWQgaW1hZ2UgYnV0dG9uCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSwKICBbInRvSW1hZ2UiXQopOwovLyBXZSBhZGQgdGhlIGN1c3RvbSBidXR0b24gdG8gdGhlIG1vZGViYXIKcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkLAogIFsKICAgIHsKICAgICAgbmFtZTogIkNvcHkgUE5HIHRvIENsaXBib2FyZCIsCiAgICAgIGljb246IHsKICAgICAgICBoZWlnaHQ6IDUyMCwKICAgICAgICB3aWR0aDogNTIwLAogICAgICAgIHBhdGg6ICJNMjgwIDY0aDQwYzM1LjMgMCA2NCAyOC43IDY0IDY0VjQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEg2NGMtMzUuMyAwLTY0LTI4LjctNjQtNjRWMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0aDQwIDkuNkMxMjEgMjcuNSAxNTMuMyAwIDE5MiAwczcxIDI3LjUgNzguNCA2NEgyODB6TTY0IDExMmMtOC44IDAtMTYgNy4yLTE2IDE2VjQ0OGMwIDguOCA3LjIgMTYgMTYgMTZIMzIwYzguOCAwIDE2LTcuMiAxNi0xNlYxMjhjMC04LjgtNy4yLTE2LTE2LTE2SDMwNHYyNGMwIDEzLjMtMTAuNyAyNC0yNCAyNEgxOTIgMTA0Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNFYxMTJINjR6bTEyOC04YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHoiLAogICAgICB9LAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soY29weUltYWdlVG9DbGlwYm9hcmQsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKCk7CiAgICAgIH0pLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIkRvd25sb2FkIEltYWdlIiwKICAgICAgaWNvbjogUGxvdGx5Lkljb25zLmNhbWVyYSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKHNhdmVJbWFnZVRvRmlsZSwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoeyBjbDogImZpbGVzYXZlIiB9KTsKICAgICAgfSksCiAgICB9LAogIF0KKTsKCmZ1bmN0aW9uIGdldE9mZnNldERhdGEoZWwpIHsKICBsZXQgY3MgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgbnVsbCk7CiAgY29uc3Qgb2RhdGEgPSB7CiAgICBwYWRkaW5nOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgfSwKICAgIGJvcmRlcjogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgfQogIH07CiAgaWYgKGVsID09PSBQTE9UKSB7CiAgICAvLyBGb3IgdGhlIFBMT1Qgd2UgYWxzbyB3YW50IHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBvZmZzZXQKICAgIG9kYXRhLm9mZnNldCA9IHsKICAgICAgdG9wOiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldFRvcCA6IDAsCiAgICAgIGxlZnQ6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0TGVmdCA6IDAsCiAgICB9CiAgfQogIHJldHVybiBvZGF0YTsKfQpmdW5jdGlvbiBnZXRTaXplRGF0YSgpIHsKICBjb25zdCBkYXRhID0gewogICAgcGxvdF9wYWQ6IGdldE9mZnNldERhdGEoUExPVCksCiAgICBwbG90X3JlY3Q6IFBMT1QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgICBjb250YWluZXJfcGFkOiBnZXRPZmZzZXREYXRhKENPTlRBSU5FUiksCiAgICBjb250YWluZXJfcmVjdDogQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogIH07CiAgcmV0dXJuIGRhdGE7Cn0KZnVuY3Rpb24gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGNvbnN0IGNvbXB1dGVkX3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIGNvbnN0IG9mZnNldHMgPSBjb21wdXRlZF9zaXplLm9mZnNldHM7CgogIGNvbnN0IHBsb3RfZGF0YSA9IHsKICAgIHdpZHRoOiB3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiBoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfTsKCiAgcmV0dXJuIHsKICAgIHdpZHRoOiAod2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCkgKyBvZmZzZXRzLndpZHRoLAogICAgaGVpZ2h0OiAoaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0KSArIG9mZnNldHMuaGVpZ2h0LAogICAgbm9DaGFuZ2U6IHdpZHRoID09IGNvbXB1dGVkX3NpemUud2lkdGggJiYgaGVpZ2h0ID09IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH0KfQoKLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGNoYW5nZSB0aGUgY29udGFpbmVyIHNpemUgc28gdGhhdCB0aGUgcmVzdWx0aW5nIHBsb3Qgd2lsbCBiZSBtYXRjaGluZyB0aGUgcHJvdmlkZWQgc3BlY3MKZnVuY3Rpb24gY2hhbmdlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgaWYgKCFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgY29uc29sZS5sb2coIlRyaWVkIHRvIGNoYW5nZSBjb250YWluZXIgc2l6ZSB3aGVuIG5vdCBwb3BwZWQsIGlnbm9yaW5nIik7CiAgICByZXR1cm47CiAgfQoKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEpOwoKICBpZiAoY3N6Lm5vQ2hhbmdlKSB7CiAgICBjb25zb2xlLmxvZygiU2l6ZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50LCBpZ25vcmluZyIpOwogICAgcmV0dXJuCiAgfQogIC8vIFdlIGFyZSBub3cgZ29pbmcgdG8gc2V0IGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGNvbnRhaW5lcgogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gY3N6W2tleV0gKyAicHgiOwogIH0KfQovLyBXZSBub3cgY3JlYXRlIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgdXBkYXRlIHRoZSBwbG90IGJhc2VkIG9uIHRoZSB2YWx1ZXMgc3BlY2lmaWVkCmZ1bmN0aW9uIHVwZGF0ZUZyb21IZWFkZXIoKSB7CiAgY29uc3QgaGVhZGVyX2RhdGEgPSB7CiAgICBoZWlnaHQ6IGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUsCiAgICB3aWR0aDogY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlLAogIH07CiAgY2hhbmdlQ29udGFpbmVyU2l6ZShoZWFkZXJfZGF0YSk7Cn0KLy8gV2UgYXNzaWduIHRoaXMgZnVuY3Rpb24gdG8gdGhlIG9uYmx1ciBldmVudCBvZiB3aWR0aCBhbmQgaGVpZ2h0CmlmIChmaXJzdFJ1bikgewogIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLnVpX3NwYW4ub25ibHVyID0gKGUpID0+IHsKICAgICAgY29udGFpbmVyLnVpX3ZhbHVlID0gY29udGFpbmVyLnVpX3NwYW4udGV4dENvbnRlbnQ7CiAgICAgIHVwZGF0ZUZyb21IZWFkZXIoKTsKICAgIH07CiAgfQp9Ci8vIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIHBsb3Qgc2l6ZSB0byB1c2UgZm9yIHJlbGF5b3V0IGFzIGEgZnVuY3Rpb24gb2YgdGhlIGNvbnRhaW5lciBzaXplCmZ1bmN0aW9uIGNvbXB1dGVQbG90U2l6ZShkYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIC8vIFJlbW92ZSBQYWRkaW5nCiAgY29uc3QgeyBjb250YWluZXJfcGFkLCBwbG90X3BhZCwgY29udGFpbmVyX3JlY3QgfSA9IGRhdGE7CiAgY29uc3Qgb2Zmc2V0cyA9IHsKICAgIHdpZHRoOgogICAgICBwbG90X3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLndpZHRoICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LmxlZnQgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci53aWR0aCwKICAgIGhlaWdodDoKICAgICAgcGxvdF9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBwbG90X3BhZC5ib3JkZXIuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LnRvcCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci5oZWlnaHQsCiAgfTsKICBjb25zdCBzeiA9IHsKICAgIHdpZHRoOiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LndpZHRoIC0gb2Zmc2V0cy53aWR0aCksCiAgICBoZWlnaHQ6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3QuaGVpZ2h0IC0gb2Zmc2V0cy5oZWlnaHQpLAogICAgb2Zmc2V0cywKICB9OwogIHJldHVybiBzejsKfQoKLy8gQ3JlYXRlIHRoZSByZXNpemVPYnNlcnZlciB0byBtYWtlIHRoZSBwbG90IGV2ZW4gbW9yZSByZXNwb25zaXZlISA6bWFnaWM6CmNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7CiAgY29uc3Qgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpOwogIGNvbnN0IHtjb250YWluZXJfcmVjdCwgY29udGFpbmVyX3BhZH0gPSBzaXplRGF0YTsKICBsZXQgcGxvdF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICAvLyBXZSBzYXZlIHRoZSBoZWlnaHQgaW4gdGhlIFBMT1Qgb2JqZWN0CiAgUExPVC5jb250YWluZXJfaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0OwogIC8vIFdlIGRlYWwgd2l0aCBzb21lIHN0dWZmIGlmIHRoZSBjb250YWluZXIgaXMgcG9wcHBlZAogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSBjb250YWluZXJfcmVjdC53aWR0aCArICJweCI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gY29udGFpbmVyX3JlY3QubGVmdCArICJweCI7CiAgY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS5oZWlnaHQ7CiAgY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlID0gcGxvdF9zaXplLndpZHRoOwogIC8qIAoJCVRoZSBhZGRpdGlvbiBvZiB0aGUgaW52YWxpZCBhcmd1bWVudCBgcGx1dG9yZXNpemVgIHNlZW1zIHRvIGZpeCB0aGUgcHJvYmxlbSB3aXRoIGNhbGxpbmcgYHJlbGF5b3V0YCBzaW1wbHkgd2l0aCBge2F1dG9zaXplOiB0cnVlfWAgYXMgdXBkYXRlIGJyZWFraW5nIG1vdXNlIHJlbGF5b3V0IGV2ZW50cyB0cmFja2luZy4gCgkJU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wbG90bHkvcGxvdGx5LmpzL2lzc3Vlcy82MTU2IGZvciBkZXRhaWxzCgkJKi8KICBsZXQgY29uZmlnID0gewogICAgLy8gSWYgdGhpcyBpcyBwb3BwZWQgb3V0LCB3ZSBpZ25vcmUgdGhlIG9yaWdpbmFsIHdpZHRoL2hlaWdodAogICAgd2lkdGg6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX3dpZHRoKSA/PyBwbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX2hlaWdodCkgPz8gcGxvdF9zaXplLmhlaWdodCwKICAgIHBsdXRvcmVzaXplOiB0cnVlLAogIH07CiAgUGxvdGx5LnJlbGF5b3V0KFBMT1QsIGNvbmZpZykudGhlbigoKSA9PiB7CiAgICBpZiAocmVtb3ZlX2NvbnRhaW5lcl9zaXplICYmICFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBhdm9pZCB0aGUgZmlyc3QgcmVzaXplIHVwb24gcGxvdCBjcmVhdGlvbiB0byBhbHJlYWR5IGJlIHdpdGhvdXQgYSBmaXhlZCBoZWlnaHQKICAgICAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9ICIiOwogICAgICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICAgICAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmFsc2U7CiAgICB9CiAgfSk7Cn0pOwoKcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShDT05UQUlORVIpOwoKClBsb3RseS5yZWFjdChQTE9ULCBwbG90X29iaikudGhlbigoKSA9PiB7CgkvLyBBc3NpZ24gdGhlIFBsb3RseSBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhwbG90bHlfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1Qub24oa2V5LCBsaXN0ZW5lcikKCQl9Cgl9CgkvLyBBc3NpZ24gdGhlIEpTIGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKGpzX2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULmFkZEV2ZW50TGlzdGVuZXIoa2V5LCBsaXN0ZW5lciwgewoJCQkJc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbAoJCQl9KQoJCX0KCX0KfQopCgoKaW52YWxpZGF0aW9uLnRoZW4oKCkgPT4gewoJLy8gUmVtb3ZlIGFsbCBwbG90bHkgbGlzdGVuZXJzCglQTE9ULnJlbW92ZUFsbExpc3RlbmVycygpCgkvLyBSZW1vdmUgYWxsIEpTIGxpc3RlbmVycwoJY29udHJvbGxlci5hYm9ydCgpCgkvLyBSZW1vdmUgdGhlIHJlc2l6ZU9ic2VydmVyCglyZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCkKfSkKCgoKCQlyZXR1cm4gQ09OVEFJTkVSCgk8L3NjcmlwdD4KpG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv6MUhFcMsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQ5YTg4YTU0Yi1iY2M3LTQxYWQtOGU2MC1mNGQ0NTBkY2NiMmS5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4kvWZKtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5HZNWIzYjg0MDhjLTgxODEtMTFlZi0xNGViLWUxYzU2OWI4YmIyOS9mZDAxYmM3NGYxNTMxNmI3uGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJGM0N2E1MGI4LWM5MzAtNGM5Ni05YjM0LTI3NzIxODY2MzRkOYqmcXVldWVkwqRsb2dzk4ikbGluZf+jbXNnktmSVGhlIEdQVSBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQgYnV0IHRoZSBHUFUgaXMgbm90IGFjY2Vzc2libGUuCkRlZmF1bHRpbmcgYmFjayB0byB0aGUgQ1BVLiAoTm8gYWN0aW9uIGlzIHJlcXVpcmVkIGlmIHlvdSB3YW50IHRvIHJ1biBvbiB0aGUgQ1BVKS6qdGV4dC9wbGFpbqdjZWxsX2lk2SRjNDdhNTBiOC1jOTMwLTRjOTYtOWIzNC0yNzcyMTg2NjM0ZDmma3dhcmdzkKJpZLRLb21hTVJJQ29yZV9mNzNjNzBhZaRmaWxl2U0vaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL0tvbWFNUklDb3JlL3dQZ3M3L3NyYy9zaW11bGF0aW9uL0dQVUZ1bmN0aW9ucy5qbKVncm91cKxHUFVGdW5jdGlvbnOlbGV2ZWykSW5mb4ikbGluZf+jbXNnktkuUnVubmluZyBzaW11bGF0aW9uIGluIHRoZSBDUFUgd2l0aCAyIHRocmVhZChzKap0ZXh0L3BsYWlup2NlbGxfaWTZJGM0N2E1MGI4LWM5MzAtNGM5Ni05YjM0LTI3NzIxODY2MzRkOaZrd2FyZ3OVkqxrb21hX3ZlcnNpb26SqHYiMC44LjMiqnRleHQvcGxhaW6SqnNpbV9tZXRob2SShaZwcmVmaXixS29tYU1SSUNvcmUuQmxvY2ioZWxlbWVudHOQpHR5cGWmc3RydWN0rHByZWZpeF9zaG9ydKVCbG9jaKhvYmplY3RpZLBmZmZmZmZmZjJkZGU5OTJj2SFhcHBsaWNhdGlvbi92bmQucGx1dG8udHJlZStvYmplY3SSpXNwaW5zkqIyMKp0ZXh0L3BsYWlukqt0aW1lX3BvaW50c5KjMTE2qnRleHQvcGxhaW6SqmFkY19wb2ludHOSozEwMKp0ZXh0L3BsYWluomlktEtvbWFNUklDb3JlXzZiZmQ4OWVhpGZpbGXZTi9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvS29tYU1SSUNvcmUvd1Bnczcvc3JjL3NpbXVsYXRpb24vU2ltdWxhdG9yQ29yZS5qbKVncm91cK1TaW11bGF0b3JDb3JlpWxldmVspEluZm+IpGxpbmX/o21zZ5LaAmkNG1szMm1Qcm9ncmVzczogICA5JXzilojilojilojiloogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgRVRBOiAwOjAxOjI2G1szOW0bW0sNChtbMzRtICBzaW11bGF0ZWRfYmxvY2tzOiAgMhtbMzltG1tLDQobWzM0bSAgcmZfYmxvY2tzOiAgICAgICAgIDEbWzM5bRtbSw0KG1szNG0gIGFjcV9zYW1wbGVzOiAgICAgICAwG1szOW0bW0sNG1tBDRtbQQ0bW0EKCgoNG1tLG1tBDRtbSxtbQQ0bW0sbW0ENG1szMm1Qcm9ncmVzczogMTAwJXzilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojiloh8IFRpbWU6IDA6MDA6MTAbWzM5bRtbSw0KG1szNG0gIHNpbXVsYXRlZF9ibG9ja3M6ICAyMhtbMzltG1tLDQobWzM0bSAgcmZfYmxvY2tzOiAgICAgICAgIDMbWzM5bRtbSw0KG1szNG0gIGFjcV9zYW1wbGVzOiAgICAgICAxMDAbWzM5bRtbSwogMTEuMjk1NTc4IHNlY29uZHMgKDExLjk1IE0gYWxsb2NhdGlvbnM6IDc5MS4xMDYgTWlCLCAxLjM2JSBnYyB0aW1lLCAxNzEuOTIlIGNvbXBpbGF0aW9uIHRpbWUpCqp0ZXh0L3BsYWlup2NlbGxfaWTZJGM0N2E1MGI4LWM5MzAtNGM5Ni05YjM0LTI3NzIxODY2MzRkOaZrd2FyZ3OQomlktFBsdXRvUnVubmVyX2QxYWNiODFlpGZpbGXZUi9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUGx1dG8vUnZlR0gvc3JjL3J1bm5lci9QbHV0b1J1bm5lci9zcmMvUGx1dG9SdW5uZXIuamylZ3JvdXCrUGx1dG9SdW5uZXKlbGV2ZWyuTG9nTGV2ZWwoLTU1NSmncnVubmluZ8Kmb3V0cHV0hqRib2R52TxSYXdBY3F1aXNpdGlvbkRhdGFbU2VxTmFtZTogTm9OYW1lIHwgMSBQcm9maWxlKHMpIG9mIDEwMMOXMV2kbWltZap0ZXh0L3BsYWlurHJvb3Rhc3NpZ25lZaNyYXeybGFzdF9ydW5fdGltZXN0YW1wy0HZv6MSvM4tsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SRjNDdhNTBiOC1jOTMwLTRjOTYtOWIzNC0yNzcyMTg2NjM0ZDm5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc8AAAAFAs6Uz7VwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDQxZDE0ZGVjLWI4NTItNDMxNi1hZWZiLWMzZDA4ZmE0MzIxNoqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnaaokJPHNjcmlwdCBpZD0ncGxvdF8xJz4KCQkvLyBXZSBzdGFydCBieSBwdXR0aW5nIGFsbCB0aGUgdmFyaWFibGUgaW50ZXJwb2xhdGlvbiBoZXJlIGF0IHRoZSBiZWdpbm5pbmcKCQkvLyBXZSBoYXZlIHRvIGNvbnZlcnQgYWxsIHR5cGVkYXJyYXlzIGluIHRoZSBsYXlvdXQgdG8gbm9ybWFsIGFycmF5cy4gU2VlIElzc3VlICMyNQoJCS8vIFdlIHVzZSBsb2Rhc2ggZm9yIHRoaXMgZm9yIGNvbXBhY3RuZXNzCgkJZnVuY3Rpb24gcmVtb3ZlVHlwZWRBcnJheShvKSB7CgkJCXJldHVybiBfLmlzVHlwZWRBcnJheShvKSA/IEFycmF5LmZyb20obykgOgoJCQlfLmlzUGxhaW5PYmplY3QobykgPyBfLm1hcFZhbHVlcyhvLCByZW1vdmVUeXBlZEFycmF5KSA6IAoJCQlvCgkJfQoKCQkvLyBQdWJsaXNoIHRoZSBwbG90IG9iamVjdCB0byBKUwoJCWxldCBwbG90X29iaiA9IF8udXBkYXRlKC8qIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgQWJzdHJhY3RQbHV0b0RpbmdldGplcy5EaXNwbGF5LnB1Ymxpc2hlZF90b19qcyAqLyBnZXRQdWJsaXNoZWRPYmplY3QoImIzYjg0MDhjLTgxODEtMTFlZi0xNGViLWUxYzU2OWI4YmIyOS8xNGVjNDk4MjZhYmZiMDBlIiksICJsYXlvdXQiLCByZW1vdmVUeXBlZEFycmF5KQoJCS8vIEdldCB0aGUgcGxvdGx5IGxpc3RlbmVycwoJCWNvbnN0IHBsb3RseV9saXN0ZW5lcnMgPSB7fQoJCS8vIEdldCB0aGUgSlMgbGlzdGVuZXJzCgkJY29uc3QganNfbGlzdGVuZXJzID0ge30KCQkvLyBEZWFsIHdpdGggZXZlbnR1YWwgY3VzdG9tIGNsYXNzZXMKCQlsZXQgY3VzdG9tX2NsYXNzbGlzdCA9IFtdCgoKCQkvLyBMb2FkIHRoZSBwbG90bHkgbGlicmFyeQoJCWxldCBQbG90bHkgPSB1bmRlZmluZWQKCQl0cnkgewoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiLi9wbG90bHlqcy9wbG90bHlqcy0yLjI2LjIubWluLmpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfSBjYXRjaCAoZSkgewoJCQljb25zb2xlLmxvZygiTG9jYWwgbG9hZCBmYWlsZWQsIHRyeWluZyB3aXRoIHRoZSB3ZWIgZXNtLnNoIHZlcnNpb24iKQoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiaHR0cHM6Ly9lc20uc2gvdjEzNS9wbG90bHkuanMtZGlzdC1taW5AMi4yNi4yL2VzbmV4dC9wbG90bHkuanMtZGlzdC1taW4ubWpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfQoKCQkvLyBDaGVjayBpZiB3ZSBoYXZlIHRvIGZvcmNlIGxvY2FsIG1hdGhqYXggZm9udCBjYWNoZQoJCWlmIChmYWxzZSAmJiB3aW5kb3c/Lk1hdGhKYXg/LmNvbmZpZz8uc3ZnPy5mb250Q2FjaGUgPT09ICdnbG9iYWwnKSB7CgkJCXdpbmRvdy5NYXRoSmF4LmNvbmZpZy5zdmcuZm9udENhY2hlID0gJ2xvY2FsJwoJCX0KCgkJLy8gRmxhZyB0byBjaGVjayBpZiB0aGlzIGNlbGwgd2FzICBtYW51YWxseSByYW4gb3IgcmVhY3RpdmVseSByYW4KY29uc3QgZmlyc3RSdW4gPSB0aGlzID8gZmFsc2UgOiB0cnVlCmNvbnN0IENPTlRBSU5FUiA9IHRoaXMgPz8gaHRtbGA8ZGl2IGNsYXNzPSdwbHV0b3Bsb3RseS1jb250YWluZXInPmAKY29uc3QgUExPVCA9IENPTlRBSU5FUi5xdWVyeVNlbGVjdG9yKCcuanMtcGxvdGx5LXBsb3QnKSA/PyBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2PmApCmNvbnN0IHBhcmVudCA9IENPTlRBSU5FUi5wYXJlbnRFbGVtZW50Ci8vIFdlIHVzZSBhIGNvbnRyb2xsZXIgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVycyB1cG9uIGludmFsaWRhdGlvbgpjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpCi8vIFdlIGhhdmUgdG8gYWRkIHRoaXMgdG8ga2VlcCBzdXBwb3J0aW5nIEBiaW5kIHdpdGggdGhlIG9sZCBBUEkgdXNpbmcgUExPVApQTE9ULmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGUpID0+IHsKCUNPTlRBSU5FUi52YWx1ZSA9IFBMT1QudmFsdWUKCWlmIChlLmJ1YmJsZXMpIHsKCQlyZXR1cm4KCX0KCUNPTlRBSU5FUi5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnaW5wdXQnKSkKfSwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pCgoJLy8gVGhpcyBjcmVhdGUgdGhlIHN0eWxlIHN1YmRpdiBvbiBmaXJzdCBydW4KCWZpcnN0UnVuICYmIENPTlRBSU5FUi5hcHBlbmRDaGlsZChodG1sYAoJPHN0eWxlPgoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciB7CgkJd2lkdGg6IDEwMCU7CgkJaGVpZ2h0OiAxMDAlOwoJCW1pbi1oZWlnaHQ6IDA7CgkJbWluLXdpZHRoOiAwOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciAuanMtcGxvdGx5LXBsb3QgLnBsb3RseSBkaXYgewoJCW1hcmdpbjogMCBhdXRvOyAvLyBUaGlzIGNlbnRlcnMgdGhlIHBsb3QKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIucG9wcGVkLW91dCB7CgkJb3ZlcmZsb3c6IGF1dG87CgkJei1pbmRleDogMTAwMDsKCQlwb3NpdGlvbjogZml4ZWQ7CgkJcmVzaXplOiBib3RoOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMHB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwcHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciB7CgkJZGlzcGxheTogZmxleDsKCQlmbGV4LWZsb3c6IHJvdyB3cmFwOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDEycHg7CgkJcG9zaXRpb246IGZpeGVkOwoJCXotaW5kZXg6IDEwMDE7CgkJY3Vyc29yOiBtb3ZlOwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgLTEwMCUpOwoJCXBhZGRpbmc6IDVweDsKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIHNwYW4gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQlmbGV4OiAxCgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlci5oaWRkZW4gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuY2xpcGJvYXJkLXNwYW4gewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCX0KCS5jbGlwYm9hcmQtdmFsdWUgewoJCXBhZGRpbmctcmlnaHQ6IDVweDsKCQlwYWRkaW5nLWxlZnQ6IDJweDsKCQljdXJzb3I6IHRleHQ7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlmbGV4OiAwIDAgMTAwJTsKCQl0ZXh0LWFsaWduOiBjZW50ZXI7CgkJYm9yZGVyLXRvcDogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCW1hcmdpbi10b3A6IDVweDsKCQlkaXNwbGF5OiBub25lOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5maWxlc2F2ZSAuY2xpcGJvYXJkLXNwYW4uZmlsZW5hbWUgewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5jbGlwYm9hcmQtdmFsdWUuZmlsZW5hbWUgewoJCW1hcmdpbi1sZWZ0OiAzcHg7CgkJdGV4dC1hbGlnbjogbGVmdDsKCQltaW4td2lkdGg6IG1pbig2MCUsIG1pbi1jb250ZW50KTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogaW5saW5lLWZsZXg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IC5sYWJlbCB7CgkJZmxleDogMCAwIDA7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZvcm1hdCB7CgkJcG9zaXRpb246IHJlbGF0aXZlOwoJCWZsZXg6IDEgMCBhdXRvOwoJCW1pbi13aWR0aDogMzBweDsKCQltYXJnaW4tcmlnaHQ6IDEwcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJCWZsZXgtZmxvdzogY29sdW1uOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXBhZGRpbmctbGVmdDogM3B4OwoJCXotaW5kZXg6IDIwMDA7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgewoJCWN1cnNvcjogcG9pbnRlcjsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlwYWRkaW5nOiAzcHg7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTNweCwgLTZweCk7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5mb3JtYXQtb3B0aW9uOm5vdCguc2VsZWN0ZWQpIHsKCQltYXJnaW4tdG9wOiAzcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24uc2VsZWN0ZWQgewoJCW9yZGVyOiAtMTsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpob3ZlciB7CgkJYmFja2dyb3VuZC1jb2xvcjogdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7Cgl9CglzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZm9udC13ZWlnaHQ6IG5vcm1hbDsKCQljb2xvcjogdmFyKC0tcGx1dG8tb3V0cHV0LWNvbG9yKTsKCQlkaXNwbGF5OiBub25lOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgY2FsYygtMTAwJSAtIDEwcHgpKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkubGFiZWwgewoJCXVzZXItc2VsZWN0OiBub25lOwoJfQoJLmxhYmVsOmhvdmVyIHNwYW4uY29uZmlnLXZhbHVlIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJbWluLXdpZHRoOiAxNTBweDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5tYXRjaGluZy1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tbWFjcm8tY29sb3IpOwoJCWZvbnQtd2VpZ2h0OiBib2xkOwoJfQoJLmNsaXBib2FyZC1zcGFuLmRpZmZlcmVudC1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tdGFnLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KPC9zdHlsZT4KYCkKCmxldCBvcmlnaW5hbF9oZWlnaHQgPSBwbG90X29iai5sYXlvdXQuaGVpZ2h0CmxldCBvcmlnaW5hbF93aWR0aCA9IHBsb3Rfb2JqLmxheW91dC53aWR0aAovLyBGb3IgdGhlIGhlaWdodCB3ZSBoYXZlIHRvIGFsc28gcHV0IGEgZml4ZWQgdmFsdWUgaW4gY2FzZSB0aGUgcGxvdCBpcyBwdXQgb24gYSBub24tZml4ZWQtc2l6ZSBjb250YWluZXIgKGxpa2UgdGhlIGRlZmF1bHQgd3JhcHBlcikKLy8gV2UgZGVmaW5lIGEgdmFyaWFibGUgdG8gY2hlY2sgd2hldGhlciB3ZSBzdGlsbCBoYXZlIHRvIHJlbW92ZSB0aGUgZml4ZWQgaGVpZ2h0CmxldCByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmaXJzdFJ1bgpsZXQgY29udGFpbmVyX2hlaWdodCA9IG9yaWdpbmFsX2hlaWdodCA/PyBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPz8gNDAwCkNPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfaGVpZ2h0ICsgJ3B4JwoKLy8gV2UgY3JlYXRlIGEgUHJvbWlzZSB2ZXJzaW9uIG9mIHNldFRpbWVvdXQKZnVuY3Rpb24gZGVsYXkobXMpIHsKICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTsKfQoKLy8gV2UgaW1wb3J0IGludGVyYWN0IGZvciBkcmFnZ2luZy9yZXNpemluZwpjb25zdCB7IGRlZmF1bHQ6IGludGVyYWN0IH0gPSBhd2FpdCBpbXBvcnQoJ2h0dHBzOi8vZXNtLnNoL2ludGVyYWN0anNAMS4xMC4xOScpCgoKZnVuY3Rpb24gZ2V0SW1hZ2VPcHRpb25zKCkgewogIGNvbnN0IG8gPSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPz8ge307CiAgcmV0dXJuIHsKICAgIGZvcm1hdDogby5mb3JtYXQgPz8gInBuZyIsCiAgICB3aWR0aDogby53aWR0aCA/PyBvcmlnaW5hbF93aWR0aCwKICAgIGhlaWdodDogby5oZWlnaHQgPz8gb3JpZ2luYWxfaGVpZ2h0LAogICAgc2NhbGU6IG8uc2NhbGUgPz8gMSwKICAgIGZpbGVuYW1lOiBvLmZpbGVuYW1lID8/ICJuZXdwbG90IiwKICB9Owp9Cgpjb25zdCBDTElQQk9BUkRfSEVBREVSID0KICBDT05UQUlORVIucXVlcnlTZWxlY3RvcigiLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIiKSA/PwogIENPTlRBSU5FUi5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAiYWZ0ZXJiZWdpbiIsCiAgICBodG1sYDxkaXYgY2xhc3M9InBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgaGlkZGVuIj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZvcm1hdCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5Gb3JtYXQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZm9ybWF0Ij48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHdpZHRoIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPldpZHRoOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIHdpZHRoIj48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gaGVpZ2h0IgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkhlaWdodDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBoZWlnaHQiPjwvc3Bhbj5weDwvc3BhbgogICAgICA+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzY2FsZSIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5TY2FsZTo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBzY2FsZSI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHNldCI+U2V0PC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHVuc2V0Ij5VbnNldDwvYnV0dG9uPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gZmlsZW5hbWUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+RmlsZW5hbWU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZmlsZW5hbWUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgPC9kaXY+YAogICk7CgpmdW5jdGlvbiBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKSB7CiAgY29uc3QgdmFsaWRfY2xhc3NlcyA9IFsKICAgICJtaXNzaW5nLWNvbmZpZyIsCiAgICAibWF0Y2hpbmctY29uZmlnIiwKICAgICJkaWZmZXJlbnQtY29uZmlnIiwKICBdOwogIGZ1bmN0aW9uIHNldENsYXNzKGNsKSB7CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgdmFsaWRfY2xhc3NlcykgewogICAgICBjb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZShuYW1lLCBuYW1lID09IGNsKTsKICAgIH0KICB9CiAgLy8gV2UgdXNlIHRoZSBjdXN0b20gZ2V0dGVycyB3ZSdsbCBzZXQgdXAgaW4gdGhlIGNvbnRhaW5lcgogIGNvbnN0IHsgdWlfdmFsdWUsIGNvbmZpZ192YWx1ZSwgY29uZmlnX3NwYW4sIGtleSB9ID0gY29udGFpbmVyOwogIGlmIChjb25maWdfdmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgc2V0Q2xhc3MoIm1pc3NpbmctY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGlzIG5vdCBwcmVzZW50IGluIHRoZSBjb25maWcuYDsKICB9IGVsc2UgaWYgKHVpX3ZhbHVlID09IGNvbmZpZ192YWx1ZSkgewogICAgc2V0Q2xhc3MoIm1hdGNoaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgdGhlIHNhbWUgdmFsdWUgaW4gdGhlIGNvbmZpZyBhbmQgaW4gdGhlIGhlYWRlci5gOwogIH0gZWxzZSB7CiAgICBzZXRDbGFzcygiZGlmZmVyZW50LWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgYSBkaWZmZXJlbnQgdmFsdWUgKDxlbT4ke2NvbmZpZ192YWx1ZX08L2VtPikgaW4gdGhlIGNvbmZpZy5gOwogIH0KICAvLyBBZGQgaW5mbyBhYm91dCBzZXR0aW5nIGFuZCB1bnNldHRpbmcKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgb24gdGhlIGxhYmVsIDxlbT48Yj5vbmNlPC9iPjwvZW0+IHRvIHNldCB0aGUgY3VycmVudCBVSSB2YWx1ZSBpbiB0aGUgY29uZmlnLmAKICApOwogIGNvbmZpZ19zcGFuLmluc2VydEFkamFjZW50SFRNTCgKICAgICJiZWZvcmVlbmQiLAogICAgYDxicj5DbGljayA8ZW0+PGI+dHdpY2U8L2I+PC9lbT4gdG8gcmVtb3ZlIHRoaXMga2V5IGZyb20gdGhlIGNvbmZpZy5gCiAgKTsKfQoKY29uc3QgdmFsaWRfZm9ybWF0cyA9IFsicG5nIiwgInN2ZyIsICJ3ZWJwIiwgImpwZWciLCAiZnVsbC1qc29uIl07CmZ1bmN0aW9uIGluaXRpYWxpemVVSVZhbHVlU3BhbihzcGFuLCBrZXksIHZhbHVlKSB7CiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9IGtleSA9PT0gImZvcm1hdCIgPyAiZmFsc2UiIDogInRydWUiOwogIGxldCBwYXJzZSA9ICh4KSA9PiB4OwogIGxldCB1cGRhdGUgPSAoeCkgPT4gKHNwYW4udGV4dENvbnRlbnQgPSB4KTsKICBpZiAoa2V5ID09PSAid2lkdGgiIHx8IGtleSA9PT0gImhlaWdodCIpIHsKICAgIHBhcnNlID0gKHgpID0+IE1hdGgucm91bmQocGFyc2VGbG9hdCh4KSk7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJzY2FsZSIpIHsKICAgIHBhcnNlID0gcGFyc2VGbG9hdDsKICB9IGVsc2UgaWYgKGtleSA9PT0gImZvcm1hdCIpIHsKICAgIC8vIFdlIHJlbW92ZSBjb250ZW50RWRpdGFibGUKICAgIHNwYW4uY29udGVudEVkaXRhYmxlID0gImZhbHNlIjsKICAgIC8vIEhlcmUgd2UgZmlyc3QgYWRkIHRoZSBzdWJzcGFucyBmb3IgZWFjaCBvcHRpb24KICAgIGNvbnN0IG9wdHNfZGl2ID0gc3Bhbi5hcHBlbmRDaGlsZChodG1sYDxkaXYgY2xhc3M9ImZvcm1hdC1vcHRpb25zIj48L2Rpdj5gKTsKICAgIGZvciAoY29uc3QgZm10IG9mIHZhbGlkX2Zvcm1hdHMpIHsKICAgICAgY29uc3Qgb3B0ID0gb3B0c19kaXYuYXBwZW5kQ2hpbGQoCiAgICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iZm9ybWF0LW9wdGlvbiAke2ZtdH0iPiR7Zm10fTwvc3Bhbj5gCiAgICAgICk7CiAgICAgIG9wdC5vbmNsaWNrID0gKGUpID0+IHsKICAgICAgICBzcGFuLnZhbHVlID0gb3B0LnRleHRDb250ZW50OwogICAgICB9OwogICAgfQogICAgcGFyc2UgPSAoeCkgPT4gewogICAgICByZXR1cm4gdmFsaWRfZm9ybWF0cy5pbmNsdWRlcyh4KSA/IHggOiBsb2NhbFZhbHVlOwogICAgfTsKICAgIHVwZGF0ZSA9ICh4KSA9PiB7CiAgICAgIGZvciAoY29uc3Qgb3B0IG9mIG9wdHNfZGl2LmNoaWxkcmVuKSB7CiAgICAgICAgb3B0LmNsYXNzTGlzdC50b2dnbGUoInNlbGVjdGVkIiwgb3B0LnRleHRDb250ZW50ID09PSB4KTsKICAgICAgfQogICAgfTsKICB9IGVsc2UgewogICAgLy8gV2Ugb25seSBoYXZlIGZpbGVuYW1lIGhlcmUKICB9CiAgbGV0IGxvY2FsVmFsdWU7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwYW4sICJ2YWx1ZSIsIHsKICAgIGdldDogKCkgPT4gewogICAgICByZXR1cm4gbG9jYWxWYWx1ZTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgaWYgKHZhbCAhPT0gIiIpIHsKICAgICAgICBsb2NhbFZhbHVlID0gcGFyc2UodmFsKTsKICAgICAgfQogICAgICB1cGRhdGUobG9jYWxWYWx1ZSk7CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKICAvLyBXZSBhbHNvIGFzc2lnbiBhIGxpc3RlbmVyIHNvIHRoYXQgdGhlIGVkaXRhYmxlIGlzIGJsdXJyZWQgd2hlbiBlbnRlciBpcyBwcmVzc2VkCiAgc3Bhbi5vbmtleWRvd24gPSAoZSkgPT4gewogICAgaWYgKGUua2V5Q29kZSA9PT0gMTMpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBzcGFuLmJsdXIoKTsKICAgIH0KICB9OwogIHNwYW4udmFsdWUgPSB2YWx1ZTsKfQoKZnVuY3Rpb24gaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3BhbihzcGFuLCBrZXkpIHsKICAvLyBIZXJlIHdlIG1vc3RseSB3YW50IHRvIGRlZmluZSB0aGUgc2V0dGVyIGFuZCBnZXR0ZXIKICBjb25zdCBjb250YWluZXIgPSBzcGFuLmNsb3Nlc3QoIi5jbGlwYm9hcmQtc3BhbiIpOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgfSwKICAgIHNldDogKHZhbCkgPT4gewogICAgICAvLyBpZiB1bmRlZmluZWQgaXMgcGFzc2VkLCB3ZSByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIG9wdGlvbnMKICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZGVsZXRlIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgICB9IGVsc2UgewogICAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldID0gdmFsOwogICAgICB9CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKfQoKY29uc3QgY29uZmlnX3NwYW5zID0ge307CmZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGdldEltYWdlT3B0aW9ucygpKSkgewogIGNvbnN0IGNvbnRhaW5lciA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcihgLmNsaXBib2FyZC1zcGFuLiR7a2V5fWApOwogIGNvbnN0IGxhYmVsID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5sYWJlbCIpOwogIC8vIFdlIGdpdmUgdGhlIGxhYmVsIGEgZnVuY3Rpb24gdGhhdCBvbiBzaW5nbGUgY2xpY2sgd2lsbCBzZXQgdGhlIGN1cnJlbnQgdmFsdWUgYW5kIHdpdGggZG91YmxlIGNsaWNrIHdpbGwgdW5zZXQgaXQKICBsYWJlbC5vbmNsaWNrID0gRHVhbENsaWNrKAogICAgKCkgPT4gewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfSwKICAgIChlKSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJlIiwgZSk7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IHVuZGVmaW5lZDsKICAgIH0KICApOwogIGNvbnN0IHVpX3ZhbHVlX3NwYW4gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC12YWx1ZSIpOwogIGNvbnN0IGNvbmZpZ192YWx1ZV9zcGFuID0KICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuY29uZmlnLXZhbHVlIikgPz8KICAgIGxhYmVsLmluc2VydEFkamFjZW50RWxlbWVudCgKICAgICAgImFmdGVyYmVnaW4iLAogICAgICBodG1sYDxzcGFuIGNsYXNzPSJjb25maWctdmFsdWUiPjwvc3Bhbj5gCiAgICApOwogIC8vIEFzc2luZyB0aGUgdHdvIHNwYW5zIGFzIHByb3BlcnRpZXMgb2YgdGhlIGNvbnRhaW5pbmcgc3BhbgogIGNvbnRhaW5lci51aV9zcGFuID0gdWlfdmFsdWVfc3BhbjsKICBjb250YWluZXIuY29uZmlnX3NwYW4gPSBjb25maWdfdmFsdWVfc3BhbjsKICBjb250YWluZXIua2V5ID0ga2V5OwogIGNvbmZpZ19zcGFuc1trZXldID0gY29udGFpbmVyOwogIGlmIChmaXJzdFJ1bikgewogICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID0KICAgICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogICAgLy8gV2UgZG8gdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSB2YWx1ZSBzcGFuCiAgICBpbml0aWFsaXplVUlWYWx1ZVNwYW4odWlfdmFsdWVfc3Bhbiwga2V5LCB2YWx1ZSk7CiAgICAvLyBUaGVuIHdlIGluaXRpYWxpemUgdGhlIGNvbmZpZyB2YWx1ZQogICAgaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3Bhbihjb25maWdfdmFsdWVfc3Bhbiwga2V5KTsKICAgIC8vIFdlIHB1dCBzb21lIGNvbnZlbmllbmNlIGdldHRlcnMvc2V0dGVycwogICAgLy8gdWlfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgInVpX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IHVpX3ZhbHVlX3NwYW4udmFsdWUsCiAgICAgIHNldDogKHZhbCkgPT4gewogICAgICAgIHVpX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICAgIC8vIGNvbmZpZ192YWx1ZSBmb3J3YXJkCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAiY29uZmlnX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IGNvbmZpZ192YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSA9IHZhbDsKICAgICAgfSwKICAgIH0pOwogIH0KfQoKLy8gVGhlc2Ugb2JqZWN0cyB3aWxsIGNvbnRhaW4gdGhlIGRlZmF1bHQgdmFsdWUKCi8vIFRoaXMgY29kZSB1cGRhdGVzIHRoZSBpbWFnZSBvcHRpb25zIGluIHRoZSBQTE9UIGNvbmZpZyB3aXRoIHRoZSBwcm92aWRlZCBvbmVzCmZ1bmN0aW9uIHNldEltYWdlT3B0aW9ucyhvKSB7CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBvW2tleV07CiAgfQp9CmZ1bmN0aW9uIHVuc2V0SW1hZ2VPcHRpb25zKCkgewogIHNldEltYWdlT3B0aW9ucyh7fSk7Cn0KCmNvbnN0IHNldF9idXR0b24gPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtc3Bhbi5zZXQiKTsKY29uc3QgdW5zZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4udW5zZXQiKTsKaWYgKGZpcnN0UnVuKSB7CiAgc2V0X2J1dHRvbi5vbmNsaWNrID0gKGUpID0+IHsKICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfQogIH07CiAgdW5zZXRfYnV0dG9uLm9uY2xpY2sgPSB1bnNldEltYWdlT3B0aW9uczsKfQoKLy8gV2UgYWRkIGEgZnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIGNsaXBib2FyZCBpcyBwb3BwZWQgb3V0CkNPTlRBSU5FUi5pc1BvcHBlZE91dCA9ICgpID0+IHsKICByZXR1cm4gQ09OVEFJTkVSLmNsYXNzTGlzdC5jb250YWlucygicG9wcGVkLW91dCIpOwp9OwoKQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNlZG93biA9IGZ1bmN0aW9uIChldmVudCkgewogIGlmIChldmVudC50YXJnZXQubWF0Y2hlcygic3Bhbi5jbGlwYm9hcmQtdmFsdWUiKSkgewogICAgY29uc29sZS5sb2coIldlIGRvbid0IG1vdmUhIik7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IHN0YXJ0ID0gewogICAgbGVmdDogcGFyc2VGbG9hdChDT05UQUlORVIuc3R5bGUubGVmdCksCiAgICB0b3A6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLnRvcCksCiAgICBYOiBldmVudC5wYWdlWCwKICAgIFk6IGV2ZW50LnBhZ2VZLAogIH07CiAgZnVuY3Rpb24gbW92ZUF0KGV2ZW50LCBzdGFydCkgewogICAgY29uc3QgdG9wID0gZXZlbnQucGFnZVkgLSBzdGFydC5ZICsgc3RhcnQudG9wICsgInB4IjsKICAgIGNvbnN0IGxlZnQgPSBldmVudC5wYWdlWCAtIHN0YXJ0LlggKyBzdGFydC5sZWZ0ICsgInB4IjsKICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUudG9wID0gdG9wOwogIH0KCiAgLy8gbW92ZSBvdXIgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGJhbGwgdW5kZXIgdGhlIHBvaW50ZXIKICBtb3ZlQXQoZXZlbnQsIHN0YXJ0KTsKICBmdW5jdGlvbiBvbk1vdXNlTW92ZShldmVudCkgewogICAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgfQoKICAvLyBXZSB1c2UgdGhpcyB0byByZW1vdmUgdGhlIG1vdXNlbW92ZSB3aGVuIGNsaWNraW5nIG91dHNpZGUgb2YgdGhlIGNvbnRhaW5lcgogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CgogIC8vIG1vdmUgdGhlIGNvbnRhaW5lciBvbiBtb3VzZW1vdmUKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCBvbk1vdXNlTW92ZSwgewogICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCwKICB9KTsKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICBjbGVhblVwKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKCiAgZnVuY3Rpb24gY2xlYW5VcCgpIHsKICAgIGNvbnNvbGUubG9nKCJjbGVhbmluZyB1cCB0aGUgcGxvdCBtb3ZlIGxpc3RlbmVyIik7CiAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICBDTElQQk9BUkRfSEVBREVSLm9ubW91c2V1cCA9IG51bGw7CiAgfQoKICAvLyAoMykgZHJvcCB0aGUgYmFsbCwgcmVtb3ZlIHVubmVlZGVkIGhhbmRsZXJzCiAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBjbGVhblVwOwp9OwoKZnVuY3Rpb24gc2VuZFRvQ2xpcGJvYXJkKGJsb2IpIHsKICBpZiAoIW5hdmlnYXRvci5jbGlwYm9hcmQpIHsKICAgIGFsZXJ0KAogICAgICAiVGhlIENsaXBib2FyZCBBUEkgZG9lcyBub3Qgc2VlbSB0byBiZSBhdmFpbGFibGUsIG1ha2Ugc3VyZSB0aGUgUGx1dG8gbm90ZWJvb2sgaXMgYmVpbmcgdXNlZCBmcm9tIGVpdGhlciBsb2NhbGhvc3Qgb3IgYW4gaHR0cHMgc291cmNlLiIKICAgICk7CiAgfQogIG5hdmlnYXRvci5jbGlwYm9hcmQKICAgIC53cml0ZShbCiAgICAgIG5ldyBDbGlwYm9hcmRJdGVtKHsKICAgICAgICAvLyBUaGUga2V5IGlzIGRldGVybWluZWQgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIGJsb2IncyB0eXBlLgogICAgICAgIFtibG9iLnR5cGVdOiBibG9iLAogICAgICB9KSwKICAgIF0pCiAgICAudGhlbigKICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgIGNvbnNvbGUubG9nKCJBc3luYzogQ29weWluZyB0byBjbGlwYm9hcmQgd2FzIHN1Y2Nlc3NmdWwhIik7CiAgICAgIH0sCiAgICAgIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJBc3luYzogQ291bGQgbm90IGNvcHkgdGV4dDogIiwgZXJyKTsKICAgICAgfQogICAgKTsKfQoKZnVuY3Rpb24gY29weUltYWdlVG9DbGlwYm9hcmQoKSB7CiAgLy8gV2UgZXh0cmFjdCB0aGUgaW1hZ2Ugb3B0aW9ucyBmcm9tIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzIChpZiB0aGV5IGV4aXN0KQogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuIFdlIGFsc28gaWdub3JlIGZvcm1hdCBiZWNhdXNlIHRoZSBjbGlwYm9hcmQgb25seSBzdXBwb3J0cyBwbmcuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwga2V5ID09PSAiZm9ybWF0IikgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbmZpZ1trZXldID0gdmFsOwogIH0KICBQbG90bHkudG9JbWFnZShQTE9ULCBjb25maWcpLnRoZW4oZnVuY3Rpb24gKGRhdGFVcmwpIHsKICAgIGZldGNoKGRhdGFVcmwpCiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5ibG9iKCkpCiAgICAgIC50aGVuKChibG9iKSA9PiB7CiAgICAgICAgY29uc3QgcGFzdGVfcmVjZWl2ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdwYXN0ZS1yZWNlaXZlci5wbHV0b3Bsb3RseScpCiAgICAgICAgaWYgKHBhc3RlX3JlY2VpdmVyKSB7CiAgICAgICAgICBwYXN0ZV9yZWNlaXZlci5hdHRhY2hJbWFnZShkYXRhVXJsLCBDT05UQUlORVIpCiAgICAgICAgfQogICAgICAgIHNlbmRUb0NsaXBib2FyZChibG9iKQogICAgICB9KTsKICB9KTsKfQoKZnVuY3Rpb24gc2F2ZUltYWdlVG9GaWxlKCkgewogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LmRvd25sb2FkSW1hZ2UoUExPVCwgY29uZmlnKTsKfQoKbGV0IGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwLCB0b3A6IDAsIGxlZnQ6IDAgfTsKZnVuY3Rpb24gdW5wb3BfY29udGFpbmVyKGNsKSB7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCBmYWxzZSk7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoY2wsIGZhbHNlKTsKICAvLyBXZSBmaXggdGhlIGhlaWdodCBiYWNrIHRvIHRoZSB2YWx1ZSBpdCBoYWQgYmVmb3JlIHBvcG91dCwgYWxzbyBzZXR0aW5nIHRoZSBmbGFnIHRvIHNpZ25hbCB0aGF0IHVwb24gZmlyc3QgcmVzaXplIHdlIHJlbW92ZSB0aGUgZml4ZWQgaW5saW5lLXN0eWxlCiAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9IGNvbnRhaW5lcl9yZWN0LmhlaWdodCArICJweCI7CiAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gdHJ1ZTsKICAvLyBXZSBzZXQgdGhlIG90aGVyIGZpeGVkIGlubGluZS1zdHlsZXMgdG8gbnVsbAogIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogIENPTlRBSU5FUi5zdHlsZS50b3AgPSAiIjsKICBDT05UQUlORVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIFdlIGFsc28gcmVtb3ZlIHRoZSBDTElQQk9BUkRfSEVBREVSCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9ICIiOwogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIEZpbmFsbHkgd2UgcmVtb3ZlIHRoZSBoaWRkZW4gY2xhc3MgdG8gdGhlIGhlYWRlcgogIENMSVBCT0FSRF9IRUFERVIuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgdHJ1ZSk7CiAgcmV0dXJuOwp9CmZ1bmN0aW9uIHBvcG91dF9jb250YWluZXIob3B0cykgewogIGNvbnN0IGNsID0gb3B0cz8uY2w7CiAgY29uc3QgdGFyZ2V0X2NvbnRhaW5lcl9zaXplID0gb3B0cz8udGFyZ2V0X2NvbnRhaW5lcl9zaXplID8/IHt9OwogIGNvbnN0IHRhcmdldF9wbG90X3NpemUgPSBvcHRzPy50YXJnZXRfcGxvdF9zaXplID8/IHt9OwogIGlmIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgcmV0dXJuIHVucG9wX2NvbnRhaW5lcihjbCk7CiAgfQogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBjbCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0cnVlKTsKICAvLyBXZSBleHRyYWN0IHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNvbnRhaW5lciwgc2F2ZSB0aGVtIGFuZCBmaXggdGhlbQogIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH0gPSBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgY29udGFpbmVyX3JlY3QgPSB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9OwogIC8vIFdlIHNhdmUgdGhlIGN1cnJlbnQgcGxvdCBzaXplIGJlZm9yZSB3ZSBwb3AgYXMgaXQgd2lsbCBmaWxsIHRoZSBzY3JlZW4KICBjb25zdCBjdXJyZW50X3Bsb3Rfc2l6ZSA9IHsKICAgIHdpZHRoOiBQTE9ULl9mdWxsTGF5b3V0LndpZHRoLAogICAgaGVpZ2h0OiBQTE9ULl9mdWxsTGF5b3V0LmhlaWdodCwKICB9OwogIC8vIFdlIGhhdmUgdG8gc2F2ZSB0aGUgcGFkIGRhdGEgYmVmb3JlIHBvcHBpbmcgc28gd2UgY2FuIHJlc2l6ZSBwcmVjaXNlbHkKICBjb25zdCBwYWQgPSB7fTsKICBwYWQudW5wb3BwZWQgPSBnZXRTaXplRGF0YSgpLmNvbnRhaW5lcl9wYWQ7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCB0cnVlKTsKICBwYWQucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIC8vIFdlIGRvIHRvcCBhbmQgbGVmdCBiYXNlZCBvbiB0aGUgY3VycmVudCByZWN0CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ0b3AiLCAibGVmdCJdKSB7CiAgICBjb25zdCBzdGFydF92YWwgPSB0YXJnZXRfY29udGFpbmVyX3NpemVba2V5XSA/PyBjb250YWluZXJfcmVjdFtrZXldOwogICAgbGV0IG9mZnNldCA9IDA7CiAgICBmb3IgKGNvbnN0IGtpbmQgb2YgWyJwYWRkaW5nIiwgImJvcmRlciJdKSB7CiAgICAgIG9mZnNldCArPSBwYWQucG9wcGVkW2tpbmRdW2tleV0gLSBwYWQudW5wb3BwZWRba2luZF1ba2V5XTsKICAgIH0KICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gc3RhcnRfdmFsIC0gb2Zmc2V0ICsgInB4IjsKICAgIGlmIChrZXkgPT09ICJsZWZ0IikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgLy8gV2UgY29tcHV0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBkZXBlbmRpbmcgb24gZXZlbnR1YWwgY29uZmlnIGRhdGEKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7CiAgICB3aWR0aDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS53aWR0aCA/PwogICAgICBjb25maWdfc3BhbnMud2lkdGguY29uZmlnX3ZhbHVlID8/CiAgICAgIGN1cnJlbnRfcGxvdF9zaXplLndpZHRoLAogICAgaGVpZ2h0OgogICAgICB0YXJnZXRfcGxvdF9zaXplLmhlaWdodCA/PwogICAgICBjb25maWdfc3BhbnMuaGVpZ2h0LmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS5oZWlnaHQsCiAgfSk7CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgY29uc3QgdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY3N6W2tleV07CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHZhbCArICJweCI7CiAgICBpZiAoa2V5ID09PSAid2lkdGgiKSB7CiAgICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGVba2V5XSA9IENPTlRBSU5FUi5zdHlsZVtrZXldOwogICAgfQogIH0KICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIGZhbHNlKTsKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICB1bnBvcF9jb250YWluZXIoKTsKICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9LAogICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0KICApOwp9CgpDT05UQUlORVIucG9wT3V0ID0gcG9wb3V0X2NvbnRhaW5lcjsKCmZ1bmN0aW9uIER1YWxDbGljayhzaW5nbGVfZnVuYywgZGJsX2Z1bmMpIHsKICBsZXQgbmNsaWNrcyA9IDA7CiAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7CiAgICBuY2xpY2tzICs9IDE7CiAgICBpZiAobmNsaWNrcyA+IDEpIHsKICAgICAgZGJsX2Z1bmMoLi4uYXJncyk7CiAgICAgIG5jbGlja3MgPSAwOwogICAgfSBlbHNlIHsKICAgICAgZGVsYXkoMzAwKS50aGVuKCgpID0+IHsKICAgICAgICBpZiAobmNsaWNrcyA9PSAxKSB7CiAgICAgICAgICBzaW5nbGVfZnVuYyguLi5hcmdzKTsKICAgICAgICB9CiAgICAgICAgbmNsaWNrcyA9IDA7CiAgICAgIH0pOwogICAgfQogIH07Cn0KCi8vIFdlIHJlbW92ZSB0aGUgZGVmYXVsdCBkb3dubG9hZCBpbWFnZSBidXR0b24KcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9SZW1vdmUgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlLAogIFsidG9JbWFnZSJdCik7Ci8vIFdlIGFkZCB0aGUgY3VzdG9tIGJ1dHRvbiB0byB0aGUgbW9kZWJhcgpwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb0FkZCA9IF8udW5pb24oCiAgcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQsCiAgWwogICAgewogICAgICBuYW1lOiAiQ29weSBQTkcgdG8gQ2xpcGJvYXJkIiwKICAgICAgaWNvbjogewogICAgICAgIGhlaWdodDogNTIwLAogICAgICAgIHdpZHRoOiA1MjAsCiAgICAgICAgcGF0aDogIk0yODAgNjRoNDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRWNDQ4YzAgMzUuMy0yOC43IDY0LTY0IDY0SDY0Yy0zNS4zIDAtNjQtMjguNy02NC02NFYxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRoNDAgOS42QzEyMSAyNy41IDE1My4zIDAgMTkyIDBzNzEgMjcuNSA3OC40IDY0SDI4MHpNNjQgMTEyYy04LjggMC0xNiA3LjItMTYgMTZWNDQ4YzAgOC44IDcuMiAxNiAxNiAxNkgzMjBjOC44IDAgMTYtNy4yIDE2LTE2VjEyOGMwLTguOC03LjItMTYtMTYtMTZIMzA0djI0YzAgMTMuMy0xMC43IDI0LTI0IDI0SDE5MiAxMDRjLTEzLjMgMC0yNC0xMC43LTI0LTI0VjExMkg2NHptMTI4LThhMjQgMjQgMCAxIDAgMC00OCAyNCAyNCAwIDEgMCAwIDQ4eiIsCiAgICAgIH0sCiAgICAgIGRpcmVjdGlvbjogInVwIiwKICAgICAgY2xpY2s6IER1YWxDbGljayhjb3B5SW1hZ2VUb0NsaXBib2FyZCwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoKTsKICAgICAgfSksCiAgICB9LAogICAgewogICAgICBuYW1lOiAiRG93bmxvYWQgSW1hZ2UiLAogICAgICBpY29uOiBQbG90bHkuSWNvbnMuY2FtZXJhLAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soc2F2ZUltYWdlVG9GaWxlLCAoKSA9PiB7CiAgICAgICAgcG9wb3V0X2NvbnRhaW5lcih7IGNsOiAiZmlsZXNhdmUiIH0pOwogICAgICB9KSwKICAgIH0sCiAgXQopOwoKZnVuY3Rpb24gZ2V0T2Zmc2V0RGF0YShlbCkgewogIGxldCBjcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsLCBudWxsKTsKICBjb25zdCBvZGF0YSA9IHsKICAgIHBhZGRpbmc6IHsKICAgICAgbGVmdDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSwKICAgICAgYm90dG9tOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSArIHBhcnNlRmxvYXQoY3MucGFkZGluZ0JvdHRvbSksCiAgICB9LAogICAgYm9yZGVyOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyTGVmdFdpZHRoKSwKICAgICAgcmlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyUmlnaHRXaWR0aCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5ib3JkZXJUb3BXaWR0aCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCkgKyBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICB9CiAgfTsKICBpZiAoZWwgPT09IFBMT1QpIHsKICAgIC8vIEZvciB0aGUgUExPVCB3ZSBhbHNvIHdhbnQgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIG9mZnNldAogICAgb2RhdGEub2Zmc2V0ID0gewogICAgICB0b3A6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0VG9wIDogMCwKICAgICAgbGVmdDogUExPVC5vZmZzZXRQYXJlbnQgPT0gQ09OVEFJTkVSID8gUExPVC5vZmZzZXRMZWZ0IDogMCwKICAgIH0KICB9CiAgcmV0dXJuIG9kYXRhOwp9CmZ1bmN0aW9uIGdldFNpemVEYXRhKCkgewogIGNvbnN0IGRhdGEgPSB7CiAgICBwbG90X3BhZDogZ2V0T2Zmc2V0RGF0YShQTE9UKSwKICAgIHBsb3RfcmVjdDogUExPVC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICAgIGNvbnRhaW5lcl9wYWQ6IGdldE9mZnNldERhdGEoQ09OVEFJTkVSKSwKICAgIGNvbnRhaW5lcl9yZWN0OiBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgfTsKICByZXR1cm4gZGF0YTsKfQpmdW5jdGlvbiBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgY29uc3QgY29tcHV0ZWRfc2l6ZSA9IGNvbXB1dGVQbG90U2l6ZShzaXplRGF0YSk7CiAgY29uc3Qgb2Zmc2V0cyA9IGNvbXB1dGVkX3NpemUub2Zmc2V0czsKCiAgY29uc3QgcGxvdF9kYXRhID0gewogICAgd2lkdGg6IHdpZHRoID8/IGNvbXB1dGVkX3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IGhlaWdodCA/PyBjb21wdXRlZF9zaXplLmhlaWdodCwKICB9OwoKICByZXR1cm4gewogICAgd2lkdGg6ICh3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoKSArIG9mZnNldHMud2lkdGgsCiAgICBoZWlnaHQ6IChoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQpICsgb2Zmc2V0cy5oZWlnaHQsCiAgICBub0NoYW5nZTogd2lkdGggPT0gY29tcHV0ZWRfc2l6ZS53aWR0aCAmJiBoZWlnaHQgPT0gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfQp9CgovLyBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hhbmdlIHRoZSBjb250YWluZXIgc2l6ZSBzbyB0aGF0IHRoZSByZXN1bHRpbmcgcGxvdCB3aWxsIGJlIG1hdGNoaW5nIHRoZSBwcm92aWRlZCBzcGVjcwpmdW5jdGlvbiBjaGFuZ2VDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICBpZiAoIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICBjb25zb2xlLmxvZygiVHJpZWQgdG8gY2hhbmdlIGNvbnRhaW5lciBzaXplIHdoZW4gbm90IHBvcHBlZCwgaWdub3JpbmciKTsKICAgIHJldHVybjsKICB9CgogIGNvbnN0IGNzeiA9IGNvbXB1dGVDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSk7CgogIGlmIChjc3oubm9DaGFuZ2UpIHsKICAgIGNvbnNvbGUubG9nKCJTaXplIGlzIHRoZSBzYW1lIGFzIGN1cnJlbnQsIGlnbm9yaW5nIik7CiAgICByZXR1cm4KICB9CiAgLy8gV2UgYXJlIG5vdyBnb2luZyB0byBzZXQgaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgY29udGFpbmVyCiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSBjc3pba2V5XSArICJweCI7CiAgfQp9Ci8vIFdlIG5vdyBjcmVhdGUgdGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCB1cGRhdGUgdGhlIHBsb3QgYmFzZWQgb24gdGhlIHZhbHVlcyBzcGVjaWZpZWQKZnVuY3Rpb24gdXBkYXRlRnJvbUhlYWRlcigpIHsKICBjb25zdCBoZWFkZXJfZGF0YSA9IHsKICAgIGhlaWdodDogY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSwKICAgIHdpZHRoOiBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUsCiAgfTsKICBjaGFuZ2VDb250YWluZXJTaXplKGhlYWRlcl9kYXRhKTsKfQovLyBXZSBhc3NpZ24gdGhpcyBmdW5jdGlvbiB0byB0aGUgb25ibHVyIGV2ZW50IG9mIHdpZHRoIGFuZCBoZWlnaHQKaWYgKGZpcnN0UnVuKSB7CiAgZm9yIChjb25zdCBjb250YWluZXIgb2YgT2JqZWN0LnZhbHVlcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIudWlfc3Bhbi5vbmJsdXIgPSAoZSkgPT4gewogICAgICBjb250YWluZXIudWlfdmFsdWUgPSBjb250YWluZXIudWlfc3Bhbi50ZXh0Q29udGVudDsKICAgICAgdXBkYXRlRnJvbUhlYWRlcigpOwogICAgfTsKICB9Cn0KLy8gVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgcGxvdCBzaXplIHRvIHVzZSBmb3IgcmVsYXlvdXQgYXMgYSBmdW5jdGlvbiBvZiB0aGUgY29udGFpbmVyIHNpemUKZnVuY3Rpb24gY29tcHV0ZVBsb3RTaXplKGRhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgLy8gUmVtb3ZlIFBhZGRpbmcKICBjb25zdCB7IGNvbnRhaW5lcl9wYWQsIHBsb3RfcGFkLCBjb250YWluZXJfcmVjdCB9ID0gZGF0YTsKICBjb25zdCBvZmZzZXRzID0gewogICAgd2lkdGg6CiAgICAgIHBsb3RfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBwbG90X3BhZC5ib3JkZXIud2lkdGggKwogICAgICBwbG90X3BhZC5vZmZzZXQubGVmdCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy53aWR0aCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLndpZHRoLAogICAgaGVpZ2h0OgogICAgICBwbG90X3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIHBsb3RfcGFkLmJvcmRlci5oZWlnaHQgKwogICAgICBwbG90X3BhZC5vZmZzZXQudG9wICsKICAgICAgY29udGFpbmVyX3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLmhlaWdodCwKICB9OwogIGNvbnN0IHN6ID0gewogICAgd2lkdGg6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3Qud2lkdGggLSBvZmZzZXRzLndpZHRoKSwKICAgIGhlaWdodDogTWF0aC5yb3VuZChjb250YWluZXJfcmVjdC5oZWlnaHQgLSBvZmZzZXRzLmhlaWdodCksCiAgICBvZmZzZXRzLAogIH07CiAgcmV0dXJuIHN6Owp9CgovLyBDcmVhdGUgdGhlIHJlc2l6ZU9ic2VydmVyIHRvIG1ha2UgdGhlIHBsb3QgZXZlbiBtb3JlIHJlc3BvbnNpdmUhIDptYWdpYzoKY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHsKICBjb25zdCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCk7CiAgY29uc3Qge2NvbnRhaW5lcl9yZWN0LCBjb250YWluZXJfcGFkfSA9IHNpemVEYXRhOwogIGxldCBwbG90X3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIC8vIFdlIHNhdmUgdGhlIGhlaWdodCBpbiB0aGUgUExPVCBvYmplY3QKICBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQ7CiAgLy8gV2UgZGVhbCB3aXRoIHNvbWUgc3R1ZmYgaWYgdGhlIGNvbnRhaW5lciBpcyBwb3BwcGVkCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9IGNvbnRhaW5lcl9yZWN0LndpZHRoICsgInB4IjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBjb250YWluZXJfcmVjdC5sZWZ0ICsgInB4IjsKICBjb25maWdfc3BhbnMuaGVpZ2h0LnVpX3ZhbHVlID0gcGxvdF9zaXplLmhlaWdodDsKICBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUgPSBwbG90X3NpemUud2lkdGg7CiAgLyogCgkJVGhlIGFkZGl0aW9uIG9mIHRoZSBpbnZhbGlkIGFyZ3VtZW50IGBwbHV0b3Jlc2l6ZWAgc2VlbXMgdG8gZml4IHRoZSBwcm9ibGVtIHdpdGggY2FsbGluZyBgcmVsYXlvdXRgIHNpbXBseSB3aXRoIGB7YXV0b3NpemU6IHRydWV9YCBhcyB1cGRhdGUgYnJlYWtpbmcgbW91c2UgcmVsYXlvdXQgZXZlbnRzIHRyYWNraW5nLiAKCQlTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Bsb3RseS9wbG90bHkuanMvaXNzdWVzLzYxNTYgZm9yIGRldGFpbHMKCQkqLwogIGxldCBjb25maWcgPSB7CiAgICAvLyBJZiB0aGlzIGlzIHBvcHBlZCBvdXQsIHdlIGlnbm9yZSB0aGUgb3JpZ2luYWwgd2lkdGgvaGVpZ2h0CiAgICB3aWR0aDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfd2lkdGgpID8/IHBsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfaGVpZ2h0KSA/PyBwbG90X3NpemUuaGVpZ2h0LAogICAgcGx1dG9yZXNpemU6IHRydWUsCiAgfTsKICBQbG90bHkucmVsYXlvdXQoUExPVCwgY29uZmlnKS50aGVuKCgpID0+IHsKICAgIGlmIChyZW1vdmVfY29udGFpbmVyX3NpemUgJiYgIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIHRoZSBmaXJzdCByZXNpemUgdXBvbiBwbG90IGNyZWF0aW9uIHRvIGFscmVhZHkgYmUgd2l0aG91dCBhIGZpeGVkIGhlaWdodAogICAgICBDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gIiI7CiAgICAgIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogICAgICByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmYWxzZTsKICAgIH0KICB9KTsKfSk7CgpyZXNpemVPYnNlcnZlci5vYnNlcnZlKENPTlRBSU5FUik7CgoKUGxvdGx5LnJlYWN0KFBMT1QsIHBsb3Rfb2JqKS50aGVuKCgpID0+IHsKCS8vIEFzc2lnbiB0aGUgUGxvdGx5IGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKHBsb3RseV9saXN0ZW5lcnMpKSB7CgkJZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcl92ZWMpIHsKCQkJUExPVC5vbihrZXksIGxpc3RlbmVyKQoJCX0KCX0KCS8vIEFzc2lnbiB0aGUgSlMgZXZlbnQgbGlzdGVuZXJzCglmb3IgKGNvbnN0IFtrZXksIGxpc3RlbmVyX3ZlY10gb2YgT2JqZWN0LmVudHJpZXMoanNfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1QuYWRkRXZlbnRMaXN0ZW5lcihrZXksIGxpc3RlbmVyLCB7CgkJCQlzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsCgkJCX0pCgkJfQoJfQp9CikKCgppbnZhbGlkYXRpb24udGhlbigoKSA9PiB7CgkvLyBSZW1vdmUgYWxsIHBsb3RseSBsaXN0ZW5lcnMKCVBMT1QucmVtb3ZlQWxsTGlzdGVuZXJzKCkKCS8vIFJlbW92ZSBhbGwgSlMgbGlzdGVuZXJzCgljb250cm9sbGVyLmFib3J0KCkKCS8vIFJlbW92ZSB0aGUgcmVzaXplT2JzZXJ2ZXIKCXJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKQp9KQoKCgoJCXJldHVybiBDT05UQUlORVIKCTwvc2NyaXB0PgqkbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/oxSRkEewcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJDQxZDE0ZGVjLWI4NTItNDMxNi1hZWZiLWMzZDA4ZmE0MzIxNrlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgceRmW1cHVibGlzaGVkX29iamVjdF9rZXlzkdk1YjNiODQwOGMtODE4MS0xMWVmLTE0ZWItZTFjNTY5YjhiYjI5LzE0ZWM0OTgyNmFiZmIwMGW4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkZWU3ZTgxZTctNDg0Yy00NGE4LWExOTEtZjczZTI0NzA3Y2U5iqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kebEiVDIgc3RhciBwaGFudG9tIqRtaW1lqnRleHQvcGxhaW6scm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/oxStLAawcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJGVlN2U4MWU3LTQ4NGMtNDRhOC1hMTkxLWY3M2UyNDcwN2NlOblkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgyGvXS1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQzNDgyNGRiNy0xM2M0LTQ1ZTItYmVmYS1mMDI3YjliNTg1YzCKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52mqICTxzY3JpcHQgaWQ9J3Bsb3RfMSc+CgkJLy8gV2Ugc3RhcnQgYnkgcHV0dGluZyBhbGwgdGhlIHZhcmlhYmxlIGludGVycG9sYXRpb24gaGVyZSBhdCB0aGUgYmVnaW5uaW5nCgkJLy8gV2UgaGF2ZSB0byBjb252ZXJ0IGFsbCB0eXBlZGFycmF5cyBpbiB0aGUgbGF5b3V0IHRvIG5vcm1hbCBhcnJheXMuIFNlZSBJc3N1ZSAjMjUKCQkvLyBXZSB1c2UgbG9kYXNoIGZvciB0aGlzIGZvciBjb21wYWN0bmVzcwoJCWZ1bmN0aW9uIHJlbW92ZVR5cGVkQXJyYXkobykgewoJCQlyZXR1cm4gXy5pc1R5cGVkQXJyYXkobykgPyBBcnJheS5mcm9tKG8pIDoKCQkJXy5pc1BsYWluT2JqZWN0KG8pID8gXy5tYXBWYWx1ZXMobywgcmVtb3ZlVHlwZWRBcnJheSkgOiAKCQkJbwoJCX0KCgkJLy8gUHVibGlzaCB0aGUgcGxvdCBvYmplY3QgdG8gSlMKCQlsZXQgcGxvdF9vYmogPSBfLnVwZGF0ZSgvKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIEFic3RyYWN0UGx1dG9EaW5nZXRqZXMuRGlzcGxheS5wdWJsaXNoZWRfdG9fanMgKi8gZ2V0UHVibGlzaGVkT2JqZWN0KCJiM2I4NDA4Yy04MTgxLTExZWYtMTRlYi1lMWM1NjliOGJiMjkvNDhhMmM2NDRhNGY0ZTQ2IiksICJsYXlvdXQiLCByZW1vdmVUeXBlZEFycmF5KQoJCS8vIEdldCB0aGUgcGxvdGx5IGxpc3RlbmVycwoJCWNvbnN0IHBsb3RseV9saXN0ZW5lcnMgPSB7fQoJCS8vIEdldCB0aGUgSlMgbGlzdGVuZXJzCgkJY29uc3QganNfbGlzdGVuZXJzID0ge30KCQkvLyBEZWFsIHdpdGggZXZlbnR1YWwgY3VzdG9tIGNsYXNzZXMKCQlsZXQgY3VzdG9tX2NsYXNzbGlzdCA9IFtdCgoKCQkvLyBMb2FkIHRoZSBwbG90bHkgbGlicmFyeQoJCWxldCBQbG90bHkgPSB1bmRlZmluZWQKCQl0cnkgewoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiLi9wbG90bHlqcy9wbG90bHlqcy0yLjI2LjIubWluLmpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfSBjYXRjaCAoZSkgewoJCQljb25zb2xlLmxvZygiTG9jYWwgbG9hZCBmYWlsZWQsIHRyeWluZyB3aXRoIHRoZSB3ZWIgZXNtLnNoIHZlcnNpb24iKQoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiaHR0cHM6Ly9lc20uc2gvdjEzNS9wbG90bHkuanMtZGlzdC1taW5AMi4yNi4yL2VzbmV4dC9wbG90bHkuanMtZGlzdC1taW4ubWpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfQoKCQkvLyBDaGVjayBpZiB3ZSBoYXZlIHRvIGZvcmNlIGxvY2FsIG1hdGhqYXggZm9udCBjYWNoZQoJCWlmIChmYWxzZSAmJiB3aW5kb3c/Lk1hdGhKYXg/LmNvbmZpZz8uc3ZnPy5mb250Q2FjaGUgPT09ICdnbG9iYWwnKSB7CgkJCXdpbmRvdy5NYXRoSmF4LmNvbmZpZy5zdmcuZm9udENhY2hlID0gJ2xvY2FsJwoJCX0KCgkJLy8gRmxhZyB0byBjaGVjayBpZiB0aGlzIGNlbGwgd2FzICBtYW51YWxseSByYW4gb3IgcmVhY3RpdmVseSByYW4KY29uc3QgZmlyc3RSdW4gPSB0aGlzID8gZmFsc2UgOiB0cnVlCmNvbnN0IENPTlRBSU5FUiA9IHRoaXMgPz8gaHRtbGA8ZGl2IGNsYXNzPSdwbHV0b3Bsb3RseS1jb250YWluZXInPmAKY29uc3QgUExPVCA9IENPTlRBSU5FUi5xdWVyeVNlbGVjdG9yKCcuanMtcGxvdGx5LXBsb3QnKSA/PyBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2PmApCmNvbnN0IHBhcmVudCA9IENPTlRBSU5FUi5wYXJlbnRFbGVtZW50Ci8vIFdlIHVzZSBhIGNvbnRyb2xsZXIgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVycyB1cG9uIGludmFsaWRhdGlvbgpjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpCi8vIFdlIGhhdmUgdG8gYWRkIHRoaXMgdG8ga2VlcCBzdXBwb3J0aW5nIEBiaW5kIHdpdGggdGhlIG9sZCBBUEkgdXNpbmcgUExPVApQTE9ULmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGUpID0+IHsKCUNPTlRBSU5FUi52YWx1ZSA9IFBMT1QudmFsdWUKCWlmIChlLmJ1YmJsZXMpIHsKCQlyZXR1cm4KCX0KCUNPTlRBSU5FUi5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnaW5wdXQnKSkKfSwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pCgoJLy8gVGhpcyBjcmVhdGUgdGhlIHN0eWxlIHN1YmRpdiBvbiBmaXJzdCBydW4KCWZpcnN0UnVuICYmIENPTlRBSU5FUi5hcHBlbmRDaGlsZChodG1sYAoJPHN0eWxlPgoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciB7CgkJd2lkdGg6IDEwMCU7CgkJaGVpZ2h0OiAxMDAlOwoJCW1pbi1oZWlnaHQ6IDA7CgkJbWluLXdpZHRoOiAwOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciAuanMtcGxvdGx5LXBsb3QgLnBsb3RseSBkaXYgewoJCW1hcmdpbjogMCBhdXRvOyAvLyBUaGlzIGNlbnRlcnMgdGhlIHBsb3QKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIucG9wcGVkLW91dCB7CgkJb3ZlcmZsb3c6IGF1dG87CgkJei1pbmRleDogMTAwMDsKCQlwb3NpdGlvbjogZml4ZWQ7CgkJcmVzaXplOiBib3RoOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMHB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwcHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciB7CgkJZGlzcGxheTogZmxleDsKCQlmbGV4LWZsb3c6IHJvdyB3cmFwOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDEycHg7CgkJcG9zaXRpb246IGZpeGVkOwoJCXotaW5kZXg6IDEwMDE7CgkJY3Vyc29yOiBtb3ZlOwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgLTEwMCUpOwoJCXBhZGRpbmc6IDVweDsKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIHNwYW4gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQlmbGV4OiAxCgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlci5oaWRkZW4gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuY2xpcGJvYXJkLXNwYW4gewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCX0KCS5jbGlwYm9hcmQtdmFsdWUgewoJCXBhZGRpbmctcmlnaHQ6IDVweDsKCQlwYWRkaW5nLWxlZnQ6IDJweDsKCQljdXJzb3I6IHRleHQ7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlmbGV4OiAwIDAgMTAwJTsKCQl0ZXh0LWFsaWduOiBjZW50ZXI7CgkJYm9yZGVyLXRvcDogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCW1hcmdpbi10b3A6IDVweDsKCQlkaXNwbGF5OiBub25lOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5maWxlc2F2ZSAuY2xpcGJvYXJkLXNwYW4uZmlsZW5hbWUgewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5jbGlwYm9hcmQtdmFsdWUuZmlsZW5hbWUgewoJCW1hcmdpbi1sZWZ0OiAzcHg7CgkJdGV4dC1hbGlnbjogbGVmdDsKCQltaW4td2lkdGg6IG1pbig2MCUsIG1pbi1jb250ZW50KTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogaW5saW5lLWZsZXg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IC5sYWJlbCB7CgkJZmxleDogMCAwIDA7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZvcm1hdCB7CgkJcG9zaXRpb246IHJlbGF0aXZlOwoJCWZsZXg6IDEgMCBhdXRvOwoJCW1pbi13aWR0aDogMzBweDsKCQltYXJnaW4tcmlnaHQ6IDEwcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJCWZsZXgtZmxvdzogY29sdW1uOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXBhZGRpbmctbGVmdDogM3B4OwoJCXotaW5kZXg6IDIwMDA7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgewoJCWN1cnNvcjogcG9pbnRlcjsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlwYWRkaW5nOiAzcHg7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTNweCwgLTZweCk7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5mb3JtYXQtb3B0aW9uOm5vdCguc2VsZWN0ZWQpIHsKCQltYXJnaW4tdG9wOiAzcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24uc2VsZWN0ZWQgewoJCW9yZGVyOiAtMTsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpob3ZlciB7CgkJYmFja2dyb3VuZC1jb2xvcjogdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7Cgl9CglzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZm9udC13ZWlnaHQ6IG5vcm1hbDsKCQljb2xvcjogdmFyKC0tcGx1dG8tb3V0cHV0LWNvbG9yKTsKCQlkaXNwbGF5OiBub25lOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgY2FsYygtMTAwJSAtIDEwcHgpKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkubGFiZWwgewoJCXVzZXItc2VsZWN0OiBub25lOwoJfQoJLmxhYmVsOmhvdmVyIHNwYW4uY29uZmlnLXZhbHVlIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJbWluLXdpZHRoOiAxNTBweDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5tYXRjaGluZy1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tbWFjcm8tY29sb3IpOwoJCWZvbnQtd2VpZ2h0OiBib2xkOwoJfQoJLmNsaXBib2FyZC1zcGFuLmRpZmZlcmVudC1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tdGFnLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KPC9zdHlsZT4KYCkKCmxldCBvcmlnaW5hbF9oZWlnaHQgPSBwbG90X29iai5sYXlvdXQuaGVpZ2h0CmxldCBvcmlnaW5hbF93aWR0aCA9IHBsb3Rfb2JqLmxheW91dC53aWR0aAovLyBGb3IgdGhlIGhlaWdodCB3ZSBoYXZlIHRvIGFsc28gcHV0IGEgZml4ZWQgdmFsdWUgaW4gY2FzZSB0aGUgcGxvdCBpcyBwdXQgb24gYSBub24tZml4ZWQtc2l6ZSBjb250YWluZXIgKGxpa2UgdGhlIGRlZmF1bHQgd3JhcHBlcikKLy8gV2UgZGVmaW5lIGEgdmFyaWFibGUgdG8gY2hlY2sgd2hldGhlciB3ZSBzdGlsbCBoYXZlIHRvIHJlbW92ZSB0aGUgZml4ZWQgaGVpZ2h0CmxldCByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmaXJzdFJ1bgpsZXQgY29udGFpbmVyX2hlaWdodCA9IG9yaWdpbmFsX2hlaWdodCA/PyBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPz8gNDAwCkNPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfaGVpZ2h0ICsgJ3B4JwoKLy8gV2UgY3JlYXRlIGEgUHJvbWlzZSB2ZXJzaW9uIG9mIHNldFRpbWVvdXQKZnVuY3Rpb24gZGVsYXkobXMpIHsKICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTsKfQoKLy8gV2UgaW1wb3J0IGludGVyYWN0IGZvciBkcmFnZ2luZy9yZXNpemluZwpjb25zdCB7IGRlZmF1bHQ6IGludGVyYWN0IH0gPSBhd2FpdCBpbXBvcnQoJ2h0dHBzOi8vZXNtLnNoL2ludGVyYWN0anNAMS4xMC4xOScpCgoKZnVuY3Rpb24gZ2V0SW1hZ2VPcHRpb25zKCkgewogIGNvbnN0IG8gPSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPz8ge307CiAgcmV0dXJuIHsKICAgIGZvcm1hdDogby5mb3JtYXQgPz8gInBuZyIsCiAgICB3aWR0aDogby53aWR0aCA/PyBvcmlnaW5hbF93aWR0aCwKICAgIGhlaWdodDogby5oZWlnaHQgPz8gb3JpZ2luYWxfaGVpZ2h0LAogICAgc2NhbGU6IG8uc2NhbGUgPz8gMSwKICAgIGZpbGVuYW1lOiBvLmZpbGVuYW1lID8/ICJuZXdwbG90IiwKICB9Owp9Cgpjb25zdCBDTElQQk9BUkRfSEVBREVSID0KICBDT05UQUlORVIucXVlcnlTZWxlY3RvcigiLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIiKSA/PwogIENPTlRBSU5FUi5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAiYWZ0ZXJiZWdpbiIsCiAgICBodG1sYDxkaXYgY2xhc3M9InBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgaGlkZGVuIj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZvcm1hdCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5Gb3JtYXQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZm9ybWF0Ij48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHdpZHRoIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPldpZHRoOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIHdpZHRoIj48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gaGVpZ2h0IgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkhlaWdodDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBoZWlnaHQiPjwvc3Bhbj5weDwvc3BhbgogICAgICA+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzY2FsZSIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5TY2FsZTo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBzY2FsZSI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHNldCI+U2V0PC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHVuc2V0Ij5VbnNldDwvYnV0dG9uPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gZmlsZW5hbWUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+RmlsZW5hbWU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZmlsZW5hbWUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgPC9kaXY+YAogICk7CgpmdW5jdGlvbiBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKSB7CiAgY29uc3QgdmFsaWRfY2xhc3NlcyA9IFsKICAgICJtaXNzaW5nLWNvbmZpZyIsCiAgICAibWF0Y2hpbmctY29uZmlnIiwKICAgICJkaWZmZXJlbnQtY29uZmlnIiwKICBdOwogIGZ1bmN0aW9uIHNldENsYXNzKGNsKSB7CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgdmFsaWRfY2xhc3NlcykgewogICAgICBjb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZShuYW1lLCBuYW1lID09IGNsKTsKICAgIH0KICB9CiAgLy8gV2UgdXNlIHRoZSBjdXN0b20gZ2V0dGVycyB3ZSdsbCBzZXQgdXAgaW4gdGhlIGNvbnRhaW5lcgogIGNvbnN0IHsgdWlfdmFsdWUsIGNvbmZpZ192YWx1ZSwgY29uZmlnX3NwYW4sIGtleSB9ID0gY29udGFpbmVyOwogIGlmIChjb25maWdfdmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgc2V0Q2xhc3MoIm1pc3NpbmctY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGlzIG5vdCBwcmVzZW50IGluIHRoZSBjb25maWcuYDsKICB9IGVsc2UgaWYgKHVpX3ZhbHVlID09IGNvbmZpZ192YWx1ZSkgewogICAgc2V0Q2xhc3MoIm1hdGNoaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgdGhlIHNhbWUgdmFsdWUgaW4gdGhlIGNvbmZpZyBhbmQgaW4gdGhlIGhlYWRlci5gOwogIH0gZWxzZSB7CiAgICBzZXRDbGFzcygiZGlmZmVyZW50LWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgYSBkaWZmZXJlbnQgdmFsdWUgKDxlbT4ke2NvbmZpZ192YWx1ZX08L2VtPikgaW4gdGhlIGNvbmZpZy5gOwogIH0KICAvLyBBZGQgaW5mbyBhYm91dCBzZXR0aW5nIGFuZCB1bnNldHRpbmcKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgb24gdGhlIGxhYmVsIDxlbT48Yj5vbmNlPC9iPjwvZW0+IHRvIHNldCB0aGUgY3VycmVudCBVSSB2YWx1ZSBpbiB0aGUgY29uZmlnLmAKICApOwogIGNvbmZpZ19zcGFuLmluc2VydEFkamFjZW50SFRNTCgKICAgICJiZWZvcmVlbmQiLAogICAgYDxicj5DbGljayA8ZW0+PGI+dHdpY2U8L2I+PC9lbT4gdG8gcmVtb3ZlIHRoaXMga2V5IGZyb20gdGhlIGNvbmZpZy5gCiAgKTsKfQoKY29uc3QgdmFsaWRfZm9ybWF0cyA9IFsicG5nIiwgInN2ZyIsICJ3ZWJwIiwgImpwZWciLCAiZnVsbC1qc29uIl07CmZ1bmN0aW9uIGluaXRpYWxpemVVSVZhbHVlU3BhbihzcGFuLCBrZXksIHZhbHVlKSB7CiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9IGtleSA9PT0gImZvcm1hdCIgPyAiZmFsc2UiIDogInRydWUiOwogIGxldCBwYXJzZSA9ICh4KSA9PiB4OwogIGxldCB1cGRhdGUgPSAoeCkgPT4gKHNwYW4udGV4dENvbnRlbnQgPSB4KTsKICBpZiAoa2V5ID09PSAid2lkdGgiIHx8IGtleSA9PT0gImhlaWdodCIpIHsKICAgIHBhcnNlID0gKHgpID0+IE1hdGgucm91bmQocGFyc2VGbG9hdCh4KSk7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJzY2FsZSIpIHsKICAgIHBhcnNlID0gcGFyc2VGbG9hdDsKICB9IGVsc2UgaWYgKGtleSA9PT0gImZvcm1hdCIpIHsKICAgIC8vIFdlIHJlbW92ZSBjb250ZW50RWRpdGFibGUKICAgIHNwYW4uY29udGVudEVkaXRhYmxlID0gImZhbHNlIjsKICAgIC8vIEhlcmUgd2UgZmlyc3QgYWRkIHRoZSBzdWJzcGFucyBmb3IgZWFjaCBvcHRpb24KICAgIGNvbnN0IG9wdHNfZGl2ID0gc3Bhbi5hcHBlbmRDaGlsZChodG1sYDxkaXYgY2xhc3M9ImZvcm1hdC1vcHRpb25zIj48L2Rpdj5gKTsKICAgIGZvciAoY29uc3QgZm10IG9mIHZhbGlkX2Zvcm1hdHMpIHsKICAgICAgY29uc3Qgb3B0ID0gb3B0c19kaXYuYXBwZW5kQ2hpbGQoCiAgICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iZm9ybWF0LW9wdGlvbiAke2ZtdH0iPiR7Zm10fTwvc3Bhbj5gCiAgICAgICk7CiAgICAgIG9wdC5vbmNsaWNrID0gKGUpID0+IHsKICAgICAgICBzcGFuLnZhbHVlID0gb3B0LnRleHRDb250ZW50OwogICAgICB9OwogICAgfQogICAgcGFyc2UgPSAoeCkgPT4gewogICAgICByZXR1cm4gdmFsaWRfZm9ybWF0cy5pbmNsdWRlcyh4KSA/IHggOiBsb2NhbFZhbHVlOwogICAgfTsKICAgIHVwZGF0ZSA9ICh4KSA9PiB7CiAgICAgIGZvciAoY29uc3Qgb3B0IG9mIG9wdHNfZGl2LmNoaWxkcmVuKSB7CiAgICAgICAgb3B0LmNsYXNzTGlzdC50b2dnbGUoInNlbGVjdGVkIiwgb3B0LnRleHRDb250ZW50ID09PSB4KTsKICAgICAgfQogICAgfTsKICB9IGVsc2UgewogICAgLy8gV2Ugb25seSBoYXZlIGZpbGVuYW1lIGhlcmUKICB9CiAgbGV0IGxvY2FsVmFsdWU7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwYW4sICJ2YWx1ZSIsIHsKICAgIGdldDogKCkgPT4gewogICAgICByZXR1cm4gbG9jYWxWYWx1ZTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgaWYgKHZhbCAhPT0gIiIpIHsKICAgICAgICBsb2NhbFZhbHVlID0gcGFyc2UodmFsKTsKICAgICAgfQogICAgICB1cGRhdGUobG9jYWxWYWx1ZSk7CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKICAvLyBXZSBhbHNvIGFzc2lnbiBhIGxpc3RlbmVyIHNvIHRoYXQgdGhlIGVkaXRhYmxlIGlzIGJsdXJyZWQgd2hlbiBlbnRlciBpcyBwcmVzc2VkCiAgc3Bhbi5vbmtleWRvd24gPSAoZSkgPT4gewogICAgaWYgKGUua2V5Q29kZSA9PT0gMTMpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBzcGFuLmJsdXIoKTsKICAgIH0KICB9OwogIHNwYW4udmFsdWUgPSB2YWx1ZTsKfQoKZnVuY3Rpb24gaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3BhbihzcGFuLCBrZXkpIHsKICAvLyBIZXJlIHdlIG1vc3RseSB3YW50IHRvIGRlZmluZSB0aGUgc2V0dGVyIGFuZCBnZXR0ZXIKICBjb25zdCBjb250YWluZXIgPSBzcGFuLmNsb3Nlc3QoIi5jbGlwYm9hcmQtc3BhbiIpOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgfSwKICAgIHNldDogKHZhbCkgPT4gewogICAgICAvLyBpZiB1bmRlZmluZWQgaXMgcGFzc2VkLCB3ZSByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIG9wdGlvbnMKICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZGVsZXRlIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgICB9IGVsc2UgewogICAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldID0gdmFsOwogICAgICB9CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKfQoKY29uc3QgY29uZmlnX3NwYW5zID0ge307CmZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGdldEltYWdlT3B0aW9ucygpKSkgewogIGNvbnN0IGNvbnRhaW5lciA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcihgLmNsaXBib2FyZC1zcGFuLiR7a2V5fWApOwogIGNvbnN0IGxhYmVsID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5sYWJlbCIpOwogIC8vIFdlIGdpdmUgdGhlIGxhYmVsIGEgZnVuY3Rpb24gdGhhdCBvbiBzaW5nbGUgY2xpY2sgd2lsbCBzZXQgdGhlIGN1cnJlbnQgdmFsdWUgYW5kIHdpdGggZG91YmxlIGNsaWNrIHdpbGwgdW5zZXQgaXQKICBsYWJlbC5vbmNsaWNrID0gRHVhbENsaWNrKAogICAgKCkgPT4gewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfSwKICAgIChlKSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJlIiwgZSk7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IHVuZGVmaW5lZDsKICAgIH0KICApOwogIGNvbnN0IHVpX3ZhbHVlX3NwYW4gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC12YWx1ZSIpOwogIGNvbnN0IGNvbmZpZ192YWx1ZV9zcGFuID0KICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuY29uZmlnLXZhbHVlIikgPz8KICAgIGxhYmVsLmluc2VydEFkamFjZW50RWxlbWVudCgKICAgICAgImFmdGVyYmVnaW4iLAogICAgICBodG1sYDxzcGFuIGNsYXNzPSJjb25maWctdmFsdWUiPjwvc3Bhbj5gCiAgICApOwogIC8vIEFzc2luZyB0aGUgdHdvIHNwYW5zIGFzIHByb3BlcnRpZXMgb2YgdGhlIGNvbnRhaW5pbmcgc3BhbgogIGNvbnRhaW5lci51aV9zcGFuID0gdWlfdmFsdWVfc3BhbjsKICBjb250YWluZXIuY29uZmlnX3NwYW4gPSBjb25maWdfdmFsdWVfc3BhbjsKICBjb250YWluZXIua2V5ID0ga2V5OwogIGNvbmZpZ19zcGFuc1trZXldID0gY29udGFpbmVyOwogIGlmIChmaXJzdFJ1bikgewogICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID0KICAgICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogICAgLy8gV2UgZG8gdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSB2YWx1ZSBzcGFuCiAgICBpbml0aWFsaXplVUlWYWx1ZVNwYW4odWlfdmFsdWVfc3Bhbiwga2V5LCB2YWx1ZSk7CiAgICAvLyBUaGVuIHdlIGluaXRpYWxpemUgdGhlIGNvbmZpZyB2YWx1ZQogICAgaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3Bhbihjb25maWdfdmFsdWVfc3Bhbiwga2V5KTsKICAgIC8vIFdlIHB1dCBzb21lIGNvbnZlbmllbmNlIGdldHRlcnMvc2V0dGVycwogICAgLy8gdWlfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgInVpX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IHVpX3ZhbHVlX3NwYW4udmFsdWUsCiAgICAgIHNldDogKHZhbCkgPT4gewogICAgICAgIHVpX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICAgIC8vIGNvbmZpZ192YWx1ZSBmb3J3YXJkCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAiY29uZmlnX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IGNvbmZpZ192YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSA9IHZhbDsKICAgICAgfSwKICAgIH0pOwogIH0KfQoKLy8gVGhlc2Ugb2JqZWN0cyB3aWxsIGNvbnRhaW4gdGhlIGRlZmF1bHQgdmFsdWUKCi8vIFRoaXMgY29kZSB1cGRhdGVzIHRoZSBpbWFnZSBvcHRpb25zIGluIHRoZSBQTE9UIGNvbmZpZyB3aXRoIHRoZSBwcm92aWRlZCBvbmVzCmZ1bmN0aW9uIHNldEltYWdlT3B0aW9ucyhvKSB7CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBvW2tleV07CiAgfQp9CmZ1bmN0aW9uIHVuc2V0SW1hZ2VPcHRpb25zKCkgewogIHNldEltYWdlT3B0aW9ucyh7fSk7Cn0KCmNvbnN0IHNldF9idXR0b24gPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtc3Bhbi5zZXQiKTsKY29uc3QgdW5zZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4udW5zZXQiKTsKaWYgKGZpcnN0UnVuKSB7CiAgc2V0X2J1dHRvbi5vbmNsaWNrID0gKGUpID0+IHsKICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfQogIH07CiAgdW5zZXRfYnV0dG9uLm9uY2xpY2sgPSB1bnNldEltYWdlT3B0aW9uczsKfQoKLy8gV2UgYWRkIGEgZnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIGNsaXBib2FyZCBpcyBwb3BwZWQgb3V0CkNPTlRBSU5FUi5pc1BvcHBlZE91dCA9ICgpID0+IHsKICByZXR1cm4gQ09OVEFJTkVSLmNsYXNzTGlzdC5jb250YWlucygicG9wcGVkLW91dCIpOwp9OwoKQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNlZG93biA9IGZ1bmN0aW9uIChldmVudCkgewogIGlmIChldmVudC50YXJnZXQubWF0Y2hlcygic3Bhbi5jbGlwYm9hcmQtdmFsdWUiKSkgewogICAgY29uc29sZS5sb2coIldlIGRvbid0IG1vdmUhIik7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IHN0YXJ0ID0gewogICAgbGVmdDogcGFyc2VGbG9hdChDT05UQUlORVIuc3R5bGUubGVmdCksCiAgICB0b3A6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLnRvcCksCiAgICBYOiBldmVudC5wYWdlWCwKICAgIFk6IGV2ZW50LnBhZ2VZLAogIH07CiAgZnVuY3Rpb24gbW92ZUF0KGV2ZW50LCBzdGFydCkgewogICAgY29uc3QgdG9wID0gZXZlbnQucGFnZVkgLSBzdGFydC5ZICsgc3RhcnQudG9wICsgInB4IjsKICAgIGNvbnN0IGxlZnQgPSBldmVudC5wYWdlWCAtIHN0YXJ0LlggKyBzdGFydC5sZWZ0ICsgInB4IjsKICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUudG9wID0gdG9wOwogIH0KCiAgLy8gbW92ZSBvdXIgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGJhbGwgdW5kZXIgdGhlIHBvaW50ZXIKICBtb3ZlQXQoZXZlbnQsIHN0YXJ0KTsKICBmdW5jdGlvbiBvbk1vdXNlTW92ZShldmVudCkgewogICAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgfQoKICAvLyBXZSB1c2UgdGhpcyB0byByZW1vdmUgdGhlIG1vdXNlbW92ZSB3aGVuIGNsaWNraW5nIG91dHNpZGUgb2YgdGhlIGNvbnRhaW5lcgogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CgogIC8vIG1vdmUgdGhlIGNvbnRhaW5lciBvbiBtb3VzZW1vdmUKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCBvbk1vdXNlTW92ZSwgewogICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCwKICB9KTsKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICBjbGVhblVwKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKCiAgZnVuY3Rpb24gY2xlYW5VcCgpIHsKICAgIGNvbnNvbGUubG9nKCJjbGVhbmluZyB1cCB0aGUgcGxvdCBtb3ZlIGxpc3RlbmVyIik7CiAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICBDTElQQk9BUkRfSEVBREVSLm9ubW91c2V1cCA9IG51bGw7CiAgfQoKICAvLyAoMykgZHJvcCB0aGUgYmFsbCwgcmVtb3ZlIHVubmVlZGVkIGhhbmRsZXJzCiAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBjbGVhblVwOwp9OwoKZnVuY3Rpb24gc2VuZFRvQ2xpcGJvYXJkKGJsb2IpIHsKICBpZiAoIW5hdmlnYXRvci5jbGlwYm9hcmQpIHsKICAgIGFsZXJ0KAogICAgICAiVGhlIENsaXBib2FyZCBBUEkgZG9lcyBub3Qgc2VlbSB0byBiZSBhdmFpbGFibGUsIG1ha2Ugc3VyZSB0aGUgUGx1dG8gbm90ZWJvb2sgaXMgYmVpbmcgdXNlZCBmcm9tIGVpdGhlciBsb2NhbGhvc3Qgb3IgYW4gaHR0cHMgc291cmNlLiIKICAgICk7CiAgfQogIG5hdmlnYXRvci5jbGlwYm9hcmQKICAgIC53cml0ZShbCiAgICAgIG5ldyBDbGlwYm9hcmRJdGVtKHsKICAgICAgICAvLyBUaGUga2V5IGlzIGRldGVybWluZWQgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIGJsb2IncyB0eXBlLgogICAgICAgIFtibG9iLnR5cGVdOiBibG9iLAogICAgICB9KSwKICAgIF0pCiAgICAudGhlbigKICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgIGNvbnNvbGUubG9nKCJBc3luYzogQ29weWluZyB0byBjbGlwYm9hcmQgd2FzIHN1Y2Nlc3NmdWwhIik7CiAgICAgIH0sCiAgICAgIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJBc3luYzogQ291bGQgbm90IGNvcHkgdGV4dDogIiwgZXJyKTsKICAgICAgfQogICAgKTsKfQoKZnVuY3Rpb24gY29weUltYWdlVG9DbGlwYm9hcmQoKSB7CiAgLy8gV2UgZXh0cmFjdCB0aGUgaW1hZ2Ugb3B0aW9ucyBmcm9tIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzIChpZiB0aGV5IGV4aXN0KQogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuIFdlIGFsc28gaWdub3JlIGZvcm1hdCBiZWNhdXNlIHRoZSBjbGlwYm9hcmQgb25seSBzdXBwb3J0cyBwbmcuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwga2V5ID09PSAiZm9ybWF0IikgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbmZpZ1trZXldID0gdmFsOwogIH0KICBQbG90bHkudG9JbWFnZShQTE9ULCBjb25maWcpLnRoZW4oZnVuY3Rpb24gKGRhdGFVcmwpIHsKICAgIGZldGNoKGRhdGFVcmwpCiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5ibG9iKCkpCiAgICAgIC50aGVuKChibG9iKSA9PiB7CiAgICAgICAgY29uc3QgcGFzdGVfcmVjZWl2ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdwYXN0ZS1yZWNlaXZlci5wbHV0b3Bsb3RseScpCiAgICAgICAgaWYgKHBhc3RlX3JlY2VpdmVyKSB7CiAgICAgICAgICBwYXN0ZV9yZWNlaXZlci5hdHRhY2hJbWFnZShkYXRhVXJsLCBDT05UQUlORVIpCiAgICAgICAgfQogICAgICAgIHNlbmRUb0NsaXBib2FyZChibG9iKQogICAgICB9KTsKICB9KTsKfQoKZnVuY3Rpb24gc2F2ZUltYWdlVG9GaWxlKCkgewogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LmRvd25sb2FkSW1hZ2UoUExPVCwgY29uZmlnKTsKfQoKbGV0IGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwLCB0b3A6IDAsIGxlZnQ6IDAgfTsKZnVuY3Rpb24gdW5wb3BfY29udGFpbmVyKGNsKSB7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCBmYWxzZSk7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoY2wsIGZhbHNlKTsKICAvLyBXZSBmaXggdGhlIGhlaWdodCBiYWNrIHRvIHRoZSB2YWx1ZSBpdCBoYWQgYmVmb3JlIHBvcG91dCwgYWxzbyBzZXR0aW5nIHRoZSBmbGFnIHRvIHNpZ25hbCB0aGF0IHVwb24gZmlyc3QgcmVzaXplIHdlIHJlbW92ZSB0aGUgZml4ZWQgaW5saW5lLXN0eWxlCiAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9IGNvbnRhaW5lcl9yZWN0LmhlaWdodCArICJweCI7CiAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gdHJ1ZTsKICAvLyBXZSBzZXQgdGhlIG90aGVyIGZpeGVkIGlubGluZS1zdHlsZXMgdG8gbnVsbAogIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogIENPTlRBSU5FUi5zdHlsZS50b3AgPSAiIjsKICBDT05UQUlORVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIFdlIGFsc28gcmVtb3ZlIHRoZSBDTElQQk9BUkRfSEVBREVSCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9ICIiOwogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIEZpbmFsbHkgd2UgcmVtb3ZlIHRoZSBoaWRkZW4gY2xhc3MgdG8gdGhlIGhlYWRlcgogIENMSVBCT0FSRF9IRUFERVIuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgdHJ1ZSk7CiAgcmV0dXJuOwp9CmZ1bmN0aW9uIHBvcG91dF9jb250YWluZXIob3B0cykgewogIGNvbnN0IGNsID0gb3B0cz8uY2w7CiAgY29uc3QgdGFyZ2V0X2NvbnRhaW5lcl9zaXplID0gb3B0cz8udGFyZ2V0X2NvbnRhaW5lcl9zaXplID8/IHt9OwogIGNvbnN0IHRhcmdldF9wbG90X3NpemUgPSBvcHRzPy50YXJnZXRfcGxvdF9zaXplID8/IHt9OwogIGlmIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgcmV0dXJuIHVucG9wX2NvbnRhaW5lcihjbCk7CiAgfQogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBjbCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0cnVlKTsKICAvLyBXZSBleHRyYWN0IHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNvbnRhaW5lciwgc2F2ZSB0aGVtIGFuZCBmaXggdGhlbQogIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH0gPSBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgY29udGFpbmVyX3JlY3QgPSB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9OwogIC8vIFdlIHNhdmUgdGhlIGN1cnJlbnQgcGxvdCBzaXplIGJlZm9yZSB3ZSBwb3AgYXMgaXQgd2lsbCBmaWxsIHRoZSBzY3JlZW4KICBjb25zdCBjdXJyZW50X3Bsb3Rfc2l6ZSA9IHsKICAgIHdpZHRoOiBQTE9ULl9mdWxsTGF5b3V0LndpZHRoLAogICAgaGVpZ2h0OiBQTE9ULl9mdWxsTGF5b3V0LmhlaWdodCwKICB9OwogIC8vIFdlIGhhdmUgdG8gc2F2ZSB0aGUgcGFkIGRhdGEgYmVmb3JlIHBvcHBpbmcgc28gd2UgY2FuIHJlc2l6ZSBwcmVjaXNlbHkKICBjb25zdCBwYWQgPSB7fTsKICBwYWQudW5wb3BwZWQgPSBnZXRTaXplRGF0YSgpLmNvbnRhaW5lcl9wYWQ7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCB0cnVlKTsKICBwYWQucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIC8vIFdlIGRvIHRvcCBhbmQgbGVmdCBiYXNlZCBvbiB0aGUgY3VycmVudCByZWN0CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ0b3AiLCAibGVmdCJdKSB7CiAgICBjb25zdCBzdGFydF92YWwgPSB0YXJnZXRfY29udGFpbmVyX3NpemVba2V5XSA/PyBjb250YWluZXJfcmVjdFtrZXldOwogICAgbGV0IG9mZnNldCA9IDA7CiAgICBmb3IgKGNvbnN0IGtpbmQgb2YgWyJwYWRkaW5nIiwgImJvcmRlciJdKSB7CiAgICAgIG9mZnNldCArPSBwYWQucG9wcGVkW2tpbmRdW2tleV0gLSBwYWQudW5wb3BwZWRba2luZF1ba2V5XTsKICAgIH0KICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gc3RhcnRfdmFsIC0gb2Zmc2V0ICsgInB4IjsKICAgIGlmIChrZXkgPT09ICJsZWZ0IikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgLy8gV2UgY29tcHV0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBkZXBlbmRpbmcgb24gZXZlbnR1YWwgY29uZmlnIGRhdGEKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7CiAgICB3aWR0aDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS53aWR0aCA/PwogICAgICBjb25maWdfc3BhbnMud2lkdGguY29uZmlnX3ZhbHVlID8/CiAgICAgIGN1cnJlbnRfcGxvdF9zaXplLndpZHRoLAogICAgaGVpZ2h0OgogICAgICB0YXJnZXRfcGxvdF9zaXplLmhlaWdodCA/PwogICAgICBjb25maWdfc3BhbnMuaGVpZ2h0LmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS5oZWlnaHQsCiAgfSk7CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgY29uc3QgdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY3N6W2tleV07CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHZhbCArICJweCI7CiAgICBpZiAoa2V5ID09PSAid2lkdGgiKSB7CiAgICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGVba2V5XSA9IENPTlRBSU5FUi5zdHlsZVtrZXldOwogICAgfQogIH0KICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIGZhbHNlKTsKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICB1bnBvcF9jb250YWluZXIoKTsKICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9LAogICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0KICApOwp9CgpDT05UQUlORVIucG9wT3V0ID0gcG9wb3V0X2NvbnRhaW5lcjsKCmZ1bmN0aW9uIER1YWxDbGljayhzaW5nbGVfZnVuYywgZGJsX2Z1bmMpIHsKICBsZXQgbmNsaWNrcyA9IDA7CiAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7CiAgICBuY2xpY2tzICs9IDE7CiAgICBpZiAobmNsaWNrcyA+IDEpIHsKICAgICAgZGJsX2Z1bmMoLi4uYXJncyk7CiAgICAgIG5jbGlja3MgPSAwOwogICAgfSBlbHNlIHsKICAgICAgZGVsYXkoMzAwKS50aGVuKCgpID0+IHsKICAgICAgICBpZiAobmNsaWNrcyA9PSAxKSB7CiAgICAgICAgICBzaW5nbGVfZnVuYyguLi5hcmdzKTsKICAgICAgICB9CiAgICAgICAgbmNsaWNrcyA9IDA7CiAgICAgIH0pOwogICAgfQogIH07Cn0KCi8vIFdlIHJlbW92ZSB0aGUgZGVmYXVsdCBkb3dubG9hZCBpbWFnZSBidXR0b24KcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9SZW1vdmUgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlLAogIFsidG9JbWFnZSJdCik7Ci8vIFdlIGFkZCB0aGUgY3VzdG9tIGJ1dHRvbiB0byB0aGUgbW9kZWJhcgpwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb0FkZCA9IF8udW5pb24oCiAgcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQsCiAgWwogICAgewogICAgICBuYW1lOiAiQ29weSBQTkcgdG8gQ2xpcGJvYXJkIiwKICAgICAgaWNvbjogewogICAgICAgIGhlaWdodDogNTIwLAogICAgICAgIHdpZHRoOiA1MjAsCiAgICAgICAgcGF0aDogIk0yODAgNjRoNDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRWNDQ4YzAgMzUuMy0yOC43IDY0LTY0IDY0SDY0Yy0zNS4zIDAtNjQtMjguNy02NC02NFYxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRoNDAgOS42QzEyMSAyNy41IDE1My4zIDAgMTkyIDBzNzEgMjcuNSA3OC40IDY0SDI4MHpNNjQgMTEyYy04LjggMC0xNiA3LjItMTYgMTZWNDQ4YzAgOC44IDcuMiAxNiAxNiAxNkgzMjBjOC44IDAgMTYtNy4yIDE2LTE2VjEyOGMwLTguOC03LjItMTYtMTYtMTZIMzA0djI0YzAgMTMuMy0xMC43IDI0LTI0IDI0SDE5MiAxMDRjLTEzLjMgMC0yNC0xMC43LTI0LTI0VjExMkg2NHptMTI4LThhMjQgMjQgMCAxIDAgMC00OCAyNCAyNCAwIDEgMCAwIDQ4eiIsCiAgICAgIH0sCiAgICAgIGRpcmVjdGlvbjogInVwIiwKICAgICAgY2xpY2s6IER1YWxDbGljayhjb3B5SW1hZ2VUb0NsaXBib2FyZCwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoKTsKICAgICAgfSksCiAgICB9LAogICAgewogICAgICBuYW1lOiAiRG93bmxvYWQgSW1hZ2UiLAogICAgICBpY29uOiBQbG90bHkuSWNvbnMuY2FtZXJhLAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soc2F2ZUltYWdlVG9GaWxlLCAoKSA9PiB7CiAgICAgICAgcG9wb3V0X2NvbnRhaW5lcih7IGNsOiAiZmlsZXNhdmUiIH0pOwogICAgICB9KSwKICAgIH0sCiAgXQopOwoKZnVuY3Rpb24gZ2V0T2Zmc2V0RGF0YShlbCkgewogIGxldCBjcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsLCBudWxsKTsKICBjb25zdCBvZGF0YSA9IHsKICAgIHBhZGRpbmc6IHsKICAgICAgbGVmdDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSwKICAgICAgYm90dG9tOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSArIHBhcnNlRmxvYXQoY3MucGFkZGluZ0JvdHRvbSksCiAgICB9LAogICAgYm9yZGVyOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyTGVmdFdpZHRoKSwKICAgICAgcmlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyUmlnaHRXaWR0aCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5ib3JkZXJUb3BXaWR0aCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCkgKyBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICB9CiAgfTsKICBpZiAoZWwgPT09IFBMT1QpIHsKICAgIC8vIEZvciB0aGUgUExPVCB3ZSBhbHNvIHdhbnQgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIG9mZnNldAogICAgb2RhdGEub2Zmc2V0ID0gewogICAgICB0b3A6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0VG9wIDogMCwKICAgICAgbGVmdDogUExPVC5vZmZzZXRQYXJlbnQgPT0gQ09OVEFJTkVSID8gUExPVC5vZmZzZXRMZWZ0IDogMCwKICAgIH0KICB9CiAgcmV0dXJuIG9kYXRhOwp9CmZ1bmN0aW9uIGdldFNpemVEYXRhKCkgewogIGNvbnN0IGRhdGEgPSB7CiAgICBwbG90X3BhZDogZ2V0T2Zmc2V0RGF0YShQTE9UKSwKICAgIHBsb3RfcmVjdDogUExPVC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICAgIGNvbnRhaW5lcl9wYWQ6IGdldE9mZnNldERhdGEoQ09OVEFJTkVSKSwKICAgIGNvbnRhaW5lcl9yZWN0OiBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgfTsKICByZXR1cm4gZGF0YTsKfQpmdW5jdGlvbiBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgY29uc3QgY29tcHV0ZWRfc2l6ZSA9IGNvbXB1dGVQbG90U2l6ZShzaXplRGF0YSk7CiAgY29uc3Qgb2Zmc2V0cyA9IGNvbXB1dGVkX3NpemUub2Zmc2V0czsKCiAgY29uc3QgcGxvdF9kYXRhID0gewogICAgd2lkdGg6IHdpZHRoID8/IGNvbXB1dGVkX3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IGhlaWdodCA/PyBjb21wdXRlZF9zaXplLmhlaWdodCwKICB9OwoKICByZXR1cm4gewogICAgd2lkdGg6ICh3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoKSArIG9mZnNldHMud2lkdGgsCiAgICBoZWlnaHQ6IChoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQpICsgb2Zmc2V0cy5oZWlnaHQsCiAgICBub0NoYW5nZTogd2lkdGggPT0gY29tcHV0ZWRfc2l6ZS53aWR0aCAmJiBoZWlnaHQgPT0gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfQp9CgovLyBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hhbmdlIHRoZSBjb250YWluZXIgc2l6ZSBzbyB0aGF0IHRoZSByZXN1bHRpbmcgcGxvdCB3aWxsIGJlIG1hdGNoaW5nIHRoZSBwcm92aWRlZCBzcGVjcwpmdW5jdGlvbiBjaGFuZ2VDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICBpZiAoIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICBjb25zb2xlLmxvZygiVHJpZWQgdG8gY2hhbmdlIGNvbnRhaW5lciBzaXplIHdoZW4gbm90IHBvcHBlZCwgaWdub3JpbmciKTsKICAgIHJldHVybjsKICB9CgogIGNvbnN0IGNzeiA9IGNvbXB1dGVDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSk7CgogIGlmIChjc3oubm9DaGFuZ2UpIHsKICAgIGNvbnNvbGUubG9nKCJTaXplIGlzIHRoZSBzYW1lIGFzIGN1cnJlbnQsIGlnbm9yaW5nIik7CiAgICByZXR1cm4KICB9CiAgLy8gV2UgYXJlIG5vdyBnb2luZyB0byBzZXQgaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgY29udGFpbmVyCiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSBjc3pba2V5XSArICJweCI7CiAgfQp9Ci8vIFdlIG5vdyBjcmVhdGUgdGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCB1cGRhdGUgdGhlIHBsb3QgYmFzZWQgb24gdGhlIHZhbHVlcyBzcGVjaWZpZWQKZnVuY3Rpb24gdXBkYXRlRnJvbUhlYWRlcigpIHsKICBjb25zdCBoZWFkZXJfZGF0YSA9IHsKICAgIGhlaWdodDogY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSwKICAgIHdpZHRoOiBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUsCiAgfTsKICBjaGFuZ2VDb250YWluZXJTaXplKGhlYWRlcl9kYXRhKTsKfQovLyBXZSBhc3NpZ24gdGhpcyBmdW5jdGlvbiB0byB0aGUgb25ibHVyIGV2ZW50IG9mIHdpZHRoIGFuZCBoZWlnaHQKaWYgKGZpcnN0UnVuKSB7CiAgZm9yIChjb25zdCBjb250YWluZXIgb2YgT2JqZWN0LnZhbHVlcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIudWlfc3Bhbi5vbmJsdXIgPSAoZSkgPT4gewogICAgICBjb250YWluZXIudWlfdmFsdWUgPSBjb250YWluZXIudWlfc3Bhbi50ZXh0Q29udGVudDsKICAgICAgdXBkYXRlRnJvbUhlYWRlcigpOwogICAgfTsKICB9Cn0KLy8gVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgcGxvdCBzaXplIHRvIHVzZSBmb3IgcmVsYXlvdXQgYXMgYSBmdW5jdGlvbiBvZiB0aGUgY29udGFpbmVyIHNpemUKZnVuY3Rpb24gY29tcHV0ZVBsb3RTaXplKGRhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgLy8gUmVtb3ZlIFBhZGRpbmcKICBjb25zdCB7IGNvbnRhaW5lcl9wYWQsIHBsb3RfcGFkLCBjb250YWluZXJfcmVjdCB9ID0gZGF0YTsKICBjb25zdCBvZmZzZXRzID0gewogICAgd2lkdGg6CiAgICAgIHBsb3RfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBwbG90X3BhZC5ib3JkZXIud2lkdGggKwogICAgICBwbG90X3BhZC5vZmZzZXQubGVmdCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy53aWR0aCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLndpZHRoLAogICAgaGVpZ2h0OgogICAgICBwbG90X3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIHBsb3RfcGFkLmJvcmRlci5oZWlnaHQgKwogICAgICBwbG90X3BhZC5vZmZzZXQudG9wICsKICAgICAgY29udGFpbmVyX3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLmhlaWdodCwKICB9OwogIGNvbnN0IHN6ID0gewogICAgd2lkdGg6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3Qud2lkdGggLSBvZmZzZXRzLndpZHRoKSwKICAgIGhlaWdodDogTWF0aC5yb3VuZChjb250YWluZXJfcmVjdC5oZWlnaHQgLSBvZmZzZXRzLmhlaWdodCksCiAgICBvZmZzZXRzLAogIH07CiAgcmV0dXJuIHN6Owp9CgovLyBDcmVhdGUgdGhlIHJlc2l6ZU9ic2VydmVyIHRvIG1ha2UgdGhlIHBsb3QgZXZlbiBtb3JlIHJlc3BvbnNpdmUhIDptYWdpYzoKY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHsKICBjb25zdCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCk7CiAgY29uc3Qge2NvbnRhaW5lcl9yZWN0LCBjb250YWluZXJfcGFkfSA9IHNpemVEYXRhOwogIGxldCBwbG90X3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIC8vIFdlIHNhdmUgdGhlIGhlaWdodCBpbiB0aGUgUExPVCBvYmplY3QKICBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQ7CiAgLy8gV2UgZGVhbCB3aXRoIHNvbWUgc3R1ZmYgaWYgdGhlIGNvbnRhaW5lciBpcyBwb3BwcGVkCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9IGNvbnRhaW5lcl9yZWN0LndpZHRoICsgInB4IjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBjb250YWluZXJfcmVjdC5sZWZ0ICsgInB4IjsKICBjb25maWdfc3BhbnMuaGVpZ2h0LnVpX3ZhbHVlID0gcGxvdF9zaXplLmhlaWdodDsKICBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUgPSBwbG90X3NpemUud2lkdGg7CiAgLyogCgkJVGhlIGFkZGl0aW9uIG9mIHRoZSBpbnZhbGlkIGFyZ3VtZW50IGBwbHV0b3Jlc2l6ZWAgc2VlbXMgdG8gZml4IHRoZSBwcm9ibGVtIHdpdGggY2FsbGluZyBgcmVsYXlvdXRgIHNpbXBseSB3aXRoIGB7YXV0b3NpemU6IHRydWV9YCBhcyB1cGRhdGUgYnJlYWtpbmcgbW91c2UgcmVsYXlvdXQgZXZlbnRzIHRyYWNraW5nLiAKCQlTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Bsb3RseS9wbG90bHkuanMvaXNzdWVzLzYxNTYgZm9yIGRldGFpbHMKCQkqLwogIGxldCBjb25maWcgPSB7CiAgICAvLyBJZiB0aGlzIGlzIHBvcHBlZCBvdXQsIHdlIGlnbm9yZSB0aGUgb3JpZ2luYWwgd2lkdGgvaGVpZ2h0CiAgICB3aWR0aDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfd2lkdGgpID8/IHBsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfaGVpZ2h0KSA/PyBwbG90X3NpemUuaGVpZ2h0LAogICAgcGx1dG9yZXNpemU6IHRydWUsCiAgfTsKICBQbG90bHkucmVsYXlvdXQoUExPVCwgY29uZmlnKS50aGVuKCgpID0+IHsKICAgIGlmIChyZW1vdmVfY29udGFpbmVyX3NpemUgJiYgIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIHRoZSBmaXJzdCByZXNpemUgdXBvbiBwbG90IGNyZWF0aW9uIHRvIGFscmVhZHkgYmUgd2l0aG91dCBhIGZpeGVkIGhlaWdodAogICAgICBDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gIiI7CiAgICAgIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogICAgICByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmYWxzZTsKICAgIH0KICB9KTsKfSk7CgpyZXNpemVPYnNlcnZlci5vYnNlcnZlKENPTlRBSU5FUik7CgoKUGxvdGx5LnJlYWN0KFBMT1QsIHBsb3Rfb2JqKS50aGVuKCgpID0+IHsKCS8vIEFzc2lnbiB0aGUgUGxvdGx5IGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKHBsb3RseV9saXN0ZW5lcnMpKSB7CgkJZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcl92ZWMpIHsKCQkJUExPVC5vbihrZXksIGxpc3RlbmVyKQoJCX0KCX0KCS8vIEFzc2lnbiB0aGUgSlMgZXZlbnQgbGlzdGVuZXJzCglmb3IgKGNvbnN0IFtrZXksIGxpc3RlbmVyX3ZlY10gb2YgT2JqZWN0LmVudHJpZXMoanNfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1QuYWRkRXZlbnRMaXN0ZW5lcihrZXksIGxpc3RlbmVyLCB7CgkJCQlzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsCgkJCX0pCgkJfQoJfQp9CikKCgppbnZhbGlkYXRpb24udGhlbigoKSA9PiB7CgkvLyBSZW1vdmUgYWxsIHBsb3RseSBsaXN0ZW5lcnMKCVBMT1QucmVtb3ZlQWxsTGlzdGVuZXJzKCkKCS8vIFJlbW92ZSBhbGwgSlMgbGlzdGVuZXJzCgljb250cm9sbGVyLmFib3J0KCkKCS8vIFJlbW92ZSB0aGUgcmVzaXplT2JzZXJ2ZXIKCXJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKQp9KQoKCgoJCXJldHVybiBDT05UQUlORVIKCTwvc2NyaXB0PgqkbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/oxUyt2ewcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJDM0ODI0ZGI3LTEzYzQtNDVlMi1iZWZhLWYwMjdiOWI1ODVjMLlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgOJNdu1cHVibGlzaGVkX29iamVjdF9rZXlzkdk0YjNiODQwOGMtODE4MS0xMWVmLTE0ZWItZTFjNTY5YjhiYjI5LzQ4YTJjNjQ0YTRmNGU0NrhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SRmMWYzYjcwMC01OTE2LTQ5NmYtYjkzOC00NmY3ZjA4YjRlYjaKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52mqJCTxzY3JpcHQgaWQ9J3Bsb3RfMSc+CgkJLy8gV2Ugc3RhcnQgYnkgcHV0dGluZyBhbGwgdGhlIHZhcmlhYmxlIGludGVycG9sYXRpb24gaGVyZSBhdCB0aGUgYmVnaW5uaW5nCgkJLy8gV2UgaGF2ZSB0byBjb252ZXJ0IGFsbCB0eXBlZGFycmF5cyBpbiB0aGUgbGF5b3V0IHRvIG5vcm1hbCBhcnJheXMuIFNlZSBJc3N1ZSAjMjUKCQkvLyBXZSB1c2UgbG9kYXNoIGZvciB0aGlzIGZvciBjb21wYWN0bmVzcwoJCWZ1bmN0aW9uIHJlbW92ZVR5cGVkQXJyYXkobykgewoJCQlyZXR1cm4gXy5pc1R5cGVkQXJyYXkobykgPyBBcnJheS5mcm9tKG8pIDoKCQkJXy5pc1BsYWluT2JqZWN0KG8pID8gXy5tYXBWYWx1ZXMobywgcmVtb3ZlVHlwZWRBcnJheSkgOiAKCQkJbwoJCX0KCgkJLy8gUHVibGlzaCB0aGUgcGxvdCBvYmplY3QgdG8gSlMKCQlsZXQgcGxvdF9vYmogPSBfLnVwZGF0ZSgvKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIEFic3RyYWN0UGx1dG9EaW5nZXRqZXMuRGlzcGxheS5wdWJsaXNoZWRfdG9fanMgKi8gZ2V0UHVibGlzaGVkT2JqZWN0KCJiM2I4NDA4Yy04MTgxLTExZWYtMTRlYi1lMWM1NjliOGJiMjkvNmY3MDA1NmJjZjFkN2EzMyIpLCAibGF5b3V0IiwgcmVtb3ZlVHlwZWRBcnJheSkKCQkvLyBHZXQgdGhlIHBsb3RseSBsaXN0ZW5lcnMKCQljb25zdCBwbG90bHlfbGlzdGVuZXJzID0ge30KCQkvLyBHZXQgdGhlIEpTIGxpc3RlbmVycwoJCWNvbnN0IGpzX2xpc3RlbmVycyA9IHt9CgkJLy8gRGVhbCB3aXRoIGV2ZW50dWFsIGN1c3RvbSBjbGFzc2VzCgkJbGV0IGN1c3RvbV9jbGFzc2xpc3QgPSBbXQoKCgkJLy8gTG9hZCB0aGUgcGxvdGx5IGxpYnJhcnkKCQlsZXQgUGxvdGx5ID0gdW5kZWZpbmVkCgkJdHJ5IHsKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoIi4vcGxvdGx5anMvcGxvdGx5anMtMi4yNi4yLm1pbi5qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0gY2F0Y2ggKGUpIHsKCQkJY29uc29sZS5sb2coIkxvY2FsIGxvYWQgZmFpbGVkLCB0cnlpbmcgd2l0aCB0aGUgd2ViIGVzbS5zaCB2ZXJzaW9uIikKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoImh0dHBzOi8vZXNtLnNoL3YxMzUvcGxvdGx5LmpzLWRpc3QtbWluQDIuMjYuMi9lc25leHQvcGxvdGx5LmpzLWRpc3QtbWluLm1qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0KCgkJLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0byBmb3JjZSBsb2NhbCBtYXRoamF4IGZvbnQgY2FjaGUKCQlpZiAoZmFsc2UgJiYgd2luZG93Py5NYXRoSmF4Py5jb25maWc/LnN2Zz8uZm9udENhY2hlID09PSAnZ2xvYmFsJykgewoJCQl3aW5kb3cuTWF0aEpheC5jb25maWcuc3ZnLmZvbnRDYWNoZSA9ICdsb2NhbCcKCQl9CgoJCS8vIEZsYWcgdG8gY2hlY2sgaWYgdGhpcyBjZWxsIHdhcyAgbWFudWFsbHkgcmFuIG9yIHJlYWN0aXZlbHkgcmFuCmNvbnN0IGZpcnN0UnVuID0gdGhpcyA/IGZhbHNlIDogdHJ1ZQpjb25zdCBDT05UQUlORVIgPSB0aGlzID8/IGh0bWxgPGRpdiBjbGFzcz0ncGx1dG9wbG90bHktY29udGFpbmVyJz5gCmNvbnN0IFBMT1QgPSBDT05UQUlORVIucXVlcnlTZWxlY3RvcignLmpzLXBsb3RseS1wbG90JykgPz8gQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgPGRpdj5gKQpjb25zdCBwYXJlbnQgPSBDT05UQUlORVIucGFyZW50RWxlbWVudAovLyBXZSB1c2UgYSBjb250cm9sbGVyIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lcnMgdXBvbiBpbnZhbGlkYXRpb24KY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKQovLyBXZSBoYXZlIHRvIGFkZCB0aGlzIHRvIGtlZXAgc3VwcG9ydGluZyBAYmluZCB3aXRoIHRoZSBvbGQgQVBJIHVzaW5nIFBMT1QKUExPVC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChlKSA9PiB7CglDT05UQUlORVIudmFsdWUgPSBQTE9ULnZhbHVlCglpZiAoZS5idWJibGVzKSB7CgkJcmV0dXJuCgl9CglDT05UQUlORVIuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2lucHV0JykpCn0sIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KQoKCS8vIFRoaXMgY3JlYXRlIHRoZSBzdHlsZSBzdWJkaXYgb24gZmlyc3QgcnVuCglmaXJzdFJ1biAmJiBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGAKCTxzdHlsZT4KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgewoJCXdpZHRoOiAxMDAlOwoJCWhlaWdodDogMTAwJTsKCQltaW4taGVpZ2h0OiAwOwoJCW1pbi13aWR0aDogMDsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgLmpzLXBsb3RseS1wbG90IC5wbG90bHkgZGl2IHsKCQltYXJnaW46IDAgYXV0bzsgLy8gVGhpcyBjZW50ZXJzIHRoZSBwbG90Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLnBvcHBlZC1vdXQgewoJCW92ZXJmbG93OiBhdXRvOwoJCXotaW5kZXg6IDEwMDA7CgkJcG9zaXRpb246IGZpeGVkOwoJCXJlc2l6ZTogYm90aDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDBweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMHB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgewoJCWRpc3BsYXk6IGZsZXg7CgkJZmxleC1mbG93OiByb3cgd3JhcDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAxMnB4OwoJCXBvc2l0aW9uOiBmaXhlZDsKCQl6LWluZGV4OiAxMDAxOwoJCWN1cnNvcjogbW92ZTsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIC0xMDAlKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBzcGFuIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJZmxleDogMQoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIuaGlkZGVuIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuIHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlIHsKCQlwYWRkaW5nLXJpZ2h0OiA1cHg7CgkJcGFkZGluZy1sZWZ0OiAycHg7CgkJY3Vyc29yOiB0ZXh0OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZmxleDogMCAwIDEwMCU7CgkJdGV4dC1hbGlnbjogY2VudGVyOwoJCWJvcmRlci10b3A6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQltYXJnaW4tdG9wOiA1cHg7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZpbGVuYW1lIHsKCQltYXJnaW4tbGVmdDogM3B4OwoJCXRleHQtYWxpZ246IGxlZnQ7CgkJbWluLXdpZHRoOiBtaW4oNjAlLCBtaW4tY29udGVudCk7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCAubGFiZWwgewoJCWZsZXg6IDAgMCAwOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5mb3JtYXQgewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCQlmbGV4OiAxIDAgYXV0bzsKCQltaW4td2lkdGg6IDMwcHg7CgkJbWFyZ2luLXJpZ2h0OiAxMHB4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCQlmbGV4LWZsb3c6IGNvbHVtbjsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlwYWRkaW5nLWxlZnQ6IDNweDsKCQl6LWluZGV4OiAyMDAwOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIHsKCQljdXJzb3I6IHBvaW50ZXI7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJcGFkZGluZzogM3B4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKC0zcHgsIC02cHgpOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpub3QoLnNlbGVjdGVkKSB7CgkJbWFyZ2luLXRvcDogM3B4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uLnNlbGVjdGVkIHsKCQlvcmRlcjogLTE7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246aG92ZXIgewoJCWJhY2tncm91bmQtY29sb3I6IHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJfQoJc3Bhbi5jb25maWctdmFsdWUgewoJCWZvbnQtd2VpZ2h0OiBub3JtYWw7CgkJY29sb3I6IHZhcigtLXBsdXRvLW91dHB1dC1jb2xvcik7CgkJZGlzcGxheTogbm9uZTsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIGNhbGMoLTEwMCUgLSAxMHB4KSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLmxhYmVsIHsKCQl1c2VyLXNlbGVjdDogbm9uZTsKCX0KCS5sYWJlbDpob3ZlciBzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCW1pbi13aWR0aDogMTUwcHg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4ubWF0Y2hpbmctY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLW1hY3JvLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5kaWZmZXJlbnQtY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLXRhZy1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9Cjwvc3R5bGU+CmApCgpsZXQgb3JpZ2luYWxfaGVpZ2h0ID0gcGxvdF9vYmoubGF5b3V0LmhlaWdodApsZXQgb3JpZ2luYWxfd2lkdGggPSBwbG90X29iai5sYXlvdXQud2lkdGgKLy8gRm9yIHRoZSBoZWlnaHQgd2UgaGF2ZSB0byBhbHNvIHB1dCBhIGZpeGVkIHZhbHVlIGluIGNhc2UgdGhlIHBsb3QgaXMgcHV0IG9uIGEgbm9uLWZpeGVkLXNpemUgY29udGFpbmVyIChsaWtlIHRoZSBkZWZhdWx0IHdyYXBwZXIpCi8vIFdlIGRlZmluZSBhIHZhcmlhYmxlIHRvIGNoZWNrIHdoZXRoZXIgd2Ugc3RpbGwgaGF2ZSB0byByZW1vdmUgdGhlIGZpeGVkIGhlaWdodApsZXQgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmlyc3RSdW4KbGV0IGNvbnRhaW5lcl9oZWlnaHQgPSBvcmlnaW5hbF9oZWlnaHQgPz8gUExPVC5jb250YWluZXJfaGVpZ2h0ID8/IDQwMApDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX2hlaWdodCArICdweCcKCi8vIFdlIGNyZWF0ZSBhIFByb21pc2UgdmVyc2lvbiBvZiBzZXRUaW1lb3V0CmZ1bmN0aW9uIGRlbGF5KG1zKSB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7Cn0KCi8vIFdlIGltcG9ydCBpbnRlcmFjdCBmb3IgZHJhZ2dpbmcvcmVzaXppbmcKY29uc3QgeyBkZWZhdWx0OiBpbnRlcmFjdCB9ID0gYXdhaXQgaW1wb3J0KCdodHRwczovL2VzbS5zaC9pbnRlcmFjdGpzQDEuMTAuMTknKQoKCmZ1bmN0aW9uIGdldEltYWdlT3B0aW9ucygpIHsKICBjb25zdCBvID0gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogIHJldHVybiB7CiAgICBmb3JtYXQ6IG8uZm9ybWF0ID8/ICJwbmciLAogICAgd2lkdGg6IG8ud2lkdGggPz8gb3JpZ2luYWxfd2lkdGgsCiAgICBoZWlnaHQ6IG8uaGVpZ2h0ID8/IG9yaWdpbmFsX2hlaWdodCwKICAgIHNjYWxlOiBvLnNjYWxlID8/IDEsCiAgICBmaWxlbmFtZTogby5maWxlbmFtZSA/PyAibmV3cGxvdCIsCiAgfTsKfQoKY29uc3QgQ0xJUEJPQVJEX0hFQURFUiA9CiAgQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoIi5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIikgPz8KICBDT05UQUlORVIuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgImFmdGVyYmVnaW4iLAogICAgaHRtbGA8ZGl2IGNsYXNzPSJwbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIGhpZGRlbiI+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmb3JtYXQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+Rm9ybWF0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZvcm1hdCI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB3aWR0aCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5XaWR0aDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSB3aWR0aCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGhlaWdodCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5IZWlnaHQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgaGVpZ2h0Ij48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2NhbGUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+U2NhbGU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgc2NhbGUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzZXQiPlNldDwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB1bnNldCI+VW5zZXQ8L2J1dHRvbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZpbGVuYW1lIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZpbGVuYW1lOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZpbGVuYW1lIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgIDwvZGl2PmAKICApOwoKZnVuY3Rpb24gY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcikgewogIGNvbnN0IHZhbGlkX2NsYXNzZXMgPSBbCiAgICAibWlzc2luZy1jb25maWciLAogICAgIm1hdGNoaW5nLWNvbmZpZyIsCiAgICAiZGlmZmVyZW50LWNvbmZpZyIsCiAgXTsKICBmdW5jdGlvbiBzZXRDbGFzcyhjbCkgewogICAgZm9yIChjb25zdCBuYW1lIG9mIHZhbGlkX2NsYXNzZXMpIHsKICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUobmFtZSwgbmFtZSA9PSBjbCk7CiAgICB9CiAgfQogIC8vIFdlIHVzZSB0aGUgY3VzdG9tIGdldHRlcnMgd2UnbGwgc2V0IHVwIGluIHRoZSBjb250YWluZXIKICBjb25zdCB7IHVpX3ZhbHVlLCBjb25maWdfdmFsdWUsIGNvbmZpZ19zcGFuLCBrZXkgfSA9IGNvbnRhaW5lcjsKICBpZiAoY29uZmlnX3ZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgIHNldENsYXNzKCJtaXNzaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBpcyBub3QgcHJlc2VudCBpbiB0aGUgY29uZmlnLmA7CiAgfSBlbHNlIGlmICh1aV92YWx1ZSA9PSBjb25maWdfdmFsdWUpIHsKICAgIHNldENsYXNzKCJtYXRjaGluZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIHRoZSBzYW1lIHZhbHVlIGluIHRoZSBjb25maWcgYW5kIGluIHRoZSBoZWFkZXIuYDsKICB9IGVsc2UgewogICAgc2V0Q2xhc3MoImRpZmZlcmVudC1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIGEgZGlmZmVyZW50IHZhbHVlICg8ZW0+JHtjb25maWdfdmFsdWV9PC9lbT4pIGluIHRoZSBjb25maWcuYDsKICB9CiAgLy8gQWRkIGluZm8gYWJvdXQgc2V0dGluZyBhbmQgdW5zZXR0aW5nCiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIG9uIHRoZSBsYWJlbCA8ZW0+PGI+b25jZTwvYj48L2VtPiB0byBzZXQgdGhlIGN1cnJlbnQgVUkgdmFsdWUgaW4gdGhlIGNvbmZpZy5gCiAgKTsKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgPGVtPjxiPnR3aWNlPC9iPjwvZW0+IHRvIHJlbW92ZSB0aGlzIGtleSBmcm9tIHRoZSBjb25maWcuYAogICk7Cn0KCmNvbnN0IHZhbGlkX2Zvcm1hdHMgPSBbInBuZyIsICJzdmciLCAid2VicCIsICJqcGVnIiwgImZ1bGwtanNvbiJdOwpmdW5jdGlvbiBpbml0aWFsaXplVUlWYWx1ZVNwYW4oc3Bhbiwga2V5LCB2YWx1ZSkgewogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSBrZXkgPT09ICJmb3JtYXQiID8gImZhbHNlIiA6ICJ0cnVlIjsKICBsZXQgcGFyc2UgPSAoeCkgPT4geDsKICBsZXQgdXBkYXRlID0gKHgpID0+IChzcGFuLnRleHRDb250ZW50ID0geCk7CiAgaWYgKGtleSA9PT0gIndpZHRoIiB8fCBrZXkgPT09ICJoZWlnaHQiKSB7CiAgICBwYXJzZSA9ICh4KSA9PiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoeCkpOwogIH0gZWxzZSBpZiAoa2V5ID09PSAic2NhbGUiKSB7CiAgICBwYXJzZSA9IHBhcnNlRmxvYXQ7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAvLyBXZSByZW1vdmUgY29udGVudEVkaXRhYmxlCiAgICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9ICJmYWxzZSI7CiAgICAvLyBIZXJlIHdlIGZpcnN0IGFkZCB0aGUgc3Vic3BhbnMgZm9yIGVhY2ggb3B0aW9uCiAgICBjb25zdCBvcHRzX2RpdiA9IHNwYW4uYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2IGNsYXNzPSJmb3JtYXQtb3B0aW9ucyI+PC9kaXY+YCk7CiAgICBmb3IgKGNvbnN0IGZtdCBvZiB2YWxpZF9mb3JtYXRzKSB7CiAgICAgIGNvbnN0IG9wdCA9IG9wdHNfZGl2LmFwcGVuZENoaWxkKAogICAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImZvcm1hdC1vcHRpb24gJHtmbXR9Ij4ke2ZtdH08L3NwYW4+YAogICAgICApOwogICAgICBvcHQub25jbGljayA9IChlKSA9PiB7CiAgICAgICAgc3Bhbi52YWx1ZSA9IG9wdC50ZXh0Q29udGVudDsKICAgICAgfTsKICAgIH0KICAgIHBhcnNlID0gKHgpID0+IHsKICAgICAgcmV0dXJuIHZhbGlkX2Zvcm1hdHMuaW5jbHVkZXMoeCkgPyB4IDogbG9jYWxWYWx1ZTsKICAgIH07CiAgICB1cGRhdGUgPSAoeCkgPT4gewogICAgICBmb3IgKGNvbnN0IG9wdCBvZiBvcHRzX2Rpdi5jaGlsZHJlbikgewogICAgICAgIG9wdC5jbGFzc0xpc3QudG9nZ2xlKCJzZWxlY3RlZCIsIG9wdC50ZXh0Q29udGVudCA9PT0geCk7CiAgICAgIH0KICAgIH07CiAgfSBlbHNlIHsKICAgIC8vIFdlIG9ubHkgaGF2ZSBmaWxlbmFtZSBoZXJlCiAgfQogIGxldCBsb2NhbFZhbHVlOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIGxvY2FsVmFsdWU7CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIGlmICh2YWwgIT09ICIiKSB7CiAgICAgICAgbG9jYWxWYWx1ZSA9IHBhcnNlKHZhbCk7CiAgICAgIH0KICAgICAgdXBkYXRlKGxvY2FsVmFsdWUpOwogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7CiAgLy8gV2UgYWxzbyBhc3NpZ24gYSBsaXN0ZW5lciBzbyB0aGF0IHRoZSBlZGl0YWJsZSBpcyBibHVycmVkIHdoZW4gZW50ZXIgaXMgcHJlc3NlZAogIHNwYW4ub25rZXlkb3duID0gKGUpID0+IHsKICAgIGlmIChlLmtleUNvZGUgPT09IDEzKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgc3Bhbi5ibHVyKCk7CiAgICB9CiAgfTsKICBzcGFuLnZhbHVlID0gdmFsdWU7Cn0KCmZ1bmN0aW9uIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oc3Bhbiwga2V5KSB7CiAgLy8gSGVyZSB3ZSBtb3N0bHkgd2FudCB0byBkZWZpbmUgdGhlIHNldHRlciBhbmQgZ2V0dGVyCiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgLy8gaWYgdW5kZWZpbmVkIGlzIHBhc3NlZCwgd2UgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBvcHRpb25zCiAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGRlbGV0ZSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XSA9IHZhbDsKICAgICAgfQogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7Cn0KCmNvbnN0IGNvbmZpZ19zcGFucyA9IHt9Owpmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhnZXRJbWFnZU9wdGlvbnMoKSkpIHsKICBjb25zdCBjb250YWluZXIgPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoYC5jbGlwYm9hcmQtc3Bhbi4ke2tleX1gKTsKICBjb25zdCBsYWJlbCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIubGFiZWwiKTsKICAvLyBXZSBnaXZlIHRoZSBsYWJlbCBhIGZ1bmN0aW9uIHRoYXQgb24gc2luZ2xlIGNsaWNrIHdpbGwgc2V0IHRoZSBjdXJyZW50IHZhbHVlIGFuZCB3aXRoIGRvdWJsZSBjbGljayB3aWxsIHVuc2V0IGl0CiAgbGFiZWwub25jbGljayA9IER1YWxDbGljaygKICAgICgpID0+IHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0sCiAgICAoZSkgPT4gewogICAgICBjb25zb2xlLmxvZygiZSIsIGUpOwogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSB1bmRlZmluZWQ7CiAgICB9CiAgKTsKICBjb25zdCB1aV92YWx1ZV9zcGFuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtdmFsdWUiKTsKICBjb25zdCBjb25maWdfdmFsdWVfc3BhbiA9CiAgICBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNvbmZpZy12YWx1ZSIpID8/CiAgICBsYWJlbC5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAgICJhZnRlcmJlZ2luIiwKICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iY29uZmlnLXZhbHVlIj48L3NwYW4+YAogICAgKTsKICAvLyBBc3NpbmcgdGhlIHR3byBzcGFucyBhcyBwcm9wZXJ0aWVzIG9mIHRoZSBjb250YWluaW5nIHNwYW4KICBjb250YWluZXIudWlfc3BhbiA9IHVpX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmNvbmZpZ19zcGFuID0gY29uZmlnX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmtleSA9IGtleTsKICBjb25maWdfc3BhbnNba2V5XSA9IGNvbnRhaW5lcjsKICBpZiAoZmlyc3RSdW4pIHsKICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA9CiAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICAgIC8vIFdlIGRvIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdmFsdWUgc3BhbgogICAgaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHVpX3ZhbHVlX3NwYW4sIGtleSwgdmFsdWUpOwogICAgLy8gVGhlbiB3ZSBpbml0aWFsaXplIHRoZSBjb25maWcgdmFsdWUKICAgIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oY29uZmlnX3ZhbHVlX3NwYW4sIGtleSk7CiAgICAvLyBXZSBwdXQgc29tZSBjb252ZW5pZW5jZSBnZXR0ZXJzL3NldHRlcnMKICAgIC8vIHVpX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJ1aV92YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiB1aV92YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICB1aV92YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgICAvLyBjb25maWdfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgImNvbmZpZ192YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICB9Cn0KCi8vIFRoZXNlIG9iamVjdHMgd2lsbCBjb250YWluIHRoZSBkZWZhdWx0IHZhbHVlCgovLyBUaGlzIGNvZGUgdXBkYXRlcyB0aGUgaW1hZ2Ugb3B0aW9ucyBpbiB0aGUgUExPVCBjb25maWcgd2l0aCB0aGUgcHJvdmlkZWQgb25lcwpmdW5jdGlvbiBzZXRJbWFnZU9wdGlvbnMobykgewogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gb1trZXldOwogIH0KfQpmdW5jdGlvbiB1bnNldEltYWdlT3B0aW9ucygpIHsKICBzZXRJbWFnZU9wdGlvbnMoe30pOwp9Cgpjb25zdCBzZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4uc2V0Iik7CmNvbnN0IHVuc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnVuc2V0Iik7CmlmIChmaXJzdFJ1bikgewogIHNldF9idXR0b24ub25jbGljayA9IChlKSA9PiB7CiAgICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0KICB9OwogIHVuc2V0X2J1dHRvbi5vbmNsaWNrID0gdW5zZXRJbWFnZU9wdGlvbnM7Cn0KCi8vIFdlIGFkZCBhIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBjbGlwYm9hcmQgaXMgcG9wcGVkIG91dApDT05UQUlORVIuaXNQb3BwZWRPdXQgPSAoKSA9PiB7CiAgcmV0dXJuIENPTlRBSU5FUi5jbGFzc0xpc3QuY29udGFpbnMoInBvcHBlZC1vdXQiKTsKfTsKCkNMSVBCT0FSRF9IRUFERVIub25tb3VzZWRvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHsKICBpZiAoZXZlbnQudGFyZ2V0Lm1hdGNoZXMoInNwYW4uY2xpcGJvYXJkLXZhbHVlIikpIHsKICAgIGNvbnNvbGUubG9nKCJXZSBkb24ndCBtb3ZlISIpOwogICAgcmV0dXJuOwogIH0KICBjb25zdCBzdGFydCA9IHsKICAgIGxlZnQ6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLmxlZnQpLAogICAgdG9wOiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS50b3ApLAogICAgWDogZXZlbnQucGFnZVgsCiAgICBZOiBldmVudC5wYWdlWSwKICB9OwogIGZ1bmN0aW9uIG1vdmVBdChldmVudCwgc3RhcnQpIHsKICAgIGNvbnN0IHRvcCA9IGV2ZW50LnBhZ2VZIC0gc3RhcnQuWSArIHN0YXJ0LnRvcCArICJweCI7CiAgICBjb25zdCBsZWZ0ID0gZXZlbnQucGFnZVggLSBzdGFydC5YICsgc3RhcnQubGVmdCArICJweCI7CiAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9IHRvcDsKICB9CgogIC8vIG1vdmUgb3VyIGFic29sdXRlbHkgcG9zaXRpb25lZCBiYWxsIHVuZGVyIHRoZSBwb2ludGVyCiAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQpIHsKICAgIG1vdmVBdChldmVudCwgc3RhcnQpOwogIH0KCiAgLy8gV2UgdXNlIHRoaXMgdG8gcmVtb3ZlIHRoZSBtb3VzZW1vdmUgd2hlbiBjbGlja2luZyBvdXRzaWRlIG9mIHRoZSBjb250YWluZXIKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICAvLyBtb3ZlIHRoZSBjb250YWluZXIgb24gbW91c2Vtb3ZlCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgb25Nb3VzZU1vdmUsIHsKICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsCiAgfSk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgY2xlYW5VcCgpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7CgogIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICBjb25zb2xlLmxvZygiY2xlYW5pbmcgdXAgdGhlIHBsb3QgbW92ZSBsaXN0ZW5lciIpOwogICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBudWxsOwogIH0KCiAgLy8gKDMpIGRyb3AgdGhlIGJhbGwsIHJlbW92ZSB1bm5lZWRlZCBoYW5kbGVycwogIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gY2xlYW5VcDsKfTsKCmZ1bmN0aW9uIHNlbmRUb0NsaXBib2FyZChibG9iKSB7CiAgaWYgKCFuYXZpZ2F0b3IuY2xpcGJvYXJkKSB7CiAgICBhbGVydCgKICAgICAgIlRoZSBDbGlwYm9hcmQgQVBJIGRvZXMgbm90IHNlZW0gdG8gYmUgYXZhaWxhYmxlLCBtYWtlIHN1cmUgdGhlIFBsdXRvIG5vdGVib29rIGlzIGJlaW5nIHVzZWQgZnJvbSBlaXRoZXIgbG9jYWxob3N0IG9yIGFuIGh0dHBzIHNvdXJjZS4iCiAgICApOwogIH0KICBuYXZpZ2F0b3IuY2xpcGJvYXJkCiAgICAud3JpdGUoWwogICAgICBuZXcgQ2xpcGJvYXJkSXRlbSh7CiAgICAgICAgLy8gVGhlIGtleSBpcyBkZXRlcm1pbmVkIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBibG9iJ3MgdHlwZS4KICAgICAgICBbYmxvYi50eXBlXTogYmxvYiwKICAgICAgfSksCiAgICBdKQogICAgLnRoZW4oCiAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICBjb25zb2xlLmxvZygiQXN5bmM6IENvcHlpbmcgdG8gY2xpcGJvYXJkIHdhcyBzdWNjZXNzZnVsISIpOwogICAgICB9LAogICAgICBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiQXN5bmM6IENvdWxkIG5vdCBjb3B5IHRleHQ6ICIsIGVycik7CiAgICAgIH0KICAgICk7Cn0KCmZ1bmN0aW9uIGNvcHlJbWFnZVRvQ2xpcGJvYXJkKCkgewogIC8vIFdlIGV4dHJhY3QgdGhlIGltYWdlIG9wdGlvbnMgZnJvbSB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycyAoaWYgdGhleSBleGlzdCkKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LiBXZSBhbHNvIGlnbm9yZSBmb3JtYXQgYmVjYXVzZSB0aGUgY2xpcGJvYXJkIG9ubHkgc3VwcG9ydHMgcG5nLgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gImZvcm1hdCIpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LnRvSW1hZ2UoUExPVCwgY29uZmlnKS50aGVuKGZ1bmN0aW9uIChkYXRhVXJsKSB7CiAgICBmZXRjaChkYXRhVXJsKQogICAgICAudGhlbigocmVzKSA9PiByZXMuYmxvYigpKQogICAgICAudGhlbigoYmxvYikgPT4gewogICAgICAgIGNvbnN0IHBhc3RlX3JlY2VpdmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigncGFzdGUtcmVjZWl2ZXIucGx1dG9wbG90bHknKQogICAgICAgIGlmIChwYXN0ZV9yZWNlaXZlcikgewogICAgICAgICAgcGFzdGVfcmVjZWl2ZXIuYXR0YWNoSW1hZ2UoZGF0YVVybCwgQ09OVEFJTkVSKQogICAgICAgIH0KICAgICAgICBzZW5kVG9DbGlwYm9hcmQoYmxvYikKICAgICAgfSk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHNhdmVJbWFnZVRvRmlsZSgpIHsKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS5kb3dubG9hZEltYWdlKFBMT1QsIGNvbmZpZyk7Cn0KCmxldCBjb250YWluZXJfcmVjdCA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCwgdG9wOiAwLCBsZWZ0OiAwIH07CmZ1bmN0aW9uIHVucG9wX2NvbnRhaW5lcihjbCkgewogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgZmFsc2UpOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBmYWxzZSk7CiAgLy8gV2UgZml4IHRoZSBoZWlnaHQgYmFjayB0byB0aGUgdmFsdWUgaXQgaGFkIGJlZm9yZSBwb3BvdXQsIGFsc28gc2V0dGluZyB0aGUgZmxhZyB0byBzaWduYWwgdGhhdCB1cG9uIGZpcnN0IHJlc2l6ZSB3ZSByZW1vdmUgdGhlIGZpeGVkIGlubGluZS1zdHlsZQogIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQgKyAicHgiOwogIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IHRydWU7CiAgLy8gV2Ugc2V0IHRoZSBvdGhlciBmaXhlZCBpbmxpbmUtc3R5bGVzIHRvIG51bGwKICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICBDT05UQUlORVIuc3R5bGUudG9wID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBXZSBhbHNvIHJlbW92ZSB0aGUgQ0xJUEJPQVJEX0hFQURFUgogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSAiIjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBGaW5hbGx5IHdlIHJlbW92ZSB0aGUgaGlkZGVuIGNsYXNzIHRvIHRoZSBoZWFkZXIKICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIHRydWUpOwogIHJldHVybjsKfQpmdW5jdGlvbiBwb3BvdXRfY29udGFpbmVyKG9wdHMpIHsKICBjb25zdCBjbCA9IG9wdHM/LmNsOwogIGNvbnN0IHRhcmdldF9jb250YWluZXJfc2l6ZSA9IG9wdHM/LnRhcmdldF9jb250YWluZXJfc2l6ZSA/PyB7fTsKICBjb25zdCB0YXJnZXRfcGxvdF9zaXplID0gb3B0cz8udGFyZ2V0X3Bsb3Rfc2l6ZSA/PyB7fTsKICBpZiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIHJldHVybiB1bnBvcF9jb250YWluZXIoY2wpOwogIH0KICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgY2wgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdHJ1ZSk7CiAgLy8gV2UgZXh0cmFjdCB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjb250YWluZXIsIHNhdmUgdGhlbSBhbmQgZml4IHRoZW0KICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9ID0gQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogIGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfTsKICAvLyBXZSBzYXZlIHRoZSBjdXJyZW50IHBsb3Qgc2l6ZSBiZWZvcmUgd2UgcG9wIGFzIGl0IHdpbGwgZmlsbCB0aGUgc2NyZWVuCiAgY29uc3QgY3VycmVudF9wbG90X3NpemUgPSB7CiAgICB3aWR0aDogUExPVC5fZnVsbExheW91dC53aWR0aCwKICAgIGhlaWdodDogUExPVC5fZnVsbExheW91dC5oZWlnaHQsCiAgfTsKICAvLyBXZSBoYXZlIHRvIHNhdmUgdGhlIHBhZCBkYXRhIGJlZm9yZSBwb3BwaW5nIHNvIHdlIGNhbiByZXNpemUgcHJlY2lzZWx5CiAgY29uc3QgcGFkID0ge307CiAgcGFkLnVucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgdHJ1ZSk7CiAgcGFkLnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICAvLyBXZSBkbyB0b3AgYW5kIGxlZnQgYmFzZWQgb24gdGhlIGN1cnJlbnQgcmVjdAogIGZvciAoY29uc3Qga2V5IG9mIFsidG9wIiwgImxlZnQiXSkgewogICAgY29uc3Qgc3RhcnRfdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY29udGFpbmVyX3JlY3Rba2V5XTsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgZm9yIChjb25zdCBraW5kIG9mIFsicGFkZGluZyIsICJib3JkZXIiXSkgewogICAgICBvZmZzZXQgKz0gcGFkLnBvcHBlZFtraW5kXVtrZXldIC0gcGFkLnVucG9wcGVkW2tpbmRdW2tleV07CiAgICB9CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHN0YXJ0X3ZhbCAtIG9mZnNldCArICJweCI7CiAgICBpZiAoa2V5ID09PSAibGVmdCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIC8vIFdlIGNvbXB1dGUgdGhlIHdpZHRoIGFuZCBoZWlnaHQgZGVwZW5kaW5nIG9uIGV2ZW50dWFsIGNvbmZpZyBkYXRhCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoewogICAgd2lkdGg6CiAgICAgIHRhcmdldF9wbG90X3NpemUud2lkdGggPz8KICAgICAgY29uZmlnX3NwYW5zLndpZHRoLmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS5oZWlnaHQgPz8KICAgICAgY29uZmlnX3NwYW5zLmhlaWdodC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUuaGVpZ2h0LAogIH0pOwogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIGNvbnN0IHZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNzeltrZXldOwogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSB2YWwgKyAicHgiOwogICAgaWYgKGtleSA9PT0gIndpZHRoIikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCBmYWxzZSk7CiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgdW5wb3BfY29udGFpbmVyKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKfQoKQ09OVEFJTkVSLnBvcE91dCA9IHBvcG91dF9jb250YWluZXI7CgpmdW5jdGlvbiBEdWFsQ2xpY2soc2luZ2xlX2Z1bmMsIGRibF9mdW5jKSB7CiAgbGV0IG5jbGlja3MgPSAwOwogIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykgewogICAgbmNsaWNrcyArPSAxOwogICAgaWYgKG5jbGlja3MgPiAxKSB7CiAgICAgIGRibF9mdW5jKC4uLmFyZ3MpOwogICAgICBuY2xpY2tzID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIGRlbGF5KDMwMCkudGhlbigoKSA9PiB7CiAgICAgICAgaWYgKG5jbGlja3MgPT0gMSkgewogICAgICAgICAgc2luZ2xlX2Z1bmMoLi4uYXJncyk7CiAgICAgICAgfQogICAgICAgIG5jbGlja3MgPSAwOwogICAgICB9KTsKICAgIH0KICB9Owp9CgovLyBXZSByZW1vdmUgdGhlIGRlZmF1bHQgZG93bmxvYWQgaW1hZ2UgYnV0dG9uCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSwKICBbInRvSW1hZ2UiXQopOwovLyBXZSBhZGQgdGhlIGN1c3RvbSBidXR0b24gdG8gdGhlIG1vZGViYXIKcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkLAogIFsKICAgIHsKICAgICAgbmFtZTogIkNvcHkgUE5HIHRvIENsaXBib2FyZCIsCiAgICAgIGljb246IHsKICAgICAgICBoZWlnaHQ6IDUyMCwKICAgICAgICB3aWR0aDogNTIwLAogICAgICAgIHBhdGg6ICJNMjgwIDY0aDQwYzM1LjMgMCA2NCAyOC43IDY0IDY0VjQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEg2NGMtMzUuMyAwLTY0LTI4LjctNjQtNjRWMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0aDQwIDkuNkMxMjEgMjcuNSAxNTMuMyAwIDE5MiAwczcxIDI3LjUgNzguNCA2NEgyODB6TTY0IDExMmMtOC44IDAtMTYgNy4yLTE2IDE2VjQ0OGMwIDguOCA3LjIgMTYgMTYgMTZIMzIwYzguOCAwIDE2LTcuMiAxNi0xNlYxMjhjMC04LjgtNy4yLTE2LTE2LTE2SDMwNHYyNGMwIDEzLjMtMTAuNyAyNC0yNCAyNEgxOTIgMTA0Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNFYxMTJINjR6bTEyOC04YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHoiLAogICAgICB9LAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soY29weUltYWdlVG9DbGlwYm9hcmQsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKCk7CiAgICAgIH0pLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIkRvd25sb2FkIEltYWdlIiwKICAgICAgaWNvbjogUGxvdGx5Lkljb25zLmNhbWVyYSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKHNhdmVJbWFnZVRvRmlsZSwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoeyBjbDogImZpbGVzYXZlIiB9KTsKICAgICAgfSksCiAgICB9LAogIF0KKTsKCmZ1bmN0aW9uIGdldE9mZnNldERhdGEoZWwpIHsKICBsZXQgY3MgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgbnVsbCk7CiAgY29uc3Qgb2RhdGEgPSB7CiAgICBwYWRkaW5nOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgfSwKICAgIGJvcmRlcjogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgfQogIH07CiAgaWYgKGVsID09PSBQTE9UKSB7CiAgICAvLyBGb3IgdGhlIFBMT1Qgd2UgYWxzbyB3YW50IHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBvZmZzZXQKICAgIG9kYXRhLm9mZnNldCA9IHsKICAgICAgdG9wOiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldFRvcCA6IDAsCiAgICAgIGxlZnQ6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0TGVmdCA6IDAsCiAgICB9CiAgfQogIHJldHVybiBvZGF0YTsKfQpmdW5jdGlvbiBnZXRTaXplRGF0YSgpIHsKICBjb25zdCBkYXRhID0gewogICAgcGxvdF9wYWQ6IGdldE9mZnNldERhdGEoUExPVCksCiAgICBwbG90X3JlY3Q6IFBMT1QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgICBjb250YWluZXJfcGFkOiBnZXRPZmZzZXREYXRhKENPTlRBSU5FUiksCiAgICBjb250YWluZXJfcmVjdDogQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogIH07CiAgcmV0dXJuIGRhdGE7Cn0KZnVuY3Rpb24gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGNvbnN0IGNvbXB1dGVkX3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIGNvbnN0IG9mZnNldHMgPSBjb21wdXRlZF9zaXplLm9mZnNldHM7CgogIGNvbnN0IHBsb3RfZGF0YSA9IHsKICAgIHdpZHRoOiB3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiBoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfTsKCiAgcmV0dXJuIHsKICAgIHdpZHRoOiAod2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCkgKyBvZmZzZXRzLndpZHRoLAogICAgaGVpZ2h0OiAoaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0KSArIG9mZnNldHMuaGVpZ2h0LAogICAgbm9DaGFuZ2U6IHdpZHRoID09IGNvbXB1dGVkX3NpemUud2lkdGggJiYgaGVpZ2h0ID09IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH0KfQoKLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGNoYW5nZSB0aGUgY29udGFpbmVyIHNpemUgc28gdGhhdCB0aGUgcmVzdWx0aW5nIHBsb3Qgd2lsbCBiZSBtYXRjaGluZyB0aGUgcHJvdmlkZWQgc3BlY3MKZnVuY3Rpb24gY2hhbmdlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgaWYgKCFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgY29uc29sZS5sb2coIlRyaWVkIHRvIGNoYW5nZSBjb250YWluZXIgc2l6ZSB3aGVuIG5vdCBwb3BwZWQsIGlnbm9yaW5nIik7CiAgICByZXR1cm47CiAgfQoKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEpOwoKICBpZiAoY3N6Lm5vQ2hhbmdlKSB7CiAgICBjb25zb2xlLmxvZygiU2l6ZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50LCBpZ25vcmluZyIpOwogICAgcmV0dXJuCiAgfQogIC8vIFdlIGFyZSBub3cgZ29pbmcgdG8gc2V0IGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGNvbnRhaW5lcgogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gY3N6W2tleV0gKyAicHgiOwogIH0KfQovLyBXZSBub3cgY3JlYXRlIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgdXBkYXRlIHRoZSBwbG90IGJhc2VkIG9uIHRoZSB2YWx1ZXMgc3BlY2lmaWVkCmZ1bmN0aW9uIHVwZGF0ZUZyb21IZWFkZXIoKSB7CiAgY29uc3QgaGVhZGVyX2RhdGEgPSB7CiAgICBoZWlnaHQ6IGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUsCiAgICB3aWR0aDogY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlLAogIH07CiAgY2hhbmdlQ29udGFpbmVyU2l6ZShoZWFkZXJfZGF0YSk7Cn0KLy8gV2UgYXNzaWduIHRoaXMgZnVuY3Rpb24gdG8gdGhlIG9uYmx1ciBldmVudCBvZiB3aWR0aCBhbmQgaGVpZ2h0CmlmIChmaXJzdFJ1bikgewogIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLnVpX3NwYW4ub25ibHVyID0gKGUpID0+IHsKICAgICAgY29udGFpbmVyLnVpX3ZhbHVlID0gY29udGFpbmVyLnVpX3NwYW4udGV4dENvbnRlbnQ7CiAgICAgIHVwZGF0ZUZyb21IZWFkZXIoKTsKICAgIH07CiAgfQp9Ci8vIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIHBsb3Qgc2l6ZSB0byB1c2UgZm9yIHJlbGF5b3V0IGFzIGEgZnVuY3Rpb24gb2YgdGhlIGNvbnRhaW5lciBzaXplCmZ1bmN0aW9uIGNvbXB1dGVQbG90U2l6ZShkYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIC8vIFJlbW92ZSBQYWRkaW5nCiAgY29uc3QgeyBjb250YWluZXJfcGFkLCBwbG90X3BhZCwgY29udGFpbmVyX3JlY3QgfSA9IGRhdGE7CiAgY29uc3Qgb2Zmc2V0cyA9IHsKICAgIHdpZHRoOgogICAgICBwbG90X3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLndpZHRoICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LmxlZnQgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci53aWR0aCwKICAgIGhlaWdodDoKICAgICAgcGxvdF9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBwbG90X3BhZC5ib3JkZXIuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LnRvcCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci5oZWlnaHQsCiAgfTsKICBjb25zdCBzeiA9IHsKICAgIHdpZHRoOiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LndpZHRoIC0gb2Zmc2V0cy53aWR0aCksCiAgICBoZWlnaHQ6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3QuaGVpZ2h0IC0gb2Zmc2V0cy5oZWlnaHQpLAogICAgb2Zmc2V0cywKICB9OwogIHJldHVybiBzejsKfQoKLy8gQ3JlYXRlIHRoZSByZXNpemVPYnNlcnZlciB0byBtYWtlIHRoZSBwbG90IGV2ZW4gbW9yZSByZXNwb25zaXZlISA6bWFnaWM6CmNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7CiAgY29uc3Qgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpOwogIGNvbnN0IHtjb250YWluZXJfcmVjdCwgY29udGFpbmVyX3BhZH0gPSBzaXplRGF0YTsKICBsZXQgcGxvdF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICAvLyBXZSBzYXZlIHRoZSBoZWlnaHQgaW4gdGhlIFBMT1Qgb2JqZWN0CiAgUExPVC5jb250YWluZXJfaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0OwogIC8vIFdlIGRlYWwgd2l0aCBzb21lIHN0dWZmIGlmIHRoZSBjb250YWluZXIgaXMgcG9wcHBlZAogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSBjb250YWluZXJfcmVjdC53aWR0aCArICJweCI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gY29udGFpbmVyX3JlY3QubGVmdCArICJweCI7CiAgY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS5oZWlnaHQ7CiAgY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlID0gcGxvdF9zaXplLndpZHRoOwogIC8qIAoJCVRoZSBhZGRpdGlvbiBvZiB0aGUgaW52YWxpZCBhcmd1bWVudCBgcGx1dG9yZXNpemVgIHNlZW1zIHRvIGZpeCB0aGUgcHJvYmxlbSB3aXRoIGNhbGxpbmcgYHJlbGF5b3V0YCBzaW1wbHkgd2l0aCBge2F1dG9zaXplOiB0cnVlfWAgYXMgdXBkYXRlIGJyZWFraW5nIG1vdXNlIHJlbGF5b3V0IGV2ZW50cyB0cmFja2luZy4gCgkJU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wbG90bHkvcGxvdGx5LmpzL2lzc3Vlcy82MTU2IGZvciBkZXRhaWxzCgkJKi8KICBsZXQgY29uZmlnID0gewogICAgLy8gSWYgdGhpcyBpcyBwb3BwZWQgb3V0LCB3ZSBpZ25vcmUgdGhlIG9yaWdpbmFsIHdpZHRoL2hlaWdodAogICAgd2lkdGg6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX3dpZHRoKSA/PyBwbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX2hlaWdodCkgPz8gcGxvdF9zaXplLmhlaWdodCwKICAgIHBsdXRvcmVzaXplOiB0cnVlLAogIH07CiAgUGxvdGx5LnJlbGF5b3V0KFBMT1QsIGNvbmZpZykudGhlbigoKSA9PiB7CiAgICBpZiAocmVtb3ZlX2NvbnRhaW5lcl9zaXplICYmICFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBhdm9pZCB0aGUgZmlyc3QgcmVzaXplIHVwb24gcGxvdCBjcmVhdGlvbiB0byBhbHJlYWR5IGJlIHdpdGhvdXQgYSBmaXhlZCBoZWlnaHQKICAgICAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9ICIiOwogICAgICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICAgICAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmFsc2U7CiAgICB9CiAgfSk7Cn0pOwoKcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShDT05UQUlORVIpOwoKClBsb3RseS5yZWFjdChQTE9ULCBwbG90X29iaikudGhlbigoKSA9PiB7CgkvLyBBc3NpZ24gdGhlIFBsb3RseSBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhwbG90bHlfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1Qub24oa2V5LCBsaXN0ZW5lcikKCQl9Cgl9CgkvLyBBc3NpZ24gdGhlIEpTIGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKGpzX2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULmFkZEV2ZW50TGlzdGVuZXIoa2V5LCBsaXN0ZW5lciwgewoJCQkJc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbAoJCQl9KQoJCX0KCX0KfQopCgoKaW52YWxpZGF0aW9uLnRoZW4oKCkgPT4gewoJLy8gUmVtb3ZlIGFsbCBwbG90bHkgbGlzdGVuZXJzCglQTE9ULnJlbW92ZUFsbExpc3RlbmVycygpCgkvLyBSZW1vdmUgYWxsIEpTIGxpc3RlbmVycwoJY29udHJvbGxlci5hYm9ydCgpCgkvLyBSZW1vdmUgdGhlIHJlc2l6ZU9ic2VydmVyCglyZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCkKfSkKCgoKCQlyZXR1cm4gQ09OVEFJTkVSCgk8L3NjcmlwdD4KpG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv6MVCeEasHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SRmMWYzYjcwMC01OTE2LTQ5NmYtYjkzOC00NmY3ZjA4YjRlYja5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4B3FnotXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5HZNWIzYjg0MDhjLTgxODEtMTFlZi0xNGViLWUxYzU2OWI4YmIyOS82ZjcwMDU2YmNmMWQ3YTMzuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDkxNzlhYTQwLWJiNDAtNGEzNi1hZTFlLTAwYWU0MjkzNWE1ZoqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnZSFNlcXVlbmNlWyDPhCA9IDMwLjU4NyBtcyB8IGJsb2NrczogMyB8IEFEQzogMSB8IEdSOiAyIHwgUkY6IDEgfCBERUY6IDAgXaRtaW1lqnRleHQvcGxhaW6scm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/oxN/8SCwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJDkxNzlhYTQwLWJiNDAtNGEzNi1hZTFlLTAwYWU0MjkzNWE1ZrlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgw5KQS1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SRhZGE2MDJkMi00ZjRiLTRmYjQtYTc2My04YTYzOWUwNWZmMziKpnF1ZXVlZMKkbG9nc5KIpGxpbmX/o21zZ5LZLlJ1bm5pbmcgc2ltdWxhdGlvbiBpbiB0aGUgQ1BVIHdpdGggMiB0aHJlYWQocymqdGV4dC9wbGFpbqdjZWxsX2lk2SRhZGE2MDJkMi00ZjRiLTRmYjQtYTc2My04YTYzOWUwNWZmMzima3dhcmdzlZKsa29tYV92ZXJzaW9ukqh2IjAuOC4zIqp0ZXh0L3BsYWlukqpzaW1fbWV0aG9kkoWmcHJlZml4sUtvbWFNUklDb3JlLkJsb2NoqGVsZW1lbnRzkKR0eXBlpnN0cnVjdKxwcmVmaXhfc2hvcnSlQmxvY2iob2JqZWN0aWSwZmZmZmZmZmYyZGRlOTkyY9khYXBwbGljYXRpb24vdm5kLnBsdXRvLnRyZWUrb2JqZWN0kqVzcGluc5KiMjCqdGV4dC9wbGFpbpKrdGltZV9wb2ludHOSozE0Oap0ZXh0L3BsYWlukqphZGNfcG9pbnRzkqMxMDCqdGV4dC9wbGFpbqJpZLRLb21hTVJJQ29yZV82YmZkODllYaRmaWxl2U4vaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL0tvbWFNUklDb3JlL3dQZ3M3L3NyYy9zaW11bGF0aW9uL1NpbXVsYXRvckNvcmUuamylZ3JvdXCtU2ltdWxhdG9yQ29yZaVsZXZlbKRJbmZviKRsaW5l/6Ntc2eS2TYgIDAuMDAyMDk4IHNlY29uZHMgKDEwLjg1IGsgYWxsb2NhdGlvbnM6IDc0NS43MjcgS2lCKQqqdGV4dC9wbGFpbqdjZWxsX2lk2SRhZGE2MDJkMi00ZjRiLTRmYjQtYTc2My04YTYzOWUwNWZmMzima3dhcmdzkKJpZLRQbHV0b1J1bm5lcl9kMWFjYjgxZaRmaWxl2VIvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1BsdXRvL1J2ZUdIL3NyYy9ydW5uZXIvUGx1dG9SdW5uZXIvc3JjL1BsdXRvUnVubmVyLmpspWdyb3Vwq1BsdXRvUnVubmVypWxldmVsrkxvZ0xldmVsKC01NTUpp3J1bm5pbmfCpm91dHB1dIakYm9kedk8UmF3QWNxdWlzaXRpb25EYXRhW1NlcU5hbWU6IE5vTmFtZSB8IDEgUHJvZmlsZShzKSBvZiAxMDDDlzFdpG1pbWWqdGV4dC9wbGFpbqxyb290YXNzaWduZWWncmF3X2dyZbJsYXN0X3J1bl90aW1lc3RhbXDLQdm/oxRKCCCwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJGFkYTYwMmQyLTRmNGItNGZiNC1hNzYzLThhNjM5ZTA1ZmYzOLlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgyjvJm1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQ5NzQ3OTQzNy05Y2UzLTRiMzMtOTEzNC0wZjJhZjg5YmNjYjWKpnF1ZXVlZMKkbG9nc5KIpGxpbmX/o21zZ5LZLlJ1bm5pbmcgc2ltdWxhdGlvbiBpbiB0aGUgQ1BVIHdpdGggMiB0aHJlYWQocymqdGV4dC9wbGFpbqdjZWxsX2lk2SQ5NzQ3OTQzNy05Y2UzLTRiMzMtOTEzNC0wZjJhZjg5YmNjYjWma3dhcmdzlZKsa29tYV92ZXJzaW9ukqh2IjAuOC4zIqp0ZXh0L3BsYWlukqpzaW1fbWV0aG9kkoWmcHJlZml4sUtvbWFNUklDb3JlLkJsb2NoqGVsZW1lbnRzkKR0eXBlpnN0cnVjdKxwcmVmaXhfc2hvcnSlQmxvY2iob2JqZWN0aWSwZmZmZmZmZmYyZGRlOTkyY9khYXBwbGljYXRpb24vdm5kLnBsdXRvLnRyZWUrb2JqZWN0kqVzcGluc5KjNDAwqnRleHQvcGxhaW6Sq3RpbWVfcG9pbnRzkqMxNjSqdGV4dC9wbGFpbpKqYWRjX3BvaW50c5KjMTAwqnRleHQvcGxhaW6iaWS0S29tYU1SSUNvcmVfNmJmZDg5ZWGkZmlsZdlOL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Lb21hTVJJQ29yZS93UGdzNy9zcmMvc2ltdWxhdGlvbi9TaW11bGF0b3JDb3JlLmpspWdyb3VwrVNpbXVsYXRvckNvcmWlbGV2ZWykSW5mb4ikbGluZf+jbXNnktk0ICAwLjAwMzUzMiBzZWNvbmRzICgxNS41OSBrIGFsbG9jYXRpb25zOiA0Ljc3NyBNaUIpCqp0ZXh0L3BsYWlup2NlbGxfaWTZJDk3NDc5NDM3LTljZTMtNGIzMy05MTM0LTBmMmFmODliY2NiNaZrd2FyZ3OQomlktFBsdXRvUnVubmVyX2QxYWNiODFlpGZpbGXZUi9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUGx1dG8vUnZlR0gvc3JjL3J1bm5lci9QbHV0b1J1bm5lci9zcmMvUGx1dG9SdW5uZXIuamylZ3JvdXCrUGx1dG9SdW5uZXKlbGV2ZWyuTG9nTGV2ZWwoLTU1NSmncnVubmluZ8Kmb3V0cHV0hqRib2R52TxSYXdBY3F1aXNpdGlvbkRhdGFbU2VxTmFtZTogTm9OYW1lIHwgMSBQcm9maWxlKHMpIG9mIDEwMMOXMV2kbWltZap0ZXh0L3BsYWlurHJvb3Rhc3NpZ25lZa5yYXdfdDJfc3Rhcl9zZbJsYXN0X3J1bl90aW1lc3RhbXDLQdm/oxUTZZCwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJDk3NDc5NDM3LTljZTMtNGIzMy05MTM0LTBmMmFmODliY2NiNblkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgBTkR+1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQyZTY1YWUzMS1mNTBhLTQ2MmItOTc0NC04MGJmNmNkYjM4OGWKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52mqJCTxzY3JpcHQgaWQ9J3Bsb3RfMSc+CgkJLy8gV2Ugc3RhcnQgYnkgcHV0dGluZyBhbGwgdGhlIHZhcmlhYmxlIGludGVycG9sYXRpb24gaGVyZSBhdCB0aGUgYmVnaW5uaW5nCgkJLy8gV2UgaGF2ZSB0byBjb252ZXJ0IGFsbCB0eXBlZGFycmF5cyBpbiB0aGUgbGF5b3V0IHRvIG5vcm1hbCBhcnJheXMuIFNlZSBJc3N1ZSAjMjUKCQkvLyBXZSB1c2UgbG9kYXNoIGZvciB0aGlzIGZvciBjb21wYWN0bmVzcwoJCWZ1bmN0aW9uIHJlbW92ZVR5cGVkQXJyYXkobykgewoJCQlyZXR1cm4gXy5pc1R5cGVkQXJyYXkobykgPyBBcnJheS5mcm9tKG8pIDoKCQkJXy5pc1BsYWluT2JqZWN0KG8pID8gXy5tYXBWYWx1ZXMobywgcmVtb3ZlVHlwZWRBcnJheSkgOiAKCQkJbwoJCX0KCgkJLy8gUHVibGlzaCB0aGUgcGxvdCBvYmplY3QgdG8gSlMKCQlsZXQgcGxvdF9vYmogPSBfLnVwZGF0ZSgvKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIEFic3RyYWN0UGx1dG9EaW5nZXRqZXMuRGlzcGxheS5wdWJsaXNoZWRfdG9fanMgKi8gZ2V0UHVibGlzaGVkT2JqZWN0KCJiM2I4NDA4Yy04MTgxLTExZWYtMTRlYi1lMWM1NjliOGJiMjkvZWIyNjBjM2UxZGZkMWVjYSIpLCAibGF5b3V0IiwgcmVtb3ZlVHlwZWRBcnJheSkKCQkvLyBHZXQgdGhlIHBsb3RseSBsaXN0ZW5lcnMKCQljb25zdCBwbG90bHlfbGlzdGVuZXJzID0ge30KCQkvLyBHZXQgdGhlIEpTIGxpc3RlbmVycwoJCWNvbnN0IGpzX2xpc3RlbmVycyA9IHt9CgkJLy8gRGVhbCB3aXRoIGV2ZW50dWFsIGN1c3RvbSBjbGFzc2VzCgkJbGV0IGN1c3RvbV9jbGFzc2xpc3QgPSBbXQoKCgkJLy8gTG9hZCB0aGUgcGxvdGx5IGxpYnJhcnkKCQlsZXQgUGxvdGx5ID0gdW5kZWZpbmVkCgkJdHJ5IHsKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoIi4vcGxvdGx5anMvcGxvdGx5anMtMi4yNi4yLm1pbi5qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0gY2F0Y2ggKGUpIHsKCQkJY29uc29sZS5sb2coIkxvY2FsIGxvYWQgZmFpbGVkLCB0cnlpbmcgd2l0aCB0aGUgd2ViIGVzbS5zaCB2ZXJzaW9uIikKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoImh0dHBzOi8vZXNtLnNoL3YxMzUvcGxvdGx5LmpzLWRpc3QtbWluQDIuMjYuMi9lc25leHQvcGxvdGx5LmpzLWRpc3QtbWluLm1qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0KCgkJLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0byBmb3JjZSBsb2NhbCBtYXRoamF4IGZvbnQgY2FjaGUKCQlpZiAoZmFsc2UgJiYgd2luZG93Py5NYXRoSmF4Py5jb25maWc/LnN2Zz8uZm9udENhY2hlID09PSAnZ2xvYmFsJykgewoJCQl3aW5kb3cuTWF0aEpheC5jb25maWcuc3ZnLmZvbnRDYWNoZSA9ICdsb2NhbCcKCQl9CgoJCS8vIEZsYWcgdG8gY2hlY2sgaWYgdGhpcyBjZWxsIHdhcyAgbWFudWFsbHkgcmFuIG9yIHJlYWN0aXZlbHkgcmFuCmNvbnN0IGZpcnN0UnVuID0gdGhpcyA/IGZhbHNlIDogdHJ1ZQpjb25zdCBDT05UQUlORVIgPSB0aGlzID8/IGh0bWxgPGRpdiBjbGFzcz0ncGx1dG9wbG90bHktY29udGFpbmVyJz5gCmNvbnN0IFBMT1QgPSBDT05UQUlORVIucXVlcnlTZWxlY3RvcignLmpzLXBsb3RseS1wbG90JykgPz8gQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgPGRpdj5gKQpjb25zdCBwYXJlbnQgPSBDT05UQUlORVIucGFyZW50RWxlbWVudAovLyBXZSB1c2UgYSBjb250cm9sbGVyIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lcnMgdXBvbiBpbnZhbGlkYXRpb24KY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKQovLyBXZSBoYXZlIHRvIGFkZCB0aGlzIHRvIGtlZXAgc3VwcG9ydGluZyBAYmluZCB3aXRoIHRoZSBvbGQgQVBJIHVzaW5nIFBMT1QKUExPVC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChlKSA9PiB7CglDT05UQUlORVIudmFsdWUgPSBQTE9ULnZhbHVlCglpZiAoZS5idWJibGVzKSB7CgkJcmV0dXJuCgl9CglDT05UQUlORVIuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2lucHV0JykpCn0sIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KQoKCS8vIFRoaXMgY3JlYXRlIHRoZSBzdHlsZSBzdWJkaXYgb24gZmlyc3QgcnVuCglmaXJzdFJ1biAmJiBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGAKCTxzdHlsZT4KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgewoJCXdpZHRoOiAxMDAlOwoJCWhlaWdodDogMTAwJTsKCQltaW4taGVpZ2h0OiAwOwoJCW1pbi13aWR0aDogMDsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgLmpzLXBsb3RseS1wbG90IC5wbG90bHkgZGl2IHsKCQltYXJnaW46IDAgYXV0bzsgLy8gVGhpcyBjZW50ZXJzIHRoZSBwbG90Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLnBvcHBlZC1vdXQgewoJCW92ZXJmbG93OiBhdXRvOwoJCXotaW5kZXg6IDEwMDA7CgkJcG9zaXRpb246IGZpeGVkOwoJCXJlc2l6ZTogYm90aDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDBweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMHB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgewoJCWRpc3BsYXk6IGZsZXg7CgkJZmxleC1mbG93OiByb3cgd3JhcDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAxMnB4OwoJCXBvc2l0aW9uOiBmaXhlZDsKCQl6LWluZGV4OiAxMDAxOwoJCWN1cnNvcjogbW92ZTsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIC0xMDAlKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBzcGFuIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJZmxleDogMQoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIuaGlkZGVuIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuIHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlIHsKCQlwYWRkaW5nLXJpZ2h0OiA1cHg7CgkJcGFkZGluZy1sZWZ0OiAycHg7CgkJY3Vyc29yOiB0ZXh0OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZmxleDogMCAwIDEwMCU7CgkJdGV4dC1hbGlnbjogY2VudGVyOwoJCWJvcmRlci10b3A6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQltYXJnaW4tdG9wOiA1cHg7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZpbGVuYW1lIHsKCQltYXJnaW4tbGVmdDogM3B4OwoJCXRleHQtYWxpZ246IGxlZnQ7CgkJbWluLXdpZHRoOiBtaW4oNjAlLCBtaW4tY29udGVudCk7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCAubGFiZWwgewoJCWZsZXg6IDAgMCAwOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5mb3JtYXQgewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCQlmbGV4OiAxIDAgYXV0bzsKCQltaW4td2lkdGg6IDMwcHg7CgkJbWFyZ2luLXJpZ2h0OiAxMHB4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCQlmbGV4LWZsb3c6IGNvbHVtbjsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlwYWRkaW5nLWxlZnQ6IDNweDsKCQl6LWluZGV4OiAyMDAwOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIHsKCQljdXJzb3I6IHBvaW50ZXI7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJcGFkZGluZzogM3B4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKC0zcHgsIC02cHgpOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpub3QoLnNlbGVjdGVkKSB7CgkJbWFyZ2luLXRvcDogM3B4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uLnNlbGVjdGVkIHsKCQlvcmRlcjogLTE7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246aG92ZXIgewoJCWJhY2tncm91bmQtY29sb3I6IHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJfQoJc3Bhbi5jb25maWctdmFsdWUgewoJCWZvbnQtd2VpZ2h0OiBub3JtYWw7CgkJY29sb3I6IHZhcigtLXBsdXRvLW91dHB1dC1jb2xvcik7CgkJZGlzcGxheTogbm9uZTsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIGNhbGMoLTEwMCUgLSAxMHB4KSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLmxhYmVsIHsKCQl1c2VyLXNlbGVjdDogbm9uZTsKCX0KCS5sYWJlbDpob3ZlciBzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCW1pbi13aWR0aDogMTUwcHg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4ubWF0Y2hpbmctY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLW1hY3JvLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5kaWZmZXJlbnQtY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLXRhZy1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9Cjwvc3R5bGU+CmApCgpsZXQgb3JpZ2luYWxfaGVpZ2h0ID0gcGxvdF9vYmoubGF5b3V0LmhlaWdodApsZXQgb3JpZ2luYWxfd2lkdGggPSBwbG90X29iai5sYXlvdXQud2lkdGgKLy8gRm9yIHRoZSBoZWlnaHQgd2UgaGF2ZSB0byBhbHNvIHB1dCBhIGZpeGVkIHZhbHVlIGluIGNhc2UgdGhlIHBsb3QgaXMgcHV0IG9uIGEgbm9uLWZpeGVkLXNpemUgY29udGFpbmVyIChsaWtlIHRoZSBkZWZhdWx0IHdyYXBwZXIpCi8vIFdlIGRlZmluZSBhIHZhcmlhYmxlIHRvIGNoZWNrIHdoZXRoZXIgd2Ugc3RpbGwgaGF2ZSB0byByZW1vdmUgdGhlIGZpeGVkIGhlaWdodApsZXQgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmlyc3RSdW4KbGV0IGNvbnRhaW5lcl9oZWlnaHQgPSBvcmlnaW5hbF9oZWlnaHQgPz8gUExPVC5jb250YWluZXJfaGVpZ2h0ID8/IDQwMApDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX2hlaWdodCArICdweCcKCi8vIFdlIGNyZWF0ZSBhIFByb21pc2UgdmVyc2lvbiBvZiBzZXRUaW1lb3V0CmZ1bmN0aW9uIGRlbGF5KG1zKSB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7Cn0KCi8vIFdlIGltcG9ydCBpbnRlcmFjdCBmb3IgZHJhZ2dpbmcvcmVzaXppbmcKY29uc3QgeyBkZWZhdWx0OiBpbnRlcmFjdCB9ID0gYXdhaXQgaW1wb3J0KCdodHRwczovL2VzbS5zaC9pbnRlcmFjdGpzQDEuMTAuMTknKQoKCmZ1bmN0aW9uIGdldEltYWdlT3B0aW9ucygpIHsKICBjb25zdCBvID0gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogIHJldHVybiB7CiAgICBmb3JtYXQ6IG8uZm9ybWF0ID8/ICJwbmciLAogICAgd2lkdGg6IG8ud2lkdGggPz8gb3JpZ2luYWxfd2lkdGgsCiAgICBoZWlnaHQ6IG8uaGVpZ2h0ID8/IG9yaWdpbmFsX2hlaWdodCwKICAgIHNjYWxlOiBvLnNjYWxlID8/IDEsCiAgICBmaWxlbmFtZTogby5maWxlbmFtZSA/PyAibmV3cGxvdCIsCiAgfTsKfQoKY29uc3QgQ0xJUEJPQVJEX0hFQURFUiA9CiAgQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoIi5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIikgPz8KICBDT05UQUlORVIuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgImFmdGVyYmVnaW4iLAogICAgaHRtbGA8ZGl2IGNsYXNzPSJwbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIGhpZGRlbiI+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmb3JtYXQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+Rm9ybWF0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZvcm1hdCI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB3aWR0aCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5XaWR0aDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSB3aWR0aCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGhlaWdodCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5IZWlnaHQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgaGVpZ2h0Ij48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2NhbGUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+U2NhbGU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgc2NhbGUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzZXQiPlNldDwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB1bnNldCI+VW5zZXQ8L2J1dHRvbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZpbGVuYW1lIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZpbGVuYW1lOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZpbGVuYW1lIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgIDwvZGl2PmAKICApOwoKZnVuY3Rpb24gY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcikgewogIGNvbnN0IHZhbGlkX2NsYXNzZXMgPSBbCiAgICAibWlzc2luZy1jb25maWciLAogICAgIm1hdGNoaW5nLWNvbmZpZyIsCiAgICAiZGlmZmVyZW50LWNvbmZpZyIsCiAgXTsKICBmdW5jdGlvbiBzZXRDbGFzcyhjbCkgewogICAgZm9yIChjb25zdCBuYW1lIG9mIHZhbGlkX2NsYXNzZXMpIHsKICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUobmFtZSwgbmFtZSA9PSBjbCk7CiAgICB9CiAgfQogIC8vIFdlIHVzZSB0aGUgY3VzdG9tIGdldHRlcnMgd2UnbGwgc2V0IHVwIGluIHRoZSBjb250YWluZXIKICBjb25zdCB7IHVpX3ZhbHVlLCBjb25maWdfdmFsdWUsIGNvbmZpZ19zcGFuLCBrZXkgfSA9IGNvbnRhaW5lcjsKICBpZiAoY29uZmlnX3ZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgIHNldENsYXNzKCJtaXNzaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBpcyBub3QgcHJlc2VudCBpbiB0aGUgY29uZmlnLmA7CiAgfSBlbHNlIGlmICh1aV92YWx1ZSA9PSBjb25maWdfdmFsdWUpIHsKICAgIHNldENsYXNzKCJtYXRjaGluZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIHRoZSBzYW1lIHZhbHVlIGluIHRoZSBjb25maWcgYW5kIGluIHRoZSBoZWFkZXIuYDsKICB9IGVsc2UgewogICAgc2V0Q2xhc3MoImRpZmZlcmVudC1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIGEgZGlmZmVyZW50IHZhbHVlICg8ZW0+JHtjb25maWdfdmFsdWV9PC9lbT4pIGluIHRoZSBjb25maWcuYDsKICB9CiAgLy8gQWRkIGluZm8gYWJvdXQgc2V0dGluZyBhbmQgdW5zZXR0aW5nCiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIG9uIHRoZSBsYWJlbCA8ZW0+PGI+b25jZTwvYj48L2VtPiB0byBzZXQgdGhlIGN1cnJlbnQgVUkgdmFsdWUgaW4gdGhlIGNvbmZpZy5gCiAgKTsKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgPGVtPjxiPnR3aWNlPC9iPjwvZW0+IHRvIHJlbW92ZSB0aGlzIGtleSBmcm9tIHRoZSBjb25maWcuYAogICk7Cn0KCmNvbnN0IHZhbGlkX2Zvcm1hdHMgPSBbInBuZyIsICJzdmciLCAid2VicCIsICJqcGVnIiwgImZ1bGwtanNvbiJdOwpmdW5jdGlvbiBpbml0aWFsaXplVUlWYWx1ZVNwYW4oc3Bhbiwga2V5LCB2YWx1ZSkgewogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSBrZXkgPT09ICJmb3JtYXQiID8gImZhbHNlIiA6ICJ0cnVlIjsKICBsZXQgcGFyc2UgPSAoeCkgPT4geDsKICBsZXQgdXBkYXRlID0gKHgpID0+IChzcGFuLnRleHRDb250ZW50ID0geCk7CiAgaWYgKGtleSA9PT0gIndpZHRoIiB8fCBrZXkgPT09ICJoZWlnaHQiKSB7CiAgICBwYXJzZSA9ICh4KSA9PiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoeCkpOwogIH0gZWxzZSBpZiAoa2V5ID09PSAic2NhbGUiKSB7CiAgICBwYXJzZSA9IHBhcnNlRmxvYXQ7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAvLyBXZSByZW1vdmUgY29udGVudEVkaXRhYmxlCiAgICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9ICJmYWxzZSI7CiAgICAvLyBIZXJlIHdlIGZpcnN0IGFkZCB0aGUgc3Vic3BhbnMgZm9yIGVhY2ggb3B0aW9uCiAgICBjb25zdCBvcHRzX2RpdiA9IHNwYW4uYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2IGNsYXNzPSJmb3JtYXQtb3B0aW9ucyI+PC9kaXY+YCk7CiAgICBmb3IgKGNvbnN0IGZtdCBvZiB2YWxpZF9mb3JtYXRzKSB7CiAgICAgIGNvbnN0IG9wdCA9IG9wdHNfZGl2LmFwcGVuZENoaWxkKAogICAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImZvcm1hdC1vcHRpb24gJHtmbXR9Ij4ke2ZtdH08L3NwYW4+YAogICAgICApOwogICAgICBvcHQub25jbGljayA9IChlKSA9PiB7CiAgICAgICAgc3Bhbi52YWx1ZSA9IG9wdC50ZXh0Q29udGVudDsKICAgICAgfTsKICAgIH0KICAgIHBhcnNlID0gKHgpID0+IHsKICAgICAgcmV0dXJuIHZhbGlkX2Zvcm1hdHMuaW5jbHVkZXMoeCkgPyB4IDogbG9jYWxWYWx1ZTsKICAgIH07CiAgICB1cGRhdGUgPSAoeCkgPT4gewogICAgICBmb3IgKGNvbnN0IG9wdCBvZiBvcHRzX2Rpdi5jaGlsZHJlbikgewogICAgICAgIG9wdC5jbGFzc0xpc3QudG9nZ2xlKCJzZWxlY3RlZCIsIG9wdC50ZXh0Q29udGVudCA9PT0geCk7CiAgICAgIH0KICAgIH07CiAgfSBlbHNlIHsKICAgIC8vIFdlIG9ubHkgaGF2ZSBmaWxlbmFtZSBoZXJlCiAgfQogIGxldCBsb2NhbFZhbHVlOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIGxvY2FsVmFsdWU7CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIGlmICh2YWwgIT09ICIiKSB7CiAgICAgICAgbG9jYWxWYWx1ZSA9IHBhcnNlKHZhbCk7CiAgICAgIH0KICAgICAgdXBkYXRlKGxvY2FsVmFsdWUpOwogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7CiAgLy8gV2UgYWxzbyBhc3NpZ24gYSBsaXN0ZW5lciBzbyB0aGF0IHRoZSBlZGl0YWJsZSBpcyBibHVycmVkIHdoZW4gZW50ZXIgaXMgcHJlc3NlZAogIHNwYW4ub25rZXlkb3duID0gKGUpID0+IHsKICAgIGlmIChlLmtleUNvZGUgPT09IDEzKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgc3Bhbi5ibHVyKCk7CiAgICB9CiAgfTsKICBzcGFuLnZhbHVlID0gdmFsdWU7Cn0KCmZ1bmN0aW9uIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oc3Bhbiwga2V5KSB7CiAgLy8gSGVyZSB3ZSBtb3N0bHkgd2FudCB0byBkZWZpbmUgdGhlIHNldHRlciBhbmQgZ2V0dGVyCiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgLy8gaWYgdW5kZWZpbmVkIGlzIHBhc3NlZCwgd2UgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBvcHRpb25zCiAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGRlbGV0ZSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XSA9IHZhbDsKICAgICAgfQogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7Cn0KCmNvbnN0IGNvbmZpZ19zcGFucyA9IHt9Owpmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhnZXRJbWFnZU9wdGlvbnMoKSkpIHsKICBjb25zdCBjb250YWluZXIgPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoYC5jbGlwYm9hcmQtc3Bhbi4ke2tleX1gKTsKICBjb25zdCBsYWJlbCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIubGFiZWwiKTsKICAvLyBXZSBnaXZlIHRoZSBsYWJlbCBhIGZ1bmN0aW9uIHRoYXQgb24gc2luZ2xlIGNsaWNrIHdpbGwgc2V0IHRoZSBjdXJyZW50IHZhbHVlIGFuZCB3aXRoIGRvdWJsZSBjbGljayB3aWxsIHVuc2V0IGl0CiAgbGFiZWwub25jbGljayA9IER1YWxDbGljaygKICAgICgpID0+IHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0sCiAgICAoZSkgPT4gewogICAgICBjb25zb2xlLmxvZygiZSIsIGUpOwogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSB1bmRlZmluZWQ7CiAgICB9CiAgKTsKICBjb25zdCB1aV92YWx1ZV9zcGFuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtdmFsdWUiKTsKICBjb25zdCBjb25maWdfdmFsdWVfc3BhbiA9CiAgICBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNvbmZpZy12YWx1ZSIpID8/CiAgICBsYWJlbC5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAgICJhZnRlcmJlZ2luIiwKICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iY29uZmlnLXZhbHVlIj48L3NwYW4+YAogICAgKTsKICAvLyBBc3NpbmcgdGhlIHR3byBzcGFucyBhcyBwcm9wZXJ0aWVzIG9mIHRoZSBjb250YWluaW5nIHNwYW4KICBjb250YWluZXIudWlfc3BhbiA9IHVpX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmNvbmZpZ19zcGFuID0gY29uZmlnX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmtleSA9IGtleTsKICBjb25maWdfc3BhbnNba2V5XSA9IGNvbnRhaW5lcjsKICBpZiAoZmlyc3RSdW4pIHsKICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA9CiAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICAgIC8vIFdlIGRvIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdmFsdWUgc3BhbgogICAgaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHVpX3ZhbHVlX3NwYW4sIGtleSwgdmFsdWUpOwogICAgLy8gVGhlbiB3ZSBpbml0aWFsaXplIHRoZSBjb25maWcgdmFsdWUKICAgIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oY29uZmlnX3ZhbHVlX3NwYW4sIGtleSk7CiAgICAvLyBXZSBwdXQgc29tZSBjb252ZW5pZW5jZSBnZXR0ZXJzL3NldHRlcnMKICAgIC8vIHVpX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJ1aV92YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiB1aV92YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICB1aV92YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgICAvLyBjb25maWdfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgImNvbmZpZ192YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICB9Cn0KCi8vIFRoZXNlIG9iamVjdHMgd2lsbCBjb250YWluIHRoZSBkZWZhdWx0IHZhbHVlCgovLyBUaGlzIGNvZGUgdXBkYXRlcyB0aGUgaW1hZ2Ugb3B0aW9ucyBpbiB0aGUgUExPVCBjb25maWcgd2l0aCB0aGUgcHJvdmlkZWQgb25lcwpmdW5jdGlvbiBzZXRJbWFnZU9wdGlvbnMobykgewogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gb1trZXldOwogIH0KfQpmdW5jdGlvbiB1bnNldEltYWdlT3B0aW9ucygpIHsKICBzZXRJbWFnZU9wdGlvbnMoe30pOwp9Cgpjb25zdCBzZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4uc2V0Iik7CmNvbnN0IHVuc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnVuc2V0Iik7CmlmIChmaXJzdFJ1bikgewogIHNldF9idXR0b24ub25jbGljayA9IChlKSA9PiB7CiAgICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0KICB9OwogIHVuc2V0X2J1dHRvbi5vbmNsaWNrID0gdW5zZXRJbWFnZU9wdGlvbnM7Cn0KCi8vIFdlIGFkZCBhIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBjbGlwYm9hcmQgaXMgcG9wcGVkIG91dApDT05UQUlORVIuaXNQb3BwZWRPdXQgPSAoKSA9PiB7CiAgcmV0dXJuIENPTlRBSU5FUi5jbGFzc0xpc3QuY29udGFpbnMoInBvcHBlZC1vdXQiKTsKfTsKCkNMSVBCT0FSRF9IRUFERVIub25tb3VzZWRvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHsKICBpZiAoZXZlbnQudGFyZ2V0Lm1hdGNoZXMoInNwYW4uY2xpcGJvYXJkLXZhbHVlIikpIHsKICAgIGNvbnNvbGUubG9nKCJXZSBkb24ndCBtb3ZlISIpOwogICAgcmV0dXJuOwogIH0KICBjb25zdCBzdGFydCA9IHsKICAgIGxlZnQ6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLmxlZnQpLAogICAgdG9wOiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS50b3ApLAogICAgWDogZXZlbnQucGFnZVgsCiAgICBZOiBldmVudC5wYWdlWSwKICB9OwogIGZ1bmN0aW9uIG1vdmVBdChldmVudCwgc3RhcnQpIHsKICAgIGNvbnN0IHRvcCA9IGV2ZW50LnBhZ2VZIC0gc3RhcnQuWSArIHN0YXJ0LnRvcCArICJweCI7CiAgICBjb25zdCBsZWZ0ID0gZXZlbnQucGFnZVggLSBzdGFydC5YICsgc3RhcnQubGVmdCArICJweCI7CiAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9IHRvcDsKICB9CgogIC8vIG1vdmUgb3VyIGFic29sdXRlbHkgcG9zaXRpb25lZCBiYWxsIHVuZGVyIHRoZSBwb2ludGVyCiAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQpIHsKICAgIG1vdmVBdChldmVudCwgc3RhcnQpOwogIH0KCiAgLy8gV2UgdXNlIHRoaXMgdG8gcmVtb3ZlIHRoZSBtb3VzZW1vdmUgd2hlbiBjbGlja2luZyBvdXRzaWRlIG9mIHRoZSBjb250YWluZXIKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICAvLyBtb3ZlIHRoZSBjb250YWluZXIgb24gbW91c2Vtb3ZlCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgb25Nb3VzZU1vdmUsIHsKICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsCiAgfSk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgY2xlYW5VcCgpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7CgogIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICBjb25zb2xlLmxvZygiY2xlYW5pbmcgdXAgdGhlIHBsb3QgbW92ZSBsaXN0ZW5lciIpOwogICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBudWxsOwogIH0KCiAgLy8gKDMpIGRyb3AgdGhlIGJhbGwsIHJlbW92ZSB1bm5lZWRlZCBoYW5kbGVycwogIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gY2xlYW5VcDsKfTsKCmZ1bmN0aW9uIHNlbmRUb0NsaXBib2FyZChibG9iKSB7CiAgaWYgKCFuYXZpZ2F0b3IuY2xpcGJvYXJkKSB7CiAgICBhbGVydCgKICAgICAgIlRoZSBDbGlwYm9hcmQgQVBJIGRvZXMgbm90IHNlZW0gdG8gYmUgYXZhaWxhYmxlLCBtYWtlIHN1cmUgdGhlIFBsdXRvIG5vdGVib29rIGlzIGJlaW5nIHVzZWQgZnJvbSBlaXRoZXIgbG9jYWxob3N0IG9yIGFuIGh0dHBzIHNvdXJjZS4iCiAgICApOwogIH0KICBuYXZpZ2F0b3IuY2xpcGJvYXJkCiAgICAud3JpdGUoWwogICAgICBuZXcgQ2xpcGJvYXJkSXRlbSh7CiAgICAgICAgLy8gVGhlIGtleSBpcyBkZXRlcm1pbmVkIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBibG9iJ3MgdHlwZS4KICAgICAgICBbYmxvYi50eXBlXTogYmxvYiwKICAgICAgfSksCiAgICBdKQogICAgLnRoZW4oCiAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICBjb25zb2xlLmxvZygiQXN5bmM6IENvcHlpbmcgdG8gY2xpcGJvYXJkIHdhcyBzdWNjZXNzZnVsISIpOwogICAgICB9LAogICAgICBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiQXN5bmM6IENvdWxkIG5vdCBjb3B5IHRleHQ6ICIsIGVycik7CiAgICAgIH0KICAgICk7Cn0KCmZ1bmN0aW9uIGNvcHlJbWFnZVRvQ2xpcGJvYXJkKCkgewogIC8vIFdlIGV4dHJhY3QgdGhlIGltYWdlIG9wdGlvbnMgZnJvbSB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycyAoaWYgdGhleSBleGlzdCkKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LiBXZSBhbHNvIGlnbm9yZSBmb3JtYXQgYmVjYXVzZSB0aGUgY2xpcGJvYXJkIG9ubHkgc3VwcG9ydHMgcG5nLgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gImZvcm1hdCIpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LnRvSW1hZ2UoUExPVCwgY29uZmlnKS50aGVuKGZ1bmN0aW9uIChkYXRhVXJsKSB7CiAgICBmZXRjaChkYXRhVXJsKQogICAgICAudGhlbigocmVzKSA9PiByZXMuYmxvYigpKQogICAgICAudGhlbigoYmxvYikgPT4gewogICAgICAgIGNvbnN0IHBhc3RlX3JlY2VpdmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigncGFzdGUtcmVjZWl2ZXIucGx1dG9wbG90bHknKQogICAgICAgIGlmIChwYXN0ZV9yZWNlaXZlcikgewogICAgICAgICAgcGFzdGVfcmVjZWl2ZXIuYXR0YWNoSW1hZ2UoZGF0YVVybCwgQ09OVEFJTkVSKQogICAgICAgIH0KICAgICAgICBzZW5kVG9DbGlwYm9hcmQoYmxvYikKICAgICAgfSk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHNhdmVJbWFnZVRvRmlsZSgpIHsKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS5kb3dubG9hZEltYWdlKFBMT1QsIGNvbmZpZyk7Cn0KCmxldCBjb250YWluZXJfcmVjdCA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCwgdG9wOiAwLCBsZWZ0OiAwIH07CmZ1bmN0aW9uIHVucG9wX2NvbnRhaW5lcihjbCkgewogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgZmFsc2UpOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBmYWxzZSk7CiAgLy8gV2UgZml4IHRoZSBoZWlnaHQgYmFjayB0byB0aGUgdmFsdWUgaXQgaGFkIGJlZm9yZSBwb3BvdXQsIGFsc28gc2V0dGluZyB0aGUgZmxhZyB0byBzaWduYWwgdGhhdCB1cG9uIGZpcnN0IHJlc2l6ZSB3ZSByZW1vdmUgdGhlIGZpeGVkIGlubGluZS1zdHlsZQogIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQgKyAicHgiOwogIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IHRydWU7CiAgLy8gV2Ugc2V0IHRoZSBvdGhlciBmaXhlZCBpbmxpbmUtc3R5bGVzIHRvIG51bGwKICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICBDT05UQUlORVIuc3R5bGUudG9wID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBXZSBhbHNvIHJlbW92ZSB0aGUgQ0xJUEJPQVJEX0hFQURFUgogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSAiIjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBGaW5hbGx5IHdlIHJlbW92ZSB0aGUgaGlkZGVuIGNsYXNzIHRvIHRoZSBoZWFkZXIKICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIHRydWUpOwogIHJldHVybjsKfQpmdW5jdGlvbiBwb3BvdXRfY29udGFpbmVyKG9wdHMpIHsKICBjb25zdCBjbCA9IG9wdHM/LmNsOwogIGNvbnN0IHRhcmdldF9jb250YWluZXJfc2l6ZSA9IG9wdHM/LnRhcmdldF9jb250YWluZXJfc2l6ZSA/PyB7fTsKICBjb25zdCB0YXJnZXRfcGxvdF9zaXplID0gb3B0cz8udGFyZ2V0X3Bsb3Rfc2l6ZSA/PyB7fTsKICBpZiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIHJldHVybiB1bnBvcF9jb250YWluZXIoY2wpOwogIH0KICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgY2wgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdHJ1ZSk7CiAgLy8gV2UgZXh0cmFjdCB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjb250YWluZXIsIHNhdmUgdGhlbSBhbmQgZml4IHRoZW0KICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9ID0gQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogIGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfTsKICAvLyBXZSBzYXZlIHRoZSBjdXJyZW50IHBsb3Qgc2l6ZSBiZWZvcmUgd2UgcG9wIGFzIGl0IHdpbGwgZmlsbCB0aGUgc2NyZWVuCiAgY29uc3QgY3VycmVudF9wbG90X3NpemUgPSB7CiAgICB3aWR0aDogUExPVC5fZnVsbExheW91dC53aWR0aCwKICAgIGhlaWdodDogUExPVC5fZnVsbExheW91dC5oZWlnaHQsCiAgfTsKICAvLyBXZSBoYXZlIHRvIHNhdmUgdGhlIHBhZCBkYXRhIGJlZm9yZSBwb3BwaW5nIHNvIHdlIGNhbiByZXNpemUgcHJlY2lzZWx5CiAgY29uc3QgcGFkID0ge307CiAgcGFkLnVucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgdHJ1ZSk7CiAgcGFkLnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICAvLyBXZSBkbyB0b3AgYW5kIGxlZnQgYmFzZWQgb24gdGhlIGN1cnJlbnQgcmVjdAogIGZvciAoY29uc3Qga2V5IG9mIFsidG9wIiwgImxlZnQiXSkgewogICAgY29uc3Qgc3RhcnRfdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY29udGFpbmVyX3JlY3Rba2V5XTsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgZm9yIChjb25zdCBraW5kIG9mIFsicGFkZGluZyIsICJib3JkZXIiXSkgewogICAgICBvZmZzZXQgKz0gcGFkLnBvcHBlZFtraW5kXVtrZXldIC0gcGFkLnVucG9wcGVkW2tpbmRdW2tleV07CiAgICB9CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHN0YXJ0X3ZhbCAtIG9mZnNldCArICJweCI7CiAgICBpZiAoa2V5ID09PSAibGVmdCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIC8vIFdlIGNvbXB1dGUgdGhlIHdpZHRoIGFuZCBoZWlnaHQgZGVwZW5kaW5nIG9uIGV2ZW50dWFsIGNvbmZpZyBkYXRhCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoewogICAgd2lkdGg6CiAgICAgIHRhcmdldF9wbG90X3NpemUud2lkdGggPz8KICAgICAgY29uZmlnX3NwYW5zLndpZHRoLmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS5oZWlnaHQgPz8KICAgICAgY29uZmlnX3NwYW5zLmhlaWdodC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUuaGVpZ2h0LAogIH0pOwogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIGNvbnN0IHZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNzeltrZXldOwogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSB2YWwgKyAicHgiOwogICAgaWYgKGtleSA9PT0gIndpZHRoIikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCBmYWxzZSk7CiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgdW5wb3BfY29udGFpbmVyKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKfQoKQ09OVEFJTkVSLnBvcE91dCA9IHBvcG91dF9jb250YWluZXI7CgpmdW5jdGlvbiBEdWFsQ2xpY2soc2luZ2xlX2Z1bmMsIGRibF9mdW5jKSB7CiAgbGV0IG5jbGlja3MgPSAwOwogIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykgewogICAgbmNsaWNrcyArPSAxOwogICAgaWYgKG5jbGlja3MgPiAxKSB7CiAgICAgIGRibF9mdW5jKC4uLmFyZ3MpOwogICAgICBuY2xpY2tzID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIGRlbGF5KDMwMCkudGhlbigoKSA9PiB7CiAgICAgICAgaWYgKG5jbGlja3MgPT0gMSkgewogICAgICAgICAgc2luZ2xlX2Z1bmMoLi4uYXJncyk7CiAgICAgICAgfQogICAgICAgIG5jbGlja3MgPSAwOwogICAgICB9KTsKICAgIH0KICB9Owp9CgovLyBXZSByZW1vdmUgdGhlIGRlZmF1bHQgZG93bmxvYWQgaW1hZ2UgYnV0dG9uCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSwKICBbInRvSW1hZ2UiXQopOwovLyBXZSBhZGQgdGhlIGN1c3RvbSBidXR0b24gdG8gdGhlIG1vZGViYXIKcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkLAogIFsKICAgIHsKICAgICAgbmFtZTogIkNvcHkgUE5HIHRvIENsaXBib2FyZCIsCiAgICAgIGljb246IHsKICAgICAgICBoZWlnaHQ6IDUyMCwKICAgICAgICB3aWR0aDogNTIwLAogICAgICAgIHBhdGg6ICJNMjgwIDY0aDQwYzM1LjMgMCA2NCAyOC43IDY0IDY0VjQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEg2NGMtMzUuMyAwLTY0LTI4LjctNjQtNjRWMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0aDQwIDkuNkMxMjEgMjcuNSAxNTMuMyAwIDE5MiAwczcxIDI3LjUgNzguNCA2NEgyODB6TTY0IDExMmMtOC44IDAtMTYgNy4yLTE2IDE2VjQ0OGMwIDguOCA3LjIgMTYgMTYgMTZIMzIwYzguOCAwIDE2LTcuMiAxNi0xNlYxMjhjMC04LjgtNy4yLTE2LTE2LTE2SDMwNHYyNGMwIDEzLjMtMTAuNyAyNC0yNCAyNEgxOTIgMTA0Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNFYxMTJINjR6bTEyOC04YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHoiLAogICAgICB9LAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soY29weUltYWdlVG9DbGlwYm9hcmQsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKCk7CiAgICAgIH0pLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIkRvd25sb2FkIEltYWdlIiwKICAgICAgaWNvbjogUGxvdGx5Lkljb25zLmNhbWVyYSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKHNhdmVJbWFnZVRvRmlsZSwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoeyBjbDogImZpbGVzYXZlIiB9KTsKICAgICAgfSksCiAgICB9LAogIF0KKTsKCmZ1bmN0aW9uIGdldE9mZnNldERhdGEoZWwpIHsKICBsZXQgY3MgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgbnVsbCk7CiAgY29uc3Qgb2RhdGEgPSB7CiAgICBwYWRkaW5nOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgfSwKICAgIGJvcmRlcjogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgfQogIH07CiAgaWYgKGVsID09PSBQTE9UKSB7CiAgICAvLyBGb3IgdGhlIFBMT1Qgd2UgYWxzbyB3YW50IHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBvZmZzZXQKICAgIG9kYXRhLm9mZnNldCA9IHsKICAgICAgdG9wOiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldFRvcCA6IDAsCiAgICAgIGxlZnQ6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0TGVmdCA6IDAsCiAgICB9CiAgfQogIHJldHVybiBvZGF0YTsKfQpmdW5jdGlvbiBnZXRTaXplRGF0YSgpIHsKICBjb25zdCBkYXRhID0gewogICAgcGxvdF9wYWQ6IGdldE9mZnNldERhdGEoUExPVCksCiAgICBwbG90X3JlY3Q6IFBMT1QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgICBjb250YWluZXJfcGFkOiBnZXRPZmZzZXREYXRhKENPTlRBSU5FUiksCiAgICBjb250YWluZXJfcmVjdDogQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogIH07CiAgcmV0dXJuIGRhdGE7Cn0KZnVuY3Rpb24gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGNvbnN0IGNvbXB1dGVkX3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIGNvbnN0IG9mZnNldHMgPSBjb21wdXRlZF9zaXplLm9mZnNldHM7CgogIGNvbnN0IHBsb3RfZGF0YSA9IHsKICAgIHdpZHRoOiB3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiBoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfTsKCiAgcmV0dXJuIHsKICAgIHdpZHRoOiAod2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCkgKyBvZmZzZXRzLndpZHRoLAogICAgaGVpZ2h0OiAoaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0KSArIG9mZnNldHMuaGVpZ2h0LAogICAgbm9DaGFuZ2U6IHdpZHRoID09IGNvbXB1dGVkX3NpemUud2lkdGggJiYgaGVpZ2h0ID09IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH0KfQoKLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGNoYW5nZSB0aGUgY29udGFpbmVyIHNpemUgc28gdGhhdCB0aGUgcmVzdWx0aW5nIHBsb3Qgd2lsbCBiZSBtYXRjaGluZyB0aGUgcHJvdmlkZWQgc3BlY3MKZnVuY3Rpb24gY2hhbmdlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgaWYgKCFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgY29uc29sZS5sb2coIlRyaWVkIHRvIGNoYW5nZSBjb250YWluZXIgc2l6ZSB3aGVuIG5vdCBwb3BwZWQsIGlnbm9yaW5nIik7CiAgICByZXR1cm47CiAgfQoKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEpOwoKICBpZiAoY3N6Lm5vQ2hhbmdlKSB7CiAgICBjb25zb2xlLmxvZygiU2l6ZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50LCBpZ25vcmluZyIpOwogICAgcmV0dXJuCiAgfQogIC8vIFdlIGFyZSBub3cgZ29pbmcgdG8gc2V0IGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGNvbnRhaW5lcgogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gY3N6W2tleV0gKyAicHgiOwogIH0KfQovLyBXZSBub3cgY3JlYXRlIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgdXBkYXRlIHRoZSBwbG90IGJhc2VkIG9uIHRoZSB2YWx1ZXMgc3BlY2lmaWVkCmZ1bmN0aW9uIHVwZGF0ZUZyb21IZWFkZXIoKSB7CiAgY29uc3QgaGVhZGVyX2RhdGEgPSB7CiAgICBoZWlnaHQ6IGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUsCiAgICB3aWR0aDogY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlLAogIH07CiAgY2hhbmdlQ29udGFpbmVyU2l6ZShoZWFkZXJfZGF0YSk7Cn0KLy8gV2UgYXNzaWduIHRoaXMgZnVuY3Rpb24gdG8gdGhlIG9uYmx1ciBldmVudCBvZiB3aWR0aCBhbmQgaGVpZ2h0CmlmIChmaXJzdFJ1bikgewogIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLnVpX3NwYW4ub25ibHVyID0gKGUpID0+IHsKICAgICAgY29udGFpbmVyLnVpX3ZhbHVlID0gY29udGFpbmVyLnVpX3NwYW4udGV4dENvbnRlbnQ7CiAgICAgIHVwZGF0ZUZyb21IZWFkZXIoKTsKICAgIH07CiAgfQp9Ci8vIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIHBsb3Qgc2l6ZSB0byB1c2UgZm9yIHJlbGF5b3V0IGFzIGEgZnVuY3Rpb24gb2YgdGhlIGNvbnRhaW5lciBzaXplCmZ1bmN0aW9uIGNvbXB1dGVQbG90U2l6ZShkYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIC8vIFJlbW92ZSBQYWRkaW5nCiAgY29uc3QgeyBjb250YWluZXJfcGFkLCBwbG90X3BhZCwgY29udGFpbmVyX3JlY3QgfSA9IGRhdGE7CiAgY29uc3Qgb2Zmc2V0cyA9IHsKICAgIHdpZHRoOgogICAgICBwbG90X3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLndpZHRoICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LmxlZnQgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci53aWR0aCwKICAgIGhlaWdodDoKICAgICAgcGxvdF9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBwbG90X3BhZC5ib3JkZXIuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LnRvcCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci5oZWlnaHQsCiAgfTsKICBjb25zdCBzeiA9IHsKICAgIHdpZHRoOiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LndpZHRoIC0gb2Zmc2V0cy53aWR0aCksCiAgICBoZWlnaHQ6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3QuaGVpZ2h0IC0gb2Zmc2V0cy5oZWlnaHQpLAogICAgb2Zmc2V0cywKICB9OwogIHJldHVybiBzejsKfQoKLy8gQ3JlYXRlIHRoZSByZXNpemVPYnNlcnZlciB0byBtYWtlIHRoZSBwbG90IGV2ZW4gbW9yZSByZXNwb25zaXZlISA6bWFnaWM6CmNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7CiAgY29uc3Qgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpOwogIGNvbnN0IHtjb250YWluZXJfcmVjdCwgY29udGFpbmVyX3BhZH0gPSBzaXplRGF0YTsKICBsZXQgcGxvdF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICAvLyBXZSBzYXZlIHRoZSBoZWlnaHQgaW4gdGhlIFBMT1Qgb2JqZWN0CiAgUExPVC5jb250YWluZXJfaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0OwogIC8vIFdlIGRlYWwgd2l0aCBzb21lIHN0dWZmIGlmIHRoZSBjb250YWluZXIgaXMgcG9wcHBlZAogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSBjb250YWluZXJfcmVjdC53aWR0aCArICJweCI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gY29udGFpbmVyX3JlY3QubGVmdCArICJweCI7CiAgY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS5oZWlnaHQ7CiAgY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlID0gcGxvdF9zaXplLndpZHRoOwogIC8qIAoJCVRoZSBhZGRpdGlvbiBvZiB0aGUgaW52YWxpZCBhcmd1bWVudCBgcGx1dG9yZXNpemVgIHNlZW1zIHRvIGZpeCB0aGUgcHJvYmxlbSB3aXRoIGNhbGxpbmcgYHJlbGF5b3V0YCBzaW1wbHkgd2l0aCBge2F1dG9zaXplOiB0cnVlfWAgYXMgdXBkYXRlIGJyZWFraW5nIG1vdXNlIHJlbGF5b3V0IGV2ZW50cyB0cmFja2luZy4gCgkJU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wbG90bHkvcGxvdGx5LmpzL2lzc3Vlcy82MTU2IGZvciBkZXRhaWxzCgkJKi8KICBsZXQgY29uZmlnID0gewogICAgLy8gSWYgdGhpcyBpcyBwb3BwZWQgb3V0LCB3ZSBpZ25vcmUgdGhlIG9yaWdpbmFsIHdpZHRoL2hlaWdodAogICAgd2lkdGg6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX3dpZHRoKSA/PyBwbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX2hlaWdodCkgPz8gcGxvdF9zaXplLmhlaWdodCwKICAgIHBsdXRvcmVzaXplOiB0cnVlLAogIH07CiAgUGxvdGx5LnJlbGF5b3V0KFBMT1QsIGNvbmZpZykudGhlbigoKSA9PiB7CiAgICBpZiAocmVtb3ZlX2NvbnRhaW5lcl9zaXplICYmICFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBhdm9pZCB0aGUgZmlyc3QgcmVzaXplIHVwb24gcGxvdCBjcmVhdGlvbiB0byBhbHJlYWR5IGJlIHdpdGhvdXQgYSBmaXhlZCBoZWlnaHQKICAgICAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9ICIiOwogICAgICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICAgICAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmFsc2U7CiAgICB9CiAgfSk7Cn0pOwoKcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShDT05UQUlORVIpOwoKClBsb3RseS5yZWFjdChQTE9ULCBwbG90X29iaikudGhlbigoKSA9PiB7CgkvLyBBc3NpZ24gdGhlIFBsb3RseSBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhwbG90bHlfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1Qub24oa2V5LCBsaXN0ZW5lcikKCQl9Cgl9CgkvLyBBc3NpZ24gdGhlIEpTIGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKGpzX2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULmFkZEV2ZW50TGlzdGVuZXIoa2V5LCBsaXN0ZW5lciwgewoJCQkJc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbAoJCQl9KQoJCX0KCX0KfQopCgoKaW52YWxpZGF0aW9uLnRoZW4oKCkgPT4gewoJLy8gUmVtb3ZlIGFsbCBwbG90bHkgbGlzdGVuZXJzCglQTE9ULnJlbW92ZUFsbExpc3RlbmVycygpCgkvLyBSZW1vdmUgYWxsIEpTIGxpc3RlbmVycwoJY29udHJvbGxlci5hYm9ydCgpCgkvLyBSZW1vdmUgdGhlIHJlc2l6ZU9ic2VydmVyCglyZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCkKfSkKCgoKCQlyZXR1cm4gQ09OVEFJTkVSCgk8L3NjcmlwdD4KpG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZbByZWNvbl90Ml9zdGFyX3Nlsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b+jFS4EtLBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkMmU2NWFlMzEtZjUwYS00NjJiLTk3NDQtODBiZjZjZGIzODhluWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAANug7VwdWJsaXNoZWRfb2JqZWN0X2tleXOR2TViM2I4NDA4Yy04MTgxLTExZWYtMTRlYi1lMWM1NjliOGJiMjkvZWIyNjBjM2UxZGZkMWVjYbhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQ4NTI5ZjM2ZC0yZDM5LTRiNDUtYTgyMS0wMWM4MzQ2NTM5ZmSKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52kzgPHNjcmlwdD4KCQovLyBMb2FkIHRoZSBsaWJyYXJ5IGZvciBjb25zaXN0ZW50IHNtb290aCBzY3JvbGxpbmcKY29uc3Qge2RlZmF1bHQ6IHNjcm9sbEludG9WaWV3fSA9IGF3YWl0IGltcG9ydCgiZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LGRtRnlJRkU5WlQwK0ltOWlhbVZqZENJOVBYUjVjR1Z2WmlCbEppWnVkV3hzSVQxbEppWXhQVDA5WlM1dWIyUmxWSGx3WlN4VlBTaGxMSFFwUFQ0b0lYUjhmQ0pvYVdSa1pXNGlJVDA5WlNrbUppSjJhWE5wWW14bElpRTlQV1VtSmlKamJHbHdJaUU5UFdVc1FUMG9aU3gwS1QwK2UybG1LR1V1WTJ4cFpXNTBTR1ZwWjJoMFBHVXVjMk55YjJ4c1NHVnBaMmgwZkh4bExtTnNhV1Z1ZEZkcFpIUm9QR1V1YzJOeWIyeHNWMmxrZEdncGUyeGxkQ0JzUFdkbGRFTnZiWEIxZEdWa1UzUjViR1VvWlN4dWRXeHNLVHR5WlhSMWNtNGdWU2hzTG05MlpYSm1iRzkzV1N4MEtYeDhWU2hzTG05MlpYSm1iRzkzV0N4MEtYeDhLR1U5UG50c1pYUWdkRDBvWlQwK2UybG1LQ0ZsTG05M2JtVnlSRzlqZFcxbGJuUjhmQ0ZsTG05M2JtVnlSRzlqZFcxbGJuUXVaR1ZtWVhWc2RGWnBaWGNwY21WMGRYSnVJRzUxYkd3N2RISjVlM0psZEhWeWJpQmxMbTkzYm1WeVJHOWpkVzFsYm5RdVpHVm1ZWFZzZEZacFpYY3VabkpoYldWRmJHVnRaVzUwZldOaGRHTm9lM0psZEhWeWJpQnVkV3hzZlgwcEtHVXBPM0psZEhWeWJpRWhkQ1ltS0hRdVkyeHBaVzUwU0dWcFoyaDBQR1V1YzJOeWIyeHNTR1ZwWjJoMGZIeDBMbU5zYVdWdWRGZHBaSFJvUEdVdWMyTnliMnhzVjJsa2RHZ3BmU2tvWlNsOWNtVjBkWEp1SVRGOUxGZzlLR1VzZEN4c0xHOHNiaXh5TEdrc2N5azlQbkk4WlNZbWFUNTBmSHh5UG1VbUptazhkRDh3T25JOFBXVW1Kbk04UFd4OGZHaytQWFFtSm5NK1BXdy9jaTFsTFc4NmFUNTBKaVp6UEd4OGZISThaU1ltY3o1c1Aya3RkQ3R1T2pBc0pEMWxQVDVsTG5CaGNtVnVkRVZzWlcxbGJuUS9QeWhsTG1kbGRGSnZiM1JPYjJSbEtDa3VhRzl6ZEh4OGJuVnNiQ2tzZEhROUtHVXNkQ2s5UG50MllYSWdiQ3h2TEc0c2NqdHBaaWgwZVhCbGIyWWdaRzlqZFcxbGJuUStJblVpS1hKbGRIVnlibHRkTzJ4bGRIdHpZM0p2Ykd4TmIyUmxPbWtzWW14dlkyczZjeXhwYm14cGJtVTZZU3hpYjNWdVpHRnllVHBvTEhOcmFYQlBkbVZ5Wm14dmQwaHBaR1JsYmtWc1pXMWxiblJ6T25WOVBYUXNaejBpWm5WdVkzUnBiMjRpUFQxMGVYQmxiMllnYUQ5b09tVTlQbVVoUFQxb08ybG1LQ0ZSS0dVcEtYUm9jbTkzSUZSNWNHVkZjbkp2Y2lnaVNXNTJZV3hwWkNCMFlYSm5aWFFpS1R0c1pYUWdkajFrYjJOMWJXVnVkQzV6WTNKdmJHeHBibWRGYkdWdFpXNTBmSHhrYjJOMWJXVnVkQzVrYjJOMWJXVnVkRVZzWlcxbGJuUXNiVDFiWFN4M1BXVTdabTl5S0R0UktIY3BKaVpuS0hjcE95bDdhV1lvS0hjOUpDaDNLU2s5UFQxMktYdHRMbkIxYzJnb2R5azdZbkpsWVd0OWJuVnNiQ0U5ZHlZbWR6MDlQV1J2WTNWdFpXNTBMbUp2WkhrbUprRW9keWttSmlGQktHUnZZM1Z0Wlc1MExtUnZZM1Z0Wlc1MFJXeGxiV1Z1ZENsOGZHNTFiR3doUFhjbUprRW9keXgxS1NZbWJTNXdkWE5vS0hjcGZXeGxkQ0JYUFc1MWJHd2hQU2h2UFc1MWJHdzlQU2hzUFhkcGJtUnZkeTUyYVhOMVlXeFdhV1YzY0c5eWRDay9kbTlwWkNBd09td3VkMmxrZEdncFAyODZhVzV1WlhKWGFXUjBhQ3hJUFc1MWJHd2hQU2h5UFc1MWJHdzlQU2h1UFhkcGJtUnZkeTUyYVhOMVlXeFdhV1YzY0c5eWRDay9kbTlwWkNBd09tNHVhR1ZwWjJoMEtUOXlPbWx1Ym1WeVNHVnBaMmgwTEh0elkzSnZiR3hZT2w4c2MyTnliMnhzV1RwNGZUMTNhVzVrYjNjc2UyaGxhV2RvZERwRkxIZHBaSFJvT2xRc2RHOXdPazRzY21sbmFIUTZUQ3hpYjNSMGIyMDZXU3hzWldaME9rTjlQV1V1WjJWMFFtOTFibVJwYm1kRGJHbGxiblJTWldOMEtDa3NVajBpYzNSaGNuUWlQVDA5YzN4OEltNWxZWEpsYzNRaVBUMDljejlPT2lKbGJtUWlQVDA5Y3o5Wk9rNHJSUzh5TEZZOUltTmxiblJsY2lJOVBUMWhQME1yVkM4eU9pSmxibVFpUFQwOVlUOU1Pa01zUWoxYlhUdG1iM0lvYkdWMElFUTlNRHRFUEcwdWJHVnVaM1JvTzBRckt5bDdiR1YwSUU4OWJWdEVYU3g3YUdWcFoyaDBPbW9zZDJsa2RHZzZTU3gwYjNBNlV5eHlhV2RvZERweExHSnZkSFJ2YlRwNkxHeGxablE2Um4wOVR5NW5aWFJDYjNWdVpHbHVaME5zYVdWdWRGSmxZM1FvS1R0cFppZ2lhV1l0Ym1WbFpHVmtJajA5UFdrbUprNCtQVEFtSmtNK1BUQW1KbGs4UFVnbUprdzhQVmNtSms0K1BWTW1KbGs4UFhvbUprTStQVVltSmt3OFBYRXBZbkpsWVdzN2JHVjBJRWM5WjJWMFEyOXRjSFYwWldSVGRIbHNaU2hQS1N4S1BYQmhjbk5sU1c1MEtFY3VZbTl5WkdWeVRHVm1kRmRwWkhSb0xERXdLU3hMUFhCaGNuTmxTVzUwS0VjdVltOXlaR1Z5Vkc5d1YybGtkR2dzTVRBcExGQTljR0Z5YzJWSmJuUW9SeTVpYjNKa1pYSlNhV2RvZEZkcFpIUm9MREV3S1N4YVBYQmhjbk5sU1c1MEtFY3VZbTl5WkdWeVFtOTBkRzl0VjJsa2RHZ3NNVEFwTEdWbFBUQXNaWFE5TUN4bGJEMGliMlptYzJWMFYybGtkR2dpYVc0Z1R6OVBMbTltWm5ObGRGZHBaSFJvTFU4dVkyeHBaVzUwVjJsa2RHZ3RTaTFRT2pBc1pXODlJbTltWm5ObGRFaGxhV2RvZENKcGJpQlBQMDh1YjJabWMyVjBTR1ZwWjJoMExVOHVZMnhwWlc1MFNHVnBaMmgwTFVzdFdqb3dMR1Z1UFNKdlptWnpaWFJYYVdSMGFDSnBiaUJQUHpBOVBUMVBMbTltWm5ObGRGZHBaSFJvUHpBNlNTOVBMbTltWm5ObGRGZHBaSFJvT2pBc1pYSTlJbTltWm5ObGRFaGxhV2RvZENKcGJpQlBQekE5UFQxUExtOW1abk5sZEVobGFXZG9kRDh3T21vdlR5NXZabVp6WlhSSVpXbG5hSFE2TUR0cFppaDJQVDA5VHlsbFpUMGljM1JoY25RaVBUMDljejlTT2lKbGJtUWlQVDA5Y3o5U0xVZzZJbTVsWVhKbGMzUWlQVDA5Y3o5WUtIZ3NlQ3RJTEVnc1N5eGFMSGdyVWl4NEsxSXJSU3hGS1RwU0xVZ3ZNaXhsZEQwaWMzUmhjblFpUFQwOVlUOVdPaUpqWlc1MFpYSWlQVDA5WVQ5V0xWY3ZNam9pWlc1a0lqMDlQV0UvVmkxWE9sZ29YeXhmSzFjc1Z5eEtMRkFzWHl0V0xGOHJWaXRVTEZRcExHVmxQVTFoZEdndWJXRjRLREFzWldVcmVDa3NaWFE5VFdGMGFDNXRZWGdvTUN4bGRDdGZLVHRsYkhObGUyVmxQU0p6ZEdGeWRDSTlQVDF6UDFJdFV5MUxPaUpsYm1RaVBUMDljejlTTFhvcldpdGxiem9pYm1WaGNtVnpkQ0k5UFQxelAxZ29VeXg2TEdvc1N5eGFLMlZ2TEZJc1VpdEZMRVVwT2xJdEtGTXJhaTh5S1N0bGJ5OHlMR1YwUFNKemRHRnlkQ0k5UFQxaFAxWXRSaTFLT2lKalpXNTBaWElpUFQwOVlUOVdMU2hHSzBrdk1pa3JaV3d2TWpvaVpXNWtJajA5UFdFL1ZpMXhLMUFyWld3NldDaEdMSEVzU1N4S0xGQXJaV3dzVml4V0sxUXNWQ2s3YkdWMGUzTmpjbTlzYkV4bFpuUTZaV2tzYzJOeWIyeHNWRzl3T21Wa2ZUMVBPMlZsUFUxaGRHZ3ViV0Y0S0RBc1RXRjBhQzV0YVc0b1pXUXJaV1V2WlhJc1R5NXpZM0p2Ykd4SVpXbG5hSFF0YWk5bGNpdGxieWtwTEdWMFBVMWhkR2d1YldGNEtEQXNUV0YwYUM1dGFXNG9aV2tyWlhRdlpXNHNUeTV6WTNKdmJHeFhhV1IwYUMxSkwyVnVLMlZzS1Nrc1VpczlaV1F0WldVc1ZpczlaV2t0WlhSOVFpNXdkWE5vS0h0bGJEcFBMSFJ2Y0RwbFpTeHNaV1owT21WMGZTbDljbVYwZFhKdUlFSjlMR1k5WlQwK2UzWmhjaUIwTzNKbGRIVnliaUV4UFQwOVpUOTdZbXh2WTJzNkltVnVaQ0lzYVc1c2FXNWxPaUp1WldGeVpYTjBJbjA2S0hROVpTazlQVDFQWW1wbFkzUW9kQ2ttSmpBaFBUMVBZbXBsWTNRdWEyVjVjeWgwS1M1c1pXNW5kR2cvWlRwN1lteHZZMnM2SW5OMFlYSjBJaXhwYm14cGJtVTZJbTVsWVhKbGMzUWlmWDA3Wm5WdVkzUnBiMjRnWXlobExIUXBlM1poY2lCc08ybG1LQ0ZsTG1selEyOXVibVZqZEdWa2ZId2hLR1U5UG50c1pYUWdkRDFsTzJadmNpZzdkQ1ltZEM1d1lYSmxiblJPYjJSbE95bDdhV1lvZEM1d1lYSmxiblJPYjJSbFBUMDlaRzlqZFcxbGJuUXBjbVYwZFhKdUlUQTdkRDEwTG5CaGNtVnVkRTV2WkdVZ2FXNXpkR0Z1WTJWdlppQlRhR0ZrYjNkU2IyOTBQM1F1Y0dGeVpXNTBUbTlrWlM1b2IzTjBPblF1Y0dGeVpXNTBUbTlrWlgxeVpYUjFjbTRoTVgwcEtHVXBLWEpsZEhWeWJqdHBaaWdpYjJKcVpXTjBJajA5ZEhsd1pXOW1LR3c5ZENrbUppSm1kVzVqZEdsdmJpSTlQWFI1Y0dWdlppQnNMbUpsYUdGMmFXOXlLWEpsZEhWeWJpQjBMbUpsYUdGMmFXOXlLSFIwS0dVc2RDa3BPMnhsZENCdlBTSmliMjlzWldGdUlqMDlkSGx3Wlc5bUlIUjhmRzUxYkd3OVBYUS9kbTlwWkNBd09uUXVZbVZvWVhacGIzSTdabTl5S0d4bGRIdGxiRHB1TEhSdmNEcHlMR3hsWm5RNmFYMXZaaUIwZENobExHWW9kQ2twS1c0dWMyTnliMnhzS0h0MGIzQTZjaXhzWldaME9ta3NZbVZvWVhacGIzSTZiMzBwZlhaaGNpQmtMSEE5S0NrOVBpaGtmSHdvWkQwaWNHVnlabTl5YldGdVkyVWlhVzRnZDJsdVpHOTNQM0JsY21admNtMWhibU5sTG01dmR5NWlhVzVrS0hCbGNtWnZjbTFoYm1ObEtUcEVZWFJsTG01dmR5a3NaQ2dwS1R0bWRXNWpkR2x2YmlCaUtHVXBlMnhsZENCMFBVMWhkR2d1YldsdUtDaHdLQ2t0WlM1emRHRnlkRlJwYldVcEwyVXVaSFZ5WVhScGIyNHNNU2tzYkQxbExtVmhjMlVvZENrc2J6MWxMbk4wWVhKMFdDc29aUzU0TFdVdWMzUmhjblJZS1Nwc0xHNDlaUzV6ZEdGeWRGa3JLR1V1ZVMxbExuTjBZWEowV1NrcWJEdGxMbTFsZEdodlpDaHZMRzRzZEN4c0tTeHZJVDA5WlM1NGZIeHVJVDA5WlM1NVAzSmxjWFZsYzNSQmJtbHRZWFJwYjI1R2NtRnRaU2dvS1QwK1lpaGxLU2s2WlM1allpZ3BmV1oxYm1OMGFXOXVJSGtvWlN4MExHd3BlMnhsZENCdlBXRnlaM1Z0Wlc1MGN5NXNaVzVuZEdnK015WW1kbTlwWkNBd0lUMDlZWEpuZFcxbGJuUnpXek5kUDJGeVozVnRaVzUwYzFzelhUbzJNREFzYmoxaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvUGpRbUpuWnZhV1FnTUNFOVBXRnlaM1Z0Wlc1MGMxczBYVDloY21kMWJXVnVkSE5iTkYwNlpUMCtNU3N0TFdVcVpTcGxLbVVxWlN4eVBXRnlaM1Z0Wlc1MGN5NXNaVzVuZEdnK05UOWhjbWQxYldWdWRITmJOVjA2ZG05cFpDQXdMR2s5WVhKbmRXMWxiblJ6TG14bGJtZDBhRDQyUDJGeVozVnRaVzUwYzFzMlhUcDJiMmxrSURBc2N6MWxMbk5qY205c2JFeGxablFzWVQxbExuTmpjbTlzYkZSdmNEdGlLSHR6WTNKdmJHeGhZbXhsT21Vc2JXVjBhRzlrS0hRc2JDeHZMRzRwZTJ4bGRDQnlQVTFoZEdndVkyVnBiQ2gwS1N4elBVMWhkR2d1WTJWcGJDaHNLVHRsTG5OamNtOXNiRXhsWm5ROWNpeGxMbk5qY205c2JGUnZjRDF6TEdrL0xpaDdkR0Z5WjJWME9tVXNaV3hoY0hObFpEcHZMSFpoYkhWbE9tNHNiR1ZtZERweUxIUnZjRHB6ZlNsOUxITjBZWEowVkdsdFpUcHdLQ2tzYzNSaGNuUllPbk1zYzNSaGNuUlpPbUVzZURwMExIazZiQ3hrZFhKaGRHbHZianB2TEdWaGMyVTZiaXhqWWpweWZTbDlkbUZ5SUUwOVpUMCtaU1ltSVdVdVltVm9ZWFpwYjNKOGZDSnpiVzl2ZEdnaVBUMDlaUzVpWldoaGRtbHZjaXhyUFdaMWJtTjBhVzl1S0dVc2RDbDdiR1YwSUd3OWRIeDhlMzA3Y21WMGRYSnVJRTBvYkNrL1l5aGxMSHRpYkc5amF6cHNMbUpzYjJOckxHbHViR2x1WlRwc0xtbHViR2x1WlN4elkzSnZiR3hOYjJSbE9td3VjMk55YjJ4c1RXOWtaU3hpYjNWdVpHRnllVHBzTG1KdmRXNWtZWEo1TEhOcmFYQlBkbVZ5Wm14dmQwaHBaR1JsYmtWc1pXMWxiblJ6T213dWMydHBjRTkyWlhKbWJHOTNTR2xrWkdWdVJXeGxiV1Z1ZEhNc1ltVm9ZWFpwYjNJNlpUMCtVSEp2YldselpTNWhiR3dvWlM1eVpXUjFZMlVvS0dVc2RDazlQbnRzWlhSN1pXdzZieXhzWldaME9tNHNkRzl3T25KOVBYUXNhVDF2TG5OamNtOXNiRXhsWm5Rc2N6MXZMbk5qY205c2JGUnZjRHR5WlhSMWNtNGdhVDA5UFc0bUpuTTlQVDF5UDJVNld5NHVMbVVzYm1WM0lGQnliMjFwYzJVb1pUMCtlU2h2TEc0c2NpeHNMbVIxY21GMGFXOXVMR3d1WldGelpTd29LVDArWlNoN1pXdzZieXhzWldaME9sdHBMRzVkTEhSdmNEcGJjeXh5WFgwcExHd3ViMjVUWTNKdmJHeERhR0Z1WjJVcEtWMTlMRnRkS1NsOUtUcFFjbTl0YVhObExuSmxjMjlzZG1Vb1l5aGxMSFFwS1gwN1pYaHdiM0owZTJzZ1lYTWdaR1ZtWVhWc2RIMDciKQoKY29uc3QgaW5kZW50ID0gdHJ1ZQpjb25zdCBhc2lkZSA9IHRydWUKY29uc3QgdGl0bGVfdGV4dCA9ICJUYWJsZSBvZiBDb250ZW50cyIKY29uc3QgaW5jbHVkZV9kZWZpbml0aW9ucyA9IGZhbHNlCgoKY29uc3QgdG9jTm9kZSA9IGh0bWxgPG5hdiBjbGFzcz0icGx1dG91aS10b2MiPgoJPGhlYWRlcj4KCSA8c3BhbiBjbGFzcz0idG9jLXRvZ2dsZSBvcGVuLXRvYyI+PC9zcGFuPgoJIDxzcGFuIGNsYXNzPSJ0b2MtdG9nZ2xlIGNsb3NlZC10b2MiPjwvc3Bhbj4KCSAke3RpdGxlX3RleHR9Cgk8L2hlYWRlcj4KCTxzZWN0aW9uPjwvc2VjdGlvbj4KPC9uYXY+YAoKdG9jTm9kZS5jbGFzc0xpc3QudG9nZ2xlKCJhc2lkZSIsIGFzaWRlKQp0b2NOb2RlLmNsYXNzTGlzdC50b2dnbGUoImluZGVudCIsIGluZGVudCkKCgpjb25zdCBnZXRQYXJlbnRDZWxsID0gZWwgPT4gZWwuY2xvc2VzdCgicGx1dG8tY2VsbCIpCgpjb25zdCBnZXRIZWFkZXJzID0gKCkgPT4gewoJY29uc3QgZGVwdGggPSBNYXRoLm1heCgxLCBNYXRoLm1pbig2LCAzKSkgLy8gc2hvdWxkIGJlIGluIHJhbmdlIDE6NgoJY29uc3QgcmFuZ2UgPSBBcnJheS5mcm9tKHtsZW5ndGg6IGRlcHRofSwgKHgsIGkpID0+IGkrMSkgLy8gWzEsIC4uLiwgZGVwdGhdCgkKCWNvbnN0IHNlbGVjdG9yID0gWwoJCS4uLihpbmNsdWRlX2RlZmluaXRpb25zID8gWwoJCQlgcGx1dG8tbm90ZWJvb2sgcGx1dG8tY2VsbCAucGx1dG8tZG9jcy1iaW5kaW5nYCwgCgkJCWBwbHV0by1ub3RlYm9vayBwbHV0by1jZWxsIGFzc2lnbmVlOm5vdCg6ZW1wdHkpYCwgCgkJXSA6IFtdKSwKCQkuLi5yYW5nZS5tYXAoaSA9PiBgcGx1dG8tbm90ZWJvb2sgcGx1dG8tY2VsbCBoJHtpfWApCgldLmpvaW4oIiwiKQoJcmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpLmZpbHRlcihlbCA9PiAKCQkvLyBleGNsdWRlIGhlYWRlcnMgaW5zaWRlIG9mIGEgcGx1dG8tZG9jcy1iaW5kaW5nIGJsb2NrCgkJIShlbC5ub2RlTmFtZS5zdGFydHNXaXRoKCJIIikgJiYgZWwuY2xvc2VzdCgiLnBsdXRvLWRvY3MtYmluZGluZyIpKQoJKQp9CgoKY29uc3QgZG9jdW1lbnRfY2xpY2tfaGFuZGxlciA9IChldmVudCkgPT4gewoJY29uc3QgcGF0aCA9IChldmVudC5wYXRoIHx8IGV2ZW50LmNvbXBvc2VkUGF0aCgpKQoJY29uc3QgdG9jID0gcGF0aC5maW5kKGVsZW0gPT4gZWxlbT8uY2xhc3NMaXN0Py5jb250YWlucz8uKCJ0b2MtdG9nZ2xlIikpCglpZiAodG9jKSB7CgkJZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkKCQl0b2MuY2xvc2VzdCgiLnBsdXRvdWktdG9jIikuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZSIpCgl9Cn0KCmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZG9jdW1lbnRfY2xpY2tfaGFuZGxlcikKCgpjb25zdCBoZWFkZXJfdG9faW5kZXhfZW50cnlfbWFwID0gbmV3IE1hcCgpCmNvbnN0IGN1cnJlbnRseV9oaWdobGlnaHRlZF9zZXQgPSBuZXcgU2V0KCkKCmNvbnN0IGxhc3RfdG9jX2VsZW1lbnRfY2xpY2tfdGltZSA9IHsgY3VycmVudDogMCB9Cgpjb25zdCBpbnRlcnNlY3Rpb25fY2FsbGJhY2sgPSAoaXhzKSA9PiB7CglsZXQgb25fdG9wID0gaXhzLmZpbHRlcihpeCA9PiBpeC5pbnRlcnNlY3Rpb25SYXRpbyA+IDAgJiYgaXguaW50ZXJzZWN0aW9uUmVjdC55IDwgaXgucm9vdEJvdW5kcy5oZWlnaHQgLyAyKQoJaWYob25fdG9wLmxlbmd0aCA+IDApewoJCWN1cnJlbnRseV9oaWdobGlnaHRlZF9zZXQuZm9yRWFjaChhID0+IGEuY2xhc3NMaXN0LnJlbW92ZSgiaW4tdmlldyIpKQoJCWN1cnJlbnRseV9oaWdobGlnaHRlZF9zZXQuY2xlYXIoKQoJCW9uX3RvcC5zbGljZSgwLDEpLmZvckVhY2goaSA9PiB7CgkJCWxldCBkaXYgPSBoZWFkZXJfdG9faW5kZXhfZW50cnlfbWFwLmdldChpLnRhcmdldCkKCQkJZGl2LmNsYXNzTGlzdC5hZGQoImluLXZpZXciKQoJCQljdXJyZW50bHlfaGlnaGxpZ2h0ZWRfc2V0LmFkZChkaXYpCgkJCQoJCQkvLy8gc2Nyb2xsIGludG8gdmlldwoJCQkvKgoJCQljb25zdCB0b2NfaGVpZ2h0ID0gdG9jTm9kZS5vZmZzZXRIZWlnaHQKCQkJY29uc3QgZGl2X3BvcyA9IGRpdi5vZmZzZXRUb3AKCQkJY29uc3QgZGl2X2hlaWdodCA9IGRpdi5vZmZzZXRIZWlnaHQKCQkJY29uc3QgY3VycmVudF9zY3JvbGwgPSB0b2NOb2RlLnNjcm9sbFRvcAoJCQljb25zdCBoZWFkZXJfaGVpZ2h0ID0gdG9jTm9kZS5xdWVyeVNlbGVjdG9yKCJoZWFkZXIiKS5vZmZzZXRIZWlnaHQKCQkJCgkJCWNvbnN0IHNjcm9sbF90b190b3AgPSBkaXZfcG9zIC0gaGVhZGVyX2hlaWdodAoJCQljb25zdCBzY3JvbGxfdG9fYm90dG9tID0gZGl2X3BvcyArIGRpdl9oZWlnaHQgLSB0b2NfaGVpZ2h0CgkJCQoJCQkvLyBpZiB3ZSBzZXQgYSBzY3JvbGxUb3AsIHRoZW4gdGhlIGJyb3dzZXIgd2lsbCBzdG9wIGFueSBjdXJyZW50bHkgb25nb2luZyBzbW9vdGhzY3JvbGwgYW5pbWF0aW9uLiBTbyBsZXQncyBvbmx5IGRvIHRoaXMgaWYgeW91IGFyZSBub3QgY3VycmVudGx5IGluIGEgc21vb3Roc2Nyb2xsLgoJCQlpZihEYXRlLm5vdygpIC0gbGFzdF90b2NfZWxlbWVudF9jbGlja190aW1lLmN1cnJlbnQgPj0gMjAwMCkKCQkJCWlmKGN1cnJlbnRfc2Nyb2xsIDwgc2Nyb2xsX3RvX2JvdHRvbSl7CgkJCQkJdG9jTm9kZS5zY3JvbGxUb3AgPSBzY3JvbGxfdG9fYm90dG9tCgkJCQl9IGVsc2UgaWYoY3VycmVudF9zY3JvbGwgPiBzY3JvbGxfdG9fdG9wKXsKCQkJCQl0b2NOb2RlLnNjcm9sbFRvcCA9IHNjcm9sbF90b190b3AKCQkJCX0KCQkJKi8KCQl9KQoJfQp9CmxldCBpbnRlcnNlY3Rpb25fb2JzZXJ2ZXJfMSA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihpbnRlcnNlY3Rpb25fY2FsbGJhY2ssIHsKCXJvb3Q6IG51bGwsIC8vIGkuZS4gdGhlIHZpZXdwb3J0CiAgCXRocmVzaG9sZDogMSwKCXJvb3RNYXJnaW46ICItMTVweCIsIC8vIHNsaWdodGx5IHNtYWxsZXIgdGhhbiB0aGUgdmlld3BvcnQKCS8vIGRlbGF5OiAxMDAsCn0pCmxldCBpbnRlcnNlY3Rpb25fb2JzZXJ2ZXJfMiA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihpbnRlcnNlY3Rpb25fY2FsbGJhY2ssIHsKCXJvb3Q6IG51bGwsIC8vIGkuZS4gdGhlIHZpZXdwb3J0CiAgCXRocmVzaG9sZDogMSwKCXJvb3RNYXJnaW46ICIxNXB4IiwgLy8gc2xpZ2h0bHkgbGFyZ2VyIHRoYW4gdGhlIHZpZXdwb3J0CgkvLyBkZWxheTogMTAwLAp9KQoKY29uc3QgcmVuZGVyID0gKGVsZW1lbnRzKSA9PiB7CgloZWFkZXJfdG9faW5kZXhfZW50cnlfbWFwLmNsZWFyKCkKCWN1cnJlbnRseV9oaWdobGlnaHRlZF9zZXQuY2xlYXIoKQoJaW50ZXJzZWN0aW9uX29ic2VydmVyXzEuZGlzY29ubmVjdCgpCglpbnRlcnNlY3Rpb25fb2JzZXJ2ZXJfMi5kaXNjb25uZWN0KCkKCgkJbGV0IGxhc3RfbGV2ZWwgPSBgSDFgCglyZXR1cm4gaHRtbGAke2VsZW1lbnRzLm1hcChoID0+IHsKCWNvbnN0IHBhcmVudF9jZWxsID0gZ2V0UGFyZW50Q2VsbChoKQoKCQlsZXQgW2NsYXNzTmFtZSwgdGl0bGVfZWxdID0gaC5tYXRjaGVzKGAucGx1dG8tZG9jcy1iaW5kaW5nYCkgPyBbInBsdXRvLWRvY3MtYmluZGluZy1lbCIsIGguZmlyc3RFbGVtZW50Q2hpbGRdIDogW2gubm9kZU5hbWUsIGhdCgoJY29uc3QgYSA9IGh0bWxgPGEgCgkJY2xhc3M9IiR7Y2xhc3NOYW1lfSIgCgkJdGl0bGU9IiR7dGl0bGVfZWwuaW5uZXJUZXh0fSIKCQlocmVmPSIjJHtwYXJlbnRfY2VsbC5pZH0iCgk+JHt0aXRsZV9lbC5pbm5lckhUTUx9PC9hPmAKCS8qIGEub25tb3VzZW92ZXI9KCk9PnsKCQlwYXJlbnRfY2VsbC5maXJzdEVsZW1lbnRDaGlsZC5jbGFzc0xpc3QuYWRkKAoJCQknaGlnaGxpZ2h0LXBsdXRvLWNlbGwtc2hvdWxkZXInCgkJKQoJfQoJYS5vbm1vdXNlb3V0PSgpID0+IHsKCQlwYXJlbnRfY2VsbC5maXJzdEVsZW1lbnRDaGlsZC5jbGFzc0xpc3QucmVtb3ZlKAoJCQknaGlnaGxpZ2h0LXBsdXRvLWNlbGwtc2hvdWxkZXInCgkJKQoJfSAqLwoJCQoJCQoJYS5vbmNsaWNrPShlKSA9PiB7CgkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCWxhc3RfdG9jX2VsZW1lbnRfY2xpY2tfdGltZS5jdXJyZW50ID0gRGF0ZS5ub3coKQoJCXNjcm9sbEludG9WaWV3KGgsIHsKCQkJYmVoYXZpb3I6ICdzbW9vdGgnLCAKCQkJYmxvY2s6ICdzdGFydCcsCgkJfSkudGhlbigoKSA9PiAKCQkJLy8gc29tZXRpbWVzIGl0IGRvZXNuJ3Qgc2Nyb2xsIHRvIHRoZSByaWdodCBwbGFjZQoJCQkvLyBzb2x1dGlvbjogdHJ5IGEgc2Vjb25kIHRpbWUhCgkJCXNjcm9sbEludG9WaWV3KGgsIHsKCQkJCWJlaGF2aW9yOiAnc21vb3RoJywgCgkJCQlibG9jazogJ3N0YXJ0JywKCQkJfSkKCSAgICkKCX0KCgljb25zdCByb3cgPSAgaHRtbGA8ZGl2IGNsYXNzPSJ0b2Mtcm93ICR7Y2xhc3NOYW1lfSBhZnRlci0ke2xhc3RfbGV2ZWx9Ij4ke2F9PC9kaXY+YAoJCWludGVyc2VjdGlvbl9vYnNlcnZlcl8xLm9ic2VydmUodGl0bGVfZWwpCgkJaW50ZXJzZWN0aW9uX29ic2VydmVyXzIub2JzZXJ2ZSh0aXRsZV9lbCkKCQloZWFkZXJfdG9faW5kZXhfZW50cnlfbWFwLnNldCh0aXRsZV9lbCwgcm93KQoKCWlmKGNsYXNzTmFtZS5zdGFydHNXaXRoKCJIIikpCgkJbGFzdF9sZXZlbCA9IGNsYXNzTmFtZQoJCQoJcmV0dXJuIHJvdwp9KX1gCn0KCmNvbnN0IGludmFsaWRhdGVkID0geyBjdXJyZW50OiBmYWxzZSB9Cgpjb25zdCB1cGRhdGVDYWxsYmFjayA9ICgpID0+IHsKCWlmICghaW52YWxpZGF0ZWQuY3VycmVudCkgewoJCXRvY05vZGUucXVlcnlTZWxlY3Rvcigic2VjdGlvbiIpLnJlcGxhY2VXaXRoKAoJCQlodG1sYDxzZWN0aW9uPiR7cmVuZGVyKGdldEhlYWRlcnMoKSl9PC9zZWN0aW9uPmAKCQkpCgl9Cn0KdXBkYXRlQ2FsbGJhY2soKQpzZXRUaW1lb3V0KHVwZGF0ZUNhbGxiYWNrLCAxMDApCnNldFRpbWVvdXQodXBkYXRlQ2FsbGJhY2ssIDEwMDApCnNldFRpbWVvdXQodXBkYXRlQ2FsbGJhY2ssIDUwMDApCgpjb25zdCBub3RlYm9vayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInBsdXRvLW5vdGVib29rIikKCgovLyBXZSBoYXZlIGEgbXV0YXRpb25vYnNlcnZlciBmb3IgZWFjaCBjZWxsOgpjb25zdCBtdXRfb2JzZXJ2ZXJzID0gewoJY3VycmVudDogW10sCn0KCmNvbnN0IGNyZWF0ZUNlbGxPYnNlcnZlcnMgPSAoKSA9PiB7CgltdXRfb2JzZXJ2ZXJzLmN1cnJlbnQuZm9yRWFjaCgobykgPT4gby5kaXNjb25uZWN0KCkpCgltdXRfb2JzZXJ2ZXJzLmN1cnJlbnQgPSBBcnJheS5mcm9tKG5vdGVib29rLnF1ZXJ5U2VsZWN0b3JBbGwoInBsdXRvLWNlbGwiKSkubWFwKGVsID0+IHsKCQljb25zdCBvID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIodXBkYXRlQ2FsbGJhY2spCgkJby5vYnNlcnZlKGVsLCB7YXR0cmlidXRlRmlsdGVyOiBbImNsYXNzIl19KQoJCXJldHVybiBvCgl9KQp9CmNyZWF0ZUNlbGxPYnNlcnZlcnMoKQoKLy8gQW5kIG9uZSBmb3IgdGhlIG5vdGVib29rJ3MgY2hpbGQgbGlzdCwgd2hpY2ggdXBkYXRlcyBvdXIgY2VsbCBvYnNlcnZlcnM6CmNvbnN0IG5vdGVib29rT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7Cgl1cGRhdGVDYWxsYmFjaygpCgljcmVhdGVDZWxsT2JzZXJ2ZXJzKCkKfSkKbm90ZWJvb2tPYnNlcnZlci5vYnNlcnZlKG5vdGVib29rLCB7Y2hpbGRMaXN0OiB0cnVlfSkKCi8vIEFuZCBmaW5hbGx5LCBhbiBvYnNlcnZlciBmb3IgdGhlIGRvY3VtZW50LmJvZHkgY2xhc3NMaXN0LCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgdG9jIGFsc28gd29ya3Mgd2hlbiBpdCBpcyBsb2FkZWQgZHVyaW5nIG5vdGVib29rIGluaXRpYWxpemF0aW9uCmNvbnN0IGJvZHlDbGFzc09ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIodXBkYXRlQ2FsbGJhY2spCmJvZHlDbGFzc09ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwge2F0dHJpYnV0ZUZpbHRlcjogWyJjbGFzcyJdfSkKCi8vIEhpZGUvc2hvdyB0aGUgVG9DIHdoZW4gdGhlIHNjcmVlbiBnZXRzIHNtYWxsCmxldCBtID0gbWF0Y2hNZWRpYSgiKG1heC13aWR0aDogMTAwMHB4KSIpCmxldCBtYXRjaF9saXN0ZW5lciA9ICgpID0+IAoJdG9jTm9kZS5jbGFzc0xpc3QudG9nZ2xlKCJoaWRlIiwgbS5tYXRjaGVzKQptYXRjaF9saXN0ZW5lcigpCm0uYWRkTGlzdGVuZXIobWF0Y2hfbGlzdGVuZXIpCgppbnZhbGlkYXRpb24udGhlbigoKSA9PiB7CglpbnZhbGlkYXRlZC5jdXJyZW50ID0gdHJ1ZQoJaW50ZXJzZWN0aW9uX29ic2VydmVyXzEuZGlzY29ubmVjdCgpCglpbnRlcnNlY3Rpb25fb2JzZXJ2ZXJfMi5kaXNjb25uZWN0KCkKCW5vdGVib29rT2JzZXJ2ZXIuZGlzY29ubmVjdCgpCglib2R5Q2xhc3NPYnNlcnZlci5kaXNjb25uZWN0KCkKCW11dF9vYnNlcnZlcnMuY3VycmVudC5mb3JFYWNoKChvKSA9PiBvLmRpc2Nvbm5lY3QoKSkKCWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZG9jdW1lbnRfY2xpY2tfaGFuZGxlcikKCW0ucmVtb3ZlTGlzdGVuZXIobWF0Y2hfbGlzdGVuZXIpCn0pCgpyZXR1cm4gdG9jTm9kZQo8L3NjcmlwdD4KPHN0eWxlPgpAbWVkaWEgbm90IHByaW50IHsKCi5wbHV0b3VpLXRvYyB7Cglmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAiU2Vnb2UgVUkiLCBSb2JvdG8sIE94eWdlbi1TYW5zLCBDYW50YXJlbGwsICJBcHBsZSBDb2xvciBFbW9qaSIsCgkJIlNlZ29lIFVJIEVtb2ppIiwgIlNlZ29lIFVJIFN5bWJvbCIsIHN5c3RlbS11aSwgc2Fucy1zZXJpZjsKCS0tbWFpbi1iZy1jb2xvcjogI2ZhZmFmYTsKCS0tcGx1dG8tb3V0cHV0LWNvbG9yOiBoc2woMCwgMCUsIDM2JSk7CgktLXBsdXRvLW91dHB1dC1oLWNvbG9yOiBoc2woMCwgMCUsIDIxJSk7CgktLXNpZGViYXItbGktYWN0aXZlLWJnOiByZ2IoMjM1LCAyMzUsIDIzNSk7CgktLWljb24tZmlsdGVyOiB1bnNldDsKfQoKQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewoJLnBsdXRvdWktdG9jIHsKCQktLW1haW4tYmctY29sb3I6ICMzMDMwMzA7CgkJLS1wbHV0by1vdXRwdXQtY29sb3I6IGhzbCgwLCAwJSwgOTAlKTsKCQktLXBsdXRvLW91dHB1dC1oLWNvbG9yOiBoc2woMCwgMCUsIDk3JSk7CgkJLS1zaWRlYmFyLWxpLWFjdGl2ZS1iZzogcmdiKDgyLCA4MiwgODIpOwoJCS0taWNvbi1maWx0ZXI6IGludmVydCgxKTsKCX0KfQoKLnBsdXRvdWktdG9jLmFzaWRlIHsKCWNvbG9yOiB2YXIoLS1wbHV0by1vdXRwdXQtY29sb3IpOwoJcG9zaXRpb246IGZpeGVkOwoJcmlnaHQ6IDFyZW07Cgl0b3A6IDVyZW07Cgl3aWR0aDogbWluKDgwdncsIDMwMHB4KTsKCXBhZGRpbmc6IDAuNXJlbTsKCXBhZGRpbmctdG9wOiAwZW07CgkvKiBib3JkZXI6IDNweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTUpOyAqLwoJYm9yZGVyLXJhZGl1czogMTBweDsKCS8qIGJveC1zaGFkb3c6IDAgMCAxMXB4IDBweCAjMDAwMDAwMTA7ICovCgltYXgtaGVpZ2h0OiBjYWxjKDEwMHZoIC0gNXJlbSAtIDkwcHgpOwoJb3ZlcmZsb3c6IGF1dG87Cgl6LWluZGV4OiA0MDsKCWJhY2tncm91bmQtY29sb3I6IHZhcigtLW1haW4tYmctY29sb3IpOwoJdHJhbnNpdGlvbjogdHJhbnNmb3JtIDMwMG1zIGN1YmljLWJlemllcigwLjE4LCAwLjg5LCAwLjQ1LCAxLjEyKTsKfQoKLnBsdXRvdWktdG9jLmFzaWRlLmhpZGUgewoJdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMTAwJSAtIDI4cHgpKTsKfQoucGx1dG91aS10b2MuYXNpZGUuaGlkZSBzZWN0aW9uIHsKCWRpc3BsYXk6IG5vbmU7Cn0KLnBsdXRvdWktdG9jLmFzaWRlLmhpZGUgaGVhZGVyIHsKCW1hcmdpbi1ib3R0b206IDBlbTsKCXBhZGRpbmctYm90dG9tOiAwZW07Cglib3JkZXItYm90dG9tOiBub25lOwp9Cn0gIC8qIEVuZCBvZiBNZWRpYSBwcmludCBxdWVyeSAqLwoucGx1dG91aS10b2MuYXNpZGUuaGlkZSAub3Blbi10b2MsCi5wbHV0b3VpLXRvYy5hc2lkZTpub3QoLmhpZGUpIC5jbG9zZWQtdG9jLAoucGx1dG91aS10b2M6bm90KC5hc2lkZSkgLmNsb3NlZC10b2MgewoJZGlzcGxheTogbm9uZTsKfQoKQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uKSB7CiAgLnBsdXRvdWktdG9jLmFzaWRlIHsKCXRyYW5zaXRpb24tZHVyYXRpb246IDBzOwogIH0KfQoKLnRvYy10b2dnbGUgewoJY3Vyc29yOiBwb2ludGVyOwogICAgcGFkZGluZzogMWVtOwogICAgbWFyZ2luOiAtMWVtOwogICAgbWFyZ2luLXJpZ2h0OiAtMC43ZW07CiAgICBsaW5lLWhlaWdodDogMWVtOwogICAgZGlzcGxheTogZmxleDsKfQoKLnRvYy10b2dnbGU6OmJlZm9yZSB7CiAgICBjb250ZW50OiAiIjsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIGhlaWdodDogMWVtOwogICAgd2lkdGg6IDFlbTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL2lvbmljLXRlYW0vaW9uaWNvbnNANS41LjEvc3JjL3N2Zy9saXN0LW91dGxpbmUuc3ZnIik7CgkvKiBnZW5lcmF0ZWQgdXNpbmcgaHR0cHM6Ly9kb3BpYXphLm9yZy90b29scy9kYXRhdXJpL2luZGV4LnBocCAqLwogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTFNVElpSUdobGFXZG9kRDBpTlRFeUlpQjJhV1YzUW05NFBTSXdJREFnTlRFeUlEVXhNaUkrUEhScGRHeGxQbWx2Ym1samIyNXpMWFkxTFc4OEwzUnBkR3hsUGp4c2FXNWxJSGd4UFNJeE5qQWlJSGt4UFNJeE5EUWlJSGd5UFNJME5EZ2lJSGt5UFNJeE5EUWlJSE4wZVd4bFBTSm1hV3hzT201dmJtVTdjM1J5YjJ0bE9pTXdNREE3YzNSeWIydGxMV3hwYm1WallYQTZjbTkxYm1RN2MzUnliMnRsTFd4cGJtVnFiMmx1T25KdmRXNWtPM04wY205clpTMTNhV1IwYURvek1uQjRJaTgrUEd4cGJtVWdlREU5SWpFMk1DSWdlVEU5SWpJMU5pSWdlREk5SWpRME9DSWdlVEk5SWpJMU5pSWdjM1I1YkdVOUltWnBiR3c2Ym05dVpUdHpkSEp2YTJVNkl6QXdNRHR6ZEhKdmEyVXRiR2x1WldOaGNEcHliM1Z1WkR0emRISnZhMlV0YkdsdVpXcHZhVzQ2Y205MWJtUTdjM1J5YjJ0bExYZHBaSFJvT2pNeWNIZ2lMejQ4YkdsdVpTQjRNVDBpTVRZd0lpQjVNVDBpTXpZNElpQjRNajBpTkRRNElpQjVNajBpTXpZNElpQnpkSGxzWlQwaVptbHNiRHB1YjI1bE8zTjBjbTlyWlRvak1EQXdPM04wY205clpTMXNhVzVsWTJGd09uSnZkVzVrTzNOMGNtOXJaUzFzYVc1bGFtOXBianB5YjNWdVpEdHpkSEp2YTJVdGQybGtkR2c2TXpKd2VDSXZQanhqYVhKamJHVWdZM2c5SWpnd0lpQmplVDBpTVRRMElpQnlQU0l4TmlJZ2MzUjViR1U5SW1acGJHdzZibTl1WlR0emRISnZhMlU2SXpBd01EdHpkSEp2YTJVdGJHbHVaV05oY0RweWIzVnVaRHR6ZEhKdmEyVXRiR2x1WldwdmFXNDZjbTkxYm1RN2MzUnliMnRsTFhkcFpIUm9Pak15Y0hnaUx6NDhZMmx5WTJ4bElHTjRQU0k0TUNJZ1kzazlJakkxTmlJZ2NqMGlNVFlpSUhOMGVXeGxQU0ptYVd4c09tNXZibVU3YzNSeWIydGxPaU13TURBN2MzUnliMnRsTFd4cGJtVmpZWEE2Y205MWJtUTdjM1J5YjJ0bExXeHBibVZxYjJsdU9uSnZkVzVrTzNOMGNtOXJaUzEzYVdSMGFEb3pNbkI0SWk4K1BHTnBjbU5zWlNCamVEMGlPREFpSUdONVBTSXpOamdpSUhJOUlqRTJJaUJ6ZEhsc1pUMGlabWxzYkRwdWIyNWxPM04wY205clpUb2pNREF3TzNOMGNtOXJaUzFzYVc1bFkyRndPbkp2ZFc1a08zTjBjbTlyWlMxc2FXNWxhbTlwYmpweWIzVnVaRHR6ZEhKdmEyVXRkMmxrZEdnNk16SndlQ0l2UGp3dmMzWm5QZz09Iik7CiAgICBiYWNrZ3JvdW5kLXNpemU6IDFlbTsKCWZpbHRlcjogdmFyKC0taWNvbi1maWx0ZXIpOwp9CgouYXNpZGUgLnRvYy10b2dnbGUub3Blbi10b2M6aG92ZXI6OmJlZm9yZSB7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9naC9pb25pYy10ZWFtL2lvbmljb25zQDUuNS4xL3NyYy9zdmcvYXJyb3ctZm9yd2FyZC1vdXRsaW5lLnN2ZyIpOwoJLyogZ2VuZXJhdGVkIHVzaW5nIGh0dHBzOi8vZG9waWF6YS5vcmcvdG9vbHMvZGF0YXVyaS9pbmRleC5waHAgKi8KICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhkcFpIUm9QU0kxTVRJaUlHaGxhV2RvZEQwaU5URXlJaUIyYVdWM1FtOTRQU0l3SURBZ05URXlJRFV4TWlJK1BIUnBkR3hsUG1sdmJtbGpiMjV6TFhZMUxXRThMM1JwZEd4bFBqeHdiMng1YkdsdVpTQndiMmx1ZEhNOUlqSTJPQ0F4TVRJZ05ERXlJREkxTmlBeU5qZ2dOREF3SWlCemRIbHNaVDBpWm1sc2JEcHViMjVsTzNOMGNtOXJaVG9qTURBd08zTjBjbTlyWlMxc2FXNWxZMkZ3T25KdmRXNWtPM04wY205clpTMXNhVzVsYW05cGJqcHliM1Z1WkR0emRISnZhMlV0ZDJsa2RHZzZORGh3ZUNJdlBqeHNhVzVsSUhneFBTSXpPVElpSUhreFBTSXlOVFlpSUhneVBTSXhNREFpSUhreVBTSXlOVFlpSUhOMGVXeGxQU0ptYVd4c09tNXZibVU3YzNSeWIydGxPaU13TURBN2MzUnliMnRsTFd4cGJtVmpZWEE2Y205MWJtUTdjM1J5YjJ0bExXeHBibVZxYjJsdU9uSnZkVzVrTzNOMGNtOXJaUzEzYVdSMGFEbzBPSEI0SWk4K1BDOXpkbWMrIik7Cn0KLmFzaWRlIC50b2MtdG9nZ2xlLmNsb3NlZC10b2M6aG92ZXI6OmJlZm9yZSB7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9naC9pb25pYy10ZWFtL2lvbmljb25zQDUuNS4xL3NyYy9zdmcvYXJyb3ctYmFjay1vdXRsaW5lLnN2ZyIpOwoJLyogZ2VuZXJhdGVkIHVzaW5nIGh0dHBzOi8vZG9waWF6YS5vcmcvdG9vbHMvZGF0YXVyaS9pbmRleC5waHAgKi8KICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhkcFpIUm9QU0kxTVRJaUlHaGxhV2RvZEQwaU5URXlJaUIyYVdWM1FtOTRQU0l3SURBZ05URXlJRFV4TWlJK1BIUnBkR3hsUG1sdmJtbGpiMjV6TFhZMUxXRThMM1JwZEd4bFBqeHdiMng1YkdsdVpTQndiMmx1ZEhNOUlqSTBOQ0EwTURBZ01UQXdJREkxTmlBeU5EUWdNVEV5SWlCemRIbHNaVDBpWm1sc2JEcHViMjVsTzNOMGNtOXJaVG9qTURBd08zTjBjbTlyWlMxc2FXNWxZMkZ3T25KdmRXNWtPM04wY205clpTMXNhVzVsYW05cGJqcHliM1Z1WkR0emRISnZhMlV0ZDJsa2RHZzZORGh3ZUNJdlBqeHNhVzVsSUhneFBTSXhNakFpSUhreFBTSXlOVFlpSUhneVBTSTBNVElpSUhreVBTSXlOVFlpSUhOMGVXeGxQU0ptYVd4c09tNXZibVU3YzNSeWIydGxPaU13TURBN2MzUnliMnRsTFd4cGJtVmpZWEE2Y205MWJtUTdjM1J5YjJ0bExXeHBibVZxYjJsdU9uSnZkVzVrTzNOMGNtOXJaUzEzYVdSMGFEbzBPSEI0SWk4K1BDOXpkbWMrIik7Cn0KCgoKLnBsdXRvdWktdG9jIGhlYWRlciB7CglkaXNwbGF5OiBmbGV4OwoJYWxpZ24taXRlbXM6IGNlbnRlcjsKCWdhcDogLjNlbTsKCWZvbnQtc2l6ZTogMS41ZW07CgkvKiBtYXJnaW4tdG9wOiAtMC4xZW07ICovCgltYXJnaW4tYm90dG9tOiAwLjRlbTsKCXBhZGRpbmc6IDAuNXJlbTsKCW1hcmdpbi1sZWZ0OiAwOwoJbWFyZ2luLXJpZ2h0OiAwOwoJZm9udC13ZWlnaHQ6IGJvbGQ7CgkvKiBib3JkZXItYm90dG9tOiAycHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjE1KTsgKi8KCXBvc2l0aW9uOiBzdGlja3k7Cgl0b3A6IDBweDsKCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJei1pbmRleDogNDE7Cn0KLnBsdXRvdWktdG9jLmFzaWRlIGhlYWRlciB7CglwYWRkaW5nLWxlZnQ6IDA7CglwYWRkaW5nLXJpZ2h0OiAwOwp9CgoucGx1dG91aS10b2Mgc2VjdGlvbiAudG9jLXJvdyB7Cgl3aGl0ZS1zcGFjZTogbm93cmFwOwoJb3ZlcmZsb3c6IGhpZGRlbjsKCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJcGFkZGluZzogLjFlbTsKCWJvcmRlci1yYWRpdXM6IC4yZW07Cn0KCi5wbHV0b3VpLXRvYyBzZWN0aW9uIC50b2Mtcm93LkgxIHsKCW1hcmdpbi10b3A6IDFlbTsKfQoKCi5wbHV0b3VpLXRvYy5hc2lkZSBzZWN0aW9uIC50b2Mtcm93LmluLXZpZXcgewoJYmFja2dyb3VuZDogdmFyKC0tc2lkZWJhci1saS1hY3RpdmUtYmcpOwp9CgoKCQouaGlnaGxpZ2h0LXBsdXRvLWNlbGwtc2hvdWxkZXIgewoJYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA1KTsKCWJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7Cn0KCi5wbHV0b3VpLXRvYyBzZWN0aW9uIGEgewoJdGV4dC1kZWNvcmF0aW9uOiBub25lOwoJZm9udC13ZWlnaHQ6IG5vcm1hbDsKCWNvbG9yOiB2YXIoLS1wbHV0by1vdXRwdXQtY29sb3IpOwp9Ci5wbHV0b3VpLXRvYyBzZWN0aW9uIGE6aG92ZXIgewoJY29sb3I6IHZhcigtLXBsdXRvLW91dHB1dC1oLWNvbG9yKTsKfQoKLnBsdXRvdWktdG9jLmluZGVudCBzZWN0aW9uIGEuSDEgewoJZm9udC13ZWlnaHQ6IDcwMDsKCWxpbmUtaGVpZ2h0OiAxZW07Cn0KCi5wbHV0b3VpLXRvYy5pbmRlbnQgc2VjdGlvbiAuYWZ0ZXItSDIgYSB7IHBhZGRpbmctbGVmdDogMTBweDsgfQoucGx1dG91aS10b2MuaW5kZW50IHNlY3Rpb24gLmFmdGVyLUgzIGEgeyBwYWRkaW5nLWxlZnQ6IDIwcHg7IH0KLnBsdXRvdWktdG9jLmluZGVudCBzZWN0aW9uIC5hZnRlci1INCBhIHsgcGFkZGluZy1sZWZ0OiAzMHB4OyB9Ci5wbHV0b3VpLXRvYy5pbmRlbnQgc2VjdGlvbiAuYWZ0ZXItSDUgYSB7IHBhZGRpbmctbGVmdDogNDBweDsgfQoucGx1dG91aS10b2MuaW5kZW50IHNlY3Rpb24gLmFmdGVyLUg2IGEgeyBwYWRkaW5nLWxlZnQ6IDUwcHg7IH0KCi5wbHV0b3VpLXRvYy5pbmRlbnQgc2VjdGlvbiBhLkgxIHsgcGFkZGluZy1sZWZ0OiAwcHg7IH0KLnBsdXRvdWktdG9jLmluZGVudCBzZWN0aW9uIGEuSDIgeyBwYWRkaW5nLWxlZnQ6IDEwcHg7IH0KLnBsdXRvdWktdG9jLmluZGVudCBzZWN0aW9uIGEuSDMgeyBwYWRkaW5nLWxlZnQ6IDIwcHg7IH0KLnBsdXRvdWktdG9jLmluZGVudCBzZWN0aW9uIGEuSDQgeyBwYWRkaW5nLWxlZnQ6IDMwcHg7IH0KLnBsdXRvdWktdG9jLmluZGVudCBzZWN0aW9uIGEuSDUgeyBwYWRkaW5nLWxlZnQ6IDQwcHg7IH0KLnBsdXRvdWktdG9jLmluZGVudCBzZWN0aW9uIGEuSDYgeyBwYWRkaW5nLWxlZnQ6IDUwcHg7IH0KCgoucGx1dG91aS10b2MuaW5kZW50IHNlY3Rpb24gYS5wbHV0by1kb2NzLWJpbmRpbmctZWwsCi5wbHV0b3VpLXRvYy5pbmRlbnQgc2VjdGlvbiBhLkFTU0lHTkVFCgl7Cglmb250LWZhbWlseTogSnVsaWFNb25vLCBtb25vc3BhY2U7Cglmb250LXNpemU6IC44ZW07CgkvKiBiYWNrZ3JvdW5kOiBibGFjazsgKi8KCWZvbnQtd2VpZ2h0OiA3MDA7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cgljb2xvcjogdmFyKC0tY20tdmFyLWNvbG9yKTsgLyogdGhpcyBpcyBzdGVhbGluZyBhIHZhcmlhYmxlIGZyb20gUGx1dG8sIGJ1dCBpdCdzIGZpbmUgaWYgdGhhdCBkb2VzbnQgd29yayAqLwp9Ci5wbHV0b3VpLXRvYy5pbmRlbnQgc2VjdGlvbiBhLnBsdXRvLWRvY3MtYmluZGluZy1lbDo6YmVmb3JlLAoucGx1dG91aS10b2MuaW5kZW50IHNlY3Rpb24gYS5BU1NJR05FRTo6YmVmb3JlCgl7Cgljb250ZW50OiAiPiAiOwoJb3BhY2l0eTogLjM7Cn0KPC9zdHlsZT4KpG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv6MG+siOsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQ4NTI5ZjM2ZC0yZDM5LTRiNDUtYTgyMS0wMWM4MzQ2NTM5ZmS5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc2PbrVwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDQ1OTUyNTEyLWFhZjEtNDNkOC1hOTVlLWMzMmJiMjYzM2Y0MoqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnaASc8ZGl2IGNsYXNzPSJtYXJrZG93biI+PHVsPgo8bGk+PHA+JiM0MDs0LjcmIzQxOyBTaW11bGF0ZSB1c2luZyA8Y29kZT5zZXFfc2U8L2NvZGU+IGFuZCA8Y29kZT5vYmpfdDJzdGFyPC9jb2RlPjwvcD4KPC9saT4KPGxpPjxwPiYjNDA7NC44JiM0MTsgQ29tcGFyZSB0aGUgc2lnbmFsIG9idGFpbmVkIGluICYjNDA7NC42JiM0MTsgd2l0aCB0aGUgb25lIGF0ICYjNDA7My41JiM0MTs8L3A+CjwvbGk+CjxsaT48cD4mIzQwOzQuOSYjNDE7IFJlY29uc3RydWN0IHRoZSAxRCBpbWFnZTwvcD4KPC9saT4KPC91bD4KPC9kaXY+pG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv6LwfvpqsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQ0NTk1MjUxMi1hYWYxLTQzZDgtYTk1ZS1jMzJiYjI2MzNmNDK5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4ABcHYtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkOTY0NDA0ZjYtN2Y0Ni00ZGY5LWFkOTgtOTIxOTQ4YzNiZTY5iqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedpqiQk8c2NyaXB0IGlkPSdwbG90XzEnPgoJCS8vIFdlIHN0YXJ0IGJ5IHB1dHRpbmcgYWxsIHRoZSB2YXJpYWJsZSBpbnRlcnBvbGF0aW9uIGhlcmUgYXQgdGhlIGJlZ2lubmluZwoJCS8vIFdlIGhhdmUgdG8gY29udmVydCBhbGwgdHlwZWRhcnJheXMgaW4gdGhlIGxheW91dCB0byBub3JtYWwgYXJyYXlzLiBTZWUgSXNzdWUgIzI1CgkJLy8gV2UgdXNlIGxvZGFzaCBmb3IgdGhpcyBmb3IgY29tcGFjdG5lc3MKCQlmdW5jdGlvbiByZW1vdmVUeXBlZEFycmF5KG8pIHsKCQkJcmV0dXJuIF8uaXNUeXBlZEFycmF5KG8pID8gQXJyYXkuZnJvbShvKSA6CgkJCV8uaXNQbGFpbk9iamVjdChvKSA/IF8ubWFwVmFsdWVzKG8sIHJlbW92ZVR5cGVkQXJyYXkpIDogCgkJCW8KCQl9CgoJCS8vIFB1Ymxpc2ggdGhlIHBsb3Qgb2JqZWN0IHRvIEpTCgkJbGV0IHBsb3Rfb2JqID0gXy51cGRhdGUoLyogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBBYnN0cmFjdFBsdXRvRGluZ2V0amVzLkRpc3BsYXkucHVibGlzaGVkX3RvX2pzICovIGdldFB1Ymxpc2hlZE9iamVjdCgiYjNiODQwOGMtODE4MS0xMWVmLTE0ZWItZTFjNTY5YjhiYjI5LzViOTgyYWM0YWY5MjFkZTUiKSwgImxheW91dCIsIHJlbW92ZVR5cGVkQXJyYXkpCgkJLy8gR2V0IHRoZSBwbG90bHkgbGlzdGVuZXJzCgkJY29uc3QgcGxvdGx5X2xpc3RlbmVycyA9IHt9CgkJLy8gR2V0IHRoZSBKUyBsaXN0ZW5lcnMKCQljb25zdCBqc19saXN0ZW5lcnMgPSB7fQoJCS8vIERlYWwgd2l0aCBldmVudHVhbCBjdXN0b20gY2xhc3NlcwoJCWxldCBjdXN0b21fY2xhc3NsaXN0ID0gW10KCgoJCS8vIExvYWQgdGhlIHBsb3RseSBsaWJyYXJ5CgkJbGV0IFBsb3RseSA9IHVuZGVmaW5lZAoJCXRyeSB7CgkJCWxldCBfbW9kID0gYXdhaXQgaW1wb3J0KCIuL3Bsb3RseWpzL3Bsb3RseWpzLTIuMjYuMi5taW4uanMiKQoJCQlQbG90bHkgPSBfbW9kLmRlZmF1bHQKCQl9IGNhdGNoIChlKSB7CgkJCWNvbnNvbGUubG9nKCJMb2NhbCBsb2FkIGZhaWxlZCwgdHJ5aW5nIHdpdGggdGhlIHdlYiBlc20uc2ggdmVyc2lvbiIpCgkJCWxldCBfbW9kID0gYXdhaXQgaW1wb3J0KCJodHRwczovL2VzbS5zaC92MTM1L3Bsb3RseS5qcy1kaXN0LW1pbkAyLjI2LjIvZXNuZXh0L3Bsb3RseS5qcy1kaXN0LW1pbi5tanMiKQoJCQlQbG90bHkgPSBfbW9kLmRlZmF1bHQKCQl9CgoJCS8vIENoZWNrIGlmIHdlIGhhdmUgdG8gZm9yY2UgbG9jYWwgbWF0aGpheCBmb250IGNhY2hlCgkJaWYgKGZhbHNlICYmIHdpbmRvdz8uTWF0aEpheD8uY29uZmlnPy5zdmc/LmZvbnRDYWNoZSA9PT0gJ2dsb2JhbCcpIHsKCQkJd2luZG93Lk1hdGhKYXguY29uZmlnLnN2Zy5mb250Q2FjaGUgPSAnbG9jYWwnCgkJfQoKCQkvLyBGbGFnIHRvIGNoZWNrIGlmIHRoaXMgY2VsbCB3YXMgIG1hbnVhbGx5IHJhbiBvciByZWFjdGl2ZWx5IHJhbgpjb25zdCBmaXJzdFJ1biA9IHRoaXMgPyBmYWxzZSA6IHRydWUKY29uc3QgQ09OVEFJTkVSID0gdGhpcyA/PyBodG1sYDxkaXYgY2xhc3M9J3BsdXRvcGxvdGx5LWNvbnRhaW5lcic+YApjb25zdCBQTE9UID0gQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoJy5qcy1wbG90bHktcGxvdCcpID8/IENPTlRBSU5FUi5hcHBlbmRDaGlsZChodG1sYDxkaXY+YCkKY29uc3QgcGFyZW50ID0gQ09OVEFJTkVSLnBhcmVudEVsZW1lbnQKLy8gV2UgdXNlIGEgY29udHJvbGxlciB0byByZW1vdmUgZXZlbnQgbGlzdGVuZXJzIHVwb24gaW52YWxpZGF0aW9uCmNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCkKLy8gV2UgaGF2ZSB0byBhZGQgdGhpcyB0byBrZWVwIHN1cHBvcnRpbmcgQGJpbmQgd2l0aCB0aGUgb2xkIEFQSSB1c2luZyBQTE9UClBMT1QuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoZSkgPT4gewoJQ09OVEFJTkVSLnZhbHVlID0gUExPVC52YWx1ZQoJaWYgKGUuYnViYmxlcykgewoJCXJldHVybgoJfQoJQ09OVEFJTkVSLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdpbnB1dCcpKQp9LCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSkKCgkvLyBUaGlzIGNyZWF0ZSB0aGUgc3R5bGUgc3ViZGl2IG9uIGZpcnN0IHJ1bgoJZmlyc3RSdW4gJiYgQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgCgk8c3R5bGU+CgkucGx1dG9wbG90bHktY29udGFpbmVyIHsKCQl3aWR0aDogMTAwJTsKCQloZWlnaHQ6IDEwMCU7CgkJbWluLWhlaWdodDogMDsKCQltaW4td2lkdGg6IDA7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyIC5qcy1wbG90bHktcGxvdCAucGxvdGx5IGRpdiB7CgkJbWFyZ2luOiAwIGF1dG87IC8vIFRoaXMgY2VudGVycyB0aGUgcGxvdAoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5wb3BwZWQtb3V0IHsKCQlvdmVyZmxvdzogYXV0bzsKCQl6LWluZGV4OiAxMDAwOwoJCXBvc2l0aW9uOiBmaXhlZDsKCQlyZXNpemU6IGJvdGg7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwcHg7CgkJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDBweDsKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIHsKCQlkaXNwbGF5OiBmbGV4OwoJCWZsZXgtZmxvdzogcm93IHdyYXA7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMTJweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMTJweDsKCQlwb3NpdGlvbjogZml4ZWQ7CgkJei1pbmRleDogMTAwMTsKCQljdXJzb3I6IG1vdmU7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCAtMTAwJSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgc3BhbiB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCWZsZXg6IDEKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyLmhpZGRlbiB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3BhbiB7CgkJcG9zaXRpb246IHJlbGF0aXZlOwoJfQoJLmNsaXBib2FyZC12YWx1ZSB7CgkJcGFkZGluZy1yaWdodDogNXB4OwoJCXBhZGRpbmctbGVmdDogMnB4OwoJCWN1cnNvcjogdGV4dDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZmlsZW5hbWUgewoJCWZsZXg6IDAgMCAxMDAlOwoJCXRleHQtYWxpZ246IGNlbnRlcjsKCQlib3JkZXItdG9wOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJbWFyZ2luLXRvcDogNXB4OwoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5maWxlbmFtZSB7CgkJbWFyZ2luLWxlZnQ6IDNweDsKCQl0ZXh0LWFsaWduOiBsZWZ0OwoJCW1pbi13aWR0aDogbWluKDYwJSwgbWluLWNvbnRlbnQpOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5maWxlc2F2ZSAuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgLmxhYmVsIHsKCQlmbGV4OiAwIDAgMDsKCX0KCS5jbGlwYm9hcmQtdmFsdWUuZm9ybWF0IHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7CgkJZmxleDogMSAwIGF1dG87CgkJbWluLXdpZHRoOiAzMHB4OwoJCW1hcmdpbi1yaWdodDogMTBweDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyB7CgkJZGlzcGxheTogaW5saW5lLWZsZXg7CgkJZmxleC1mbG93OiBjb2x1bW47CgkJcG9zaXRpb246IGFic29sdXRlOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJcGFkZGluZy1sZWZ0OiAzcHg7CgkJei1pbmRleDogMjAwMDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9uczpob3ZlciB7CgkJY3Vyc29yOiBwb2ludGVyOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCXBhZGRpbmc6IDNweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtM3B4LCAtNnB4KTsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyAuZm9ybWF0LW9wdGlvbiB7CgkJZGlzcGxheTogbm9uZTsKCX0KCWRpdi5mb3JtYXQtb3B0aW9uczpob3ZlciAuZm9ybWF0LW9wdGlvbiB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246bm90KC5zZWxlY3RlZCkgewoJCW1hcmdpbi10b3A6IDNweDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyAuZm9ybWF0LW9wdGlvbi5zZWxlY3RlZCB7CgkJb3JkZXI6IC0xOwoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5mb3JtYXQtb3B0aW9uOmhvdmVyIHsKCQliYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCX0KCXNwYW4uY29uZmlnLXZhbHVlIHsKCQlmb250LXdlaWdodDogbm9ybWFsOwoJCWNvbG9yOiB2YXIoLS1wbHV0by1vdXRwdXQtY29sb3IpOwoJCWRpc3BsYXk6IG5vbmU7CgkJcG9zaXRpb246IGFic29sdXRlOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCBjYWxjKC0xMDAlIC0gMTBweCkpOwoJCXBhZGRpbmc6IDVweDsKCX0KCS5sYWJlbCB7CgkJdXNlci1zZWxlY3Q6IG5vbmU7Cgl9CgkubGFiZWw6aG92ZXIgc3Bhbi5jb25maWctdmFsdWUgewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQltaW4td2lkdGg6IDE1MHB4OwoJfQoJLmNsaXBib2FyZC1zcGFuLm1hdGNoaW5nLWNvbmZpZyAubGFiZWwgewoJCWNvbG9yOiB2YXIoLS1jbS1tYWNyby1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZGlmZmVyZW50LWNvbmZpZyAubGFiZWwgewoJCWNvbG9yOiB2YXIoLS1jbS10YWctY29sb3IpOwoJCWZvbnQtd2VpZ2h0OiBib2xkOwoJfQo8L3N0eWxlPgpgKQoKbGV0IG9yaWdpbmFsX2hlaWdodCA9IHBsb3Rfb2JqLmxheW91dC5oZWlnaHQKbGV0IG9yaWdpbmFsX3dpZHRoID0gcGxvdF9vYmoubGF5b3V0LndpZHRoCi8vIEZvciB0aGUgaGVpZ2h0IHdlIGhhdmUgdG8gYWxzbyBwdXQgYSBmaXhlZCB2YWx1ZSBpbiBjYXNlIHRoZSBwbG90IGlzIHB1dCBvbiBhIG5vbi1maXhlZC1zaXplIGNvbnRhaW5lciAobGlrZSB0aGUgZGVmYXVsdCB3cmFwcGVyKQovLyBXZSBkZWZpbmUgYSB2YXJpYWJsZSB0byBjaGVjayB3aGV0aGVyIHdlIHN0aWxsIGhhdmUgdG8gcmVtb3ZlIHRoZSBmaXhlZCBoZWlnaHQKbGV0IHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IGZpcnN0UnVuCmxldCBjb250YWluZXJfaGVpZ2h0ID0gb3JpZ2luYWxfaGVpZ2h0ID8/IFBMT1QuY29udGFpbmVyX2hlaWdodCA/PyA0MDAKQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9IGNvbnRhaW5lcl9oZWlnaHQgKyAncHgnCgovLyBXZSBjcmVhdGUgYSBQcm9taXNlIHZlcnNpb24gb2Ygc2V0VGltZW91dApmdW5jdGlvbiBkZWxheShtcykgewogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpOwp9CgovLyBXZSBpbXBvcnQgaW50ZXJhY3QgZm9yIGRyYWdnaW5nL3Jlc2l6aW5nCmNvbnN0IHsgZGVmYXVsdDogaW50ZXJhY3QgfSA9IGF3YWl0IGltcG9ydCgnaHR0cHM6Ly9lc20uc2gvaW50ZXJhY3Rqc0AxLjEwLjE5JykKCgpmdW5jdGlvbiBnZXRJbWFnZU9wdGlvbnMoKSB7CiAgY29uc3QgbyA9IHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICByZXR1cm4gewogICAgZm9ybWF0OiBvLmZvcm1hdCA/PyAicG5nIiwKICAgIHdpZHRoOiBvLndpZHRoID8/IG9yaWdpbmFsX3dpZHRoLAogICAgaGVpZ2h0OiBvLmhlaWdodCA/PyBvcmlnaW5hbF9oZWlnaHQsCiAgICBzY2FsZTogby5zY2FsZSA/PyAxLAogICAgZmlsZW5hbWU6IG8uZmlsZW5hbWUgPz8gIm5ld3Bsb3QiLAogIH07Cn0KCmNvbnN0IENMSVBCT0FSRF9IRUFERVIgPQogIENPTlRBSU5FUi5xdWVyeVNlbGVjdG9yKCIucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciIpID8/CiAgQ09OVEFJTkVSLmluc2VydEFkamFjZW50RWxlbWVudCgKICAgICJhZnRlcmJlZ2luIiwKICAgIGh0bWxgPGRpdiBjbGFzcz0icGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBoaWRkZW4iPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gZm9ybWF0IgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZvcm1hdDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBmb3JtYXQiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gd2lkdGgiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+V2lkdGg6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgd2lkdGgiPjwvc3Bhbj5weDwvc3BhbgogICAgICA+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBoZWlnaHQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+SGVpZ2h0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGhlaWdodCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHNjYWxlIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPlNjYWxlOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIHNjYWxlIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2V0Ij5TZXQ8L2J1dHRvbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gdW5zZXQiPlVuc2V0PC9idXR0b24+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmaWxlbmFtZSIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5GaWxlbmFtZTo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBmaWxlbmFtZSI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICA8L2Rpdj5gCiAgKTsKCmZ1bmN0aW9uIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpIHsKICBjb25zdCB2YWxpZF9jbGFzc2VzID0gWwogICAgIm1pc3NpbmctY29uZmlnIiwKICAgICJtYXRjaGluZy1jb25maWciLAogICAgImRpZmZlcmVudC1jb25maWciLAogIF07CiAgZnVuY3Rpb24gc2V0Q2xhc3MoY2wpIHsKICAgIGZvciAoY29uc3QgbmFtZSBvZiB2YWxpZF9jbGFzc2VzKSB7CiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKG5hbWUsIG5hbWUgPT0gY2wpOwogICAgfQogIH0KICAvLyBXZSB1c2UgdGhlIGN1c3RvbSBnZXR0ZXJzIHdlJ2xsIHNldCB1cCBpbiB0aGUgY29udGFpbmVyCiAgY29uc3QgeyB1aV92YWx1ZSwgY29uZmlnX3ZhbHVlLCBjb25maWdfc3Bhbiwga2V5IH0gPSBjb250YWluZXI7CiAgaWYgKGNvbmZpZ192YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICBzZXRDbGFzcygibWlzc2luZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaXMgbm90IHByZXNlbnQgaW4gdGhlIGNvbmZpZy5gOwogIH0gZWxzZSBpZiAodWlfdmFsdWUgPT0gY29uZmlnX3ZhbHVlKSB7CiAgICBzZXRDbGFzcygibWF0Y2hpbmctY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGhhcyB0aGUgc2FtZSB2YWx1ZSBpbiB0aGUgY29uZmlnIGFuZCBpbiB0aGUgaGVhZGVyLmA7CiAgfSBlbHNlIHsKICAgIHNldENsYXNzKCJkaWZmZXJlbnQtY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGhhcyBhIGRpZmZlcmVudCB2YWx1ZSAoPGVtPiR7Y29uZmlnX3ZhbHVlfTwvZW0+KSBpbiB0aGUgY29uZmlnLmA7CiAgfQogIC8vIEFkZCBpbmZvIGFib3V0IHNldHRpbmcgYW5kIHVuc2V0dGluZwogIGNvbmZpZ19zcGFuLmluc2VydEFkamFjZW50SFRNTCgKICAgICJiZWZvcmVlbmQiLAogICAgYDxicj5DbGljayBvbiB0aGUgbGFiZWwgPGVtPjxiPm9uY2U8L2I+PC9lbT4gdG8gc2V0IHRoZSBjdXJyZW50IFVJIHZhbHVlIGluIHRoZSBjb25maWcuYAogICk7CiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIDxlbT48Yj50d2ljZTwvYj48L2VtPiB0byByZW1vdmUgdGhpcyBrZXkgZnJvbSB0aGUgY29uZmlnLmAKICApOwp9Cgpjb25zdCB2YWxpZF9mb3JtYXRzID0gWyJwbmciLCAic3ZnIiwgIndlYnAiLCAianBlZyIsICJmdWxsLWpzb24iXTsKZnVuY3Rpb24gaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHNwYW4sIGtleSwgdmFsdWUpIHsKICBjb25zdCBjb250YWluZXIgPSBzcGFuLmNsb3Nlc3QoIi5jbGlwYm9hcmQtc3BhbiIpOwogIHNwYW4uY29udGVudEVkaXRhYmxlID0ga2V5ID09PSAiZm9ybWF0IiA/ICJmYWxzZSIgOiAidHJ1ZSI7CiAgbGV0IHBhcnNlID0gKHgpID0+IHg7CiAgbGV0IHVwZGF0ZSA9ICh4KSA9PiAoc3Bhbi50ZXh0Q29udGVudCA9IHgpOwogIGlmIChrZXkgPT09ICJ3aWR0aCIgfHwga2V5ID09PSAiaGVpZ2h0IikgewogICAgcGFyc2UgPSAoeCkgPT4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KHgpKTsKICB9IGVsc2UgaWYgKGtleSA9PT0gInNjYWxlIikgewogICAgcGFyc2UgPSBwYXJzZUZsb2F0OwogIH0gZWxzZSBpZiAoa2V5ID09PSAiZm9ybWF0IikgewogICAgLy8gV2UgcmVtb3ZlIGNvbnRlbnRFZGl0YWJsZQogICAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSAiZmFsc2UiOwogICAgLy8gSGVyZSB3ZSBmaXJzdCBhZGQgdGhlIHN1YnNwYW5zIGZvciBlYWNoIG9wdGlvbgogICAgY29uc3Qgb3B0c19kaXYgPSBzcGFuLmFwcGVuZENoaWxkKGh0bWxgPGRpdiBjbGFzcz0iZm9ybWF0LW9wdGlvbnMiPjwvZGl2PmApOwogICAgZm9yIChjb25zdCBmbXQgb2YgdmFsaWRfZm9ybWF0cykgewogICAgICBjb25zdCBvcHQgPSBvcHRzX2Rpdi5hcHBlbmRDaGlsZCgKICAgICAgICBodG1sYDxzcGFuIGNsYXNzPSJmb3JtYXQtb3B0aW9uICR7Zm10fSI+JHtmbXR9PC9zcGFuPmAKICAgICAgKTsKICAgICAgb3B0Lm9uY2xpY2sgPSAoZSkgPT4gewogICAgICAgIHNwYW4udmFsdWUgPSBvcHQudGV4dENvbnRlbnQ7CiAgICAgIH07CiAgICB9CiAgICBwYXJzZSA9ICh4KSA9PiB7CiAgICAgIHJldHVybiB2YWxpZF9mb3JtYXRzLmluY2x1ZGVzKHgpID8geCA6IGxvY2FsVmFsdWU7CiAgICB9OwogICAgdXBkYXRlID0gKHgpID0+IHsKICAgICAgZm9yIChjb25zdCBvcHQgb2Ygb3B0c19kaXYuY2hpbGRyZW4pIHsKICAgICAgICBvcHQuY2xhc3NMaXN0LnRvZ2dsZSgic2VsZWN0ZWQiLCBvcHQudGV4dENvbnRlbnQgPT09IHgpOwogICAgICB9CiAgICB9OwogIH0gZWxzZSB7CiAgICAvLyBXZSBvbmx5IGhhdmUgZmlsZW5hbWUgaGVyZQogIH0KICBsZXQgbG9jYWxWYWx1ZTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBsb2NhbFZhbHVlOwogICAgfSwKICAgIHNldDogKHZhbCkgPT4gewogICAgICBpZiAodmFsICE9PSAiIikgewogICAgICAgIGxvY2FsVmFsdWUgPSBwYXJzZSh2YWwpOwogICAgICB9CiAgICAgIHVwZGF0ZShsb2NhbFZhbHVlKTsKICAgICAgY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcik7CiAgICB9LAogIH0pOwogIC8vIFdlIGFsc28gYXNzaWduIGEgbGlzdGVuZXIgc28gdGhhdCB0aGUgZWRpdGFibGUgaXMgYmx1cnJlZCB3aGVuIGVudGVyIGlzIHByZXNzZWQKICBzcGFuLm9ua2V5ZG93biA9IChlKSA9PiB7CiAgICBpZiAoZS5rZXlDb2RlID09PSAxMykgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHNwYW4uYmx1cigpOwogICAgfQogIH07CiAgc3Bhbi52YWx1ZSA9IHZhbHVlOwp9CgpmdW5jdGlvbiBpbml0aWFsaXplQ29uZmlnVmFsdWVTcGFuKHNwYW4sIGtleSkgewogIC8vIEhlcmUgd2UgbW9zdGx5IHdhbnQgdG8gZGVmaW5lIHRoZSBzZXR0ZXIgYW5kIGdldHRlcgogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwYW4sICJ2YWx1ZSIsIHsKICAgIGdldDogKCkgPT4gewogICAgICByZXR1cm4gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV07CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIC8vIGlmIHVuZGVmaW5lZCBpcyBwYXNzZWQsIHdlIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgb3B0aW9ucwogICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsKICAgICAgICBkZWxldGUgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV0gPSB2YWw7CiAgICAgIH0KICAgICAgY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcik7CiAgICB9LAogIH0pOwp9Cgpjb25zdCBjb25maWdfc3BhbnMgPSB7fTsKZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZ2V0SW1hZ2VPcHRpb25zKCkpKSB7CiAgY29uc3QgY29udGFpbmVyID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKGAuY2xpcGJvYXJkLXNwYW4uJHtrZXl9YCk7CiAgY29uc3QgbGFiZWwgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmxhYmVsIik7CiAgLy8gV2UgZ2l2ZSB0aGUgbGFiZWwgYSBmdW5jdGlvbiB0aGF0IG9uIHNpbmdsZSBjbGljayB3aWxsIHNldCB0aGUgY3VycmVudCB2YWx1ZSBhbmQgd2l0aCBkb3VibGUgY2xpY2sgd2lsbCB1bnNldCBpdAogIGxhYmVsLm9uY2xpY2sgPSBEdWFsQ2xpY2soCiAgICAoKSA9PiB7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBjb250YWluZXIudWlfdmFsdWU7CiAgICB9LAogICAgKGUpID0+IHsKICAgICAgY29uc29sZS5sb2coImUiLCBlKTsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gdW5kZWZpbmVkOwogICAgfQogICk7CiAgY29uc3QgdWlfdmFsdWVfc3BhbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXZhbHVlIik7CiAgY29uc3QgY29uZmlnX3ZhbHVlX3NwYW4gPQogICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jb25maWctdmFsdWUiKSA/PwogICAgbGFiZWwuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgICAiYWZ0ZXJiZWdpbiIsCiAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImNvbmZpZy12YWx1ZSI+PC9zcGFuPmAKICAgICk7CiAgLy8gQXNzaW5nIHRoZSB0d28gc3BhbnMgYXMgcHJvcGVydGllcyBvZiB0aGUgY29udGFpbmluZyBzcGFuCiAgY29udGFpbmVyLnVpX3NwYW4gPSB1aV92YWx1ZV9zcGFuOwogIGNvbnRhaW5lci5jb25maWdfc3BhbiA9IGNvbmZpZ192YWx1ZV9zcGFuOwogIGNvbnRhaW5lci5rZXkgPSBrZXk7CiAgY29uZmlnX3NwYW5zW2tleV0gPSBjb250YWluZXI7CiAgaWYgKGZpcnN0UnVuKSB7CiAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPQogICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPz8ge307CiAgICAvLyBXZSBkbyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHZhbHVlIHNwYW4KICAgIGluaXRpYWxpemVVSVZhbHVlU3Bhbih1aV92YWx1ZV9zcGFuLCBrZXksIHZhbHVlKTsKICAgIC8vIFRoZW4gd2UgaW5pdGlhbGl6ZSB0aGUgY29uZmlnIHZhbHVlCiAgICBpbml0aWFsaXplQ29uZmlnVmFsdWVTcGFuKGNvbmZpZ192YWx1ZV9zcGFuLCBrZXkpOwogICAgLy8gV2UgcHV0IHNvbWUgY29udmVuaWVuY2UgZ2V0dGVycy9zZXR0ZXJzCiAgICAvLyB1aV92YWx1ZSBmb3J3YXJkCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAidWlfdmFsdWUiLCB7CiAgICAgIGdldDogKCkgPT4gdWlfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgdWlfdmFsdWVfc3Bhbi52YWx1ZSA9IHZhbDsKICAgICAgfSwKICAgIH0pOwogICAgLy8gY29uZmlnX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJjb25maWdfdmFsdWUiLCB7CiAgICAgIGdldDogKCkgPT4gY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUsCiAgICAgIHNldDogKHZhbCkgPT4gewogICAgICAgIGNvbmZpZ192YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgfQp9CgovLyBUaGVzZSBvYmplY3RzIHdpbGwgY29udGFpbiB0aGUgZGVmYXVsdCB2YWx1ZQoKLy8gVGhpcyBjb2RlIHVwZGF0ZXMgdGhlIGltYWdlIG9wdGlvbnMgaW4gdGhlIFBMT1QgY29uZmlnIHdpdGggdGhlIHByb3ZpZGVkIG9uZXMKZnVuY3Rpb24gc2V0SW1hZ2VPcHRpb25zKG8pIHsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IG9ba2V5XTsKICB9Cn0KZnVuY3Rpb24gdW5zZXRJbWFnZU9wdGlvbnMoKSB7CiAgc2V0SW1hZ2VPcHRpb25zKHt9KTsKfQoKY29uc3Qgc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnNldCIpOwpjb25zdCB1bnNldF9idXR0b24gPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtc3Bhbi51bnNldCIpOwppZiAoZmlyc3RSdW4pIHsKICBzZXRfYnV0dG9uLm9uY2xpY2sgPSAoZSkgPT4gewogICAgZm9yIChjb25zdCBjb250YWluZXIgb2YgT2JqZWN0LnZhbHVlcyhjb25maWdfc3BhbnMpKSB7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBjb250YWluZXIudWlfdmFsdWU7CiAgICB9CiAgfTsKICB1bnNldF9idXR0b24ub25jbGljayA9IHVuc2V0SW1hZ2VPcHRpb25zOwp9CgovLyBXZSBhZGQgYSBmdW5jdGlvbiB0byBjaGVjayBpZiB0aGUgY2xpcGJvYXJkIGlzIHBvcHBlZCBvdXQKQ09OVEFJTkVSLmlzUG9wcGVkT3V0ID0gKCkgPT4gewogIHJldHVybiBDT05UQUlORVIuY2xhc3NMaXN0LmNvbnRhaW5zKCJwb3BwZWQtb3V0Iik7Cn07CgpDTElQQk9BUkRfSEVBREVSLm9ubW91c2Vkb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgaWYgKGV2ZW50LnRhcmdldC5tYXRjaGVzKCJzcGFuLmNsaXBib2FyZC12YWx1ZSIpKSB7CiAgICBjb25zb2xlLmxvZygiV2UgZG9uJ3QgbW92ZSEiKTsKICAgIHJldHVybjsKICB9CiAgY29uc3Qgc3RhcnQgPSB7CiAgICBsZWZ0OiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS5sZWZ0KSwKICAgIHRvcDogcGFyc2VGbG9hdChDT05UQUlORVIuc3R5bGUudG9wKSwKICAgIFg6IGV2ZW50LnBhZ2VYLAogICAgWTogZXZlbnQucGFnZVksCiAgfTsKICBmdW5jdGlvbiBtb3ZlQXQoZXZlbnQsIHN0YXJ0KSB7CiAgICBjb25zdCB0b3AgPSBldmVudC5wYWdlWSAtIHN0YXJ0LlkgKyBzdGFydC50b3AgKyAicHgiOwogICAgY29uc3QgbGVmdCA9IGV2ZW50LnBhZ2VYIC0gc3RhcnQuWCArIHN0YXJ0LmxlZnQgKyAicHgiOwogICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gbGVmdDsKICAgIENPTlRBSU5FUi5zdHlsZS5sZWZ0ID0gbGVmdDsKICAgIENPTlRBSU5FUi5zdHlsZS50b3AgPSB0b3A7CiAgfQoKICAvLyBtb3ZlIG91ciBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYmFsbCB1bmRlciB0aGUgcG9pbnRlcgogIG1vdmVBdChldmVudCwgc3RhcnQpOwogIGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGV2ZW50KSB7CiAgICBtb3ZlQXQoZXZlbnQsIHN0YXJ0KTsKICB9CgogIC8vIFdlIHVzZSB0aGlzIHRvIHJlbW92ZSB0aGUgbW91c2Vtb3ZlIHdoZW4gY2xpY2tpbmcgb3V0c2lkZSBvZiB0aGUgY29udGFpbmVyCiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgLy8gbW92ZSB0aGUgY29udGFpbmVyIG9uIG1vdXNlbW92ZQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIG9uTW91c2VNb3ZlLCB7CiAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLAogIH0pOwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAibW91c2Vkb3duIiwKICAgIChlKSA9PiB7CiAgICAgIGlmIChlLnRhcmdldC5jbG9zZXN0KCIucGx1dG9wbG90bHktY29udGFpbmVyIikgIT09IENPTlRBSU5FUikgewogICAgICAgIGNsZWFuVXAoKTsKICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9LAogICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0KICApOwoKICBmdW5jdGlvbiBjbGVhblVwKCkgewogICAgY29uc29sZS5sb2coImNsZWFuaW5nIHVwIHRoZSBwbG90IG1vdmUgbGlzdGVuZXIiKTsKICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gbnVsbDsKICB9CgogIC8vICgzKSBkcm9wIHRoZSBiYWxsLCByZW1vdmUgdW5uZWVkZWQgaGFuZGxlcnMKICBDTElQQk9BUkRfSEVBREVSLm9ubW91c2V1cCA9IGNsZWFuVXA7Cn07CgpmdW5jdGlvbiBzZW5kVG9DbGlwYm9hcmQoYmxvYikgewogIGlmICghbmF2aWdhdG9yLmNsaXBib2FyZCkgewogICAgYWxlcnQoCiAgICAgICJUaGUgQ2xpcGJvYXJkIEFQSSBkb2VzIG5vdCBzZWVtIHRvIGJlIGF2YWlsYWJsZSwgbWFrZSBzdXJlIHRoZSBQbHV0byBub3RlYm9vayBpcyBiZWluZyB1c2VkIGZyb20gZWl0aGVyIGxvY2FsaG9zdCBvciBhbiBodHRwcyBzb3VyY2UuIgogICAgKTsKICB9CiAgbmF2aWdhdG9yLmNsaXBib2FyZAogICAgLndyaXRlKFsKICAgICAgbmV3IENsaXBib2FyZEl0ZW0oewogICAgICAgIC8vIFRoZSBrZXkgaXMgZGV0ZXJtaW5lZCBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgYmxvYidzIHR5cGUuCiAgICAgICAgW2Jsb2IudHlwZV06IGJsb2IsCiAgICAgIH0pLAogICAgXSkKICAgIC50aGVuKAogICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgY29uc29sZS5sb2coIkFzeW5jOiBDb3B5aW5nIHRvIGNsaXBib2FyZCB3YXMgc3VjY2Vzc2Z1bCEiKTsKICAgICAgfSwKICAgICAgZnVuY3Rpb24gKGVycikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkFzeW5jOiBDb3VsZCBub3QgY29weSB0ZXh0OiAiLCBlcnIpOwogICAgICB9CiAgICApOwp9CgpmdW5jdGlvbiBjb3B5SW1hZ2VUb0NsaXBib2FyZCgpIHsKICAvLyBXZSBleHRyYWN0IHRoZSBpbWFnZSBvcHRpb25zIGZyb20gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMgKGlmIHRoZXkgZXhpc3QpCiAgY29uc3QgY29uZmlnID0ge307CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGxldCB2YWwgPQogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID8/CiAgICAgIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IGNvbnRhaW5lci51aV92YWx1ZSA6IHVuZGVmaW5lZCk7CiAgICAvLyBJZiB3ZSBoYXZlIHVuZGVmaW5lZCB3ZSBkb24ndCBjcmVhdGUgdGhlIGtleS4gV2UgYWxzbyBpZ25vcmUgZm9ybWF0IGJlY2F1c2UgdGhlIGNsaXBib2FyZCBvbmx5IHN1cHBvcnRzIHBuZy4KICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS50b0ltYWdlKFBMT1QsIGNvbmZpZykudGhlbihmdW5jdGlvbiAoZGF0YVVybCkgewogICAgZmV0Y2goZGF0YVVybCkKICAgICAgLnRoZW4oKHJlcykgPT4gcmVzLmJsb2IoKSkKICAgICAgLnRoZW4oKGJsb2IpID0+IHsKICAgICAgICBjb25zdCBwYXN0ZV9yZWNlaXZlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3Bhc3RlLXJlY2VpdmVyLnBsdXRvcGxvdGx5JykKICAgICAgICBpZiAocGFzdGVfcmVjZWl2ZXIpIHsKICAgICAgICAgIHBhc3RlX3JlY2VpdmVyLmF0dGFjaEltYWdlKGRhdGFVcmwsIENPTlRBSU5FUikKICAgICAgICB9CiAgICAgICAgc2VuZFRvQ2xpcGJvYXJkKGJsb2IpCiAgICAgIH0pOwogIH0pOwp9CgpmdW5jdGlvbiBzYXZlSW1hZ2VUb0ZpbGUoKSB7CiAgY29uc3QgY29uZmlnID0ge307CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGxldCB2YWwgPQogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID8/CiAgICAgIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IGNvbnRhaW5lci51aV92YWx1ZSA6IHVuZGVmaW5lZCk7CiAgICAvLyBJZiB3ZSBoYXZlIHVuZGVmaW5lZCB3ZSBkb24ndCBjcmVhdGUgdGhlIGtleS4KICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbmZpZ1trZXldID0gdmFsOwogIH0KICBQbG90bHkuZG93bmxvYWRJbWFnZShQTE9ULCBjb25maWcpOwp9CgpsZXQgY29udGFpbmVyX3JlY3QgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAsIHRvcDogMCwgbGVmdDogMCB9OwpmdW5jdGlvbiB1bnBvcF9jb250YWluZXIoY2wpIHsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZSgicG9wcGVkLW91dCIsIGZhbHNlKTsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgZmFsc2UpOwogIC8vIFdlIGZpeCB0aGUgaGVpZ2h0IGJhY2sgdG8gdGhlIHZhbHVlIGl0IGhhZCBiZWZvcmUgcG9wb3V0LCBhbHNvIHNldHRpbmcgdGhlIGZsYWcgdG8gc2lnbmFsIHRoYXQgdXBvbiBmaXJzdCByZXNpemUgd2UgcmVtb3ZlIHRoZSBmaXhlZCBpbmxpbmUtc3R5bGUKICBDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0ICsgInB4IjsKICByZW1vdmVfY29udGFpbmVyX3NpemUgPSB0cnVlOwogIC8vIFdlIHNldCB0aGUgb3RoZXIgZml4ZWQgaW5saW5lLXN0eWxlcyB0byBudWxsCiAgQ09OVEFJTkVSLnN0eWxlLndpZHRoID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9ICIiOwogIENPTlRBSU5FUi5zdHlsZS5sZWZ0ID0gIiI7CiAgLy8gV2UgYWxzbyByZW1vdmUgdGhlIENMSVBCT0FSRF9IRUFERVIKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLndpZHRoID0gIiI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gIiI7CiAgLy8gRmluYWxseSB3ZSByZW1vdmUgdGhlIGhpZGRlbiBjbGFzcyB0byB0aGUgaGVhZGVyCiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCB0cnVlKTsKICByZXR1cm47Cn0KZnVuY3Rpb24gcG9wb3V0X2NvbnRhaW5lcihvcHRzKSB7CiAgY29uc3QgY2wgPSBvcHRzPy5jbDsKICBjb25zdCB0YXJnZXRfY29udGFpbmVyX3NpemUgPSBvcHRzPy50YXJnZXRfY29udGFpbmVyX3NpemUgPz8ge307CiAgY29uc3QgdGFyZ2V0X3Bsb3Rfc2l6ZSA9IG9wdHM/LnRhcmdldF9wbG90X3NpemUgPz8ge307CiAgaWYgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICByZXR1cm4gdW5wb3BfY29udGFpbmVyKGNsKTsKICB9CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoY2wsIGNsID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IHRydWUpOwogIC8vIFdlIGV4dHJhY3QgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgY29udGFpbmVyLCBzYXZlIHRoZW0gYW5kIGZpeCB0aGVtCiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfSA9IENPTlRBSU5FUi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICBjb250YWluZXJfcmVjdCA9IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH07CiAgLy8gV2Ugc2F2ZSB0aGUgY3VycmVudCBwbG90IHNpemUgYmVmb3JlIHdlIHBvcCBhcyBpdCB3aWxsIGZpbGwgdGhlIHNjcmVlbgogIGNvbnN0IGN1cnJlbnRfcGxvdF9zaXplID0gewogICAgd2lkdGg6IFBMT1QuX2Z1bGxMYXlvdXQud2lkdGgsCiAgICBoZWlnaHQ6IFBMT1QuX2Z1bGxMYXlvdXQuaGVpZ2h0LAogIH07CiAgLy8gV2UgaGF2ZSB0byBzYXZlIHRoZSBwYWQgZGF0YSBiZWZvcmUgcG9wcGluZyBzbyB3ZSBjYW4gcmVzaXplIHByZWNpc2VseQogIGNvbnN0IHBhZCA9IHt9OwogIHBhZC51bnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZSgicG9wcGVkLW91dCIsIHRydWUpOwogIHBhZC5wb3BwZWQgPSBnZXRTaXplRGF0YSgpLmNvbnRhaW5lcl9wYWQ7CiAgLy8gV2UgZG8gdG9wIGFuZCBsZWZ0IGJhc2VkIG9uIHRoZSBjdXJyZW50IHJlY3QKICBmb3IgKGNvbnN0IGtleSBvZiBbInRvcCIsICJsZWZ0Il0pIHsKICAgIGNvbnN0IHN0YXJ0X3ZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNvbnRhaW5lcl9yZWN0W2tleV07CiAgICBsZXQgb2Zmc2V0ID0gMDsKICAgIGZvciAoY29uc3Qga2luZCBvZiBbInBhZGRpbmciLCAiYm9yZGVyIl0pIHsKICAgICAgb2Zmc2V0ICs9IHBhZC5wb3BwZWRba2luZF1ba2V5XSAtIHBhZC51bnBvcHBlZFtraW5kXVtrZXldOwogICAgfQogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSBzdGFydF92YWwgLSBvZmZzZXQgKyAicHgiOwogICAgaWYgKGtleSA9PT0gImxlZnQiKSB7CiAgICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGVba2V5XSA9IENPTlRBSU5FUi5zdHlsZVtrZXldOwogICAgfQogIH0KICAvLyBXZSBjb21wdXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGRlcGVuZGluZyBvbiBldmVudHVhbCBjb25maWcgZGF0YQogIGNvbnN0IGNzeiA9IGNvbXB1dGVDb250YWluZXJTaXplKHsKICAgIHdpZHRoOgogICAgICB0YXJnZXRfcGxvdF9zaXplLndpZHRoID8/CiAgICAgIGNvbmZpZ19zcGFucy53aWR0aC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6CiAgICAgIHRhcmdldF9wbG90X3NpemUuaGVpZ2h0ID8/CiAgICAgIGNvbmZpZ19zcGFucy5oZWlnaHQuY29uZmlnX3ZhbHVlID8/CiAgICAgIGN1cnJlbnRfcGxvdF9zaXplLmhlaWdodCwKICB9KTsKICBmb3IgKGNvbnN0IGtleSBvZiBbIndpZHRoIiwgImhlaWdodCJdKSB7CiAgICBjb25zdCB2YWwgPSB0YXJnZXRfY29udGFpbmVyX3NpemVba2V5XSA/PyBjc3pba2V5XTsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gdmFsICsgInB4IjsKICAgIGlmIChrZXkgPT09ICJ3aWR0aCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIENMSVBCT0FSRF9IRUFERVIuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgZmFsc2UpOwogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CgogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAibW91c2Vkb3duIiwKICAgIChlKSA9PiB7CiAgICAgIGlmIChlLnRhcmdldC5jbG9zZXN0KCIucGx1dG9wbG90bHktY29udGFpbmVyIikgIT09IENPTlRBSU5FUikgewogICAgICAgIHVucG9wX2NvbnRhaW5lcigpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7Cn0KCkNPTlRBSU5FUi5wb3BPdXQgPSBwb3BvdXRfY29udGFpbmVyOwoKZnVuY3Rpb24gRHVhbENsaWNrKHNpbmdsZV9mdW5jLCBkYmxfZnVuYykgewogIGxldCBuY2xpY2tzID0gMDsKICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHsKICAgIG5jbGlja3MgKz0gMTsKICAgIGlmIChuY2xpY2tzID4gMSkgewogICAgICBkYmxfZnVuYyguLi5hcmdzKTsKICAgICAgbmNsaWNrcyA9IDA7CiAgICB9IGVsc2UgewogICAgICBkZWxheSgzMDApLnRoZW4oKCkgPT4gewogICAgICAgIGlmIChuY2xpY2tzID09IDEpIHsKICAgICAgICAgIHNpbmdsZV9mdW5jKC4uLmFyZ3MpOwogICAgICAgIH0KICAgICAgICBuY2xpY2tzID0gMDsKICAgICAgfSk7CiAgICB9CiAgfTsKfQoKLy8gV2UgcmVtb3ZlIHRoZSBkZWZhdWx0IGRvd25sb2FkIGltYWdlIGJ1dHRvbgpwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSA9IF8udW5pb24oCiAgcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9SZW1vdmUsCiAgWyJ0b0ltYWdlIl0KKTsKLy8gV2UgYWRkIHRoZSBjdXN0b20gYnV0dG9uIHRvIHRoZSBtb2RlYmFyCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb0FkZCwKICBbCiAgICB7CiAgICAgIG5hbWU6ICJDb3B5IFBORyB0byBDbGlwYm9hcmQiLAogICAgICBpY29uOiB7CiAgICAgICAgaGVpZ2h0OiA1MjAsCiAgICAgICAgd2lkdGg6IDUyMCwKICAgICAgICBwYXRoOiAiTTI4MCA2NGg0MGMzNS4zIDAgNjQgMjguNyA2NCA2NFY0NDhjMCAzNS4zLTI4LjcgNjQtNjQgNjRINjRjLTM1LjMgMC02NC0yOC43LTY0LTY0VjEyOEMwIDkyLjcgMjguNyA2NCA2NCA2NGg0MCA5LjZDMTIxIDI3LjUgMTUzLjMgMCAxOTIgMHM3MSAyNy41IDc4LjQgNjRIMjgwek02NCAxMTJjLTguOCAwLTE2IDcuMi0xNiAxNlY0NDhjMCA4LjggNy4yIDE2IDE2IDE2SDMyMGM4LjggMCAxNi03LjIgMTYtMTZWMTI4YzAtOC44LTcuMi0xNi0xNi0xNkgzMDR2MjRjMCAxMy4zLTEwLjcgMjQtMjQgMjRIMTkyIDEwNGMtMTMuMyAwLTI0LTEwLjctMjQtMjRWMTEySDY0em0xMjgtOGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6IiwKICAgICAgfSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKGNvcHlJbWFnZVRvQ2xpcGJvYXJkLCAoKSA9PiB7CiAgICAgICAgcG9wb3V0X2NvbnRhaW5lcigpOwogICAgICB9KSwKICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICJEb3dubG9hZCBJbWFnZSIsCiAgICAgIGljb246IFBsb3RseS5JY29ucy5jYW1lcmEsCiAgICAgIGRpcmVjdGlvbjogInVwIiwKICAgICAgY2xpY2s6IER1YWxDbGljayhzYXZlSW1hZ2VUb0ZpbGUsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKHsgY2w6ICJmaWxlc2F2ZSIgfSk7CiAgICAgIH0pLAogICAgfSwKICBdCik7CgpmdW5jdGlvbiBnZXRPZmZzZXREYXRhKGVsKSB7CiAgbGV0IGNzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwsIG51bGwpOwogIGNvbnN0IG9kYXRhID0gewogICAgcGFkZGluZzogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdMZWZ0KSwKICAgICAgcmlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1JpZ2h0KSwKICAgICAgdG9wOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdUb3ApLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MucGFkZGluZ0JvdHRvbSksCiAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdMZWZ0KSArIHBhcnNlRmxvYXQoY3MucGFkZGluZ1JpZ2h0KSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdUb3ApICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgIH0sCiAgICBib3JkZXI6IHsKICAgICAgbGVmdDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgdG9wOiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSwKICAgICAgYm90dG9tOiBwYXJzZUZsb2F0KGNzLmJvcmRlckJvdHRvbVdpZHRoKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MuYm9yZGVyTGVmdFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyUmlnaHRXaWR0aCksCiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChjcy5ib3JkZXJUb3BXaWR0aCkgKyBwYXJzZUZsb2F0KGNzLmJvcmRlckJvdHRvbVdpZHRoKSwKICAgIH0KICB9OwogIGlmIChlbCA9PT0gUExPVCkgewogICAgLy8gRm9yIHRoZSBQTE9UIHdlIGFsc28gd2FudCB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgb2Zmc2V0CiAgICBvZGF0YS5vZmZzZXQgPSB7CiAgICAgIHRvcDogUExPVC5vZmZzZXRQYXJlbnQgPT0gQ09OVEFJTkVSID8gUExPVC5vZmZzZXRUb3AgOiAwLAogICAgICBsZWZ0OiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldExlZnQgOiAwLAogICAgfQogIH0KICByZXR1cm4gb2RhdGE7Cn0KZnVuY3Rpb24gZ2V0U2l6ZURhdGEoKSB7CiAgY29uc3QgZGF0YSA9IHsKICAgIHBsb3RfcGFkOiBnZXRPZmZzZXREYXRhKFBMT1QpLAogICAgcGxvdF9yZWN0OiBQTE9ULmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogICAgY29udGFpbmVyX3BhZDogZ2V0T2Zmc2V0RGF0YShDT05UQUlORVIpLAogICAgY29udGFpbmVyX3JlY3Q6IENPTlRBSU5FUi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICB9OwogIHJldHVybiBkYXRhOwp9CmZ1bmN0aW9uIGNvbXB1dGVDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICBjb25zdCBjb21wdXRlZF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICBjb25zdCBvZmZzZXRzID0gY29tcHV0ZWRfc2l6ZS5vZmZzZXRzOwoKICBjb25zdCBwbG90X2RhdGEgPSB7CiAgICB3aWR0aDogd2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCwKICAgIGhlaWdodDogaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH07CgogIHJldHVybiB7CiAgICB3aWR0aDogKHdpZHRoID8/IGNvbXB1dGVkX3NpemUud2lkdGgpICsgb2Zmc2V0cy53aWR0aCwKICAgIGhlaWdodDogKGhlaWdodCA/PyBjb21wdXRlZF9zaXplLmhlaWdodCkgKyBvZmZzZXRzLmhlaWdodCwKICAgIG5vQ2hhbmdlOiB3aWR0aCA9PSBjb21wdXRlZF9zaXplLndpZHRoICYmIGhlaWdodCA9PSBjb21wdXRlZF9zaXplLmhlaWdodCwKICB9Cn0KCi8vIFRoaXMgZnVuY3Rpb24gd2lsbCBjaGFuZ2UgdGhlIGNvbnRhaW5lciBzaXplIHNvIHRoYXQgdGhlIHJlc3VsdGluZyBwbG90IHdpbGwgYmUgbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIHNwZWNzCmZ1bmN0aW9uIGNoYW5nZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGlmICghQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIGNvbnNvbGUubG9nKCJUcmllZCB0byBjaGFuZ2UgY29udGFpbmVyIHNpemUgd2hlbiBub3QgcG9wcGVkLCBpZ25vcmluZyIpOwogICAgcmV0dXJuOwogIH0KCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhKTsKCiAgaWYgKGNzei5ub0NoYW5nZSkgewogICAgY29uc29sZS5sb2coIlNpemUgaXMgdGhlIHNhbWUgYXMgY3VycmVudCwgaWdub3JpbmciKTsKICAgIHJldHVybgogIH0KICAvLyBXZSBhcmUgbm93IGdvaW5nIHRvIHNldCBoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBjb250YWluZXIKICBmb3IgKGNvbnN0IGtleSBvZiBbIndpZHRoIiwgImhlaWdodCJdKSB7CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IGNzeltrZXldICsgInB4IjsKICB9Cn0KLy8gV2Ugbm93IGNyZWF0ZSB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIHVwZGF0ZSB0aGUgcGxvdCBiYXNlZCBvbiB0aGUgdmFsdWVzIHNwZWNpZmllZApmdW5jdGlvbiB1cGRhdGVGcm9tSGVhZGVyKCkgewogIGNvbnN0IGhlYWRlcl9kYXRhID0gewogICAgaGVpZ2h0OiBjb25maWdfc3BhbnMuaGVpZ2h0LnVpX3ZhbHVlLAogICAgd2lkdGg6IGNvbmZpZ19zcGFucy53aWR0aC51aV92YWx1ZSwKICB9OwogIGNoYW5nZUNvbnRhaW5lclNpemUoaGVhZGVyX2RhdGEpOwp9Ci8vIFdlIGFzc2lnbiB0aGlzIGZ1bmN0aW9uIHRvIHRoZSBvbmJsdXIgZXZlbnQgb2Ygd2lkdGggYW5kIGhlaWdodAppZiAoZmlyc3RSdW4pIHsKICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGNvbnRhaW5lci51aV9zcGFuLm9uYmx1ciA9IChlKSA9PiB7CiAgICAgIGNvbnRhaW5lci51aV92YWx1ZSA9IGNvbnRhaW5lci51aV9zcGFuLnRleHRDb250ZW50OwogICAgICB1cGRhdGVGcm9tSGVhZGVyKCk7CiAgICB9OwogIH0KfQovLyBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBwbG90IHNpemUgdG8gdXNlIGZvciByZWxheW91dCBhcyBhIGZ1bmN0aW9uIG9mIHRoZSBjb250YWluZXIgc2l6ZQpmdW5jdGlvbiBjb21wdXRlUGxvdFNpemUoZGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICAvLyBSZW1vdmUgUGFkZGluZwogIGNvbnN0IHsgY29udGFpbmVyX3BhZCwgcGxvdF9wYWQsIGNvbnRhaW5lcl9yZWN0IH0gPSBkYXRhOwogIGNvbnN0IG9mZnNldHMgPSB7CiAgICB3aWR0aDoKICAgICAgcGxvdF9wYWQucGFkZGluZy53aWR0aCArCiAgICAgIHBsb3RfcGFkLmJvcmRlci53aWR0aCArCiAgICAgIHBsb3RfcGFkLm9mZnNldC5sZWZ0ICsKICAgICAgY29udGFpbmVyX3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgY29udGFpbmVyX3BhZC5ib3JkZXIud2lkdGgsCiAgICBoZWlnaHQ6CiAgICAgIHBsb3RfcGFkLnBhZGRpbmcuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLmhlaWdodCArCiAgICAgIHBsb3RfcGFkLm9mZnNldC50b3AgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcuaGVpZ2h0ICsKICAgICAgY29udGFpbmVyX3BhZC5ib3JkZXIuaGVpZ2h0LAogIH07CiAgY29uc3Qgc3ogPSB7CiAgICB3aWR0aDogTWF0aC5yb3VuZChjb250YWluZXJfcmVjdC53aWR0aCAtIG9mZnNldHMud2lkdGgpLAogICAgaGVpZ2h0OiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LmhlaWdodCAtIG9mZnNldHMuaGVpZ2h0KSwKICAgIG9mZnNldHMsCiAgfTsKICByZXR1cm4gc3o7Cn0KCi8vIENyZWF0ZSB0aGUgcmVzaXplT2JzZXJ2ZXIgdG8gbWFrZSB0aGUgcGxvdCBldmVuIG1vcmUgcmVzcG9uc2l2ZSEgOm1hZ2ljOgpjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4gewogIGNvbnN0IHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKTsKICBjb25zdCB7Y29udGFpbmVyX3JlY3QsIGNvbnRhaW5lcl9wYWR9ID0gc2l6ZURhdGE7CiAgbGV0IHBsb3Rfc2l6ZSA9IGNvbXB1dGVQbG90U2l6ZShzaXplRGF0YSk7CiAgLy8gV2Ugc2F2ZSB0aGUgaGVpZ2h0IGluIHRoZSBQTE9UIG9iamVjdAogIFBMT1QuY29udGFpbmVyX2hlaWdodCA9IGNvbnRhaW5lcl9yZWN0LmhlaWdodDsKICAvLyBXZSBkZWFsIHdpdGggc29tZSBzdHVmZiBpZiB0aGUgY29udGFpbmVyIGlzIHBvcHBwZWQKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLndpZHRoID0gY29udGFpbmVyX3JlY3Qud2lkdGggKyAicHgiOwogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9IGNvbnRhaW5lcl9yZWN0LmxlZnQgKyAicHgiOwogIGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUgPSBwbG90X3NpemUuaGVpZ2h0OwogIGNvbmZpZ19zcGFucy53aWR0aC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS53aWR0aDsKICAvKiAKCQlUaGUgYWRkaXRpb24gb2YgdGhlIGludmFsaWQgYXJndW1lbnQgYHBsdXRvcmVzaXplYCBzZWVtcyB0byBmaXggdGhlIHByb2JsZW0gd2l0aCBjYWxsaW5nIGByZWxheW91dGAgc2ltcGx5IHdpdGggYHthdXRvc2l6ZTogdHJ1ZX1gIGFzIHVwZGF0ZSBicmVha2luZyBtb3VzZSByZWxheW91dCBldmVudHMgdHJhY2tpbmcuIAoJCVNlZSBodHRwczovL2dpdGh1Yi5jb20vcGxvdGx5L3Bsb3RseS5qcy9pc3N1ZXMvNjE1NiBmb3IgZGV0YWlscwoJCSovCiAgbGV0IGNvbmZpZyA9IHsKICAgIC8vIElmIHRoaXMgaXMgcG9wcGVkIG91dCwgd2UgaWdub3JlIHRoZSBvcmlnaW5hbCB3aWR0aC9oZWlnaHQKICAgIHdpZHRoOiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyB1bmRlZmluZWQgOiBvcmlnaW5hbF93aWR0aCkgPz8gcGxvdF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyB1bmRlZmluZWQgOiBvcmlnaW5hbF9oZWlnaHQpID8/IHBsb3Rfc2l6ZS5oZWlnaHQsCiAgICBwbHV0b3Jlc2l6ZTogdHJ1ZSwKICB9OwogIFBsb3RseS5yZWxheW91dChQTE9ULCBjb25maWcpLnRoZW4oKCkgPT4gewogICAgaWYgKHJlbW92ZV9jb250YWluZXJfc2l6ZSAmJiAhQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgdGhlIGZpcnN0IHJlc2l6ZSB1cG9uIHBsb3QgY3JlYXRpb24gdG8gYWxyZWFkeSBiZSB3aXRob3V0IGEgZml4ZWQgaGVpZ2h0CiAgICAgIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSAiIjsKICAgICAgQ09OVEFJTkVSLnN0eWxlLndpZHRoID0gIiI7CiAgICAgIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IGZhbHNlOwogICAgfQogIH0pOwp9KTsKCnJlc2l6ZU9ic2VydmVyLm9ic2VydmUoQ09OVEFJTkVSKTsKCgpQbG90bHkucmVhY3QoUExPVCwgcGxvdF9vYmopLnRoZW4oKCkgPT4gewoJLy8gQXNzaWduIHRoZSBQbG90bHkgZXZlbnQgbGlzdGVuZXJzCglmb3IgKGNvbnN0IFtrZXksIGxpc3RlbmVyX3ZlY10gb2YgT2JqZWN0LmVudHJpZXMocGxvdGx5X2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULm9uKGtleSwgbGlzdGVuZXIpCgkJfQoJfQoJLy8gQXNzaWduIHRoZSBKUyBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhqc19saXN0ZW5lcnMpKSB7CgkJZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcl92ZWMpIHsKCQkJUExPVC5hZGRFdmVudExpc3RlbmVyKGtleSwgbGlzdGVuZXIsIHsKCQkJCXNpZ25hbDogY29udHJvbGxlci5zaWduYWwKCQkJfSkKCQl9Cgl9Cn0KKQoKCmludmFsaWRhdGlvbi50aGVuKCgpID0+IHsKCS8vIFJlbW92ZSBhbGwgcGxvdGx5IGxpc3RlbmVycwoJUExPVC5yZW1vdmVBbGxMaXN0ZW5lcnMoKQoJLy8gUmVtb3ZlIGFsbCBKUyBsaXN0ZW5lcnMKCWNvbnRyb2xsZXIuYWJvcnQoKQoJLy8gUmVtb3ZlIHRoZSByZXNpemVPYnNlcnZlcgoJcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpCn0pCgoKCgkJcmV0dXJuIENPTlRBSU5FUgoJPC9zY3JpcHQ+CqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b+jFP9OPLBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkOTY0NDA0ZjYtN2Y0Ni00ZGY5LWFkOTgtOTIxOTQ4YzNiZTY5uWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOB82anrVwdWJsaXNoZWRfb2JqZWN0X2tleXOR2TViM2I4NDA4Yy04MTgxLTExZWYtMTRlYi1lMWM1NjliOGJiMjkvNWI5ODJhYzRhZjkyMWRlNbhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SRkMTZlZmE2Mi1kY2U3LTRlYzMtOWUzYy1iNWUxNjc3Mzc3ZmOKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R5oKRtaW1lqnRleHQvcGxhaW6scm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/owtkoTiwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJGQxNmVmYTYyLWRjZTctNGVjMy05ZTNjLWI1ZTE2NzczNzdmY7lkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgGkY1C1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SRjMDJmMzg5OC0xMGNiLTRmMWUtYjVlZi1lYjQyYjgwM2JhZWSKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52mqJCTxzY3JpcHQgaWQ9J3Bsb3RfMSc+CgkJLy8gV2Ugc3RhcnQgYnkgcHV0dGluZyBhbGwgdGhlIHZhcmlhYmxlIGludGVycG9sYXRpb24gaGVyZSBhdCB0aGUgYmVnaW5uaW5nCgkJLy8gV2UgaGF2ZSB0byBjb252ZXJ0IGFsbCB0eXBlZGFycmF5cyBpbiB0aGUgbGF5b3V0IHRvIG5vcm1hbCBhcnJheXMuIFNlZSBJc3N1ZSAjMjUKCQkvLyBXZSB1c2UgbG9kYXNoIGZvciB0aGlzIGZvciBjb21wYWN0bmVzcwoJCWZ1bmN0aW9uIHJlbW92ZVR5cGVkQXJyYXkobykgewoJCQlyZXR1cm4gXy5pc1R5cGVkQXJyYXkobykgPyBBcnJheS5mcm9tKG8pIDoKCQkJXy5pc1BsYWluT2JqZWN0KG8pID8gXy5tYXBWYWx1ZXMobywgcmVtb3ZlVHlwZWRBcnJheSkgOiAKCQkJbwoJCX0KCgkJLy8gUHVibGlzaCB0aGUgcGxvdCBvYmplY3QgdG8gSlMKCQlsZXQgcGxvdF9vYmogPSBfLnVwZGF0ZSgvKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIEFic3RyYWN0UGx1dG9EaW5nZXRqZXMuRGlzcGxheS5wdWJsaXNoZWRfdG9fanMgKi8gZ2V0UHVibGlzaGVkT2JqZWN0KCJiM2I4NDA4Yy04MTgxLTExZWYtMTRlYi1lMWM1NjliOGJiMjkvOTUwNDU0MjgxNjU0ZWZlNyIpLCAibGF5b3V0IiwgcmVtb3ZlVHlwZWRBcnJheSkKCQkvLyBHZXQgdGhlIHBsb3RseSBsaXN0ZW5lcnMKCQljb25zdCBwbG90bHlfbGlzdGVuZXJzID0ge30KCQkvLyBHZXQgdGhlIEpTIGxpc3RlbmVycwoJCWNvbnN0IGpzX2xpc3RlbmVycyA9IHt9CgkJLy8gRGVhbCB3aXRoIGV2ZW50dWFsIGN1c3RvbSBjbGFzc2VzCgkJbGV0IGN1c3RvbV9jbGFzc2xpc3QgPSBbXQoKCgkJLy8gTG9hZCB0aGUgcGxvdGx5IGxpYnJhcnkKCQlsZXQgUGxvdGx5ID0gdW5kZWZpbmVkCgkJdHJ5IHsKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoIi4vcGxvdGx5anMvcGxvdGx5anMtMi4yNi4yLm1pbi5qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0gY2F0Y2ggKGUpIHsKCQkJY29uc29sZS5sb2coIkxvY2FsIGxvYWQgZmFpbGVkLCB0cnlpbmcgd2l0aCB0aGUgd2ViIGVzbS5zaCB2ZXJzaW9uIikKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoImh0dHBzOi8vZXNtLnNoL3YxMzUvcGxvdGx5LmpzLWRpc3QtbWluQDIuMjYuMi9lc25leHQvcGxvdGx5LmpzLWRpc3QtbWluLm1qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0KCgkJLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0byBmb3JjZSBsb2NhbCBtYXRoamF4IGZvbnQgY2FjaGUKCQlpZiAoZmFsc2UgJiYgd2luZG93Py5NYXRoSmF4Py5jb25maWc/LnN2Zz8uZm9udENhY2hlID09PSAnZ2xvYmFsJykgewoJCQl3aW5kb3cuTWF0aEpheC5jb25maWcuc3ZnLmZvbnRDYWNoZSA9ICdsb2NhbCcKCQl9CgoJCS8vIEZsYWcgdG8gY2hlY2sgaWYgdGhpcyBjZWxsIHdhcyAgbWFudWFsbHkgcmFuIG9yIHJlYWN0aXZlbHkgcmFuCmNvbnN0IGZpcnN0UnVuID0gdGhpcyA/IGZhbHNlIDogdHJ1ZQpjb25zdCBDT05UQUlORVIgPSB0aGlzID8/IGh0bWxgPGRpdiBjbGFzcz0ncGx1dG9wbG90bHktY29udGFpbmVyJz5gCmNvbnN0IFBMT1QgPSBDT05UQUlORVIucXVlcnlTZWxlY3RvcignLmpzLXBsb3RseS1wbG90JykgPz8gQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgPGRpdj5gKQpjb25zdCBwYXJlbnQgPSBDT05UQUlORVIucGFyZW50RWxlbWVudAovLyBXZSB1c2UgYSBjb250cm9sbGVyIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lcnMgdXBvbiBpbnZhbGlkYXRpb24KY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKQovLyBXZSBoYXZlIHRvIGFkZCB0aGlzIHRvIGtlZXAgc3VwcG9ydGluZyBAYmluZCB3aXRoIHRoZSBvbGQgQVBJIHVzaW5nIFBMT1QKUExPVC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChlKSA9PiB7CglDT05UQUlORVIudmFsdWUgPSBQTE9ULnZhbHVlCglpZiAoZS5idWJibGVzKSB7CgkJcmV0dXJuCgl9CglDT05UQUlORVIuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2lucHV0JykpCn0sIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KQoKCS8vIFRoaXMgY3JlYXRlIHRoZSBzdHlsZSBzdWJkaXYgb24gZmlyc3QgcnVuCglmaXJzdFJ1biAmJiBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGAKCTxzdHlsZT4KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgewoJCXdpZHRoOiAxMDAlOwoJCWhlaWdodDogMTAwJTsKCQltaW4taGVpZ2h0OiAwOwoJCW1pbi13aWR0aDogMDsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgLmpzLXBsb3RseS1wbG90IC5wbG90bHkgZGl2IHsKCQltYXJnaW46IDAgYXV0bzsgLy8gVGhpcyBjZW50ZXJzIHRoZSBwbG90Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLnBvcHBlZC1vdXQgewoJCW92ZXJmbG93OiBhdXRvOwoJCXotaW5kZXg6IDEwMDA7CgkJcG9zaXRpb246IGZpeGVkOwoJCXJlc2l6ZTogYm90aDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDBweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMHB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgewoJCWRpc3BsYXk6IGZsZXg7CgkJZmxleC1mbG93OiByb3cgd3JhcDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAxMnB4OwoJCXBvc2l0aW9uOiBmaXhlZDsKCQl6LWluZGV4OiAxMDAxOwoJCWN1cnNvcjogbW92ZTsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIC0xMDAlKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBzcGFuIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJZmxleDogMQoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIuaGlkZGVuIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuIHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlIHsKCQlwYWRkaW5nLXJpZ2h0OiA1cHg7CgkJcGFkZGluZy1sZWZ0OiAycHg7CgkJY3Vyc29yOiB0ZXh0OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZmxleDogMCAwIDEwMCU7CgkJdGV4dC1hbGlnbjogY2VudGVyOwoJCWJvcmRlci10b3A6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQltYXJnaW4tdG9wOiA1cHg7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZpbGVuYW1lIHsKCQltYXJnaW4tbGVmdDogM3B4OwoJCXRleHQtYWxpZ246IGxlZnQ7CgkJbWluLXdpZHRoOiBtaW4oNjAlLCBtaW4tY29udGVudCk7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCAubGFiZWwgewoJCWZsZXg6IDAgMCAwOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5mb3JtYXQgewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCQlmbGV4OiAxIDAgYXV0bzsKCQltaW4td2lkdGg6IDMwcHg7CgkJbWFyZ2luLXJpZ2h0OiAxMHB4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCQlmbGV4LWZsb3c6IGNvbHVtbjsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlwYWRkaW5nLWxlZnQ6IDNweDsKCQl6LWluZGV4OiAyMDAwOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIHsKCQljdXJzb3I6IHBvaW50ZXI7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJcGFkZGluZzogM3B4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKC0zcHgsIC02cHgpOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpub3QoLnNlbGVjdGVkKSB7CgkJbWFyZ2luLXRvcDogM3B4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uLnNlbGVjdGVkIHsKCQlvcmRlcjogLTE7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246aG92ZXIgewoJCWJhY2tncm91bmQtY29sb3I6IHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJfQoJc3Bhbi5jb25maWctdmFsdWUgewoJCWZvbnQtd2VpZ2h0OiBub3JtYWw7CgkJY29sb3I6IHZhcigtLXBsdXRvLW91dHB1dC1jb2xvcik7CgkJZGlzcGxheTogbm9uZTsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIGNhbGMoLTEwMCUgLSAxMHB4KSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLmxhYmVsIHsKCQl1c2VyLXNlbGVjdDogbm9uZTsKCX0KCS5sYWJlbDpob3ZlciBzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCW1pbi13aWR0aDogMTUwcHg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4ubWF0Y2hpbmctY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLW1hY3JvLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5kaWZmZXJlbnQtY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLXRhZy1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9Cjwvc3R5bGU+CmApCgpsZXQgb3JpZ2luYWxfaGVpZ2h0ID0gcGxvdF9vYmoubGF5b3V0LmhlaWdodApsZXQgb3JpZ2luYWxfd2lkdGggPSBwbG90X29iai5sYXlvdXQud2lkdGgKLy8gRm9yIHRoZSBoZWlnaHQgd2UgaGF2ZSB0byBhbHNvIHB1dCBhIGZpeGVkIHZhbHVlIGluIGNhc2UgdGhlIHBsb3QgaXMgcHV0IG9uIGEgbm9uLWZpeGVkLXNpemUgY29udGFpbmVyIChsaWtlIHRoZSBkZWZhdWx0IHdyYXBwZXIpCi8vIFdlIGRlZmluZSBhIHZhcmlhYmxlIHRvIGNoZWNrIHdoZXRoZXIgd2Ugc3RpbGwgaGF2ZSB0byByZW1vdmUgdGhlIGZpeGVkIGhlaWdodApsZXQgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmlyc3RSdW4KbGV0IGNvbnRhaW5lcl9oZWlnaHQgPSBvcmlnaW5hbF9oZWlnaHQgPz8gUExPVC5jb250YWluZXJfaGVpZ2h0ID8/IDQwMApDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX2hlaWdodCArICdweCcKCi8vIFdlIGNyZWF0ZSBhIFByb21pc2UgdmVyc2lvbiBvZiBzZXRUaW1lb3V0CmZ1bmN0aW9uIGRlbGF5KG1zKSB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7Cn0KCi8vIFdlIGltcG9ydCBpbnRlcmFjdCBmb3IgZHJhZ2dpbmcvcmVzaXppbmcKY29uc3QgeyBkZWZhdWx0OiBpbnRlcmFjdCB9ID0gYXdhaXQgaW1wb3J0KCdodHRwczovL2VzbS5zaC9pbnRlcmFjdGpzQDEuMTAuMTknKQoKCmZ1bmN0aW9uIGdldEltYWdlT3B0aW9ucygpIHsKICBjb25zdCBvID0gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogIHJldHVybiB7CiAgICBmb3JtYXQ6IG8uZm9ybWF0ID8/ICJwbmciLAogICAgd2lkdGg6IG8ud2lkdGggPz8gb3JpZ2luYWxfd2lkdGgsCiAgICBoZWlnaHQ6IG8uaGVpZ2h0ID8/IG9yaWdpbmFsX2hlaWdodCwKICAgIHNjYWxlOiBvLnNjYWxlID8/IDEsCiAgICBmaWxlbmFtZTogby5maWxlbmFtZSA/PyAibmV3cGxvdCIsCiAgfTsKfQoKY29uc3QgQ0xJUEJPQVJEX0hFQURFUiA9CiAgQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoIi5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIikgPz8KICBDT05UQUlORVIuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgImFmdGVyYmVnaW4iLAogICAgaHRtbGA8ZGl2IGNsYXNzPSJwbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIGhpZGRlbiI+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmb3JtYXQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+Rm9ybWF0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZvcm1hdCI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB3aWR0aCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5XaWR0aDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSB3aWR0aCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGhlaWdodCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5IZWlnaHQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgaGVpZ2h0Ij48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2NhbGUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+U2NhbGU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgc2NhbGUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzZXQiPlNldDwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB1bnNldCI+VW5zZXQ8L2J1dHRvbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZpbGVuYW1lIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZpbGVuYW1lOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZpbGVuYW1lIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgIDwvZGl2PmAKICApOwoKZnVuY3Rpb24gY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcikgewogIGNvbnN0IHZhbGlkX2NsYXNzZXMgPSBbCiAgICAibWlzc2luZy1jb25maWciLAogICAgIm1hdGNoaW5nLWNvbmZpZyIsCiAgICAiZGlmZmVyZW50LWNvbmZpZyIsCiAgXTsKICBmdW5jdGlvbiBzZXRDbGFzcyhjbCkgewogICAgZm9yIChjb25zdCBuYW1lIG9mIHZhbGlkX2NsYXNzZXMpIHsKICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUobmFtZSwgbmFtZSA9PSBjbCk7CiAgICB9CiAgfQogIC8vIFdlIHVzZSB0aGUgY3VzdG9tIGdldHRlcnMgd2UnbGwgc2V0IHVwIGluIHRoZSBjb250YWluZXIKICBjb25zdCB7IHVpX3ZhbHVlLCBjb25maWdfdmFsdWUsIGNvbmZpZ19zcGFuLCBrZXkgfSA9IGNvbnRhaW5lcjsKICBpZiAoY29uZmlnX3ZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgIHNldENsYXNzKCJtaXNzaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBpcyBub3QgcHJlc2VudCBpbiB0aGUgY29uZmlnLmA7CiAgfSBlbHNlIGlmICh1aV92YWx1ZSA9PSBjb25maWdfdmFsdWUpIHsKICAgIHNldENsYXNzKCJtYXRjaGluZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIHRoZSBzYW1lIHZhbHVlIGluIHRoZSBjb25maWcgYW5kIGluIHRoZSBoZWFkZXIuYDsKICB9IGVsc2UgewogICAgc2V0Q2xhc3MoImRpZmZlcmVudC1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIGEgZGlmZmVyZW50IHZhbHVlICg8ZW0+JHtjb25maWdfdmFsdWV9PC9lbT4pIGluIHRoZSBjb25maWcuYDsKICB9CiAgLy8gQWRkIGluZm8gYWJvdXQgc2V0dGluZyBhbmQgdW5zZXR0aW5nCiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIG9uIHRoZSBsYWJlbCA8ZW0+PGI+b25jZTwvYj48L2VtPiB0byBzZXQgdGhlIGN1cnJlbnQgVUkgdmFsdWUgaW4gdGhlIGNvbmZpZy5gCiAgKTsKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgPGVtPjxiPnR3aWNlPC9iPjwvZW0+IHRvIHJlbW92ZSB0aGlzIGtleSBmcm9tIHRoZSBjb25maWcuYAogICk7Cn0KCmNvbnN0IHZhbGlkX2Zvcm1hdHMgPSBbInBuZyIsICJzdmciLCAid2VicCIsICJqcGVnIiwgImZ1bGwtanNvbiJdOwpmdW5jdGlvbiBpbml0aWFsaXplVUlWYWx1ZVNwYW4oc3Bhbiwga2V5LCB2YWx1ZSkgewogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSBrZXkgPT09ICJmb3JtYXQiID8gImZhbHNlIiA6ICJ0cnVlIjsKICBsZXQgcGFyc2UgPSAoeCkgPT4geDsKICBsZXQgdXBkYXRlID0gKHgpID0+IChzcGFuLnRleHRDb250ZW50ID0geCk7CiAgaWYgKGtleSA9PT0gIndpZHRoIiB8fCBrZXkgPT09ICJoZWlnaHQiKSB7CiAgICBwYXJzZSA9ICh4KSA9PiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoeCkpOwogIH0gZWxzZSBpZiAoa2V5ID09PSAic2NhbGUiKSB7CiAgICBwYXJzZSA9IHBhcnNlRmxvYXQ7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAvLyBXZSByZW1vdmUgY29udGVudEVkaXRhYmxlCiAgICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9ICJmYWxzZSI7CiAgICAvLyBIZXJlIHdlIGZpcnN0IGFkZCB0aGUgc3Vic3BhbnMgZm9yIGVhY2ggb3B0aW9uCiAgICBjb25zdCBvcHRzX2RpdiA9IHNwYW4uYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2IGNsYXNzPSJmb3JtYXQtb3B0aW9ucyI+PC9kaXY+YCk7CiAgICBmb3IgKGNvbnN0IGZtdCBvZiB2YWxpZF9mb3JtYXRzKSB7CiAgICAgIGNvbnN0IG9wdCA9IG9wdHNfZGl2LmFwcGVuZENoaWxkKAogICAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImZvcm1hdC1vcHRpb24gJHtmbXR9Ij4ke2ZtdH08L3NwYW4+YAogICAgICApOwogICAgICBvcHQub25jbGljayA9IChlKSA9PiB7CiAgICAgICAgc3Bhbi52YWx1ZSA9IG9wdC50ZXh0Q29udGVudDsKICAgICAgfTsKICAgIH0KICAgIHBhcnNlID0gKHgpID0+IHsKICAgICAgcmV0dXJuIHZhbGlkX2Zvcm1hdHMuaW5jbHVkZXMoeCkgPyB4IDogbG9jYWxWYWx1ZTsKICAgIH07CiAgICB1cGRhdGUgPSAoeCkgPT4gewogICAgICBmb3IgKGNvbnN0IG9wdCBvZiBvcHRzX2Rpdi5jaGlsZHJlbikgewogICAgICAgIG9wdC5jbGFzc0xpc3QudG9nZ2xlKCJzZWxlY3RlZCIsIG9wdC50ZXh0Q29udGVudCA9PT0geCk7CiAgICAgIH0KICAgIH07CiAgfSBlbHNlIHsKICAgIC8vIFdlIG9ubHkgaGF2ZSBmaWxlbmFtZSBoZXJlCiAgfQogIGxldCBsb2NhbFZhbHVlOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIGxvY2FsVmFsdWU7CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIGlmICh2YWwgIT09ICIiKSB7CiAgICAgICAgbG9jYWxWYWx1ZSA9IHBhcnNlKHZhbCk7CiAgICAgIH0KICAgICAgdXBkYXRlKGxvY2FsVmFsdWUpOwogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7CiAgLy8gV2UgYWxzbyBhc3NpZ24gYSBsaXN0ZW5lciBzbyB0aGF0IHRoZSBlZGl0YWJsZSBpcyBibHVycmVkIHdoZW4gZW50ZXIgaXMgcHJlc3NlZAogIHNwYW4ub25rZXlkb3duID0gKGUpID0+IHsKICAgIGlmIChlLmtleUNvZGUgPT09IDEzKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgc3Bhbi5ibHVyKCk7CiAgICB9CiAgfTsKICBzcGFuLnZhbHVlID0gdmFsdWU7Cn0KCmZ1bmN0aW9uIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oc3Bhbiwga2V5KSB7CiAgLy8gSGVyZSB3ZSBtb3N0bHkgd2FudCB0byBkZWZpbmUgdGhlIHNldHRlciBhbmQgZ2V0dGVyCiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgLy8gaWYgdW5kZWZpbmVkIGlzIHBhc3NlZCwgd2UgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBvcHRpb25zCiAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGRlbGV0ZSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XSA9IHZhbDsKICAgICAgfQogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7Cn0KCmNvbnN0IGNvbmZpZ19zcGFucyA9IHt9Owpmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhnZXRJbWFnZU9wdGlvbnMoKSkpIHsKICBjb25zdCBjb250YWluZXIgPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoYC5jbGlwYm9hcmQtc3Bhbi4ke2tleX1gKTsKICBjb25zdCBsYWJlbCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIubGFiZWwiKTsKICAvLyBXZSBnaXZlIHRoZSBsYWJlbCBhIGZ1bmN0aW9uIHRoYXQgb24gc2luZ2xlIGNsaWNrIHdpbGwgc2V0IHRoZSBjdXJyZW50IHZhbHVlIGFuZCB3aXRoIGRvdWJsZSBjbGljayB3aWxsIHVuc2V0IGl0CiAgbGFiZWwub25jbGljayA9IER1YWxDbGljaygKICAgICgpID0+IHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0sCiAgICAoZSkgPT4gewogICAgICBjb25zb2xlLmxvZygiZSIsIGUpOwogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSB1bmRlZmluZWQ7CiAgICB9CiAgKTsKICBjb25zdCB1aV92YWx1ZV9zcGFuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtdmFsdWUiKTsKICBjb25zdCBjb25maWdfdmFsdWVfc3BhbiA9CiAgICBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNvbmZpZy12YWx1ZSIpID8/CiAgICBsYWJlbC5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAgICJhZnRlcmJlZ2luIiwKICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iY29uZmlnLXZhbHVlIj48L3NwYW4+YAogICAgKTsKICAvLyBBc3NpbmcgdGhlIHR3byBzcGFucyBhcyBwcm9wZXJ0aWVzIG9mIHRoZSBjb250YWluaW5nIHNwYW4KICBjb250YWluZXIudWlfc3BhbiA9IHVpX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmNvbmZpZ19zcGFuID0gY29uZmlnX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmtleSA9IGtleTsKICBjb25maWdfc3BhbnNba2V5XSA9IGNvbnRhaW5lcjsKICBpZiAoZmlyc3RSdW4pIHsKICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA9CiAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICAgIC8vIFdlIGRvIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdmFsdWUgc3BhbgogICAgaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHVpX3ZhbHVlX3NwYW4sIGtleSwgdmFsdWUpOwogICAgLy8gVGhlbiB3ZSBpbml0aWFsaXplIHRoZSBjb25maWcgdmFsdWUKICAgIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oY29uZmlnX3ZhbHVlX3NwYW4sIGtleSk7CiAgICAvLyBXZSBwdXQgc29tZSBjb252ZW5pZW5jZSBnZXR0ZXJzL3NldHRlcnMKICAgIC8vIHVpX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJ1aV92YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiB1aV92YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICB1aV92YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgICAvLyBjb25maWdfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgImNvbmZpZ192YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICB9Cn0KCi8vIFRoZXNlIG9iamVjdHMgd2lsbCBjb250YWluIHRoZSBkZWZhdWx0IHZhbHVlCgovLyBUaGlzIGNvZGUgdXBkYXRlcyB0aGUgaW1hZ2Ugb3B0aW9ucyBpbiB0aGUgUExPVCBjb25maWcgd2l0aCB0aGUgcHJvdmlkZWQgb25lcwpmdW5jdGlvbiBzZXRJbWFnZU9wdGlvbnMobykgewogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gb1trZXldOwogIH0KfQpmdW5jdGlvbiB1bnNldEltYWdlT3B0aW9ucygpIHsKICBzZXRJbWFnZU9wdGlvbnMoe30pOwp9Cgpjb25zdCBzZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4uc2V0Iik7CmNvbnN0IHVuc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnVuc2V0Iik7CmlmIChmaXJzdFJ1bikgewogIHNldF9idXR0b24ub25jbGljayA9IChlKSA9PiB7CiAgICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0KICB9OwogIHVuc2V0X2J1dHRvbi5vbmNsaWNrID0gdW5zZXRJbWFnZU9wdGlvbnM7Cn0KCi8vIFdlIGFkZCBhIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBjbGlwYm9hcmQgaXMgcG9wcGVkIG91dApDT05UQUlORVIuaXNQb3BwZWRPdXQgPSAoKSA9PiB7CiAgcmV0dXJuIENPTlRBSU5FUi5jbGFzc0xpc3QuY29udGFpbnMoInBvcHBlZC1vdXQiKTsKfTsKCkNMSVBCT0FSRF9IRUFERVIub25tb3VzZWRvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHsKICBpZiAoZXZlbnQudGFyZ2V0Lm1hdGNoZXMoInNwYW4uY2xpcGJvYXJkLXZhbHVlIikpIHsKICAgIGNvbnNvbGUubG9nKCJXZSBkb24ndCBtb3ZlISIpOwogICAgcmV0dXJuOwogIH0KICBjb25zdCBzdGFydCA9IHsKICAgIGxlZnQ6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLmxlZnQpLAogICAgdG9wOiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS50b3ApLAogICAgWDogZXZlbnQucGFnZVgsCiAgICBZOiBldmVudC5wYWdlWSwKICB9OwogIGZ1bmN0aW9uIG1vdmVBdChldmVudCwgc3RhcnQpIHsKICAgIGNvbnN0IHRvcCA9IGV2ZW50LnBhZ2VZIC0gc3RhcnQuWSArIHN0YXJ0LnRvcCArICJweCI7CiAgICBjb25zdCBsZWZ0ID0gZXZlbnQucGFnZVggLSBzdGFydC5YICsgc3RhcnQubGVmdCArICJweCI7CiAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9IHRvcDsKICB9CgogIC8vIG1vdmUgb3VyIGFic29sdXRlbHkgcG9zaXRpb25lZCBiYWxsIHVuZGVyIHRoZSBwb2ludGVyCiAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQpIHsKICAgIG1vdmVBdChldmVudCwgc3RhcnQpOwogIH0KCiAgLy8gV2UgdXNlIHRoaXMgdG8gcmVtb3ZlIHRoZSBtb3VzZW1vdmUgd2hlbiBjbGlja2luZyBvdXRzaWRlIG9mIHRoZSBjb250YWluZXIKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICAvLyBtb3ZlIHRoZSBjb250YWluZXIgb24gbW91c2Vtb3ZlCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgb25Nb3VzZU1vdmUsIHsKICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsCiAgfSk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgY2xlYW5VcCgpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7CgogIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICBjb25zb2xlLmxvZygiY2xlYW5pbmcgdXAgdGhlIHBsb3QgbW92ZSBsaXN0ZW5lciIpOwogICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBudWxsOwogIH0KCiAgLy8gKDMpIGRyb3AgdGhlIGJhbGwsIHJlbW92ZSB1bm5lZWRlZCBoYW5kbGVycwogIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gY2xlYW5VcDsKfTsKCmZ1bmN0aW9uIHNlbmRUb0NsaXBib2FyZChibG9iKSB7CiAgaWYgKCFuYXZpZ2F0b3IuY2xpcGJvYXJkKSB7CiAgICBhbGVydCgKICAgICAgIlRoZSBDbGlwYm9hcmQgQVBJIGRvZXMgbm90IHNlZW0gdG8gYmUgYXZhaWxhYmxlLCBtYWtlIHN1cmUgdGhlIFBsdXRvIG5vdGVib29rIGlzIGJlaW5nIHVzZWQgZnJvbSBlaXRoZXIgbG9jYWxob3N0IG9yIGFuIGh0dHBzIHNvdXJjZS4iCiAgICApOwogIH0KICBuYXZpZ2F0b3IuY2xpcGJvYXJkCiAgICAud3JpdGUoWwogICAgICBuZXcgQ2xpcGJvYXJkSXRlbSh7CiAgICAgICAgLy8gVGhlIGtleSBpcyBkZXRlcm1pbmVkIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBibG9iJ3MgdHlwZS4KICAgICAgICBbYmxvYi50eXBlXTogYmxvYiwKICAgICAgfSksCiAgICBdKQogICAgLnRoZW4oCiAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICBjb25zb2xlLmxvZygiQXN5bmM6IENvcHlpbmcgdG8gY2xpcGJvYXJkIHdhcyBzdWNjZXNzZnVsISIpOwogICAgICB9LAogICAgICBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiQXN5bmM6IENvdWxkIG5vdCBjb3B5IHRleHQ6ICIsIGVycik7CiAgICAgIH0KICAgICk7Cn0KCmZ1bmN0aW9uIGNvcHlJbWFnZVRvQ2xpcGJvYXJkKCkgewogIC8vIFdlIGV4dHJhY3QgdGhlIGltYWdlIG9wdGlvbnMgZnJvbSB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycyAoaWYgdGhleSBleGlzdCkKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LiBXZSBhbHNvIGlnbm9yZSBmb3JtYXQgYmVjYXVzZSB0aGUgY2xpcGJvYXJkIG9ubHkgc3VwcG9ydHMgcG5nLgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gImZvcm1hdCIpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LnRvSW1hZ2UoUExPVCwgY29uZmlnKS50aGVuKGZ1bmN0aW9uIChkYXRhVXJsKSB7CiAgICBmZXRjaChkYXRhVXJsKQogICAgICAudGhlbigocmVzKSA9PiByZXMuYmxvYigpKQogICAgICAudGhlbigoYmxvYikgPT4gewogICAgICAgIGNvbnN0IHBhc3RlX3JlY2VpdmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigncGFzdGUtcmVjZWl2ZXIucGx1dG9wbG90bHknKQogICAgICAgIGlmIChwYXN0ZV9yZWNlaXZlcikgewogICAgICAgICAgcGFzdGVfcmVjZWl2ZXIuYXR0YWNoSW1hZ2UoZGF0YVVybCwgQ09OVEFJTkVSKQogICAgICAgIH0KICAgICAgICBzZW5kVG9DbGlwYm9hcmQoYmxvYikKICAgICAgfSk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHNhdmVJbWFnZVRvRmlsZSgpIHsKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS5kb3dubG9hZEltYWdlKFBMT1QsIGNvbmZpZyk7Cn0KCmxldCBjb250YWluZXJfcmVjdCA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCwgdG9wOiAwLCBsZWZ0OiAwIH07CmZ1bmN0aW9uIHVucG9wX2NvbnRhaW5lcihjbCkgewogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgZmFsc2UpOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBmYWxzZSk7CiAgLy8gV2UgZml4IHRoZSBoZWlnaHQgYmFjayB0byB0aGUgdmFsdWUgaXQgaGFkIGJlZm9yZSBwb3BvdXQsIGFsc28gc2V0dGluZyB0aGUgZmxhZyB0byBzaWduYWwgdGhhdCB1cG9uIGZpcnN0IHJlc2l6ZSB3ZSByZW1vdmUgdGhlIGZpeGVkIGlubGluZS1zdHlsZQogIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQgKyAicHgiOwogIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IHRydWU7CiAgLy8gV2Ugc2V0IHRoZSBvdGhlciBmaXhlZCBpbmxpbmUtc3R5bGVzIHRvIG51bGwKICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICBDT05UQUlORVIuc3R5bGUudG9wID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBXZSBhbHNvIHJlbW92ZSB0aGUgQ0xJUEJPQVJEX0hFQURFUgogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSAiIjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBGaW5hbGx5IHdlIHJlbW92ZSB0aGUgaGlkZGVuIGNsYXNzIHRvIHRoZSBoZWFkZXIKICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIHRydWUpOwogIHJldHVybjsKfQpmdW5jdGlvbiBwb3BvdXRfY29udGFpbmVyKG9wdHMpIHsKICBjb25zdCBjbCA9IG9wdHM/LmNsOwogIGNvbnN0IHRhcmdldF9jb250YWluZXJfc2l6ZSA9IG9wdHM/LnRhcmdldF9jb250YWluZXJfc2l6ZSA/PyB7fTsKICBjb25zdCB0YXJnZXRfcGxvdF9zaXplID0gb3B0cz8udGFyZ2V0X3Bsb3Rfc2l6ZSA/PyB7fTsKICBpZiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIHJldHVybiB1bnBvcF9jb250YWluZXIoY2wpOwogIH0KICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgY2wgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdHJ1ZSk7CiAgLy8gV2UgZXh0cmFjdCB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjb250YWluZXIsIHNhdmUgdGhlbSBhbmQgZml4IHRoZW0KICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9ID0gQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogIGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfTsKICAvLyBXZSBzYXZlIHRoZSBjdXJyZW50IHBsb3Qgc2l6ZSBiZWZvcmUgd2UgcG9wIGFzIGl0IHdpbGwgZmlsbCB0aGUgc2NyZWVuCiAgY29uc3QgY3VycmVudF9wbG90X3NpemUgPSB7CiAgICB3aWR0aDogUExPVC5fZnVsbExheW91dC53aWR0aCwKICAgIGhlaWdodDogUExPVC5fZnVsbExheW91dC5oZWlnaHQsCiAgfTsKICAvLyBXZSBoYXZlIHRvIHNhdmUgdGhlIHBhZCBkYXRhIGJlZm9yZSBwb3BwaW5nIHNvIHdlIGNhbiByZXNpemUgcHJlY2lzZWx5CiAgY29uc3QgcGFkID0ge307CiAgcGFkLnVucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgdHJ1ZSk7CiAgcGFkLnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICAvLyBXZSBkbyB0b3AgYW5kIGxlZnQgYmFzZWQgb24gdGhlIGN1cnJlbnQgcmVjdAogIGZvciAoY29uc3Qga2V5IG9mIFsidG9wIiwgImxlZnQiXSkgewogICAgY29uc3Qgc3RhcnRfdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY29udGFpbmVyX3JlY3Rba2V5XTsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgZm9yIChjb25zdCBraW5kIG9mIFsicGFkZGluZyIsICJib3JkZXIiXSkgewogICAgICBvZmZzZXQgKz0gcGFkLnBvcHBlZFtraW5kXVtrZXldIC0gcGFkLnVucG9wcGVkW2tpbmRdW2tleV07CiAgICB9CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHN0YXJ0X3ZhbCAtIG9mZnNldCArICJweCI7CiAgICBpZiAoa2V5ID09PSAibGVmdCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIC8vIFdlIGNvbXB1dGUgdGhlIHdpZHRoIGFuZCBoZWlnaHQgZGVwZW5kaW5nIG9uIGV2ZW50dWFsIGNvbmZpZyBkYXRhCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoewogICAgd2lkdGg6CiAgICAgIHRhcmdldF9wbG90X3NpemUud2lkdGggPz8KICAgICAgY29uZmlnX3NwYW5zLndpZHRoLmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS5oZWlnaHQgPz8KICAgICAgY29uZmlnX3NwYW5zLmhlaWdodC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUuaGVpZ2h0LAogIH0pOwogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIGNvbnN0IHZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNzeltrZXldOwogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSB2YWwgKyAicHgiOwogICAgaWYgKGtleSA9PT0gIndpZHRoIikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCBmYWxzZSk7CiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgdW5wb3BfY29udGFpbmVyKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKfQoKQ09OVEFJTkVSLnBvcE91dCA9IHBvcG91dF9jb250YWluZXI7CgpmdW5jdGlvbiBEdWFsQ2xpY2soc2luZ2xlX2Z1bmMsIGRibF9mdW5jKSB7CiAgbGV0IG5jbGlja3MgPSAwOwogIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykgewogICAgbmNsaWNrcyArPSAxOwogICAgaWYgKG5jbGlja3MgPiAxKSB7CiAgICAgIGRibF9mdW5jKC4uLmFyZ3MpOwogICAgICBuY2xpY2tzID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIGRlbGF5KDMwMCkudGhlbigoKSA9PiB7CiAgICAgICAgaWYgKG5jbGlja3MgPT0gMSkgewogICAgICAgICAgc2luZ2xlX2Z1bmMoLi4uYXJncyk7CiAgICAgICAgfQogICAgICAgIG5jbGlja3MgPSAwOwogICAgICB9KTsKICAgIH0KICB9Owp9CgovLyBXZSByZW1vdmUgdGhlIGRlZmF1bHQgZG93bmxvYWQgaW1hZ2UgYnV0dG9uCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSwKICBbInRvSW1hZ2UiXQopOwovLyBXZSBhZGQgdGhlIGN1c3RvbSBidXR0b24gdG8gdGhlIG1vZGViYXIKcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkLAogIFsKICAgIHsKICAgICAgbmFtZTogIkNvcHkgUE5HIHRvIENsaXBib2FyZCIsCiAgICAgIGljb246IHsKICAgICAgICBoZWlnaHQ6IDUyMCwKICAgICAgICB3aWR0aDogNTIwLAogICAgICAgIHBhdGg6ICJNMjgwIDY0aDQwYzM1LjMgMCA2NCAyOC43IDY0IDY0VjQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEg2NGMtMzUuMyAwLTY0LTI4LjctNjQtNjRWMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0aDQwIDkuNkMxMjEgMjcuNSAxNTMuMyAwIDE5MiAwczcxIDI3LjUgNzguNCA2NEgyODB6TTY0IDExMmMtOC44IDAtMTYgNy4yLTE2IDE2VjQ0OGMwIDguOCA3LjIgMTYgMTYgMTZIMzIwYzguOCAwIDE2LTcuMiAxNi0xNlYxMjhjMC04LjgtNy4yLTE2LTE2LTE2SDMwNHYyNGMwIDEzLjMtMTAuNyAyNC0yNCAyNEgxOTIgMTA0Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNFYxMTJINjR6bTEyOC04YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHoiLAogICAgICB9LAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soY29weUltYWdlVG9DbGlwYm9hcmQsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKCk7CiAgICAgIH0pLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIkRvd25sb2FkIEltYWdlIiwKICAgICAgaWNvbjogUGxvdGx5Lkljb25zLmNhbWVyYSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKHNhdmVJbWFnZVRvRmlsZSwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoeyBjbDogImZpbGVzYXZlIiB9KTsKICAgICAgfSksCiAgICB9LAogIF0KKTsKCmZ1bmN0aW9uIGdldE9mZnNldERhdGEoZWwpIHsKICBsZXQgY3MgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgbnVsbCk7CiAgY29uc3Qgb2RhdGEgPSB7CiAgICBwYWRkaW5nOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgfSwKICAgIGJvcmRlcjogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgfQogIH07CiAgaWYgKGVsID09PSBQTE9UKSB7CiAgICAvLyBGb3IgdGhlIFBMT1Qgd2UgYWxzbyB3YW50IHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBvZmZzZXQKICAgIG9kYXRhLm9mZnNldCA9IHsKICAgICAgdG9wOiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldFRvcCA6IDAsCiAgICAgIGxlZnQ6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0TGVmdCA6IDAsCiAgICB9CiAgfQogIHJldHVybiBvZGF0YTsKfQpmdW5jdGlvbiBnZXRTaXplRGF0YSgpIHsKICBjb25zdCBkYXRhID0gewogICAgcGxvdF9wYWQ6IGdldE9mZnNldERhdGEoUExPVCksCiAgICBwbG90X3JlY3Q6IFBMT1QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgICBjb250YWluZXJfcGFkOiBnZXRPZmZzZXREYXRhKENPTlRBSU5FUiksCiAgICBjb250YWluZXJfcmVjdDogQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogIH07CiAgcmV0dXJuIGRhdGE7Cn0KZnVuY3Rpb24gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGNvbnN0IGNvbXB1dGVkX3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIGNvbnN0IG9mZnNldHMgPSBjb21wdXRlZF9zaXplLm9mZnNldHM7CgogIGNvbnN0IHBsb3RfZGF0YSA9IHsKICAgIHdpZHRoOiB3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiBoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfTsKCiAgcmV0dXJuIHsKICAgIHdpZHRoOiAod2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCkgKyBvZmZzZXRzLndpZHRoLAogICAgaGVpZ2h0OiAoaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0KSArIG9mZnNldHMuaGVpZ2h0LAogICAgbm9DaGFuZ2U6IHdpZHRoID09IGNvbXB1dGVkX3NpemUud2lkdGggJiYgaGVpZ2h0ID09IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH0KfQoKLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGNoYW5nZSB0aGUgY29udGFpbmVyIHNpemUgc28gdGhhdCB0aGUgcmVzdWx0aW5nIHBsb3Qgd2lsbCBiZSBtYXRjaGluZyB0aGUgcHJvdmlkZWQgc3BlY3MKZnVuY3Rpb24gY2hhbmdlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgaWYgKCFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgY29uc29sZS5sb2coIlRyaWVkIHRvIGNoYW5nZSBjb250YWluZXIgc2l6ZSB3aGVuIG5vdCBwb3BwZWQsIGlnbm9yaW5nIik7CiAgICByZXR1cm47CiAgfQoKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEpOwoKICBpZiAoY3N6Lm5vQ2hhbmdlKSB7CiAgICBjb25zb2xlLmxvZygiU2l6ZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50LCBpZ25vcmluZyIpOwogICAgcmV0dXJuCiAgfQogIC8vIFdlIGFyZSBub3cgZ29pbmcgdG8gc2V0IGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGNvbnRhaW5lcgogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gY3N6W2tleV0gKyAicHgiOwogIH0KfQovLyBXZSBub3cgY3JlYXRlIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgdXBkYXRlIHRoZSBwbG90IGJhc2VkIG9uIHRoZSB2YWx1ZXMgc3BlY2lmaWVkCmZ1bmN0aW9uIHVwZGF0ZUZyb21IZWFkZXIoKSB7CiAgY29uc3QgaGVhZGVyX2RhdGEgPSB7CiAgICBoZWlnaHQ6IGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUsCiAgICB3aWR0aDogY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlLAogIH07CiAgY2hhbmdlQ29udGFpbmVyU2l6ZShoZWFkZXJfZGF0YSk7Cn0KLy8gV2UgYXNzaWduIHRoaXMgZnVuY3Rpb24gdG8gdGhlIG9uYmx1ciBldmVudCBvZiB3aWR0aCBhbmQgaGVpZ2h0CmlmIChmaXJzdFJ1bikgewogIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLnVpX3NwYW4ub25ibHVyID0gKGUpID0+IHsKICAgICAgY29udGFpbmVyLnVpX3ZhbHVlID0gY29udGFpbmVyLnVpX3NwYW4udGV4dENvbnRlbnQ7CiAgICAgIHVwZGF0ZUZyb21IZWFkZXIoKTsKICAgIH07CiAgfQp9Ci8vIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIHBsb3Qgc2l6ZSB0byB1c2UgZm9yIHJlbGF5b3V0IGFzIGEgZnVuY3Rpb24gb2YgdGhlIGNvbnRhaW5lciBzaXplCmZ1bmN0aW9uIGNvbXB1dGVQbG90U2l6ZShkYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIC8vIFJlbW92ZSBQYWRkaW5nCiAgY29uc3QgeyBjb250YWluZXJfcGFkLCBwbG90X3BhZCwgY29udGFpbmVyX3JlY3QgfSA9IGRhdGE7CiAgY29uc3Qgb2Zmc2V0cyA9IHsKICAgIHdpZHRoOgogICAgICBwbG90X3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLndpZHRoICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LmxlZnQgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci53aWR0aCwKICAgIGhlaWdodDoKICAgICAgcGxvdF9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBwbG90X3BhZC5ib3JkZXIuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LnRvcCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci5oZWlnaHQsCiAgfTsKICBjb25zdCBzeiA9IHsKICAgIHdpZHRoOiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LndpZHRoIC0gb2Zmc2V0cy53aWR0aCksCiAgICBoZWlnaHQ6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3QuaGVpZ2h0IC0gb2Zmc2V0cy5oZWlnaHQpLAogICAgb2Zmc2V0cywKICB9OwogIHJldHVybiBzejsKfQoKLy8gQ3JlYXRlIHRoZSByZXNpemVPYnNlcnZlciB0byBtYWtlIHRoZSBwbG90IGV2ZW4gbW9yZSByZXNwb25zaXZlISA6bWFnaWM6CmNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7CiAgY29uc3Qgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpOwogIGNvbnN0IHtjb250YWluZXJfcmVjdCwgY29udGFpbmVyX3BhZH0gPSBzaXplRGF0YTsKICBsZXQgcGxvdF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICAvLyBXZSBzYXZlIHRoZSBoZWlnaHQgaW4gdGhlIFBMT1Qgb2JqZWN0CiAgUExPVC5jb250YWluZXJfaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0OwogIC8vIFdlIGRlYWwgd2l0aCBzb21lIHN0dWZmIGlmIHRoZSBjb250YWluZXIgaXMgcG9wcHBlZAogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSBjb250YWluZXJfcmVjdC53aWR0aCArICJweCI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gY29udGFpbmVyX3JlY3QubGVmdCArICJweCI7CiAgY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS5oZWlnaHQ7CiAgY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlID0gcGxvdF9zaXplLndpZHRoOwogIC8qIAoJCVRoZSBhZGRpdGlvbiBvZiB0aGUgaW52YWxpZCBhcmd1bWVudCBgcGx1dG9yZXNpemVgIHNlZW1zIHRvIGZpeCB0aGUgcHJvYmxlbSB3aXRoIGNhbGxpbmcgYHJlbGF5b3V0YCBzaW1wbHkgd2l0aCBge2F1dG9zaXplOiB0cnVlfWAgYXMgdXBkYXRlIGJyZWFraW5nIG1vdXNlIHJlbGF5b3V0IGV2ZW50cyB0cmFja2luZy4gCgkJU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wbG90bHkvcGxvdGx5LmpzL2lzc3Vlcy82MTU2IGZvciBkZXRhaWxzCgkJKi8KICBsZXQgY29uZmlnID0gewogICAgLy8gSWYgdGhpcyBpcyBwb3BwZWQgb3V0LCB3ZSBpZ25vcmUgdGhlIG9yaWdpbmFsIHdpZHRoL2hlaWdodAogICAgd2lkdGg6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX3dpZHRoKSA/PyBwbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX2hlaWdodCkgPz8gcGxvdF9zaXplLmhlaWdodCwKICAgIHBsdXRvcmVzaXplOiB0cnVlLAogIH07CiAgUGxvdGx5LnJlbGF5b3V0KFBMT1QsIGNvbmZpZykudGhlbigoKSA9PiB7CiAgICBpZiAocmVtb3ZlX2NvbnRhaW5lcl9zaXplICYmICFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBhdm9pZCB0aGUgZmlyc3QgcmVzaXplIHVwb24gcGxvdCBjcmVhdGlvbiB0byBhbHJlYWR5IGJlIHdpdGhvdXQgYSBmaXhlZCBoZWlnaHQKICAgICAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9ICIiOwogICAgICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICAgICAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmFsc2U7CiAgICB9CiAgfSk7Cn0pOwoKcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShDT05UQUlORVIpOwoKClBsb3RseS5yZWFjdChQTE9ULCBwbG90X29iaikudGhlbigoKSA9PiB7CgkvLyBBc3NpZ24gdGhlIFBsb3RseSBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhwbG90bHlfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1Qub24oa2V5LCBsaXN0ZW5lcikKCQl9Cgl9CgkvLyBBc3NpZ24gdGhlIEpTIGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKGpzX2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULmFkZEV2ZW50TGlzdGVuZXIoa2V5LCBsaXN0ZW5lciwgewoJCQkJc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbAoJCQl9KQoJCX0KCX0KfQopCgoKaW52YWxpZGF0aW9uLnRoZW4oKCkgPT4gewoJLy8gUmVtb3ZlIGFsbCBwbG90bHkgbGlzdGVuZXJzCglQTE9ULnJlbW92ZUFsbExpc3RlbmVycygpCgkvLyBSZW1vdmUgYWxsIEpTIGxpc3RlbmVycwoJY29udHJvbGxlci5hYm9ydCgpCgkvLyBSZW1vdmUgdGhlIHJlc2l6ZU9ic2VydmVyCglyZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCkKfSkKCgoKCQlyZXR1cm4gQ09OVEFJTkVSCgk8L3NjcmlwdD4KpG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv6MVEnDfsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SRjMDJmMzg5OC0xMGNiLTRmMWUtYjVlZi1lYjQyYjgwM2JhZWS5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4CejXWtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5HZNWIzYjg0MDhjLTgxODEtMTFlZi0xNGViLWUxYzU2OWI4YmIyOS85NTA0NTQyODE2NTRlZmU3uGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDJlZTdiYTQ3LTAyZTUtNGIwMi1hMTYyLWRkYmQ1ZWQ0N2M3YoqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnaaokJPHNjcmlwdCBpZD0ncGxvdF8xJz4KCQkvLyBXZSBzdGFydCBieSBwdXR0aW5nIGFsbCB0aGUgdmFyaWFibGUgaW50ZXJwb2xhdGlvbiBoZXJlIGF0IHRoZSBiZWdpbm5pbmcKCQkvLyBXZSBoYXZlIHRvIGNvbnZlcnQgYWxsIHR5cGVkYXJyYXlzIGluIHRoZSBsYXlvdXQgdG8gbm9ybWFsIGFycmF5cy4gU2VlIElzc3VlICMyNQoJCS8vIFdlIHVzZSBsb2Rhc2ggZm9yIHRoaXMgZm9yIGNvbXBhY3RuZXNzCgkJZnVuY3Rpb24gcmVtb3ZlVHlwZWRBcnJheShvKSB7CgkJCXJldHVybiBfLmlzVHlwZWRBcnJheShvKSA/IEFycmF5LmZyb20obykgOgoJCQlfLmlzUGxhaW5PYmplY3QobykgPyBfLm1hcFZhbHVlcyhvLCByZW1vdmVUeXBlZEFycmF5KSA6IAoJCQlvCgkJfQoKCQkvLyBQdWJsaXNoIHRoZSBwbG90IG9iamVjdCB0byBKUwoJCWxldCBwbG90X29iaiA9IF8udXBkYXRlKC8qIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgQWJzdHJhY3RQbHV0b0RpbmdldGplcy5EaXNwbGF5LnB1Ymxpc2hlZF90b19qcyAqLyBnZXRQdWJsaXNoZWRPYmplY3QoImIzYjg0MDhjLTgxODEtMTFlZi0xNGViLWUxYzU2OWI4YmIyOS9kZTIxMTk3OWQyYmE1MmEzIiksICJsYXlvdXQiLCByZW1vdmVUeXBlZEFycmF5KQoJCS8vIEdldCB0aGUgcGxvdGx5IGxpc3RlbmVycwoJCWNvbnN0IHBsb3RseV9saXN0ZW5lcnMgPSB7fQoJCS8vIEdldCB0aGUgSlMgbGlzdGVuZXJzCgkJY29uc3QganNfbGlzdGVuZXJzID0ge30KCQkvLyBEZWFsIHdpdGggZXZlbnR1YWwgY3VzdG9tIGNsYXNzZXMKCQlsZXQgY3VzdG9tX2NsYXNzbGlzdCA9IFtdCgoKCQkvLyBMb2FkIHRoZSBwbG90bHkgbGlicmFyeQoJCWxldCBQbG90bHkgPSB1bmRlZmluZWQKCQl0cnkgewoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiLi9wbG90bHlqcy9wbG90bHlqcy0yLjI2LjIubWluLmpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfSBjYXRjaCAoZSkgewoJCQljb25zb2xlLmxvZygiTG9jYWwgbG9hZCBmYWlsZWQsIHRyeWluZyB3aXRoIHRoZSB3ZWIgZXNtLnNoIHZlcnNpb24iKQoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiaHR0cHM6Ly9lc20uc2gvdjEzNS9wbG90bHkuanMtZGlzdC1taW5AMi4yNi4yL2VzbmV4dC9wbG90bHkuanMtZGlzdC1taW4ubWpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfQoKCQkvLyBDaGVjayBpZiB3ZSBoYXZlIHRvIGZvcmNlIGxvY2FsIG1hdGhqYXggZm9udCBjYWNoZQoJCWlmIChmYWxzZSAmJiB3aW5kb3c/Lk1hdGhKYXg/LmNvbmZpZz8uc3ZnPy5mb250Q2FjaGUgPT09ICdnbG9iYWwnKSB7CgkJCXdpbmRvdy5NYXRoSmF4LmNvbmZpZy5zdmcuZm9udENhY2hlID0gJ2xvY2FsJwoJCX0KCgkJLy8gRmxhZyB0byBjaGVjayBpZiB0aGlzIGNlbGwgd2FzICBtYW51YWxseSByYW4gb3IgcmVhY3RpdmVseSByYW4KY29uc3QgZmlyc3RSdW4gPSB0aGlzID8gZmFsc2UgOiB0cnVlCmNvbnN0IENPTlRBSU5FUiA9IHRoaXMgPz8gaHRtbGA8ZGl2IGNsYXNzPSdwbHV0b3Bsb3RseS1jb250YWluZXInPmAKY29uc3QgUExPVCA9IENPTlRBSU5FUi5xdWVyeVNlbGVjdG9yKCcuanMtcGxvdGx5LXBsb3QnKSA/PyBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2PmApCmNvbnN0IHBhcmVudCA9IENPTlRBSU5FUi5wYXJlbnRFbGVtZW50Ci8vIFdlIHVzZSBhIGNvbnRyb2xsZXIgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVycyB1cG9uIGludmFsaWRhdGlvbgpjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpCi8vIFdlIGhhdmUgdG8gYWRkIHRoaXMgdG8ga2VlcCBzdXBwb3J0aW5nIEBiaW5kIHdpdGggdGhlIG9sZCBBUEkgdXNpbmcgUExPVApQTE9ULmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGUpID0+IHsKCUNPTlRBSU5FUi52YWx1ZSA9IFBMT1QudmFsdWUKCWlmIChlLmJ1YmJsZXMpIHsKCQlyZXR1cm4KCX0KCUNPTlRBSU5FUi5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnaW5wdXQnKSkKfSwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pCgoJLy8gVGhpcyBjcmVhdGUgdGhlIHN0eWxlIHN1YmRpdiBvbiBmaXJzdCBydW4KCWZpcnN0UnVuICYmIENPTlRBSU5FUi5hcHBlbmRDaGlsZChodG1sYAoJPHN0eWxlPgoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciB7CgkJd2lkdGg6IDEwMCU7CgkJaGVpZ2h0OiAxMDAlOwoJCW1pbi1oZWlnaHQ6IDA7CgkJbWluLXdpZHRoOiAwOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciAuanMtcGxvdGx5LXBsb3QgLnBsb3RseSBkaXYgewoJCW1hcmdpbjogMCBhdXRvOyAvLyBUaGlzIGNlbnRlcnMgdGhlIHBsb3QKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIucG9wcGVkLW91dCB7CgkJb3ZlcmZsb3c6IGF1dG87CgkJei1pbmRleDogMTAwMDsKCQlwb3NpdGlvbjogZml4ZWQ7CgkJcmVzaXplOiBib3RoOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMHB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwcHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciB7CgkJZGlzcGxheTogZmxleDsKCQlmbGV4LWZsb3c6IHJvdyB3cmFwOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDEycHg7CgkJcG9zaXRpb246IGZpeGVkOwoJCXotaW5kZXg6IDEwMDE7CgkJY3Vyc29yOiBtb3ZlOwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgLTEwMCUpOwoJCXBhZGRpbmc6IDVweDsKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIHNwYW4gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQlmbGV4OiAxCgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlci5oaWRkZW4gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuY2xpcGJvYXJkLXNwYW4gewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCX0KCS5jbGlwYm9hcmQtdmFsdWUgewoJCXBhZGRpbmctcmlnaHQ6IDVweDsKCQlwYWRkaW5nLWxlZnQ6IDJweDsKCQljdXJzb3I6IHRleHQ7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlmbGV4OiAwIDAgMTAwJTsKCQl0ZXh0LWFsaWduOiBjZW50ZXI7CgkJYm9yZGVyLXRvcDogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCW1hcmdpbi10b3A6IDVweDsKCQlkaXNwbGF5OiBub25lOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5maWxlc2F2ZSAuY2xpcGJvYXJkLXNwYW4uZmlsZW5hbWUgewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5jbGlwYm9hcmQtdmFsdWUuZmlsZW5hbWUgewoJCW1hcmdpbi1sZWZ0OiAzcHg7CgkJdGV4dC1hbGlnbjogbGVmdDsKCQltaW4td2lkdGg6IG1pbig2MCUsIG1pbi1jb250ZW50KTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogaW5saW5lLWZsZXg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IC5sYWJlbCB7CgkJZmxleDogMCAwIDA7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZvcm1hdCB7CgkJcG9zaXRpb246IHJlbGF0aXZlOwoJCWZsZXg6IDEgMCBhdXRvOwoJCW1pbi13aWR0aDogMzBweDsKCQltYXJnaW4tcmlnaHQ6IDEwcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJCWZsZXgtZmxvdzogY29sdW1uOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXBhZGRpbmctbGVmdDogM3B4OwoJCXotaW5kZXg6IDIwMDA7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgewoJCWN1cnNvcjogcG9pbnRlcjsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlwYWRkaW5nOiAzcHg7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTNweCwgLTZweCk7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5mb3JtYXQtb3B0aW9uOm5vdCguc2VsZWN0ZWQpIHsKCQltYXJnaW4tdG9wOiAzcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24uc2VsZWN0ZWQgewoJCW9yZGVyOiAtMTsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpob3ZlciB7CgkJYmFja2dyb3VuZC1jb2xvcjogdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7Cgl9CglzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZm9udC13ZWlnaHQ6IG5vcm1hbDsKCQljb2xvcjogdmFyKC0tcGx1dG8tb3V0cHV0LWNvbG9yKTsKCQlkaXNwbGF5OiBub25lOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgY2FsYygtMTAwJSAtIDEwcHgpKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkubGFiZWwgewoJCXVzZXItc2VsZWN0OiBub25lOwoJfQoJLmxhYmVsOmhvdmVyIHNwYW4uY29uZmlnLXZhbHVlIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJbWluLXdpZHRoOiAxNTBweDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5tYXRjaGluZy1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tbWFjcm8tY29sb3IpOwoJCWZvbnQtd2VpZ2h0OiBib2xkOwoJfQoJLmNsaXBib2FyZC1zcGFuLmRpZmZlcmVudC1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tdGFnLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KPC9zdHlsZT4KYCkKCmxldCBvcmlnaW5hbF9oZWlnaHQgPSBwbG90X29iai5sYXlvdXQuaGVpZ2h0CmxldCBvcmlnaW5hbF93aWR0aCA9IHBsb3Rfb2JqLmxheW91dC53aWR0aAovLyBGb3IgdGhlIGhlaWdodCB3ZSBoYXZlIHRvIGFsc28gcHV0IGEgZml4ZWQgdmFsdWUgaW4gY2FzZSB0aGUgcGxvdCBpcyBwdXQgb24gYSBub24tZml4ZWQtc2l6ZSBjb250YWluZXIgKGxpa2UgdGhlIGRlZmF1bHQgd3JhcHBlcikKLy8gV2UgZGVmaW5lIGEgdmFyaWFibGUgdG8gY2hlY2sgd2hldGhlciB3ZSBzdGlsbCBoYXZlIHRvIHJlbW92ZSB0aGUgZml4ZWQgaGVpZ2h0CmxldCByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmaXJzdFJ1bgpsZXQgY29udGFpbmVyX2hlaWdodCA9IG9yaWdpbmFsX2hlaWdodCA/PyBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPz8gNDAwCkNPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfaGVpZ2h0ICsgJ3B4JwoKLy8gV2UgY3JlYXRlIGEgUHJvbWlzZSB2ZXJzaW9uIG9mIHNldFRpbWVvdXQKZnVuY3Rpb24gZGVsYXkobXMpIHsKICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTsKfQoKLy8gV2UgaW1wb3J0IGludGVyYWN0IGZvciBkcmFnZ2luZy9yZXNpemluZwpjb25zdCB7IGRlZmF1bHQ6IGludGVyYWN0IH0gPSBhd2FpdCBpbXBvcnQoJ2h0dHBzOi8vZXNtLnNoL2ludGVyYWN0anNAMS4xMC4xOScpCgoKZnVuY3Rpb24gZ2V0SW1hZ2VPcHRpb25zKCkgewogIGNvbnN0IG8gPSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPz8ge307CiAgcmV0dXJuIHsKICAgIGZvcm1hdDogby5mb3JtYXQgPz8gInBuZyIsCiAgICB3aWR0aDogby53aWR0aCA/PyBvcmlnaW5hbF93aWR0aCwKICAgIGhlaWdodDogby5oZWlnaHQgPz8gb3JpZ2luYWxfaGVpZ2h0LAogICAgc2NhbGU6IG8uc2NhbGUgPz8gMSwKICAgIGZpbGVuYW1lOiBvLmZpbGVuYW1lID8/ICJuZXdwbG90IiwKICB9Owp9Cgpjb25zdCBDTElQQk9BUkRfSEVBREVSID0KICBDT05UQUlORVIucXVlcnlTZWxlY3RvcigiLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIiKSA/PwogIENPTlRBSU5FUi5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAiYWZ0ZXJiZWdpbiIsCiAgICBodG1sYDxkaXYgY2xhc3M9InBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgaGlkZGVuIj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZvcm1hdCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5Gb3JtYXQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZm9ybWF0Ij48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHdpZHRoIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPldpZHRoOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIHdpZHRoIj48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gaGVpZ2h0IgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkhlaWdodDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBoZWlnaHQiPjwvc3Bhbj5weDwvc3BhbgogICAgICA+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzY2FsZSIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5TY2FsZTo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBzY2FsZSI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHNldCI+U2V0PC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHVuc2V0Ij5VbnNldDwvYnV0dG9uPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gZmlsZW5hbWUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+RmlsZW5hbWU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZmlsZW5hbWUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgPC9kaXY+YAogICk7CgpmdW5jdGlvbiBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKSB7CiAgY29uc3QgdmFsaWRfY2xhc3NlcyA9IFsKICAgICJtaXNzaW5nLWNvbmZpZyIsCiAgICAibWF0Y2hpbmctY29uZmlnIiwKICAgICJkaWZmZXJlbnQtY29uZmlnIiwKICBdOwogIGZ1bmN0aW9uIHNldENsYXNzKGNsKSB7CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgdmFsaWRfY2xhc3NlcykgewogICAgICBjb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZShuYW1lLCBuYW1lID09IGNsKTsKICAgIH0KICB9CiAgLy8gV2UgdXNlIHRoZSBjdXN0b20gZ2V0dGVycyB3ZSdsbCBzZXQgdXAgaW4gdGhlIGNvbnRhaW5lcgogIGNvbnN0IHsgdWlfdmFsdWUsIGNvbmZpZ192YWx1ZSwgY29uZmlnX3NwYW4sIGtleSB9ID0gY29udGFpbmVyOwogIGlmIChjb25maWdfdmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgc2V0Q2xhc3MoIm1pc3NpbmctY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGlzIG5vdCBwcmVzZW50IGluIHRoZSBjb25maWcuYDsKICB9IGVsc2UgaWYgKHVpX3ZhbHVlID09IGNvbmZpZ192YWx1ZSkgewogICAgc2V0Q2xhc3MoIm1hdGNoaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgdGhlIHNhbWUgdmFsdWUgaW4gdGhlIGNvbmZpZyBhbmQgaW4gdGhlIGhlYWRlci5gOwogIH0gZWxzZSB7CiAgICBzZXRDbGFzcygiZGlmZmVyZW50LWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgYSBkaWZmZXJlbnQgdmFsdWUgKDxlbT4ke2NvbmZpZ192YWx1ZX08L2VtPikgaW4gdGhlIGNvbmZpZy5gOwogIH0KICAvLyBBZGQgaW5mbyBhYm91dCBzZXR0aW5nIGFuZCB1bnNldHRpbmcKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgb24gdGhlIGxhYmVsIDxlbT48Yj5vbmNlPC9iPjwvZW0+IHRvIHNldCB0aGUgY3VycmVudCBVSSB2YWx1ZSBpbiB0aGUgY29uZmlnLmAKICApOwogIGNvbmZpZ19zcGFuLmluc2VydEFkamFjZW50SFRNTCgKICAgICJiZWZvcmVlbmQiLAogICAgYDxicj5DbGljayA8ZW0+PGI+dHdpY2U8L2I+PC9lbT4gdG8gcmVtb3ZlIHRoaXMga2V5IGZyb20gdGhlIGNvbmZpZy5gCiAgKTsKfQoKY29uc3QgdmFsaWRfZm9ybWF0cyA9IFsicG5nIiwgInN2ZyIsICJ3ZWJwIiwgImpwZWciLCAiZnVsbC1qc29uIl07CmZ1bmN0aW9uIGluaXRpYWxpemVVSVZhbHVlU3BhbihzcGFuLCBrZXksIHZhbHVlKSB7CiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9IGtleSA9PT0gImZvcm1hdCIgPyAiZmFsc2UiIDogInRydWUiOwogIGxldCBwYXJzZSA9ICh4KSA9PiB4OwogIGxldCB1cGRhdGUgPSAoeCkgPT4gKHNwYW4udGV4dENvbnRlbnQgPSB4KTsKICBpZiAoa2V5ID09PSAid2lkdGgiIHx8IGtleSA9PT0gImhlaWdodCIpIHsKICAgIHBhcnNlID0gKHgpID0+IE1hdGgucm91bmQocGFyc2VGbG9hdCh4KSk7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJzY2FsZSIpIHsKICAgIHBhcnNlID0gcGFyc2VGbG9hdDsKICB9IGVsc2UgaWYgKGtleSA9PT0gImZvcm1hdCIpIHsKICAgIC8vIFdlIHJlbW92ZSBjb250ZW50RWRpdGFibGUKICAgIHNwYW4uY29udGVudEVkaXRhYmxlID0gImZhbHNlIjsKICAgIC8vIEhlcmUgd2UgZmlyc3QgYWRkIHRoZSBzdWJzcGFucyBmb3IgZWFjaCBvcHRpb24KICAgIGNvbnN0IG9wdHNfZGl2ID0gc3Bhbi5hcHBlbmRDaGlsZChodG1sYDxkaXYgY2xhc3M9ImZvcm1hdC1vcHRpb25zIj48L2Rpdj5gKTsKICAgIGZvciAoY29uc3QgZm10IG9mIHZhbGlkX2Zvcm1hdHMpIHsKICAgICAgY29uc3Qgb3B0ID0gb3B0c19kaXYuYXBwZW5kQ2hpbGQoCiAgICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iZm9ybWF0LW9wdGlvbiAke2ZtdH0iPiR7Zm10fTwvc3Bhbj5gCiAgICAgICk7CiAgICAgIG9wdC5vbmNsaWNrID0gKGUpID0+IHsKICAgICAgICBzcGFuLnZhbHVlID0gb3B0LnRleHRDb250ZW50OwogICAgICB9OwogICAgfQogICAgcGFyc2UgPSAoeCkgPT4gewogICAgICByZXR1cm4gdmFsaWRfZm9ybWF0cy5pbmNsdWRlcyh4KSA/IHggOiBsb2NhbFZhbHVlOwogICAgfTsKICAgIHVwZGF0ZSA9ICh4KSA9PiB7CiAgICAgIGZvciAoY29uc3Qgb3B0IG9mIG9wdHNfZGl2LmNoaWxkcmVuKSB7CiAgICAgICAgb3B0LmNsYXNzTGlzdC50b2dnbGUoInNlbGVjdGVkIiwgb3B0LnRleHRDb250ZW50ID09PSB4KTsKICAgICAgfQogICAgfTsKICB9IGVsc2UgewogICAgLy8gV2Ugb25seSBoYXZlIGZpbGVuYW1lIGhlcmUKICB9CiAgbGV0IGxvY2FsVmFsdWU7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwYW4sICJ2YWx1ZSIsIHsKICAgIGdldDogKCkgPT4gewogICAgICByZXR1cm4gbG9jYWxWYWx1ZTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgaWYgKHZhbCAhPT0gIiIpIHsKICAgICAgICBsb2NhbFZhbHVlID0gcGFyc2UodmFsKTsKICAgICAgfQogICAgICB1cGRhdGUobG9jYWxWYWx1ZSk7CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKICAvLyBXZSBhbHNvIGFzc2lnbiBhIGxpc3RlbmVyIHNvIHRoYXQgdGhlIGVkaXRhYmxlIGlzIGJsdXJyZWQgd2hlbiBlbnRlciBpcyBwcmVzc2VkCiAgc3Bhbi5vbmtleWRvd24gPSAoZSkgPT4gewogICAgaWYgKGUua2V5Q29kZSA9PT0gMTMpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBzcGFuLmJsdXIoKTsKICAgIH0KICB9OwogIHNwYW4udmFsdWUgPSB2YWx1ZTsKfQoKZnVuY3Rpb24gaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3BhbihzcGFuLCBrZXkpIHsKICAvLyBIZXJlIHdlIG1vc3RseSB3YW50IHRvIGRlZmluZSB0aGUgc2V0dGVyIGFuZCBnZXR0ZXIKICBjb25zdCBjb250YWluZXIgPSBzcGFuLmNsb3Nlc3QoIi5jbGlwYm9hcmQtc3BhbiIpOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgfSwKICAgIHNldDogKHZhbCkgPT4gewogICAgICAvLyBpZiB1bmRlZmluZWQgaXMgcGFzc2VkLCB3ZSByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIG9wdGlvbnMKICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZGVsZXRlIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgICB9IGVsc2UgewogICAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldID0gdmFsOwogICAgICB9CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKfQoKY29uc3QgY29uZmlnX3NwYW5zID0ge307CmZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGdldEltYWdlT3B0aW9ucygpKSkgewogIGNvbnN0IGNvbnRhaW5lciA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcihgLmNsaXBib2FyZC1zcGFuLiR7a2V5fWApOwogIGNvbnN0IGxhYmVsID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5sYWJlbCIpOwogIC8vIFdlIGdpdmUgdGhlIGxhYmVsIGEgZnVuY3Rpb24gdGhhdCBvbiBzaW5nbGUgY2xpY2sgd2lsbCBzZXQgdGhlIGN1cnJlbnQgdmFsdWUgYW5kIHdpdGggZG91YmxlIGNsaWNrIHdpbGwgdW5zZXQgaXQKICBsYWJlbC5vbmNsaWNrID0gRHVhbENsaWNrKAogICAgKCkgPT4gewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfSwKICAgIChlKSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJlIiwgZSk7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IHVuZGVmaW5lZDsKICAgIH0KICApOwogIGNvbnN0IHVpX3ZhbHVlX3NwYW4gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC12YWx1ZSIpOwogIGNvbnN0IGNvbmZpZ192YWx1ZV9zcGFuID0KICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuY29uZmlnLXZhbHVlIikgPz8KICAgIGxhYmVsLmluc2VydEFkamFjZW50RWxlbWVudCgKICAgICAgImFmdGVyYmVnaW4iLAogICAgICBodG1sYDxzcGFuIGNsYXNzPSJjb25maWctdmFsdWUiPjwvc3Bhbj5gCiAgICApOwogIC8vIEFzc2luZyB0aGUgdHdvIHNwYW5zIGFzIHByb3BlcnRpZXMgb2YgdGhlIGNvbnRhaW5pbmcgc3BhbgogIGNvbnRhaW5lci51aV9zcGFuID0gdWlfdmFsdWVfc3BhbjsKICBjb250YWluZXIuY29uZmlnX3NwYW4gPSBjb25maWdfdmFsdWVfc3BhbjsKICBjb250YWluZXIua2V5ID0ga2V5OwogIGNvbmZpZ19zcGFuc1trZXldID0gY29udGFpbmVyOwogIGlmIChmaXJzdFJ1bikgewogICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID0KICAgICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogICAgLy8gV2UgZG8gdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSB2YWx1ZSBzcGFuCiAgICBpbml0aWFsaXplVUlWYWx1ZVNwYW4odWlfdmFsdWVfc3Bhbiwga2V5LCB2YWx1ZSk7CiAgICAvLyBUaGVuIHdlIGluaXRpYWxpemUgdGhlIGNvbmZpZyB2YWx1ZQogICAgaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3Bhbihjb25maWdfdmFsdWVfc3Bhbiwga2V5KTsKICAgIC8vIFdlIHB1dCBzb21lIGNvbnZlbmllbmNlIGdldHRlcnMvc2V0dGVycwogICAgLy8gdWlfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgInVpX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IHVpX3ZhbHVlX3NwYW4udmFsdWUsCiAgICAgIHNldDogKHZhbCkgPT4gewogICAgICAgIHVpX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICAgIC8vIGNvbmZpZ192YWx1ZSBmb3J3YXJkCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAiY29uZmlnX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IGNvbmZpZ192YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSA9IHZhbDsKICAgICAgfSwKICAgIH0pOwogIH0KfQoKLy8gVGhlc2Ugb2JqZWN0cyB3aWxsIGNvbnRhaW4gdGhlIGRlZmF1bHQgdmFsdWUKCi8vIFRoaXMgY29kZSB1cGRhdGVzIHRoZSBpbWFnZSBvcHRpb25zIGluIHRoZSBQTE9UIGNvbmZpZyB3aXRoIHRoZSBwcm92aWRlZCBvbmVzCmZ1bmN0aW9uIHNldEltYWdlT3B0aW9ucyhvKSB7CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBvW2tleV07CiAgfQp9CmZ1bmN0aW9uIHVuc2V0SW1hZ2VPcHRpb25zKCkgewogIHNldEltYWdlT3B0aW9ucyh7fSk7Cn0KCmNvbnN0IHNldF9idXR0b24gPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtc3Bhbi5zZXQiKTsKY29uc3QgdW5zZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4udW5zZXQiKTsKaWYgKGZpcnN0UnVuKSB7CiAgc2V0X2J1dHRvbi5vbmNsaWNrID0gKGUpID0+IHsKICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfQogIH07CiAgdW5zZXRfYnV0dG9uLm9uY2xpY2sgPSB1bnNldEltYWdlT3B0aW9uczsKfQoKLy8gV2UgYWRkIGEgZnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIGNsaXBib2FyZCBpcyBwb3BwZWQgb3V0CkNPTlRBSU5FUi5pc1BvcHBlZE91dCA9ICgpID0+IHsKICByZXR1cm4gQ09OVEFJTkVSLmNsYXNzTGlzdC5jb250YWlucygicG9wcGVkLW91dCIpOwp9OwoKQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNlZG93biA9IGZ1bmN0aW9uIChldmVudCkgewogIGlmIChldmVudC50YXJnZXQubWF0Y2hlcygic3Bhbi5jbGlwYm9hcmQtdmFsdWUiKSkgewogICAgY29uc29sZS5sb2coIldlIGRvbid0IG1vdmUhIik7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IHN0YXJ0ID0gewogICAgbGVmdDogcGFyc2VGbG9hdChDT05UQUlORVIuc3R5bGUubGVmdCksCiAgICB0b3A6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLnRvcCksCiAgICBYOiBldmVudC5wYWdlWCwKICAgIFk6IGV2ZW50LnBhZ2VZLAogIH07CiAgZnVuY3Rpb24gbW92ZUF0KGV2ZW50LCBzdGFydCkgewogICAgY29uc3QgdG9wID0gZXZlbnQucGFnZVkgLSBzdGFydC5ZICsgc3RhcnQudG9wICsgInB4IjsKICAgIGNvbnN0IGxlZnQgPSBldmVudC5wYWdlWCAtIHN0YXJ0LlggKyBzdGFydC5sZWZ0ICsgInB4IjsKICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUudG9wID0gdG9wOwogIH0KCiAgLy8gbW92ZSBvdXIgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGJhbGwgdW5kZXIgdGhlIHBvaW50ZXIKICBtb3ZlQXQoZXZlbnQsIHN0YXJ0KTsKICBmdW5jdGlvbiBvbk1vdXNlTW92ZShldmVudCkgewogICAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgfQoKICAvLyBXZSB1c2UgdGhpcyB0byByZW1vdmUgdGhlIG1vdXNlbW92ZSB3aGVuIGNsaWNraW5nIG91dHNpZGUgb2YgdGhlIGNvbnRhaW5lcgogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CgogIC8vIG1vdmUgdGhlIGNvbnRhaW5lciBvbiBtb3VzZW1vdmUKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCBvbk1vdXNlTW92ZSwgewogICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCwKICB9KTsKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICBjbGVhblVwKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKCiAgZnVuY3Rpb24gY2xlYW5VcCgpIHsKICAgIGNvbnNvbGUubG9nKCJjbGVhbmluZyB1cCB0aGUgcGxvdCBtb3ZlIGxpc3RlbmVyIik7CiAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICBDTElQQk9BUkRfSEVBREVSLm9ubW91c2V1cCA9IG51bGw7CiAgfQoKICAvLyAoMykgZHJvcCB0aGUgYmFsbCwgcmVtb3ZlIHVubmVlZGVkIGhhbmRsZXJzCiAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBjbGVhblVwOwp9OwoKZnVuY3Rpb24gc2VuZFRvQ2xpcGJvYXJkKGJsb2IpIHsKICBpZiAoIW5hdmlnYXRvci5jbGlwYm9hcmQpIHsKICAgIGFsZXJ0KAogICAgICAiVGhlIENsaXBib2FyZCBBUEkgZG9lcyBub3Qgc2VlbSB0byBiZSBhdmFpbGFibGUsIG1ha2Ugc3VyZSB0aGUgUGx1dG8gbm90ZWJvb2sgaXMgYmVpbmcgdXNlZCBmcm9tIGVpdGhlciBsb2NhbGhvc3Qgb3IgYW4gaHR0cHMgc291cmNlLiIKICAgICk7CiAgfQogIG5hdmlnYXRvci5jbGlwYm9hcmQKICAgIC53cml0ZShbCiAgICAgIG5ldyBDbGlwYm9hcmRJdGVtKHsKICAgICAgICAvLyBUaGUga2V5IGlzIGRldGVybWluZWQgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIGJsb2IncyB0eXBlLgogICAgICAgIFtibG9iLnR5cGVdOiBibG9iLAogICAgICB9KSwKICAgIF0pCiAgICAudGhlbigKICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgIGNvbnNvbGUubG9nKCJBc3luYzogQ29weWluZyB0byBjbGlwYm9hcmQgd2FzIHN1Y2Nlc3NmdWwhIik7CiAgICAgIH0sCiAgICAgIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJBc3luYzogQ291bGQgbm90IGNvcHkgdGV4dDogIiwgZXJyKTsKICAgICAgfQogICAgKTsKfQoKZnVuY3Rpb24gY29weUltYWdlVG9DbGlwYm9hcmQoKSB7CiAgLy8gV2UgZXh0cmFjdCB0aGUgaW1hZ2Ugb3B0aW9ucyBmcm9tIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzIChpZiB0aGV5IGV4aXN0KQogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuIFdlIGFsc28gaWdub3JlIGZvcm1hdCBiZWNhdXNlIHRoZSBjbGlwYm9hcmQgb25seSBzdXBwb3J0cyBwbmcuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwga2V5ID09PSAiZm9ybWF0IikgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbmZpZ1trZXldID0gdmFsOwogIH0KICBQbG90bHkudG9JbWFnZShQTE9ULCBjb25maWcpLnRoZW4oZnVuY3Rpb24gKGRhdGFVcmwpIHsKICAgIGZldGNoKGRhdGFVcmwpCiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5ibG9iKCkpCiAgICAgIC50aGVuKChibG9iKSA9PiB7CiAgICAgICAgY29uc3QgcGFzdGVfcmVjZWl2ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdwYXN0ZS1yZWNlaXZlci5wbHV0b3Bsb3RseScpCiAgICAgICAgaWYgKHBhc3RlX3JlY2VpdmVyKSB7CiAgICAgICAgICBwYXN0ZV9yZWNlaXZlci5hdHRhY2hJbWFnZShkYXRhVXJsLCBDT05UQUlORVIpCiAgICAgICAgfQogICAgICAgIHNlbmRUb0NsaXBib2FyZChibG9iKQogICAgICB9KTsKICB9KTsKfQoKZnVuY3Rpb24gc2F2ZUltYWdlVG9GaWxlKCkgewogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LmRvd25sb2FkSW1hZ2UoUExPVCwgY29uZmlnKTsKfQoKbGV0IGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwLCB0b3A6IDAsIGxlZnQ6IDAgfTsKZnVuY3Rpb24gdW5wb3BfY29udGFpbmVyKGNsKSB7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCBmYWxzZSk7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoY2wsIGZhbHNlKTsKICAvLyBXZSBmaXggdGhlIGhlaWdodCBiYWNrIHRvIHRoZSB2YWx1ZSBpdCBoYWQgYmVmb3JlIHBvcG91dCwgYWxzbyBzZXR0aW5nIHRoZSBmbGFnIHRvIHNpZ25hbCB0aGF0IHVwb24gZmlyc3QgcmVzaXplIHdlIHJlbW92ZSB0aGUgZml4ZWQgaW5saW5lLXN0eWxlCiAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9IGNvbnRhaW5lcl9yZWN0LmhlaWdodCArICJweCI7CiAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gdHJ1ZTsKICAvLyBXZSBzZXQgdGhlIG90aGVyIGZpeGVkIGlubGluZS1zdHlsZXMgdG8gbnVsbAogIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogIENPTlRBSU5FUi5zdHlsZS50b3AgPSAiIjsKICBDT05UQUlORVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIFdlIGFsc28gcmVtb3ZlIHRoZSBDTElQQk9BUkRfSEVBREVSCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9ICIiOwogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIEZpbmFsbHkgd2UgcmVtb3ZlIHRoZSBoaWRkZW4gY2xhc3MgdG8gdGhlIGhlYWRlcgogIENMSVBCT0FSRF9IRUFERVIuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgdHJ1ZSk7CiAgcmV0dXJuOwp9CmZ1bmN0aW9uIHBvcG91dF9jb250YWluZXIob3B0cykgewogIGNvbnN0IGNsID0gb3B0cz8uY2w7CiAgY29uc3QgdGFyZ2V0X2NvbnRhaW5lcl9zaXplID0gb3B0cz8udGFyZ2V0X2NvbnRhaW5lcl9zaXplID8/IHt9OwogIGNvbnN0IHRhcmdldF9wbG90X3NpemUgPSBvcHRzPy50YXJnZXRfcGxvdF9zaXplID8/IHt9OwogIGlmIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgcmV0dXJuIHVucG9wX2NvbnRhaW5lcihjbCk7CiAgfQogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBjbCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0cnVlKTsKICAvLyBXZSBleHRyYWN0IHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNvbnRhaW5lciwgc2F2ZSB0aGVtIGFuZCBmaXggdGhlbQogIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH0gPSBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgY29udGFpbmVyX3JlY3QgPSB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9OwogIC8vIFdlIHNhdmUgdGhlIGN1cnJlbnQgcGxvdCBzaXplIGJlZm9yZSB3ZSBwb3AgYXMgaXQgd2lsbCBmaWxsIHRoZSBzY3JlZW4KICBjb25zdCBjdXJyZW50X3Bsb3Rfc2l6ZSA9IHsKICAgIHdpZHRoOiBQTE9ULl9mdWxsTGF5b3V0LndpZHRoLAogICAgaGVpZ2h0OiBQTE9ULl9mdWxsTGF5b3V0LmhlaWdodCwKICB9OwogIC8vIFdlIGhhdmUgdG8gc2F2ZSB0aGUgcGFkIGRhdGEgYmVmb3JlIHBvcHBpbmcgc28gd2UgY2FuIHJlc2l6ZSBwcmVjaXNlbHkKICBjb25zdCBwYWQgPSB7fTsKICBwYWQudW5wb3BwZWQgPSBnZXRTaXplRGF0YSgpLmNvbnRhaW5lcl9wYWQ7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCB0cnVlKTsKICBwYWQucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIC8vIFdlIGRvIHRvcCBhbmQgbGVmdCBiYXNlZCBvbiB0aGUgY3VycmVudCByZWN0CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ0b3AiLCAibGVmdCJdKSB7CiAgICBjb25zdCBzdGFydF92YWwgPSB0YXJnZXRfY29udGFpbmVyX3NpemVba2V5XSA/PyBjb250YWluZXJfcmVjdFtrZXldOwogICAgbGV0IG9mZnNldCA9IDA7CiAgICBmb3IgKGNvbnN0IGtpbmQgb2YgWyJwYWRkaW5nIiwgImJvcmRlciJdKSB7CiAgICAgIG9mZnNldCArPSBwYWQucG9wcGVkW2tpbmRdW2tleV0gLSBwYWQudW5wb3BwZWRba2luZF1ba2V5XTsKICAgIH0KICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gc3RhcnRfdmFsIC0gb2Zmc2V0ICsgInB4IjsKICAgIGlmIChrZXkgPT09ICJsZWZ0IikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgLy8gV2UgY29tcHV0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBkZXBlbmRpbmcgb24gZXZlbnR1YWwgY29uZmlnIGRhdGEKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7CiAgICB3aWR0aDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS53aWR0aCA/PwogICAgICBjb25maWdfc3BhbnMud2lkdGguY29uZmlnX3ZhbHVlID8/CiAgICAgIGN1cnJlbnRfcGxvdF9zaXplLndpZHRoLAogICAgaGVpZ2h0OgogICAgICB0YXJnZXRfcGxvdF9zaXplLmhlaWdodCA/PwogICAgICBjb25maWdfc3BhbnMuaGVpZ2h0LmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS5oZWlnaHQsCiAgfSk7CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgY29uc3QgdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY3N6W2tleV07CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHZhbCArICJweCI7CiAgICBpZiAoa2V5ID09PSAid2lkdGgiKSB7CiAgICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGVba2V5XSA9IENPTlRBSU5FUi5zdHlsZVtrZXldOwogICAgfQogIH0KICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIGZhbHNlKTsKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICB1bnBvcF9jb250YWluZXIoKTsKICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9LAogICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0KICApOwp9CgpDT05UQUlORVIucG9wT3V0ID0gcG9wb3V0X2NvbnRhaW5lcjsKCmZ1bmN0aW9uIER1YWxDbGljayhzaW5nbGVfZnVuYywgZGJsX2Z1bmMpIHsKICBsZXQgbmNsaWNrcyA9IDA7CiAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7CiAgICBuY2xpY2tzICs9IDE7CiAgICBpZiAobmNsaWNrcyA+IDEpIHsKICAgICAgZGJsX2Z1bmMoLi4uYXJncyk7CiAgICAgIG5jbGlja3MgPSAwOwogICAgfSBlbHNlIHsKICAgICAgZGVsYXkoMzAwKS50aGVuKCgpID0+IHsKICAgICAgICBpZiAobmNsaWNrcyA9PSAxKSB7CiAgICAgICAgICBzaW5nbGVfZnVuYyguLi5hcmdzKTsKICAgICAgICB9CiAgICAgICAgbmNsaWNrcyA9IDA7CiAgICAgIH0pOwogICAgfQogIH07Cn0KCi8vIFdlIHJlbW92ZSB0aGUgZGVmYXVsdCBkb3dubG9hZCBpbWFnZSBidXR0b24KcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9SZW1vdmUgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlLAogIFsidG9JbWFnZSJdCik7Ci8vIFdlIGFkZCB0aGUgY3VzdG9tIGJ1dHRvbiB0byB0aGUgbW9kZWJhcgpwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb0FkZCA9IF8udW5pb24oCiAgcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQsCiAgWwogICAgewogICAgICBuYW1lOiAiQ29weSBQTkcgdG8gQ2xpcGJvYXJkIiwKICAgICAgaWNvbjogewogICAgICAgIGhlaWdodDogNTIwLAogICAgICAgIHdpZHRoOiA1MjAsCiAgICAgICAgcGF0aDogIk0yODAgNjRoNDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRWNDQ4YzAgMzUuMy0yOC43IDY0LTY0IDY0SDY0Yy0zNS4zIDAtNjQtMjguNy02NC02NFYxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRoNDAgOS42QzEyMSAyNy41IDE1My4zIDAgMTkyIDBzNzEgMjcuNSA3OC40IDY0SDI4MHpNNjQgMTEyYy04LjggMC0xNiA3LjItMTYgMTZWNDQ4YzAgOC44IDcuMiAxNiAxNiAxNkgzMjBjOC44IDAgMTYtNy4yIDE2LTE2VjEyOGMwLTguOC03LjItMTYtMTYtMTZIMzA0djI0YzAgMTMuMy0xMC43IDI0LTI0IDI0SDE5MiAxMDRjLTEzLjMgMC0yNC0xMC43LTI0LTI0VjExMkg2NHptMTI4LThhMjQgMjQgMCAxIDAgMC00OCAyNCAyNCAwIDEgMCAwIDQ4eiIsCiAgICAgIH0sCiAgICAgIGRpcmVjdGlvbjogInVwIiwKICAgICAgY2xpY2s6IER1YWxDbGljayhjb3B5SW1hZ2VUb0NsaXBib2FyZCwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoKTsKICAgICAgfSksCiAgICB9LAogICAgewogICAgICBuYW1lOiAiRG93bmxvYWQgSW1hZ2UiLAogICAgICBpY29uOiBQbG90bHkuSWNvbnMuY2FtZXJhLAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soc2F2ZUltYWdlVG9GaWxlLCAoKSA9PiB7CiAgICAgICAgcG9wb3V0X2NvbnRhaW5lcih7IGNsOiAiZmlsZXNhdmUiIH0pOwogICAgICB9KSwKICAgIH0sCiAgXQopOwoKZnVuY3Rpb24gZ2V0T2Zmc2V0RGF0YShlbCkgewogIGxldCBjcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsLCBudWxsKTsKICBjb25zdCBvZGF0YSA9IHsKICAgIHBhZGRpbmc6IHsKICAgICAgbGVmdDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSwKICAgICAgYm90dG9tOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSArIHBhcnNlRmxvYXQoY3MucGFkZGluZ0JvdHRvbSksCiAgICB9LAogICAgYm9yZGVyOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyTGVmdFdpZHRoKSwKICAgICAgcmlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyUmlnaHRXaWR0aCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5ib3JkZXJUb3BXaWR0aCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCkgKyBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICB9CiAgfTsKICBpZiAoZWwgPT09IFBMT1QpIHsKICAgIC8vIEZvciB0aGUgUExPVCB3ZSBhbHNvIHdhbnQgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIG9mZnNldAogICAgb2RhdGEub2Zmc2V0ID0gewogICAgICB0b3A6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0VG9wIDogMCwKICAgICAgbGVmdDogUExPVC5vZmZzZXRQYXJlbnQgPT0gQ09OVEFJTkVSID8gUExPVC5vZmZzZXRMZWZ0IDogMCwKICAgIH0KICB9CiAgcmV0dXJuIG9kYXRhOwp9CmZ1bmN0aW9uIGdldFNpemVEYXRhKCkgewogIGNvbnN0IGRhdGEgPSB7CiAgICBwbG90X3BhZDogZ2V0T2Zmc2V0RGF0YShQTE9UKSwKICAgIHBsb3RfcmVjdDogUExPVC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICAgIGNvbnRhaW5lcl9wYWQ6IGdldE9mZnNldERhdGEoQ09OVEFJTkVSKSwKICAgIGNvbnRhaW5lcl9yZWN0OiBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgfTsKICByZXR1cm4gZGF0YTsKfQpmdW5jdGlvbiBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgY29uc3QgY29tcHV0ZWRfc2l6ZSA9IGNvbXB1dGVQbG90U2l6ZShzaXplRGF0YSk7CiAgY29uc3Qgb2Zmc2V0cyA9IGNvbXB1dGVkX3NpemUub2Zmc2V0czsKCiAgY29uc3QgcGxvdF9kYXRhID0gewogICAgd2lkdGg6IHdpZHRoID8/IGNvbXB1dGVkX3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IGhlaWdodCA/PyBjb21wdXRlZF9zaXplLmhlaWdodCwKICB9OwoKICByZXR1cm4gewogICAgd2lkdGg6ICh3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoKSArIG9mZnNldHMud2lkdGgsCiAgICBoZWlnaHQ6IChoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQpICsgb2Zmc2V0cy5oZWlnaHQsCiAgICBub0NoYW5nZTogd2lkdGggPT0gY29tcHV0ZWRfc2l6ZS53aWR0aCAmJiBoZWlnaHQgPT0gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfQp9CgovLyBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hhbmdlIHRoZSBjb250YWluZXIgc2l6ZSBzbyB0aGF0IHRoZSByZXN1bHRpbmcgcGxvdCB3aWxsIGJlIG1hdGNoaW5nIHRoZSBwcm92aWRlZCBzcGVjcwpmdW5jdGlvbiBjaGFuZ2VDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICBpZiAoIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICBjb25zb2xlLmxvZygiVHJpZWQgdG8gY2hhbmdlIGNvbnRhaW5lciBzaXplIHdoZW4gbm90IHBvcHBlZCwgaWdub3JpbmciKTsKICAgIHJldHVybjsKICB9CgogIGNvbnN0IGNzeiA9IGNvbXB1dGVDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSk7CgogIGlmIChjc3oubm9DaGFuZ2UpIHsKICAgIGNvbnNvbGUubG9nKCJTaXplIGlzIHRoZSBzYW1lIGFzIGN1cnJlbnQsIGlnbm9yaW5nIik7CiAgICByZXR1cm4KICB9CiAgLy8gV2UgYXJlIG5vdyBnb2luZyB0byBzZXQgaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgY29udGFpbmVyCiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSBjc3pba2V5XSArICJweCI7CiAgfQp9Ci8vIFdlIG5vdyBjcmVhdGUgdGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCB1cGRhdGUgdGhlIHBsb3QgYmFzZWQgb24gdGhlIHZhbHVlcyBzcGVjaWZpZWQKZnVuY3Rpb24gdXBkYXRlRnJvbUhlYWRlcigpIHsKICBjb25zdCBoZWFkZXJfZGF0YSA9IHsKICAgIGhlaWdodDogY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSwKICAgIHdpZHRoOiBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUsCiAgfTsKICBjaGFuZ2VDb250YWluZXJTaXplKGhlYWRlcl9kYXRhKTsKfQovLyBXZSBhc3NpZ24gdGhpcyBmdW5jdGlvbiB0byB0aGUgb25ibHVyIGV2ZW50IG9mIHdpZHRoIGFuZCBoZWlnaHQKaWYgKGZpcnN0UnVuKSB7CiAgZm9yIChjb25zdCBjb250YWluZXIgb2YgT2JqZWN0LnZhbHVlcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIudWlfc3Bhbi5vbmJsdXIgPSAoZSkgPT4gewogICAgICBjb250YWluZXIudWlfdmFsdWUgPSBjb250YWluZXIudWlfc3Bhbi50ZXh0Q29udGVudDsKICAgICAgdXBkYXRlRnJvbUhlYWRlcigpOwogICAgfTsKICB9Cn0KLy8gVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgcGxvdCBzaXplIHRvIHVzZSBmb3IgcmVsYXlvdXQgYXMgYSBmdW5jdGlvbiBvZiB0aGUgY29udGFpbmVyIHNpemUKZnVuY3Rpb24gY29tcHV0ZVBsb3RTaXplKGRhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgLy8gUmVtb3ZlIFBhZGRpbmcKICBjb25zdCB7IGNvbnRhaW5lcl9wYWQsIHBsb3RfcGFkLCBjb250YWluZXJfcmVjdCB9ID0gZGF0YTsKICBjb25zdCBvZmZzZXRzID0gewogICAgd2lkdGg6CiAgICAgIHBsb3RfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBwbG90X3BhZC5ib3JkZXIud2lkdGggKwogICAgICBwbG90X3BhZC5vZmZzZXQubGVmdCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy53aWR0aCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLndpZHRoLAogICAgaGVpZ2h0OgogICAgICBwbG90X3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIHBsb3RfcGFkLmJvcmRlci5oZWlnaHQgKwogICAgICBwbG90X3BhZC5vZmZzZXQudG9wICsKICAgICAgY29udGFpbmVyX3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLmhlaWdodCwKICB9OwogIGNvbnN0IHN6ID0gewogICAgd2lkdGg6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3Qud2lkdGggLSBvZmZzZXRzLndpZHRoKSwKICAgIGhlaWdodDogTWF0aC5yb3VuZChjb250YWluZXJfcmVjdC5oZWlnaHQgLSBvZmZzZXRzLmhlaWdodCksCiAgICBvZmZzZXRzLAogIH07CiAgcmV0dXJuIHN6Owp9CgovLyBDcmVhdGUgdGhlIHJlc2l6ZU9ic2VydmVyIHRvIG1ha2UgdGhlIHBsb3QgZXZlbiBtb3JlIHJlc3BvbnNpdmUhIDptYWdpYzoKY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHsKICBjb25zdCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCk7CiAgY29uc3Qge2NvbnRhaW5lcl9yZWN0LCBjb250YWluZXJfcGFkfSA9IHNpemVEYXRhOwogIGxldCBwbG90X3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIC8vIFdlIHNhdmUgdGhlIGhlaWdodCBpbiB0aGUgUExPVCBvYmplY3QKICBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQ7CiAgLy8gV2UgZGVhbCB3aXRoIHNvbWUgc3R1ZmYgaWYgdGhlIGNvbnRhaW5lciBpcyBwb3BwcGVkCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9IGNvbnRhaW5lcl9yZWN0LndpZHRoICsgInB4IjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBjb250YWluZXJfcmVjdC5sZWZ0ICsgInB4IjsKICBjb25maWdfc3BhbnMuaGVpZ2h0LnVpX3ZhbHVlID0gcGxvdF9zaXplLmhlaWdodDsKICBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUgPSBwbG90X3NpemUud2lkdGg7CiAgLyogCgkJVGhlIGFkZGl0aW9uIG9mIHRoZSBpbnZhbGlkIGFyZ3VtZW50IGBwbHV0b3Jlc2l6ZWAgc2VlbXMgdG8gZml4IHRoZSBwcm9ibGVtIHdpdGggY2FsbGluZyBgcmVsYXlvdXRgIHNpbXBseSB3aXRoIGB7YXV0b3NpemU6IHRydWV9YCBhcyB1cGRhdGUgYnJlYWtpbmcgbW91c2UgcmVsYXlvdXQgZXZlbnRzIHRyYWNraW5nLiAKCQlTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Bsb3RseS9wbG90bHkuanMvaXNzdWVzLzYxNTYgZm9yIGRldGFpbHMKCQkqLwogIGxldCBjb25maWcgPSB7CiAgICAvLyBJZiB0aGlzIGlzIHBvcHBlZCBvdXQsIHdlIGlnbm9yZSB0aGUgb3JpZ2luYWwgd2lkdGgvaGVpZ2h0CiAgICB3aWR0aDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfd2lkdGgpID8/IHBsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfaGVpZ2h0KSA/PyBwbG90X3NpemUuaGVpZ2h0LAogICAgcGx1dG9yZXNpemU6IHRydWUsCiAgfTsKICBQbG90bHkucmVsYXlvdXQoUExPVCwgY29uZmlnKS50aGVuKCgpID0+IHsKICAgIGlmIChyZW1vdmVfY29udGFpbmVyX3NpemUgJiYgIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIHRoZSBmaXJzdCByZXNpemUgdXBvbiBwbG90IGNyZWF0aW9uIHRvIGFscmVhZHkgYmUgd2l0aG91dCBhIGZpeGVkIGhlaWdodAogICAgICBDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gIiI7CiAgICAgIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogICAgICByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmYWxzZTsKICAgIH0KICB9KTsKfSk7CgpyZXNpemVPYnNlcnZlci5vYnNlcnZlKENPTlRBSU5FUik7CgoKUGxvdGx5LnJlYWN0KFBMT1QsIHBsb3Rfb2JqKS50aGVuKCgpID0+IHsKCS8vIEFzc2lnbiB0aGUgUGxvdGx5IGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKHBsb3RseV9saXN0ZW5lcnMpKSB7CgkJZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcl92ZWMpIHsKCQkJUExPVC5vbihrZXksIGxpc3RlbmVyKQoJCX0KCX0KCS8vIEFzc2lnbiB0aGUgSlMgZXZlbnQgbGlzdGVuZXJzCglmb3IgKGNvbnN0IFtrZXksIGxpc3RlbmVyX3ZlY10gb2YgT2JqZWN0LmVudHJpZXMoanNfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1QuYWRkRXZlbnRMaXN0ZW5lcihrZXksIGxpc3RlbmVyLCB7CgkJCQlzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsCgkJCX0pCgkJfQoJfQp9CikKCgppbnZhbGlkYXRpb24udGhlbigoKSA9PiB7CgkvLyBSZW1vdmUgYWxsIHBsb3RseSBsaXN0ZW5lcnMKCVBMT1QucmVtb3ZlQWxsTGlzdGVuZXJzKCkKCS8vIFJlbW92ZSBhbGwgSlMgbGlzdGVuZXJzCgljb250cm9sbGVyLmFib3J0KCkKCS8vIFJlbW92ZSB0aGUgcmVzaXplT2JzZXJ2ZXIKCXJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKQp9KQoKCgoJCXJldHVybiBDT05UQUlORVIKCTwvc2NyaXB0PgqkbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/oxSvpnKwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJDJlZTdiYTQ3LTAyZTUtNGIwMi1hMTYyLWRkYmQ1ZWQ0N2M3YrlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgG3bl61cHVibGlzaGVkX29iamVjdF9rZXlzkdk1YjNiODQwOGMtODE4MS0xMWVmLTE0ZWItZTFjNTY5YjhiYjI5L2RlMjExOTc5ZDJiYTUyYTO4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkNzQ2NjZjMWEtMjY3My00OTM2LTk4MmItNjIyOWJmOTJhZjY2iqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedoBhTxkaXYgY2xhc3M9Im1hcmtkb3duIj48dWw+CjxsaT48cD4mIzQwOzIuNSYjNDE7IFNpbXVsYXRlIHRoZSA8Y29kZT5zZXFfZ3JlPC9jb2RlPiBzZXF1ZW5jZTwvcD4KPC9saT4KPGxpPjxwPiYjNDA7Mi42JiM0MTsgUGxvdCB0aGUgc2ltdWxhdGVkIHNpZ25hbDwvcD4KPC9saT4KPGxpPjxwPiYjNDA7Mi43JiM0MTsgUmVjb25zdHJ1Y3QgdGhlIDFEIGltYWdlPC9wPgo8L2xpPgo8bGk+PHA+JiM0MDsyLjgmIzQxOyBEbyB5b3Ugbm90aWNlIGFueXRoaW5nIHdlaXJkPyBJZiB0aGUgYW5zd2VyIGlzIHllcywgdHJ5IGFkanVzdGluZyA8Y29kZT5BeDwvY29kZT4gdG8gY2hhbmdlIHRoZSA8Y29kZT5GT1Y8L2NvZGU+IG9mIHRoZSBhY3F1aXNpdGlvbjwvcD4KPC9saT4KPC91bD4KPC9kaXY+pG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv6Lwfr4OsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQ3NDY2NmMxYS0yNjczLTQ5MzYtOTgyYi02MjI5YmY5MmFmNja5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4AByYOtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkZWE1NDIyNzEtMDFjMi00OTYyLWE3MDgtODA0YjIzYTg2MWI5iqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedoBqDxkaXYgY2xhc3M9Im1hcmtkb3duIj48dWw+CjxsaT48cD4mIzQwOzEuNiYjNDE7IEZpbmFsbHksIHVzZSB0aGUgZ2VuZXJhdGVkIDxjb2RlPnNlcTwvY29kZT4sIDxjb2RlPm9iajwvY29kZT4sIGFuZCA8Y29kZT5zeXM8L2NvZGU+IHRvIHNpbXVsYXRlIHRoZSBGSUQgJiM0MDtjaGVjayA8Y29kZT5zaW11bGF0ZTwvY29kZT4mIzM5O3MgZG9jcyYjNDE7PC9wPgo8L2xpPgo8bGk+PHA+JiM0MDsxLjcmIzQxOyBQbG90IHRoZSByZXN1bHRpbmcgcmF3IGRhdGEgd2l0aCA8Y29kZT5wbG90X3NpZ25hbDwvY29kZT4uPC9wPgo8L2xpPgo8bGk+PHA+JiM0MDsxLjgmIzQxOyBJcyB0aGUgc2lnbmFsIHRoZSBzYW1lIGFzIDxjb2RlPnBsb3QmIzQwO3QsIGV4cC4mIzQwOy10IC4vIFQyJiM0MTsmIzQxOzwvY29kZT4/PC9wPgo8L2xpPgo8L3VsPgo8L2Rpdj6kbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/ovB+noCwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJGVhNTQyMjcxLTAxYzItNDk2Mi1hNzA4LTgwNGIyM2E4NjFiOblkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgAGkPO1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SRjNmUzM2NiOC1mNDJjLTQ2NDMtOTI1Ny0xMjRkMjgwNGQzZGGKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52UdTZXF1ZW5jZVsgz4QgPSAwLjU4NyBtcyB8IGJsb2NrczogMSB8IEFEQzogMCB8IEdSOiAwIHwgUkY6IDEgfCBERUY6IDAgXaRtaW1lqnRleHQvcGxhaW6scm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/owgu17qwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJGM2ZTMzY2I4LWY0MmMtNDY0My05MjU3LTEyNGQyODA0ZDNkYblkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzkELEce1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQyNzY4NjI2Mi0xYTFlLTQ1ZmEtYjRlZS05MGFlMWQ5ZWUzNGWKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52gE2PGRpdiBjbGFzcz0ibWFya2Rvd24iPjx1bD4KPGxpPjxwPiYjNDA7My4zJiM0MTsgU2ltdWxhdGUgdGhlIDxjb2RlPnNlcV9ncmU8L2NvZGU+IHNlcXVlbmNlPC9wPgo8L2xpPgo8bGk+PHA+JiM0MDszLjQmIzQxOyBQbG90IHRoZSBzaW11bGF0ZWQgc2lnbmFsPC9wPgo8L2xpPgo8bGk+PHA+JiM0MDszLjUmIzQxOyBDb21wYXJlIHRoZSBwbG90IGluICYjNDA7My41JiM0MTsgd2l0aCAmIzQwOzIuNiYjNDE7PC9wPgo8L2xpPgo8bGk+PHA+JiM0MDszLjYmIzQxOyBSZWNvbnN0cnVjdCB0aGUgMUQgaW1hZ2U8L3A+CjwvbGk+CjwvdWw+CjwvZGl2PqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b+i8H7de7BwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkMjc2ODYyNjItMWExZS00NWZhLWI0ZWUtOTBhZTFkOWVlMzRluWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAAcw77VwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDZkZmUzMzhkLWRlODUtNGFkYi1iMDMwLTA5NDU1ZmFlNzhhMIqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnZ8zxkaXYgY2xhc3M9Im1hcmtkb3duIj48cD5XZWxjb21lIHRvIHRoZSBoYW5kcy1vbiBzZXNzaW9uIG9uIE1SSSBzaW11bGF0aW9uLiBMZXQmIzM5O3MgaGF2ZSBzb21lIGZ1biYjMzM7PC9wPgo8cD5JZiB5b3UgaGF2ZSBhbnkgZG91YnRzIGFib3V0IGhvdyB0byB1c2UgYSBmdW5jdGlvbiwgcGxlYXNlIHNlYXJjaCBpbiB0aGUgPHN0cm9uZz5MaXZlIERvY3M8L3N0cm9uZz4gYXQgdGhlIGJvdHRvbSByaWdodC48L3A+CjwvZGl2PqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b+i8H5XybBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkNmRmZTMzOGQtZGU4NS00YWRiLWIwMzAtMDk0NTVmYWU3OGEwuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAARrIrVwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDhlNDc0YWRkLTg2NTEtNDMxYi1iNDgxLTdhMTM5MDM3ZGJkMoqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnaA/s8ZGl2IGNsYXNzPSJtYXJrZG93biI+PGgxPjEuIEZyZWUgSW5kdWN0aW9uIERlY2F5ICYjNDA7RklEJiM0MTs8L2gxPgo8cD5UaGUgZnJlZSBpbmR1Y3Rpb24gZGVjYXkgaXMgdGhlIHNpbXBsZXN0IG9ic2VydmFibGUgTk1SIHNpZ25hbC4gVGhpcyBzaWduYWwgaXMgdGhlIG9uZSB0aGF0IGZvbGxvd3MgYSBzaW5nbGUgdGlwcGluZyBSRiBwdWxzZS48L3A+CjxpbWcgY29udHJvbHM9Jycgc3JjPSdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vTElCUkVodWIvTVJJLXByb2Nlc3NpbmctMjAyMy9tYWluLzAyLXNpbXVsYXRpb24vRmlndXJlcy9GSUQucG5nJyB0eXBlPSdpbWFnZS9wbmcnIHdpZHRoPSczMDBweCc+PC9pbWc+CjxwPlRvIHJlY3JlYXRlIHRoaXMgZXhwZXJpbWVudCwgd2Ugd2lsbCBuZWVkIHRvIGRlZmluZSBhIDxjb2RlPlNlcXVlbmNlPC9jb2RlPjo8L3A+Cjx1bD4KPGxpPjxwPiYjNDA7MS4xJiM0MTsgQSA5MC1kZWcgYmxvY2sgUkYgcHVsc2UsIHB1dCBpdCBpbiBhIHZhcmlhYmxlIDxjb2RlPnNlcTwvY29kZT4gJiM0MDtjaGVjayA8Y29kZT5QdWxzZURlc2lnbmVyLlJGX2hhcmQ8L2NvZGU+JiMzOTtzIGRvY3MgdXNpbmcgdGhlIExpdmUgRG9jcyYjNDE7PC9wPgo8L2xpPgo8bGk+PHA+JiM0MDsxLjImIzQxOyBBbiBBREMgdG8gY2FwdHVyZSB0aGUgc2lnbmFsIGluIGEgdmFyaWFibGUgPGNvZGU+YWRjPC9jb2RlPiwgY29uY2F0ZW5hdGUgd2l0aCAmIzQwOzEuMSYjNDE7IHVzaW5nIDxjb2RlPnNlcSAmIzQzOyYjNjE7IGFkYzwvY29kZT48L3A+CjwvbGk+CjxsaT48cD4mIzQwOzEuMyYjNDE7IFBsb3QgdGhlIGdlbmVyYXRlZCA8Y29kZT5TZXF1ZW5jZTwvY29kZT4gJiM0MDtjaGVjayA8Y29kZT5wbG90X3NlcTwvY29kZT4mIzM5O3MgZG9jcyYjNDE7PC9wPgo8L2xpPgo8L3VsPgo8cD5Gb3IgdGhlIGhhcmR3YXJlIGxpbWl0cyB1c2UgdGhlIGRlZmF1bHQgc2Nhbm5lciA8Y29kZT5zeXMgJiM2MTsgU2Nhbm5lciYjNDA7JiM0MTs8L2NvZGU+LiA8L3A+CjwvZGl2PqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b+jB3Kdx7BwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkOGU0NzRhZGQtODY1MS00MzFiLWI0ODEtN2ExMzkwMzdkYmQyuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOCdJuerVwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJGZlOGJiY2QyLWU4ZjUtNDIyNS04MGMzLTQ3ZTczMTc2ZmIzZIqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnZbzxkaXYgY2xhc3M9Im1hcmtkb3duIj48cD5Db25ncmF0dWxhdGlvbnMmIzMzOyB5b3UgZmluaXNoZWQgdGhlIHNpbXVsYXRpb24gaGFuZHMtb24gc2Vzc2lvbiDwn6WzJiMzMzs8L3A+CjwvZGl2PqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b+i8H8QUrBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkZmU4YmJjZDItZThmNS00MjI1LTgwYzMtNDdlNzMxNzZmYjNkuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAAL7ibVwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDFhODNkODk3LTcwNWItNDQzZC04OWE0LWVhNWUzZTZhM2MwN4qmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnaaokJPHNjcmlwdCBpZD0ncGxvdF8xJz4KCQkvLyBXZSBzdGFydCBieSBwdXR0aW5nIGFsbCB0aGUgdmFyaWFibGUgaW50ZXJwb2xhdGlvbiBoZXJlIGF0IHRoZSBiZWdpbm5pbmcKCQkvLyBXZSBoYXZlIHRvIGNvbnZlcnQgYWxsIHR5cGVkYXJyYXlzIGluIHRoZSBsYXlvdXQgdG8gbm9ybWFsIGFycmF5cy4gU2VlIElzc3VlICMyNQoJCS8vIFdlIHVzZSBsb2Rhc2ggZm9yIHRoaXMgZm9yIGNvbXBhY3RuZXNzCgkJZnVuY3Rpb24gcmVtb3ZlVHlwZWRBcnJheShvKSB7CgkJCXJldHVybiBfLmlzVHlwZWRBcnJheShvKSA/IEFycmF5LmZyb20obykgOgoJCQlfLmlzUGxhaW5PYmplY3QobykgPyBfLm1hcFZhbHVlcyhvLCByZW1vdmVUeXBlZEFycmF5KSA6IAoJCQlvCgkJfQoKCQkvLyBQdWJsaXNoIHRoZSBwbG90IG9iamVjdCB0byBKUwoJCWxldCBwbG90X29iaiA9IF8udXBkYXRlKC8qIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgQWJzdHJhY3RQbHV0b0RpbmdldGplcy5EaXNwbGF5LnB1Ymxpc2hlZF90b19qcyAqLyBnZXRQdWJsaXNoZWRPYmplY3QoImIzYjg0MDhjLTgxODEtMTFlZi0xNGViLWUxYzU2OWI4YmIyOS9mYjQwY2M0YTQwZmNlNjNhIiksICJsYXlvdXQiLCByZW1vdmVUeXBlZEFycmF5KQoJCS8vIEdldCB0aGUgcGxvdGx5IGxpc3RlbmVycwoJCWNvbnN0IHBsb3RseV9saXN0ZW5lcnMgPSB7fQoJCS8vIEdldCB0aGUgSlMgbGlzdGVuZXJzCgkJY29uc3QganNfbGlzdGVuZXJzID0ge30KCQkvLyBEZWFsIHdpdGggZXZlbnR1YWwgY3VzdG9tIGNsYXNzZXMKCQlsZXQgY3VzdG9tX2NsYXNzbGlzdCA9IFtdCgoKCQkvLyBMb2FkIHRoZSBwbG90bHkgbGlicmFyeQoJCWxldCBQbG90bHkgPSB1bmRlZmluZWQKCQl0cnkgewoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiLi9wbG90bHlqcy9wbG90bHlqcy0yLjI2LjIubWluLmpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfSBjYXRjaCAoZSkgewoJCQljb25zb2xlLmxvZygiTG9jYWwgbG9hZCBmYWlsZWQsIHRyeWluZyB3aXRoIHRoZSB3ZWIgZXNtLnNoIHZlcnNpb24iKQoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiaHR0cHM6Ly9lc20uc2gvdjEzNS9wbG90bHkuanMtZGlzdC1taW5AMi4yNi4yL2VzbmV4dC9wbG90bHkuanMtZGlzdC1taW4ubWpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfQoKCQkvLyBDaGVjayBpZiB3ZSBoYXZlIHRvIGZvcmNlIGxvY2FsIG1hdGhqYXggZm9udCBjYWNoZQoJCWlmIChmYWxzZSAmJiB3aW5kb3c/Lk1hdGhKYXg/LmNvbmZpZz8uc3ZnPy5mb250Q2FjaGUgPT09ICdnbG9iYWwnKSB7CgkJCXdpbmRvdy5NYXRoSmF4LmNvbmZpZy5zdmcuZm9udENhY2hlID0gJ2xvY2FsJwoJCX0KCgkJLy8gRmxhZyB0byBjaGVjayBpZiB0aGlzIGNlbGwgd2FzICBtYW51YWxseSByYW4gb3IgcmVhY3RpdmVseSByYW4KY29uc3QgZmlyc3RSdW4gPSB0aGlzID8gZmFsc2UgOiB0cnVlCmNvbnN0IENPTlRBSU5FUiA9IHRoaXMgPz8gaHRtbGA8ZGl2IGNsYXNzPSdwbHV0b3Bsb3RseS1jb250YWluZXInPmAKY29uc3QgUExPVCA9IENPTlRBSU5FUi5xdWVyeVNlbGVjdG9yKCcuanMtcGxvdGx5LXBsb3QnKSA/PyBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2PmApCmNvbnN0IHBhcmVudCA9IENPTlRBSU5FUi5wYXJlbnRFbGVtZW50Ci8vIFdlIHVzZSBhIGNvbnRyb2xsZXIgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVycyB1cG9uIGludmFsaWRhdGlvbgpjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpCi8vIFdlIGhhdmUgdG8gYWRkIHRoaXMgdG8ga2VlcCBzdXBwb3J0aW5nIEBiaW5kIHdpdGggdGhlIG9sZCBBUEkgdXNpbmcgUExPVApQTE9ULmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGUpID0+IHsKCUNPTlRBSU5FUi52YWx1ZSA9IFBMT1QudmFsdWUKCWlmIChlLmJ1YmJsZXMpIHsKCQlyZXR1cm4KCX0KCUNPTlRBSU5FUi5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnaW5wdXQnKSkKfSwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pCgoJLy8gVGhpcyBjcmVhdGUgdGhlIHN0eWxlIHN1YmRpdiBvbiBmaXJzdCBydW4KCWZpcnN0UnVuICYmIENPTlRBSU5FUi5hcHBlbmRDaGlsZChodG1sYAoJPHN0eWxlPgoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciB7CgkJd2lkdGg6IDEwMCU7CgkJaGVpZ2h0OiAxMDAlOwoJCW1pbi1oZWlnaHQ6IDA7CgkJbWluLXdpZHRoOiAwOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciAuanMtcGxvdGx5LXBsb3QgLnBsb3RseSBkaXYgewoJCW1hcmdpbjogMCBhdXRvOyAvLyBUaGlzIGNlbnRlcnMgdGhlIHBsb3QKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIucG9wcGVkLW91dCB7CgkJb3ZlcmZsb3c6IGF1dG87CgkJei1pbmRleDogMTAwMDsKCQlwb3NpdGlvbjogZml4ZWQ7CgkJcmVzaXplOiBib3RoOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMHB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwcHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciB7CgkJZGlzcGxheTogZmxleDsKCQlmbGV4LWZsb3c6IHJvdyB3cmFwOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDEycHg7CgkJcG9zaXRpb246IGZpeGVkOwoJCXotaW5kZXg6IDEwMDE7CgkJY3Vyc29yOiBtb3ZlOwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgLTEwMCUpOwoJCXBhZGRpbmc6IDVweDsKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIHNwYW4gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQlmbGV4OiAxCgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlci5oaWRkZW4gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuY2xpcGJvYXJkLXNwYW4gewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCX0KCS5jbGlwYm9hcmQtdmFsdWUgewoJCXBhZGRpbmctcmlnaHQ6IDVweDsKCQlwYWRkaW5nLWxlZnQ6IDJweDsKCQljdXJzb3I6IHRleHQ7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlmbGV4OiAwIDAgMTAwJTsKCQl0ZXh0LWFsaWduOiBjZW50ZXI7CgkJYm9yZGVyLXRvcDogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCW1hcmdpbi10b3A6IDVweDsKCQlkaXNwbGF5OiBub25lOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5maWxlc2F2ZSAuY2xpcGJvYXJkLXNwYW4uZmlsZW5hbWUgewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5jbGlwYm9hcmQtdmFsdWUuZmlsZW5hbWUgewoJCW1hcmdpbi1sZWZ0OiAzcHg7CgkJdGV4dC1hbGlnbjogbGVmdDsKCQltaW4td2lkdGg6IG1pbig2MCUsIG1pbi1jb250ZW50KTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogaW5saW5lLWZsZXg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IC5sYWJlbCB7CgkJZmxleDogMCAwIDA7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZvcm1hdCB7CgkJcG9zaXRpb246IHJlbGF0aXZlOwoJCWZsZXg6IDEgMCBhdXRvOwoJCW1pbi13aWR0aDogMzBweDsKCQltYXJnaW4tcmlnaHQ6IDEwcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJCWZsZXgtZmxvdzogY29sdW1uOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXBhZGRpbmctbGVmdDogM3B4OwoJCXotaW5kZXg6IDIwMDA7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgewoJCWN1cnNvcjogcG9pbnRlcjsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlwYWRkaW5nOiAzcHg7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTNweCwgLTZweCk7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5mb3JtYXQtb3B0aW9uOm5vdCguc2VsZWN0ZWQpIHsKCQltYXJnaW4tdG9wOiAzcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24uc2VsZWN0ZWQgewoJCW9yZGVyOiAtMTsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpob3ZlciB7CgkJYmFja2dyb3VuZC1jb2xvcjogdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7Cgl9CglzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZm9udC13ZWlnaHQ6IG5vcm1hbDsKCQljb2xvcjogdmFyKC0tcGx1dG8tb3V0cHV0LWNvbG9yKTsKCQlkaXNwbGF5OiBub25lOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgY2FsYygtMTAwJSAtIDEwcHgpKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkubGFiZWwgewoJCXVzZXItc2VsZWN0OiBub25lOwoJfQoJLmxhYmVsOmhvdmVyIHNwYW4uY29uZmlnLXZhbHVlIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJbWluLXdpZHRoOiAxNTBweDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5tYXRjaGluZy1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tbWFjcm8tY29sb3IpOwoJCWZvbnQtd2VpZ2h0OiBib2xkOwoJfQoJLmNsaXBib2FyZC1zcGFuLmRpZmZlcmVudC1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tdGFnLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KPC9zdHlsZT4KYCkKCmxldCBvcmlnaW5hbF9oZWlnaHQgPSBwbG90X29iai5sYXlvdXQuaGVpZ2h0CmxldCBvcmlnaW5hbF93aWR0aCA9IHBsb3Rfb2JqLmxheW91dC53aWR0aAovLyBGb3IgdGhlIGhlaWdodCB3ZSBoYXZlIHRvIGFsc28gcHV0IGEgZml4ZWQgdmFsdWUgaW4gY2FzZSB0aGUgcGxvdCBpcyBwdXQgb24gYSBub24tZml4ZWQtc2l6ZSBjb250YWluZXIgKGxpa2UgdGhlIGRlZmF1bHQgd3JhcHBlcikKLy8gV2UgZGVmaW5lIGEgdmFyaWFibGUgdG8gY2hlY2sgd2hldGhlciB3ZSBzdGlsbCBoYXZlIHRvIHJlbW92ZSB0aGUgZml4ZWQgaGVpZ2h0CmxldCByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmaXJzdFJ1bgpsZXQgY29udGFpbmVyX2hlaWdodCA9IG9yaWdpbmFsX2hlaWdodCA/PyBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPz8gNDAwCkNPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfaGVpZ2h0ICsgJ3B4JwoKLy8gV2UgY3JlYXRlIGEgUHJvbWlzZSB2ZXJzaW9uIG9mIHNldFRpbWVvdXQKZnVuY3Rpb24gZGVsYXkobXMpIHsKICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTsKfQoKLy8gV2UgaW1wb3J0IGludGVyYWN0IGZvciBkcmFnZ2luZy9yZXNpemluZwpjb25zdCB7IGRlZmF1bHQ6IGludGVyYWN0IH0gPSBhd2FpdCBpbXBvcnQoJ2h0dHBzOi8vZXNtLnNoL2ludGVyYWN0anNAMS4xMC4xOScpCgoKZnVuY3Rpb24gZ2V0SW1hZ2VPcHRpb25zKCkgewogIGNvbnN0IG8gPSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPz8ge307CiAgcmV0dXJuIHsKICAgIGZvcm1hdDogby5mb3JtYXQgPz8gInBuZyIsCiAgICB3aWR0aDogby53aWR0aCA/PyBvcmlnaW5hbF93aWR0aCwKICAgIGhlaWdodDogby5oZWlnaHQgPz8gb3JpZ2luYWxfaGVpZ2h0LAogICAgc2NhbGU6IG8uc2NhbGUgPz8gMSwKICAgIGZpbGVuYW1lOiBvLmZpbGVuYW1lID8/ICJuZXdwbG90IiwKICB9Owp9Cgpjb25zdCBDTElQQk9BUkRfSEVBREVSID0KICBDT05UQUlORVIucXVlcnlTZWxlY3RvcigiLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIiKSA/PwogIENPTlRBSU5FUi5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAiYWZ0ZXJiZWdpbiIsCiAgICBodG1sYDxkaXYgY2xhc3M9InBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgaGlkZGVuIj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZvcm1hdCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5Gb3JtYXQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZm9ybWF0Ij48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHdpZHRoIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPldpZHRoOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIHdpZHRoIj48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gaGVpZ2h0IgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkhlaWdodDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBoZWlnaHQiPjwvc3Bhbj5weDwvc3BhbgogICAgICA+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzY2FsZSIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5TY2FsZTo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBzY2FsZSI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHNldCI+U2V0PC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHVuc2V0Ij5VbnNldDwvYnV0dG9uPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gZmlsZW5hbWUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+RmlsZW5hbWU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZmlsZW5hbWUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgPC9kaXY+YAogICk7CgpmdW5jdGlvbiBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKSB7CiAgY29uc3QgdmFsaWRfY2xhc3NlcyA9IFsKICAgICJtaXNzaW5nLWNvbmZpZyIsCiAgICAibWF0Y2hpbmctY29uZmlnIiwKICAgICJkaWZmZXJlbnQtY29uZmlnIiwKICBdOwogIGZ1bmN0aW9uIHNldENsYXNzKGNsKSB7CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgdmFsaWRfY2xhc3NlcykgewogICAgICBjb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZShuYW1lLCBuYW1lID09IGNsKTsKICAgIH0KICB9CiAgLy8gV2UgdXNlIHRoZSBjdXN0b20gZ2V0dGVycyB3ZSdsbCBzZXQgdXAgaW4gdGhlIGNvbnRhaW5lcgogIGNvbnN0IHsgdWlfdmFsdWUsIGNvbmZpZ192YWx1ZSwgY29uZmlnX3NwYW4sIGtleSB9ID0gY29udGFpbmVyOwogIGlmIChjb25maWdfdmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgc2V0Q2xhc3MoIm1pc3NpbmctY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGlzIG5vdCBwcmVzZW50IGluIHRoZSBjb25maWcuYDsKICB9IGVsc2UgaWYgKHVpX3ZhbHVlID09IGNvbmZpZ192YWx1ZSkgewogICAgc2V0Q2xhc3MoIm1hdGNoaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgdGhlIHNhbWUgdmFsdWUgaW4gdGhlIGNvbmZpZyBhbmQgaW4gdGhlIGhlYWRlci5gOwogIH0gZWxzZSB7CiAgICBzZXRDbGFzcygiZGlmZmVyZW50LWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgYSBkaWZmZXJlbnQgdmFsdWUgKDxlbT4ke2NvbmZpZ192YWx1ZX08L2VtPikgaW4gdGhlIGNvbmZpZy5gOwogIH0KICAvLyBBZGQgaW5mbyBhYm91dCBzZXR0aW5nIGFuZCB1bnNldHRpbmcKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgb24gdGhlIGxhYmVsIDxlbT48Yj5vbmNlPC9iPjwvZW0+IHRvIHNldCB0aGUgY3VycmVudCBVSSB2YWx1ZSBpbiB0aGUgY29uZmlnLmAKICApOwogIGNvbmZpZ19zcGFuLmluc2VydEFkamFjZW50SFRNTCgKICAgICJiZWZvcmVlbmQiLAogICAgYDxicj5DbGljayA8ZW0+PGI+dHdpY2U8L2I+PC9lbT4gdG8gcmVtb3ZlIHRoaXMga2V5IGZyb20gdGhlIGNvbmZpZy5gCiAgKTsKfQoKY29uc3QgdmFsaWRfZm9ybWF0cyA9IFsicG5nIiwgInN2ZyIsICJ3ZWJwIiwgImpwZWciLCAiZnVsbC1qc29uIl07CmZ1bmN0aW9uIGluaXRpYWxpemVVSVZhbHVlU3BhbihzcGFuLCBrZXksIHZhbHVlKSB7CiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9IGtleSA9PT0gImZvcm1hdCIgPyAiZmFsc2UiIDogInRydWUiOwogIGxldCBwYXJzZSA9ICh4KSA9PiB4OwogIGxldCB1cGRhdGUgPSAoeCkgPT4gKHNwYW4udGV4dENvbnRlbnQgPSB4KTsKICBpZiAoa2V5ID09PSAid2lkdGgiIHx8IGtleSA9PT0gImhlaWdodCIpIHsKICAgIHBhcnNlID0gKHgpID0+IE1hdGgucm91bmQocGFyc2VGbG9hdCh4KSk7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJzY2FsZSIpIHsKICAgIHBhcnNlID0gcGFyc2VGbG9hdDsKICB9IGVsc2UgaWYgKGtleSA9PT0gImZvcm1hdCIpIHsKICAgIC8vIFdlIHJlbW92ZSBjb250ZW50RWRpdGFibGUKICAgIHNwYW4uY29udGVudEVkaXRhYmxlID0gImZhbHNlIjsKICAgIC8vIEhlcmUgd2UgZmlyc3QgYWRkIHRoZSBzdWJzcGFucyBmb3IgZWFjaCBvcHRpb24KICAgIGNvbnN0IG9wdHNfZGl2ID0gc3Bhbi5hcHBlbmRDaGlsZChodG1sYDxkaXYgY2xhc3M9ImZvcm1hdC1vcHRpb25zIj48L2Rpdj5gKTsKICAgIGZvciAoY29uc3QgZm10IG9mIHZhbGlkX2Zvcm1hdHMpIHsKICAgICAgY29uc3Qgb3B0ID0gb3B0c19kaXYuYXBwZW5kQ2hpbGQoCiAgICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iZm9ybWF0LW9wdGlvbiAke2ZtdH0iPiR7Zm10fTwvc3Bhbj5gCiAgICAgICk7CiAgICAgIG9wdC5vbmNsaWNrID0gKGUpID0+IHsKICAgICAgICBzcGFuLnZhbHVlID0gb3B0LnRleHRDb250ZW50OwogICAgICB9OwogICAgfQogICAgcGFyc2UgPSAoeCkgPT4gewogICAgICByZXR1cm4gdmFsaWRfZm9ybWF0cy5pbmNsdWRlcyh4KSA/IHggOiBsb2NhbFZhbHVlOwogICAgfTsKICAgIHVwZGF0ZSA9ICh4KSA9PiB7CiAgICAgIGZvciAoY29uc3Qgb3B0IG9mIG9wdHNfZGl2LmNoaWxkcmVuKSB7CiAgICAgICAgb3B0LmNsYXNzTGlzdC50b2dnbGUoInNlbGVjdGVkIiwgb3B0LnRleHRDb250ZW50ID09PSB4KTsKICAgICAgfQogICAgfTsKICB9IGVsc2UgewogICAgLy8gV2Ugb25seSBoYXZlIGZpbGVuYW1lIGhlcmUKICB9CiAgbGV0IGxvY2FsVmFsdWU7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwYW4sICJ2YWx1ZSIsIHsKICAgIGdldDogKCkgPT4gewogICAgICByZXR1cm4gbG9jYWxWYWx1ZTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgaWYgKHZhbCAhPT0gIiIpIHsKICAgICAgICBsb2NhbFZhbHVlID0gcGFyc2UodmFsKTsKICAgICAgfQogICAgICB1cGRhdGUobG9jYWxWYWx1ZSk7CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKICAvLyBXZSBhbHNvIGFzc2lnbiBhIGxpc3RlbmVyIHNvIHRoYXQgdGhlIGVkaXRhYmxlIGlzIGJsdXJyZWQgd2hlbiBlbnRlciBpcyBwcmVzc2VkCiAgc3Bhbi5vbmtleWRvd24gPSAoZSkgPT4gewogICAgaWYgKGUua2V5Q29kZSA9PT0gMTMpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBzcGFuLmJsdXIoKTsKICAgIH0KICB9OwogIHNwYW4udmFsdWUgPSB2YWx1ZTsKfQoKZnVuY3Rpb24gaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3BhbihzcGFuLCBrZXkpIHsKICAvLyBIZXJlIHdlIG1vc3RseSB3YW50IHRvIGRlZmluZSB0aGUgc2V0dGVyIGFuZCBnZXR0ZXIKICBjb25zdCBjb250YWluZXIgPSBzcGFuLmNsb3Nlc3QoIi5jbGlwYm9hcmQtc3BhbiIpOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgfSwKICAgIHNldDogKHZhbCkgPT4gewogICAgICAvLyBpZiB1bmRlZmluZWQgaXMgcGFzc2VkLCB3ZSByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIG9wdGlvbnMKICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZGVsZXRlIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgICB9IGVsc2UgewogICAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldID0gdmFsOwogICAgICB9CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKfQoKY29uc3QgY29uZmlnX3NwYW5zID0ge307CmZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGdldEltYWdlT3B0aW9ucygpKSkgewogIGNvbnN0IGNvbnRhaW5lciA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcihgLmNsaXBib2FyZC1zcGFuLiR7a2V5fWApOwogIGNvbnN0IGxhYmVsID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5sYWJlbCIpOwogIC8vIFdlIGdpdmUgdGhlIGxhYmVsIGEgZnVuY3Rpb24gdGhhdCBvbiBzaW5nbGUgY2xpY2sgd2lsbCBzZXQgdGhlIGN1cnJlbnQgdmFsdWUgYW5kIHdpdGggZG91YmxlIGNsaWNrIHdpbGwgdW5zZXQgaXQKICBsYWJlbC5vbmNsaWNrID0gRHVhbENsaWNrKAogICAgKCkgPT4gewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfSwKICAgIChlKSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJlIiwgZSk7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IHVuZGVmaW5lZDsKICAgIH0KICApOwogIGNvbnN0IHVpX3ZhbHVlX3NwYW4gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC12YWx1ZSIpOwogIGNvbnN0IGNvbmZpZ192YWx1ZV9zcGFuID0KICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuY29uZmlnLXZhbHVlIikgPz8KICAgIGxhYmVsLmluc2VydEFkamFjZW50RWxlbWVudCgKICAgICAgImFmdGVyYmVnaW4iLAogICAgICBodG1sYDxzcGFuIGNsYXNzPSJjb25maWctdmFsdWUiPjwvc3Bhbj5gCiAgICApOwogIC8vIEFzc2luZyB0aGUgdHdvIHNwYW5zIGFzIHByb3BlcnRpZXMgb2YgdGhlIGNvbnRhaW5pbmcgc3BhbgogIGNvbnRhaW5lci51aV9zcGFuID0gdWlfdmFsdWVfc3BhbjsKICBjb250YWluZXIuY29uZmlnX3NwYW4gPSBjb25maWdfdmFsdWVfc3BhbjsKICBjb250YWluZXIua2V5ID0ga2V5OwogIGNvbmZpZ19zcGFuc1trZXldID0gY29udGFpbmVyOwogIGlmIChmaXJzdFJ1bikgewogICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID0KICAgICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogICAgLy8gV2UgZG8gdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSB2YWx1ZSBzcGFuCiAgICBpbml0aWFsaXplVUlWYWx1ZVNwYW4odWlfdmFsdWVfc3Bhbiwga2V5LCB2YWx1ZSk7CiAgICAvLyBUaGVuIHdlIGluaXRpYWxpemUgdGhlIGNvbmZpZyB2YWx1ZQogICAgaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3Bhbihjb25maWdfdmFsdWVfc3Bhbiwga2V5KTsKICAgIC8vIFdlIHB1dCBzb21lIGNvbnZlbmllbmNlIGdldHRlcnMvc2V0dGVycwogICAgLy8gdWlfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgInVpX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IHVpX3ZhbHVlX3NwYW4udmFsdWUsCiAgICAgIHNldDogKHZhbCkgPT4gewogICAgICAgIHVpX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICAgIC8vIGNvbmZpZ192YWx1ZSBmb3J3YXJkCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAiY29uZmlnX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IGNvbmZpZ192YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSA9IHZhbDsKICAgICAgfSwKICAgIH0pOwogIH0KfQoKLy8gVGhlc2Ugb2JqZWN0cyB3aWxsIGNvbnRhaW4gdGhlIGRlZmF1bHQgdmFsdWUKCi8vIFRoaXMgY29kZSB1cGRhdGVzIHRoZSBpbWFnZSBvcHRpb25zIGluIHRoZSBQTE9UIGNvbmZpZyB3aXRoIHRoZSBwcm92aWRlZCBvbmVzCmZ1bmN0aW9uIHNldEltYWdlT3B0aW9ucyhvKSB7CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBvW2tleV07CiAgfQp9CmZ1bmN0aW9uIHVuc2V0SW1hZ2VPcHRpb25zKCkgewogIHNldEltYWdlT3B0aW9ucyh7fSk7Cn0KCmNvbnN0IHNldF9idXR0b24gPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtc3Bhbi5zZXQiKTsKY29uc3QgdW5zZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4udW5zZXQiKTsKaWYgKGZpcnN0UnVuKSB7CiAgc2V0X2J1dHRvbi5vbmNsaWNrID0gKGUpID0+IHsKICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfQogIH07CiAgdW5zZXRfYnV0dG9uLm9uY2xpY2sgPSB1bnNldEltYWdlT3B0aW9uczsKfQoKLy8gV2UgYWRkIGEgZnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIGNsaXBib2FyZCBpcyBwb3BwZWQgb3V0CkNPTlRBSU5FUi5pc1BvcHBlZE91dCA9ICgpID0+IHsKICByZXR1cm4gQ09OVEFJTkVSLmNsYXNzTGlzdC5jb250YWlucygicG9wcGVkLW91dCIpOwp9OwoKQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNlZG93biA9IGZ1bmN0aW9uIChldmVudCkgewogIGlmIChldmVudC50YXJnZXQubWF0Y2hlcygic3Bhbi5jbGlwYm9hcmQtdmFsdWUiKSkgewogICAgY29uc29sZS5sb2coIldlIGRvbid0IG1vdmUhIik7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IHN0YXJ0ID0gewogICAgbGVmdDogcGFyc2VGbG9hdChDT05UQUlORVIuc3R5bGUubGVmdCksCiAgICB0b3A6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLnRvcCksCiAgICBYOiBldmVudC5wYWdlWCwKICAgIFk6IGV2ZW50LnBhZ2VZLAogIH07CiAgZnVuY3Rpb24gbW92ZUF0KGV2ZW50LCBzdGFydCkgewogICAgY29uc3QgdG9wID0gZXZlbnQucGFnZVkgLSBzdGFydC5ZICsgc3RhcnQudG9wICsgInB4IjsKICAgIGNvbnN0IGxlZnQgPSBldmVudC5wYWdlWCAtIHN0YXJ0LlggKyBzdGFydC5sZWZ0ICsgInB4IjsKICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUudG9wID0gdG9wOwogIH0KCiAgLy8gbW92ZSBvdXIgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGJhbGwgdW5kZXIgdGhlIHBvaW50ZXIKICBtb3ZlQXQoZXZlbnQsIHN0YXJ0KTsKICBmdW5jdGlvbiBvbk1vdXNlTW92ZShldmVudCkgewogICAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgfQoKICAvLyBXZSB1c2UgdGhpcyB0byByZW1vdmUgdGhlIG1vdXNlbW92ZSB3aGVuIGNsaWNraW5nIG91dHNpZGUgb2YgdGhlIGNvbnRhaW5lcgogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CgogIC8vIG1vdmUgdGhlIGNvbnRhaW5lciBvbiBtb3VzZW1vdmUKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCBvbk1vdXNlTW92ZSwgewogICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCwKICB9KTsKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICBjbGVhblVwKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKCiAgZnVuY3Rpb24gY2xlYW5VcCgpIHsKICAgIGNvbnNvbGUubG9nKCJjbGVhbmluZyB1cCB0aGUgcGxvdCBtb3ZlIGxpc3RlbmVyIik7CiAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICBDTElQQk9BUkRfSEVBREVSLm9ubW91c2V1cCA9IG51bGw7CiAgfQoKICAvLyAoMykgZHJvcCB0aGUgYmFsbCwgcmVtb3ZlIHVubmVlZGVkIGhhbmRsZXJzCiAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBjbGVhblVwOwp9OwoKZnVuY3Rpb24gc2VuZFRvQ2xpcGJvYXJkKGJsb2IpIHsKICBpZiAoIW5hdmlnYXRvci5jbGlwYm9hcmQpIHsKICAgIGFsZXJ0KAogICAgICAiVGhlIENsaXBib2FyZCBBUEkgZG9lcyBub3Qgc2VlbSB0byBiZSBhdmFpbGFibGUsIG1ha2Ugc3VyZSB0aGUgUGx1dG8gbm90ZWJvb2sgaXMgYmVpbmcgdXNlZCBmcm9tIGVpdGhlciBsb2NhbGhvc3Qgb3IgYW4gaHR0cHMgc291cmNlLiIKICAgICk7CiAgfQogIG5hdmlnYXRvci5jbGlwYm9hcmQKICAgIC53cml0ZShbCiAgICAgIG5ldyBDbGlwYm9hcmRJdGVtKHsKICAgICAgICAvLyBUaGUga2V5IGlzIGRldGVybWluZWQgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIGJsb2IncyB0eXBlLgogICAgICAgIFtibG9iLnR5cGVdOiBibG9iLAogICAgICB9KSwKICAgIF0pCiAgICAudGhlbigKICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgIGNvbnNvbGUubG9nKCJBc3luYzogQ29weWluZyB0byBjbGlwYm9hcmQgd2FzIHN1Y2Nlc3NmdWwhIik7CiAgICAgIH0sCiAgICAgIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJBc3luYzogQ291bGQgbm90IGNvcHkgdGV4dDogIiwgZXJyKTsKICAgICAgfQogICAgKTsKfQoKZnVuY3Rpb24gY29weUltYWdlVG9DbGlwYm9hcmQoKSB7CiAgLy8gV2UgZXh0cmFjdCB0aGUgaW1hZ2Ugb3B0aW9ucyBmcm9tIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzIChpZiB0aGV5IGV4aXN0KQogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuIFdlIGFsc28gaWdub3JlIGZvcm1hdCBiZWNhdXNlIHRoZSBjbGlwYm9hcmQgb25seSBzdXBwb3J0cyBwbmcuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwga2V5ID09PSAiZm9ybWF0IikgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbmZpZ1trZXldID0gdmFsOwogIH0KICBQbG90bHkudG9JbWFnZShQTE9ULCBjb25maWcpLnRoZW4oZnVuY3Rpb24gKGRhdGFVcmwpIHsKICAgIGZldGNoKGRhdGFVcmwpCiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5ibG9iKCkpCiAgICAgIC50aGVuKChibG9iKSA9PiB7CiAgICAgICAgY29uc3QgcGFzdGVfcmVjZWl2ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdwYXN0ZS1yZWNlaXZlci5wbHV0b3Bsb3RseScpCiAgICAgICAgaWYgKHBhc3RlX3JlY2VpdmVyKSB7CiAgICAgICAgICBwYXN0ZV9yZWNlaXZlci5hdHRhY2hJbWFnZShkYXRhVXJsLCBDT05UQUlORVIpCiAgICAgICAgfQogICAgICAgIHNlbmRUb0NsaXBib2FyZChibG9iKQogICAgICB9KTsKICB9KTsKfQoKZnVuY3Rpb24gc2F2ZUltYWdlVG9GaWxlKCkgewogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LmRvd25sb2FkSW1hZ2UoUExPVCwgY29uZmlnKTsKfQoKbGV0IGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwLCB0b3A6IDAsIGxlZnQ6IDAgfTsKZnVuY3Rpb24gdW5wb3BfY29udGFpbmVyKGNsKSB7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCBmYWxzZSk7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoY2wsIGZhbHNlKTsKICAvLyBXZSBmaXggdGhlIGhlaWdodCBiYWNrIHRvIHRoZSB2YWx1ZSBpdCBoYWQgYmVmb3JlIHBvcG91dCwgYWxzbyBzZXR0aW5nIHRoZSBmbGFnIHRvIHNpZ25hbCB0aGF0IHVwb24gZmlyc3QgcmVzaXplIHdlIHJlbW92ZSB0aGUgZml4ZWQgaW5saW5lLXN0eWxlCiAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9IGNvbnRhaW5lcl9yZWN0LmhlaWdodCArICJweCI7CiAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gdHJ1ZTsKICAvLyBXZSBzZXQgdGhlIG90aGVyIGZpeGVkIGlubGluZS1zdHlsZXMgdG8gbnVsbAogIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogIENPTlRBSU5FUi5zdHlsZS50b3AgPSAiIjsKICBDT05UQUlORVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIFdlIGFsc28gcmVtb3ZlIHRoZSBDTElQQk9BUkRfSEVBREVSCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9ICIiOwogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIEZpbmFsbHkgd2UgcmVtb3ZlIHRoZSBoaWRkZW4gY2xhc3MgdG8gdGhlIGhlYWRlcgogIENMSVBCT0FSRF9IRUFERVIuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgdHJ1ZSk7CiAgcmV0dXJuOwp9CmZ1bmN0aW9uIHBvcG91dF9jb250YWluZXIob3B0cykgewogIGNvbnN0IGNsID0gb3B0cz8uY2w7CiAgY29uc3QgdGFyZ2V0X2NvbnRhaW5lcl9zaXplID0gb3B0cz8udGFyZ2V0X2NvbnRhaW5lcl9zaXplID8/IHt9OwogIGNvbnN0IHRhcmdldF9wbG90X3NpemUgPSBvcHRzPy50YXJnZXRfcGxvdF9zaXplID8/IHt9OwogIGlmIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgcmV0dXJuIHVucG9wX2NvbnRhaW5lcihjbCk7CiAgfQogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBjbCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0cnVlKTsKICAvLyBXZSBleHRyYWN0IHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNvbnRhaW5lciwgc2F2ZSB0aGVtIGFuZCBmaXggdGhlbQogIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH0gPSBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgY29udGFpbmVyX3JlY3QgPSB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9OwogIC8vIFdlIHNhdmUgdGhlIGN1cnJlbnQgcGxvdCBzaXplIGJlZm9yZSB3ZSBwb3AgYXMgaXQgd2lsbCBmaWxsIHRoZSBzY3JlZW4KICBjb25zdCBjdXJyZW50X3Bsb3Rfc2l6ZSA9IHsKICAgIHdpZHRoOiBQTE9ULl9mdWxsTGF5b3V0LndpZHRoLAogICAgaGVpZ2h0OiBQTE9ULl9mdWxsTGF5b3V0LmhlaWdodCwKICB9OwogIC8vIFdlIGhhdmUgdG8gc2F2ZSB0aGUgcGFkIGRhdGEgYmVmb3JlIHBvcHBpbmcgc28gd2UgY2FuIHJlc2l6ZSBwcmVjaXNlbHkKICBjb25zdCBwYWQgPSB7fTsKICBwYWQudW5wb3BwZWQgPSBnZXRTaXplRGF0YSgpLmNvbnRhaW5lcl9wYWQ7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCB0cnVlKTsKICBwYWQucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIC8vIFdlIGRvIHRvcCBhbmQgbGVmdCBiYXNlZCBvbiB0aGUgY3VycmVudCByZWN0CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ0b3AiLCAibGVmdCJdKSB7CiAgICBjb25zdCBzdGFydF92YWwgPSB0YXJnZXRfY29udGFpbmVyX3NpemVba2V5XSA/PyBjb250YWluZXJfcmVjdFtrZXldOwogICAgbGV0IG9mZnNldCA9IDA7CiAgICBmb3IgKGNvbnN0IGtpbmQgb2YgWyJwYWRkaW5nIiwgImJvcmRlciJdKSB7CiAgICAgIG9mZnNldCArPSBwYWQucG9wcGVkW2tpbmRdW2tleV0gLSBwYWQudW5wb3BwZWRba2luZF1ba2V5XTsKICAgIH0KICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gc3RhcnRfdmFsIC0gb2Zmc2V0ICsgInB4IjsKICAgIGlmIChrZXkgPT09ICJsZWZ0IikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgLy8gV2UgY29tcHV0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBkZXBlbmRpbmcgb24gZXZlbnR1YWwgY29uZmlnIGRhdGEKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7CiAgICB3aWR0aDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS53aWR0aCA/PwogICAgICBjb25maWdfc3BhbnMud2lkdGguY29uZmlnX3ZhbHVlID8/CiAgICAgIGN1cnJlbnRfcGxvdF9zaXplLndpZHRoLAogICAgaGVpZ2h0OgogICAgICB0YXJnZXRfcGxvdF9zaXplLmhlaWdodCA/PwogICAgICBjb25maWdfc3BhbnMuaGVpZ2h0LmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS5oZWlnaHQsCiAgfSk7CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgY29uc3QgdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY3N6W2tleV07CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHZhbCArICJweCI7CiAgICBpZiAoa2V5ID09PSAid2lkdGgiKSB7CiAgICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGVba2V5XSA9IENPTlRBSU5FUi5zdHlsZVtrZXldOwogICAgfQogIH0KICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIGZhbHNlKTsKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICB1bnBvcF9jb250YWluZXIoKTsKICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9LAogICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0KICApOwp9CgpDT05UQUlORVIucG9wT3V0ID0gcG9wb3V0X2NvbnRhaW5lcjsKCmZ1bmN0aW9uIER1YWxDbGljayhzaW5nbGVfZnVuYywgZGJsX2Z1bmMpIHsKICBsZXQgbmNsaWNrcyA9IDA7CiAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7CiAgICBuY2xpY2tzICs9IDE7CiAgICBpZiAobmNsaWNrcyA+IDEpIHsKICAgICAgZGJsX2Z1bmMoLi4uYXJncyk7CiAgICAgIG5jbGlja3MgPSAwOwogICAgfSBlbHNlIHsKICAgICAgZGVsYXkoMzAwKS50aGVuKCgpID0+IHsKICAgICAgICBpZiAobmNsaWNrcyA9PSAxKSB7CiAgICAgICAgICBzaW5nbGVfZnVuYyguLi5hcmdzKTsKICAgICAgICB9CiAgICAgICAgbmNsaWNrcyA9IDA7CiAgICAgIH0pOwogICAgfQogIH07Cn0KCi8vIFdlIHJlbW92ZSB0aGUgZGVmYXVsdCBkb3dubG9hZCBpbWFnZSBidXR0b24KcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9SZW1vdmUgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlLAogIFsidG9JbWFnZSJdCik7Ci8vIFdlIGFkZCB0aGUgY3VzdG9tIGJ1dHRvbiB0byB0aGUgbW9kZWJhcgpwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb0FkZCA9IF8udW5pb24oCiAgcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQsCiAgWwogICAgewogICAgICBuYW1lOiAiQ29weSBQTkcgdG8gQ2xpcGJvYXJkIiwKICAgICAgaWNvbjogewogICAgICAgIGhlaWdodDogNTIwLAogICAgICAgIHdpZHRoOiA1MjAsCiAgICAgICAgcGF0aDogIk0yODAgNjRoNDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRWNDQ4YzAgMzUuMy0yOC43IDY0LTY0IDY0SDY0Yy0zNS4zIDAtNjQtMjguNy02NC02NFYxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRoNDAgOS42QzEyMSAyNy41IDE1My4zIDAgMTkyIDBzNzEgMjcuNSA3OC40IDY0SDI4MHpNNjQgMTEyYy04LjggMC0xNiA3LjItMTYgMTZWNDQ4YzAgOC44IDcuMiAxNiAxNiAxNkgzMjBjOC44IDAgMTYtNy4yIDE2LTE2VjEyOGMwLTguOC03LjItMTYtMTYtMTZIMzA0djI0YzAgMTMuMy0xMC43IDI0LTI0IDI0SDE5MiAxMDRjLTEzLjMgMC0yNC0xMC43LTI0LTI0VjExMkg2NHptMTI4LThhMjQgMjQgMCAxIDAgMC00OCAyNCAyNCAwIDEgMCAwIDQ4eiIsCiAgICAgIH0sCiAgICAgIGRpcmVjdGlvbjogInVwIiwKICAgICAgY2xpY2s6IER1YWxDbGljayhjb3B5SW1hZ2VUb0NsaXBib2FyZCwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoKTsKICAgICAgfSksCiAgICB9LAogICAgewogICAgICBuYW1lOiAiRG93bmxvYWQgSW1hZ2UiLAogICAgICBpY29uOiBQbG90bHkuSWNvbnMuY2FtZXJhLAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soc2F2ZUltYWdlVG9GaWxlLCAoKSA9PiB7CiAgICAgICAgcG9wb3V0X2NvbnRhaW5lcih7IGNsOiAiZmlsZXNhdmUiIH0pOwogICAgICB9KSwKICAgIH0sCiAgXQopOwoKZnVuY3Rpb24gZ2V0T2Zmc2V0RGF0YShlbCkgewogIGxldCBjcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsLCBudWxsKTsKICBjb25zdCBvZGF0YSA9IHsKICAgIHBhZGRpbmc6IHsKICAgICAgbGVmdDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSwKICAgICAgYm90dG9tOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSArIHBhcnNlRmxvYXQoY3MucGFkZGluZ0JvdHRvbSksCiAgICB9LAogICAgYm9yZGVyOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyTGVmdFdpZHRoKSwKICAgICAgcmlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyUmlnaHRXaWR0aCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5ib3JkZXJUb3BXaWR0aCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCkgKyBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICB9CiAgfTsKICBpZiAoZWwgPT09IFBMT1QpIHsKICAgIC8vIEZvciB0aGUgUExPVCB3ZSBhbHNvIHdhbnQgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIG9mZnNldAogICAgb2RhdGEub2Zmc2V0ID0gewogICAgICB0b3A6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0VG9wIDogMCwKICAgICAgbGVmdDogUExPVC5vZmZzZXRQYXJlbnQgPT0gQ09OVEFJTkVSID8gUExPVC5vZmZzZXRMZWZ0IDogMCwKICAgIH0KICB9CiAgcmV0dXJuIG9kYXRhOwp9CmZ1bmN0aW9uIGdldFNpemVEYXRhKCkgewogIGNvbnN0IGRhdGEgPSB7CiAgICBwbG90X3BhZDogZ2V0T2Zmc2V0RGF0YShQTE9UKSwKICAgIHBsb3RfcmVjdDogUExPVC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICAgIGNvbnRhaW5lcl9wYWQ6IGdldE9mZnNldERhdGEoQ09OVEFJTkVSKSwKICAgIGNvbnRhaW5lcl9yZWN0OiBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgfTsKICByZXR1cm4gZGF0YTsKfQpmdW5jdGlvbiBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgY29uc3QgY29tcHV0ZWRfc2l6ZSA9IGNvbXB1dGVQbG90U2l6ZShzaXplRGF0YSk7CiAgY29uc3Qgb2Zmc2V0cyA9IGNvbXB1dGVkX3NpemUub2Zmc2V0czsKCiAgY29uc3QgcGxvdF9kYXRhID0gewogICAgd2lkdGg6IHdpZHRoID8/IGNvbXB1dGVkX3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IGhlaWdodCA/PyBjb21wdXRlZF9zaXplLmhlaWdodCwKICB9OwoKICByZXR1cm4gewogICAgd2lkdGg6ICh3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoKSArIG9mZnNldHMud2lkdGgsCiAgICBoZWlnaHQ6IChoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQpICsgb2Zmc2V0cy5oZWlnaHQsCiAgICBub0NoYW5nZTogd2lkdGggPT0gY29tcHV0ZWRfc2l6ZS53aWR0aCAmJiBoZWlnaHQgPT0gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfQp9CgovLyBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hhbmdlIHRoZSBjb250YWluZXIgc2l6ZSBzbyB0aGF0IHRoZSByZXN1bHRpbmcgcGxvdCB3aWxsIGJlIG1hdGNoaW5nIHRoZSBwcm92aWRlZCBzcGVjcwpmdW5jdGlvbiBjaGFuZ2VDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICBpZiAoIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICBjb25zb2xlLmxvZygiVHJpZWQgdG8gY2hhbmdlIGNvbnRhaW5lciBzaXplIHdoZW4gbm90IHBvcHBlZCwgaWdub3JpbmciKTsKICAgIHJldHVybjsKICB9CgogIGNvbnN0IGNzeiA9IGNvbXB1dGVDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSk7CgogIGlmIChjc3oubm9DaGFuZ2UpIHsKICAgIGNvbnNvbGUubG9nKCJTaXplIGlzIHRoZSBzYW1lIGFzIGN1cnJlbnQsIGlnbm9yaW5nIik7CiAgICByZXR1cm4KICB9CiAgLy8gV2UgYXJlIG5vdyBnb2luZyB0byBzZXQgaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgY29udGFpbmVyCiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSBjc3pba2V5XSArICJweCI7CiAgfQp9Ci8vIFdlIG5vdyBjcmVhdGUgdGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCB1cGRhdGUgdGhlIHBsb3QgYmFzZWQgb24gdGhlIHZhbHVlcyBzcGVjaWZpZWQKZnVuY3Rpb24gdXBkYXRlRnJvbUhlYWRlcigpIHsKICBjb25zdCBoZWFkZXJfZGF0YSA9IHsKICAgIGhlaWdodDogY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSwKICAgIHdpZHRoOiBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUsCiAgfTsKICBjaGFuZ2VDb250YWluZXJTaXplKGhlYWRlcl9kYXRhKTsKfQovLyBXZSBhc3NpZ24gdGhpcyBmdW5jdGlvbiB0byB0aGUgb25ibHVyIGV2ZW50IG9mIHdpZHRoIGFuZCBoZWlnaHQKaWYgKGZpcnN0UnVuKSB7CiAgZm9yIChjb25zdCBjb250YWluZXIgb2YgT2JqZWN0LnZhbHVlcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIudWlfc3Bhbi5vbmJsdXIgPSAoZSkgPT4gewogICAgICBjb250YWluZXIudWlfdmFsdWUgPSBjb250YWluZXIudWlfc3Bhbi50ZXh0Q29udGVudDsKICAgICAgdXBkYXRlRnJvbUhlYWRlcigpOwogICAgfTsKICB9Cn0KLy8gVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgcGxvdCBzaXplIHRvIHVzZSBmb3IgcmVsYXlvdXQgYXMgYSBmdW5jdGlvbiBvZiB0aGUgY29udGFpbmVyIHNpemUKZnVuY3Rpb24gY29tcHV0ZVBsb3RTaXplKGRhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgLy8gUmVtb3ZlIFBhZGRpbmcKICBjb25zdCB7IGNvbnRhaW5lcl9wYWQsIHBsb3RfcGFkLCBjb250YWluZXJfcmVjdCB9ID0gZGF0YTsKICBjb25zdCBvZmZzZXRzID0gewogICAgd2lkdGg6CiAgICAgIHBsb3RfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBwbG90X3BhZC5ib3JkZXIud2lkdGggKwogICAgICBwbG90X3BhZC5vZmZzZXQubGVmdCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy53aWR0aCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLndpZHRoLAogICAgaGVpZ2h0OgogICAgICBwbG90X3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIHBsb3RfcGFkLmJvcmRlci5oZWlnaHQgKwogICAgICBwbG90X3BhZC5vZmZzZXQudG9wICsKICAgICAgY29udGFpbmVyX3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLmhlaWdodCwKICB9OwogIGNvbnN0IHN6ID0gewogICAgd2lkdGg6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3Qud2lkdGggLSBvZmZzZXRzLndpZHRoKSwKICAgIGhlaWdodDogTWF0aC5yb3VuZChjb250YWluZXJfcmVjdC5oZWlnaHQgLSBvZmZzZXRzLmhlaWdodCksCiAgICBvZmZzZXRzLAogIH07CiAgcmV0dXJuIHN6Owp9CgovLyBDcmVhdGUgdGhlIHJlc2l6ZU9ic2VydmVyIHRvIG1ha2UgdGhlIHBsb3QgZXZlbiBtb3JlIHJlc3BvbnNpdmUhIDptYWdpYzoKY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHsKICBjb25zdCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCk7CiAgY29uc3Qge2NvbnRhaW5lcl9yZWN0LCBjb250YWluZXJfcGFkfSA9IHNpemVEYXRhOwogIGxldCBwbG90X3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIC8vIFdlIHNhdmUgdGhlIGhlaWdodCBpbiB0aGUgUExPVCBvYmplY3QKICBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQ7CiAgLy8gV2UgZGVhbCB3aXRoIHNvbWUgc3R1ZmYgaWYgdGhlIGNvbnRhaW5lciBpcyBwb3BwcGVkCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9IGNvbnRhaW5lcl9yZWN0LndpZHRoICsgInB4IjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBjb250YWluZXJfcmVjdC5sZWZ0ICsgInB4IjsKICBjb25maWdfc3BhbnMuaGVpZ2h0LnVpX3ZhbHVlID0gcGxvdF9zaXplLmhlaWdodDsKICBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUgPSBwbG90X3NpemUud2lkdGg7CiAgLyogCgkJVGhlIGFkZGl0aW9uIG9mIHRoZSBpbnZhbGlkIGFyZ3VtZW50IGBwbHV0b3Jlc2l6ZWAgc2VlbXMgdG8gZml4IHRoZSBwcm9ibGVtIHdpdGggY2FsbGluZyBgcmVsYXlvdXRgIHNpbXBseSB3aXRoIGB7YXV0b3NpemU6IHRydWV9YCBhcyB1cGRhdGUgYnJlYWtpbmcgbW91c2UgcmVsYXlvdXQgZXZlbnRzIHRyYWNraW5nLiAKCQlTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Bsb3RseS9wbG90bHkuanMvaXNzdWVzLzYxNTYgZm9yIGRldGFpbHMKCQkqLwogIGxldCBjb25maWcgPSB7CiAgICAvLyBJZiB0aGlzIGlzIHBvcHBlZCBvdXQsIHdlIGlnbm9yZSB0aGUgb3JpZ2luYWwgd2lkdGgvaGVpZ2h0CiAgICB3aWR0aDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfd2lkdGgpID8/IHBsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfaGVpZ2h0KSA/PyBwbG90X3NpemUuaGVpZ2h0LAogICAgcGx1dG9yZXNpemU6IHRydWUsCiAgfTsKICBQbG90bHkucmVsYXlvdXQoUExPVCwgY29uZmlnKS50aGVuKCgpID0+IHsKICAgIGlmIChyZW1vdmVfY29udGFpbmVyX3NpemUgJiYgIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIHRoZSBmaXJzdCByZXNpemUgdXBvbiBwbG90IGNyZWF0aW9uIHRvIGFscmVhZHkgYmUgd2l0aG91dCBhIGZpeGVkIGhlaWdodAogICAgICBDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gIiI7CiAgICAgIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogICAgICByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmYWxzZTsKICAgIH0KICB9KTsKfSk7CgpyZXNpemVPYnNlcnZlci5vYnNlcnZlKENPTlRBSU5FUik7CgoKUGxvdGx5LnJlYWN0KFBMT1QsIHBsb3Rfb2JqKS50aGVuKCgpID0+IHsKCS8vIEFzc2lnbiB0aGUgUGxvdGx5IGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKHBsb3RseV9saXN0ZW5lcnMpKSB7CgkJZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcl92ZWMpIHsKCQkJUExPVC5vbihrZXksIGxpc3RlbmVyKQoJCX0KCX0KCS8vIEFzc2lnbiB0aGUgSlMgZXZlbnQgbGlzdGVuZXJzCglmb3IgKGNvbnN0IFtrZXksIGxpc3RlbmVyX3ZlY10gb2YgT2JqZWN0LmVudHJpZXMoanNfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1QuYWRkRXZlbnRMaXN0ZW5lcihrZXksIGxpc3RlbmVyLCB7CgkJCQlzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsCgkJCX0pCgkJfQoJfQp9CikKCgppbnZhbGlkYXRpb24udGhlbigoKSA9PiB7CgkvLyBSZW1vdmUgYWxsIHBsb3RseSBsaXN0ZW5lcnMKCVBMT1QucmVtb3ZlQWxsTGlzdGVuZXJzKCkKCS8vIFJlbW92ZSBhbGwgSlMgbGlzdGVuZXJzCgljb250cm9sbGVyLmFib3J0KCkKCS8vIFJlbW92ZSB0aGUgcmVzaXplT2JzZXJ2ZXIKCXJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKQp9KQoKCgoJCXJldHVybiBDT05UQUlORVIKCTwvc2NyaXB0PgqkbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/oxS3BrOwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJDFhODNkODk3LTcwNWItNDQzZC04OWE0LWVhNWUzZTZhM2MwN7lkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgAGk8S1cHVibGlzaGVkX29iamVjdF9rZXlzkdk1YjNiODQwOGMtODE4MS0xMWVmLTE0ZWItZTFjNTY5YjhiYjI5L2ZiNDBjYzRhNDBmY2U2M2G4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkNGUxNDM0ZTEtNjczZi00MjA2LWEyNzEtOWVkZWMxMGViZDZhiqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedpqiQk8c2NyaXB0IGlkPSdwbG90XzEnPgoJCS8vIFdlIHN0YXJ0IGJ5IHB1dHRpbmcgYWxsIHRoZSB2YXJpYWJsZSBpbnRlcnBvbGF0aW9uIGhlcmUgYXQgdGhlIGJlZ2lubmluZwoJCS8vIFdlIGhhdmUgdG8gY29udmVydCBhbGwgdHlwZWRhcnJheXMgaW4gdGhlIGxheW91dCB0byBub3JtYWwgYXJyYXlzLiBTZWUgSXNzdWUgIzI1CgkJLy8gV2UgdXNlIGxvZGFzaCBmb3IgdGhpcyBmb3IgY29tcGFjdG5lc3MKCQlmdW5jdGlvbiByZW1vdmVUeXBlZEFycmF5KG8pIHsKCQkJcmV0dXJuIF8uaXNUeXBlZEFycmF5KG8pID8gQXJyYXkuZnJvbShvKSA6CgkJCV8uaXNQbGFpbk9iamVjdChvKSA/IF8ubWFwVmFsdWVzKG8sIHJlbW92ZVR5cGVkQXJyYXkpIDogCgkJCW8KCQl9CgoJCS8vIFB1Ymxpc2ggdGhlIHBsb3Qgb2JqZWN0IHRvIEpTCgkJbGV0IHBsb3Rfb2JqID0gXy51cGRhdGUoLyogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBBYnN0cmFjdFBsdXRvRGluZ2V0amVzLkRpc3BsYXkucHVibGlzaGVkX3RvX2pzICovIGdldFB1Ymxpc2hlZE9iamVjdCgiYjNiODQwOGMtODE4MS0xMWVmLTE0ZWItZTFjNTY5YjhiYjI5LzEyOTU1M2ZjMTFiNTE5ZDUiKSwgImxheW91dCIsIHJlbW92ZVR5cGVkQXJyYXkpCgkJLy8gR2V0IHRoZSBwbG90bHkgbGlzdGVuZXJzCgkJY29uc3QgcGxvdGx5X2xpc3RlbmVycyA9IHt9CgkJLy8gR2V0IHRoZSBKUyBsaXN0ZW5lcnMKCQljb25zdCBqc19saXN0ZW5lcnMgPSB7fQoJCS8vIERlYWwgd2l0aCBldmVudHVhbCBjdXN0b20gY2xhc3NlcwoJCWxldCBjdXN0b21fY2xhc3NsaXN0ID0gW10KCgoJCS8vIExvYWQgdGhlIHBsb3RseSBsaWJyYXJ5CgkJbGV0IFBsb3RseSA9IHVuZGVmaW5lZAoJCXRyeSB7CgkJCWxldCBfbW9kID0gYXdhaXQgaW1wb3J0KCIuL3Bsb3RseWpzL3Bsb3RseWpzLTIuMjYuMi5taW4uanMiKQoJCQlQbG90bHkgPSBfbW9kLmRlZmF1bHQKCQl9IGNhdGNoIChlKSB7CgkJCWNvbnNvbGUubG9nKCJMb2NhbCBsb2FkIGZhaWxlZCwgdHJ5aW5nIHdpdGggdGhlIHdlYiBlc20uc2ggdmVyc2lvbiIpCgkJCWxldCBfbW9kID0gYXdhaXQgaW1wb3J0KCJodHRwczovL2VzbS5zaC92MTM1L3Bsb3RseS5qcy1kaXN0LW1pbkAyLjI2LjIvZXNuZXh0L3Bsb3RseS5qcy1kaXN0LW1pbi5tanMiKQoJCQlQbG90bHkgPSBfbW9kLmRlZmF1bHQKCQl9CgoJCS8vIENoZWNrIGlmIHdlIGhhdmUgdG8gZm9yY2UgbG9jYWwgbWF0aGpheCBmb250IGNhY2hlCgkJaWYgKGZhbHNlICYmIHdpbmRvdz8uTWF0aEpheD8uY29uZmlnPy5zdmc/LmZvbnRDYWNoZSA9PT0gJ2dsb2JhbCcpIHsKCQkJd2luZG93Lk1hdGhKYXguY29uZmlnLnN2Zy5mb250Q2FjaGUgPSAnbG9jYWwnCgkJfQoKCQkvLyBGbGFnIHRvIGNoZWNrIGlmIHRoaXMgY2VsbCB3YXMgIG1hbnVhbGx5IHJhbiBvciByZWFjdGl2ZWx5IHJhbgpjb25zdCBmaXJzdFJ1biA9IHRoaXMgPyBmYWxzZSA6IHRydWUKY29uc3QgQ09OVEFJTkVSID0gdGhpcyA/PyBodG1sYDxkaXYgY2xhc3M9J3BsdXRvcGxvdGx5LWNvbnRhaW5lcic+YApjb25zdCBQTE9UID0gQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoJy5qcy1wbG90bHktcGxvdCcpID8/IENPTlRBSU5FUi5hcHBlbmRDaGlsZChodG1sYDxkaXY+YCkKY29uc3QgcGFyZW50ID0gQ09OVEFJTkVSLnBhcmVudEVsZW1lbnQKLy8gV2UgdXNlIGEgY29udHJvbGxlciB0byByZW1vdmUgZXZlbnQgbGlzdGVuZXJzIHVwb24gaW52YWxpZGF0aW9uCmNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCkKLy8gV2UgaGF2ZSB0byBhZGQgdGhpcyB0byBrZWVwIHN1cHBvcnRpbmcgQGJpbmQgd2l0aCB0aGUgb2xkIEFQSSB1c2luZyBQTE9UClBMT1QuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoZSkgPT4gewoJQ09OVEFJTkVSLnZhbHVlID0gUExPVC52YWx1ZQoJaWYgKGUuYnViYmxlcykgewoJCXJldHVybgoJfQoJQ09OVEFJTkVSLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdpbnB1dCcpKQp9LCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSkKCgkvLyBUaGlzIGNyZWF0ZSB0aGUgc3R5bGUgc3ViZGl2IG9uIGZpcnN0IHJ1bgoJZmlyc3RSdW4gJiYgQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgCgk8c3R5bGU+CgkucGx1dG9wbG90bHktY29udGFpbmVyIHsKCQl3aWR0aDogMTAwJTsKCQloZWlnaHQ6IDEwMCU7CgkJbWluLWhlaWdodDogMDsKCQltaW4td2lkdGg6IDA7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyIC5qcy1wbG90bHktcGxvdCAucGxvdGx5IGRpdiB7CgkJbWFyZ2luOiAwIGF1dG87IC8vIFRoaXMgY2VudGVycyB0aGUgcGxvdAoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5wb3BwZWQtb3V0IHsKCQlvdmVyZmxvdzogYXV0bzsKCQl6LWluZGV4OiAxMDAwOwoJCXBvc2l0aW9uOiBmaXhlZDsKCQlyZXNpemU6IGJvdGg7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwcHg7CgkJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDBweDsKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIHsKCQlkaXNwbGF5OiBmbGV4OwoJCWZsZXgtZmxvdzogcm93IHdyYXA7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMTJweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMTJweDsKCQlwb3NpdGlvbjogZml4ZWQ7CgkJei1pbmRleDogMTAwMTsKCQljdXJzb3I6IG1vdmU7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCAtMTAwJSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgc3BhbiB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCWZsZXg6IDEKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyLmhpZGRlbiB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3BhbiB7CgkJcG9zaXRpb246IHJlbGF0aXZlOwoJfQoJLmNsaXBib2FyZC12YWx1ZSB7CgkJcGFkZGluZy1yaWdodDogNXB4OwoJCXBhZGRpbmctbGVmdDogMnB4OwoJCWN1cnNvcjogdGV4dDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZmlsZW5hbWUgewoJCWZsZXg6IDAgMCAxMDAlOwoJCXRleHQtYWxpZ246IGNlbnRlcjsKCQlib3JkZXItdG9wOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJbWFyZ2luLXRvcDogNXB4OwoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5maWxlbmFtZSB7CgkJbWFyZ2luLWxlZnQ6IDNweDsKCQl0ZXh0LWFsaWduOiBsZWZ0OwoJCW1pbi13aWR0aDogbWluKDYwJSwgbWluLWNvbnRlbnQpOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5maWxlc2F2ZSAuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgLmxhYmVsIHsKCQlmbGV4OiAwIDAgMDsKCX0KCS5jbGlwYm9hcmQtdmFsdWUuZm9ybWF0IHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7CgkJZmxleDogMSAwIGF1dG87CgkJbWluLXdpZHRoOiAzMHB4OwoJCW1hcmdpbi1yaWdodDogMTBweDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyB7CgkJZGlzcGxheTogaW5saW5lLWZsZXg7CgkJZmxleC1mbG93OiBjb2x1bW47CgkJcG9zaXRpb246IGFic29sdXRlOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJcGFkZGluZy1sZWZ0OiAzcHg7CgkJei1pbmRleDogMjAwMDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9uczpob3ZlciB7CgkJY3Vyc29yOiBwb2ludGVyOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCXBhZGRpbmc6IDNweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtM3B4LCAtNnB4KTsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyAuZm9ybWF0LW9wdGlvbiB7CgkJZGlzcGxheTogbm9uZTsKCX0KCWRpdi5mb3JtYXQtb3B0aW9uczpob3ZlciAuZm9ybWF0LW9wdGlvbiB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246bm90KC5zZWxlY3RlZCkgewoJCW1hcmdpbi10b3A6IDNweDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyAuZm9ybWF0LW9wdGlvbi5zZWxlY3RlZCB7CgkJb3JkZXI6IC0xOwoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5mb3JtYXQtb3B0aW9uOmhvdmVyIHsKCQliYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCX0KCXNwYW4uY29uZmlnLXZhbHVlIHsKCQlmb250LXdlaWdodDogbm9ybWFsOwoJCWNvbG9yOiB2YXIoLS1wbHV0by1vdXRwdXQtY29sb3IpOwoJCWRpc3BsYXk6IG5vbmU7CgkJcG9zaXRpb246IGFic29sdXRlOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCBjYWxjKC0xMDAlIC0gMTBweCkpOwoJCXBhZGRpbmc6IDVweDsKCX0KCS5sYWJlbCB7CgkJdXNlci1zZWxlY3Q6IG5vbmU7Cgl9CgkubGFiZWw6aG92ZXIgc3Bhbi5jb25maWctdmFsdWUgewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQltaW4td2lkdGg6IDE1MHB4OwoJfQoJLmNsaXBib2FyZC1zcGFuLm1hdGNoaW5nLWNvbmZpZyAubGFiZWwgewoJCWNvbG9yOiB2YXIoLS1jbS1tYWNyby1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZGlmZmVyZW50LWNvbmZpZyAubGFiZWwgewoJCWNvbG9yOiB2YXIoLS1jbS10YWctY29sb3IpOwoJCWZvbnQtd2VpZ2h0OiBib2xkOwoJfQo8L3N0eWxlPgpgKQoKbGV0IG9yaWdpbmFsX2hlaWdodCA9IHBsb3Rfb2JqLmxheW91dC5oZWlnaHQKbGV0IG9yaWdpbmFsX3dpZHRoID0gcGxvdF9vYmoubGF5b3V0LndpZHRoCi8vIEZvciB0aGUgaGVpZ2h0IHdlIGhhdmUgdG8gYWxzbyBwdXQgYSBmaXhlZCB2YWx1ZSBpbiBjYXNlIHRoZSBwbG90IGlzIHB1dCBvbiBhIG5vbi1maXhlZC1zaXplIGNvbnRhaW5lciAobGlrZSB0aGUgZGVmYXVsdCB3cmFwcGVyKQovLyBXZSBkZWZpbmUgYSB2YXJpYWJsZSB0byBjaGVjayB3aGV0aGVyIHdlIHN0aWxsIGhhdmUgdG8gcmVtb3ZlIHRoZSBmaXhlZCBoZWlnaHQKbGV0IHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IGZpcnN0UnVuCmxldCBjb250YWluZXJfaGVpZ2h0ID0gb3JpZ2luYWxfaGVpZ2h0ID8/IFBMT1QuY29udGFpbmVyX2hlaWdodCA/PyA0MDAKQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9IGNvbnRhaW5lcl9oZWlnaHQgKyAncHgnCgovLyBXZSBjcmVhdGUgYSBQcm9taXNlIHZlcnNpb24gb2Ygc2V0VGltZW91dApmdW5jdGlvbiBkZWxheShtcykgewogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpOwp9CgovLyBXZSBpbXBvcnQgaW50ZXJhY3QgZm9yIGRyYWdnaW5nL3Jlc2l6aW5nCmNvbnN0IHsgZGVmYXVsdDogaW50ZXJhY3QgfSA9IGF3YWl0IGltcG9ydCgnaHR0cHM6Ly9lc20uc2gvaW50ZXJhY3Rqc0AxLjEwLjE5JykKCgpmdW5jdGlvbiBnZXRJbWFnZU9wdGlvbnMoKSB7CiAgY29uc3QgbyA9IHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICByZXR1cm4gewogICAgZm9ybWF0OiBvLmZvcm1hdCA/PyAicG5nIiwKICAgIHdpZHRoOiBvLndpZHRoID8/IG9yaWdpbmFsX3dpZHRoLAogICAgaGVpZ2h0OiBvLmhlaWdodCA/PyBvcmlnaW5hbF9oZWlnaHQsCiAgICBzY2FsZTogby5zY2FsZSA/PyAxLAogICAgZmlsZW5hbWU6IG8uZmlsZW5hbWUgPz8gIm5ld3Bsb3QiLAogIH07Cn0KCmNvbnN0IENMSVBCT0FSRF9IRUFERVIgPQogIENPTlRBSU5FUi5xdWVyeVNlbGVjdG9yKCIucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciIpID8/CiAgQ09OVEFJTkVSLmluc2VydEFkamFjZW50RWxlbWVudCgKICAgICJhZnRlcmJlZ2luIiwKICAgIGh0bWxgPGRpdiBjbGFzcz0icGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBoaWRkZW4iPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gZm9ybWF0IgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZvcm1hdDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBmb3JtYXQiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gd2lkdGgiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+V2lkdGg6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgd2lkdGgiPjwvc3Bhbj5weDwvc3BhbgogICAgICA+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBoZWlnaHQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+SGVpZ2h0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGhlaWdodCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHNjYWxlIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPlNjYWxlOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIHNjYWxlIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2V0Ij5TZXQ8L2J1dHRvbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gdW5zZXQiPlVuc2V0PC9idXR0b24+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmaWxlbmFtZSIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5GaWxlbmFtZTo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBmaWxlbmFtZSI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICA8L2Rpdj5gCiAgKTsKCmZ1bmN0aW9uIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpIHsKICBjb25zdCB2YWxpZF9jbGFzc2VzID0gWwogICAgIm1pc3NpbmctY29uZmlnIiwKICAgICJtYXRjaGluZy1jb25maWciLAogICAgImRpZmZlcmVudC1jb25maWciLAogIF07CiAgZnVuY3Rpb24gc2V0Q2xhc3MoY2wpIHsKICAgIGZvciAoY29uc3QgbmFtZSBvZiB2YWxpZF9jbGFzc2VzKSB7CiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKG5hbWUsIG5hbWUgPT0gY2wpOwogICAgfQogIH0KICAvLyBXZSB1c2UgdGhlIGN1c3RvbSBnZXR0ZXJzIHdlJ2xsIHNldCB1cCBpbiB0aGUgY29udGFpbmVyCiAgY29uc3QgeyB1aV92YWx1ZSwgY29uZmlnX3ZhbHVlLCBjb25maWdfc3Bhbiwga2V5IH0gPSBjb250YWluZXI7CiAgaWYgKGNvbmZpZ192YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICBzZXRDbGFzcygibWlzc2luZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaXMgbm90IHByZXNlbnQgaW4gdGhlIGNvbmZpZy5gOwogIH0gZWxzZSBpZiAodWlfdmFsdWUgPT0gY29uZmlnX3ZhbHVlKSB7CiAgICBzZXRDbGFzcygibWF0Y2hpbmctY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGhhcyB0aGUgc2FtZSB2YWx1ZSBpbiB0aGUgY29uZmlnIGFuZCBpbiB0aGUgaGVhZGVyLmA7CiAgfSBlbHNlIHsKICAgIHNldENsYXNzKCJkaWZmZXJlbnQtY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGhhcyBhIGRpZmZlcmVudCB2YWx1ZSAoPGVtPiR7Y29uZmlnX3ZhbHVlfTwvZW0+KSBpbiB0aGUgY29uZmlnLmA7CiAgfQogIC8vIEFkZCBpbmZvIGFib3V0IHNldHRpbmcgYW5kIHVuc2V0dGluZwogIGNvbmZpZ19zcGFuLmluc2VydEFkamFjZW50SFRNTCgKICAgICJiZWZvcmVlbmQiLAogICAgYDxicj5DbGljayBvbiB0aGUgbGFiZWwgPGVtPjxiPm9uY2U8L2I+PC9lbT4gdG8gc2V0IHRoZSBjdXJyZW50IFVJIHZhbHVlIGluIHRoZSBjb25maWcuYAogICk7CiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIDxlbT48Yj50d2ljZTwvYj48L2VtPiB0byByZW1vdmUgdGhpcyBrZXkgZnJvbSB0aGUgY29uZmlnLmAKICApOwp9Cgpjb25zdCB2YWxpZF9mb3JtYXRzID0gWyJwbmciLCAic3ZnIiwgIndlYnAiLCAianBlZyIsICJmdWxsLWpzb24iXTsKZnVuY3Rpb24gaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHNwYW4sIGtleSwgdmFsdWUpIHsKICBjb25zdCBjb250YWluZXIgPSBzcGFuLmNsb3Nlc3QoIi5jbGlwYm9hcmQtc3BhbiIpOwogIHNwYW4uY29udGVudEVkaXRhYmxlID0ga2V5ID09PSAiZm9ybWF0IiA/ICJmYWxzZSIgOiAidHJ1ZSI7CiAgbGV0IHBhcnNlID0gKHgpID0+IHg7CiAgbGV0IHVwZGF0ZSA9ICh4KSA9PiAoc3Bhbi50ZXh0Q29udGVudCA9IHgpOwogIGlmIChrZXkgPT09ICJ3aWR0aCIgfHwga2V5ID09PSAiaGVpZ2h0IikgewogICAgcGFyc2UgPSAoeCkgPT4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KHgpKTsKICB9IGVsc2UgaWYgKGtleSA9PT0gInNjYWxlIikgewogICAgcGFyc2UgPSBwYXJzZUZsb2F0OwogIH0gZWxzZSBpZiAoa2V5ID09PSAiZm9ybWF0IikgewogICAgLy8gV2UgcmVtb3ZlIGNvbnRlbnRFZGl0YWJsZQogICAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSAiZmFsc2UiOwogICAgLy8gSGVyZSB3ZSBmaXJzdCBhZGQgdGhlIHN1YnNwYW5zIGZvciBlYWNoIG9wdGlvbgogICAgY29uc3Qgb3B0c19kaXYgPSBzcGFuLmFwcGVuZENoaWxkKGh0bWxgPGRpdiBjbGFzcz0iZm9ybWF0LW9wdGlvbnMiPjwvZGl2PmApOwogICAgZm9yIChjb25zdCBmbXQgb2YgdmFsaWRfZm9ybWF0cykgewogICAgICBjb25zdCBvcHQgPSBvcHRzX2Rpdi5hcHBlbmRDaGlsZCgKICAgICAgICBodG1sYDxzcGFuIGNsYXNzPSJmb3JtYXQtb3B0aW9uICR7Zm10fSI+JHtmbXR9PC9zcGFuPmAKICAgICAgKTsKICAgICAgb3B0Lm9uY2xpY2sgPSAoZSkgPT4gewogICAgICAgIHNwYW4udmFsdWUgPSBvcHQudGV4dENvbnRlbnQ7CiAgICAgIH07CiAgICB9CiAgICBwYXJzZSA9ICh4KSA9PiB7CiAgICAgIHJldHVybiB2YWxpZF9mb3JtYXRzLmluY2x1ZGVzKHgpID8geCA6IGxvY2FsVmFsdWU7CiAgICB9OwogICAgdXBkYXRlID0gKHgpID0+IHsKICAgICAgZm9yIChjb25zdCBvcHQgb2Ygb3B0c19kaXYuY2hpbGRyZW4pIHsKICAgICAgICBvcHQuY2xhc3NMaXN0LnRvZ2dsZSgic2VsZWN0ZWQiLCBvcHQudGV4dENvbnRlbnQgPT09IHgpOwogICAgICB9CiAgICB9OwogIH0gZWxzZSB7CiAgICAvLyBXZSBvbmx5IGhhdmUgZmlsZW5hbWUgaGVyZQogIH0KICBsZXQgbG9jYWxWYWx1ZTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBsb2NhbFZhbHVlOwogICAgfSwKICAgIHNldDogKHZhbCkgPT4gewogICAgICBpZiAodmFsICE9PSAiIikgewogICAgICAgIGxvY2FsVmFsdWUgPSBwYXJzZSh2YWwpOwogICAgICB9CiAgICAgIHVwZGF0ZShsb2NhbFZhbHVlKTsKICAgICAgY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcik7CiAgICB9LAogIH0pOwogIC8vIFdlIGFsc28gYXNzaWduIGEgbGlzdGVuZXIgc28gdGhhdCB0aGUgZWRpdGFibGUgaXMgYmx1cnJlZCB3aGVuIGVudGVyIGlzIHByZXNzZWQKICBzcGFuLm9ua2V5ZG93biA9IChlKSA9PiB7CiAgICBpZiAoZS5rZXlDb2RlID09PSAxMykgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHNwYW4uYmx1cigpOwogICAgfQogIH07CiAgc3Bhbi52YWx1ZSA9IHZhbHVlOwp9CgpmdW5jdGlvbiBpbml0aWFsaXplQ29uZmlnVmFsdWVTcGFuKHNwYW4sIGtleSkgewogIC8vIEhlcmUgd2UgbW9zdGx5IHdhbnQgdG8gZGVmaW5lIHRoZSBzZXR0ZXIgYW5kIGdldHRlcgogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwYW4sICJ2YWx1ZSIsIHsKICAgIGdldDogKCkgPT4gewogICAgICByZXR1cm4gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV07CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIC8vIGlmIHVuZGVmaW5lZCBpcyBwYXNzZWQsIHdlIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgb3B0aW9ucwogICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsKICAgICAgICBkZWxldGUgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV0gPSB2YWw7CiAgICAgIH0KICAgICAgY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcik7CiAgICB9LAogIH0pOwp9Cgpjb25zdCBjb25maWdfc3BhbnMgPSB7fTsKZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZ2V0SW1hZ2VPcHRpb25zKCkpKSB7CiAgY29uc3QgY29udGFpbmVyID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKGAuY2xpcGJvYXJkLXNwYW4uJHtrZXl9YCk7CiAgY29uc3QgbGFiZWwgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmxhYmVsIik7CiAgLy8gV2UgZ2l2ZSB0aGUgbGFiZWwgYSBmdW5jdGlvbiB0aGF0IG9uIHNpbmdsZSBjbGljayB3aWxsIHNldCB0aGUgY3VycmVudCB2YWx1ZSBhbmQgd2l0aCBkb3VibGUgY2xpY2sgd2lsbCB1bnNldCBpdAogIGxhYmVsLm9uY2xpY2sgPSBEdWFsQ2xpY2soCiAgICAoKSA9PiB7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBjb250YWluZXIudWlfdmFsdWU7CiAgICB9LAogICAgKGUpID0+IHsKICAgICAgY29uc29sZS5sb2coImUiLCBlKTsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gdW5kZWZpbmVkOwogICAgfQogICk7CiAgY29uc3QgdWlfdmFsdWVfc3BhbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXZhbHVlIik7CiAgY29uc3QgY29uZmlnX3ZhbHVlX3NwYW4gPQogICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jb25maWctdmFsdWUiKSA/PwogICAgbGFiZWwuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgICAiYWZ0ZXJiZWdpbiIsCiAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImNvbmZpZy12YWx1ZSI+PC9zcGFuPmAKICAgICk7CiAgLy8gQXNzaW5nIHRoZSB0d28gc3BhbnMgYXMgcHJvcGVydGllcyBvZiB0aGUgY29udGFpbmluZyBzcGFuCiAgY29udGFpbmVyLnVpX3NwYW4gPSB1aV92YWx1ZV9zcGFuOwogIGNvbnRhaW5lci5jb25maWdfc3BhbiA9IGNvbmZpZ192YWx1ZV9zcGFuOwogIGNvbnRhaW5lci5rZXkgPSBrZXk7CiAgY29uZmlnX3NwYW5zW2tleV0gPSBjb250YWluZXI7CiAgaWYgKGZpcnN0UnVuKSB7CiAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPQogICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPz8ge307CiAgICAvLyBXZSBkbyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHZhbHVlIHNwYW4KICAgIGluaXRpYWxpemVVSVZhbHVlU3Bhbih1aV92YWx1ZV9zcGFuLCBrZXksIHZhbHVlKTsKICAgIC8vIFRoZW4gd2UgaW5pdGlhbGl6ZSB0aGUgY29uZmlnIHZhbHVlCiAgICBpbml0aWFsaXplQ29uZmlnVmFsdWVTcGFuKGNvbmZpZ192YWx1ZV9zcGFuLCBrZXkpOwogICAgLy8gV2UgcHV0IHNvbWUgY29udmVuaWVuY2UgZ2V0dGVycy9zZXR0ZXJzCiAgICAvLyB1aV92YWx1ZSBmb3J3YXJkCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAidWlfdmFsdWUiLCB7CiAgICAgIGdldDogKCkgPT4gdWlfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgdWlfdmFsdWVfc3Bhbi52YWx1ZSA9IHZhbDsKICAgICAgfSwKICAgIH0pOwogICAgLy8gY29uZmlnX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJjb25maWdfdmFsdWUiLCB7CiAgICAgIGdldDogKCkgPT4gY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUsCiAgICAgIHNldDogKHZhbCkgPT4gewogICAgICAgIGNvbmZpZ192YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgfQp9CgovLyBUaGVzZSBvYmplY3RzIHdpbGwgY29udGFpbiB0aGUgZGVmYXVsdCB2YWx1ZQoKLy8gVGhpcyBjb2RlIHVwZGF0ZXMgdGhlIGltYWdlIG9wdGlvbnMgaW4gdGhlIFBMT1QgY29uZmlnIHdpdGggdGhlIHByb3ZpZGVkIG9uZXMKZnVuY3Rpb24gc2V0SW1hZ2VPcHRpb25zKG8pIHsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IG9ba2V5XTsKICB9Cn0KZnVuY3Rpb24gdW5zZXRJbWFnZU9wdGlvbnMoKSB7CiAgc2V0SW1hZ2VPcHRpb25zKHt9KTsKfQoKY29uc3Qgc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnNldCIpOwpjb25zdCB1bnNldF9idXR0b24gPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtc3Bhbi51bnNldCIpOwppZiAoZmlyc3RSdW4pIHsKICBzZXRfYnV0dG9uLm9uY2xpY2sgPSAoZSkgPT4gewogICAgZm9yIChjb25zdCBjb250YWluZXIgb2YgT2JqZWN0LnZhbHVlcyhjb25maWdfc3BhbnMpKSB7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBjb250YWluZXIudWlfdmFsdWU7CiAgICB9CiAgfTsKICB1bnNldF9idXR0b24ub25jbGljayA9IHVuc2V0SW1hZ2VPcHRpb25zOwp9CgovLyBXZSBhZGQgYSBmdW5jdGlvbiB0byBjaGVjayBpZiB0aGUgY2xpcGJvYXJkIGlzIHBvcHBlZCBvdXQKQ09OVEFJTkVSLmlzUG9wcGVkT3V0ID0gKCkgPT4gewogIHJldHVybiBDT05UQUlORVIuY2xhc3NMaXN0LmNvbnRhaW5zKCJwb3BwZWQtb3V0Iik7Cn07CgpDTElQQk9BUkRfSEVBREVSLm9ubW91c2Vkb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgaWYgKGV2ZW50LnRhcmdldC5tYXRjaGVzKCJzcGFuLmNsaXBib2FyZC12YWx1ZSIpKSB7CiAgICBjb25zb2xlLmxvZygiV2UgZG9uJ3QgbW92ZSEiKTsKICAgIHJldHVybjsKICB9CiAgY29uc3Qgc3RhcnQgPSB7CiAgICBsZWZ0OiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS5sZWZ0KSwKICAgIHRvcDogcGFyc2VGbG9hdChDT05UQUlORVIuc3R5bGUudG9wKSwKICAgIFg6IGV2ZW50LnBhZ2VYLAogICAgWTogZXZlbnQucGFnZVksCiAgfTsKICBmdW5jdGlvbiBtb3ZlQXQoZXZlbnQsIHN0YXJ0KSB7CiAgICBjb25zdCB0b3AgPSBldmVudC5wYWdlWSAtIHN0YXJ0LlkgKyBzdGFydC50b3AgKyAicHgiOwogICAgY29uc3QgbGVmdCA9IGV2ZW50LnBhZ2VYIC0gc3RhcnQuWCArIHN0YXJ0LmxlZnQgKyAicHgiOwogICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gbGVmdDsKICAgIENPTlRBSU5FUi5zdHlsZS5sZWZ0ID0gbGVmdDsKICAgIENPTlRBSU5FUi5zdHlsZS50b3AgPSB0b3A7CiAgfQoKICAvLyBtb3ZlIG91ciBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYmFsbCB1bmRlciB0aGUgcG9pbnRlcgogIG1vdmVBdChldmVudCwgc3RhcnQpOwogIGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGV2ZW50KSB7CiAgICBtb3ZlQXQoZXZlbnQsIHN0YXJ0KTsKICB9CgogIC8vIFdlIHVzZSB0aGlzIHRvIHJlbW92ZSB0aGUgbW91c2Vtb3ZlIHdoZW4gY2xpY2tpbmcgb3V0c2lkZSBvZiB0aGUgY29udGFpbmVyCiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgLy8gbW92ZSB0aGUgY29udGFpbmVyIG9uIG1vdXNlbW92ZQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIG9uTW91c2VNb3ZlLCB7CiAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLAogIH0pOwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAibW91c2Vkb3duIiwKICAgIChlKSA9PiB7CiAgICAgIGlmIChlLnRhcmdldC5jbG9zZXN0KCIucGx1dG9wbG90bHktY29udGFpbmVyIikgIT09IENPTlRBSU5FUikgewogICAgICAgIGNsZWFuVXAoKTsKICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9LAogICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0KICApOwoKICBmdW5jdGlvbiBjbGVhblVwKCkgewogICAgY29uc29sZS5sb2coImNsZWFuaW5nIHVwIHRoZSBwbG90IG1vdmUgbGlzdGVuZXIiKTsKICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gbnVsbDsKICB9CgogIC8vICgzKSBkcm9wIHRoZSBiYWxsLCByZW1vdmUgdW5uZWVkZWQgaGFuZGxlcnMKICBDTElQQk9BUkRfSEVBREVSLm9ubW91c2V1cCA9IGNsZWFuVXA7Cn07CgpmdW5jdGlvbiBzZW5kVG9DbGlwYm9hcmQoYmxvYikgewogIGlmICghbmF2aWdhdG9yLmNsaXBib2FyZCkgewogICAgYWxlcnQoCiAgICAgICJUaGUgQ2xpcGJvYXJkIEFQSSBkb2VzIG5vdCBzZWVtIHRvIGJlIGF2YWlsYWJsZSwgbWFrZSBzdXJlIHRoZSBQbHV0byBub3RlYm9vayBpcyBiZWluZyB1c2VkIGZyb20gZWl0aGVyIGxvY2FsaG9zdCBvciBhbiBodHRwcyBzb3VyY2UuIgogICAgKTsKICB9CiAgbmF2aWdhdG9yLmNsaXBib2FyZAogICAgLndyaXRlKFsKICAgICAgbmV3IENsaXBib2FyZEl0ZW0oewogICAgICAgIC8vIFRoZSBrZXkgaXMgZGV0ZXJtaW5lZCBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgYmxvYidzIHR5cGUuCiAgICAgICAgW2Jsb2IudHlwZV06IGJsb2IsCiAgICAgIH0pLAogICAgXSkKICAgIC50aGVuKAogICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgY29uc29sZS5sb2coIkFzeW5jOiBDb3B5aW5nIHRvIGNsaXBib2FyZCB3YXMgc3VjY2Vzc2Z1bCEiKTsKICAgICAgfSwKICAgICAgZnVuY3Rpb24gKGVycikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkFzeW5jOiBDb3VsZCBub3QgY29weSB0ZXh0OiAiLCBlcnIpOwogICAgICB9CiAgICApOwp9CgpmdW5jdGlvbiBjb3B5SW1hZ2VUb0NsaXBib2FyZCgpIHsKICAvLyBXZSBleHRyYWN0IHRoZSBpbWFnZSBvcHRpb25zIGZyb20gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMgKGlmIHRoZXkgZXhpc3QpCiAgY29uc3QgY29uZmlnID0ge307CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGxldCB2YWwgPQogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID8/CiAgICAgIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IGNvbnRhaW5lci51aV92YWx1ZSA6IHVuZGVmaW5lZCk7CiAgICAvLyBJZiB3ZSBoYXZlIHVuZGVmaW5lZCB3ZSBkb24ndCBjcmVhdGUgdGhlIGtleS4gV2UgYWxzbyBpZ25vcmUgZm9ybWF0IGJlY2F1c2UgdGhlIGNsaXBib2FyZCBvbmx5IHN1cHBvcnRzIHBuZy4KICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS50b0ltYWdlKFBMT1QsIGNvbmZpZykudGhlbihmdW5jdGlvbiAoZGF0YVVybCkgewogICAgZmV0Y2goZGF0YVVybCkKICAgICAgLnRoZW4oKHJlcykgPT4gcmVzLmJsb2IoKSkKICAgICAgLnRoZW4oKGJsb2IpID0+IHsKICAgICAgICBjb25zdCBwYXN0ZV9yZWNlaXZlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3Bhc3RlLXJlY2VpdmVyLnBsdXRvcGxvdGx5JykKICAgICAgICBpZiAocGFzdGVfcmVjZWl2ZXIpIHsKICAgICAgICAgIHBhc3RlX3JlY2VpdmVyLmF0dGFjaEltYWdlKGRhdGFVcmwsIENPTlRBSU5FUikKICAgICAgICB9CiAgICAgICAgc2VuZFRvQ2xpcGJvYXJkKGJsb2IpCiAgICAgIH0pOwogIH0pOwp9CgpmdW5jdGlvbiBzYXZlSW1hZ2VUb0ZpbGUoKSB7CiAgY29uc3QgY29uZmlnID0ge307CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGxldCB2YWwgPQogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID8/CiAgICAgIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IGNvbnRhaW5lci51aV92YWx1ZSA6IHVuZGVmaW5lZCk7CiAgICAvLyBJZiB3ZSBoYXZlIHVuZGVmaW5lZCB3ZSBkb24ndCBjcmVhdGUgdGhlIGtleS4KICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbmZpZ1trZXldID0gdmFsOwogIH0KICBQbG90bHkuZG93bmxvYWRJbWFnZShQTE9ULCBjb25maWcpOwp9CgpsZXQgY29udGFpbmVyX3JlY3QgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAsIHRvcDogMCwgbGVmdDogMCB9OwpmdW5jdGlvbiB1bnBvcF9jb250YWluZXIoY2wpIHsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZSgicG9wcGVkLW91dCIsIGZhbHNlKTsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgZmFsc2UpOwogIC8vIFdlIGZpeCB0aGUgaGVpZ2h0IGJhY2sgdG8gdGhlIHZhbHVlIGl0IGhhZCBiZWZvcmUgcG9wb3V0LCBhbHNvIHNldHRpbmcgdGhlIGZsYWcgdG8gc2lnbmFsIHRoYXQgdXBvbiBmaXJzdCByZXNpemUgd2UgcmVtb3ZlIHRoZSBmaXhlZCBpbmxpbmUtc3R5bGUKICBDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0ICsgInB4IjsKICByZW1vdmVfY29udGFpbmVyX3NpemUgPSB0cnVlOwogIC8vIFdlIHNldCB0aGUgb3RoZXIgZml4ZWQgaW5saW5lLXN0eWxlcyB0byBudWxsCiAgQ09OVEFJTkVSLnN0eWxlLndpZHRoID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9ICIiOwogIENPTlRBSU5FUi5zdHlsZS5sZWZ0ID0gIiI7CiAgLy8gV2UgYWxzbyByZW1vdmUgdGhlIENMSVBCT0FSRF9IRUFERVIKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLndpZHRoID0gIiI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gIiI7CiAgLy8gRmluYWxseSB3ZSByZW1vdmUgdGhlIGhpZGRlbiBjbGFzcyB0byB0aGUgaGVhZGVyCiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCB0cnVlKTsKICByZXR1cm47Cn0KZnVuY3Rpb24gcG9wb3V0X2NvbnRhaW5lcihvcHRzKSB7CiAgY29uc3QgY2wgPSBvcHRzPy5jbDsKICBjb25zdCB0YXJnZXRfY29udGFpbmVyX3NpemUgPSBvcHRzPy50YXJnZXRfY29udGFpbmVyX3NpemUgPz8ge307CiAgY29uc3QgdGFyZ2V0X3Bsb3Rfc2l6ZSA9IG9wdHM/LnRhcmdldF9wbG90X3NpemUgPz8ge307CiAgaWYgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICByZXR1cm4gdW5wb3BfY29udGFpbmVyKGNsKTsKICB9CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoY2wsIGNsID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IHRydWUpOwogIC8vIFdlIGV4dHJhY3QgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgY29udGFpbmVyLCBzYXZlIHRoZW0gYW5kIGZpeCB0aGVtCiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfSA9IENPTlRBSU5FUi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICBjb250YWluZXJfcmVjdCA9IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH07CiAgLy8gV2Ugc2F2ZSB0aGUgY3VycmVudCBwbG90IHNpemUgYmVmb3JlIHdlIHBvcCBhcyBpdCB3aWxsIGZpbGwgdGhlIHNjcmVlbgogIGNvbnN0IGN1cnJlbnRfcGxvdF9zaXplID0gewogICAgd2lkdGg6IFBMT1QuX2Z1bGxMYXlvdXQud2lkdGgsCiAgICBoZWlnaHQ6IFBMT1QuX2Z1bGxMYXlvdXQuaGVpZ2h0LAogIH07CiAgLy8gV2UgaGF2ZSB0byBzYXZlIHRoZSBwYWQgZGF0YSBiZWZvcmUgcG9wcGluZyBzbyB3ZSBjYW4gcmVzaXplIHByZWNpc2VseQogIGNvbnN0IHBhZCA9IHt9OwogIHBhZC51bnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZSgicG9wcGVkLW91dCIsIHRydWUpOwogIHBhZC5wb3BwZWQgPSBnZXRTaXplRGF0YSgpLmNvbnRhaW5lcl9wYWQ7CiAgLy8gV2UgZG8gdG9wIGFuZCBsZWZ0IGJhc2VkIG9uIHRoZSBjdXJyZW50IHJlY3QKICBmb3IgKGNvbnN0IGtleSBvZiBbInRvcCIsICJsZWZ0Il0pIHsKICAgIGNvbnN0IHN0YXJ0X3ZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNvbnRhaW5lcl9yZWN0W2tleV07CiAgICBsZXQgb2Zmc2V0ID0gMDsKICAgIGZvciAoY29uc3Qga2luZCBvZiBbInBhZGRpbmciLCAiYm9yZGVyIl0pIHsKICAgICAgb2Zmc2V0ICs9IHBhZC5wb3BwZWRba2luZF1ba2V5XSAtIHBhZC51bnBvcHBlZFtraW5kXVtrZXldOwogICAgfQogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSBzdGFydF92YWwgLSBvZmZzZXQgKyAicHgiOwogICAgaWYgKGtleSA9PT0gImxlZnQiKSB7CiAgICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGVba2V5XSA9IENPTlRBSU5FUi5zdHlsZVtrZXldOwogICAgfQogIH0KICAvLyBXZSBjb21wdXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGRlcGVuZGluZyBvbiBldmVudHVhbCBjb25maWcgZGF0YQogIGNvbnN0IGNzeiA9IGNvbXB1dGVDb250YWluZXJTaXplKHsKICAgIHdpZHRoOgogICAgICB0YXJnZXRfcGxvdF9zaXplLndpZHRoID8/CiAgICAgIGNvbmZpZ19zcGFucy53aWR0aC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6CiAgICAgIHRhcmdldF9wbG90X3NpemUuaGVpZ2h0ID8/CiAgICAgIGNvbmZpZ19zcGFucy5oZWlnaHQuY29uZmlnX3ZhbHVlID8/CiAgICAgIGN1cnJlbnRfcGxvdF9zaXplLmhlaWdodCwKICB9KTsKICBmb3IgKGNvbnN0IGtleSBvZiBbIndpZHRoIiwgImhlaWdodCJdKSB7CiAgICBjb25zdCB2YWwgPSB0YXJnZXRfY29udGFpbmVyX3NpemVba2V5XSA/PyBjc3pba2V5XTsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gdmFsICsgInB4IjsKICAgIGlmIChrZXkgPT09ICJ3aWR0aCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIENMSVBCT0FSRF9IRUFERVIuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgZmFsc2UpOwogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CgogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAibW91c2Vkb3duIiwKICAgIChlKSA9PiB7CiAgICAgIGlmIChlLnRhcmdldC5jbG9zZXN0KCIucGx1dG9wbG90bHktY29udGFpbmVyIikgIT09IENPTlRBSU5FUikgewogICAgICAgIHVucG9wX2NvbnRhaW5lcigpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7Cn0KCkNPTlRBSU5FUi5wb3BPdXQgPSBwb3BvdXRfY29udGFpbmVyOwoKZnVuY3Rpb24gRHVhbENsaWNrKHNpbmdsZV9mdW5jLCBkYmxfZnVuYykgewogIGxldCBuY2xpY2tzID0gMDsKICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHsKICAgIG5jbGlja3MgKz0gMTsKICAgIGlmIChuY2xpY2tzID4gMSkgewogICAgICBkYmxfZnVuYyguLi5hcmdzKTsKICAgICAgbmNsaWNrcyA9IDA7CiAgICB9IGVsc2UgewogICAgICBkZWxheSgzMDApLnRoZW4oKCkgPT4gewogICAgICAgIGlmIChuY2xpY2tzID09IDEpIHsKICAgICAgICAgIHNpbmdsZV9mdW5jKC4uLmFyZ3MpOwogICAgICAgIH0KICAgICAgICBuY2xpY2tzID0gMDsKICAgICAgfSk7CiAgICB9CiAgfTsKfQoKLy8gV2UgcmVtb3ZlIHRoZSBkZWZhdWx0IGRvd25sb2FkIGltYWdlIGJ1dHRvbgpwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSA9IF8udW5pb24oCiAgcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9SZW1vdmUsCiAgWyJ0b0ltYWdlIl0KKTsKLy8gV2UgYWRkIHRoZSBjdXN0b20gYnV0dG9uIHRvIHRoZSBtb2RlYmFyCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb0FkZCwKICBbCiAgICB7CiAgICAgIG5hbWU6ICJDb3B5IFBORyB0byBDbGlwYm9hcmQiLAogICAgICBpY29uOiB7CiAgICAgICAgaGVpZ2h0OiA1MjAsCiAgICAgICAgd2lkdGg6IDUyMCwKICAgICAgICBwYXRoOiAiTTI4MCA2NGg0MGMzNS4zIDAgNjQgMjguNyA2NCA2NFY0NDhjMCAzNS4zLTI4LjcgNjQtNjQgNjRINjRjLTM1LjMgMC02NC0yOC43LTY0LTY0VjEyOEMwIDkyLjcgMjguNyA2NCA2NCA2NGg0MCA5LjZDMTIxIDI3LjUgMTUzLjMgMCAxOTIgMHM3MSAyNy41IDc4LjQgNjRIMjgwek02NCAxMTJjLTguOCAwLTE2IDcuMi0xNiAxNlY0NDhjMCA4LjggNy4yIDE2IDE2IDE2SDMyMGM4LjggMCAxNi03LjIgMTYtMTZWMTI4YzAtOC44LTcuMi0xNi0xNi0xNkgzMDR2MjRjMCAxMy4zLTEwLjcgMjQtMjQgMjRIMTkyIDEwNGMtMTMuMyAwLTI0LTEwLjctMjQtMjRWMTEySDY0em0xMjgtOGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6IiwKICAgICAgfSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKGNvcHlJbWFnZVRvQ2xpcGJvYXJkLCAoKSA9PiB7CiAgICAgICAgcG9wb3V0X2NvbnRhaW5lcigpOwogICAgICB9KSwKICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICJEb3dubG9hZCBJbWFnZSIsCiAgICAgIGljb246IFBsb3RseS5JY29ucy5jYW1lcmEsCiAgICAgIGRpcmVjdGlvbjogInVwIiwKICAgICAgY2xpY2s6IER1YWxDbGljayhzYXZlSW1hZ2VUb0ZpbGUsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKHsgY2w6ICJmaWxlc2F2ZSIgfSk7CiAgICAgIH0pLAogICAgfSwKICBdCik7CgpmdW5jdGlvbiBnZXRPZmZzZXREYXRhKGVsKSB7CiAgbGV0IGNzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwsIG51bGwpOwogIGNvbnN0IG9kYXRhID0gewogICAgcGFkZGluZzogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdMZWZ0KSwKICAgICAgcmlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1JpZ2h0KSwKICAgICAgdG9wOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdUb3ApLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MucGFkZGluZ0JvdHRvbSksCiAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdMZWZ0KSArIHBhcnNlRmxvYXQoY3MucGFkZGluZ1JpZ2h0KSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdUb3ApICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgIH0sCiAgICBib3JkZXI6IHsKICAgICAgbGVmdDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgdG9wOiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSwKICAgICAgYm90dG9tOiBwYXJzZUZsb2F0KGNzLmJvcmRlckJvdHRvbVdpZHRoKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MuYm9yZGVyTGVmdFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyUmlnaHRXaWR0aCksCiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChjcy5ib3JkZXJUb3BXaWR0aCkgKyBwYXJzZUZsb2F0KGNzLmJvcmRlckJvdHRvbVdpZHRoKSwKICAgIH0KICB9OwogIGlmIChlbCA9PT0gUExPVCkgewogICAgLy8gRm9yIHRoZSBQTE9UIHdlIGFsc28gd2FudCB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgb2Zmc2V0CiAgICBvZGF0YS5vZmZzZXQgPSB7CiAgICAgIHRvcDogUExPVC5vZmZzZXRQYXJlbnQgPT0gQ09OVEFJTkVSID8gUExPVC5vZmZzZXRUb3AgOiAwLAogICAgICBsZWZ0OiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldExlZnQgOiAwLAogICAgfQogIH0KICByZXR1cm4gb2RhdGE7Cn0KZnVuY3Rpb24gZ2V0U2l6ZURhdGEoKSB7CiAgY29uc3QgZGF0YSA9IHsKICAgIHBsb3RfcGFkOiBnZXRPZmZzZXREYXRhKFBMT1QpLAogICAgcGxvdF9yZWN0OiBQTE9ULmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogICAgY29udGFpbmVyX3BhZDogZ2V0T2Zmc2V0RGF0YShDT05UQUlORVIpLAogICAgY29udGFpbmVyX3JlY3Q6IENPTlRBSU5FUi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICB9OwogIHJldHVybiBkYXRhOwp9CmZ1bmN0aW9uIGNvbXB1dGVDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICBjb25zdCBjb21wdXRlZF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICBjb25zdCBvZmZzZXRzID0gY29tcHV0ZWRfc2l6ZS5vZmZzZXRzOwoKICBjb25zdCBwbG90X2RhdGEgPSB7CiAgICB3aWR0aDogd2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCwKICAgIGhlaWdodDogaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH07CgogIHJldHVybiB7CiAgICB3aWR0aDogKHdpZHRoID8/IGNvbXB1dGVkX3NpemUud2lkdGgpICsgb2Zmc2V0cy53aWR0aCwKICAgIGhlaWdodDogKGhlaWdodCA/PyBjb21wdXRlZF9zaXplLmhlaWdodCkgKyBvZmZzZXRzLmhlaWdodCwKICAgIG5vQ2hhbmdlOiB3aWR0aCA9PSBjb21wdXRlZF9zaXplLndpZHRoICYmIGhlaWdodCA9PSBjb21wdXRlZF9zaXplLmhlaWdodCwKICB9Cn0KCi8vIFRoaXMgZnVuY3Rpb24gd2lsbCBjaGFuZ2UgdGhlIGNvbnRhaW5lciBzaXplIHNvIHRoYXQgdGhlIHJlc3VsdGluZyBwbG90IHdpbGwgYmUgbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIHNwZWNzCmZ1bmN0aW9uIGNoYW5nZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGlmICghQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIGNvbnNvbGUubG9nKCJUcmllZCB0byBjaGFuZ2UgY29udGFpbmVyIHNpemUgd2hlbiBub3QgcG9wcGVkLCBpZ25vcmluZyIpOwogICAgcmV0dXJuOwogIH0KCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhKTsKCiAgaWYgKGNzei5ub0NoYW5nZSkgewogICAgY29uc29sZS5sb2coIlNpemUgaXMgdGhlIHNhbWUgYXMgY3VycmVudCwgaWdub3JpbmciKTsKICAgIHJldHVybgogIH0KICAvLyBXZSBhcmUgbm93IGdvaW5nIHRvIHNldCBoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBjb250YWluZXIKICBmb3IgKGNvbnN0IGtleSBvZiBbIndpZHRoIiwgImhlaWdodCJdKSB7CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IGNzeltrZXldICsgInB4IjsKICB9Cn0KLy8gV2Ugbm93IGNyZWF0ZSB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIHVwZGF0ZSB0aGUgcGxvdCBiYXNlZCBvbiB0aGUgdmFsdWVzIHNwZWNpZmllZApmdW5jdGlvbiB1cGRhdGVGcm9tSGVhZGVyKCkgewogIGNvbnN0IGhlYWRlcl9kYXRhID0gewogICAgaGVpZ2h0OiBjb25maWdfc3BhbnMuaGVpZ2h0LnVpX3ZhbHVlLAogICAgd2lkdGg6IGNvbmZpZ19zcGFucy53aWR0aC51aV92YWx1ZSwKICB9OwogIGNoYW5nZUNvbnRhaW5lclNpemUoaGVhZGVyX2RhdGEpOwp9Ci8vIFdlIGFzc2lnbiB0aGlzIGZ1bmN0aW9uIHRvIHRoZSBvbmJsdXIgZXZlbnQgb2Ygd2lkdGggYW5kIGhlaWdodAppZiAoZmlyc3RSdW4pIHsKICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGNvbnRhaW5lci51aV9zcGFuLm9uYmx1ciA9IChlKSA9PiB7CiAgICAgIGNvbnRhaW5lci51aV92YWx1ZSA9IGNvbnRhaW5lci51aV9zcGFuLnRleHRDb250ZW50OwogICAgICB1cGRhdGVGcm9tSGVhZGVyKCk7CiAgICB9OwogIH0KfQovLyBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBwbG90IHNpemUgdG8gdXNlIGZvciByZWxheW91dCBhcyBhIGZ1bmN0aW9uIG9mIHRoZSBjb250YWluZXIgc2l6ZQpmdW5jdGlvbiBjb21wdXRlUGxvdFNpemUoZGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICAvLyBSZW1vdmUgUGFkZGluZwogIGNvbnN0IHsgY29udGFpbmVyX3BhZCwgcGxvdF9wYWQsIGNvbnRhaW5lcl9yZWN0IH0gPSBkYXRhOwogIGNvbnN0IG9mZnNldHMgPSB7CiAgICB3aWR0aDoKICAgICAgcGxvdF9wYWQucGFkZGluZy53aWR0aCArCiAgICAgIHBsb3RfcGFkLmJvcmRlci53aWR0aCArCiAgICAgIHBsb3RfcGFkLm9mZnNldC5sZWZ0ICsKICAgICAgY29udGFpbmVyX3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgY29udGFpbmVyX3BhZC5ib3JkZXIud2lkdGgsCiAgICBoZWlnaHQ6CiAgICAgIHBsb3RfcGFkLnBhZGRpbmcuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLmhlaWdodCArCiAgICAgIHBsb3RfcGFkLm9mZnNldC50b3AgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcuaGVpZ2h0ICsKICAgICAgY29udGFpbmVyX3BhZC5ib3JkZXIuaGVpZ2h0LAogIH07CiAgY29uc3Qgc3ogPSB7CiAgICB3aWR0aDogTWF0aC5yb3VuZChjb250YWluZXJfcmVjdC53aWR0aCAtIG9mZnNldHMud2lkdGgpLAogICAgaGVpZ2h0OiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LmhlaWdodCAtIG9mZnNldHMuaGVpZ2h0KSwKICAgIG9mZnNldHMsCiAgfTsKICByZXR1cm4gc3o7Cn0KCi8vIENyZWF0ZSB0aGUgcmVzaXplT2JzZXJ2ZXIgdG8gbWFrZSB0aGUgcGxvdCBldmVuIG1vcmUgcmVzcG9uc2l2ZSEgOm1hZ2ljOgpjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4gewogIGNvbnN0IHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKTsKICBjb25zdCB7Y29udGFpbmVyX3JlY3QsIGNvbnRhaW5lcl9wYWR9ID0gc2l6ZURhdGE7CiAgbGV0IHBsb3Rfc2l6ZSA9IGNvbXB1dGVQbG90U2l6ZShzaXplRGF0YSk7CiAgLy8gV2Ugc2F2ZSB0aGUgaGVpZ2h0IGluIHRoZSBQTE9UIG9iamVjdAogIFBMT1QuY29udGFpbmVyX2hlaWdodCA9IGNvbnRhaW5lcl9yZWN0LmhlaWdodDsKICAvLyBXZSBkZWFsIHdpdGggc29tZSBzdHVmZiBpZiB0aGUgY29udGFpbmVyIGlzIHBvcHBwZWQKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLndpZHRoID0gY29udGFpbmVyX3JlY3Qud2lkdGggKyAicHgiOwogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9IGNvbnRhaW5lcl9yZWN0LmxlZnQgKyAicHgiOwogIGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUgPSBwbG90X3NpemUuaGVpZ2h0OwogIGNvbmZpZ19zcGFucy53aWR0aC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS53aWR0aDsKICAvKiAKCQlUaGUgYWRkaXRpb24gb2YgdGhlIGludmFsaWQgYXJndW1lbnQgYHBsdXRvcmVzaXplYCBzZWVtcyB0byBmaXggdGhlIHByb2JsZW0gd2l0aCBjYWxsaW5nIGByZWxheW91dGAgc2ltcGx5IHdpdGggYHthdXRvc2l6ZTogdHJ1ZX1gIGFzIHVwZGF0ZSBicmVha2luZyBtb3VzZSByZWxheW91dCBldmVudHMgdHJhY2tpbmcuIAoJCVNlZSBodHRwczovL2dpdGh1Yi5jb20vcGxvdGx5L3Bsb3RseS5qcy9pc3N1ZXMvNjE1NiBmb3IgZGV0YWlscwoJCSovCiAgbGV0IGNvbmZpZyA9IHsKICAgIC8vIElmIHRoaXMgaXMgcG9wcGVkIG91dCwgd2UgaWdub3JlIHRoZSBvcmlnaW5hbCB3aWR0aC9oZWlnaHQKICAgIHdpZHRoOiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyB1bmRlZmluZWQgOiBvcmlnaW5hbF93aWR0aCkgPz8gcGxvdF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyB1bmRlZmluZWQgOiBvcmlnaW5hbF9oZWlnaHQpID8/IHBsb3Rfc2l6ZS5oZWlnaHQsCiAgICBwbHV0b3Jlc2l6ZTogdHJ1ZSwKICB9OwogIFBsb3RseS5yZWxheW91dChQTE9ULCBjb25maWcpLnRoZW4oKCkgPT4gewogICAgaWYgKHJlbW92ZV9jb250YWluZXJfc2l6ZSAmJiAhQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgdGhlIGZpcnN0IHJlc2l6ZSB1cG9uIHBsb3QgY3JlYXRpb24gdG8gYWxyZWFkeSBiZSB3aXRob3V0IGEgZml4ZWQgaGVpZ2h0CiAgICAgIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSAiIjsKICAgICAgQ09OVEFJTkVSLnN0eWxlLndpZHRoID0gIiI7CiAgICAgIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IGZhbHNlOwogICAgfQogIH0pOwp9KTsKCnJlc2l6ZU9ic2VydmVyLm9ic2VydmUoQ09OVEFJTkVSKTsKCgpQbG90bHkucmVhY3QoUExPVCwgcGxvdF9vYmopLnRoZW4oKCkgPT4gewoJLy8gQXNzaWduIHRoZSBQbG90bHkgZXZlbnQgbGlzdGVuZXJzCglmb3IgKGNvbnN0IFtrZXksIGxpc3RlbmVyX3ZlY10gb2YgT2JqZWN0LmVudHJpZXMocGxvdGx5X2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULm9uKGtleSwgbGlzdGVuZXIpCgkJfQoJfQoJLy8gQXNzaWduIHRoZSBKUyBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhqc19saXN0ZW5lcnMpKSB7CgkJZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcl92ZWMpIHsKCQkJUExPVC5hZGRFdmVudExpc3RlbmVyKGtleSwgbGlzdGVuZXIsIHsKCQkJCXNpZ25hbDogY29udHJvbGxlci5zaWduYWwKCQkJfSkKCQl9Cgl9Cn0KKQoKCmludmFsaWRhdGlvbi50aGVuKCgpID0+IHsKCS8vIFJlbW92ZSBhbGwgcGxvdGx5IGxpc3RlbmVycwoJUExPVC5yZW1vdmVBbGxMaXN0ZW5lcnMoKQoJLy8gUmVtb3ZlIGFsbCBKUyBsaXN0ZW5lcnMKCWNvbnRyb2xsZXIuYWJvcnQoKQoJLy8gUmVtb3ZlIHRoZSByZXNpemVPYnNlcnZlcgoJcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpCn0pCgoKCgkJcmV0dXJuIENPTlRBSU5FUgoJPC9zY3JpcHQ+CqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWWpa3NwYWNlX3Nlsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b+jFQ5snLBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkNGUxNDM0ZTEtNjczZi00MjA2LWEyNzEtOWVkZWMxMGViZDZhuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOA5oRw7VwdWJsaXNoZWRfb2JqZWN0X2tleXOR2TViM2I4NDA4Yy04MTgxLTExZWYtMTRlYi1lMWM1NjliOGJiMjkvMTI5NTUzZmMxMWI1MTlkNbhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQzMzU3YTI4My1hMjM0LTRkMTUtOGZkZi03ZmJlYzU4YjMzYTeKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52gUwPGRpdiBjbGFzcz0ibWFya2Rvd24iPjxoMT40LiBTcGluIEVjaG88L2gxPgo8aW1nIGNvbnRyb2xzPScnIHNyYz0naHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0xJQlJFaHViL01SSS1wcm9jZXNzaW5nLTIwMjMvbWFpbi8wMi1zaW11bGF0aW9uL0ZpZ3VyZXMvU0UuZ2lmJyB0eXBlPSdpbWFnZS9naWYnIHdpZHRoPSc0MDBweCc+PC9pbWc+CjxwPlRoZSBzcGluIGVjaG8gZXhwZXJpbWVudCBoYXMgdGhlIGFkdmFudGFnZSB0aGF0IHRoZSBlY2hvIHNpZ25hbCBhbXBsaXR1ZCBpdCBpcyBtb2R1bGF0ZWQgYnkgPHNwYW4gY2xhc3M9InRleCI+JFxleHAmIzQwOy10L1RfMiYjNDE7JDwvc3Bhbj4gYW5kIG5vdCA8c3BhbiBjbGFzcz0idGV4Ij4kXGV4cCYjNDA7LXQvVF8yXiYjMTIzOyomIzEyNTsmIzQxOyQ8L3NwYW4+LjwvcD4KPHA+Rm9yIHRoaXMgc2VjdGlvbiB3ZSB3aWxsIHVzZSB0aGUgcGhhbnRvbSA8Y29kZT5vYmpfdDJzdGFyPC9jb2RlPiBhbmQgYSBuZXcgc2VxdWVuY2UgPGNvZGU+c2VxX3NlPC9jb2RlPi48L3A+CjxwPkZvciB0aGlzIHNlcXVlbmNlIHdlIHdpbGwgbmVlZDo8L3A+Cjx1bD4KPGxpPjxwPiYjNDA7NC4xJiM0MTsgQSA5MGRlZyBoYXJkIFJGIHB1bHNlPC9wPgo8L2xpPgo8bGk+PHA+JiM0MDs0LjImIzQxOyBBIDxjb2RlPkRlbGF5PC9jb2RlPiBvZiA8c3BhbiBjbGFzcz0idGV4Ij4kXG1hdGhybSYjMTIzO1RFJiMxMjU7LzIkPC9zcGFuPiB3aXRoIGEgcG9zaXRpdmUgZ3JhZGllbnQgJiM0MDthcmVhIDxjb2RlPkF4PC9jb2RlPiYjNDE7PC9wPgo8L2xpPgo8bGk+PHA+JiM0MDs0LjMmIzQxOyBBIDE4MGRlZyBoYXJkIFJGIHB1bHNlPC9wPgo8L2xpPgo8bGk+PHA+JiM0MDs0LjQmIzQxOyBBIHJlYWRvdXQgZ3JhZGllbnQgb2YgYXJlYSA8Y29kZT4yQXg8L2NvZGU+IHdpdGggYW4gQURDICYjNDA7c2ltaWxhciB0byAmIzQwOzIuMiYjNDE7JiM0MTssIHN1Y2ggdGhhdCB0aGUgbWlkZGxlIG9mIHRoZSBncmFkaWVudCBhbmQgQURDIGFyZSBpbiA8c3BhbiBjbGFzcz0idGV4Ij4kXG1hdGhybSYjMTIzO1RFJiMxMjU7JDwvc3Bhbj48L3A+CjwvbGk+CjxsaT48cD4mIzQwOzQuNSYjNDE7IENyZWF0ZSBjb25jYXRlbmF0aW5nIHRoZXNlIGJsb2NrcyBpbnRvIGEgc2VxdWVuY2UgY2FsbGVkIDxjb2RlPnNlcV9zZTwvY29kZT48L3A+CjwvbGk+CjxsaT48cD4mIzQwOzQuNiYjNDE7IFBsb3QgPGNvZGU+c2VxX3NlPC9jb2RlPiBhbmQgaXRzIGstc3BhY2UuIElzIHRoZSBrLXNwYWNlIHRoZSBzYW1lIGFzIDxjb2RlPnNlcV9ncmU8L2NvZGU+IGluICYjNDA7Mi4zJiM0MTs/PC9wPgo8L2xpPgo8L3VsPgo8L2Rpdj6kbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/oxT/ocuwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJDMzNTdhMjgzLWEyMzQtNGQxNS04ZmRmLTdmYmVjNThiMzNhN7lkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgAQgxu1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQzYWJjYTQwNi0yZTZiLTRiMzctODgzNS02NWNmYWQ5ZDBjYWGKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52mqJCTxzY3JpcHQgaWQ9J3Bsb3RfMSc+CgkJLy8gV2Ugc3RhcnQgYnkgcHV0dGluZyBhbGwgdGhlIHZhcmlhYmxlIGludGVycG9sYXRpb24gaGVyZSBhdCB0aGUgYmVnaW5uaW5nCgkJLy8gV2UgaGF2ZSB0byBjb252ZXJ0IGFsbCB0eXBlZGFycmF5cyBpbiB0aGUgbGF5b3V0IHRvIG5vcm1hbCBhcnJheXMuIFNlZSBJc3N1ZSAjMjUKCQkvLyBXZSB1c2UgbG9kYXNoIGZvciB0aGlzIGZvciBjb21wYWN0bmVzcwoJCWZ1bmN0aW9uIHJlbW92ZVR5cGVkQXJyYXkobykgewoJCQlyZXR1cm4gXy5pc1R5cGVkQXJyYXkobykgPyBBcnJheS5mcm9tKG8pIDoKCQkJXy5pc1BsYWluT2JqZWN0KG8pID8gXy5tYXBWYWx1ZXMobywgcmVtb3ZlVHlwZWRBcnJheSkgOiAKCQkJbwoJCX0KCgkJLy8gUHVibGlzaCB0aGUgcGxvdCBvYmplY3QgdG8gSlMKCQlsZXQgcGxvdF9vYmogPSBfLnVwZGF0ZSgvKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIEFic3RyYWN0UGx1dG9EaW5nZXRqZXMuRGlzcGxheS5wdWJsaXNoZWRfdG9fanMgKi8gZ2V0UHVibGlzaGVkT2JqZWN0KCJiM2I4NDA4Yy04MTgxLTExZWYtMTRlYi1lMWM1NjliOGJiMjkvNDIyZDQ5MTg5YzM2M2Y1NyIpLCAibGF5b3V0IiwgcmVtb3ZlVHlwZWRBcnJheSkKCQkvLyBHZXQgdGhlIHBsb3RseSBsaXN0ZW5lcnMKCQljb25zdCBwbG90bHlfbGlzdGVuZXJzID0ge30KCQkvLyBHZXQgdGhlIEpTIGxpc3RlbmVycwoJCWNvbnN0IGpzX2xpc3RlbmVycyA9IHt9CgkJLy8gRGVhbCB3aXRoIGV2ZW50dWFsIGN1c3RvbSBjbGFzc2VzCgkJbGV0IGN1c3RvbV9jbGFzc2xpc3QgPSBbXQoKCgkJLy8gTG9hZCB0aGUgcGxvdGx5IGxpYnJhcnkKCQlsZXQgUGxvdGx5ID0gdW5kZWZpbmVkCgkJdHJ5IHsKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoIi4vcGxvdGx5anMvcGxvdGx5anMtMi4yNi4yLm1pbi5qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0gY2F0Y2ggKGUpIHsKCQkJY29uc29sZS5sb2coIkxvY2FsIGxvYWQgZmFpbGVkLCB0cnlpbmcgd2l0aCB0aGUgd2ViIGVzbS5zaCB2ZXJzaW9uIikKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoImh0dHBzOi8vZXNtLnNoL3YxMzUvcGxvdGx5LmpzLWRpc3QtbWluQDIuMjYuMi9lc25leHQvcGxvdGx5LmpzLWRpc3QtbWluLm1qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0KCgkJLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0byBmb3JjZSBsb2NhbCBtYXRoamF4IGZvbnQgY2FjaGUKCQlpZiAoZmFsc2UgJiYgd2luZG93Py5NYXRoSmF4Py5jb25maWc/LnN2Zz8uZm9udENhY2hlID09PSAnZ2xvYmFsJykgewoJCQl3aW5kb3cuTWF0aEpheC5jb25maWcuc3ZnLmZvbnRDYWNoZSA9ICdsb2NhbCcKCQl9CgoJCS8vIEZsYWcgdG8gY2hlY2sgaWYgdGhpcyBjZWxsIHdhcyAgbWFudWFsbHkgcmFuIG9yIHJlYWN0aXZlbHkgcmFuCmNvbnN0IGZpcnN0UnVuID0gdGhpcyA/IGZhbHNlIDogdHJ1ZQpjb25zdCBDT05UQUlORVIgPSB0aGlzID8/IGh0bWxgPGRpdiBjbGFzcz0ncGx1dG9wbG90bHktY29udGFpbmVyJz5gCmNvbnN0IFBMT1QgPSBDT05UQUlORVIucXVlcnlTZWxlY3RvcignLmpzLXBsb3RseS1wbG90JykgPz8gQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgPGRpdj5gKQpjb25zdCBwYXJlbnQgPSBDT05UQUlORVIucGFyZW50RWxlbWVudAovLyBXZSB1c2UgYSBjb250cm9sbGVyIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lcnMgdXBvbiBpbnZhbGlkYXRpb24KY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKQovLyBXZSBoYXZlIHRvIGFkZCB0aGlzIHRvIGtlZXAgc3VwcG9ydGluZyBAYmluZCB3aXRoIHRoZSBvbGQgQVBJIHVzaW5nIFBMT1QKUExPVC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChlKSA9PiB7CglDT05UQUlORVIudmFsdWUgPSBQTE9ULnZhbHVlCglpZiAoZS5idWJibGVzKSB7CgkJcmV0dXJuCgl9CglDT05UQUlORVIuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2lucHV0JykpCn0sIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KQoKCS8vIFRoaXMgY3JlYXRlIHRoZSBzdHlsZSBzdWJkaXYgb24gZmlyc3QgcnVuCglmaXJzdFJ1biAmJiBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGAKCTxzdHlsZT4KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgewoJCXdpZHRoOiAxMDAlOwoJCWhlaWdodDogMTAwJTsKCQltaW4taGVpZ2h0OiAwOwoJCW1pbi13aWR0aDogMDsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgLmpzLXBsb3RseS1wbG90IC5wbG90bHkgZGl2IHsKCQltYXJnaW46IDAgYXV0bzsgLy8gVGhpcyBjZW50ZXJzIHRoZSBwbG90Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLnBvcHBlZC1vdXQgewoJCW92ZXJmbG93OiBhdXRvOwoJCXotaW5kZXg6IDEwMDA7CgkJcG9zaXRpb246IGZpeGVkOwoJCXJlc2l6ZTogYm90aDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDBweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMHB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgewoJCWRpc3BsYXk6IGZsZXg7CgkJZmxleC1mbG93OiByb3cgd3JhcDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAxMnB4OwoJCXBvc2l0aW9uOiBmaXhlZDsKCQl6LWluZGV4OiAxMDAxOwoJCWN1cnNvcjogbW92ZTsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIC0xMDAlKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBzcGFuIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJZmxleDogMQoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIuaGlkZGVuIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuIHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlIHsKCQlwYWRkaW5nLXJpZ2h0OiA1cHg7CgkJcGFkZGluZy1sZWZ0OiAycHg7CgkJY3Vyc29yOiB0ZXh0OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZmxleDogMCAwIDEwMCU7CgkJdGV4dC1hbGlnbjogY2VudGVyOwoJCWJvcmRlci10b3A6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQltYXJnaW4tdG9wOiA1cHg7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZpbGVuYW1lIHsKCQltYXJnaW4tbGVmdDogM3B4OwoJCXRleHQtYWxpZ246IGxlZnQ7CgkJbWluLXdpZHRoOiBtaW4oNjAlLCBtaW4tY29udGVudCk7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCAubGFiZWwgewoJCWZsZXg6IDAgMCAwOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5mb3JtYXQgewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCQlmbGV4OiAxIDAgYXV0bzsKCQltaW4td2lkdGg6IDMwcHg7CgkJbWFyZ2luLXJpZ2h0OiAxMHB4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCQlmbGV4LWZsb3c6IGNvbHVtbjsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlwYWRkaW5nLWxlZnQ6IDNweDsKCQl6LWluZGV4OiAyMDAwOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIHsKCQljdXJzb3I6IHBvaW50ZXI7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJcGFkZGluZzogM3B4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKC0zcHgsIC02cHgpOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpub3QoLnNlbGVjdGVkKSB7CgkJbWFyZ2luLXRvcDogM3B4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uLnNlbGVjdGVkIHsKCQlvcmRlcjogLTE7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246aG92ZXIgewoJCWJhY2tncm91bmQtY29sb3I6IHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJfQoJc3Bhbi5jb25maWctdmFsdWUgewoJCWZvbnQtd2VpZ2h0OiBub3JtYWw7CgkJY29sb3I6IHZhcigtLXBsdXRvLW91dHB1dC1jb2xvcik7CgkJZGlzcGxheTogbm9uZTsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIGNhbGMoLTEwMCUgLSAxMHB4KSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLmxhYmVsIHsKCQl1c2VyLXNlbGVjdDogbm9uZTsKCX0KCS5sYWJlbDpob3ZlciBzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCW1pbi13aWR0aDogMTUwcHg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4ubWF0Y2hpbmctY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLW1hY3JvLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5kaWZmZXJlbnQtY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLXRhZy1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9Cjwvc3R5bGU+CmApCgpsZXQgb3JpZ2luYWxfaGVpZ2h0ID0gcGxvdF9vYmoubGF5b3V0LmhlaWdodApsZXQgb3JpZ2luYWxfd2lkdGggPSBwbG90X29iai5sYXlvdXQud2lkdGgKLy8gRm9yIHRoZSBoZWlnaHQgd2UgaGF2ZSB0byBhbHNvIHB1dCBhIGZpeGVkIHZhbHVlIGluIGNhc2UgdGhlIHBsb3QgaXMgcHV0IG9uIGEgbm9uLWZpeGVkLXNpemUgY29udGFpbmVyIChsaWtlIHRoZSBkZWZhdWx0IHdyYXBwZXIpCi8vIFdlIGRlZmluZSBhIHZhcmlhYmxlIHRvIGNoZWNrIHdoZXRoZXIgd2Ugc3RpbGwgaGF2ZSB0byByZW1vdmUgdGhlIGZpeGVkIGhlaWdodApsZXQgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmlyc3RSdW4KbGV0IGNvbnRhaW5lcl9oZWlnaHQgPSBvcmlnaW5hbF9oZWlnaHQgPz8gUExPVC5jb250YWluZXJfaGVpZ2h0ID8/IDQwMApDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX2hlaWdodCArICdweCcKCi8vIFdlIGNyZWF0ZSBhIFByb21pc2UgdmVyc2lvbiBvZiBzZXRUaW1lb3V0CmZ1bmN0aW9uIGRlbGF5KG1zKSB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7Cn0KCi8vIFdlIGltcG9ydCBpbnRlcmFjdCBmb3IgZHJhZ2dpbmcvcmVzaXppbmcKY29uc3QgeyBkZWZhdWx0OiBpbnRlcmFjdCB9ID0gYXdhaXQgaW1wb3J0KCdodHRwczovL2VzbS5zaC9pbnRlcmFjdGpzQDEuMTAuMTknKQoKCmZ1bmN0aW9uIGdldEltYWdlT3B0aW9ucygpIHsKICBjb25zdCBvID0gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogIHJldHVybiB7CiAgICBmb3JtYXQ6IG8uZm9ybWF0ID8/ICJwbmciLAogICAgd2lkdGg6IG8ud2lkdGggPz8gb3JpZ2luYWxfd2lkdGgsCiAgICBoZWlnaHQ6IG8uaGVpZ2h0ID8/IG9yaWdpbmFsX2hlaWdodCwKICAgIHNjYWxlOiBvLnNjYWxlID8/IDEsCiAgICBmaWxlbmFtZTogby5maWxlbmFtZSA/PyAibmV3cGxvdCIsCiAgfTsKfQoKY29uc3QgQ0xJUEJPQVJEX0hFQURFUiA9CiAgQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoIi5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIikgPz8KICBDT05UQUlORVIuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgImFmdGVyYmVnaW4iLAogICAgaHRtbGA8ZGl2IGNsYXNzPSJwbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIGhpZGRlbiI+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmb3JtYXQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+Rm9ybWF0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZvcm1hdCI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB3aWR0aCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5XaWR0aDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSB3aWR0aCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGhlaWdodCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5IZWlnaHQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgaGVpZ2h0Ij48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2NhbGUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+U2NhbGU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgc2NhbGUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzZXQiPlNldDwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB1bnNldCI+VW5zZXQ8L2J1dHRvbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZpbGVuYW1lIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZpbGVuYW1lOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZpbGVuYW1lIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgIDwvZGl2PmAKICApOwoKZnVuY3Rpb24gY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcikgewogIGNvbnN0IHZhbGlkX2NsYXNzZXMgPSBbCiAgICAibWlzc2luZy1jb25maWciLAogICAgIm1hdGNoaW5nLWNvbmZpZyIsCiAgICAiZGlmZmVyZW50LWNvbmZpZyIsCiAgXTsKICBmdW5jdGlvbiBzZXRDbGFzcyhjbCkgewogICAgZm9yIChjb25zdCBuYW1lIG9mIHZhbGlkX2NsYXNzZXMpIHsKICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUobmFtZSwgbmFtZSA9PSBjbCk7CiAgICB9CiAgfQogIC8vIFdlIHVzZSB0aGUgY3VzdG9tIGdldHRlcnMgd2UnbGwgc2V0IHVwIGluIHRoZSBjb250YWluZXIKICBjb25zdCB7IHVpX3ZhbHVlLCBjb25maWdfdmFsdWUsIGNvbmZpZ19zcGFuLCBrZXkgfSA9IGNvbnRhaW5lcjsKICBpZiAoY29uZmlnX3ZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgIHNldENsYXNzKCJtaXNzaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBpcyBub3QgcHJlc2VudCBpbiB0aGUgY29uZmlnLmA7CiAgfSBlbHNlIGlmICh1aV92YWx1ZSA9PSBjb25maWdfdmFsdWUpIHsKICAgIHNldENsYXNzKCJtYXRjaGluZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIHRoZSBzYW1lIHZhbHVlIGluIHRoZSBjb25maWcgYW5kIGluIHRoZSBoZWFkZXIuYDsKICB9IGVsc2UgewogICAgc2V0Q2xhc3MoImRpZmZlcmVudC1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIGEgZGlmZmVyZW50IHZhbHVlICg8ZW0+JHtjb25maWdfdmFsdWV9PC9lbT4pIGluIHRoZSBjb25maWcuYDsKICB9CiAgLy8gQWRkIGluZm8gYWJvdXQgc2V0dGluZyBhbmQgdW5zZXR0aW5nCiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIG9uIHRoZSBsYWJlbCA8ZW0+PGI+b25jZTwvYj48L2VtPiB0byBzZXQgdGhlIGN1cnJlbnQgVUkgdmFsdWUgaW4gdGhlIGNvbmZpZy5gCiAgKTsKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgPGVtPjxiPnR3aWNlPC9iPjwvZW0+IHRvIHJlbW92ZSB0aGlzIGtleSBmcm9tIHRoZSBjb25maWcuYAogICk7Cn0KCmNvbnN0IHZhbGlkX2Zvcm1hdHMgPSBbInBuZyIsICJzdmciLCAid2VicCIsICJqcGVnIiwgImZ1bGwtanNvbiJdOwpmdW5jdGlvbiBpbml0aWFsaXplVUlWYWx1ZVNwYW4oc3Bhbiwga2V5LCB2YWx1ZSkgewogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSBrZXkgPT09ICJmb3JtYXQiID8gImZhbHNlIiA6ICJ0cnVlIjsKICBsZXQgcGFyc2UgPSAoeCkgPT4geDsKICBsZXQgdXBkYXRlID0gKHgpID0+IChzcGFuLnRleHRDb250ZW50ID0geCk7CiAgaWYgKGtleSA9PT0gIndpZHRoIiB8fCBrZXkgPT09ICJoZWlnaHQiKSB7CiAgICBwYXJzZSA9ICh4KSA9PiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoeCkpOwogIH0gZWxzZSBpZiAoa2V5ID09PSAic2NhbGUiKSB7CiAgICBwYXJzZSA9IHBhcnNlRmxvYXQ7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAvLyBXZSByZW1vdmUgY29udGVudEVkaXRhYmxlCiAgICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9ICJmYWxzZSI7CiAgICAvLyBIZXJlIHdlIGZpcnN0IGFkZCB0aGUgc3Vic3BhbnMgZm9yIGVhY2ggb3B0aW9uCiAgICBjb25zdCBvcHRzX2RpdiA9IHNwYW4uYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2IGNsYXNzPSJmb3JtYXQtb3B0aW9ucyI+PC9kaXY+YCk7CiAgICBmb3IgKGNvbnN0IGZtdCBvZiB2YWxpZF9mb3JtYXRzKSB7CiAgICAgIGNvbnN0IG9wdCA9IG9wdHNfZGl2LmFwcGVuZENoaWxkKAogICAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImZvcm1hdC1vcHRpb24gJHtmbXR9Ij4ke2ZtdH08L3NwYW4+YAogICAgICApOwogICAgICBvcHQub25jbGljayA9IChlKSA9PiB7CiAgICAgICAgc3Bhbi52YWx1ZSA9IG9wdC50ZXh0Q29udGVudDsKICAgICAgfTsKICAgIH0KICAgIHBhcnNlID0gKHgpID0+IHsKICAgICAgcmV0dXJuIHZhbGlkX2Zvcm1hdHMuaW5jbHVkZXMoeCkgPyB4IDogbG9jYWxWYWx1ZTsKICAgIH07CiAgICB1cGRhdGUgPSAoeCkgPT4gewogICAgICBmb3IgKGNvbnN0IG9wdCBvZiBvcHRzX2Rpdi5jaGlsZHJlbikgewogICAgICAgIG9wdC5jbGFzc0xpc3QudG9nZ2xlKCJzZWxlY3RlZCIsIG9wdC50ZXh0Q29udGVudCA9PT0geCk7CiAgICAgIH0KICAgIH07CiAgfSBlbHNlIHsKICAgIC8vIFdlIG9ubHkgaGF2ZSBmaWxlbmFtZSBoZXJlCiAgfQogIGxldCBsb2NhbFZhbHVlOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIGxvY2FsVmFsdWU7CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIGlmICh2YWwgIT09ICIiKSB7CiAgICAgICAgbG9jYWxWYWx1ZSA9IHBhcnNlKHZhbCk7CiAgICAgIH0KICAgICAgdXBkYXRlKGxvY2FsVmFsdWUpOwogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7CiAgLy8gV2UgYWxzbyBhc3NpZ24gYSBsaXN0ZW5lciBzbyB0aGF0IHRoZSBlZGl0YWJsZSBpcyBibHVycmVkIHdoZW4gZW50ZXIgaXMgcHJlc3NlZAogIHNwYW4ub25rZXlkb3duID0gKGUpID0+IHsKICAgIGlmIChlLmtleUNvZGUgPT09IDEzKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgc3Bhbi5ibHVyKCk7CiAgICB9CiAgfTsKICBzcGFuLnZhbHVlID0gdmFsdWU7Cn0KCmZ1bmN0aW9uIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oc3Bhbiwga2V5KSB7CiAgLy8gSGVyZSB3ZSBtb3N0bHkgd2FudCB0byBkZWZpbmUgdGhlIHNldHRlciBhbmQgZ2V0dGVyCiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgLy8gaWYgdW5kZWZpbmVkIGlzIHBhc3NlZCwgd2UgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBvcHRpb25zCiAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGRlbGV0ZSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XSA9IHZhbDsKICAgICAgfQogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7Cn0KCmNvbnN0IGNvbmZpZ19zcGFucyA9IHt9Owpmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhnZXRJbWFnZU9wdGlvbnMoKSkpIHsKICBjb25zdCBjb250YWluZXIgPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoYC5jbGlwYm9hcmQtc3Bhbi4ke2tleX1gKTsKICBjb25zdCBsYWJlbCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIubGFiZWwiKTsKICAvLyBXZSBnaXZlIHRoZSBsYWJlbCBhIGZ1bmN0aW9uIHRoYXQgb24gc2luZ2xlIGNsaWNrIHdpbGwgc2V0IHRoZSBjdXJyZW50IHZhbHVlIGFuZCB3aXRoIGRvdWJsZSBjbGljayB3aWxsIHVuc2V0IGl0CiAgbGFiZWwub25jbGljayA9IER1YWxDbGljaygKICAgICgpID0+IHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0sCiAgICAoZSkgPT4gewogICAgICBjb25zb2xlLmxvZygiZSIsIGUpOwogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSB1bmRlZmluZWQ7CiAgICB9CiAgKTsKICBjb25zdCB1aV92YWx1ZV9zcGFuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtdmFsdWUiKTsKICBjb25zdCBjb25maWdfdmFsdWVfc3BhbiA9CiAgICBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNvbmZpZy12YWx1ZSIpID8/CiAgICBsYWJlbC5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAgICJhZnRlcmJlZ2luIiwKICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iY29uZmlnLXZhbHVlIj48L3NwYW4+YAogICAgKTsKICAvLyBBc3NpbmcgdGhlIHR3byBzcGFucyBhcyBwcm9wZXJ0aWVzIG9mIHRoZSBjb250YWluaW5nIHNwYW4KICBjb250YWluZXIudWlfc3BhbiA9IHVpX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmNvbmZpZ19zcGFuID0gY29uZmlnX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmtleSA9IGtleTsKICBjb25maWdfc3BhbnNba2V5XSA9IGNvbnRhaW5lcjsKICBpZiAoZmlyc3RSdW4pIHsKICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA9CiAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICAgIC8vIFdlIGRvIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdmFsdWUgc3BhbgogICAgaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHVpX3ZhbHVlX3NwYW4sIGtleSwgdmFsdWUpOwogICAgLy8gVGhlbiB3ZSBpbml0aWFsaXplIHRoZSBjb25maWcgdmFsdWUKICAgIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oY29uZmlnX3ZhbHVlX3NwYW4sIGtleSk7CiAgICAvLyBXZSBwdXQgc29tZSBjb252ZW5pZW5jZSBnZXR0ZXJzL3NldHRlcnMKICAgIC8vIHVpX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJ1aV92YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiB1aV92YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICB1aV92YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgICAvLyBjb25maWdfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgImNvbmZpZ192YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICB9Cn0KCi8vIFRoZXNlIG9iamVjdHMgd2lsbCBjb250YWluIHRoZSBkZWZhdWx0IHZhbHVlCgovLyBUaGlzIGNvZGUgdXBkYXRlcyB0aGUgaW1hZ2Ugb3B0aW9ucyBpbiB0aGUgUExPVCBjb25maWcgd2l0aCB0aGUgcHJvdmlkZWQgb25lcwpmdW5jdGlvbiBzZXRJbWFnZU9wdGlvbnMobykgewogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gb1trZXldOwogIH0KfQpmdW5jdGlvbiB1bnNldEltYWdlT3B0aW9ucygpIHsKICBzZXRJbWFnZU9wdGlvbnMoe30pOwp9Cgpjb25zdCBzZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4uc2V0Iik7CmNvbnN0IHVuc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnVuc2V0Iik7CmlmIChmaXJzdFJ1bikgewogIHNldF9idXR0b24ub25jbGljayA9IChlKSA9PiB7CiAgICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0KICB9OwogIHVuc2V0X2J1dHRvbi5vbmNsaWNrID0gdW5zZXRJbWFnZU9wdGlvbnM7Cn0KCi8vIFdlIGFkZCBhIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBjbGlwYm9hcmQgaXMgcG9wcGVkIG91dApDT05UQUlORVIuaXNQb3BwZWRPdXQgPSAoKSA9PiB7CiAgcmV0dXJuIENPTlRBSU5FUi5jbGFzc0xpc3QuY29udGFpbnMoInBvcHBlZC1vdXQiKTsKfTsKCkNMSVBCT0FSRF9IRUFERVIub25tb3VzZWRvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHsKICBpZiAoZXZlbnQudGFyZ2V0Lm1hdGNoZXMoInNwYW4uY2xpcGJvYXJkLXZhbHVlIikpIHsKICAgIGNvbnNvbGUubG9nKCJXZSBkb24ndCBtb3ZlISIpOwogICAgcmV0dXJuOwogIH0KICBjb25zdCBzdGFydCA9IHsKICAgIGxlZnQ6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLmxlZnQpLAogICAgdG9wOiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS50b3ApLAogICAgWDogZXZlbnQucGFnZVgsCiAgICBZOiBldmVudC5wYWdlWSwKICB9OwogIGZ1bmN0aW9uIG1vdmVBdChldmVudCwgc3RhcnQpIHsKICAgIGNvbnN0IHRvcCA9IGV2ZW50LnBhZ2VZIC0gc3RhcnQuWSArIHN0YXJ0LnRvcCArICJweCI7CiAgICBjb25zdCBsZWZ0ID0gZXZlbnQucGFnZVggLSBzdGFydC5YICsgc3RhcnQubGVmdCArICJweCI7CiAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9IHRvcDsKICB9CgogIC8vIG1vdmUgb3VyIGFic29sdXRlbHkgcG9zaXRpb25lZCBiYWxsIHVuZGVyIHRoZSBwb2ludGVyCiAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQpIHsKICAgIG1vdmVBdChldmVudCwgc3RhcnQpOwogIH0KCiAgLy8gV2UgdXNlIHRoaXMgdG8gcmVtb3ZlIHRoZSBtb3VzZW1vdmUgd2hlbiBjbGlja2luZyBvdXRzaWRlIG9mIHRoZSBjb250YWluZXIKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICAvLyBtb3ZlIHRoZSBjb250YWluZXIgb24gbW91c2Vtb3ZlCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgb25Nb3VzZU1vdmUsIHsKICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsCiAgfSk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgY2xlYW5VcCgpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7CgogIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICBjb25zb2xlLmxvZygiY2xlYW5pbmcgdXAgdGhlIHBsb3QgbW92ZSBsaXN0ZW5lciIpOwogICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBudWxsOwogIH0KCiAgLy8gKDMpIGRyb3AgdGhlIGJhbGwsIHJlbW92ZSB1bm5lZWRlZCBoYW5kbGVycwogIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gY2xlYW5VcDsKfTsKCmZ1bmN0aW9uIHNlbmRUb0NsaXBib2FyZChibG9iKSB7CiAgaWYgKCFuYXZpZ2F0b3IuY2xpcGJvYXJkKSB7CiAgICBhbGVydCgKICAgICAgIlRoZSBDbGlwYm9hcmQgQVBJIGRvZXMgbm90IHNlZW0gdG8gYmUgYXZhaWxhYmxlLCBtYWtlIHN1cmUgdGhlIFBsdXRvIG5vdGVib29rIGlzIGJlaW5nIHVzZWQgZnJvbSBlaXRoZXIgbG9jYWxob3N0IG9yIGFuIGh0dHBzIHNvdXJjZS4iCiAgICApOwogIH0KICBuYXZpZ2F0b3IuY2xpcGJvYXJkCiAgICAud3JpdGUoWwogICAgICBuZXcgQ2xpcGJvYXJkSXRlbSh7CiAgICAgICAgLy8gVGhlIGtleSBpcyBkZXRlcm1pbmVkIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBibG9iJ3MgdHlwZS4KICAgICAgICBbYmxvYi50eXBlXTogYmxvYiwKICAgICAgfSksCiAgICBdKQogICAgLnRoZW4oCiAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICBjb25zb2xlLmxvZygiQXN5bmM6IENvcHlpbmcgdG8gY2xpcGJvYXJkIHdhcyBzdWNjZXNzZnVsISIpOwogICAgICB9LAogICAgICBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiQXN5bmM6IENvdWxkIG5vdCBjb3B5IHRleHQ6ICIsIGVycik7CiAgICAgIH0KICAgICk7Cn0KCmZ1bmN0aW9uIGNvcHlJbWFnZVRvQ2xpcGJvYXJkKCkgewogIC8vIFdlIGV4dHJhY3QgdGhlIGltYWdlIG9wdGlvbnMgZnJvbSB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycyAoaWYgdGhleSBleGlzdCkKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LiBXZSBhbHNvIGlnbm9yZSBmb3JtYXQgYmVjYXVzZSB0aGUgY2xpcGJvYXJkIG9ubHkgc3VwcG9ydHMgcG5nLgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gImZvcm1hdCIpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LnRvSW1hZ2UoUExPVCwgY29uZmlnKS50aGVuKGZ1bmN0aW9uIChkYXRhVXJsKSB7CiAgICBmZXRjaChkYXRhVXJsKQogICAgICAudGhlbigocmVzKSA9PiByZXMuYmxvYigpKQogICAgICAudGhlbigoYmxvYikgPT4gewogICAgICAgIGNvbnN0IHBhc3RlX3JlY2VpdmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigncGFzdGUtcmVjZWl2ZXIucGx1dG9wbG90bHknKQogICAgICAgIGlmIChwYXN0ZV9yZWNlaXZlcikgewogICAgICAgICAgcGFzdGVfcmVjZWl2ZXIuYXR0YWNoSW1hZ2UoZGF0YVVybCwgQ09OVEFJTkVSKQogICAgICAgIH0KICAgICAgICBzZW5kVG9DbGlwYm9hcmQoYmxvYikKICAgICAgfSk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHNhdmVJbWFnZVRvRmlsZSgpIHsKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS5kb3dubG9hZEltYWdlKFBMT1QsIGNvbmZpZyk7Cn0KCmxldCBjb250YWluZXJfcmVjdCA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCwgdG9wOiAwLCBsZWZ0OiAwIH07CmZ1bmN0aW9uIHVucG9wX2NvbnRhaW5lcihjbCkgewogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgZmFsc2UpOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBmYWxzZSk7CiAgLy8gV2UgZml4IHRoZSBoZWlnaHQgYmFjayB0byB0aGUgdmFsdWUgaXQgaGFkIGJlZm9yZSBwb3BvdXQsIGFsc28gc2V0dGluZyB0aGUgZmxhZyB0byBzaWduYWwgdGhhdCB1cG9uIGZpcnN0IHJlc2l6ZSB3ZSByZW1vdmUgdGhlIGZpeGVkIGlubGluZS1zdHlsZQogIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQgKyAicHgiOwogIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IHRydWU7CiAgLy8gV2Ugc2V0IHRoZSBvdGhlciBmaXhlZCBpbmxpbmUtc3R5bGVzIHRvIG51bGwKICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICBDT05UQUlORVIuc3R5bGUudG9wID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBXZSBhbHNvIHJlbW92ZSB0aGUgQ0xJUEJPQVJEX0hFQURFUgogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSAiIjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBGaW5hbGx5IHdlIHJlbW92ZSB0aGUgaGlkZGVuIGNsYXNzIHRvIHRoZSBoZWFkZXIKICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIHRydWUpOwogIHJldHVybjsKfQpmdW5jdGlvbiBwb3BvdXRfY29udGFpbmVyKG9wdHMpIHsKICBjb25zdCBjbCA9IG9wdHM/LmNsOwogIGNvbnN0IHRhcmdldF9jb250YWluZXJfc2l6ZSA9IG9wdHM/LnRhcmdldF9jb250YWluZXJfc2l6ZSA/PyB7fTsKICBjb25zdCB0YXJnZXRfcGxvdF9zaXplID0gb3B0cz8udGFyZ2V0X3Bsb3Rfc2l6ZSA/PyB7fTsKICBpZiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIHJldHVybiB1bnBvcF9jb250YWluZXIoY2wpOwogIH0KICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgY2wgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdHJ1ZSk7CiAgLy8gV2UgZXh0cmFjdCB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjb250YWluZXIsIHNhdmUgdGhlbSBhbmQgZml4IHRoZW0KICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9ID0gQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogIGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfTsKICAvLyBXZSBzYXZlIHRoZSBjdXJyZW50IHBsb3Qgc2l6ZSBiZWZvcmUgd2UgcG9wIGFzIGl0IHdpbGwgZmlsbCB0aGUgc2NyZWVuCiAgY29uc3QgY3VycmVudF9wbG90X3NpemUgPSB7CiAgICB3aWR0aDogUExPVC5fZnVsbExheW91dC53aWR0aCwKICAgIGhlaWdodDogUExPVC5fZnVsbExheW91dC5oZWlnaHQsCiAgfTsKICAvLyBXZSBoYXZlIHRvIHNhdmUgdGhlIHBhZCBkYXRhIGJlZm9yZSBwb3BwaW5nIHNvIHdlIGNhbiByZXNpemUgcHJlY2lzZWx5CiAgY29uc3QgcGFkID0ge307CiAgcGFkLnVucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgdHJ1ZSk7CiAgcGFkLnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICAvLyBXZSBkbyB0b3AgYW5kIGxlZnQgYmFzZWQgb24gdGhlIGN1cnJlbnQgcmVjdAogIGZvciAoY29uc3Qga2V5IG9mIFsidG9wIiwgImxlZnQiXSkgewogICAgY29uc3Qgc3RhcnRfdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY29udGFpbmVyX3JlY3Rba2V5XTsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgZm9yIChjb25zdCBraW5kIG9mIFsicGFkZGluZyIsICJib3JkZXIiXSkgewogICAgICBvZmZzZXQgKz0gcGFkLnBvcHBlZFtraW5kXVtrZXldIC0gcGFkLnVucG9wcGVkW2tpbmRdW2tleV07CiAgICB9CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHN0YXJ0X3ZhbCAtIG9mZnNldCArICJweCI7CiAgICBpZiAoa2V5ID09PSAibGVmdCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIC8vIFdlIGNvbXB1dGUgdGhlIHdpZHRoIGFuZCBoZWlnaHQgZGVwZW5kaW5nIG9uIGV2ZW50dWFsIGNvbmZpZyBkYXRhCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoewogICAgd2lkdGg6CiAgICAgIHRhcmdldF9wbG90X3NpemUud2lkdGggPz8KICAgICAgY29uZmlnX3NwYW5zLndpZHRoLmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS5oZWlnaHQgPz8KICAgICAgY29uZmlnX3NwYW5zLmhlaWdodC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUuaGVpZ2h0LAogIH0pOwogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIGNvbnN0IHZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNzeltrZXldOwogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSB2YWwgKyAicHgiOwogICAgaWYgKGtleSA9PT0gIndpZHRoIikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCBmYWxzZSk7CiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgdW5wb3BfY29udGFpbmVyKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKfQoKQ09OVEFJTkVSLnBvcE91dCA9IHBvcG91dF9jb250YWluZXI7CgpmdW5jdGlvbiBEdWFsQ2xpY2soc2luZ2xlX2Z1bmMsIGRibF9mdW5jKSB7CiAgbGV0IG5jbGlja3MgPSAwOwogIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykgewogICAgbmNsaWNrcyArPSAxOwogICAgaWYgKG5jbGlja3MgPiAxKSB7CiAgICAgIGRibF9mdW5jKC4uLmFyZ3MpOwogICAgICBuY2xpY2tzID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIGRlbGF5KDMwMCkudGhlbigoKSA9PiB7CiAgICAgICAgaWYgKG5jbGlja3MgPT0gMSkgewogICAgICAgICAgc2luZ2xlX2Z1bmMoLi4uYXJncyk7CiAgICAgICAgfQogICAgICAgIG5jbGlja3MgPSAwOwogICAgICB9KTsKICAgIH0KICB9Owp9CgovLyBXZSByZW1vdmUgdGhlIGRlZmF1bHQgZG93bmxvYWQgaW1hZ2UgYnV0dG9uCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSwKICBbInRvSW1hZ2UiXQopOwovLyBXZSBhZGQgdGhlIGN1c3RvbSBidXR0b24gdG8gdGhlIG1vZGViYXIKcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkLAogIFsKICAgIHsKICAgICAgbmFtZTogIkNvcHkgUE5HIHRvIENsaXBib2FyZCIsCiAgICAgIGljb246IHsKICAgICAgICBoZWlnaHQ6IDUyMCwKICAgICAgICB3aWR0aDogNTIwLAogICAgICAgIHBhdGg6ICJNMjgwIDY0aDQwYzM1LjMgMCA2NCAyOC43IDY0IDY0VjQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEg2NGMtMzUuMyAwLTY0LTI4LjctNjQtNjRWMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0aDQwIDkuNkMxMjEgMjcuNSAxNTMuMyAwIDE5MiAwczcxIDI3LjUgNzguNCA2NEgyODB6TTY0IDExMmMtOC44IDAtMTYgNy4yLTE2IDE2VjQ0OGMwIDguOCA3LjIgMTYgMTYgMTZIMzIwYzguOCAwIDE2LTcuMiAxNi0xNlYxMjhjMC04LjgtNy4yLTE2LTE2LTE2SDMwNHYyNGMwIDEzLjMtMTAuNyAyNC0yNCAyNEgxOTIgMTA0Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNFYxMTJINjR6bTEyOC04YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHoiLAogICAgICB9LAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soY29weUltYWdlVG9DbGlwYm9hcmQsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKCk7CiAgICAgIH0pLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIkRvd25sb2FkIEltYWdlIiwKICAgICAgaWNvbjogUGxvdGx5Lkljb25zLmNhbWVyYSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKHNhdmVJbWFnZVRvRmlsZSwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoeyBjbDogImZpbGVzYXZlIiB9KTsKICAgICAgfSksCiAgICB9LAogIF0KKTsKCmZ1bmN0aW9uIGdldE9mZnNldERhdGEoZWwpIHsKICBsZXQgY3MgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgbnVsbCk7CiAgY29uc3Qgb2RhdGEgPSB7CiAgICBwYWRkaW5nOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgfSwKICAgIGJvcmRlcjogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgfQogIH07CiAgaWYgKGVsID09PSBQTE9UKSB7CiAgICAvLyBGb3IgdGhlIFBMT1Qgd2UgYWxzbyB3YW50IHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBvZmZzZXQKICAgIG9kYXRhLm9mZnNldCA9IHsKICAgICAgdG9wOiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldFRvcCA6IDAsCiAgICAgIGxlZnQ6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0TGVmdCA6IDAsCiAgICB9CiAgfQogIHJldHVybiBvZGF0YTsKfQpmdW5jdGlvbiBnZXRTaXplRGF0YSgpIHsKICBjb25zdCBkYXRhID0gewogICAgcGxvdF9wYWQ6IGdldE9mZnNldERhdGEoUExPVCksCiAgICBwbG90X3JlY3Q6IFBMT1QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgICBjb250YWluZXJfcGFkOiBnZXRPZmZzZXREYXRhKENPTlRBSU5FUiksCiAgICBjb250YWluZXJfcmVjdDogQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogIH07CiAgcmV0dXJuIGRhdGE7Cn0KZnVuY3Rpb24gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGNvbnN0IGNvbXB1dGVkX3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIGNvbnN0IG9mZnNldHMgPSBjb21wdXRlZF9zaXplLm9mZnNldHM7CgogIGNvbnN0IHBsb3RfZGF0YSA9IHsKICAgIHdpZHRoOiB3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiBoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfTsKCiAgcmV0dXJuIHsKICAgIHdpZHRoOiAod2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCkgKyBvZmZzZXRzLndpZHRoLAogICAgaGVpZ2h0OiAoaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0KSArIG9mZnNldHMuaGVpZ2h0LAogICAgbm9DaGFuZ2U6IHdpZHRoID09IGNvbXB1dGVkX3NpemUud2lkdGggJiYgaGVpZ2h0ID09IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH0KfQoKLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGNoYW5nZSB0aGUgY29udGFpbmVyIHNpemUgc28gdGhhdCB0aGUgcmVzdWx0aW5nIHBsb3Qgd2lsbCBiZSBtYXRjaGluZyB0aGUgcHJvdmlkZWQgc3BlY3MKZnVuY3Rpb24gY2hhbmdlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgaWYgKCFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgY29uc29sZS5sb2coIlRyaWVkIHRvIGNoYW5nZSBjb250YWluZXIgc2l6ZSB3aGVuIG5vdCBwb3BwZWQsIGlnbm9yaW5nIik7CiAgICByZXR1cm47CiAgfQoKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEpOwoKICBpZiAoY3N6Lm5vQ2hhbmdlKSB7CiAgICBjb25zb2xlLmxvZygiU2l6ZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50LCBpZ25vcmluZyIpOwogICAgcmV0dXJuCiAgfQogIC8vIFdlIGFyZSBub3cgZ29pbmcgdG8gc2V0IGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGNvbnRhaW5lcgogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gY3N6W2tleV0gKyAicHgiOwogIH0KfQovLyBXZSBub3cgY3JlYXRlIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgdXBkYXRlIHRoZSBwbG90IGJhc2VkIG9uIHRoZSB2YWx1ZXMgc3BlY2lmaWVkCmZ1bmN0aW9uIHVwZGF0ZUZyb21IZWFkZXIoKSB7CiAgY29uc3QgaGVhZGVyX2RhdGEgPSB7CiAgICBoZWlnaHQ6IGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUsCiAgICB3aWR0aDogY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlLAogIH07CiAgY2hhbmdlQ29udGFpbmVyU2l6ZShoZWFkZXJfZGF0YSk7Cn0KLy8gV2UgYXNzaWduIHRoaXMgZnVuY3Rpb24gdG8gdGhlIG9uYmx1ciBldmVudCBvZiB3aWR0aCBhbmQgaGVpZ2h0CmlmIChmaXJzdFJ1bikgewogIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLnVpX3NwYW4ub25ibHVyID0gKGUpID0+IHsKICAgICAgY29udGFpbmVyLnVpX3ZhbHVlID0gY29udGFpbmVyLnVpX3NwYW4udGV4dENvbnRlbnQ7CiAgICAgIHVwZGF0ZUZyb21IZWFkZXIoKTsKICAgIH07CiAgfQp9Ci8vIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIHBsb3Qgc2l6ZSB0byB1c2UgZm9yIHJlbGF5b3V0IGFzIGEgZnVuY3Rpb24gb2YgdGhlIGNvbnRhaW5lciBzaXplCmZ1bmN0aW9uIGNvbXB1dGVQbG90U2l6ZShkYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIC8vIFJlbW92ZSBQYWRkaW5nCiAgY29uc3QgeyBjb250YWluZXJfcGFkLCBwbG90X3BhZCwgY29udGFpbmVyX3JlY3QgfSA9IGRhdGE7CiAgY29uc3Qgb2Zmc2V0cyA9IHsKICAgIHdpZHRoOgogICAgICBwbG90X3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLndpZHRoICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LmxlZnQgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci53aWR0aCwKICAgIGhlaWdodDoKICAgICAgcGxvdF9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBwbG90X3BhZC5ib3JkZXIuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LnRvcCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci5oZWlnaHQsCiAgfTsKICBjb25zdCBzeiA9IHsKICAgIHdpZHRoOiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LndpZHRoIC0gb2Zmc2V0cy53aWR0aCksCiAgICBoZWlnaHQ6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3QuaGVpZ2h0IC0gb2Zmc2V0cy5oZWlnaHQpLAogICAgb2Zmc2V0cywKICB9OwogIHJldHVybiBzejsKfQoKLy8gQ3JlYXRlIHRoZSByZXNpemVPYnNlcnZlciB0byBtYWtlIHRoZSBwbG90IGV2ZW4gbW9yZSByZXNwb25zaXZlISA6bWFnaWM6CmNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7CiAgY29uc3Qgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpOwogIGNvbnN0IHtjb250YWluZXJfcmVjdCwgY29udGFpbmVyX3BhZH0gPSBzaXplRGF0YTsKICBsZXQgcGxvdF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICAvLyBXZSBzYXZlIHRoZSBoZWlnaHQgaW4gdGhlIFBMT1Qgb2JqZWN0CiAgUExPVC5jb250YWluZXJfaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0OwogIC8vIFdlIGRlYWwgd2l0aCBzb21lIHN0dWZmIGlmIHRoZSBjb250YWluZXIgaXMgcG9wcHBlZAogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSBjb250YWluZXJfcmVjdC53aWR0aCArICJweCI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gY29udGFpbmVyX3JlY3QubGVmdCArICJweCI7CiAgY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS5oZWlnaHQ7CiAgY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlID0gcGxvdF9zaXplLndpZHRoOwogIC8qIAoJCVRoZSBhZGRpdGlvbiBvZiB0aGUgaW52YWxpZCBhcmd1bWVudCBgcGx1dG9yZXNpemVgIHNlZW1zIHRvIGZpeCB0aGUgcHJvYmxlbSB3aXRoIGNhbGxpbmcgYHJlbGF5b3V0YCBzaW1wbHkgd2l0aCBge2F1dG9zaXplOiB0cnVlfWAgYXMgdXBkYXRlIGJyZWFraW5nIG1vdXNlIHJlbGF5b3V0IGV2ZW50cyB0cmFja2luZy4gCgkJU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wbG90bHkvcGxvdGx5LmpzL2lzc3Vlcy82MTU2IGZvciBkZXRhaWxzCgkJKi8KICBsZXQgY29uZmlnID0gewogICAgLy8gSWYgdGhpcyBpcyBwb3BwZWQgb3V0LCB3ZSBpZ25vcmUgdGhlIG9yaWdpbmFsIHdpZHRoL2hlaWdodAogICAgd2lkdGg6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX3dpZHRoKSA/PyBwbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX2hlaWdodCkgPz8gcGxvdF9zaXplLmhlaWdodCwKICAgIHBsdXRvcmVzaXplOiB0cnVlLAogIH07CiAgUGxvdGx5LnJlbGF5b3V0KFBMT1QsIGNvbmZpZykudGhlbigoKSA9PiB7CiAgICBpZiAocmVtb3ZlX2NvbnRhaW5lcl9zaXplICYmICFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBhdm9pZCB0aGUgZmlyc3QgcmVzaXplIHVwb24gcGxvdCBjcmVhdGlvbiB0byBhbHJlYWR5IGJlIHdpdGhvdXQgYSBmaXhlZCBoZWlnaHQKICAgICAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9ICIiOwogICAgICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICAgICAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmFsc2U7CiAgICB9CiAgfSk7Cn0pOwoKcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShDT05UQUlORVIpOwoKClBsb3RseS5yZWFjdChQTE9ULCBwbG90X29iaikudGhlbigoKSA9PiB7CgkvLyBBc3NpZ24gdGhlIFBsb3RseSBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhwbG90bHlfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1Qub24oa2V5LCBsaXN0ZW5lcikKCQl9Cgl9CgkvLyBBc3NpZ24gdGhlIEpTIGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKGpzX2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULmFkZEV2ZW50TGlzdGVuZXIoa2V5LCBsaXN0ZW5lciwgewoJCQkJc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbAoJCQl9KQoJCX0KCX0KfQopCgoKaW52YWxpZGF0aW9uLnRoZW4oKCkgPT4gewoJLy8gUmVtb3ZlIGFsbCBwbG90bHkgbGlzdGVuZXJzCglQTE9ULnJlbW92ZUFsbExpc3RlbmVycygpCgkvLyBSZW1vdmUgYWxsIEpTIGxpc3RlbmVycwoJY29udHJvbGxlci5hYm9ydCgpCgkvLyBSZW1vdmUgdGhlIHJlc2l6ZU9ic2VydmVyCglyZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCkKfSkKCgoKCQlyZXR1cm4gQ09OVEFJTkVSCgk8L3NjcmlwdD4KpG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZaprc3BhY2VfZ3Jlsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b+jFDvNDLBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkM2FiY2E0MDYtMmU2Yi00YjM3LTg4MzUtNjVjZmFkOWQwY2FhuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXObeM9ibVwdWJsaXNoZWRfb2JqZWN0X2tleXOR2TViM2I4NDA4Yy04MTgxLTExZWYtMTRlYi1lMWM1NjliOGJiMjkvNDIyZDQ5MTg5YzM2M2Y1N7hkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQwOTc1NTQ3ZC02N2Q5LTRlNmItODhmZi1hOWRkMDZhN2Y5ZWaKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52mqJCTxzY3JpcHQgaWQ9J3Bsb3RfMSc+CgkJLy8gV2Ugc3RhcnQgYnkgcHV0dGluZyBhbGwgdGhlIHZhcmlhYmxlIGludGVycG9sYXRpb24gaGVyZSBhdCB0aGUgYmVnaW5uaW5nCgkJLy8gV2UgaGF2ZSB0byBjb252ZXJ0IGFsbCB0eXBlZGFycmF5cyBpbiB0aGUgbGF5b3V0IHRvIG5vcm1hbCBhcnJheXMuIFNlZSBJc3N1ZSAjMjUKCQkvLyBXZSB1c2UgbG9kYXNoIGZvciB0aGlzIGZvciBjb21wYWN0bmVzcwoJCWZ1bmN0aW9uIHJlbW92ZVR5cGVkQXJyYXkobykgewoJCQlyZXR1cm4gXy5pc1R5cGVkQXJyYXkobykgPyBBcnJheS5mcm9tKG8pIDoKCQkJXy5pc1BsYWluT2JqZWN0KG8pID8gXy5tYXBWYWx1ZXMobywgcmVtb3ZlVHlwZWRBcnJheSkgOiAKCQkJbwoJCX0KCgkJLy8gUHVibGlzaCB0aGUgcGxvdCBvYmplY3QgdG8gSlMKCQlsZXQgcGxvdF9vYmogPSBfLnVwZGF0ZSgvKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIEFic3RyYWN0UGx1dG9EaW5nZXRqZXMuRGlzcGxheS5wdWJsaXNoZWRfdG9fanMgKi8gZ2V0UHVibGlzaGVkT2JqZWN0KCJiM2I4NDA4Yy04MTgxLTExZWYtMTRlYi1lMWM1NjliOGJiMjkvOTExN2Q0MGQ1NDY5ZTMwZiIpLCAibGF5b3V0IiwgcmVtb3ZlVHlwZWRBcnJheSkKCQkvLyBHZXQgdGhlIHBsb3RseSBsaXN0ZW5lcnMKCQljb25zdCBwbG90bHlfbGlzdGVuZXJzID0ge30KCQkvLyBHZXQgdGhlIEpTIGxpc3RlbmVycwoJCWNvbnN0IGpzX2xpc3RlbmVycyA9IHt9CgkJLy8gRGVhbCB3aXRoIGV2ZW50dWFsIGN1c3RvbSBjbGFzc2VzCgkJbGV0IGN1c3RvbV9jbGFzc2xpc3QgPSBbXQoKCgkJLy8gTG9hZCB0aGUgcGxvdGx5IGxpYnJhcnkKCQlsZXQgUGxvdGx5ID0gdW5kZWZpbmVkCgkJdHJ5IHsKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoIi4vcGxvdGx5anMvcGxvdGx5anMtMi4yNi4yLm1pbi5qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0gY2F0Y2ggKGUpIHsKCQkJY29uc29sZS5sb2coIkxvY2FsIGxvYWQgZmFpbGVkLCB0cnlpbmcgd2l0aCB0aGUgd2ViIGVzbS5zaCB2ZXJzaW9uIikKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoImh0dHBzOi8vZXNtLnNoL3YxMzUvcGxvdGx5LmpzLWRpc3QtbWluQDIuMjYuMi9lc25leHQvcGxvdGx5LmpzLWRpc3QtbWluLm1qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0KCgkJLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0byBmb3JjZSBsb2NhbCBtYXRoamF4IGZvbnQgY2FjaGUKCQlpZiAoZmFsc2UgJiYgd2luZG93Py5NYXRoSmF4Py5jb25maWc/LnN2Zz8uZm9udENhY2hlID09PSAnZ2xvYmFsJykgewoJCQl3aW5kb3cuTWF0aEpheC5jb25maWcuc3ZnLmZvbnRDYWNoZSA9ICdsb2NhbCcKCQl9CgoJCS8vIEZsYWcgdG8gY2hlY2sgaWYgdGhpcyBjZWxsIHdhcyAgbWFudWFsbHkgcmFuIG9yIHJlYWN0aXZlbHkgcmFuCmNvbnN0IGZpcnN0UnVuID0gdGhpcyA/IGZhbHNlIDogdHJ1ZQpjb25zdCBDT05UQUlORVIgPSB0aGlzID8/IGh0bWxgPGRpdiBjbGFzcz0ncGx1dG9wbG90bHktY29udGFpbmVyJz5gCmNvbnN0IFBMT1QgPSBDT05UQUlORVIucXVlcnlTZWxlY3RvcignLmpzLXBsb3RseS1wbG90JykgPz8gQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgPGRpdj5gKQpjb25zdCBwYXJlbnQgPSBDT05UQUlORVIucGFyZW50RWxlbWVudAovLyBXZSB1c2UgYSBjb250cm9sbGVyIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lcnMgdXBvbiBpbnZhbGlkYXRpb24KY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKQovLyBXZSBoYXZlIHRvIGFkZCB0aGlzIHRvIGtlZXAgc3VwcG9ydGluZyBAYmluZCB3aXRoIHRoZSBvbGQgQVBJIHVzaW5nIFBMT1QKUExPVC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChlKSA9PiB7CglDT05UQUlORVIudmFsdWUgPSBQTE9ULnZhbHVlCglpZiAoZS5idWJibGVzKSB7CgkJcmV0dXJuCgl9CglDT05UQUlORVIuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2lucHV0JykpCn0sIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KQoKCS8vIFRoaXMgY3JlYXRlIHRoZSBzdHlsZSBzdWJkaXYgb24gZmlyc3QgcnVuCglmaXJzdFJ1biAmJiBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGAKCTxzdHlsZT4KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgewoJCXdpZHRoOiAxMDAlOwoJCWhlaWdodDogMTAwJTsKCQltaW4taGVpZ2h0OiAwOwoJCW1pbi13aWR0aDogMDsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgLmpzLXBsb3RseS1wbG90IC5wbG90bHkgZGl2IHsKCQltYXJnaW46IDAgYXV0bzsgLy8gVGhpcyBjZW50ZXJzIHRoZSBwbG90Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLnBvcHBlZC1vdXQgewoJCW92ZXJmbG93OiBhdXRvOwoJCXotaW5kZXg6IDEwMDA7CgkJcG9zaXRpb246IGZpeGVkOwoJCXJlc2l6ZTogYm90aDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDBweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMHB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgewoJCWRpc3BsYXk6IGZsZXg7CgkJZmxleC1mbG93OiByb3cgd3JhcDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAxMnB4OwoJCXBvc2l0aW9uOiBmaXhlZDsKCQl6LWluZGV4OiAxMDAxOwoJCWN1cnNvcjogbW92ZTsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIC0xMDAlKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBzcGFuIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJZmxleDogMQoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIuaGlkZGVuIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuIHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlIHsKCQlwYWRkaW5nLXJpZ2h0OiA1cHg7CgkJcGFkZGluZy1sZWZ0OiAycHg7CgkJY3Vyc29yOiB0ZXh0OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZmxleDogMCAwIDEwMCU7CgkJdGV4dC1hbGlnbjogY2VudGVyOwoJCWJvcmRlci10b3A6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQltYXJnaW4tdG9wOiA1cHg7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZpbGVuYW1lIHsKCQltYXJnaW4tbGVmdDogM3B4OwoJCXRleHQtYWxpZ246IGxlZnQ7CgkJbWluLXdpZHRoOiBtaW4oNjAlLCBtaW4tY29udGVudCk7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCAubGFiZWwgewoJCWZsZXg6IDAgMCAwOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5mb3JtYXQgewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCQlmbGV4OiAxIDAgYXV0bzsKCQltaW4td2lkdGg6IDMwcHg7CgkJbWFyZ2luLXJpZ2h0OiAxMHB4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCQlmbGV4LWZsb3c6IGNvbHVtbjsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlwYWRkaW5nLWxlZnQ6IDNweDsKCQl6LWluZGV4OiAyMDAwOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIHsKCQljdXJzb3I6IHBvaW50ZXI7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJcGFkZGluZzogM3B4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKC0zcHgsIC02cHgpOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpub3QoLnNlbGVjdGVkKSB7CgkJbWFyZ2luLXRvcDogM3B4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uLnNlbGVjdGVkIHsKCQlvcmRlcjogLTE7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246aG92ZXIgewoJCWJhY2tncm91bmQtY29sb3I6IHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJfQoJc3Bhbi5jb25maWctdmFsdWUgewoJCWZvbnQtd2VpZ2h0OiBub3JtYWw7CgkJY29sb3I6IHZhcigtLXBsdXRvLW91dHB1dC1jb2xvcik7CgkJZGlzcGxheTogbm9uZTsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIGNhbGMoLTEwMCUgLSAxMHB4KSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLmxhYmVsIHsKCQl1c2VyLXNlbGVjdDogbm9uZTsKCX0KCS5sYWJlbDpob3ZlciBzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCW1pbi13aWR0aDogMTUwcHg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4ubWF0Y2hpbmctY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLW1hY3JvLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5kaWZmZXJlbnQtY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLXRhZy1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9Cjwvc3R5bGU+CmApCgpsZXQgb3JpZ2luYWxfaGVpZ2h0ID0gcGxvdF9vYmoubGF5b3V0LmhlaWdodApsZXQgb3JpZ2luYWxfd2lkdGggPSBwbG90X29iai5sYXlvdXQud2lkdGgKLy8gRm9yIHRoZSBoZWlnaHQgd2UgaGF2ZSB0byBhbHNvIHB1dCBhIGZpeGVkIHZhbHVlIGluIGNhc2UgdGhlIHBsb3QgaXMgcHV0IG9uIGEgbm9uLWZpeGVkLXNpemUgY29udGFpbmVyIChsaWtlIHRoZSBkZWZhdWx0IHdyYXBwZXIpCi8vIFdlIGRlZmluZSBhIHZhcmlhYmxlIHRvIGNoZWNrIHdoZXRoZXIgd2Ugc3RpbGwgaGF2ZSB0byByZW1vdmUgdGhlIGZpeGVkIGhlaWdodApsZXQgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmlyc3RSdW4KbGV0IGNvbnRhaW5lcl9oZWlnaHQgPSBvcmlnaW5hbF9oZWlnaHQgPz8gUExPVC5jb250YWluZXJfaGVpZ2h0ID8/IDQwMApDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX2hlaWdodCArICdweCcKCi8vIFdlIGNyZWF0ZSBhIFByb21pc2UgdmVyc2lvbiBvZiBzZXRUaW1lb3V0CmZ1bmN0aW9uIGRlbGF5KG1zKSB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7Cn0KCi8vIFdlIGltcG9ydCBpbnRlcmFjdCBmb3IgZHJhZ2dpbmcvcmVzaXppbmcKY29uc3QgeyBkZWZhdWx0OiBpbnRlcmFjdCB9ID0gYXdhaXQgaW1wb3J0KCdodHRwczovL2VzbS5zaC9pbnRlcmFjdGpzQDEuMTAuMTknKQoKCmZ1bmN0aW9uIGdldEltYWdlT3B0aW9ucygpIHsKICBjb25zdCBvID0gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogIHJldHVybiB7CiAgICBmb3JtYXQ6IG8uZm9ybWF0ID8/ICJwbmciLAogICAgd2lkdGg6IG8ud2lkdGggPz8gb3JpZ2luYWxfd2lkdGgsCiAgICBoZWlnaHQ6IG8uaGVpZ2h0ID8/IG9yaWdpbmFsX2hlaWdodCwKICAgIHNjYWxlOiBvLnNjYWxlID8/IDEsCiAgICBmaWxlbmFtZTogby5maWxlbmFtZSA/PyAibmV3cGxvdCIsCiAgfTsKfQoKY29uc3QgQ0xJUEJPQVJEX0hFQURFUiA9CiAgQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoIi5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIikgPz8KICBDT05UQUlORVIuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgImFmdGVyYmVnaW4iLAogICAgaHRtbGA8ZGl2IGNsYXNzPSJwbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIGhpZGRlbiI+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmb3JtYXQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+Rm9ybWF0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZvcm1hdCI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB3aWR0aCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5XaWR0aDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSB3aWR0aCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGhlaWdodCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5IZWlnaHQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgaGVpZ2h0Ij48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2NhbGUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+U2NhbGU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgc2NhbGUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzZXQiPlNldDwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB1bnNldCI+VW5zZXQ8L2J1dHRvbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZpbGVuYW1lIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZpbGVuYW1lOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZpbGVuYW1lIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgIDwvZGl2PmAKICApOwoKZnVuY3Rpb24gY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcikgewogIGNvbnN0IHZhbGlkX2NsYXNzZXMgPSBbCiAgICAibWlzc2luZy1jb25maWciLAogICAgIm1hdGNoaW5nLWNvbmZpZyIsCiAgICAiZGlmZmVyZW50LWNvbmZpZyIsCiAgXTsKICBmdW5jdGlvbiBzZXRDbGFzcyhjbCkgewogICAgZm9yIChjb25zdCBuYW1lIG9mIHZhbGlkX2NsYXNzZXMpIHsKICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUobmFtZSwgbmFtZSA9PSBjbCk7CiAgICB9CiAgfQogIC8vIFdlIHVzZSB0aGUgY3VzdG9tIGdldHRlcnMgd2UnbGwgc2V0IHVwIGluIHRoZSBjb250YWluZXIKICBjb25zdCB7IHVpX3ZhbHVlLCBjb25maWdfdmFsdWUsIGNvbmZpZ19zcGFuLCBrZXkgfSA9IGNvbnRhaW5lcjsKICBpZiAoY29uZmlnX3ZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgIHNldENsYXNzKCJtaXNzaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBpcyBub3QgcHJlc2VudCBpbiB0aGUgY29uZmlnLmA7CiAgfSBlbHNlIGlmICh1aV92YWx1ZSA9PSBjb25maWdfdmFsdWUpIHsKICAgIHNldENsYXNzKCJtYXRjaGluZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIHRoZSBzYW1lIHZhbHVlIGluIHRoZSBjb25maWcgYW5kIGluIHRoZSBoZWFkZXIuYDsKICB9IGVsc2UgewogICAgc2V0Q2xhc3MoImRpZmZlcmVudC1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIGEgZGlmZmVyZW50IHZhbHVlICg8ZW0+JHtjb25maWdfdmFsdWV9PC9lbT4pIGluIHRoZSBjb25maWcuYDsKICB9CiAgLy8gQWRkIGluZm8gYWJvdXQgc2V0dGluZyBhbmQgdW5zZXR0aW5nCiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIG9uIHRoZSBsYWJlbCA8ZW0+PGI+b25jZTwvYj48L2VtPiB0byBzZXQgdGhlIGN1cnJlbnQgVUkgdmFsdWUgaW4gdGhlIGNvbmZpZy5gCiAgKTsKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgPGVtPjxiPnR3aWNlPC9iPjwvZW0+IHRvIHJlbW92ZSB0aGlzIGtleSBmcm9tIHRoZSBjb25maWcuYAogICk7Cn0KCmNvbnN0IHZhbGlkX2Zvcm1hdHMgPSBbInBuZyIsICJzdmciLCAid2VicCIsICJqcGVnIiwgImZ1bGwtanNvbiJdOwpmdW5jdGlvbiBpbml0aWFsaXplVUlWYWx1ZVNwYW4oc3Bhbiwga2V5LCB2YWx1ZSkgewogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSBrZXkgPT09ICJmb3JtYXQiID8gImZhbHNlIiA6ICJ0cnVlIjsKICBsZXQgcGFyc2UgPSAoeCkgPT4geDsKICBsZXQgdXBkYXRlID0gKHgpID0+IChzcGFuLnRleHRDb250ZW50ID0geCk7CiAgaWYgKGtleSA9PT0gIndpZHRoIiB8fCBrZXkgPT09ICJoZWlnaHQiKSB7CiAgICBwYXJzZSA9ICh4KSA9PiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoeCkpOwogIH0gZWxzZSBpZiAoa2V5ID09PSAic2NhbGUiKSB7CiAgICBwYXJzZSA9IHBhcnNlRmxvYXQ7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAvLyBXZSByZW1vdmUgY29udGVudEVkaXRhYmxlCiAgICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9ICJmYWxzZSI7CiAgICAvLyBIZXJlIHdlIGZpcnN0IGFkZCB0aGUgc3Vic3BhbnMgZm9yIGVhY2ggb3B0aW9uCiAgICBjb25zdCBvcHRzX2RpdiA9IHNwYW4uYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2IGNsYXNzPSJmb3JtYXQtb3B0aW9ucyI+PC9kaXY+YCk7CiAgICBmb3IgKGNvbnN0IGZtdCBvZiB2YWxpZF9mb3JtYXRzKSB7CiAgICAgIGNvbnN0IG9wdCA9IG9wdHNfZGl2LmFwcGVuZENoaWxkKAogICAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImZvcm1hdC1vcHRpb24gJHtmbXR9Ij4ke2ZtdH08L3NwYW4+YAogICAgICApOwogICAgICBvcHQub25jbGljayA9IChlKSA9PiB7CiAgICAgICAgc3Bhbi52YWx1ZSA9IG9wdC50ZXh0Q29udGVudDsKICAgICAgfTsKICAgIH0KICAgIHBhcnNlID0gKHgpID0+IHsKICAgICAgcmV0dXJuIHZhbGlkX2Zvcm1hdHMuaW5jbHVkZXMoeCkgPyB4IDogbG9jYWxWYWx1ZTsKICAgIH07CiAgICB1cGRhdGUgPSAoeCkgPT4gewogICAgICBmb3IgKGNvbnN0IG9wdCBvZiBvcHRzX2Rpdi5jaGlsZHJlbikgewogICAgICAgIG9wdC5jbGFzc0xpc3QudG9nZ2xlKCJzZWxlY3RlZCIsIG9wdC50ZXh0Q29udGVudCA9PT0geCk7CiAgICAgIH0KICAgIH07CiAgfSBlbHNlIHsKICAgIC8vIFdlIG9ubHkgaGF2ZSBmaWxlbmFtZSBoZXJlCiAgfQogIGxldCBsb2NhbFZhbHVlOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIGxvY2FsVmFsdWU7CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIGlmICh2YWwgIT09ICIiKSB7CiAgICAgICAgbG9jYWxWYWx1ZSA9IHBhcnNlKHZhbCk7CiAgICAgIH0KICAgICAgdXBkYXRlKGxvY2FsVmFsdWUpOwogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7CiAgLy8gV2UgYWxzbyBhc3NpZ24gYSBsaXN0ZW5lciBzbyB0aGF0IHRoZSBlZGl0YWJsZSBpcyBibHVycmVkIHdoZW4gZW50ZXIgaXMgcHJlc3NlZAogIHNwYW4ub25rZXlkb3duID0gKGUpID0+IHsKICAgIGlmIChlLmtleUNvZGUgPT09IDEzKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgc3Bhbi5ibHVyKCk7CiAgICB9CiAgfTsKICBzcGFuLnZhbHVlID0gdmFsdWU7Cn0KCmZ1bmN0aW9uIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oc3Bhbiwga2V5KSB7CiAgLy8gSGVyZSB3ZSBtb3N0bHkgd2FudCB0byBkZWZpbmUgdGhlIHNldHRlciBhbmQgZ2V0dGVyCiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgLy8gaWYgdW5kZWZpbmVkIGlzIHBhc3NlZCwgd2UgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBvcHRpb25zCiAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGRlbGV0ZSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XSA9IHZhbDsKICAgICAgfQogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7Cn0KCmNvbnN0IGNvbmZpZ19zcGFucyA9IHt9Owpmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhnZXRJbWFnZU9wdGlvbnMoKSkpIHsKICBjb25zdCBjb250YWluZXIgPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoYC5jbGlwYm9hcmQtc3Bhbi4ke2tleX1gKTsKICBjb25zdCBsYWJlbCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIubGFiZWwiKTsKICAvLyBXZSBnaXZlIHRoZSBsYWJlbCBhIGZ1bmN0aW9uIHRoYXQgb24gc2luZ2xlIGNsaWNrIHdpbGwgc2V0IHRoZSBjdXJyZW50IHZhbHVlIGFuZCB3aXRoIGRvdWJsZSBjbGljayB3aWxsIHVuc2V0IGl0CiAgbGFiZWwub25jbGljayA9IER1YWxDbGljaygKICAgICgpID0+IHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0sCiAgICAoZSkgPT4gewogICAgICBjb25zb2xlLmxvZygiZSIsIGUpOwogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSB1bmRlZmluZWQ7CiAgICB9CiAgKTsKICBjb25zdCB1aV92YWx1ZV9zcGFuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtdmFsdWUiKTsKICBjb25zdCBjb25maWdfdmFsdWVfc3BhbiA9CiAgICBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNvbmZpZy12YWx1ZSIpID8/CiAgICBsYWJlbC5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAgICJhZnRlcmJlZ2luIiwKICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iY29uZmlnLXZhbHVlIj48L3NwYW4+YAogICAgKTsKICAvLyBBc3NpbmcgdGhlIHR3byBzcGFucyBhcyBwcm9wZXJ0aWVzIG9mIHRoZSBjb250YWluaW5nIHNwYW4KICBjb250YWluZXIudWlfc3BhbiA9IHVpX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmNvbmZpZ19zcGFuID0gY29uZmlnX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmtleSA9IGtleTsKICBjb25maWdfc3BhbnNba2V5XSA9IGNvbnRhaW5lcjsKICBpZiAoZmlyc3RSdW4pIHsKICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA9CiAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICAgIC8vIFdlIGRvIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdmFsdWUgc3BhbgogICAgaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHVpX3ZhbHVlX3NwYW4sIGtleSwgdmFsdWUpOwogICAgLy8gVGhlbiB3ZSBpbml0aWFsaXplIHRoZSBjb25maWcgdmFsdWUKICAgIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oY29uZmlnX3ZhbHVlX3NwYW4sIGtleSk7CiAgICAvLyBXZSBwdXQgc29tZSBjb252ZW5pZW5jZSBnZXR0ZXJzL3NldHRlcnMKICAgIC8vIHVpX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJ1aV92YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiB1aV92YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICB1aV92YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgICAvLyBjb25maWdfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgImNvbmZpZ192YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICB9Cn0KCi8vIFRoZXNlIG9iamVjdHMgd2lsbCBjb250YWluIHRoZSBkZWZhdWx0IHZhbHVlCgovLyBUaGlzIGNvZGUgdXBkYXRlcyB0aGUgaW1hZ2Ugb3B0aW9ucyBpbiB0aGUgUExPVCBjb25maWcgd2l0aCB0aGUgcHJvdmlkZWQgb25lcwpmdW5jdGlvbiBzZXRJbWFnZU9wdGlvbnMobykgewogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gb1trZXldOwogIH0KfQpmdW5jdGlvbiB1bnNldEltYWdlT3B0aW9ucygpIHsKICBzZXRJbWFnZU9wdGlvbnMoe30pOwp9Cgpjb25zdCBzZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4uc2V0Iik7CmNvbnN0IHVuc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnVuc2V0Iik7CmlmIChmaXJzdFJ1bikgewogIHNldF9idXR0b24ub25jbGljayA9IChlKSA9PiB7CiAgICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0KICB9OwogIHVuc2V0X2J1dHRvbi5vbmNsaWNrID0gdW5zZXRJbWFnZU9wdGlvbnM7Cn0KCi8vIFdlIGFkZCBhIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBjbGlwYm9hcmQgaXMgcG9wcGVkIG91dApDT05UQUlORVIuaXNQb3BwZWRPdXQgPSAoKSA9PiB7CiAgcmV0dXJuIENPTlRBSU5FUi5jbGFzc0xpc3QuY29udGFpbnMoInBvcHBlZC1vdXQiKTsKfTsKCkNMSVBCT0FSRF9IRUFERVIub25tb3VzZWRvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHsKICBpZiAoZXZlbnQudGFyZ2V0Lm1hdGNoZXMoInNwYW4uY2xpcGJvYXJkLXZhbHVlIikpIHsKICAgIGNvbnNvbGUubG9nKCJXZSBkb24ndCBtb3ZlISIpOwogICAgcmV0dXJuOwogIH0KICBjb25zdCBzdGFydCA9IHsKICAgIGxlZnQ6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLmxlZnQpLAogICAgdG9wOiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS50b3ApLAogICAgWDogZXZlbnQucGFnZVgsCiAgICBZOiBldmVudC5wYWdlWSwKICB9OwogIGZ1bmN0aW9uIG1vdmVBdChldmVudCwgc3RhcnQpIHsKICAgIGNvbnN0IHRvcCA9IGV2ZW50LnBhZ2VZIC0gc3RhcnQuWSArIHN0YXJ0LnRvcCArICJweCI7CiAgICBjb25zdCBsZWZ0ID0gZXZlbnQucGFnZVggLSBzdGFydC5YICsgc3RhcnQubGVmdCArICJweCI7CiAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9IHRvcDsKICB9CgogIC8vIG1vdmUgb3VyIGFic29sdXRlbHkgcG9zaXRpb25lZCBiYWxsIHVuZGVyIHRoZSBwb2ludGVyCiAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQpIHsKICAgIG1vdmVBdChldmVudCwgc3RhcnQpOwogIH0KCiAgLy8gV2UgdXNlIHRoaXMgdG8gcmVtb3ZlIHRoZSBtb3VzZW1vdmUgd2hlbiBjbGlja2luZyBvdXRzaWRlIG9mIHRoZSBjb250YWluZXIKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICAvLyBtb3ZlIHRoZSBjb250YWluZXIgb24gbW91c2Vtb3ZlCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgb25Nb3VzZU1vdmUsIHsKICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsCiAgfSk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgY2xlYW5VcCgpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7CgogIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICBjb25zb2xlLmxvZygiY2xlYW5pbmcgdXAgdGhlIHBsb3QgbW92ZSBsaXN0ZW5lciIpOwogICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBudWxsOwogIH0KCiAgLy8gKDMpIGRyb3AgdGhlIGJhbGwsIHJlbW92ZSB1bm5lZWRlZCBoYW5kbGVycwogIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gY2xlYW5VcDsKfTsKCmZ1bmN0aW9uIHNlbmRUb0NsaXBib2FyZChibG9iKSB7CiAgaWYgKCFuYXZpZ2F0b3IuY2xpcGJvYXJkKSB7CiAgICBhbGVydCgKICAgICAgIlRoZSBDbGlwYm9hcmQgQVBJIGRvZXMgbm90IHNlZW0gdG8gYmUgYXZhaWxhYmxlLCBtYWtlIHN1cmUgdGhlIFBsdXRvIG5vdGVib29rIGlzIGJlaW5nIHVzZWQgZnJvbSBlaXRoZXIgbG9jYWxob3N0IG9yIGFuIGh0dHBzIHNvdXJjZS4iCiAgICApOwogIH0KICBuYXZpZ2F0b3IuY2xpcGJvYXJkCiAgICAud3JpdGUoWwogICAgICBuZXcgQ2xpcGJvYXJkSXRlbSh7CiAgICAgICAgLy8gVGhlIGtleSBpcyBkZXRlcm1pbmVkIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBibG9iJ3MgdHlwZS4KICAgICAgICBbYmxvYi50eXBlXTogYmxvYiwKICAgICAgfSksCiAgICBdKQogICAgLnRoZW4oCiAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICBjb25zb2xlLmxvZygiQXN5bmM6IENvcHlpbmcgdG8gY2xpcGJvYXJkIHdhcyBzdWNjZXNzZnVsISIpOwogICAgICB9LAogICAgICBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiQXN5bmM6IENvdWxkIG5vdCBjb3B5IHRleHQ6ICIsIGVycik7CiAgICAgIH0KICAgICk7Cn0KCmZ1bmN0aW9uIGNvcHlJbWFnZVRvQ2xpcGJvYXJkKCkgewogIC8vIFdlIGV4dHJhY3QgdGhlIGltYWdlIG9wdGlvbnMgZnJvbSB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycyAoaWYgdGhleSBleGlzdCkKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LiBXZSBhbHNvIGlnbm9yZSBmb3JtYXQgYmVjYXVzZSB0aGUgY2xpcGJvYXJkIG9ubHkgc3VwcG9ydHMgcG5nLgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gImZvcm1hdCIpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LnRvSW1hZ2UoUExPVCwgY29uZmlnKS50aGVuKGZ1bmN0aW9uIChkYXRhVXJsKSB7CiAgICBmZXRjaChkYXRhVXJsKQogICAgICAudGhlbigocmVzKSA9PiByZXMuYmxvYigpKQogICAgICAudGhlbigoYmxvYikgPT4gewogICAgICAgIGNvbnN0IHBhc3RlX3JlY2VpdmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigncGFzdGUtcmVjZWl2ZXIucGx1dG9wbG90bHknKQogICAgICAgIGlmIChwYXN0ZV9yZWNlaXZlcikgewogICAgICAgICAgcGFzdGVfcmVjZWl2ZXIuYXR0YWNoSW1hZ2UoZGF0YVVybCwgQ09OVEFJTkVSKQogICAgICAgIH0KICAgICAgICBzZW5kVG9DbGlwYm9hcmQoYmxvYikKICAgICAgfSk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHNhdmVJbWFnZVRvRmlsZSgpIHsKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS5kb3dubG9hZEltYWdlKFBMT1QsIGNvbmZpZyk7Cn0KCmxldCBjb250YWluZXJfcmVjdCA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCwgdG9wOiAwLCBsZWZ0OiAwIH07CmZ1bmN0aW9uIHVucG9wX2NvbnRhaW5lcihjbCkgewogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgZmFsc2UpOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBmYWxzZSk7CiAgLy8gV2UgZml4IHRoZSBoZWlnaHQgYmFjayB0byB0aGUgdmFsdWUgaXQgaGFkIGJlZm9yZSBwb3BvdXQsIGFsc28gc2V0dGluZyB0aGUgZmxhZyB0byBzaWduYWwgdGhhdCB1cG9uIGZpcnN0IHJlc2l6ZSB3ZSByZW1vdmUgdGhlIGZpeGVkIGlubGluZS1zdHlsZQogIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQgKyAicHgiOwogIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IHRydWU7CiAgLy8gV2Ugc2V0IHRoZSBvdGhlciBmaXhlZCBpbmxpbmUtc3R5bGVzIHRvIG51bGwKICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICBDT05UQUlORVIuc3R5bGUudG9wID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBXZSBhbHNvIHJlbW92ZSB0aGUgQ0xJUEJPQVJEX0hFQURFUgogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSAiIjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBGaW5hbGx5IHdlIHJlbW92ZSB0aGUgaGlkZGVuIGNsYXNzIHRvIHRoZSBoZWFkZXIKICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIHRydWUpOwogIHJldHVybjsKfQpmdW5jdGlvbiBwb3BvdXRfY29udGFpbmVyKG9wdHMpIHsKICBjb25zdCBjbCA9IG9wdHM/LmNsOwogIGNvbnN0IHRhcmdldF9jb250YWluZXJfc2l6ZSA9IG9wdHM/LnRhcmdldF9jb250YWluZXJfc2l6ZSA/PyB7fTsKICBjb25zdCB0YXJnZXRfcGxvdF9zaXplID0gb3B0cz8udGFyZ2V0X3Bsb3Rfc2l6ZSA/PyB7fTsKICBpZiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIHJldHVybiB1bnBvcF9jb250YWluZXIoY2wpOwogIH0KICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgY2wgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdHJ1ZSk7CiAgLy8gV2UgZXh0cmFjdCB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjb250YWluZXIsIHNhdmUgdGhlbSBhbmQgZml4IHRoZW0KICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9ID0gQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogIGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfTsKICAvLyBXZSBzYXZlIHRoZSBjdXJyZW50IHBsb3Qgc2l6ZSBiZWZvcmUgd2UgcG9wIGFzIGl0IHdpbGwgZmlsbCB0aGUgc2NyZWVuCiAgY29uc3QgY3VycmVudF9wbG90X3NpemUgPSB7CiAgICB3aWR0aDogUExPVC5fZnVsbExheW91dC53aWR0aCwKICAgIGhlaWdodDogUExPVC5fZnVsbExheW91dC5oZWlnaHQsCiAgfTsKICAvLyBXZSBoYXZlIHRvIHNhdmUgdGhlIHBhZCBkYXRhIGJlZm9yZSBwb3BwaW5nIHNvIHdlIGNhbiByZXNpemUgcHJlY2lzZWx5CiAgY29uc3QgcGFkID0ge307CiAgcGFkLnVucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgdHJ1ZSk7CiAgcGFkLnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICAvLyBXZSBkbyB0b3AgYW5kIGxlZnQgYmFzZWQgb24gdGhlIGN1cnJlbnQgcmVjdAogIGZvciAoY29uc3Qga2V5IG9mIFsidG9wIiwgImxlZnQiXSkgewogICAgY29uc3Qgc3RhcnRfdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY29udGFpbmVyX3JlY3Rba2V5XTsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgZm9yIChjb25zdCBraW5kIG9mIFsicGFkZGluZyIsICJib3JkZXIiXSkgewogICAgICBvZmZzZXQgKz0gcGFkLnBvcHBlZFtraW5kXVtrZXldIC0gcGFkLnVucG9wcGVkW2tpbmRdW2tleV07CiAgICB9CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHN0YXJ0X3ZhbCAtIG9mZnNldCArICJweCI7CiAgICBpZiAoa2V5ID09PSAibGVmdCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIC8vIFdlIGNvbXB1dGUgdGhlIHdpZHRoIGFuZCBoZWlnaHQgZGVwZW5kaW5nIG9uIGV2ZW50dWFsIGNvbmZpZyBkYXRhCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoewogICAgd2lkdGg6CiAgICAgIHRhcmdldF9wbG90X3NpemUud2lkdGggPz8KICAgICAgY29uZmlnX3NwYW5zLndpZHRoLmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS5oZWlnaHQgPz8KICAgICAgY29uZmlnX3NwYW5zLmhlaWdodC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUuaGVpZ2h0LAogIH0pOwogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIGNvbnN0IHZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNzeltrZXldOwogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSB2YWwgKyAicHgiOwogICAgaWYgKGtleSA9PT0gIndpZHRoIikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCBmYWxzZSk7CiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgdW5wb3BfY29udGFpbmVyKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKfQoKQ09OVEFJTkVSLnBvcE91dCA9IHBvcG91dF9jb250YWluZXI7CgpmdW5jdGlvbiBEdWFsQ2xpY2soc2luZ2xlX2Z1bmMsIGRibF9mdW5jKSB7CiAgbGV0IG5jbGlja3MgPSAwOwogIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykgewogICAgbmNsaWNrcyArPSAxOwogICAgaWYgKG5jbGlja3MgPiAxKSB7CiAgICAgIGRibF9mdW5jKC4uLmFyZ3MpOwogICAgICBuY2xpY2tzID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIGRlbGF5KDMwMCkudGhlbigoKSA9PiB7CiAgICAgICAgaWYgKG5jbGlja3MgPT0gMSkgewogICAgICAgICAgc2luZ2xlX2Z1bmMoLi4uYXJncyk7CiAgICAgICAgfQogICAgICAgIG5jbGlja3MgPSAwOwogICAgICB9KTsKICAgIH0KICB9Owp9CgovLyBXZSByZW1vdmUgdGhlIGRlZmF1bHQgZG93bmxvYWQgaW1hZ2UgYnV0dG9uCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSwKICBbInRvSW1hZ2UiXQopOwovLyBXZSBhZGQgdGhlIGN1c3RvbSBidXR0b24gdG8gdGhlIG1vZGViYXIKcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkLAogIFsKICAgIHsKICAgICAgbmFtZTogIkNvcHkgUE5HIHRvIENsaXBib2FyZCIsCiAgICAgIGljb246IHsKICAgICAgICBoZWlnaHQ6IDUyMCwKICAgICAgICB3aWR0aDogNTIwLAogICAgICAgIHBhdGg6ICJNMjgwIDY0aDQwYzM1LjMgMCA2NCAyOC43IDY0IDY0VjQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEg2NGMtMzUuMyAwLTY0LTI4LjctNjQtNjRWMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0aDQwIDkuNkMxMjEgMjcuNSAxNTMuMyAwIDE5MiAwczcxIDI3LjUgNzguNCA2NEgyODB6TTY0IDExMmMtOC44IDAtMTYgNy4yLTE2IDE2VjQ0OGMwIDguOCA3LjIgMTYgMTYgMTZIMzIwYzguOCAwIDE2LTcuMiAxNi0xNlYxMjhjMC04LjgtNy4yLTE2LTE2LTE2SDMwNHYyNGMwIDEzLjMtMTAuNyAyNC0yNCAyNEgxOTIgMTA0Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNFYxMTJINjR6bTEyOC04YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHoiLAogICAgICB9LAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soY29weUltYWdlVG9DbGlwYm9hcmQsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKCk7CiAgICAgIH0pLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIkRvd25sb2FkIEltYWdlIiwKICAgICAgaWNvbjogUGxvdGx5Lkljb25zLmNhbWVyYSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKHNhdmVJbWFnZVRvRmlsZSwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoeyBjbDogImZpbGVzYXZlIiB9KTsKICAgICAgfSksCiAgICB9LAogIF0KKTsKCmZ1bmN0aW9uIGdldE9mZnNldERhdGEoZWwpIHsKICBsZXQgY3MgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgbnVsbCk7CiAgY29uc3Qgb2RhdGEgPSB7CiAgICBwYWRkaW5nOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgfSwKICAgIGJvcmRlcjogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgfQogIH07CiAgaWYgKGVsID09PSBQTE9UKSB7CiAgICAvLyBGb3IgdGhlIFBMT1Qgd2UgYWxzbyB3YW50IHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBvZmZzZXQKICAgIG9kYXRhLm9mZnNldCA9IHsKICAgICAgdG9wOiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldFRvcCA6IDAsCiAgICAgIGxlZnQ6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0TGVmdCA6IDAsCiAgICB9CiAgfQogIHJldHVybiBvZGF0YTsKfQpmdW5jdGlvbiBnZXRTaXplRGF0YSgpIHsKICBjb25zdCBkYXRhID0gewogICAgcGxvdF9wYWQ6IGdldE9mZnNldERhdGEoUExPVCksCiAgICBwbG90X3JlY3Q6IFBMT1QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgICBjb250YWluZXJfcGFkOiBnZXRPZmZzZXREYXRhKENPTlRBSU5FUiksCiAgICBjb250YWluZXJfcmVjdDogQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogIH07CiAgcmV0dXJuIGRhdGE7Cn0KZnVuY3Rpb24gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGNvbnN0IGNvbXB1dGVkX3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIGNvbnN0IG9mZnNldHMgPSBjb21wdXRlZF9zaXplLm9mZnNldHM7CgogIGNvbnN0IHBsb3RfZGF0YSA9IHsKICAgIHdpZHRoOiB3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiBoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfTsKCiAgcmV0dXJuIHsKICAgIHdpZHRoOiAod2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCkgKyBvZmZzZXRzLndpZHRoLAogICAgaGVpZ2h0OiAoaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0KSArIG9mZnNldHMuaGVpZ2h0LAogICAgbm9DaGFuZ2U6IHdpZHRoID09IGNvbXB1dGVkX3NpemUud2lkdGggJiYgaGVpZ2h0ID09IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH0KfQoKLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGNoYW5nZSB0aGUgY29udGFpbmVyIHNpemUgc28gdGhhdCB0aGUgcmVzdWx0aW5nIHBsb3Qgd2lsbCBiZSBtYXRjaGluZyB0aGUgcHJvdmlkZWQgc3BlY3MKZnVuY3Rpb24gY2hhbmdlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgaWYgKCFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgY29uc29sZS5sb2coIlRyaWVkIHRvIGNoYW5nZSBjb250YWluZXIgc2l6ZSB3aGVuIG5vdCBwb3BwZWQsIGlnbm9yaW5nIik7CiAgICByZXR1cm47CiAgfQoKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEpOwoKICBpZiAoY3N6Lm5vQ2hhbmdlKSB7CiAgICBjb25zb2xlLmxvZygiU2l6ZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50LCBpZ25vcmluZyIpOwogICAgcmV0dXJuCiAgfQogIC8vIFdlIGFyZSBub3cgZ29pbmcgdG8gc2V0IGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGNvbnRhaW5lcgogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gY3N6W2tleV0gKyAicHgiOwogIH0KfQovLyBXZSBub3cgY3JlYXRlIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgdXBkYXRlIHRoZSBwbG90IGJhc2VkIG9uIHRoZSB2YWx1ZXMgc3BlY2lmaWVkCmZ1bmN0aW9uIHVwZGF0ZUZyb21IZWFkZXIoKSB7CiAgY29uc3QgaGVhZGVyX2RhdGEgPSB7CiAgICBoZWlnaHQ6IGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUsCiAgICB3aWR0aDogY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlLAogIH07CiAgY2hhbmdlQ29udGFpbmVyU2l6ZShoZWFkZXJfZGF0YSk7Cn0KLy8gV2UgYXNzaWduIHRoaXMgZnVuY3Rpb24gdG8gdGhlIG9uYmx1ciBldmVudCBvZiB3aWR0aCBhbmQgaGVpZ2h0CmlmIChmaXJzdFJ1bikgewogIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLnVpX3NwYW4ub25ibHVyID0gKGUpID0+IHsKICAgICAgY29udGFpbmVyLnVpX3ZhbHVlID0gY29udGFpbmVyLnVpX3NwYW4udGV4dENvbnRlbnQ7CiAgICAgIHVwZGF0ZUZyb21IZWFkZXIoKTsKICAgIH07CiAgfQp9Ci8vIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIHBsb3Qgc2l6ZSB0byB1c2UgZm9yIHJlbGF5b3V0IGFzIGEgZnVuY3Rpb24gb2YgdGhlIGNvbnRhaW5lciBzaXplCmZ1bmN0aW9uIGNvbXB1dGVQbG90U2l6ZShkYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIC8vIFJlbW92ZSBQYWRkaW5nCiAgY29uc3QgeyBjb250YWluZXJfcGFkLCBwbG90X3BhZCwgY29udGFpbmVyX3JlY3QgfSA9IGRhdGE7CiAgY29uc3Qgb2Zmc2V0cyA9IHsKICAgIHdpZHRoOgogICAgICBwbG90X3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLndpZHRoICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LmxlZnQgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci53aWR0aCwKICAgIGhlaWdodDoKICAgICAgcGxvdF9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBwbG90X3BhZC5ib3JkZXIuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LnRvcCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci5oZWlnaHQsCiAgfTsKICBjb25zdCBzeiA9IHsKICAgIHdpZHRoOiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LndpZHRoIC0gb2Zmc2V0cy53aWR0aCksCiAgICBoZWlnaHQ6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3QuaGVpZ2h0IC0gb2Zmc2V0cy5oZWlnaHQpLAogICAgb2Zmc2V0cywKICB9OwogIHJldHVybiBzejsKfQoKLy8gQ3JlYXRlIHRoZSByZXNpemVPYnNlcnZlciB0byBtYWtlIHRoZSBwbG90IGV2ZW4gbW9yZSByZXNwb25zaXZlISA6bWFnaWM6CmNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7CiAgY29uc3Qgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpOwogIGNvbnN0IHtjb250YWluZXJfcmVjdCwgY29udGFpbmVyX3BhZH0gPSBzaXplRGF0YTsKICBsZXQgcGxvdF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICAvLyBXZSBzYXZlIHRoZSBoZWlnaHQgaW4gdGhlIFBMT1Qgb2JqZWN0CiAgUExPVC5jb250YWluZXJfaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0OwogIC8vIFdlIGRlYWwgd2l0aCBzb21lIHN0dWZmIGlmIHRoZSBjb250YWluZXIgaXMgcG9wcHBlZAogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSBjb250YWluZXJfcmVjdC53aWR0aCArICJweCI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gY29udGFpbmVyX3JlY3QubGVmdCArICJweCI7CiAgY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS5oZWlnaHQ7CiAgY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlID0gcGxvdF9zaXplLndpZHRoOwogIC8qIAoJCVRoZSBhZGRpdGlvbiBvZiB0aGUgaW52YWxpZCBhcmd1bWVudCBgcGx1dG9yZXNpemVgIHNlZW1zIHRvIGZpeCB0aGUgcHJvYmxlbSB3aXRoIGNhbGxpbmcgYHJlbGF5b3V0YCBzaW1wbHkgd2l0aCBge2F1dG9zaXplOiB0cnVlfWAgYXMgdXBkYXRlIGJyZWFraW5nIG1vdXNlIHJlbGF5b3V0IGV2ZW50cyB0cmFja2luZy4gCgkJU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wbG90bHkvcGxvdGx5LmpzL2lzc3Vlcy82MTU2IGZvciBkZXRhaWxzCgkJKi8KICBsZXQgY29uZmlnID0gewogICAgLy8gSWYgdGhpcyBpcyBwb3BwZWQgb3V0LCB3ZSBpZ25vcmUgdGhlIG9yaWdpbmFsIHdpZHRoL2hlaWdodAogICAgd2lkdGg6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX3dpZHRoKSA/PyBwbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX2hlaWdodCkgPz8gcGxvdF9zaXplLmhlaWdodCwKICAgIHBsdXRvcmVzaXplOiB0cnVlLAogIH07CiAgUGxvdGx5LnJlbGF5b3V0KFBMT1QsIGNvbmZpZykudGhlbigoKSA9PiB7CiAgICBpZiAocmVtb3ZlX2NvbnRhaW5lcl9zaXplICYmICFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBhdm9pZCB0aGUgZmlyc3QgcmVzaXplIHVwb24gcGxvdCBjcmVhdGlvbiB0byBhbHJlYWR5IGJlIHdpdGhvdXQgYSBmaXhlZCBoZWlnaHQKICAgICAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9ICIiOwogICAgICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICAgICAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmFsc2U7CiAgICB9CiAgfSk7Cn0pOwoKcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShDT05UQUlORVIpOwoKClBsb3RseS5yZWFjdChQTE9ULCBwbG90X29iaikudGhlbigoKSA9PiB7CgkvLyBBc3NpZ24gdGhlIFBsb3RseSBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhwbG90bHlfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1Qub24oa2V5LCBsaXN0ZW5lcikKCQl9Cgl9CgkvLyBBc3NpZ24gdGhlIEpTIGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKGpzX2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULmFkZEV2ZW50TGlzdGVuZXIoa2V5LCBsaXN0ZW5lciwgewoJCQkJc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbAoJCQl9KQoJCX0KCX0KfQopCgoKaW52YWxpZGF0aW9uLnRoZW4oKCkgPT4gewoJLy8gUmVtb3ZlIGFsbCBwbG90bHkgbGlzdGVuZXJzCglQTE9ULnJlbW92ZUFsbExpc3RlbmVycygpCgkvLyBSZW1vdmUgYWxsIEpTIGxpc3RlbmVycwoJY29udHJvbGxlci5hYm9ydCgpCgkvLyBSZW1vdmUgdGhlIHJlc2l6ZU9ic2VydmVyCglyZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCkKfSkKCgoKCQlyZXR1cm4gQ09OVEFJTkVSCgk8L3NjcmlwdD4KpG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv6MLTKMSsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQwOTc1NTQ3ZC02N2Q5LTRlNmItODhmZi1hOWRkMDZhN2Y5ZWa5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc8AAAABkf0gb7VwdWJsaXNoZWRfb2JqZWN0X2tleXOR2TViM2I4NDA4Yy04MTgxLTExZWYtMTRlYi1lMWM1NjliOGJiMjkvOTExN2Q0MGQ1NDY5ZTMwZrhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQxMjMxYjgzMi00N2IxLTRjY2ItOWI1Ni1hNjc4Mzg1OThjYzeKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52mqJCTxzY3JpcHQgaWQ9J3Bsb3RfMSc+CgkJLy8gV2Ugc3RhcnQgYnkgcHV0dGluZyBhbGwgdGhlIHZhcmlhYmxlIGludGVycG9sYXRpb24gaGVyZSBhdCB0aGUgYmVnaW5uaW5nCgkJLy8gV2UgaGF2ZSB0byBjb252ZXJ0IGFsbCB0eXBlZGFycmF5cyBpbiB0aGUgbGF5b3V0IHRvIG5vcm1hbCBhcnJheXMuIFNlZSBJc3N1ZSAjMjUKCQkvLyBXZSB1c2UgbG9kYXNoIGZvciB0aGlzIGZvciBjb21wYWN0bmVzcwoJCWZ1bmN0aW9uIHJlbW92ZVR5cGVkQXJyYXkobykgewoJCQlyZXR1cm4gXy5pc1R5cGVkQXJyYXkobykgPyBBcnJheS5mcm9tKG8pIDoKCQkJXy5pc1BsYWluT2JqZWN0KG8pID8gXy5tYXBWYWx1ZXMobywgcmVtb3ZlVHlwZWRBcnJheSkgOiAKCQkJbwoJCX0KCgkJLy8gUHVibGlzaCB0aGUgcGxvdCBvYmplY3QgdG8gSlMKCQlsZXQgcGxvdF9vYmogPSBfLnVwZGF0ZSgvKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIEFic3RyYWN0UGx1dG9EaW5nZXRqZXMuRGlzcGxheS5wdWJsaXNoZWRfdG9fanMgKi8gZ2V0UHVibGlzaGVkT2JqZWN0KCJiM2I4NDA4Yy04MTgxLTExZWYtMTRlYi1lMWM1NjliOGJiMjkvNzRjMzZhNDI1MjNhMTY5ZiIpLCAibGF5b3V0IiwgcmVtb3ZlVHlwZWRBcnJheSkKCQkvLyBHZXQgdGhlIHBsb3RseSBsaXN0ZW5lcnMKCQljb25zdCBwbG90bHlfbGlzdGVuZXJzID0ge30KCQkvLyBHZXQgdGhlIEpTIGxpc3RlbmVycwoJCWNvbnN0IGpzX2xpc3RlbmVycyA9IHt9CgkJLy8gRGVhbCB3aXRoIGV2ZW50dWFsIGN1c3RvbSBjbGFzc2VzCgkJbGV0IGN1c3RvbV9jbGFzc2xpc3QgPSBbXQoKCgkJLy8gTG9hZCB0aGUgcGxvdGx5IGxpYnJhcnkKCQlsZXQgUGxvdGx5ID0gdW5kZWZpbmVkCgkJdHJ5IHsKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoIi4vcGxvdGx5anMvcGxvdGx5anMtMi4yNi4yLm1pbi5qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0gY2F0Y2ggKGUpIHsKCQkJY29uc29sZS5sb2coIkxvY2FsIGxvYWQgZmFpbGVkLCB0cnlpbmcgd2l0aCB0aGUgd2ViIGVzbS5zaCB2ZXJzaW9uIikKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoImh0dHBzOi8vZXNtLnNoL3YxMzUvcGxvdGx5LmpzLWRpc3QtbWluQDIuMjYuMi9lc25leHQvcGxvdGx5LmpzLWRpc3QtbWluLm1qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0KCgkJLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0byBmb3JjZSBsb2NhbCBtYXRoamF4IGZvbnQgY2FjaGUKCQlpZiAoZmFsc2UgJiYgd2luZG93Py5NYXRoSmF4Py5jb25maWc/LnN2Zz8uZm9udENhY2hlID09PSAnZ2xvYmFsJykgewoJCQl3aW5kb3cuTWF0aEpheC5jb25maWcuc3ZnLmZvbnRDYWNoZSA9ICdsb2NhbCcKCQl9CgoJCS8vIEZsYWcgdG8gY2hlY2sgaWYgdGhpcyBjZWxsIHdhcyAgbWFudWFsbHkgcmFuIG9yIHJlYWN0aXZlbHkgcmFuCmNvbnN0IGZpcnN0UnVuID0gdGhpcyA/IGZhbHNlIDogdHJ1ZQpjb25zdCBDT05UQUlORVIgPSB0aGlzID8/IGh0bWxgPGRpdiBjbGFzcz0ncGx1dG9wbG90bHktY29udGFpbmVyJz5gCmNvbnN0IFBMT1QgPSBDT05UQUlORVIucXVlcnlTZWxlY3RvcignLmpzLXBsb3RseS1wbG90JykgPz8gQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgPGRpdj5gKQpjb25zdCBwYXJlbnQgPSBDT05UQUlORVIucGFyZW50RWxlbWVudAovLyBXZSB1c2UgYSBjb250cm9sbGVyIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lcnMgdXBvbiBpbnZhbGlkYXRpb24KY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKQovLyBXZSBoYXZlIHRvIGFkZCB0aGlzIHRvIGtlZXAgc3VwcG9ydGluZyBAYmluZCB3aXRoIHRoZSBvbGQgQVBJIHVzaW5nIFBMT1QKUExPVC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChlKSA9PiB7CglDT05UQUlORVIudmFsdWUgPSBQTE9ULnZhbHVlCglpZiAoZS5idWJibGVzKSB7CgkJcmV0dXJuCgl9CglDT05UQUlORVIuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2lucHV0JykpCn0sIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KQoKCS8vIFRoaXMgY3JlYXRlIHRoZSBzdHlsZSBzdWJkaXYgb24gZmlyc3QgcnVuCglmaXJzdFJ1biAmJiBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGAKCTxzdHlsZT4KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgewoJCXdpZHRoOiAxMDAlOwoJCWhlaWdodDogMTAwJTsKCQltaW4taGVpZ2h0OiAwOwoJCW1pbi13aWR0aDogMDsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgLmpzLXBsb3RseS1wbG90IC5wbG90bHkgZGl2IHsKCQltYXJnaW46IDAgYXV0bzsgLy8gVGhpcyBjZW50ZXJzIHRoZSBwbG90Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLnBvcHBlZC1vdXQgewoJCW92ZXJmbG93OiBhdXRvOwoJCXotaW5kZXg6IDEwMDA7CgkJcG9zaXRpb246IGZpeGVkOwoJCXJlc2l6ZTogYm90aDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDBweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMHB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgewoJCWRpc3BsYXk6IGZsZXg7CgkJZmxleC1mbG93OiByb3cgd3JhcDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAxMnB4OwoJCXBvc2l0aW9uOiBmaXhlZDsKCQl6LWluZGV4OiAxMDAxOwoJCWN1cnNvcjogbW92ZTsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIC0xMDAlKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBzcGFuIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJZmxleDogMQoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIuaGlkZGVuIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuIHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlIHsKCQlwYWRkaW5nLXJpZ2h0OiA1cHg7CgkJcGFkZGluZy1sZWZ0OiAycHg7CgkJY3Vyc29yOiB0ZXh0OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZmxleDogMCAwIDEwMCU7CgkJdGV4dC1hbGlnbjogY2VudGVyOwoJCWJvcmRlci10b3A6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQltYXJnaW4tdG9wOiA1cHg7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZpbGVuYW1lIHsKCQltYXJnaW4tbGVmdDogM3B4OwoJCXRleHQtYWxpZ246IGxlZnQ7CgkJbWluLXdpZHRoOiBtaW4oNjAlLCBtaW4tY29udGVudCk7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCAubGFiZWwgewoJCWZsZXg6IDAgMCAwOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5mb3JtYXQgewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCQlmbGV4OiAxIDAgYXV0bzsKCQltaW4td2lkdGg6IDMwcHg7CgkJbWFyZ2luLXJpZ2h0OiAxMHB4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCQlmbGV4LWZsb3c6IGNvbHVtbjsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlwYWRkaW5nLWxlZnQ6IDNweDsKCQl6LWluZGV4OiAyMDAwOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIHsKCQljdXJzb3I6IHBvaW50ZXI7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJcGFkZGluZzogM3B4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKC0zcHgsIC02cHgpOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpub3QoLnNlbGVjdGVkKSB7CgkJbWFyZ2luLXRvcDogM3B4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uLnNlbGVjdGVkIHsKCQlvcmRlcjogLTE7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246aG92ZXIgewoJCWJhY2tncm91bmQtY29sb3I6IHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJfQoJc3Bhbi5jb25maWctdmFsdWUgewoJCWZvbnQtd2VpZ2h0OiBub3JtYWw7CgkJY29sb3I6IHZhcigtLXBsdXRvLW91dHB1dC1jb2xvcik7CgkJZGlzcGxheTogbm9uZTsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIGNhbGMoLTEwMCUgLSAxMHB4KSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLmxhYmVsIHsKCQl1c2VyLXNlbGVjdDogbm9uZTsKCX0KCS5sYWJlbDpob3ZlciBzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCW1pbi13aWR0aDogMTUwcHg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4ubWF0Y2hpbmctY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLW1hY3JvLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5kaWZmZXJlbnQtY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLXRhZy1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9Cjwvc3R5bGU+CmApCgpsZXQgb3JpZ2luYWxfaGVpZ2h0ID0gcGxvdF9vYmoubGF5b3V0LmhlaWdodApsZXQgb3JpZ2luYWxfd2lkdGggPSBwbG90X29iai5sYXlvdXQud2lkdGgKLy8gRm9yIHRoZSBoZWlnaHQgd2UgaGF2ZSB0byBhbHNvIHB1dCBhIGZpeGVkIHZhbHVlIGluIGNhc2UgdGhlIHBsb3QgaXMgcHV0IG9uIGEgbm9uLWZpeGVkLXNpemUgY29udGFpbmVyIChsaWtlIHRoZSBkZWZhdWx0IHdyYXBwZXIpCi8vIFdlIGRlZmluZSBhIHZhcmlhYmxlIHRvIGNoZWNrIHdoZXRoZXIgd2Ugc3RpbGwgaGF2ZSB0byByZW1vdmUgdGhlIGZpeGVkIGhlaWdodApsZXQgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmlyc3RSdW4KbGV0IGNvbnRhaW5lcl9oZWlnaHQgPSBvcmlnaW5hbF9oZWlnaHQgPz8gUExPVC5jb250YWluZXJfaGVpZ2h0ID8/IDQwMApDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX2hlaWdodCArICdweCcKCi8vIFdlIGNyZWF0ZSBhIFByb21pc2UgdmVyc2lvbiBvZiBzZXRUaW1lb3V0CmZ1bmN0aW9uIGRlbGF5KG1zKSB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7Cn0KCi8vIFdlIGltcG9ydCBpbnRlcmFjdCBmb3IgZHJhZ2dpbmcvcmVzaXppbmcKY29uc3QgeyBkZWZhdWx0OiBpbnRlcmFjdCB9ID0gYXdhaXQgaW1wb3J0KCdodHRwczovL2VzbS5zaC9pbnRlcmFjdGpzQDEuMTAuMTknKQoKCmZ1bmN0aW9uIGdldEltYWdlT3B0aW9ucygpIHsKICBjb25zdCBvID0gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogIHJldHVybiB7CiAgICBmb3JtYXQ6IG8uZm9ybWF0ID8/ICJwbmciLAogICAgd2lkdGg6IG8ud2lkdGggPz8gb3JpZ2luYWxfd2lkdGgsCiAgICBoZWlnaHQ6IG8uaGVpZ2h0ID8/IG9yaWdpbmFsX2hlaWdodCwKICAgIHNjYWxlOiBvLnNjYWxlID8/IDEsCiAgICBmaWxlbmFtZTogby5maWxlbmFtZSA/PyAibmV3cGxvdCIsCiAgfTsKfQoKY29uc3QgQ0xJUEJPQVJEX0hFQURFUiA9CiAgQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoIi5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIikgPz8KICBDT05UQUlORVIuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgImFmdGVyYmVnaW4iLAogICAgaHRtbGA8ZGl2IGNsYXNzPSJwbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIGhpZGRlbiI+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmb3JtYXQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+Rm9ybWF0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZvcm1hdCI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB3aWR0aCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5XaWR0aDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSB3aWR0aCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGhlaWdodCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5IZWlnaHQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgaGVpZ2h0Ij48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2NhbGUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+U2NhbGU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgc2NhbGUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzZXQiPlNldDwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB1bnNldCI+VW5zZXQ8L2J1dHRvbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZpbGVuYW1lIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZpbGVuYW1lOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZpbGVuYW1lIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgIDwvZGl2PmAKICApOwoKZnVuY3Rpb24gY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcikgewogIGNvbnN0IHZhbGlkX2NsYXNzZXMgPSBbCiAgICAibWlzc2luZy1jb25maWciLAogICAgIm1hdGNoaW5nLWNvbmZpZyIsCiAgICAiZGlmZmVyZW50LWNvbmZpZyIsCiAgXTsKICBmdW5jdGlvbiBzZXRDbGFzcyhjbCkgewogICAgZm9yIChjb25zdCBuYW1lIG9mIHZhbGlkX2NsYXNzZXMpIHsKICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUobmFtZSwgbmFtZSA9PSBjbCk7CiAgICB9CiAgfQogIC8vIFdlIHVzZSB0aGUgY3VzdG9tIGdldHRlcnMgd2UnbGwgc2V0IHVwIGluIHRoZSBjb250YWluZXIKICBjb25zdCB7IHVpX3ZhbHVlLCBjb25maWdfdmFsdWUsIGNvbmZpZ19zcGFuLCBrZXkgfSA9IGNvbnRhaW5lcjsKICBpZiAoY29uZmlnX3ZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgIHNldENsYXNzKCJtaXNzaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBpcyBub3QgcHJlc2VudCBpbiB0aGUgY29uZmlnLmA7CiAgfSBlbHNlIGlmICh1aV92YWx1ZSA9PSBjb25maWdfdmFsdWUpIHsKICAgIHNldENsYXNzKCJtYXRjaGluZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIHRoZSBzYW1lIHZhbHVlIGluIHRoZSBjb25maWcgYW5kIGluIHRoZSBoZWFkZXIuYDsKICB9IGVsc2UgewogICAgc2V0Q2xhc3MoImRpZmZlcmVudC1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIGEgZGlmZmVyZW50IHZhbHVlICg8ZW0+JHtjb25maWdfdmFsdWV9PC9lbT4pIGluIHRoZSBjb25maWcuYDsKICB9CiAgLy8gQWRkIGluZm8gYWJvdXQgc2V0dGluZyBhbmQgdW5zZXR0aW5nCiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIG9uIHRoZSBsYWJlbCA8ZW0+PGI+b25jZTwvYj48L2VtPiB0byBzZXQgdGhlIGN1cnJlbnQgVUkgdmFsdWUgaW4gdGhlIGNvbmZpZy5gCiAgKTsKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgPGVtPjxiPnR3aWNlPC9iPjwvZW0+IHRvIHJlbW92ZSB0aGlzIGtleSBmcm9tIHRoZSBjb25maWcuYAogICk7Cn0KCmNvbnN0IHZhbGlkX2Zvcm1hdHMgPSBbInBuZyIsICJzdmciLCAid2VicCIsICJqcGVnIiwgImZ1bGwtanNvbiJdOwpmdW5jdGlvbiBpbml0aWFsaXplVUlWYWx1ZVNwYW4oc3Bhbiwga2V5LCB2YWx1ZSkgewogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSBrZXkgPT09ICJmb3JtYXQiID8gImZhbHNlIiA6ICJ0cnVlIjsKICBsZXQgcGFyc2UgPSAoeCkgPT4geDsKICBsZXQgdXBkYXRlID0gKHgpID0+IChzcGFuLnRleHRDb250ZW50ID0geCk7CiAgaWYgKGtleSA9PT0gIndpZHRoIiB8fCBrZXkgPT09ICJoZWlnaHQiKSB7CiAgICBwYXJzZSA9ICh4KSA9PiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoeCkpOwogIH0gZWxzZSBpZiAoa2V5ID09PSAic2NhbGUiKSB7CiAgICBwYXJzZSA9IHBhcnNlRmxvYXQ7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAvLyBXZSByZW1vdmUgY29udGVudEVkaXRhYmxlCiAgICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9ICJmYWxzZSI7CiAgICAvLyBIZXJlIHdlIGZpcnN0IGFkZCB0aGUgc3Vic3BhbnMgZm9yIGVhY2ggb3B0aW9uCiAgICBjb25zdCBvcHRzX2RpdiA9IHNwYW4uYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2IGNsYXNzPSJmb3JtYXQtb3B0aW9ucyI+PC9kaXY+YCk7CiAgICBmb3IgKGNvbnN0IGZtdCBvZiB2YWxpZF9mb3JtYXRzKSB7CiAgICAgIGNvbnN0IG9wdCA9IG9wdHNfZGl2LmFwcGVuZENoaWxkKAogICAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImZvcm1hdC1vcHRpb24gJHtmbXR9Ij4ke2ZtdH08L3NwYW4+YAogICAgICApOwogICAgICBvcHQub25jbGljayA9IChlKSA9PiB7CiAgICAgICAgc3Bhbi52YWx1ZSA9IG9wdC50ZXh0Q29udGVudDsKICAgICAgfTsKICAgIH0KICAgIHBhcnNlID0gKHgpID0+IHsKICAgICAgcmV0dXJuIHZhbGlkX2Zvcm1hdHMuaW5jbHVkZXMoeCkgPyB4IDogbG9jYWxWYWx1ZTsKICAgIH07CiAgICB1cGRhdGUgPSAoeCkgPT4gewogICAgICBmb3IgKGNvbnN0IG9wdCBvZiBvcHRzX2Rpdi5jaGlsZHJlbikgewogICAgICAgIG9wdC5jbGFzc0xpc3QudG9nZ2xlKCJzZWxlY3RlZCIsIG9wdC50ZXh0Q29udGVudCA9PT0geCk7CiAgICAgIH0KICAgIH07CiAgfSBlbHNlIHsKICAgIC8vIFdlIG9ubHkgaGF2ZSBmaWxlbmFtZSBoZXJlCiAgfQogIGxldCBsb2NhbFZhbHVlOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIGxvY2FsVmFsdWU7CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIGlmICh2YWwgIT09ICIiKSB7CiAgICAgICAgbG9jYWxWYWx1ZSA9IHBhcnNlKHZhbCk7CiAgICAgIH0KICAgICAgdXBkYXRlKGxvY2FsVmFsdWUpOwogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7CiAgLy8gV2UgYWxzbyBhc3NpZ24gYSBsaXN0ZW5lciBzbyB0aGF0IHRoZSBlZGl0YWJsZSBpcyBibHVycmVkIHdoZW4gZW50ZXIgaXMgcHJlc3NlZAogIHNwYW4ub25rZXlkb3duID0gKGUpID0+IHsKICAgIGlmIChlLmtleUNvZGUgPT09IDEzKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgc3Bhbi5ibHVyKCk7CiAgICB9CiAgfTsKICBzcGFuLnZhbHVlID0gdmFsdWU7Cn0KCmZ1bmN0aW9uIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oc3Bhbiwga2V5KSB7CiAgLy8gSGVyZSB3ZSBtb3N0bHkgd2FudCB0byBkZWZpbmUgdGhlIHNldHRlciBhbmQgZ2V0dGVyCiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgLy8gaWYgdW5kZWZpbmVkIGlzIHBhc3NlZCwgd2UgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBvcHRpb25zCiAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGRlbGV0ZSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XSA9IHZhbDsKICAgICAgfQogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7Cn0KCmNvbnN0IGNvbmZpZ19zcGFucyA9IHt9Owpmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhnZXRJbWFnZU9wdGlvbnMoKSkpIHsKICBjb25zdCBjb250YWluZXIgPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoYC5jbGlwYm9hcmQtc3Bhbi4ke2tleX1gKTsKICBjb25zdCBsYWJlbCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIubGFiZWwiKTsKICAvLyBXZSBnaXZlIHRoZSBsYWJlbCBhIGZ1bmN0aW9uIHRoYXQgb24gc2luZ2xlIGNsaWNrIHdpbGwgc2V0IHRoZSBjdXJyZW50IHZhbHVlIGFuZCB3aXRoIGRvdWJsZSBjbGljayB3aWxsIHVuc2V0IGl0CiAgbGFiZWwub25jbGljayA9IER1YWxDbGljaygKICAgICgpID0+IHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0sCiAgICAoZSkgPT4gewogICAgICBjb25zb2xlLmxvZygiZSIsIGUpOwogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSB1bmRlZmluZWQ7CiAgICB9CiAgKTsKICBjb25zdCB1aV92YWx1ZV9zcGFuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtdmFsdWUiKTsKICBjb25zdCBjb25maWdfdmFsdWVfc3BhbiA9CiAgICBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNvbmZpZy12YWx1ZSIpID8/CiAgICBsYWJlbC5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAgICJhZnRlcmJlZ2luIiwKICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iY29uZmlnLXZhbHVlIj48L3NwYW4+YAogICAgKTsKICAvLyBBc3NpbmcgdGhlIHR3byBzcGFucyBhcyBwcm9wZXJ0aWVzIG9mIHRoZSBjb250YWluaW5nIHNwYW4KICBjb250YWluZXIudWlfc3BhbiA9IHVpX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmNvbmZpZ19zcGFuID0gY29uZmlnX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmtleSA9IGtleTsKICBjb25maWdfc3BhbnNba2V5XSA9IGNvbnRhaW5lcjsKICBpZiAoZmlyc3RSdW4pIHsKICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA9CiAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICAgIC8vIFdlIGRvIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdmFsdWUgc3BhbgogICAgaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHVpX3ZhbHVlX3NwYW4sIGtleSwgdmFsdWUpOwogICAgLy8gVGhlbiB3ZSBpbml0aWFsaXplIHRoZSBjb25maWcgdmFsdWUKICAgIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oY29uZmlnX3ZhbHVlX3NwYW4sIGtleSk7CiAgICAvLyBXZSBwdXQgc29tZSBjb252ZW5pZW5jZSBnZXR0ZXJzL3NldHRlcnMKICAgIC8vIHVpX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJ1aV92YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiB1aV92YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICB1aV92YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgICAvLyBjb25maWdfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgImNvbmZpZ192YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICB9Cn0KCi8vIFRoZXNlIG9iamVjdHMgd2lsbCBjb250YWluIHRoZSBkZWZhdWx0IHZhbHVlCgovLyBUaGlzIGNvZGUgdXBkYXRlcyB0aGUgaW1hZ2Ugb3B0aW9ucyBpbiB0aGUgUExPVCBjb25maWcgd2l0aCB0aGUgcHJvdmlkZWQgb25lcwpmdW5jdGlvbiBzZXRJbWFnZU9wdGlvbnMobykgewogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gb1trZXldOwogIH0KfQpmdW5jdGlvbiB1bnNldEltYWdlT3B0aW9ucygpIHsKICBzZXRJbWFnZU9wdGlvbnMoe30pOwp9Cgpjb25zdCBzZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4uc2V0Iik7CmNvbnN0IHVuc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnVuc2V0Iik7CmlmIChmaXJzdFJ1bikgewogIHNldF9idXR0b24ub25jbGljayA9IChlKSA9PiB7CiAgICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0KICB9OwogIHVuc2V0X2J1dHRvbi5vbmNsaWNrID0gdW5zZXRJbWFnZU9wdGlvbnM7Cn0KCi8vIFdlIGFkZCBhIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBjbGlwYm9hcmQgaXMgcG9wcGVkIG91dApDT05UQUlORVIuaXNQb3BwZWRPdXQgPSAoKSA9PiB7CiAgcmV0dXJuIENPTlRBSU5FUi5jbGFzc0xpc3QuY29udGFpbnMoInBvcHBlZC1vdXQiKTsKfTsKCkNMSVBCT0FSRF9IRUFERVIub25tb3VzZWRvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHsKICBpZiAoZXZlbnQudGFyZ2V0Lm1hdGNoZXMoInNwYW4uY2xpcGJvYXJkLXZhbHVlIikpIHsKICAgIGNvbnNvbGUubG9nKCJXZSBkb24ndCBtb3ZlISIpOwogICAgcmV0dXJuOwogIH0KICBjb25zdCBzdGFydCA9IHsKICAgIGxlZnQ6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLmxlZnQpLAogICAgdG9wOiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS50b3ApLAogICAgWDogZXZlbnQucGFnZVgsCiAgICBZOiBldmVudC5wYWdlWSwKICB9OwogIGZ1bmN0aW9uIG1vdmVBdChldmVudCwgc3RhcnQpIHsKICAgIGNvbnN0IHRvcCA9IGV2ZW50LnBhZ2VZIC0gc3RhcnQuWSArIHN0YXJ0LnRvcCArICJweCI7CiAgICBjb25zdCBsZWZ0ID0gZXZlbnQucGFnZVggLSBzdGFydC5YICsgc3RhcnQubGVmdCArICJweCI7CiAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9IHRvcDsKICB9CgogIC8vIG1vdmUgb3VyIGFic29sdXRlbHkgcG9zaXRpb25lZCBiYWxsIHVuZGVyIHRoZSBwb2ludGVyCiAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQpIHsKICAgIG1vdmVBdChldmVudCwgc3RhcnQpOwogIH0KCiAgLy8gV2UgdXNlIHRoaXMgdG8gcmVtb3ZlIHRoZSBtb3VzZW1vdmUgd2hlbiBjbGlja2luZyBvdXRzaWRlIG9mIHRoZSBjb250YWluZXIKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICAvLyBtb3ZlIHRoZSBjb250YWluZXIgb24gbW91c2Vtb3ZlCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgb25Nb3VzZU1vdmUsIHsKICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsCiAgfSk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgY2xlYW5VcCgpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7CgogIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICBjb25zb2xlLmxvZygiY2xlYW5pbmcgdXAgdGhlIHBsb3QgbW92ZSBsaXN0ZW5lciIpOwogICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBudWxsOwogIH0KCiAgLy8gKDMpIGRyb3AgdGhlIGJhbGwsIHJlbW92ZSB1bm5lZWRlZCBoYW5kbGVycwogIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gY2xlYW5VcDsKfTsKCmZ1bmN0aW9uIHNlbmRUb0NsaXBib2FyZChibG9iKSB7CiAgaWYgKCFuYXZpZ2F0b3IuY2xpcGJvYXJkKSB7CiAgICBhbGVydCgKICAgICAgIlRoZSBDbGlwYm9hcmQgQVBJIGRvZXMgbm90IHNlZW0gdG8gYmUgYXZhaWxhYmxlLCBtYWtlIHN1cmUgdGhlIFBsdXRvIG5vdGVib29rIGlzIGJlaW5nIHVzZWQgZnJvbSBlaXRoZXIgbG9jYWxob3N0IG9yIGFuIGh0dHBzIHNvdXJjZS4iCiAgICApOwogIH0KICBuYXZpZ2F0b3IuY2xpcGJvYXJkCiAgICAud3JpdGUoWwogICAgICBuZXcgQ2xpcGJvYXJkSXRlbSh7CiAgICAgICAgLy8gVGhlIGtleSBpcyBkZXRlcm1pbmVkIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBibG9iJ3MgdHlwZS4KICAgICAgICBbYmxvYi50eXBlXTogYmxvYiwKICAgICAgfSksCiAgICBdKQogICAgLnRoZW4oCiAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICBjb25zb2xlLmxvZygiQXN5bmM6IENvcHlpbmcgdG8gY2xpcGJvYXJkIHdhcyBzdWNjZXNzZnVsISIpOwogICAgICB9LAogICAgICBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiQXN5bmM6IENvdWxkIG5vdCBjb3B5IHRleHQ6ICIsIGVycik7CiAgICAgIH0KICAgICk7Cn0KCmZ1bmN0aW9uIGNvcHlJbWFnZVRvQ2xpcGJvYXJkKCkgewogIC8vIFdlIGV4dHJhY3QgdGhlIGltYWdlIG9wdGlvbnMgZnJvbSB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycyAoaWYgdGhleSBleGlzdCkKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LiBXZSBhbHNvIGlnbm9yZSBmb3JtYXQgYmVjYXVzZSB0aGUgY2xpcGJvYXJkIG9ubHkgc3VwcG9ydHMgcG5nLgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gImZvcm1hdCIpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LnRvSW1hZ2UoUExPVCwgY29uZmlnKS50aGVuKGZ1bmN0aW9uIChkYXRhVXJsKSB7CiAgICBmZXRjaChkYXRhVXJsKQogICAgICAudGhlbigocmVzKSA9PiByZXMuYmxvYigpKQogICAgICAudGhlbigoYmxvYikgPT4gewogICAgICAgIGNvbnN0IHBhc3RlX3JlY2VpdmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigncGFzdGUtcmVjZWl2ZXIucGx1dG9wbG90bHknKQogICAgICAgIGlmIChwYXN0ZV9yZWNlaXZlcikgewogICAgICAgICAgcGFzdGVfcmVjZWl2ZXIuYXR0YWNoSW1hZ2UoZGF0YVVybCwgQ09OVEFJTkVSKQogICAgICAgIH0KICAgICAgICBzZW5kVG9DbGlwYm9hcmQoYmxvYikKICAgICAgfSk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHNhdmVJbWFnZVRvRmlsZSgpIHsKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS5kb3dubG9hZEltYWdlKFBMT1QsIGNvbmZpZyk7Cn0KCmxldCBjb250YWluZXJfcmVjdCA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCwgdG9wOiAwLCBsZWZ0OiAwIH07CmZ1bmN0aW9uIHVucG9wX2NvbnRhaW5lcihjbCkgewogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgZmFsc2UpOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBmYWxzZSk7CiAgLy8gV2UgZml4IHRoZSBoZWlnaHQgYmFjayB0byB0aGUgdmFsdWUgaXQgaGFkIGJlZm9yZSBwb3BvdXQsIGFsc28gc2V0dGluZyB0aGUgZmxhZyB0byBzaWduYWwgdGhhdCB1cG9uIGZpcnN0IHJlc2l6ZSB3ZSByZW1vdmUgdGhlIGZpeGVkIGlubGluZS1zdHlsZQogIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQgKyAicHgiOwogIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IHRydWU7CiAgLy8gV2Ugc2V0IHRoZSBvdGhlciBmaXhlZCBpbmxpbmUtc3R5bGVzIHRvIG51bGwKICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICBDT05UQUlORVIuc3R5bGUudG9wID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBXZSBhbHNvIHJlbW92ZSB0aGUgQ0xJUEJPQVJEX0hFQURFUgogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSAiIjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBGaW5hbGx5IHdlIHJlbW92ZSB0aGUgaGlkZGVuIGNsYXNzIHRvIHRoZSBoZWFkZXIKICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIHRydWUpOwogIHJldHVybjsKfQpmdW5jdGlvbiBwb3BvdXRfY29udGFpbmVyKG9wdHMpIHsKICBjb25zdCBjbCA9IG9wdHM/LmNsOwogIGNvbnN0IHRhcmdldF9jb250YWluZXJfc2l6ZSA9IG9wdHM/LnRhcmdldF9jb250YWluZXJfc2l6ZSA/PyB7fTsKICBjb25zdCB0YXJnZXRfcGxvdF9zaXplID0gb3B0cz8udGFyZ2V0X3Bsb3Rfc2l6ZSA/PyB7fTsKICBpZiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIHJldHVybiB1bnBvcF9jb250YWluZXIoY2wpOwogIH0KICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgY2wgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdHJ1ZSk7CiAgLy8gV2UgZXh0cmFjdCB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjb250YWluZXIsIHNhdmUgdGhlbSBhbmQgZml4IHRoZW0KICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9ID0gQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogIGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfTsKICAvLyBXZSBzYXZlIHRoZSBjdXJyZW50IHBsb3Qgc2l6ZSBiZWZvcmUgd2UgcG9wIGFzIGl0IHdpbGwgZmlsbCB0aGUgc2NyZWVuCiAgY29uc3QgY3VycmVudF9wbG90X3NpemUgPSB7CiAgICB3aWR0aDogUExPVC5fZnVsbExheW91dC53aWR0aCwKICAgIGhlaWdodDogUExPVC5fZnVsbExheW91dC5oZWlnaHQsCiAgfTsKICAvLyBXZSBoYXZlIHRvIHNhdmUgdGhlIHBhZCBkYXRhIGJlZm9yZSBwb3BwaW5nIHNvIHdlIGNhbiByZXNpemUgcHJlY2lzZWx5CiAgY29uc3QgcGFkID0ge307CiAgcGFkLnVucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgdHJ1ZSk7CiAgcGFkLnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICAvLyBXZSBkbyB0b3AgYW5kIGxlZnQgYmFzZWQgb24gdGhlIGN1cnJlbnQgcmVjdAogIGZvciAoY29uc3Qga2V5IG9mIFsidG9wIiwgImxlZnQiXSkgewogICAgY29uc3Qgc3RhcnRfdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY29udGFpbmVyX3JlY3Rba2V5XTsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgZm9yIChjb25zdCBraW5kIG9mIFsicGFkZGluZyIsICJib3JkZXIiXSkgewogICAgICBvZmZzZXQgKz0gcGFkLnBvcHBlZFtraW5kXVtrZXldIC0gcGFkLnVucG9wcGVkW2tpbmRdW2tleV07CiAgICB9CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHN0YXJ0X3ZhbCAtIG9mZnNldCArICJweCI7CiAgICBpZiAoa2V5ID09PSAibGVmdCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIC8vIFdlIGNvbXB1dGUgdGhlIHdpZHRoIGFuZCBoZWlnaHQgZGVwZW5kaW5nIG9uIGV2ZW50dWFsIGNvbmZpZyBkYXRhCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoewogICAgd2lkdGg6CiAgICAgIHRhcmdldF9wbG90X3NpemUud2lkdGggPz8KICAgICAgY29uZmlnX3NwYW5zLndpZHRoLmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS5oZWlnaHQgPz8KICAgICAgY29uZmlnX3NwYW5zLmhlaWdodC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUuaGVpZ2h0LAogIH0pOwogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIGNvbnN0IHZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNzeltrZXldOwogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSB2YWwgKyAicHgiOwogICAgaWYgKGtleSA9PT0gIndpZHRoIikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCBmYWxzZSk7CiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgdW5wb3BfY29udGFpbmVyKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKfQoKQ09OVEFJTkVSLnBvcE91dCA9IHBvcG91dF9jb250YWluZXI7CgpmdW5jdGlvbiBEdWFsQ2xpY2soc2luZ2xlX2Z1bmMsIGRibF9mdW5jKSB7CiAgbGV0IG5jbGlja3MgPSAwOwogIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykgewogICAgbmNsaWNrcyArPSAxOwogICAgaWYgKG5jbGlja3MgPiAxKSB7CiAgICAgIGRibF9mdW5jKC4uLmFyZ3MpOwogICAgICBuY2xpY2tzID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIGRlbGF5KDMwMCkudGhlbigoKSA9PiB7CiAgICAgICAgaWYgKG5jbGlja3MgPT0gMSkgewogICAgICAgICAgc2luZ2xlX2Z1bmMoLi4uYXJncyk7CiAgICAgICAgfQogICAgICAgIG5jbGlja3MgPSAwOwogICAgICB9KTsKICAgIH0KICB9Owp9CgovLyBXZSByZW1vdmUgdGhlIGRlZmF1bHQgZG93bmxvYWQgaW1hZ2UgYnV0dG9uCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSwKICBbInRvSW1hZ2UiXQopOwovLyBXZSBhZGQgdGhlIGN1c3RvbSBidXR0b24gdG8gdGhlIG1vZGViYXIKcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkLAogIFsKICAgIHsKICAgICAgbmFtZTogIkNvcHkgUE5HIHRvIENsaXBib2FyZCIsCiAgICAgIGljb246IHsKICAgICAgICBoZWlnaHQ6IDUyMCwKICAgICAgICB3aWR0aDogNTIwLAogICAgICAgIHBhdGg6ICJNMjgwIDY0aDQwYzM1LjMgMCA2NCAyOC43IDY0IDY0VjQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEg2NGMtMzUuMyAwLTY0LTI4LjctNjQtNjRWMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0aDQwIDkuNkMxMjEgMjcuNSAxNTMuMyAwIDE5MiAwczcxIDI3LjUgNzguNCA2NEgyODB6TTY0IDExMmMtOC44IDAtMTYgNy4yLTE2IDE2VjQ0OGMwIDguOCA3LjIgMTYgMTYgMTZIMzIwYzguOCAwIDE2LTcuMiAxNi0xNlYxMjhjMC04LjgtNy4yLTE2LTE2LTE2SDMwNHYyNGMwIDEzLjMtMTAuNyAyNC0yNCAyNEgxOTIgMTA0Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNFYxMTJINjR6bTEyOC04YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHoiLAogICAgICB9LAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soY29weUltYWdlVG9DbGlwYm9hcmQsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKCk7CiAgICAgIH0pLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIkRvd25sb2FkIEltYWdlIiwKICAgICAgaWNvbjogUGxvdGx5Lkljb25zLmNhbWVyYSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKHNhdmVJbWFnZVRvRmlsZSwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoeyBjbDogImZpbGVzYXZlIiB9KTsKICAgICAgfSksCiAgICB9LAogIF0KKTsKCmZ1bmN0aW9uIGdldE9mZnNldERhdGEoZWwpIHsKICBsZXQgY3MgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgbnVsbCk7CiAgY29uc3Qgb2RhdGEgPSB7CiAgICBwYWRkaW5nOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgfSwKICAgIGJvcmRlcjogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgfQogIH07CiAgaWYgKGVsID09PSBQTE9UKSB7CiAgICAvLyBGb3IgdGhlIFBMT1Qgd2UgYWxzbyB3YW50IHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBvZmZzZXQKICAgIG9kYXRhLm9mZnNldCA9IHsKICAgICAgdG9wOiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldFRvcCA6IDAsCiAgICAgIGxlZnQ6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0TGVmdCA6IDAsCiAgICB9CiAgfQogIHJldHVybiBvZGF0YTsKfQpmdW5jdGlvbiBnZXRTaXplRGF0YSgpIHsKICBjb25zdCBkYXRhID0gewogICAgcGxvdF9wYWQ6IGdldE9mZnNldERhdGEoUExPVCksCiAgICBwbG90X3JlY3Q6IFBMT1QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgICBjb250YWluZXJfcGFkOiBnZXRPZmZzZXREYXRhKENPTlRBSU5FUiksCiAgICBjb250YWluZXJfcmVjdDogQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogIH07CiAgcmV0dXJuIGRhdGE7Cn0KZnVuY3Rpb24gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGNvbnN0IGNvbXB1dGVkX3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIGNvbnN0IG9mZnNldHMgPSBjb21wdXRlZF9zaXplLm9mZnNldHM7CgogIGNvbnN0IHBsb3RfZGF0YSA9IHsKICAgIHdpZHRoOiB3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiBoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfTsKCiAgcmV0dXJuIHsKICAgIHdpZHRoOiAod2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCkgKyBvZmZzZXRzLndpZHRoLAogICAgaGVpZ2h0OiAoaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0KSArIG9mZnNldHMuaGVpZ2h0LAogICAgbm9DaGFuZ2U6IHdpZHRoID09IGNvbXB1dGVkX3NpemUud2lkdGggJiYgaGVpZ2h0ID09IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH0KfQoKLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGNoYW5nZSB0aGUgY29udGFpbmVyIHNpemUgc28gdGhhdCB0aGUgcmVzdWx0aW5nIHBsb3Qgd2lsbCBiZSBtYXRjaGluZyB0aGUgcHJvdmlkZWQgc3BlY3MKZnVuY3Rpb24gY2hhbmdlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgaWYgKCFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgY29uc29sZS5sb2coIlRyaWVkIHRvIGNoYW5nZSBjb250YWluZXIgc2l6ZSB3aGVuIG5vdCBwb3BwZWQsIGlnbm9yaW5nIik7CiAgICByZXR1cm47CiAgfQoKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEpOwoKICBpZiAoY3N6Lm5vQ2hhbmdlKSB7CiAgICBjb25zb2xlLmxvZygiU2l6ZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50LCBpZ25vcmluZyIpOwogICAgcmV0dXJuCiAgfQogIC8vIFdlIGFyZSBub3cgZ29pbmcgdG8gc2V0IGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGNvbnRhaW5lcgogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gY3N6W2tleV0gKyAicHgiOwogIH0KfQovLyBXZSBub3cgY3JlYXRlIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgdXBkYXRlIHRoZSBwbG90IGJhc2VkIG9uIHRoZSB2YWx1ZXMgc3BlY2lmaWVkCmZ1bmN0aW9uIHVwZGF0ZUZyb21IZWFkZXIoKSB7CiAgY29uc3QgaGVhZGVyX2RhdGEgPSB7CiAgICBoZWlnaHQ6IGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUsCiAgICB3aWR0aDogY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlLAogIH07CiAgY2hhbmdlQ29udGFpbmVyU2l6ZShoZWFkZXJfZGF0YSk7Cn0KLy8gV2UgYXNzaWduIHRoaXMgZnVuY3Rpb24gdG8gdGhlIG9uYmx1ciBldmVudCBvZiB3aWR0aCBhbmQgaGVpZ2h0CmlmIChmaXJzdFJ1bikgewogIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLnVpX3NwYW4ub25ibHVyID0gKGUpID0+IHsKICAgICAgY29udGFpbmVyLnVpX3ZhbHVlID0gY29udGFpbmVyLnVpX3NwYW4udGV4dENvbnRlbnQ7CiAgICAgIHVwZGF0ZUZyb21IZWFkZXIoKTsKICAgIH07CiAgfQp9Ci8vIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIHBsb3Qgc2l6ZSB0byB1c2UgZm9yIHJlbGF5b3V0IGFzIGEgZnVuY3Rpb24gb2YgdGhlIGNvbnRhaW5lciBzaXplCmZ1bmN0aW9uIGNvbXB1dGVQbG90U2l6ZShkYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIC8vIFJlbW92ZSBQYWRkaW5nCiAgY29uc3QgeyBjb250YWluZXJfcGFkLCBwbG90X3BhZCwgY29udGFpbmVyX3JlY3QgfSA9IGRhdGE7CiAgY29uc3Qgb2Zmc2V0cyA9IHsKICAgIHdpZHRoOgogICAgICBwbG90X3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLndpZHRoICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LmxlZnQgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci53aWR0aCwKICAgIGhlaWdodDoKICAgICAgcGxvdF9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBwbG90X3BhZC5ib3JkZXIuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LnRvcCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci5oZWlnaHQsCiAgfTsKICBjb25zdCBzeiA9IHsKICAgIHdpZHRoOiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LndpZHRoIC0gb2Zmc2V0cy53aWR0aCksCiAgICBoZWlnaHQ6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3QuaGVpZ2h0IC0gb2Zmc2V0cy5oZWlnaHQpLAogICAgb2Zmc2V0cywKICB9OwogIHJldHVybiBzejsKfQoKLy8gQ3JlYXRlIHRoZSByZXNpemVPYnNlcnZlciB0byBtYWtlIHRoZSBwbG90IGV2ZW4gbW9yZSByZXNwb25zaXZlISA6bWFnaWM6CmNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7CiAgY29uc3Qgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpOwogIGNvbnN0IHtjb250YWluZXJfcmVjdCwgY29udGFpbmVyX3BhZH0gPSBzaXplRGF0YTsKICBsZXQgcGxvdF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICAvLyBXZSBzYXZlIHRoZSBoZWlnaHQgaW4gdGhlIFBMT1Qgb2JqZWN0CiAgUExPVC5jb250YWluZXJfaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0OwogIC8vIFdlIGRlYWwgd2l0aCBzb21lIHN0dWZmIGlmIHRoZSBjb250YWluZXIgaXMgcG9wcHBlZAogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSBjb250YWluZXJfcmVjdC53aWR0aCArICJweCI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gY29udGFpbmVyX3JlY3QubGVmdCArICJweCI7CiAgY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS5oZWlnaHQ7CiAgY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlID0gcGxvdF9zaXplLndpZHRoOwogIC8qIAoJCVRoZSBhZGRpdGlvbiBvZiB0aGUgaW52YWxpZCBhcmd1bWVudCBgcGx1dG9yZXNpemVgIHNlZW1zIHRvIGZpeCB0aGUgcHJvYmxlbSB3aXRoIGNhbGxpbmcgYHJlbGF5b3V0YCBzaW1wbHkgd2l0aCBge2F1dG9zaXplOiB0cnVlfWAgYXMgdXBkYXRlIGJyZWFraW5nIG1vdXNlIHJlbGF5b3V0IGV2ZW50cyB0cmFja2luZy4gCgkJU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wbG90bHkvcGxvdGx5LmpzL2lzc3Vlcy82MTU2IGZvciBkZXRhaWxzCgkJKi8KICBsZXQgY29uZmlnID0gewogICAgLy8gSWYgdGhpcyBpcyBwb3BwZWQgb3V0LCB3ZSBpZ25vcmUgdGhlIG9yaWdpbmFsIHdpZHRoL2hlaWdodAogICAgd2lkdGg6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX3dpZHRoKSA/PyBwbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX2hlaWdodCkgPz8gcGxvdF9zaXplLmhlaWdodCwKICAgIHBsdXRvcmVzaXplOiB0cnVlLAogIH07CiAgUGxvdGx5LnJlbGF5b3V0KFBMT1QsIGNvbmZpZykudGhlbigoKSA9PiB7CiAgICBpZiAocmVtb3ZlX2NvbnRhaW5lcl9zaXplICYmICFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBhdm9pZCB0aGUgZmlyc3QgcmVzaXplIHVwb24gcGxvdCBjcmVhdGlvbiB0byBhbHJlYWR5IGJlIHdpdGhvdXQgYSBmaXhlZCBoZWlnaHQKICAgICAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9ICIiOwogICAgICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICAgICAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmFsc2U7CiAgICB9CiAgfSk7Cn0pOwoKcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShDT05UQUlORVIpOwoKClBsb3RseS5yZWFjdChQTE9ULCBwbG90X29iaikudGhlbigoKSA9PiB7CgkvLyBBc3NpZ24gdGhlIFBsb3RseSBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhwbG90bHlfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1Qub24oa2V5LCBsaXN0ZW5lcikKCQl9Cgl9CgkvLyBBc3NpZ24gdGhlIEpTIGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKGpzX2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULmFkZEV2ZW50TGlzdGVuZXIoa2V5LCBsaXN0ZW5lciwgewoJCQkJc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbAoJCQl9KQoJCX0KCX0KfQopCgoKaW52YWxpZGF0aW9uLnRoZW4oKCkgPT4gewoJLy8gUmVtb3ZlIGFsbCBwbG90bHkgbGlzdGVuZXJzCglQTE9ULnJlbW92ZUFsbExpc3RlbmVycygpCgkvLyBSZW1vdmUgYWxsIEpTIGxpc3RlbmVycwoJY29udHJvbGxlci5hYm9ydCgpCgkvLyBSZW1vdmUgdGhlIHJlc2l6ZU9ic2VydmVyCglyZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCkKfSkKCgoKCQlyZXR1cm4gQ09OVEFJTkVSCgk8L3NjcmlwdD4KpG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv6MTHWP+sHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQxMjMxYjgzMi00N2IxLTRjY2ItOWI1Ni1hNjc4Mzg1OThjYze5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4M64eEtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5HZNWIzYjg0MDhjLTgxODEtMTFlZi0xNGViLWUxYzU2OWI4YmIyOS83NGMzNmE0MjUyM2ExNjlmuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDAyNjY2MzJkLTVjYTQtNDE5Ni1hNTIzLTMzYTY2ZGQ3MGUwY4qmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHmFpnByZWZpeKNBREOoZWxlbWVudHOVkqFOkqMxMDCqdGV4dC9wbGFpbpKhVJKkMC4wNap0ZXh0L3BsYWlukqVkZWxheZKjMC4wqnRleHQvcGxhaW6So86UZpKjMC4wqnRleHQvcGxhaW6Sos+VkqMwLjCqdGV4dC9wbGFpbqR0eXBlpnN0cnVjdKxwcmVmaXhfc2hvcnSjQURDqG9iamVjdGlksDUyOWY5NjI2NTE4NzY1ZDakbWltZdkhYXBwbGljYXRpb24vdm5kLnBsdXRvLnRyZWUrb2JqZWN0rHJvb3Rhc3NpZ25lZaNhZGOybGFzdF9ydW5fdGltZXN0YW1wy0HZv6MIRCFHsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQwMjY2NjMyZC01Y2E0LTQxOTYtYTUyMy0zM2E2NmRkNzBlMGO5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc04ybVwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMKxY2VsbF9kZXBlbmRlbmNpZXPeAC7ZJDU4YmU0MTUwLTJiN2EtNGY5ZS1hN2Q3LTQwYTA4NmZkM2E1M4S0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDU4YmU0MTUwLTJiN2EtNGY5ZS1hN2Q3LTQwYTA4NmZkM2E1M7Rkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwhKRCYXNlkK5CYXNlLkRvY3MuSFRNTJCpQGh0bWxfc3RykLFhY3Rpdml0eV9maW5pc2hlZJHZJGFiOGRjMWNlLWQxZWYtNDNhMC05NDk1LWRhYzkzMWI1MmFlY9kkZjExYTJmYTItZWZmOS00OTc5LWI3MzktM2RhMmIyNGE5YTQ1hLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkZjExYTJmYTItZWZmOS00OTc5LWI3MzktM2RhMmIyNGE5YTQ1tGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCp0BtZF9zdHKQqGdldGluZGV4kNkkOTcxMDRjNDYtZTgxZi00NDRhLTk1N2YtMGJiYjFiMDJmMWI4hLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkOTcxMDRjNDYtZTgxZi00NDRhLTk1N2YtMGJiYjFiMDJmMWI4tGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCEp0BtZF9zdHKQqFJlc291cmNlkKI9PpCoZ2V0aW5kZXiQ2SRlNGM4MGMyNC0yMGZkLTQyZTUtOWRjZC1hNjU5NTg1NjljMDGEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SRlNGM4MGMyNC0yMGZkLTQyZTUtOWRjZC1hNjU5NTg1NjljMDG0ZG93bnN0cmVhbV9jZWxsc19tYXCAsnVwc3RyZWFtX2NlbGxzX21hcISnQG1kX3N0cpCoUmVzb3VyY2WQoj0+kKhnZXRpbmRleJDZJDE4YzgyZmYxLTBiZGUtNGZhMC04NDhjLWQwZWI3M2QxYWM3Y4S0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDE4YzgyZmYxLTBiZGUtNGZhMC04NDhjLWQwZWI3M2QxYWM3Y7Rkb3duc3RyZWFtX2NlbGxzX21hcIKsZmlnX3NpZ25hbF8ykK1zaWduYWxfbGF5b3V0kdkkMWM3OWIzN2UtZDRlMC00OTBmLTk0NjYtMjBjZTI4ZjAxN2FlsnVwc3RyZWFtX2NlbGxzX21hcIakYXR0cpCyc2lnbmFsX3QyX3N0YXJfZ3JlkdkkMWE4M2Q4OTctNzA1Yi00NDNkLTg5YTQtZWE1ZTNlNmEzYzA3qnNpZ25hbF9ncmWR2SQ0MWQxNGRlYy1iODUyLTQzMTYtYWVmYi1jM2QwOGZhNDMyMTamTGF5b3V0kKhyZWxheW91dJCpcmVsYXlvdXQhkNkkMWM3OWIzN2UtZDRlMC00OTBmLTk0NjYtMjBjZTI4ZjAxN2FlhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkMWM3OWIzN2UtZDRlMC00OTBmLTk0NjYtMjBjZTI4ZjAxN2FltGRvd25zdHJlYW1fY2VsbHNfbWFwg6xmaWdfc2lnbmFsXzOQqHRfYWRjX3NlkLFzaWduYWxfdDJfc3Rhcl9zZZCydXBzdHJlYW1fY2VsbHNfbWFwjaZzZXFfc2WR2SQyN2U2NTY4MC0yMmEwLTQwNzktYjZkZi1kNjBhMzIxOGU1MmWtc2lnbmFsX2xheW91dJHZJDE4YzgyZmYxLTBiZGUtNGZhMC04NDhjLWQwZWI3M2QxYWM3Y7JzaWduYWxfdDJfc3Rhcl9ncmWR2SQxYTgzZDg5Ny03MDViLTQ0M2QtODlhNC1lYTVlM2U2YTNjMDeqc2lnbmFsX2dyZZHZJDQxZDE0ZGVjLWI4NTItNDMxNi1hZWZiLWMzZDA4ZmE0MzIxNqhyZWxheW91dJCpcmVsYXlvdXQhkKh0Ml9kZWNheZHZJDEyMzFiODMyLTQ3YjEtNGNjYi05YjU2LWE2NzgzODU5OGNjN6phZGR0cmFjZXMhkK5yYXdfdDJfc3Rhcl9zZZHZJDk3NDc5NDM3LTljZTMtNGIzMy05MTM0LTBmMmFmODliY2NiNatwbG90X3NpZ25hbJChKpDZIktvbWFNUklDb3JlLmdldF9hZGNfc2FtcGxpbmdfdGltZXOQq0tvbWFNUklDb3JlkdkkZDZiMTcyOWEtODc0ZC0xMWVlLTE1MWEtOWIwZmNjZTJjNGZk2SRhYjhkYzFjZS1kMWVmLTQzYTAtOTQ5NS1kYWM5MzFiNTJhZWOEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SRhYjhkYzFjZS1kMWVmLTQzYTAtOTQ5NS1kYWM5MzFiNTJhZWO0ZG93bnN0cmVhbV9jZWxsc19tYXCBsWFjdGl2aXR5X2ZpbmlzaGVkkdkkNThiZTQxNTAtMmI3YS00ZjllLWE3ZDctNDBhMDg2ZmQzYTUzsnVwc3RyZWFtX2NlbGxzX21hcIDZJDhiNGExYWQ5LTJkNmEtNGM4Zi1iYjhlLWY0M2MyZDA1ODE5NYS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDhiNGExYWQ5LTJkNmEtNGM4Zi1iYjhlLWY0M2MyZDA1ODE5NbRkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwgqhwbG90X3NlcZCnc2VxX2dyZZHZJDkxNzlhYTQwLWJiNDAtNGEzNi1hZTFlLTAwYWU0MjkzNWE1ZtkkMzVmZjM0MDItZGMzNi00YjkxLWJlYzktYjRkMjFmYWYzZTY4hLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkMzVmZjM0MDItZGMzNi00YjkxLWJlYzktYjRkMjFmYWYzZTY4tGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCo29iapHZJGQxNmVmYTYyLWRjZTctNGVjMy05ZTNjLWI1ZTE2NzczNzdmY7BwbG90X3BoYW50b21fbWFwkNkkNGE0YTZiZDMtYjgyMC00NzljLTg5ZTMtZjNjZTc5YTMxNmRihLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkNGE0YTZiZDMtYjgyMC00NzljLTg5ZTMtZjNjZTc5YTMxNmRitGRvd25zdHJlYW1fY2VsbHNfbWFwgbFyZWNvbl90Ml9zdGFyX2dyZZLZJDk2NDQwNGY2LTdmNDYtNGRmOS1hZDk4LTkyMTk0OGMzYmU2OdkkMzQ4MjRkYjctMTNjNC00NWUyLWJlZmEtZjAyN2I5YjU4NWMwsnVwc3RyZWFtX2NlbGxzX21hcISkZmZ0Y5HZJDlhODhhNTRiLWJjYzctNDFhZC04ZTYwLWY0ZDQ1MGRjY2IyZK9yYXdfdDJfc3Rhcl9ncmWR2SRlNGVmNTE0NS1hNjNjLTRmOTEtYWMwNC0zYjViZjE2YzA4NDKkcGxvdJCjYWJzkNkkMjdlNjU2ODAtMjJhMC00MDc5LWI2ZGYtZDYwYTMyMThlNTJlhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkMjdlNjU2ODAtMjJhMC00MDc5LWI2ZGYtZDYwYTMyMThlNTJltGRvd25zdHJlYW1fY2VsbHNfbWFwgaZzZXFfc2WU2SRmMWYzYjcwMC01OTE2LTQ5NmYtYjkzOC00NmY3ZjA4YjRlYjbZJDRlMTQzNGUxLTY3M2YtNDIwNi1hMjcxLTllZGVjMTBlYmQ2YdkkOTc0Nzk0MzctOWNlMy00YjMzLTkxMzQtMGYyYWY4OWJjY2I12SQxYzc5YjM3ZS1kNGUwLTQ5MGYtOTQ2Ni0yMGNlMjhmMDE3YWWydXBzdHJlYW1fY2VsbHNfbWFwh6ErkKZneF9wcmWR2SQ5MTc5YWE0MC1iYjQwLTRhMzYtYWUxZS0wMGFlNDI5MzVhNWaoU2VxdWVuY2WQoSqQomltkKJyZpHZJGM2ZTMzY2I4LWY0MmMtNDY0My05MjU3LTEyNGQyODA0ZDNkYadyZWFkb3V0kdkkOTE3OWFhNDAtYmI0MC00YTM2LWFlMWUtMDBhZTQyOTM1YTVm2SQwZjk2YTgzZC05NmVmLTQ3NjgtOTMzMC04N2M0NjZlMzVjOTOEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQwZjk2YTgzZC05NmVmLTQ3NjgtOTMzMC04N2M0NjZlMzVjOTO0ZG93bnN0cmVhbV9jZWxsc19tYXCBokF4kdkkOTE3OWFhNDAtYmI0MC00YTM2LWFlMWUtMDBhZTQyOTM1YTVmsnVwc3RyZWFtX2NlbGxzX21hcIqkQ29yZZCkQmFzZZC3UGx1dG9SdW5uZXIuY3JlYXRlX2JvbmSQq1BsdXRvUnVubmVykKVyYW5nZZCvQ29yZS5hcHBsaWNhYmxlkKVAYmluZJCoQmFzZS5nZXSQoSqQplNsaWRlcpDZJDVkZjk3ODc0LWYwOWMtNDE3My1hMmY2LTg5M2RiMzIyY2NhZoS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDVkZjk3ODc0LWYwOWMtNDE3My1hMmY2LTg5M2RiMzIyY2NhZrRkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwgqdAbWRfc3RykKhnZXRpbmRleJDZJGU0ZWY1MTQ1LWE2M2MtNGY5MS1hYzA0LTNiNWJmMTZjMDg0MoS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJGU0ZWY1MTQ1LWE2M2MtNGY5MS1hYzA0LTNiNWJmMTZjMDg0MrRkb3duc3RyZWFtX2NlbGxzX21hcIGvcmF3X3QyX3N0YXJfZ3JlktkkMWE4M2Q4OTctNzA1Yi00NDNkLTg5YTQtZWE1ZTNlNmEzYzA32SQ0YTRhNmJkMy1iODIwLTQ3OWMtODllMy1mM2NlNzlhMzE2ZGKydXBzdHJlYW1fY2VsbHNfbWFwhKpvYmpfdDJzdGFykdkkZWU3ZTgxZTctNDg0Yy00NGE4LWExOTEtZjczZTI0NzA3Y2U5o3N5c5HZJGM2ZTMzY2I4LWY0MmMtNDY0My05MjU3LTEyNGQyODA0ZDNkYadzZXFfZ3JlkdkkOTE3OWFhNDAtYmI0MC00YTM2LWFlMWUtMDBhZTQyOTM1YTVmqHNpbXVsYXRlkNkkN2E2NmFiNDctOTE4Zi00NTgyLTg5NWYtMWI0NjkwNTYyMDUxhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkN2E2NmFiNDctOTE4Zi00NTgyLTg5NWYtMWI0NjkwNTYyMDUxtGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCo3Jhd5HZJGM0N2E1MGI4LWM5MzAtNGM5Ni05YjM0LTI3NzIxODY2MzRkOatwbG90X3NpZ25hbJDZJGQ2YjE3MjlhLTg3NGQtMTFlZS0xNTFhLTliMGZjY2UyYzRmZIS0cHJlY2VkZW5jZV9oZXVyaXN0aWMHp2NlbGxfaWTZJGQ2YjE3MjlhLTg3NGQtMTFlZS0xNTFhLTliMGZjY2UyYzRmZLRkb3duc3RyZWFtX2NlbGxzX21hcIWnUGx1dG9VSZHZJDhlNDc0YWRkLTg2NTEtNDMxYi1iNDgxLTdhMTM5MDM3ZGJkMqxLb21hTVJJUGxvdHOQq1BsdXRvUGxvdGx5kKtLb21hTVJJQ29yZZLZJDQxZDE0ZGVjLWI4NTItNDMxNi1hZWZiLWMzZDA4ZmE0MzIxNtkkMWM3OWIzN2UtZDRlMC00OTBmLTk0NjYtMjBjZTI4ZjAxN2FlpEZGVFeQsnVwc3RyZWFtX2NlbGxzX21hcIDZJDlhODhhNTRiLWJjYzctNDFhZC04ZTYwLWY0ZDQ1MGRjY2IyZIS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDlhODhhNTRiLWJjYzctNDFhZC04ZTYwLWY0ZDQ1MGRjY2IyZLRkb3duc3RyZWFtX2NlbGxzX21hcIKkZmZ0Y5LZJDRhNGE2YmQzLWI4MjAtNDc5Yy04OWUzLWYzY2U3OWEzMTZkYtkkMmU2NWFlMzEtZjUwYS00NjJiLTk3NDQtODBiZjZjZGIzODhlqXJlY29uX2dyZZLZJDk2NDQwNGY2LTdmNDYtNGRmOS1hZDk4LTkyMTk0OGMzYmU2OdkkMzQ4MjRkYjctMTNjNC00NWUyLWJlZmEtZjAyN2I5YjU4NWMwsnVwc3RyZWFtX2NlbGxzX21hcImjYWJzkKNmZnSQpHBsb3SQoS+QqWlmZnRzaGlmdJCkc2l6ZZCkcHJvZJCoZmZ0c2hpZnSQp3Jhd19ncmWR2SRhZGE2MDJkMi00ZjRiLTRmYjQtYTc2My04YTYzOWUwNWZmMzjZJGM0N2E1MGI4LWM5MzAtNGM5Ni05YjM0LTI3NzIxODY2MzRkOYS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJGM0N2E1MGI4LWM5MzAtNGM5Ni05YjM0LTI3NzIxODY2MzRkObRkb3duc3RyZWFtX2NlbGxzX21hcIGjcmF3kdkkN2E2NmFiNDctOTE4Zi00NTgyLTg5NWYtMWI0NjkwNTYyMDUxsnVwc3RyZWFtX2NlbGxzX21hcISjc2VxkdkkMDk3NTU0N2QtNjdkOS00ZTZiLTg4ZmYtYTlkZDA2YTdmOWVmo29iapHZJGQxNmVmYTYyLWRjZTctNGVjMy05ZTNjLWI1ZTE2NzczNzdmY6NzeXOR2SRjNmUzM2NiOC1mNDJjLTQ2NDMtOTI1Ny0xMjRkMjgwNGQzZGGoc2ltdWxhdGWQ2SQ0MWQxNGRlYy1iODUyLTQzMTYtYWVmYi1jM2QwOGZhNDMyMTaEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQ0MWQxNGRlYy1iODUyLTQzMTYtYWVmYi1jM2QwOGZhNDMyMTa0ZG93bnN0cmVhbV9jZWxsc19tYXCCqXRfYWRjX2dyZZHZJDFhODNkODk3LTcwNWItNDQzZC04OWE0LWVhNWUzZTZhM2MwN6pzaWduYWxfZ3JlktkkMThjODJmZjEtMGJkZS00ZmEwLTg0OGMtZDBlYjczZDFhYzdj2SQxYzc5YjM3ZS1kNGUwLTQ5MGYtOTQ2Ni0yMGNlMjhmMDE3YWWydXBzdHJlYW1fY2VsbHNfbWFwiKh0Ml9kZWNheZHZJDEyMzFiODMyLTQ3YjEtNGNjYi05YjU2LWE2NzgzODU5OGNjN6phZGR0cmFjZXMhkKtwbG90X3NpZ25hbJCnc2VxX2dyZZHZJDkxNzlhYTQwLWJiNDAtNGEzNi1hZTFlLTAwYWU0MjkzNWE1ZqEqkNkiS29tYU1SSUNvcmUuZ2V0X2FkY19zYW1wbGluZ190aW1lc5CrS29tYU1SSUNvcmWR2SRkNmIxNzI5YS04NzRkLTExZWUtMTUxYS05YjBmY2NlMmM0ZmSncmF3X2dyZZHZJGFkYTYwMmQyLTRmNGItNGZiNC1hNzYzLThhNjM5ZTA1ZmYzONkkZWU3ZTgxZTctNDg0Yy00NGE4LWExOTEtZjczZTI0NzA3Y2U5hLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkZWU3ZTgxZTctNDg0Yy00NGE4LWExOTEtZjczZTI0NzA3Y2U5tGRvd25zdHJlYW1fY2VsbHNfbWFwg6pvYmpfdDJzdGFyk9kkMmVlN2JhNDctMDJlNS00YjAyLWExNjItZGRiZDVlZDQ3Yzdi2SRlNGVmNTE0NS1hNjNjLTRmOTEtYWMwNC0zYjViZjE2YzA4NDLZJDk3NDc5NDM3LTljZTMtNGIzMy05MTM0LTBmMmFmODliY2NiNaROaXNvkNkgbGluZWFyX29mZnJlc29uYW5jZV9kaXN0cmlidXRpb26QsnVwc3RyZWFtX2NlbGxzX21hcImlcmFuZ2WQo29iapHZJGQxNmVmYTYyLWRjZTctNGVjMy05ZTNjLWI1ZTE2NzczNzdmY6EvkKErkKdQaGFudG9tkKLPgJCnRmxvYXQ2NJChKpCkY29weZDZJDM0ODI0ZGI3LTEzYzQtNDVlMi1iZWZhLWYwMjdiOWI1ODVjMIS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDM0ODI0ZGI3LTEzYzQtNDVlMi1iZWZhLWYwMjdiOWI1ODVjMLRkb3duc3RyZWFtX2NlbGxzX21hcIGrZmlnX3JlY29uXzOQsnVwc3RyZWFtX2NlbGxzX21hcIawcmVjb25fdDJfc3Rhcl9zZZHZJDJlNjVhZTMxLWY1MGEtNDYyYi05NzQ0LTgwYmY2Y2RiMzg4ZbFyZWNvbl90Ml9zdGFyX2dyZZHZJDRhNGE2YmQzLWI4MjAtNDc5Yy04OWUzLWYzY2U3OWEzMTZkYqxyZWNvbl9sYXlvdXSR2SQ5NjQ0MDRmNi03ZjQ2LTRkZjktYWQ5OC05MjE5NDhjM2JlNjmpcmVsYXlvdXQhkKhyZWxheW91dJCpcmVjb25fZ3JlkdkkOWE4OGE1NGItYmNjNy00MWFkLThlNjAtZjRkNDUwZGNjYjJk2SRmMWYzYjcwMC01OTE2LTQ5NmYtYjkzOC00NmY3ZjA4YjRlYjaEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SRmMWYzYjcwMC01OTE2LTQ5NmYtYjkzOC00NmY3ZjA4YjRlYja0ZG93bnN0cmVhbV9jZWxsc19tYXCAsnVwc3RyZWFtX2NlbGxzX21hcIKocGxvdF9zZXGQpnNlcV9zZZHZJDI3ZTY1NjgwLTIyYTAtNDA3OS1iNmRmLWQ2MGEzMjE4ZTUyZdkkOTE3OWFhNDAtYmI0MC00YTM2LWFlMWUtMDBhZTQyOTM1YTVmhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkOTE3OWFhNDAtYmI0MC00YTM2LWFlMWUtMDBhZTQyOTM1YTVmtGRvd25zdHJlYW1fY2VsbHNfbWFwhqRhZGMykKhUX2d4X3ByZZCnc2VxX2dyZZXZJDhiNGExYWQ5LTJkNmEtNGM4Zi1iYjhlLWY0M2MyZDA1ODE5NdkkM2FiY2E0MDYtMmU2Yi00YjM3LTg4MzUtNjVjZmFkOWQwY2Fh2SRhZGE2MDJkMi00ZjRiLTRmYjQtYTc2My04YTYzOWUwNWZmMzjZJDQxZDE0ZGVjLWI4NTItNDMxNi1hZWZiLWMzZDA4ZmE0MzIxNtkkZTRlZjUxNDUtYTYzYy00ZjkxLWFjMDQtM2I1YmYxNmMwODQyomd4kKZneF9wcmWR2SQyN2U2NTY4MC0yMmEwLTQwNzktYjZkZi1kNjBhMzIxOGU1MmWncmVhZG91dJHZJDI3ZTY1NjgwLTIyYTAtNDA3OS1iNmRmLWQ2MGEzMjE4ZTUyZbJ1cHN0cmVhbV9jZWxsc19tYXCKo0FEQ5CiQXiR2SQwZjk2YTgzZC05NmVmLTQ3NjgtOTMzMC04N2M0NjZlMzVjOTOhLZChL5ChK5ChKpCoU2VxdWVuY2WQpEdyYWSQolJGkKJyZpHZJGM2ZTMzY2I4LWY0MmMtNDY0My05MjU3LTEyNGQyODA0ZDNkYdkkYWRhNjAyZDItNGY0Yi00ZmI0LWE3NjMtOGE2MzllMDVmZjM4hLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkYWRhNjAyZDItNGY0Yi00ZmI0LWE3NjMtOGE2MzllMDVmZjM4tGRvd25zdHJlYW1fY2VsbHNfbWFwgadyYXdfZ3JlktkkNDFkMTRkZWMtYjg1Mi00MzE2LWFlZmItYzNkMDhmYTQzMjE22SQ5YTg4YTU0Yi1iY2M3LTQxYWQtOGU2MC1mNGQ0NTBkY2NiMmSydXBzdHJlYW1fY2VsbHNfbWFwhKNvYmqR2SRkMTZlZmE2Mi1kY2U3LTRlYzMtOWUzYy1iNWUxNjc3Mzc3ZmOjc3lzkdkkYzZlMzNjYjgtZjQyYy00NjQzLTkyNTctMTI0ZDI4MDRkM2Rhp3NlcV9ncmWR2SQ5MTc5YWE0MC1iYjQwLTRhMzYtYWUxZS0wMGFlNDI5MzVhNWaoc2ltdWxhdGWQ2SQ5NzQ3OTQzNy05Y2UzLTRiMzMtOTEzNC0wZjJhZjg5YmNjYjWEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQ5NzQ3OTQzNy05Y2UzLTRiMzMtOTEzNC0wZjJhZjg5YmNjYjW0ZG93bnN0cmVhbV9jZWxsc19tYXCBrnJhd190Ml9zdGFyX3NlktkkMWM3OWIzN2UtZDRlMC00OTBmLTk0NjYtMjBjZTI4ZjAxN2Fl2SQyZTY1YWUzMS1mNTBhLTQ2MmItOTc0NC04MGJmNmNkYjM4OGWydXBzdHJlYW1fY2VsbHNfbWFwhKpvYmpfdDJzdGFykdkkZWU3ZTgxZTctNDg0Yy00NGE4LWExOTEtZjczZTI0NzA3Y2U5pnNlcV9zZZHZJDI3ZTY1NjgwLTIyYTAtNDA3OS1iNmRmLWQ2MGEzMjE4ZTUyZaNzeXOR2SRjNmUzM2NiOC1mNDJjLTQ2NDMtOTI1Ny0xMjRkMjgwNGQzZGGoc2ltdWxhdGWQ2SQyZTY1YWUzMS1mNTBhLTQ2MmItOTc0NC04MGJmNmNkYjM4OGWEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQyZTY1YWUzMS1mNTBhLTQ2MmItOTc0NC04MGJmNmNkYjM4OGW0ZG93bnN0cmVhbV9jZWxsc19tYXCBsHJlY29uX3QyX3N0YXJfc2WR2SQzNDgyNGRiNy0xM2M0LTQ1ZTItYmVmYS1mMDI3YjliNTg1YzCydXBzdHJlYW1fY2VsbHNfbWFwhKRmZnRjkdkkOWE4OGE1NGItYmNjNy00MWFkLThlNjAtZjRkNDUwZGNjYjJkrnJhd190Ml9zdGFyX3NlkdkkOTc0Nzk0MzctOWNlMy00YjMzLTkxMzQtMGYyYWY4OWJjY2I1pHBsb3SQo2Fic5DZJDg1MjlmMzZkLTJkMzktNGI0NS1hODIxLTAxYzgzNDY1MzlmZIS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDg1MjlmMzZkLTJkMzktNGI0NS1hODIxLTAxYzgzNDY1MzlmZLRkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwga9UYWJsZU9mQ29udGVudHOQ2SQ0NTk1MjUxMi1hYWYxLTQzZDgtYTk1ZS1jMzJiYjI2MzNmNDKEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQ0NTk1MjUxMi1hYWYxLTQzZDgtYTk1ZS1jMzJiYjI2MzNmNDK0ZG93bnN0cmVhbV9jZWxsc19tYXCAsnVwc3RyZWFtX2NlbGxzX21hcIKnQG1kX3N0cpCoZ2V0aW5kZXiQ2SQ5NjQ0MDRmNi03ZjQ2LTRkZjktYWQ5OC05MjE5NDhjM2JlNjmEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQ5NjQ0MDRmNi03ZjQ2LTRkZjktYWQ5OC05MjE5NDhjM2JlNjm0ZG93bnN0cmVhbV9jZWxsc19tYXCCq2ZpZ19yZWNvbl8ykKxyZWNvbl9sYXlvdXSR2SQzNDgyNGRiNy0xM2M0LTQ1ZTItYmVmYS1mMDI3YjliNTg1YzCydXBzdHJlYW1fY2VsbHNfbWFwhrFyZWNvbl90Ml9zdGFyX2dyZZHZJDRhNGE2YmQzLWI4MjAtNDc5Yy04OWUzLWYzY2U3OWEzMTZkYqRhdHRykKhyZWxheW91dJCpcmVsYXlvdXQhkKZMYXlvdXSQqXJlY29uX2dyZZHZJDlhODhhNTRiLWJjYzctNDFhZC04ZTYwLWY0ZDQ1MGRjY2IyZNkkZDE2ZWZhNjItZGNlNy00ZWMzLTllM2MtYjVlMTY3NzM3N2ZjhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkZDE2ZWZhNjItZGNlNy00ZWMzLTllM2MtYjVlMTY3NzM3N2ZjtGRvd25zdHJlYW1fY2VsbHNfbWFwgaNvYmqU2SQzNWZmMzQwMi1kYzM2LTRiOTEtYmVjOS1iNGQyMWZhZjNlNjjZJGM0N2E1MGI4LWM5MzAtNGM5Ni05YjM0LTI3NzIxODY2MzRkOdkkYWRhNjAyZDItNGY0Yi00ZmI0LWE3NjMtOGE2MzllMDVmZjM42SRlZTdlODFlNy00ODRjLTQ0YTgtYTE5MS1mNzNlMjQ3MDdjZTmydXBzdHJlYW1fY2VsbHNfbWFwhKVyYW5nZZCnY29sbGVjdJCnUGhhbnRvbZCnbm90aGluZ5DZJGMwMmYzODk4LTEwY2ItNGYxZS1iNWVmLWViNDJiODAzYmFlZIS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJGMwMmYzODk4LTEwY2ItNGYxZS1iNWVmLWViNDJiODAzYmFlZLRkb3duc3RyZWFtX2NlbGxzX21hcIGqZmlnX2tzcGFjZZCydXBzdHJlYW1fY2VsbHNfbWFwhKlyZWxheW91dCGQqHJlbGF5b3V0kKprc3BhY2VfZ3JlkdkkM2FiY2E0MDYtMmU2Yi00YjM3LTg4MzUtNjVjZmFkOWQwY2FhqWtzcGFjZV9zZZHZJDRlMTQzNGUxLTY3M2YtNDIwNi1hMjcxLTllZGVjMTBlYmQ2YdkkMmVlN2JhNDctMDJlNS00YjAyLWExNjItZGRiZDVlZDQ3YzdihLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkMmVlN2JhNDctMDJlNS00YjAyLWExNjItZGRiZDVlZDQ3YzditGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCqm9ial90MnN0YXKR2SRlZTdlODFlNy00ODRjLTQ0YTgtYTE5MS1mNzNlMjQ3MDdjZTmwcGxvdF9waGFudG9tX21hcJDZJDc0NjY2YzFhLTI2NzMtNDkzNi05ODJiLTYyMjliZjkyYWY2NoS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDc0NjY2YzFhLTI2NzMtNDkzNi05ODJiLTYyMjliZjkyYWY2NrRkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwgqdAbWRfc3RykKhnZXRpbmRleJDZJGVhNTQyMjcxLTAxYzItNDk2Mi1hNzA4LTgwNGIyM2E4NjFiOYS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJGVhNTQyMjcxLTAxYzItNDk2Mi1hNzA4LTgwNGIyM2E4NjFiObRkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwgqdAbWRfc3RykKhnZXRpbmRleJDZJGM2ZTMzY2I4LWY0MmMtNDY0My05MjU3LTEyNGQyODA0ZDNkYYS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJGM2ZTMzY2I4LWY0MmMtNDY0My05MjU3LTEyNGQyODA0ZDNkYbRkb3duc3RyZWFtX2NlbGxzX21hcIOjc3lzlNkkYzQ3YTUwYjgtYzkzMC00Yzk2LTliMzQtMjc3MjE4NjYzNGQ52SRhZGE2MDJkMi00ZjRiLTRmYjQtYTc2My04YTYzOWUwNWZmMzjZJGU0ZWY1MTQ1LWE2M2MtNGY5MS1hYzA0LTNiNWJmMTZjMDg0MtkkOTc0Nzk0MzctOWNlMy00YjMzLTkxMzQtMGYyYWY4OWJjY2I1pWR1clJGkKJyZpPZJDA5NzU1NDdkLTY3ZDktNGU2Yi04OGZmLWE5ZGQwNmE3ZjllZtkkOTE3OWFhNDAtYmI0MC00YTM2LWFlMWUtMDBhZTQyOTM1YTVm2SQyN2U2NTY4MC0yMmEwLTQwNzktYjZkZi1kNjBhMzIxOGU1MmWydXBzdHJlYW1fY2VsbHNfbWFwh6LOs5CnU2Nhbm5lcpChL5C1UHVsc2VEZXNpZ25lci5SRl9oYXJkkKLPgJChKpCtUHVsc2VEZXNpZ25lcpDZJDI3Njg2MjYyLTFhMWUtNDVmYS1iNGVlLTkwYWUxZDllZTM0ZYS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDI3Njg2MjYyLTFhMWUtNDVmYS1iNGVlLTkwYWUxZDllZTM0ZbRkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwgqdAbWRfc3RykKhnZXRpbmRleJDZJDZkZmUzMzhkLWRlODUtNGFkYi1iMDMwLTA5NDU1ZmFlNzhhMIS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDZkZmUzMzhkLWRlODUtNGFkYi1iMDMwLTA5NDU1ZmFlNzhhMLRkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwgqdAbWRfc3RykKhnZXRpbmRleJDZJDhlNDc0YWRkLTg2NTEtNDMxYi1iNDgxLTdhMTM5MDM3ZGJkMoS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDhlNDc0YWRkLTg2NTEtNDMxYi1iNDgxLTdhMTM5MDM3ZGJkMrRkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwhadAbWRfc3RykKdQbHV0b1VJkdkkZDZiMTcyOWEtODc0ZC0xMWVlLTE1MWEtOWIwZmNjZTJjNGZksFBsdXRvVUkuUmVzb3VyY2WQoj0+kKhnZXRpbmRleJDZJGZlOGJiY2QyLWU4ZjUtNDIyNS04MGMzLTQ3ZTczMTc2ZmIzZIS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJGZlOGJiY2QyLWU4ZjUtNDIyNS04MGMzLTQ3ZTczMTc2ZmIzZLRkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwgqdAbWRfc3RykKhnZXRpbmRleJDZJDFhODNkODk3LTcwNWItNDQzZC04OWE0LWVhNWUzZTZhM2MwN4S0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDFhODNkODk3LTcwNWItNDQzZC04OWE0LWVhNWUzZTZhM2MwN7Rkb3duc3RyZWFtX2NlbGxzX21hcIGyc2lnbmFsX3QyX3N0YXJfZ3JlktkkMThjODJmZjEtMGJkZS00ZmEwLTg0OGMtZDBlYjczZDFhYzdj2SQxYzc5YjM3ZS1kNGUwLTQ5MGYtOTQ2Ni0yMGNlMjhmMDE3YWWydXBzdHJlYW1fY2VsbHNfbWFwhaphZGR0cmFjZXMhkKl0X2FkY19ncmWR2SQ0MWQxNGRlYy1iODUyLTQzMTYtYWVmYi1jM2QwOGZhNDMyMTavcmF3X3QyX3N0YXJfZ3JlkdkkZTRlZjUxNDUtYTYzYy00ZjkxLWFjMDQtM2I1YmYxNmMwODQyq3Bsb3Rfc2lnbmFskKh0Ml9kZWNheZHZJDEyMzFiODMyLTQ3YjEtNGNjYi05YjU2LWE2NzgzODU5OGNjN9kkNGUxNDM0ZTEtNjczZi00MjA2LWEyNzEtOWVkZWMxMGViZDZhhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkNGUxNDM0ZTEtNjczZi00MjA2LWEyNzEtOWVkZWMxMGViZDZhtGRvd25zdHJlYW1fY2VsbHNfbWFwgalrc3BhY2Vfc2WR2SRjMDJmMzg5OC0xMGNiLTRmMWUtYjVlZi1lYjQyYjgwM2JhZWSydXBzdHJlYW1fY2VsbHNfbWFwgqtwbG90X2tzcGFjZZCmc2VxX3NlkdkkMjdlNjU2ODAtMjJhMC00MDc5LWI2ZGYtZDYwYTMyMThlNTJl2SQzMzU3YTI4My1hMjM0LTRkMTUtOGZkZi03ZmJlYzU4YjMzYTeEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQzMzU3YTI4My1hMjM0LTRkMTUtOGZkZi03ZmJlYzU4YjMzYTe0ZG93bnN0cmVhbV9jZWxsc19tYXCAsnVwc3RyZWFtX2NlbGxzX21hcISnQG1kX3N0cpCoUmVzb3VyY2WQoj0+kKhnZXRpbmRleJDZJDNhYmNhNDA2LTJlNmItNGIzNy04ODM1LTY1Y2ZhZDlkMGNhYYS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDNhYmNhNDA2LTJlNmItNGIzNy04ODM1LTY1Y2ZhZDlkMGNhYbRkb3duc3RyZWFtX2NlbGxzX21hcIGqa3NwYWNlX2dyZZHZJGMwMmYzODk4LTEwY2ItNGYxZS1iNWVmLWViNDJiODAzYmFlZLJ1cHN0cmVhbV9jZWxsc19tYXCCq3Bsb3Rfa3NwYWNlkKdzZXFfZ3JlkdkkOTE3OWFhNDAtYmI0MC00YTM2LWFlMWUtMDBhZTQyOTM1YTVm2SQwOTc1NTQ3ZC02N2Q5LTRlNmItODhmZi1hOWRkMDZhN2Y5ZWaEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQwOTc1NTQ3ZC02N2Q5LTRlNmItODhmZi1hOWRkMDZhN2Y5ZWa0ZG93bnN0cmVhbV9jZWxsc19tYXCBo3NlcZHZJGM0N2E1MGI4LWM5MzAtNGM5Ni05YjM0LTI3NzIxODY2MzRkObJ1cHN0cmVhbV9jZWxsc19tYXCFqHBsb3Rfc2VxkKErkKhTZXF1ZW5jZZCjYWRjkdkkMDI2NjYzMmQtNWNhNC00MTk2LWE1MjMtMzNhNjZkZDcwZTBjonJmkdkkYzZlMzNjYjgtZjQyYy00NjQzLTkyNTctMTI0ZDI4MDRkM2Rh2SQxMjMxYjgzMi00N2IxLTRjY2ItOWI1Ni1hNjc4Mzg1OThjYzeEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQxMjMxYjgzMi00N2IxLTRjY2ItOWI1Ni1hNjc4Mzg1OThjYze0ZG93bnN0cmVhbV9jZWxsc19tYXCCoXSQqHQyX2RlY2F5k9kkNDFkMTRkZWMtYjg1Mi00MzE2LWFlZmItYzNkMDhmYTQzMjE22SQxYTgzZDg5Ny03MDViLTQ0M2QtODlhNC1lYTVlM2U2YTNjMDfZJDFjNzliMzdlLWQ0ZTAtNDkwZi05NDY2LTIwY2UyOGYwMTdhZbJ1cHN0cmVhbV9jZWxsc19tYXCIo2V4cJChLZCnc2NhdHRlcpClcmFuZ2WQoS+QpHBsb3SQoSqQpkxheW91dJDZJDAyNjY2MzJkLTVjYTQtNDE5Ni1hNTIzLTMzYTY2ZGQ3MGUwY4S0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDAyNjY2MzJkLTVjYTQtNDE5Ni1hNTIzLTMzYTY2ZGQ3MGUwY7Rkb3duc3RyZWFtX2NlbGxzX21hcIGjYWRjkdkkMDk3NTU0N2QtNjdkOS00ZTZiLTg4ZmYtYTlkZDA2YTdmOWVmsnVwc3RyZWFtX2NlbGxzX21hcIGjQURDkLRjZWxsX2V4ZWN1dGlvbl9vcmRlctwALtkkZDZiMTcyOWEtODc0ZC0xMWVlLTE1MWEtOWIwZmNjZTJjNGZk2SQ1ZGY5Nzg3NC1mMDljLTQxNzMtYTJmNi04OTNkYjMyMmNjYWbZJDg1MjlmMzZkLTJkMzktNGI0NS1hODIxLTAxYzgzNDY1MzlmZNkkNmRmZTMzOGQtZGU4NS00YWRiLWIwMzAtMDk0NTVmYWU3OGEw2SQ4ZTQ3NGFkZC04NjUxLTQzMWItYjQ4MS03YTEzOTAzN2RiZDLZJGM2ZTMzY2I4LWY0MmMtNDY0My05MjU3LTEyNGQyODA0ZDNkYdkkMDI2NjYzMmQtNWNhNC00MTk2LWE1MjMtMzNhNjZkZDcwZTBj2SQwOTc1NTQ3ZC02N2Q5LTRlNmItODhmZi1hOWRkMDZhN2Y5ZWbZJGYxMWEyZmEyLWVmZjktNDk3OS1iNzM5LTNkYTJiMjRhOWE0NdkkZDE2ZWZhNjItZGNlNy00ZWMzLTllM2MtYjVlMTY3NzM3N2Zj2SQzNWZmMzQwMi1kYzM2LTRiOTEtYmVjOS1iNGQyMWZhZjNlNjjZJGVhNTQyMjcxLTAxYzItNDk2Mi1hNzA4LTgwNGIyM2E4NjFiOdkkYzQ3YTUwYjgtYzkzMC00Yzk2LTliMzQtMjc3MjE4NjYzNGQ52SQ3YTY2YWI0Ny05MThmLTQ1ODItODk1Zi0xYjQ2OTA1NjIwNTHZJDEyMzFiODMyLTQ3YjEtNGNjYi05YjU2LWE2NzgzODU5OGNjN9kkZTRjODBjMjQtMjBmZC00MmU1LTlkY2QtYTY1OTU4NTY5YzAx2SQ3NDY2NmMxYS0yNjczLTQ5MzYtOTgyYi02MjI5YmY5MmFmNjbZJDBmOTZhODNkLTk2ZWYtNDc2OC05MzMwLTg3YzQ2NmUzNWM5M9kkOTE3OWFhNDAtYmI0MC00YTM2LWFlMWUtMDBhZTQyOTM1YTVm2SQ4YjRhMWFkOS0yZDZhLTRjOGYtYmI4ZS1mNDNjMmQwNTgxOTXZJDNhYmNhNDA2LTJlNmItNGIzNy04ODM1LTY1Y2ZhZDlkMGNhYdkkYWRhNjAyZDItNGY0Yi00ZmI0LWE3NjMtOGE2MzllMDVmZjM42SQ5YTg4YTU0Yi1iY2M3LTQxYWQtOGU2MC1mNGQ0NTBkY2NiMmTZJDQxZDE0ZGVjLWI4NTItNDMxNi1hZWZiLWMzZDA4ZmE0MzIxNtkkOTcxMDRjNDYtZTgxZi00NDRhLTk1N2YtMGJiYjFiMDJmMWI42SRlZTdlODFlNy00ODRjLTQ0YTgtYTE5MS1mNzNlMjQ3MDdjZTnZJDJlZTdiYTQ3LTAyZTUtNGIwMi1hMTYyLWRkYmQ1ZWQ0N2M3YtkkMjc2ODYyNjItMWExZS00NWZhLWI0ZWUtOTBhZTFkOWVlMzRl2SRlNGVmNTE0NS1hNjNjLTRmOTEtYWMwNC0zYjViZjE2YzA4NDLZJDFhODNkODk3LTcwNWItNDQzZC04OWE0LWVhNWUzZTZhM2MwN9kkMThjODJmZjEtMGJkZS00ZmEwLTg0OGMtZDBlYjczZDFhYzdj2SQ0YTRhNmJkMy1iODIwLTQ3OWMtODllMy1mM2NlNzlhMzE2ZGLZJDk2NDQwNGY2LTdmNDYtNGRmOS1hZDk4LTkyMTk0OGMzYmU2OdkkMzM1N2EyODMtYTIzNC00ZDE1LThmZGYtN2ZiZWM1OGIzM2E32SQyN2U2NTY4MC0yMmEwLTQwNzktYjZkZi1kNjBhMzIxOGU1MmXZJGYxZjNiNzAwLTU5MTYtNDk2Zi1iOTM4LTQ2ZjdmMDhiNGViNtkkNGUxNDM0ZTEtNjczZi00MjA2LWEyNzEtOWVkZWMxMGViZDZh2SRjMDJmMzg5OC0xMGNiLTRmMWUtYjVlZi1lYjQyYjgwM2JhZWTZJDQ1OTUyNTEyLWFhZjEtNDNkOC1hOTVlLWMzMmJiMjYzM2Y0MtkkOTc0Nzk0MzctOWNlMy00YjMzLTkxMzQtMGYyYWY4OWJjY2I12SQxYzc5YjM3ZS1kNGUwLTQ5MGYtOTQ2Ni0yMGNlMjhmMDE3YWXZJDJlNjVhZTMxLWY1MGEtNDYyYi05NzQ0LTgwYmY2Y2RiMzg4ZdkkMzQ4MjRkYjctMTNjNC00NWUyLWJlZmEtZjAyN2I5YjU4NWMw2SRmZThiYmNkMi1lOGY1LTQyMjUtODBjMy00N2U3MzE3NmZiM2TZJGFiOGRjMWNlLWQxZWYtNDNhMC05NDk1LWRhYzkzMWI1MmFlY9kkNThiZTQxNTAtMmI3YS00ZjllLWE3ZDctNDBhMDg2ZmQzYTUztGxhc3RfaG90X3JlbG9hZF90aW1lywAAAAAAAAAAqXNob3J0cGF0aL0wMS1ncmFkaWVudC1lY2hvLXNwaW4tZWNoby5qbK5wcm9jZXNzX3N0YXR1c6VyZWFkeaRwYXRo2V0vaG9tZS9ydW5uZXIvd29yay9Lb21hTVJJLmpsL0tvbWFNUkkuamwvZG9jcy9zcmMvdHV0b3JpYWwtcGx1dG8vMDEtZ3JhZGllbnQtZWNoby1zcGluLWVjaG8uamytcGx1dG9fdmVyc2lvbqh2MC4xOS40Nq5sYXN0X3NhdmVfdGltZctB2b+i8HK8VqpjZWxsX29yZGVy3AAu2SQ1ZGY5Nzg3NC1mMDljLTQxNzMtYTJmNi04OTNkYjMyMmNjYWbZJDg1MjlmMzZkLTJkMzktNGI0NS1hODIxLTAxYzgzNDY1MzlmZNkkNmRmZTMzOGQtZGU4NS00YWRiLWIwMzAtMDk0NTVmYWU3OGEw2SRkNmIxNzI5YS04NzRkLTExZWUtMTUxYS05YjBmY2NlMmM0ZmTZJDhlNDc0YWRkLTg2NTEtNDMxYi1iNDgxLTdhMTM5MDM3ZGJkMtkkYzZlMzNjYjgtZjQyYy00NjQzLTkyNTctMTI0ZDI4MDRkM2Rh2SQwMjY2NjMyZC01Y2E0LTQxOTYtYTUyMy0zM2E2NmRkNzBlMGPZJDA5NzU1NDdkLTY3ZDktNGU2Yi04OGZmLWE5ZGQwNmE3ZjllZtkkZjExYTJmYTItZWZmOS00OTc5LWI3MzktM2RhMmIyNGE5YTQ12SRkMTZlZmE2Mi1kY2U3LTRlYzMtOWUzYy1iNWUxNjc3Mzc3ZmPZJDM1ZmYzNDAyLWRjMzYtNGI5MS1iZWM5LWI0ZDIxZmFmM2U2ONkkZWE1NDIyNzEtMDFjMi00OTYyLWE3MDgtODA0YjIzYTg2MWI52SRjNDdhNTBiOC1jOTMwLTRjOTYtOWIzNC0yNzcyMTg2NjM0ZDnZJDdhNjZhYjQ3LTkxOGYtNDU4Mi04OTVmLTFiNDY5MDU2MjA1MdkkMTIzMWI4MzItNDdiMS00Y2NiLTliNTYtYTY3ODM4NTk4Y2M32SRlNGM4MGMyNC0yMGZkLTQyZTUtOWRjZC1hNjU5NTg1NjljMDHZJDkxNzlhYTQwLWJiNDAtNGEzNi1hZTFlLTAwYWU0MjkzNWE1ZtkkOGI0YTFhZDktMmQ2YS00YzhmLWJiOGUtZjQzYzJkMDU4MTk12SQzYWJjYTQwNi0yZTZiLTRiMzctODgzNS02NWNmYWQ5ZDBjYWHZJDc0NjY2YzFhLTI2NzMtNDkzNi05ODJiLTYyMjliZjkyYWY2NtkkYWRhNjAyZDItNGY0Yi00ZmI0LWE3NjMtOGE2MzllMDVmZjM42SQ0MWQxNGRlYy1iODUyLTQzMTYtYWVmYi1jM2QwOGZhNDMyMTbZJDlhODhhNTRiLWJjYzctNDFhZC04ZTYwLWY0ZDQ1MGRjY2IyZNkkMGY5NmE4M2QtOTZlZi00NzY4LTkzMzAtODdjNDY2ZTM1Yzkz2SQ5NzEwNGM0Ni1lODFmLTQ0NGEtOTU3Zi0wYmJiMWIwMmYxYjjZJGVlN2U4MWU3LTQ4NGMtNDRhOC1hMTkxLWY3M2UyNDcwN2NlOdkkMmVlN2JhNDctMDJlNS00YjAyLWExNjItZGRiZDVlZDQ3Yzdi2SQyNzY4NjI2Mi0xYTFlLTQ1ZmEtYjRlZS05MGFlMWQ5ZWUzNGXZJGU0ZWY1MTQ1LWE2M2MtNGY5MS1hYzA0LTNiNWJmMTZjMDg0MtkkMWE4M2Q4OTctNzA1Yi00NDNkLTg5YTQtZWE1ZTNlNmEzYzA32SQxOGM4MmZmMS0wYmRlLTRmYTAtODQ4Yy1kMGViNzNkMWFjN2PZJDRhNGE2YmQzLWI4MjAtNDc5Yy04OWUzLWYzY2U3OWEzMTZkYtkkOTY0NDA0ZjYtN2Y0Ni00ZGY5LWFkOTgtOTIxOTQ4YzNiZTY52SQzMzU3YTI4My1hMjM0LTRkMTUtOGZkZi03ZmJlYzU4YjMzYTfZJDI3ZTY1NjgwLTIyYTAtNDA3OS1iNmRmLWQ2MGEzMjE4ZTUyZdkkZjFmM2I3MDAtNTkxNi00OTZmLWI5MzgtNDZmN2YwOGI0ZWI22SQ0ZTE0MzRlMS02NzNmLTQyMDYtYTI3MS05ZWRlYzEwZWJkNmHZJGMwMmYzODk4LTEwY2ItNGYxZS1iNWVmLWViNDJiODAzYmFlZNkkNDU5NTI1MTItYWFmMS00M2Q4LWE5NWUtYzMyYmIyNjMzZjQy2SQ5NzQ3OTQzNy05Y2UzLTRiMzMtOTEzNC0wZjJhZjg5YmNjYjXZJDFjNzliMzdlLWQ0ZTAtNDkwZi05NDY2LTIwY2UyOGYwMTdhZdkkMmU2NWFlMzEtZjUwYS00NjJiLTk3NDQtODBiZjZjZGIzODhl2SQzNDgyNGRiNy0xM2M0LTQ1ZTItYmVmYS1mMDI3YjliNTg1YzDZJGZlOGJiY2QyLWU4ZjUtNDIyNS04MGMzLTQ3ZTczMTc2ZmIzZNkkYWI4ZGMxY2UtZDFlZi00M2EwLTk0OTUtZGFjOTMxYjUyYWVj2SQ1OGJlNDE1MC0yYjdhLTRmOWUtYTdkNy00MGEwODZmZDNhNTOxcHVibGlzaGVkX29iamVjdHPeABPZNGIzYjg0MDhjLTgxODEtMTFlZi0xNGViLWUxYzU2OWI4YmIyOS80OGEyYzY0NGE0ZjRlNDaEpmxheW91dIqqc2hvd2xlZ2VuZMKmeGF4aXMxgqZkb21haW7XFwAAAAA/6ZM+pmFuY2hvcqJ5MaZ4YXhpczKCpmRvbWFpbtcXYQu2PlD6JD+mYW5jaG9yonkyqHRlbXBsYXRlgqZsYXlvdXTeABOpY29sb3JheGlzgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApXhheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Zalob3Zlcm1vZGWnY2xvc2VzdK1wYXBlcl9iZ2NvbG9ypXdoaXRlo2dlb4apc2hvd2xha2Vzw6hzaG93bGFuZMOpbGFuZGNvbG9ypyNFNUVDRjanYmdjb2xvcqV3aGl0ZaxzdWJ1bml0Y29sb3Kld2hpdGWpbGFrZWNvbG9ypXdoaXRlqmNvbG9yc2NhbGWDqnNlcXVlbnRpYWyaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGpZGl2ZXJnaW5nm5LKAAAAAKcjOGUwMTUykso9zMzNpyNjNTFiN2SSyj5MzM2nI2RlNzdhZZLKPpmZmqcjZjFiNmRhkso+zMzNpyNmZGUwZWaSyj8AAACnI2Y3ZjdmN5LKPxmZmqcjZTZmNWQwkso/MzMzpyNiOGUxODaSyj9MzM2nIzdmYmM0MZLKP2ZmZqcjNGQ5MjIxkso/gAAApyMyNzY0MTmvc2VxdWVudGlhbG1pbnVzmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxpXlheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Za1zaGFwZWRlZmF1bHRzgaRsaW5lgaVjb2xvcqcjMmEzZjVmqmhvdmVybGFiZWyBpWFsaWdupGxlZnSmbWFwYm94gaVzdHlsZaVsaWdodKVwb2xhcoOrYW5ndWxhcmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqpyYWRpYWxheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0Za9hdXRvdHlwZW51bWJlcnOmc3RyaWN0pGZvbnSBpWNvbG9ypyMyYTNmNWandGVybmFyeYSlYWF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqVjYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWlYmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlsmFubm90YXRpb25kZWZhdWx0c4OpYXJyb3doZWFkygAAAACqYXJyb3d3aWR0aMo/gAAAqmFycm93Y29sb3KnIzJhM2Y1ZqxwbG90X2JnY29sb3KnI0U1RUNGNqV0aXRsZYGheMo9TMzNpXNjZW5lg6V4YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWlemF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXlheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0Zahjb2xvcndheZqnIzYzNmVmYacjRUY1NTNCpyMwMGNjOTanI2FiNjNmYacjRkZBMTVBpyMxOWQzZjOnI0ZGNjY5MqcjQjZFODgwpyNGRjk3RkanI0ZFQ0I1MqRkYXRh3gAZrnNjYXR0ZXJwb2xhcmdskYKkdHlwZa5zY2F0dGVycG9sYXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmY2FycGV0kYOlYmF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaR0eXBlpmNhcnBldKVhYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlrHNjYXR0ZXJwb2xhcpGCpHR5cGWsc2NhdHRlcnBvbGFypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKlwYXJjb29yZHORgqRsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpcGFyY29vcmRzp3NjYXR0ZXKRgqR0eXBlp3NjYXR0ZXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAsmhpc3RvZ3JhbTJkY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZbJoaXN0b2dyYW0yZGNvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMadjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2NvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVyY2FycGV0kYKkdHlwZa1zY2F0dGVyY2FycGV0pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZtZXNoM2SRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWmbWVzaDNkp3N1cmZhY2WRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnc3VyZmFjZapjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJtYXBib3iRgqR0eXBlrXNjYXR0ZXJtYXBib3imbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqnNjYXR0ZXJnZW+RgqR0eXBlqnNjYXR0ZXJnZW+mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqWhpc3RvZ3JhbZGCpHR5cGWpaGlzdG9ncmFtpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKNwaWWRgqR0eXBlo3BpZaphdXRvbWFyZ2luw6pjaG9yb3BsZXRokYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqmNob3JvcGxldGipaGVhdG1hcGdskYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqWhlYXRtYXBnbKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxo2JhcpGEpHR5cGWjYmFyp2Vycm9yX3mBpWNvbG9ypyMyYTNmNWanZXJyb3JfeIGlY29sb3KnIzJhM2Y1ZqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKdoZWF0bWFwkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2hlYXRtYXCqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1jb250b3VyY2FycGV0kYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlrWNvbnRvdXJjYXJwZXSldGFibGWRg6R0eXBlpXRhYmxlpmhlYWRlcoKkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0M4RDRFM6VjZWxsc4KkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0VCRjBGOKlzY2F0dGVyM2SRg6RsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpc2NhdHRlcjNkpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKhiYXJwb2xhcpGCpHR5cGWoYmFycG9sYXKmbWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACpc2NhdHRlcmdskYKkdHlwZalzY2F0dGVyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAq2hpc3RvZ3JhbTJkkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlq2hpc3RvZ3JhbTJkqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGuc2NhdHRlcnRlcm5hcnmRgqR0eXBlrnNjYXR0ZXJ0ZXJuYXJ5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pWNvdW50yj+AAACBpHN0ZXCjYWxspXRpdGxlgaR0ZXh0oKZkb21haW7XF2ELtj5Q+iQ/pXJhbmdlkK16ZXJvbGluZWNvbG9ypXdoaXRlqnRpY2tzdWZmaXijIG1zpmFuY2hvcqJ5Mqh0ZW1wbGF0ZYKmbGF5b3V03gATqWNvbG9yYXhpc4GoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKV4YXhpc4epZ3JpZGNvbG9ypXdoaXRlrXplcm9saW5ld2lkdGjKQAAAAKV0aXRsZYGoc3RhbmRvZmbKQXAAAKV0aWNrc6CtemVyb2xpbmVjb2xvcqV3aGl0ZaphdXRvbWFyZ2luw6lsaW5lY29sb3Kld2hpdGWpaG92ZXJtb2Rlp2Nsb3Nlc3StcGFwZXJfYmdjb2xvcqV3aGl0ZaNnZW+GqXNob3dsYWtlc8Ooc2hvd2xhbmTDqWxhbmRjb2xvcqcjRTVFQ0Y2p2JnY29sb3Kld2hpdGWsc3VidW5pdGNvbG9ypXdoaXRlqWxha2Vjb2xvcqV3aGl0Zapjb2xvcnNjYWxlg6pzZXF1ZW50aWFsmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxqWRpdmVyZ2luZ5uSygAAAACnIzhlMDE1MpLKPczMzacjYzUxYjdkkso+TMzNpyNkZTc3YWWSyj6ZmZqnI2YxYjZkYZLKPszMzacjZmRlMGVmkso/AAAApyNmN2Y3ZjeSyj8ZmZqnI2U2ZjVkMJLKPzMzM6cjYjhlMTg2kso/TMzNpyM3ZmJjNDGSyj9mZmanIzRkOTIyMZLKP4AAAKcjMjc2NDE5r3NlcXVlbnRpYWxtaW51c5qSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMaV5YXhpc4epZ3JpZGNvbG9ypXdoaXRlrXplcm9saW5ld2lkdGjKQAAAAKV0aXRsZYGoc3RhbmRvZmbKQXAAAKV0aWNrc6CtemVyb2xpbmVjb2xvcqV3aGl0ZaphdXRvbWFyZ2luw6lsaW5lY29sb3Kld2hpdGWtc2hhcGVkZWZhdWx0c4GkbGluZYGlY29sb3KnIzJhM2Y1Zqpob3ZlcmxhYmVsgaVhbGlnbqRsZWZ0pm1hcGJveIGlc3R5bGWlbGlnaHSlcG9sYXKDq2FuZ3VsYXJheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZadiZ2NvbG9ypyNFNUVDRjaqcmFkaWFsYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWvYXV0b3R5cGVudW1iZXJzpnN0cmljdKRmb250gaVjb2xvcqcjMmEzZjVmp3Rlcm5hcnmEpWFheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZadiZ2NvbG9ypyNFNUVDRjalY2F4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlpWJheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZbJhbm5vdGF0aW9uZGVmYXVsdHODqWFycm93aGVhZMoAAAAAqmFycm93d2lkdGjKP4AAAKphcnJvd2NvbG9ypyMyYTNmNWascGxvdF9iZ2NvbG9ypyNFNUVDRjaldGl0bGWBoXjKPUzMzaVzY2VuZYOleGF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXpheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0ZaV5YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWoY29sb3J3YXmapyM2MzZlZmGnI0VGNTUzQqcjMDBjYzk2pyNhYjYzZmGnI0ZGQTE1QacjMTlkM2YzpyNGRjY2OTKnI0I2RTg4MKcjRkY5N0ZGpyNGRUNCNTKkZGF0Yd4AGa5zY2F0dGVycG9sYXJnbJGCpHR5cGWuc2NhdHRlcnBvbGFyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApmNhcnBldJGDpWJheGlzhalncmlkY29sb3Kld2hpdGWsZW5kbGluZWNvbG9ypyMyYTNmNWaubWlub3JncmlkY29sb3Kld2hpdGWuc3RhcnRsaW5lY29sb3KnIzJhM2Y1ZqlsaW5lY29sb3Kld2hpdGWkdHlwZaZjYXJwZXSlYWF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaxzY2F0dGVycG9sYXKRgqR0eXBlrHNjYXR0ZXJwb2xhcqZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACpcGFyY29vcmRzkYKkbGluZYGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqXBhcmNvb3Jkc6dzY2F0dGVykYKkdHlwZadzY2F0dGVypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAALJoaXN0b2dyYW0yZGNvbnRvdXKRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWyaGlzdG9ncmFtMmRjb250b3VyqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGnY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadjb250b3VyqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtc2NhdHRlcmNhcnBldJGCpHR5cGWtc2NhdHRlcmNhcnBldKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmbWVzaDNkkYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlpm1lc2gzZKdzdXJmYWNlkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp3N1cmZhY2WqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVybWFwYm94kYKkdHlwZa1zY2F0dGVybWFwYm94pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKpzY2F0dGVyZ2VvkYKkdHlwZapzY2F0dGVyZ2Vvpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKloaXN0b2dyYW2RgqR0eXBlqWhpc3RvZ3JhbaZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACjcGllkYKkdHlwZaNwaWWqYXV0b21hcmdpbsOqY2hvcm9wbGV0aJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZapjaG9yb3BsZXRoqWhlYXRtYXBnbJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZaloZWF0bWFwZ2yqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMaNiYXKRhKR0eXBlo2JhcqdlcnJvcl95gaVjb2xvcqcjMmEzZjVmp2Vycm9yX3iBpWNvbG9ypyMyYTNmNWambWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACnaGVhdG1hcJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadoZWF0bWFwqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtY29udG91cmNhcnBldJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZa1jb250b3VyY2FycGV0pXRhYmxlkYOkdHlwZaV0YWJsZaZoZWFkZXKCpGxpbmWBpWNvbG9ypXdoaXRlpGZpbGyBpWNvbG9ypyNDOEQ0RTOlY2VsbHOCpGxpbmWBpWNvbG9ypXdoaXRlpGZpbGyBpWNvbG9ypyNFQkYwRjipc2NhdHRlcjNkkYOkbGluZYGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqXNjYXR0ZXIzZKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACoYmFycG9sYXKRgqR0eXBlqGJhcnBvbGFypm1hcmtlcoGkbGluZYKlY29sb3KnI0U1RUNGNqV3aWR0aMo/AAAAqXNjYXR0ZXJnbJGCpHR5cGWpc2NhdHRlcmdspm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKtoaXN0b2dyYW0yZJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZatoaXN0b2dyYW0yZKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrnNjYXR0ZXJ0ZXJuYXJ5kYKkdHlwZa5zY2F0dGVydGVybmFyeaZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmeWF4aXMzhqlncmlkY29sb3Kld2hpdGWlcmFuZ2XXFwAAoMAAAIRBpmRvbWFpbtcXAAAAAAAAgD+temVyb2xpbmVjb2xvcqV3aGl0ZaZhbmNob3KieDOqZml4ZWRyYW5nZcKmeWF4aXMxhqlncmlkY29sb3Kld2hpdGWlcmFuZ2XXFwAAoMAAAIRBpmRvbWFpbtcXAAAAAAAAgD+temVyb2xpbmVjb2xvcqV3aGl0ZaZhbmNob3KieDGqZml4ZWRyYW5nZcKmeWF4aXMyhqlncmlkY29sb3Kld2hpdGWlcmFuZ2XXFwAAoMAAAIRBpmRvbWFpbtcXAAAAAAAAgD+temVyb2xpbmVjb2xvcqV3aGl0ZaZhbmNob3KieDKqZml4ZWRyYW5nZcKmeGF4aXMziatyYW5nZXNsaWRlcoGndmlzaWJsZcKpZ3JpZGNvbG9ypXdoaXRlrXJhbmdlc2VsZWN0b3KBp2J1dHRvbnOShKRzdGVwykEgAACoc3RlcG1vZGWoYmFja3dhcmSlbGFiZWyiMW2lY291bnTKP4AAAIGkc3RlcKNhbGyldGl0bGWBpHRleHSgpmRvbWFpbtcXYQs2PwAAgD+lcmFuZ2WQrXplcm9saW5lY29sb3Kld2hpdGWqdGlja3N1ZmZpeKMgbXOmYW5jaG9yonkzq2Fubm90YXRpb25zk4mneWFuY2hvcqZi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dK1wYXBlcl9iZ2NvbG9ypXdoaXRlo2dlb4apc2hvd2xha2Vzw6hzaG93bGFuZMOpbGFuZGNvbG9ypyNFNUVDRjanYmdjb2xvcqV3aGl0ZaxzdWJ1bml0Y29sb3Kld2hpdGWpbGFrZWNvbG9ypXdoaXRlqmNvbG9yc2NhbGWDqnNlcXVlbnRpYWyaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGpZGl2ZXJnaW5nm5LKAAAAAKcjOGUwMTUykso9zMzNpyNjNTFiN2SSyj5MzM2nI2RlNzdhZZLKPpmZmqcjZjFiNmRhkso+zMzNpyNmZGUwZWaSyj8AAACnI2Y3ZjdmN5LKPxmZmqcjZTZmNWQwkso/MzMzpyNiOGUxODaSyj9MzM2nIzdmYmM0MZLKP2ZmZqcjNGQ5MjIxkso/gAAApyMyNzY0MTmvc2VxdWVudGlhbG1pbnVzmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxpXlheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Za1zaGFwZWRlZmF1bHRzgaRsaW5lgaVjb2xvcqcjMmEzZjVmqmhvdmVybGFiZWyBpWFsaWdupGxlZnSmbWFwYm94gaVzdHlsZaVsaWdodKVwb2xhcoOrYW5ndWxhcmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqpyYWRpYWxheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0Za9hdXRvdHlwZW51bWJlcnOmc3RyaWN0pGZvbnSBpWNvbG9ypyMyYTNmNWandGVybmFyeYSlYWF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqVjYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWlYmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlsmFubm90YXRpb25kZWZhdWx0c4OpYXJyb3doZWFkygAAAACqYXJyb3d3aWR0aMo/gAAAqmFycm93Y29sb3KnIzJhM2Y1ZqxwbG90X2JnY29sb3KnI0U1RUNGNqV0aXRsZYGheMo9TMzNpXNjZW5lg6V4YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWlemF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXlheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0Zahjb2xvcndheZqnIzYzNmVmYacjRUY1NTNCpyMwMGNjOTanI2FiNjNmYacjRkZBMTVBpyMxOWQzZjOnI0ZGNjY5MqcjQjZFODgwpyNGRjk3RkanI0ZFQ0I1MqRkYXRh3gAZrnNjYXR0ZXJwb2xhcmdskYKkdHlwZa5zY2F0dGVycG9sYXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmY2FycGV0kYOlYmF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaR0eXBlpmNhcnBldKVhYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlrHNjYXR0ZXJwb2xhcpGCpHR5cGWsc2NhdHRlcnBvbGFypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKlwYXJjb29yZHORgqRsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpcGFyY29vcmRzp3NjYXR0ZXKRgqR0eXBlp3NjYXR0ZXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAsmhpc3RvZ3JhbTJkY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZbJoaXN0b2dyYW0yZGNvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMadjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2NvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVyY2FycGV0kYKkdHlwZa1zY2F0dGVyY2FycGV0pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZtZXNoM2SRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWmbWVzaDNkp3N1cmZhY2WRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnc3VyZmFjZapjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJtYXBib3iRgqR0eXBlrXNjYXR0ZXJtYXBib3imbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqnNjYXR0ZXJnZW+RgqR0eXBlqnNjYXR0ZXJnZW+mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqWhpc3RvZ3JhbZGCpHR5cGWpaGlzdG9ncmFtpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKNwaWWRgqR0eXBlo3BpZaphdXRvbWFyZ2luw6pjaG9yb3BsZXRokYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqmNob3JvcGxldGipaGVhdG1hcGdskYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqWhlYXRtYXBnbKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxo2JhcpGEpHR5cGWjYmFyp2Vycm9yX3mBpWNvbG9ypyMyYTNmNWanZXJyb3JfeIGlY29sb3KnIzJhM2Y1ZqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKdoZWF0bWFwkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2hlYXRtYXCqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1jb250b3VyY2FycGV0kYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlrWNvbnRvdXJjYXJwZXSldGFibGWRg6R0eXBlpXRhYmxlpmhlYWRlcoKkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0M4RDRFM6VjZWxsc4KkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0VCRjBGOKlzY2F0dGVyM2SRg6RsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpc2NhdHRlcjNkpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKhiYXJwb2xhcpGCpHR5cGWoYmFycG9sYXKmbWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACpc2NhdHRlcmdskYKkdHlwZalzY2F0dGVyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAq2hpc3RvZ3JhbTJkkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlq2hpc3RvZ3JhbTJkqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGuc2NhdHRlcnRlcm5hcnmRgqR0eXBlrnNjYXR0ZXJ0ZXJuYXJ5pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZoZWlnaHTKRBYAAKV5YXhpc4SpZ3JpZGNvbG9ypXdoaXRlq3NjYWxlYW5jaG9yoXildGl0bGWBpHRleHShea16ZXJvbGluZWNvbG9ypXdoaXRlpGZvbnSBpWNvbG9ypGdyYXmlc2NlbmWFpXhheGlzhqlncmlkY29sb3Kld2hpdGWvYmFja2dyb3VuZGNvbG9ysHJnYigyMjksMjM2LDI0NimldGl0bGWheKVyYW5nZdcXzczMvc3MzD2qdGlja3N1ZmZpeKMgY22temVyb2xpbmVjb2xvcqV3aGl0Zathc3BlY3RyYXRpb4Oheco/gAAAoXrKP4AAAKF4yj+AAACleWF4aXOGqWdyaWRjb2xvcqV3aGl0Za9iYWNrZ3JvdW5kY29sb3KwcmdiKDIyOSwyMzYsMjQ2KaV0aXRsZaF5pXJhbmdl1xfNzMy9zczMPap0aWNrc3VmZml4oyBjba16ZXJvbGluZWNvbG9ypXdoaXRlpXpheGlzhqlncmlkY29sb3Kld2hpdGWvYmFja2dyb3VuZGNvbG9ysHJnYigyMjksMjM2LDI0NimldGl0bGWheqVyYW5nZdcXzczMvc3MzD2qdGlja3N1ZmZpeKMgY22temVyb2xpbmVjb2xvcqV3aGl0Zaphc3BlY3Rtb2Rlpm1hbnVhbKV0aXRsZalzcGluczogVDGscGxvdF9iZ2NvbG9ysHJnYigyMjksMjM2LDI0NimmbWFyZ2luhKFsygAAAAChYspCSAAAoXLKAAAAAKF0ykJIAACmY29uZmlniLZtb2RlQmFyQnV0dG9uc1RvUmVtb3ZllqR6b29to3Bhbq10YWJsZVJvdGF0aW9utXJlc2V0Q2FtZXJhTGFzdFNhdmUzZK1vcmJpdFJvdGF0aW9utHJlc2V0Q2FtZXJhRGVmYXVsdDNkq2Rpc3BsYXlsb2dvwrR0b0ltYWdlQnV0dG9uT3B0aW9uc4GmZm9ybWF0o3N2Z6hzaG93TGlua8KoZWRpdGFibGXCqnJlc3BvbnNpdmXDqnN0YXRpY1Bsb3TCqnNjcm9sbFpvb23DpmZyYW1lc5CkZGF0YZGIpm1hcmtlcoelY29sb3LHUBcAAPpD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yj1iH02rcmdiKDksNiwxOSmSyj1jo86rcmdiKDksNiwxOSmSyj1lKFCrcmdiKDksNiwyMCmSyj1mrNGscmdiKDEwLDYsMjApkso9aDFSrHJnYigxMCw2LDIwKZLKPWm11KxyZ2IoMTAsNiwyMSmSyj1rOlWscmdiKDEwLDYsMjEpkso9bL7XrHJnYigxMCw3LDIxKZLKPW5DWKxyZ2IoMTAsNywyMimSyj1vx9mscmdiKDExLDcsMjIpkso9cUxbrHJnYigxMSw3LDIyKZLKPXLQ3KxyZ2IoMTEsNywyMymSyj10VV2scmdiKDExLDcsMjMpkso9ddnfrHJnYigxMSw3LDIzKZLKPXdeYKxyZ2IoMTIsNywyNCmSyj144uKscmdiKDEyLDcsMjQpkso9emdjrHJnYigxMiw3LDI0KZLKPXvr5KxyZ2IoMTIsOCwyNSmSyj19cGascmdiKDEzLDgsMjUpkso9fvTnrHJnYigxMyw4LDI1KZLKPYA8tKxyZ2IoMTMsOCwyNimSyj2A/vWscmdiKDEzLDgsMjYpkso9gcE2rHJnYigxMyw4LDI2KZLKPYKDdqxyZ2IoMTQsOCwyNymSyj2DRbescmdiKDE0LDgsMjcpkso9hAf4rHJnYigxNCw4LDI3KZLKPYTKOKxyZ2IoMTQsOCwyOCmSyj2FjHmscmdiKDE1LDksMjgpkso9hk66rHJnYigxNSw5LDI4KZLKPYcQ+qxyZ2IoMTUsOSwyOSmSyj2H0zuscmdiKDE1LDksMjkpkso9iJV8rHJnYigxNiw5LDMwKZLKPYlXvKxyZ2IoMTYsOSwzMCmSyj2KGf2scmdiKDE2LDksMzApkso9itw+rHJnYigxNiw5LDMxKZLKPYuef6xyZ2IoMTcsOSwzMSmSyj2MYL+tcmdiKDE3LDEwLDMxKZLKPY0jAK1yZ2IoMTcsMTAsMzIpkso9jeVBrXJnYigxNywxMCwzMimSyj2Op4GtcmdiKDE3LDEwLDMyKZLKPY9pwq1yZ2IoMTgsMTAsMzMpkso9kCwDrXJnYigxOCwxMCwzMymSyj2Q7kOtcmdiKDE4LDEwLDMzKZLKPZGwhK1yZ2IoMTksMTAsMzQpkso9knLFrXJnYigxOSwxMCwzNCmSyj2TNQWtcmdiKDE5LDExLDM1KZLKPZP3Rq1yZ2IoMTksMTEsMzUpkso9lLmHrXJnYigyMCwxMSwzNSmSyj2Ve8etcmdiKDIwLDExLDM2KZLKPZY+CK1yZ2IoMjAsMTEsMzYpkso9lwBJrXJnYigyMCwxMSwzNimSyj2XwoqtcmdiKDIxLDExLDM3KZLKPZiEyq1yZ2IoMjEsMTEsMzcpkso9mUcLrXJnYigyMSwxMSwzNymSyj2aCUytcmdiKDIxLDExLDM4KZLKPZrLjK1yZ2IoMjIsMTIsMzgpkso9m43NrXJnYigyMiwxMiwzOCmSyj2cUA6tcmdiKDIyLDEyLDM5KZLKPZ0STq1yZ2IoMjMsMTIsMzkpkso9ndSPrXJnYigyMywxMiw0MCmSyj2eltCtcmdiKDIzLDEyLDQwKZLKPZ9ZEK1yZ2IoMjMsMTIsNDApkso9oBtRrXJnYigyNCwxMiw0MSmSyj2g3ZKtcmdiKDI0LDEyLDQxKZLKPaGf0q1yZ2IoMjQsMTMsNDEpkso9omITrXJnYigyNSwxMyw0MimSyj2jJFStcmdiKDI1LDEzLDQyKZLKPaPmla1yZ2IoMjUsMTMsNDIpkso9pKjVrXJnYigyNSwxMyw0MymSyj2laxatcmdiKDI2LDEzLDQzKZLKPaYtV61yZ2IoMjYsMTMsNDMpkso9pu+XrXJnYigyNiwxMyw0NCmSyj2nsditcmdiKDI3LDEzLDQ0KZLKPah0Ga1yZ2IoMjcsMTMsNDUpkso9qTZZrXJnYigyNywxNCw0NSmSyj2p+JqtcmdiKDI4LDE0LDQ1KZLKPaq6261yZ2IoMjgsMTQsNDYpkso9q30brXJnYigyOCwxNCw0NimSyj2sP1ytcmdiKDI4LDE0LDQ2KZLKPa0Bna1yZ2IoMjksMTQsNDcpkso9rcPdrXJnYigyOSwxNCw0NymSyj2uhh6tcmdiKDI5LDE0LDQ3KZLKPa9IX61yZ2IoMzAsMTQsNDgpkso9sAqgrXJnYigzMCwxNSw0OCmSyj2wzOCtcmdiKDMwLDE1LDQ4KZLKPbGPIa1yZ2IoMzEsMTUsNDkpkso9slFirXJnYigzMSwxNSw0OSmSyj2zE6KtcmdiKDMxLDE1LDQ5KZLKPbPV461yZ2IoMzIsMTUsNTApkso9tJgkrXJnYigzMiwxNSw1MCmSyj21WmStcmdiKDMyLDE1LDUwKZLKPbYcpa1yZ2IoMzMsMTUsNTEpkso9tt7mrXJnYigzMywxNSw1MSmSyj23oSatcmdiKDMzLDE2LDUxKZLKPbhjZ61yZ2IoMzQsMTYsNTIpkso9uSWorXJnYigzNCwxNiw1MimSyj255+itcmdiKDM0LDE2LDUyKZLKPbqqKa1yZ2IoMzUsMTYsNTMpkso9u2xqrXJnYigzNSwxNiw1MymSyj28LqutcmdiKDM1LDE2LDUzKZLKPbzw661yZ2IoMzYsMTYsNTQpkso9vbMsrXJnYigzNiwxNiw1NCmSyj2+dW2tcmdiKDM2LDE2LDU0KZLKPb83ra1yZ2IoMzcsMTcsNTUpkso9v/nurXJnYigzNywxNyw1NSmSyj3AvC+tcmdiKDM3LDE3LDU1KZLKPcF+b61yZ2IoMzgsMTcsNTYpkso9wkCwrXJnYigzOCwxNyw1NimSyj3DAvGtcmdiKDM4LDE3LDU2KZLKPcPFMa1yZ2IoMzksMTcsNTcpkso9xIdyrXJnYigzOSwxNyw1NymSyj3FSbOtcmdiKDM5LDE3LDU3KZLKPcYL861yZ2IoNDAsMTcsNTgpkso9xs40rXJnYig0MCwxOCw1OCmSyj3HkHWtcmdiKDQwLDE4LDU4KZLKPchStq1yZ2IoNDEsMTgsNTkpkso9yRT2rXJnYig0MSwxOCw1OSmSyj3J1zetcmdiKDQxLDE4LDU5KZLKPcqZeK1yZ2IoNDIsMTgsNTkpkso9y1u4rXJnYig0MiwxOCw2MCmSyj3MHfmtcmdiKDQyLDE4LDYwKZLKPczgOq1yZ2IoNDMsMTgsNjApkso9zaJ6rXJnYig0MywxOCw2MSmSyj3OZLutcmdiKDQzLDE5LDYxKZLKPc8m/K1yZ2IoNDQsMTksNjEpkso9z+k8rXJnYig0NCwxOSw2MimSyj3Qq32tcmdiKDQ0LDE5LDYyKZLKPdFtvq1yZ2IoNDUsMTksNjIpkso90i/+rXJnYig0NSwxOSw2MymSyj3S8j+tcmdiKDQ1LDE5LDYzKZLKPdO0gK1yZ2IoNDYsMTksNjMpkso91HbBrXJnYig0NiwxOSw2MymSyj3VOQGtcmdiKDQ3LDE5LDY0KZLKPdX7Qq1yZ2IoNDcsMTksNjQpkso91r2DrXJnYig0NywyMCw2NCmSyj3Xf8OtcmdiKDQ4LDIwLDY1KZLKPdhCBK1yZ2IoNDgsMjAsNjUpkso92QRFrXJnYig0OCwyMCw2NSmSyj3ZxoWtcmdiKDQ5LDIwLDY2KZLKPdqIxq1yZ2IoNDksMjAsNjYpkso920sHrXJnYig0OSwyMCw2NimSyj3cDUetcmdiKDUwLDIwLDY2KZLKPdzPiK1yZ2IoNTAsMjAsNjcpkso93ZHJrXJnYig1MCwyMCw2NymSyj3eVAmtcmdiKDUxLDIwLDY3KZLKPd8WSq1yZ2IoNTEsMjEsNjgpkso939iLrXJnYig1MiwyMSw2OCmSyj3gmsytcmdiKDUyLDIxLDY4KZLKPeFdDK1yZ2IoNTIsMjEsNjgpkso94h9NrXJnYig1MywyMSw2OSmSyj3i4Y6tcmdiKDUzLDIxLDY5KZLKPeOjzq1yZ2IoNTMsMjEsNjkpkso95GYPrXJnYig1NCwyMSw2OSmSyj3lKFCtcmdiKDU0LDIxLDcwKZLKPeXqkK1yZ2IoNTQsMjEsNzApkso95qzRrXJnYig1NSwyMSw3MCmSyj3nbxKtcmdiKDU1LDIxLDcxKZLKPegxUq1yZ2IoNTYsMjIsNzEpkso96POTrXJnYig1NiwyMiw3MSmSyj3ptdStcmdiKDU2LDIyLDcxKZLKPep4FK1yZ2IoNTcsMjIsNzIpkso96zpVrXJnYig1NywyMiw3MimSyj3r/JatcmdiKDU3LDIyLDcyKZLKPey+161yZ2IoNTgsMjIsNzIpkso97YEXrXJnYig1OCwyMiw3MymSyj3uQ1itcmdiKDU4LDIyLDczKZLKPe8Fma1yZ2IoNTksMjIsNzMpkso978fZrXJnYig1OSwyMiw3MymSyj3wihqtcmdiKDYwLDIyLDc0KZLKPfFMW61yZ2IoNjAsMjMsNzQpkso98g6brXJnYig2MCwyMyw3NCmSyj3y0NytcmdiKDYxLDIzLDc0KZLKPfOTHa1yZ2IoNjEsMjMsNzUpkso99FVdrXJnYig2MSwyMyw3NSmSyj31F56tcmdiKDYyLDIzLDc1KZLKPfXZ361yZ2IoNjIsMjMsNzUpkso99pwfrXJnYig2MiwyMyw3NimSyj33XmCtcmdiKDYzLDIzLDc2KZLKPfggoa1yZ2IoNjMsMjMsNzYpkso9+OLirXJnYig2NCwyMyw3NimSyj35pSKtcmdiKDY0LDIzLDc3KZLKPfpnY61yZ2IoNjQsMjMsNzcpkso9+ymkrXJnYig2NSwyNCw3NymSyj376+StcmdiKDY1LDI0LDc3KZLKPfyuJa1yZ2IoNjUsMjQsNzgpkso9/XBmrXJnYig2NiwyNCw3OCmSyj3+MqatcmdiKDY2LDI0LDc4KZLKPf70561yZ2IoNjcsMjQsNzgpkso9/7corXJnYig2NywyNCw3OSmSyj4APLStcmdiKDY3LDI0LDc5KZLKPgCd1a1yZ2IoNjgsMjQsNzkpkso+AP71rXJnYig2OCwyNCw3OSmSyj4BYBWtcmdiKDY4LDI0LDgwKZLKPgHBNq1yZ2IoNjksMjQsODApkso+AiJWrXJnYig2OSwyNCw4MCmSyj4Cg3atcmdiKDY5LDI0LDgwKZLKPgLkl61yZ2IoNzAsMjUsODApkso+A0W3rXJnYig3MCwyNSw4MSmSyj4DptetcmdiKDcxLDI1LDgxKZLKPgQH+K1yZ2IoNzEsMjUsODEpkso+BGkYrXJnYig3MSwyNSw4MSmSyj4EyjitcmdiKDcyLDI1LDgyKZLKPgUrWa1yZ2IoNzIsMjUsODIpkso+BYx5rXJnYig3MiwyNSw4MimSyj4F7ZmtcmdiKDczLDI1LDgyKZLKPgZOuq1yZ2IoNzMsMjUsODIpkso+Bq/arXJnYig3NCwyNSw4MymSyj4HEPqtcmdiKDc0LDI1LDgzKZLKPgdyG61yZ2IoNzQsMjUsODMpkso+B9M7rXJnYig3NSwyNSw4MymSyj4INFutcmdiKDc1LDI1LDgzKZLKPgiVfK1yZ2IoNzUsMjYsODQpkso+CPacrXJnYig3NiwyNiw4NCmSyj4JV7ytcmdiKDc2LDI2LDg0KZLKPgm43a1yZ2IoNzYsMjYsODQpkso+Chn9rXJnYig3NywyNiw4NCmSyj4Kex2tcmdiKDc3LDI2LDg1KZLKPgrcPq1yZ2IoNzgsMjYsODUpkso+Cz1erXJnYig3OCwyNiw4NSmSyj4Lnn+tcmdiKDc4LDI2LDg1KZLKPgv/n61yZ2IoNzksMjYsODUpkso+DGC/rXJnYig3OSwyNiw4NimSyj4MweCtcmdiKDc5LDI2LDg2KZLKPg0jAK1yZ2IoODAsMjYsODYpkso+DYQgrXJnYig4MCwyNiw4NimSyj4N5UGtcmdiKDgwLDI2LDg2KZLKPg5GYa1yZ2IoODEsMjYsODcpkso+DqeBrXJnYig4MSwyNiw4NymSyj4PCKKtcmdiKDgyLDI3LDg3KZLKPg9pwq1yZ2IoODIsMjcsODcpkso+D8rirXJnYig4MiwyNyw4NymSyj4QLAOtcmdiKDgzLDI3LDg4KZLKPhCNI61yZ2IoODMsMjcsODgpkso+EO5DrXJnYig4MywyNyw4OCmSyj4RT2StcmdiKDg0LDI3LDg4KZLKPhGwhK1yZ2IoODQsMjcsODgpkso+EhGkrXJnYig4NCwyNyw4OCmSyj4ScsWtcmdiKDg1LDI3LDg5KZLKPhLT5a1yZ2IoODUsMjcsODkpkso+EzUFrXJnYig4NSwyNyw4OSmSyj4TliatcmdiKDg2LDI3LDg5KZLKPhP3Rq1yZ2IoODYsMjcsODkpkso+FFhmrXJnYig4NywyNyw4OSmSyj4UuYetcmdiKDg3LDI3LDkwKZLKPhUap61yZ2IoODcsMjcsOTApkso+FXvHrXJnYig4OCwyNyw5MCmSyj4V3OitcmdiKDg4LDI4LDkwKZLKPhY+CK1yZ2IoODgsMjgsOTApkso+Fp8prXJnYig4OSwyOCw5MCmSyj4XAEmtcmdiKDg5LDI4LDkxKZLKPhdhaa1yZ2IoODksMjgsOTEpkso+F8KKrXJnYig5MCwyOCw5MSmSyj4YI6qtcmdiKDkwLDI4LDkxKZLKPhiEyq1yZ2IoOTAsMjgsOTEpkso+GOXrrXJnYig5MSwyOCw5MSmSyj4ZRwutcmdiKDkxLDI4LDkyKZLKPhmoK61yZ2IoOTEsMjgsOTIpkso+GglMrXJnYig5MiwyOCw5MimSyj4aamytcmdiKDkyLDI4LDkyKZLKPhrLjK1yZ2IoOTIsMjgsOTIpkso+GyytrXJnYig5MywyOCw5MimSyj4bjc2tcmdiKDkzLDI4LDkyKZLKPhvu7a1yZ2IoOTQsMjgsOTMpkso+HFAOrXJnYig5NCwyOCw5MymSyj4csS6tcmdiKDk0LDI4LDkzKZLKPh0STq1yZ2IoOTUsMjgsOTMpkso+HXNvrXJnYig5NSwyOCw5MymSyj4d1I+tcmdiKDk1LDI5LDkzKZLKPh41r61yZ2IoOTYsMjksOTMpkso+HpbQrXJnYig5NiwyOSw5NCmSyj4e9/CtcmdiKDk2LDI5LDk0KZLKPh9ZEK1yZ2IoOTcsMjksOTQpkso+H7oxrXJnYig5NywyOSw5NCmSyj4gG1GtcmdiKDk3LDI5LDk0KZLKPiB8ca1yZ2IoOTgsMjksOTQpkso+IN2SrXJnYig5OCwyOSw5NCmSyj4hPrKtcmdiKDk4LDI5LDk1KZLKPiGf0q1yZ2IoOTksMjksOTUpkso+IgDzrXJnYig5OSwyOSw5NSmSyj4iYhOtcmdiKDk5LDI5LDk1KZLKPiLDNK5yZ2IoMTAwLDI5LDk1KZLKPiMkVK5yZ2IoMTAwLDI5LDk1KZLKPiOFdK5yZ2IoMTAwLDI5LDk1KZLKPiPmla5yZ2IoMTAxLDI5LDk2KZLKPiRHta5yZ2IoMTAxLDI5LDk2KZLKPiSo1a5yZ2IoMTAxLDI5LDk2KZLKPiUJ9q5yZ2IoMTAyLDI5LDk2KZLKPiVrFq5yZ2IoMTAyLDI5LDk2KZLKPiXMNq5yZ2IoMTAyLDI5LDk2KZLKPiYtV65yZ2IoMTAzLDI5LDk2KZLKPiaOd65yZ2IoMTAzLDI5LDk2KZLKPibvl65yZ2IoMTAzLDMwLDk2KZLKPidQuK5yZ2IoMTA0LDMwLDk3KZLKPiex2K5yZ2IoMTA0LDMwLDk3KZLKPigS+K5yZ2IoMTA0LDMwLDk3KZLKPih0Ga5yZ2IoMTA1LDMwLDk3KZLKPijVOa5yZ2IoMTA1LDMwLDk3KZLKPik2Wa5yZ2IoMTA1LDMwLDk3KZLKPimXeq5yZ2IoMTA2LDMwLDk3KZLKPin4mq5yZ2IoMTA2LDMwLDk3KZLKPipZuq5yZ2IoMTA2LDMwLDk4KZLKPiq6265yZ2IoMTA3LDMwLDk4KZLKPisb+65yZ2IoMTA3LDMwLDk4KZLKPit9G65yZ2IoMTA3LDMwLDk4KZLKPivePK5yZ2IoMTA4LDMwLDk4KZLKPiw/XK5yZ2IoMTA4LDMwLDk4KZLKPiygfK5yZ2IoMTA4LDMwLDk4KZLKPi0Bna5yZ2IoMTA4LDMwLDk4KZLKPi1iva5yZ2IoMTA5LDMwLDk4KZLKPi3D3a5yZ2IoMTA5LDMwLDk4KZLKPi4k/q5yZ2IoMTA5LDMwLDk5KZLKPi6GHq5yZ2IoMTEwLDMwLDk5KZLKPi7nP65yZ2IoMTEwLDMwLDk5KZLKPi9IX65yZ2IoMTEwLDMwLDk5KZLKPi+pf65yZ2IoMTExLDMwLDk5KZLKPjAKoK5yZ2IoMTExLDMwLDk5KZLKPjBrwK5yZ2IoMTExLDMwLDk5KZLKPjDM4K5yZ2IoMTEyLDMwLDk5KZLKPjEuAa5yZ2IoMTEyLDMwLDk5KZLKPjGPIa5yZ2IoMTEyLDMwLDk5KZLKPjHwQa9yZ2IoMTEzLDMwLDEwMCmSyj4yUWKvcmdiKDExMywzMSwxMDApkso+MrKCr3JnYigxMTMsMzEsMTAwKZLKPjMToq9yZ2IoMTEzLDMxLDEwMCmSyj4zdMOvcmdiKDExNCwzMSwxMDApkso+M9Xjr3JnYigxMTQsMzEsMTAwKZLKPjQ3A69yZ2IoMTE0LDMxLDEwMCmSyj40mCSvcmdiKDExNSwzMSwxMDApkso+NPlEr3JnYigxMTUsMzEsMTAwKZLKPjVaZK9yZ2IoMTE1LDMxLDEwMCmSyj41u4WvcmdiKDExNiwzMSwxMDApkso+Nhylr3JnYigxMTYsMzEsMTAwKZLKPjZ9xa9yZ2IoMTE2LDMxLDEwMSmSyj423uavcmdiKDExNywzMSwxMDEpkso+N0AGr3JnYigxMTcsMzEsMTAxKZLKPjehJq9yZ2IoMTE3LDMxLDEwMSmSyj44AkevcmdiKDExNywzMSwxMDEpkso+OGNnr3JnYigxMTgsMzEsMTAxKZLKPjjEh69yZ2IoMTE4LDMxLDEwMSmSyj45JaivcmdiKDExOCwzMSwxMDEpkso+OYbIr3JnYigxMTksMzEsMTAxKZLKPjnn6K9yZ2IoMTE5LDMxLDEwMSmSyj46SQmvcmdiKDExOSwzMSwxMDEpkso+Oqopr3JnYigxMTksMzEsMTAxKZLKPjsLSq9yZ2IoMTIwLDMxLDEwMSmSyj47bGqvcmdiKDEyMCwzMSwxMDEpkso+O82Kr3JnYigxMjAsMzEsMTAyKZLKPjwuq69yZ2IoMTIxLDMxLDEwMimSyj48j8uvcmdiKDEyMSwzMSwxMDIpkso+PPDrr3JnYigxMjEsMzEsMTAyKZLKPj1SDK9yZ2IoMTIyLDMxLDEwMimSyj49syyvcmdiKDEyMiwzMSwxMDIpkso+PhRMr3JnYigxMjIsMzEsMTAyKZLKPj51ba9yZ2IoMTIyLDMxLDEwMimSyj4+1o2vcmdiKDEyMywzMSwxMDIpkso+Pzetr3JnYigxMjMsMzEsMTAyKZLKPj+Yzq9yZ2IoMTIzLDMxLDEwMimSyj4/+e6vcmdiKDEyNCwzMSwxMDIpkso+QFsOr3JnYigxMjQsMzEsMTAyKZLKPkC8L69yZ2IoMTI0LDMxLDEwMimSyj5BHU+vcmdiKDEyNCwzMiwxMDIpkso+QX5vr3JnYigxMjUsMzIsMTAyKZLKPkHfkK9yZ2IoMTI1LDMyLDEwMymSyj5CQLCvcmdiKDEyNSwzMiwxMDMpkso+QqHQr3JnYigxMjUsMzIsMTAzKZLKPkMC8a9yZ2IoMTI2LDMyLDEwMymSyj5DZBGvcmdiKDEyNiwzMiwxMDMpkso+Q8Uxr3JnYigxMjYsMzIsMTAzKZLKPkQmUq9yZ2IoMTI3LDMyLDEwMymSyj5Eh3KvcmdiKDEyNywzMiwxMDMpkso+ROiSr3JnYigxMjcsMzIsMTAzKZLKPkVJs69yZ2IoMTI3LDMyLDEwMymSyj5FqtOvcmdiKDEyOCwzMiwxMDMpkso+Rgvzr3JnYigxMjgsMzIsMTAzKZLKPkZtFK9yZ2IoMTI4LDMyLDEwMymSyj5GzjSvcmdiKDEyOCwzMiwxMDMpkso+Ry9Vr3JnYigxMjksMzIsMTAzKZLKPkeQda9yZ2IoMTI5LDMyLDEwMymSyj5H8ZWvcmdiKDEyOSwzMiwxMDMpkso+SFK2r3JnYigxMzAsMzIsMTAzKZLKPkiz1q9yZ2IoMTMwLDMyLDEwMymSyj5JFPavcmdiKDEzMCwzMiwxMDMpkso+SXYXr3JnYigxMzAsMzIsMTAzKZLKPknXN69yZ2IoMTMxLDMyLDEwMymSyj5KOFevcmdiKDEzMSwzMiwxMDMpkso+Spl4r3JnYigxMzEsMzIsMTAzKZLKPkr6mK9yZ2IoMTMxLDMyLDEwNCmSyj5LW7ivcmdiKDEzMiwzMiwxMDQpkso+S7zZr3JnYigxMzIsMzIsMTA0KZLKPkwd+a9yZ2IoMTMyLDMyLDEwNCmSyj5MfxmvcmdiKDEzMiwzMiwxMDQpkso+TOA6r3JnYigxMzMsMzIsMTA0KZLKPk1BWq9yZ2IoMTMzLDMyLDEwNCmSyj5NonqvcmdiKDEzMywzMiwxMDQpkso+TgObr3JnYigxMzMsMzIsMTA0KZLKPk5ku69yZ2IoMTM0LDMyLDEwNCmSyj5OxduvcmdiKDEzNCwzMiwxMDQpkso+Tyb8r3JnYigxMzQsMzIsMTA0KZLKPk+IHK9yZ2IoMTM0LDMyLDEwNCmSyj5P6TyvcmdiKDEzNSwzMiwxMDQpkso+UEpdr3JnYigxMzUsMzIsMTA0KZLKPlCrfa9yZ2IoMTM1LDMyLDEwNCmSyj5RDJ2vcmdiKDEzNSwzMiwxMDQpkso+UW2+r3JnYigxMzYsMzIsMTA0KZLKPlHO3q9yZ2IoMTM2LDMyLDEwNCmSyj5SL/6vcmdiKDEzNiwzMiwxMDQpkso+UpEfr3JnYigxMzYsMzIsMTA0KZLKPlLyP69yZ2IoMTM3LDMyLDEwNCmSyj5TU2CvcmdiKDEzNywzMiwxMDQpkso+U7SAr3JnYigxMzcsMzIsMTA0KZLKPlQVoK9yZ2IoMTM3LDMyLDEwNCmSyj5UdsGvcmdiKDEzOCwzMiwxMDQpkso+VNfhr3JnYigxMzgsMzIsMTA0KZLKPlU5Aa9yZ2IoMTM4LDMyLDEwNCmSyj5VmiKvcmdiKDEzOCwzMywxMDQpkso+VftCr3JnYigxMzksMzMsMTA0KZLKPlZcYq9yZ2IoMTM5LDMzLDEwNCmSyj5WvYOvcmdiKDEzOSwzMywxMDQpkso+Vx6jr3JnYigxMzksMzMsMTA0KZLKPld/w69yZ2IoMTQwLDMzLDEwNCmSyj5X4OSvcmdiKDE0MCwzMywxMDQpkso+WEIEr3JnYigxNDAsMzMsMTA0KZLKPlijJK9yZ2IoMTQwLDMzLDEwNCmSyj5ZBEWvcmdiKDE0MSwzMywxMDQpkso+WWVlr3JnYigxNDEsMzMsMTA0KZLKPlnGha9yZ2IoMTQxLDMzLDEwNCmSyj5aJ6avcmdiKDE0MSwzMywxMDQpkso+WojGr3JnYigxNDEsMzMsMTA0KZLKPlrp5q9yZ2IoMTQyLDMzLDEwNCmSyj5bSwevcmdiKDE0MiwzMywxMDQpkso+W6wnr3JnYigxNDIsMzMsMTA0KZLKPlwNR69yZ2IoMTQyLDMzLDEwNCmSyj5cbmivcmdiKDE0MywzMywxMDQpkso+XM+Ir3JnYigxNDMsMzMsMTA0KZLKPl0wqK9yZ2IoMTQzLDMzLDEwNCmSyj5dkcmvcmdiKDE0MywzMywxMDQpkso+XfLpr3JnYigxNDQsMzMsMTA0KZLKPl5UCa9yZ2IoMTQ0LDMzLDEwNCmSyj5etSqvcmdiKDE0NCwzMywxMDQpkso+XxZKr3JnYigxNDQsMzMsMTA0KZLKPl93a69yZ2IoMTQ0LDMzLDEwNCmSyj5f2IuvcmdiKDE0NSwzMywxMDQpkso+YDmrr3JnYigxNDUsMzMsMTA0KZLKPmCazK9yZ2IoMTQ1LDMzLDEwNCmSyj5g++yvcmdiKDE0NSwzMywxMDQpkso+YV0Mr3JnYigxNDUsMzMsMTA0KZLKPmG+La9yZ2IoMTQ2LDMzLDEwNCmSyj5iH02vcmdiKDE0NiwzMywxMDQpkso+YoBtr3JnYigxNDYsMzMsMTA0KZLKPmLhjq9yZ2IoMTQ2LDMzLDEwNCmSyj5jQq6vcmdiKDE0NywzMywxMDQpkso+Y6POr3JnYigxNDcsMzMsMTA0KZLKPmQE769yZ2IoMTQ3LDMzLDEwNCmSyj5kZg+vcmdiKDE0NywzMywxMDQpkso+ZMcvr3JnYigxNDcsMzMsMTA0KZLKPmUoUK9yZ2IoMTQ4LDMzLDEwNCmSyj5liXCvcmdiKDE0OCwzMywxMDQpkso+ZeqQr3JnYigxNDgsMzMsMTA0KZLKPmZLsa9yZ2IoMTQ4LDMzLDEwNCmSyj5mrNGvcmdiKDE0OCwzMywxMDQpkso+Zw3xr3JnYigxNDksMzMsMTA0KZLKPmdvEq9yZ2IoMTQ5LDMzLDEwNCmSyj5n0DKvcmdiKDE0OSwzMywxMDQpkso+aDFSr3JnYigxNDksMzMsMTA0KZLKPmiSc69yZ2IoMTUwLDMzLDEwNCmSyj5o85OvcmdiKDE1MCwzMywxMDQpkso+aVSzr3JnYigxNTAsMzMsMTA0KZLKPmm11K9yZ2IoMTUwLDMzLDEwNCmSyj5qFvSvcmdiKDE1MCwzMywxMDMpkso+angUr3JnYigxNTEsMzMsMTAzKZLKPmrZNa9yZ2IoMTUxLDMzLDEwMymSyj5rOlWvcmdiKDE1MSwzMywxMDMpkso+a5t2r3JnYigxNTEsMzMsMTAzKZLKPmv8lq9yZ2IoMTUxLDMzLDEwMymSyj5sXbavcmdiKDE1MiwzMywxMDMpkso+bL7Xr3JnYigxNTIsMzMsMTAzKZLKPm0f969yZ2IoMTUyLDM0LDEwMymSyj5tgRevcmdiKDE1MiwzNCwxMDMpkso+beI4r3JnYigxNTIsMzQsMTAzKZLKPm5DWK9yZ2IoMTUzLDM0LDEwMymSyj5upHivcmdiKDE1MywzNCwxMDMpkso+bwWZr3JnYigxNTMsMzQsMTAzKZLKPm9mua9yZ2IoMTUzLDM0LDEwMymSyj5vx9mvcmdiKDE1MywzNCwxMDMpkso+cCj6r3JnYigxNTMsMzQsMTAzKZLKPnCKGq9yZ2IoMTU0LDM0LDEwMymSyj5w6zqvcmdiKDE1NCwzNCwxMDMpkso+cUxbr3JnYigxNTQsMzQsMTAzKZLKPnGte69yZ2IoMTU0LDM0LDEwMymSyj5yDpuvcmdiKDE1NCwzNCwxMDMpkso+cm+8r3JnYigxNTUsMzQsMTAzKZLKPnLQ3K9yZ2IoMTU1LDM0LDEwMymSyj5zMfyvcmdiKDE1NSwzNCwxMDMpkso+c5Mdr3JnYigxNTUsMzQsMTAyKZLKPnP0Pa9yZ2IoMTU1LDM0LDEwMimSyj50VV2vcmdiKDE1NiwzNCwxMDIpkso+dLZ+r3JnYigxNTYsMzQsMTAyKZLKPnUXnq9yZ2IoMTU2LDM0LDEwMimSyj51eL6vcmdiKDE1NiwzNCwxMDIpkso+ddnfr3JnYigxNTYsMzQsMTAyKZLKPnY6/69yZ2IoMTU2LDM0LDEwMimSyj52nB+vcmdiKDE1NywzNCwxMDIpkso+dv1Ar3JnYigxNTcsMzQsMTAyKZLKPndeYK9yZ2IoMTU3LDM0LDEwMimSyj53v4GvcmdiKDE1NywzNCwxMDIpkso+eCChr3JnYigxNTcsMzQsMTAyKZLKPniBwa9yZ2IoMTU4LDM0LDEwMimSyj544uKvcmdiKDE1OCwzNCwxMDIpkso+eUQCr3JnYigxNTgsMzQsMTAyKZLKPnmlIq9yZ2IoMTU4LDM0LDEwMimSyj56BkOvcmdiKDE1OCwzNCwxMDIpkso+emdjr3JnYigxNTgsMzQsMTAyKZLKPnrIg69yZ2IoMTU5LDM0LDEwMSmSyj57KaSvcmdiKDE1OSwzNCwxMDEpkso+e4rEr3JnYigxNTksMzQsMTAxKZLKPnvr5K9yZ2IoMTU5LDM0LDEwMSmSyj58TQWvcmdiKDE1OSwzNCwxMDEpkso+fK4lr3JnYigxNTksMzQsMTAxKZLKPn0PRa9yZ2IoMTYwLDM0LDEwMSmSyj59cGavcmdiKDE2MCwzNCwxMDEpkso+fdGGr3JnYigxNjAsMzQsMTAxKZLKPn4ypq9yZ2IoMTYwLDM0LDEwMSmSyj5+k8evcmdiKDE2MCwzNCwxMDEpkso+fvTnr3JnYigxNjAsMzUsMTAxKZLKPn9WB69yZ2IoMTYxLDM1LDEwMSmSyj5/tyivcmdiKDE2MSwzNSwxMDEpkso+gAwkr3JnYigxNjEsMzUsMTAxKZLKPoA8tK9yZ2IoMTYxLDM1LDEwMCmSyj6AbUSvcmdiKDE2MSwzNSwxMDApkso+gJ3Vr3JnYigxNjEsMzUsMTAwKZLKPoDOZa9yZ2IoMTYyLDM1LDEwMCmSyj6A/vWvcmdiKDE2MiwzNSwxMDApkso+gS+Fr3JnYigxNjIsMzUsMTAwKZLKPoFgFa9yZ2IoMTYyLDM1LDEwMCmSyj6BkKWvcmdiKDE2MiwzNSwxMDApkso+gcE2r3JnYigxNjIsMzUsMTAwKZLKPoHxxq9yZ2IoMTYzLDM1LDEwMCmSyj6CIlavcmdiKDE2MywzNSwxMDApkso+glLmr3JnYigxNjMsMzUsMTAwKZLKPoKDdq9yZ2IoMTYzLDM1LDEwMCmSyj6CtAaucmdiKDE2MywzNSw5OSmSyj6C5JeucmdiKDE2MywzNSw5OSmSyj6DFSeucmdiKDE2NCwzNSw5OSmSyj6DRbeucmdiKDE2NCwzNSw5OSmSyj6DdkeucmdiKDE2NCwzNSw5OSmSyj6DpteucmdiKDE2NCwzNSw5OSmSyj6D12eucmdiKDE2NCwzNSw5OSmSyj6EB/iucmdiKDE2NCwzNSw5OSmSyj6EOIiucmdiKDE2NCwzNSw5OSmSyj6EaRiucmdiKDE2NSwzNSw5OSmSyj6EmaiucmdiKDE2NSwzNSw5OSmSyj6EyjiucmdiKDE2NSwzNSw5OSmSyj6E+smucmdiKDE2NSwzNSw5OCmSyj6FK1mucmdiKDE2NSwzNSw5OCmSyj6FW+mucmdiKDE2NSwzNSw5OCmSyj6FjHmucmdiKDE2NSwzNSw5OCmSyj6FvQmucmdiKDE2NiwzNSw5OCmSyj6F7ZmucmdiKDE2NiwzNiw5OCmSyj6GHiqucmdiKDE2NiwzNiw5OCmSyj6GTrqucmdiKDE2NiwzNiw5OCmSyj6Gf0qucmdiKDE2NiwzNiw5OCmSyj6Gr9qucmdiKDE2NiwzNiw5OCmSyj6G4GqucmdiKDE2NywzNiw5OCmSyj6HEPqucmdiKDE2NywzNiw5NymSyj6HQYuucmdiKDE2NywzNiw5NymSyj6HchuucmdiKDE2NywzNiw5NymSyj6HoquucmdiKDE2NywzNiw5NymSyj6H0zuucmdiKDE2NywzNiw5NymSyj6IA8uucmdiKDE2NywzNiw5NymSyj6INFuucmdiKDE2OCwzNiw5NymSyj6IZOyucmdiKDE2OCwzNiw5NymSyj6IlXyucmdiKDE2OCwzNiw5NymSyj6IxgyucmdiKDE2OCwzNiw5NymSyj6I9pyucmdiKDE2OCwzNiw5NimSyj6JJyyucmdiKDE2OCwzNiw5NimSyj6JV7yucmdiKDE2OCwzNiw5NimSyj6JiE2ucmdiKDE2OCwzNiw5NimSyj6JuN2ucmdiKDE2OSwzNiw5NimSyj6J6W2ucmdiKDE2OSwzNiw5NimSyj6KGf2ucmdiKDE2OSwzNiw5NimSyj6KSo2ucmdiKDE2OSwzNiw5NimSyj6Kex2ucmdiKDE2OSwzNiw5NimSyj6Kq66ucmdiKDE2OSwzNiw5NimSyj6K3D6ucmdiKDE2OSwzNyw5NSmSyj6LDM6ucmdiKDE3MCwzNyw5NSmSyj6LPV6ucmdiKDE3MCwzNyw5NSmSyj6Lbe6ucmdiKDE3MCwzNyw5NSmSyj6Lnn+ucmdiKDE3MCwzNyw5NSmSyj6Lzw+ucmdiKDE3MCwzNyw5NSmSyj6L/5+ucmdiKDE3MCwzNyw5NSmSyj6MMC+ucmdiKDE3MCwzNyw5NSmSyj6MYL+ucmdiKDE3MSwzNyw5NSmSyj6MkU+ucmdiKDE3MSwzNyw5NCmSyj6MweCucmdiKDE3MSwzNyw5NCmSyj6M8nCucmdiKDE3MSwzNyw5NCmSyj6NIwCucmdiKDE3MSwzNyw5NCmSyj6NU5CucmdiKDE3MSwzNyw5NCmSyj6NhCCucmdiKDE3MSwzNyw5NCmSyj6NtLCucmdiKDE3MSwzNyw5NCmSyj6N5UGucmdiKDE3MiwzNyw5NCmSyj6OFdGucmdiKDE3MiwzNyw5NCmSyj6ORmGucmdiKDE3MiwzNyw5MymSyj6OdvGucmdiKDE3MiwzNyw5MymSyj6Op4GucmdiKDE3MiwzNyw5MymSyj6O2BGucmdiKDE3MiwzOCw5MymSyj6PCKKucmdiKDE3MiwzOCw5MymSyj6POTKucmdiKDE3MiwzOCw5MymSyj6PacKucmdiKDE3MywzOCw5MymSyj6PmlKucmdiKDE3MywzOCw5MymSyj6PyuKucmdiKDE3MywzOCw5MimSyj6P+3KucmdiKDE3MywzOCw5MimSyj6QLAOucmdiKDE3MywzOCw5MimSyj6QXJOucmdiKDE3MywzOCw5MimSyj6QjSOucmdiKDE3MywzOCw5MimSyj6QvbOucmdiKDE3MywzOCw5MimSyj6Q7kOucmdiKDE3MywzOCw5MimSyj6RHtSucmdiKDE3NCwzOCw5MimSyj6RT2SucmdiKDE3NCwzOCw5MSmSyj6Rf/SucmdiKDE3NCwzOCw5MSmSyj6RsISucmdiKDE3NCwzOCw5MSmSyj6R4RSucmdiKDE3NCwzOCw5MSmSyj6SEaSucmdiKDE3NCwzOCw5MSmSyj6SQjWucmdiKDE3NCwzOSw5MSmSyj6ScsWucmdiKDE3NCwzOSw5MSmSyj6So1WucmdiKDE3NSwzOSw5MSmSyj6S0+WucmdiKDE3NSwzOSw5MCmSyj6TBHWucmdiKDE3NSwzOSw5MCmSyj6TNQWucmdiKDE3NSwzOSw5MCmSyj6TZZaucmdiKDE3NSwzOSw5MCmSyj6TliaucmdiKDE3NSwzOSw5MCmSyj6TxraucmdiKDE3NSwzOSw5MCmSyj6T90aucmdiKDE3NSwzOSw5MCmSyj6UJ9aucmdiKDE3NSwzOSw4OSmSyj6UWGaucmdiKDE3NiwzOSw4OSmSyj6UiPeucmdiKDE3NiwzOSw4OSmSyj6UuYeucmdiKDE3NiwzOSw4OSmSyj6U6heucmdiKDE3NiwzOSw4OSmSyj6VGqeucmdiKDE3Niw0MCw4OSmSyj6VSzeucmdiKDE3Niw0MCw4OSmSyj6Ve8eucmdiKDE3Niw0MCw4OSmSyj6VrFiucmdiKDE3Niw0MCw4OCmSyj6V3OiucmdiKDE3Niw0MCw4OCmSyj6WDXiucmdiKDE3Niw0MCw4OCmSyj6WPgiucmdiKDE3Nyw0MCw4OCmSyj6WbpiucmdiKDE3Nyw0MCw4OCmSyj6WnymucmdiKDE3Nyw0MCw4OCmSyj6Wz7mucmdiKDE3Nyw0MCw4OCmSyj6XAEmucmdiKDE3Nyw0MCw4NymSyj6XMNmucmdiKDE3Nyw0MCw4NymSyj6XYWmucmdiKDE3Nyw0MCw4NymSyj6XkfmucmdiKDE3Nyw0MCw4NymSyj6XwoqucmdiKDE3Nyw0MSw4NymSyj6X8xqucmdiKDE3OCw0MSw4NymSyj6YI6qucmdiKDE3OCw0MSw4NymSyj6YVDqucmdiKDE3OCw0MSw4NimSyj6YhMqucmdiKDE3OCw0MSw4NimSyj6YtVqucmdiKDE3OCw0MSw4NimSyj6Y5euucmdiKDE3OCw0MSw4NimSyj6ZFnuucmdiKDE3OCw0MSw4NimSyj6ZRwuucmdiKDE3OCw0MSw4NimSyj6Zd5uucmdiKDE3OCw0MSw4NimSyj6ZqCuucmdiKDE3OCw0MSw4NSmSyj6Z2LuucmdiKDE3OSw0MSw4NSmSyj6aCUyucmdiKDE3OSw0MSw4NSmSyj6aOdyucmdiKDE3OSw0Miw4NSmSyj6aamyucmdiKDE3OSw0Miw4NSmSyj6amvyucmdiKDE3OSw0Miw4NSmSyj6ay4yucmdiKDE3OSw0Miw4NCmSyj6a/ByucmdiKDE3OSw0Miw4NCmSyj6bLK2ucmdiKDE3OSw0Miw4NCmSyj6bXT2ucmdiKDE3OSw0Miw4NCmSyj6bjc2ucmdiKDE3OSw0Miw4NCmSyj6bvl2ucmdiKDE3OSw0Miw4NCmSyj6b7u2ucmdiKDE4MCw0Miw4NCmSyj6cH32ucmdiKDE4MCw0Miw4MymSyj6cUA6ucmdiKDE4MCw0Miw4MymSyj6cgJ6ucmdiKDE4MCw0Myw4MymSyj6csS6ucmdiKDE4MCw0Myw4MymSyj6c4b6ucmdiKDE4MCw0Myw4MymSyj6dEk6ucmdiKDE4MCw0Myw4MymSyj6dQt+ucmdiKDE4MCw0Myw4MimSyj6dc2+ucmdiKDE4MCw0Myw4MimSyj6do/+ucmdiKDE4MCw0Myw4MimSyj6d1I+ucmdiKDE4MCw0Myw4MimSyj6eBR+ucmdiKDE4MSw0Myw4MimSyj6eNa+ucmdiKDE4MSw0Myw4MimSyj6eZkCucmdiKDE4MSw0Myw4MSmSyj6eltCucmdiKDE4MSw0NCw4MSmSyj6ex2CucmdiKDE4MSw0NCw4MSmSyj6e9/CucmdiKDE4MSw0NCw4MSmSyj6fKICucmdiKDE4MSw0NCw4MSmSyj6fWRCucmdiKDE4MSw0NCw4MSmSyj6fiaGucmdiKDE4MSw0NCw4MSmSyj6fujGucmdiKDE4MSw0NCw4MCmSyj6f6sGucmdiKDE4MSw0NCw4MCmSyj6gG1GucmdiKDE4Miw0NCw4MCmSyj6gS+GucmdiKDE4Miw0NCw4MCmSyj6gfHGucmdiKDE4Miw0NSw4MCmSyj6grQKucmdiKDE4Miw0NSw4MCmSyj6g3ZKucmdiKDE4Miw0NSw3OSmSyj6hDiKucmdiKDE4Miw0NSw3OSmSyj6hPrKucmdiKDE4Miw0NSw3OSmSyj6hb0KucmdiKDE4Miw0NSw3OSmSyj6hn9KucmdiKDE4Miw0NSw3OSmSyj6h0GOucmdiKDE4Miw0NSw3OSmSyj6iAPOucmdiKDE4Miw0NSw3OCmSyj6iMYOucmdiKDE4Miw0NSw3OCmSyj6iYhOucmdiKDE4Myw0Niw3OCmSyj6ikqOucmdiKDE4Myw0Niw3OCmSyj6iwzSucmdiKDE4Myw0Niw3OCmSyj6i88SucmdiKDE4Myw0Niw3OCmSyj6jJFSucmdiKDE4Myw0Niw3NymSyj6jVOSucmdiKDE4Myw0Niw3NymSyj6jhXSucmdiKDE4Myw0Niw3NymSyj6jtgSucmdiKDE4Myw0Niw3NymSyj6j5pWucmdiKDE4Myw0Niw3NymSyj6kFyWucmdiKDE4Myw0Nyw3NimSyj6kR7WucmdiKDE4Myw0Nyw3NimSyj6keEWucmdiKDE4Myw0Nyw3NimSyj6kqNWucmdiKDE4Myw0Nyw3NimSyj6k2WWucmdiKDE4NCw0Nyw3NimSyj6lCfaucmdiKDE4NCw0Nyw3NimSyj6lOoaucmdiKDE4NCw0Nyw3NSmSyj6laxaucmdiKDE4NCw0Nyw3NSmSyj6lm6aucmdiKDE4NCw0Nyw3NSmSyj6lzDaucmdiKDE4NCw0OCw3NSmSyj6l/MaucmdiKDE4NCw0OCw3NSmSyj6mLVeucmdiKDE4NCw0OCw3NSmSyj6mXeeucmdiKDE4NCw0OCw3NCmSyj6mjneucmdiKDE4NCw0OCw3NCmSyj6mvweucmdiKDE4NCw0OCw3NCmSyj6m75eucmdiKDE4NCw0OCw3NCmSyj6nICeucmdiKDE4NCw0OCw3NCmSyj6nULiucmdiKDE4NSw0OSw3NCmSyj6ngUiucmdiKDE4NSw0OSw3MymSyj6nsdiucmdiKDE4NSw0OSw3MymSyj6n4miucmdiKDE4NSw0OSw3MymSyj6oEviucmdiKDE4NSw0OSw3MymSyj6oQ4iucmdiKDE4NSw0OSw3MymSyj6odBmucmdiKDE4NSw0OSw3MimSyj6opKmucmdiKDE4NSw0OSw3MimSyj6o1TmucmdiKDE4NSw1MCw3MimSyj6pBcmucmdiKDE4NSw1MCw3MimSyj6pNlmucmdiKDE4NSw1MCw3MimSyj6pZuqucmdiKDE4NSw1MCw3MimSyj6pl3qucmdiKDE4NSw1MCw3MSmSyj6pyAqucmdiKDE4NSw1MCw3MSmSyj6p+JqucmdiKDE4NSw1MCw3MSmSyj6qKSqucmdiKDE4Niw1MCw3MSmSyj6qWbqucmdiKDE4Niw1MSw3MSmSyj6qikuucmdiKDE4Niw1MSw3MCmSyj6qutuucmdiKDE4Niw1MSw3MCmSyj6q62uucmdiKDE4Niw1MSw3MCmSyj6rG/uucmdiKDE4Niw1MSw3MCmSyj6rTIuucmdiKDE4Niw1MSw3MCmSyj6rfRuucmdiKDE4Niw1MSw3MCmSyj6rrayucmdiKDE4Niw1Miw2OSmSyj6r3jyucmdiKDE4Niw1Miw2OSmSyj6sDsyucmdiKDE4Niw1Miw2OSmSyj6sP1yucmdiKDE4Niw1Miw2OSmSyj6sb+yucmdiKDE4Niw1Miw2OSmSyj6soHyucmdiKDE4Niw1Miw2OCmSyj6s0Q2ucmdiKDE4Niw1Miw2OCmSyj6tAZ2ucmdiKDE4Niw1Myw2OCmSyj6tMi2ucmdiKDE4Nyw1Myw2OCmSyj6tYr2ucmdiKDE4Nyw1Myw2OCmSyj6tk02ucmdiKDE4Nyw1Myw2OCmSyj6tw92ucmdiKDE4Nyw1Myw2NymSyj6t9G6ucmdiKDE4Nyw1Myw2NymSyj6uJP6ucmdiKDE4Nyw1Myw2NymSyj6uVY6ucmdiKDE4Nyw1NCw2NymSyj6uhh6ucmdiKDE4Nyw1NCw2NymSyj6utq6ucmdiKDE4Nyw1NCw2NimSyj6u5z+ucmdiKDE4Nyw1NCw2NimSyj6vF8+ucmdiKDE4Nyw1NCw2NimSyj6vSF+ucmdiKDE4Nyw1NCw2NimSyj6veO+ucmdiKDE4Nyw1NCw2NimSyj6vqX+ucmdiKDE4Nyw1NSw2NSmSyj6v2g+ucmdiKDE4Nyw1NSw2NSmSyj6wCqCucmdiKDE4Nyw1NSw2NSmSyj6wOzCucmdiKDE4Nyw1NSw2NSmSyj6wa8CucmdiKDE4OCw1NSw2NSmSyj6wnFCucmdiKDE4OCw1NSw2NSmSyj6wzOCucmdiKDE4OCw1NSw2NCmSyj6w/XCucmdiKDE4OCw1Niw2NCmSyj6xLgGucmdiKDE4OCw1Niw2NCmSyj6xXpGucmdiKDE4OCw1Niw2NCmSyj6xjyGucmdiKDE4OCw1Niw2NCmSyj6xv7GucmdiKDE4OCw1Niw2MymSyj6x8EGucmdiKDE4OCw1Niw2MymSyj6yINGucmdiKDE4OCw1Nyw2MymSyj6yUWKucmdiKDE4OCw1Nyw2MymSyj6ygfKucmdiKDE4OCw1Nyw2MymSyj6ysoKucmdiKDE4OCw1Nyw2MimSyj6y4xKucmdiKDE4OCw1Nyw2MimSyj6zE6KucmdiKDE4OCw1Nyw2MimSyj6zRDKucmdiKDE4OCw1OCw2MimSyj6zdMOucmdiKDE4OCw1OCw2MimSyj6zpVOucmdiKDE4OCw1OCw2MSmSyj6z1eOucmdiKDE4OSw1OCw2MSmSyj60BnOucmdiKDE4OSw1OCw2MSmSyj60NwOucmdiKDE4OSw1OCw2MSmSyj60Z5OucmdiKDE4OSw1OSw2MSmSyj60mCSucmdiKDE4OSw1OSw2MSmSyj60yLSucmdiKDE4OSw1OSw2MCmSyj60+USucmdiKDE4OSw1OSw2MCmSyj61KdSucmdiKDE4OSw1OSw2MCmSyj61WmSucmdiKDE4OSw1OSw2MCmSyj61ivWucmdiKDE4OSw2MCw2MCmSyj61u4WucmdiKDE4OSw2MCw1OSmSyj617BWucmdiKDE4OSw2MCw1OSmSyj62HKWucmdiKDE4OSw2MCw1OSmSyj62TTWucmdiKDE4OSw2MCw1OSmSyj62fcWucmdiKDE4OSw2MCw1OSmSyj62rlaucmdiKDE4OSw2MSw1OCmSyj623uaucmdiKDE4OSw2MSw1OCmSyj63D3aucmdiKDE4OSw2MSw1OCmSyj63QAaucmdiKDE4OSw2MSw1OCmSyj63cJaucmdiKDE4OSw2MSw1OCmSyj63oSaucmdiKDE4OSw2MSw1NymSyj630beucmdiKDE5MCw2Miw1NymSyj64AkeucmdiKDE5MCw2Miw1NymSyj64MteucmdiKDE5MCw2Miw1NymSyj64Y2eucmdiKDE5MCw2Miw1NymSyj64k/eucmdiKDE5MCw2Miw1NimSyj64xIeucmdiKDE5MCw2Miw1NimSyj649RiucmdiKDE5MCw2Myw1NimSyj65JaiucmdiKDE5MCw2Myw1NimSyj65VjiucmdiKDE5MCw2Myw1NimSyj65hsiucmdiKDE5MCw2Myw1NimSyj65t1iucmdiKDE5MCw2Myw1NSmSyj655+iucmdiKDE5MCw2NCw1NSmSyj66GHmucmdiKDE5MCw2NCw1NSmSyj66SQmucmdiKDE5MCw2NCw1NSmSyj66eZmucmdiKDE5MCw2NCw1NSmSyj66qimucmdiKDE5MCw2NCw1NCmSyj662rmucmdiKDE5MCw2NCw1NCmSyj67C0qucmdiKDE5MCw2NSw1NCmSyj67O9qucmdiKDE5MCw2NSw1NCmSyj67bGqucmdiKDE5MCw2NSw1NCmSyj67nPqucmdiKDE5MCw2NSw1MymSyj67zYqucmdiKDE5MCw2NSw1MymSyj67/hqucmdiKDE5MCw2Niw1MymSyj68LquucmdiKDE5MSw2Niw1MymSyj68XzuucmdiKDE5MSw2Niw1MymSyj68j8uucmdiKDE5MSw2Niw1MimSyj68wFuucmdiKDE5MSw2Niw1MimSyj688OuucmdiKDE5MSw2Nyw1MimSyj69IXuucmdiKDE5MSw2Nyw1MimSyj69UgyucmdiKDE5MSw2Nyw1MimSyj69gpyucmdiKDE5MSw2Nyw1MSmSyj69syyucmdiKDE5MSw2Nyw1MSmSyj6947yucmdiKDE5MSw2Nyw1MSmSyj6+FEyucmdiKDE5MSw2OCw1MSmSyj6+RNyucmdiKDE5MSw2OCw1MSmSyj6+dW2ucmdiKDE5MSw2OCw1MSmSyj6+pf2ucmdiKDE5MSw2OCw1MCmSyj6+1o2ucmdiKDE5MSw2OCw1MCmSyj6/Bx2ucmdiKDE5MSw2OSw1MCmSyj6/N62ucmdiKDE5MSw2OSw1MCmSyj6/aD2ucmdiKDE5MSw2OSw1MCmSyj6/mM6ucmdiKDE5MSw2OSw0OSmSyj6/yV6ucmdiKDE5MSw2OSw0OSmSyj6/+e6ucmdiKDE5MSw3MCw0OSmSyj7AKn6ucmdiKDE5MSw3MCw0OSmSyj7AWw6ucmdiKDE5MSw3MCw0OSmSyj7Ai56ucmdiKDE5MSw3MCw0OCmSyj7AvC+ucmdiKDE5MSw3MCw0OCmSyj7A7L+ucmdiKDE5MSw3MSw0OCmSyj7BHU+ucmdiKDE5MSw3MSw0OCmSyj7BTd+ucmdiKDE5MSw3MSw0OCmSyj7Bfm+ucmdiKDE5Miw3MSw0NymSyj7BrwCucmdiKDE5Miw3MSw0NymSyj7B35CucmdiKDE5Miw3Miw0NymSyj7CECCucmdiKDE5Miw3Miw0NymSyj7CQLCucmdiKDE5Miw3Miw0NymSyj7CcUCucmdiKDE5Miw3Miw0NymSyj7CodCucmdiKDE5Miw3Miw0NimSyj7C0mGucmdiKDE5Miw3Myw0NimSyj7DAvGucmdiKDE5Miw3Myw0NimSyj7DM4GucmdiKDE5Miw3Myw0NimSyj7DZBGucmdiKDE5Miw3Myw0NimSyj7DlKGucmdiKDE5Miw3Myw0NSmSyj7DxTGucmdiKDE5Miw3NCw0NSmSyj7D9cKucmdiKDE5Miw3NCw0NSmSyj7EJlKucmdiKDE5Miw3NCw0NSmSyj7EVuKucmdiKDE5Miw3NCw0NSmSyj7Eh3KucmdiKDE5Miw3NCw0NCmSyj7EuAKucmdiKDE5Miw3NSw0NCmSyj7E6JKucmdiKDE5Miw3NSw0NCmSyj7FGSOucmdiKDE5Miw3NSw0NCmSyj7FSbOucmdiKDE5Miw3NSw0NCmSyj7FekOucmdiKDE5Miw3NSw0NCmSyj7FqtOucmdiKDE5Miw3Niw0MymSyj7F22OucmdiKDE5Miw3Niw0MymSyj7GC/OucmdiKDE5Miw3Niw0MymSyj7GPISucmdiKDE5Miw3Niw0MymSyj7GbRSucmdiKDE5Miw3Niw0MymSyj7GnaSucmdiKDE5Miw3Nyw0MimSyj7GzjSucmdiKDE5Miw3Nyw0MimSyj7G/sSucmdiKDE5Miw3Nyw0MimSyj7HL1WucmdiKDE5Miw3Nyw0MimSyj7HX+WucmdiKDE5Miw3OCw0MimSyj7HkHWucmdiKDE5Miw3OCw0MimSyj7HwQWucmdiKDE5Miw3OCw0MSmSyj7H8ZWucmdiKDE5Miw3OCw0MSmSyj7IIiWucmdiKDE5Myw3OCw0MSmSyj7IUraucmdiKDE5Myw3OSw0MSmSyj7Ig0aucmdiKDE5Myw3OSw0MSmSyj7Is9aucmdiKDE5Myw3OSw0MCmSyj7I5GaucmdiKDE5Myw3OSw0MCmSyj7JFPaucmdiKDE5Myw3OSw0MCmSyj7JRYaucmdiKDE5Myw4MCw0MCmSyj7JdheucmdiKDE5Myw4MCw0MCmSyj7JpqeucmdiKDE5Myw4MCw0MCmSyj7J1zeucmdiKDE5Myw4MCwzOSmSyj7KB8eucmdiKDE5Myw4MCwzOSmSyj7KOFeucmdiKDE5Myw4MSwzOSmSyj7KaOeucmdiKDE5Myw4MSwzOSmSyj7KmXiucmdiKDE5Myw4MSwzOSmSyj7KygiucmdiKDE5Myw4MSwzOCmSyj7K+piucmdiKDE5Myw4MiwzOCmSyj7LKyiucmdiKDE5Myw4MiwzOCmSyj7LW7iucmdiKDE5Myw4MiwzOCmSyj7LjEiucmdiKDE5Myw4MiwzOCmSyj7LvNmucmdiKDE5Myw4MiwzOCmSyj7L7WmucmdiKDE5Myw4MywzNymSyj7MHfmucmdiKDE5Myw4MywzNymSyj7MTomucmdiKDE5Myw4MywzNymSyj7MfxmucmdiKDE5Myw4MywzNymSyj7Mr6mucmdiKDE5Myw4NCwzNymSyj7M4DqucmdiKDE5Myw4NCwzNymSyj7NEMqucmdiKDE5Myw4NCwzNimSyj7NQVqucmdiKDE5Myw4NCwzNimSyj7NcequcmdiKDE5Myw4NCwzNimSyj7NonqucmdiKDE5Myw4NSwzNimSyj7N0wuucmdiKDE5Myw4NSwzNimSyj7OA5uucmdiKDE5Myw4NSwzNimSyj7ONCuucmdiKDE5Myw4NSwzNSmSyj7OZLuucmdiKDE5Myw4NSwzNSmSyj7OlUuucmdiKDE5Myw4NiwzNSmSyj7OxduucmdiKDE5Myw4NiwzNSmSyj7O9myucmdiKDE5Myw4NiwzNSmSyj7PJvyucmdiKDE5Myw4NiwzNCmSyj7PV4yucmdiKDE5Myw4NywzNCmSyj7PiByucmdiKDE5Myw4NywzNCmSyj7PuKyucmdiKDE5Myw4NywzNCmSyj7P6TyucmdiKDE5Myw4NywzNCmSyj7QGc2ucmdiKDE5Myw4NywzNCmSyj7QSl2ucmdiKDE5Myw4OCwzMymSyj7Qeu2ucmdiKDE5Myw4OCwzMymSyj7Qq32ucmdiKDE5Myw4OCwzMymSyj7Q3A2ucmdiKDE5Myw4OCwzMymSyj7RDJ2ucmdiKDE5Myw4OSwzMymSyj7RPS6ucmdiKDE5Myw4OSwzMymSyj7Rbb6ucmdiKDE5Myw4OSwzMimSyj7Rnk6ucmdiKDE5Myw4OSwzMimSyj7Rzt6ucmdiKDE5NCw4OSwzMimSyj7R/26ucmdiKDE5NCw5MCwzMimSyj7SL/6ucmdiKDE5NCw5MCwzMimSyj7SYI+ucmdiKDE5NCw5MCwzMimSyj7SkR+ucmdiKDE5NCw5MCwzMimSyj7Swa+ucmdiKDE5NCw5MSwzMSmSyj7S8j+ucmdiKDE5NCw5MSwzMSmSyj7TIs+ucmdiKDE5NCw5MSwzMSmSyj7TU2CucmdiKDE5NCw5MSwzMSmSyj7Tg/CucmdiKDE5NCw5MSwzMSmSyj7TtICucmdiKDE5NCw5MiwzMSmSyj7T5RCucmdiKDE5NCw5MiwzMCmSyj7UFaCucmdiKDE5NCw5MiwzMCmSyj7URjCucmdiKDE5NCw5MiwzMCmSyj7UdsGucmdiKDE5NCw5MywzMCmSyj7Up1GucmdiKDE5NCw5MywzMCmSyj7U1+GucmdiKDE5NCw5MywzMCmSyj7VCHGucmdiKDE5NCw5MywyOSmSyj7VOQGucmdiKDE5NCw5MywyOSmSyj7VaZGucmdiKDE5NCw5NCwyOSmSyj7VmiKucmdiKDE5NCw5NCwyOSmSyj7VyrKucmdiKDE5NCw5NCwyOSmSyj7V+0KucmdiKDE5NCw5NCwyOSmSyj7WK9KucmdiKDE5NCw5NSwyOSmSyj7WXGKucmdiKDE5NCw5NSwyOCmSyj7WjPKucmdiKDE5NCw5NSwyOCmSyj7WvYOucmdiKDE5NCw5NSwyOCmSyj7W7hOucmdiKDE5NCw5NSwyOCmSyj7XHqOucmdiKDE5NCw5NiwyOCmSyj7XTzOucmdiKDE5NCw5NiwyOCmSyj7Xf8OucmdiKDE5NCw5NiwyNymSyj7XsFOucmdiKDE5NCw5NiwyNymSyj7X4OSucmdiKDE5NCw5NywyNymSyj7YEXSucmdiKDE5NCw5NywyNymSyj7YQgSucmdiKDE5NCw5NywyNymSyj7YcpSucmdiKDE5NCw5NywyNymSyj7YoySucmdiKDE5NCw5NywyNymSyj7Y07SucmdiKDE5NCw5OCwyNimSyj7ZBEWucmdiKDE5NCw5OCwyNimSyj7ZNNWucmdiKDE5NCw5OCwyNimSyj7ZZWWucmdiKDE5NCw5OCwyNimSyj7ZlfWucmdiKDE5NCw5OSwyNimSyj7ZxoWucmdiKDE5NCw5OSwyNimSyj7Z9xaucmdiKDE5NCw5OSwyNimSyj7aJ6aucmdiKDE5NCw5OSwyNSmSyj7aWDaucmdiKDE5NCw5OSwyNSmSyj7aiMavcmdiKDE5NCwxMDAsMjUpkso+2rlWr3JnYigxOTQsMTAwLDI1KZLKPtrp5q9yZ2IoMTk0LDEwMCwyNSmSyj7bGnevcmdiKDE5NCwxMDAsMjUpkso+20sHr3JnYigxOTQsMTAxLDI1KZLKPtt7l69yZ2IoMTk0LDEwMSwyNCmSyj7brCevcmdiKDE5NCwxMDEsMjQpkso+29y3r3JnYigxOTQsMTAxLDI0KZLKPtwNR69yZ2IoMTk0LDEwMSwyNCmSyj7cPdivcmdiKDE5NCwxMDIsMjQpkso+3G5or3JnYigxOTQsMTAyLDI0KZLKPtye+K9yZ2IoMTk0LDEwMiwyNCmSyj7cz4ivcmdiKDE5NCwxMDIsMjMpkso+3QAYr3JnYigxOTQsMTAyLDIzKZLKPt0wqK9yZ2IoMTk0LDEwMywyMymSyj7dYTmvcmdiKDE5NCwxMDMsMjMpkso+3ZHJr3JnYigxOTQsMTAzLDIzKZLKPt3CWa9yZ2IoMTk0LDEwMywyMymSyj7d8umvcmdiKDE5NCwxMDQsMjMpkso+3iN5r3JnYigxOTQsMTA0LDIzKZLKPt5UCa9yZ2IoMTk0LDEwNCwyMimSyj7ehJqvcmdiKDE5NCwxMDQsMjIpkso+3rUqr3JnYigxOTQsMTA0LDIyKZLKPt7luq9yZ2IoMTk0LDEwNSwyMimSyj7fFkqvcmdiKDE5NCwxMDUsMjIpkso+30bar3JnYigxOTQsMTA1LDIyKZLKPt93a69yZ2IoMTk0LDEwNSwyMimSyj7fp/uvcmdiKDE5NCwxMDYsMjIpkso+39iLr3JnYigxOTQsMTA2LDIxKZLKPuAJG69yZ2IoMTk0LDEwNiwyMSmSyj7gOauvcmdiKDE5NCwxMDYsMjEpkso+4Go7r3JnYigxOTQsMTA2LDIxKZLKPuCazK9yZ2IoMTk0LDEwNywyMSmSyj7gy1yvcmdiKDE5NCwxMDcsMjEpkso+4Pvsr3JnYigxOTQsMTA3LDIxKZLKPuEsfK9yZ2IoMTk0LDEwNywyMSmSyj7hXQyvcmdiKDE5NCwxMDgsMjApkso+4Y2cr3JnYigxOTQsMTA4LDIwKZLKPuG+La9yZ2IoMTk0LDEwOCwyMCmSyj7h7r2vcmdiKDE5NCwxMDgsMjApkso+4h9Nr3JnYigxOTQsMTA4LDIwKZLKPuJP3a9yZ2IoMTk0LDEwOSwyMCmSyj7igG2vcmdiKDE5NCwxMDksMjApkso+4rD9r3JnYigxOTQsMTA5LDIwKZLKPuLhjq9yZ2IoMTk0LDEwOSwxOSmSyj7jEh6vcmdiKDE5NCwxMTAsMTkpkso+40Kur3JnYigxOTQsMTEwLDE5KZLKPuNzPq9yZ2IoMTk0LDExMCwxOSmSyj7jo86vcmdiKDE5NCwxMTAsMTkpkso+49Rer3JnYigxOTQsMTEwLDE5KZLKPuQE769yZ2IoMTk0LDExMSwxOSmSyj7kNX+vcmdiKDE5NCwxMTEsMTkpkso+5GYPr3JnYigxOTQsMTExLDE5KZLKPuSWn69yZ2IoMTk0LDExMSwxOCmSyj7kxy+vcmdiKDE5NCwxMTEsMTgpkso+5PfAr3JnYigxOTQsMTEyLDE4KZLKPuUoUK9yZ2IoMTk0LDExMiwxOCmSyj7lWOCvcmdiKDE5NCwxMTIsMTgpkso+5Ylwr3JnYigxOTQsMTEyLDE4KZLKPuW6AK9yZ2IoMTk0LDExMywxOCmSyj7l6pCvcmdiKDE5NCwxMTMsMTgpkso+5hshr3JnYigxOTQsMTEzLDE4KZLKPuZLsa9yZ2IoMTk0LDExMywxNymSyj7mfEGvcmdiKDE5NCwxMTMsMTcpkso+5qzRr3JnYigxOTQsMTE0LDE3KZLKPubdYa9yZ2IoMTk0LDExNCwxNymSyj7nDfGvcmdiKDE5NCwxMTQsMTcpkso+5z6Cr3JnYigxOTQsMTE0LDE3KZLKPudvEq9yZ2IoMTk0LDExNCwxNymSyj7nn6KvcmdiKDE5NCwxMTUsMTcpkso+59Ayr3JnYigxOTQsMTE1LDE3KZLKPugAwq9yZ2IoMTk0LDExNSwxNymSyj7oMVKvcmdiKDE5NCwxMTUsMTYpkso+6GHjr3JnYigxOTQsMTE1LDE2KZLKPuiSc69yZ2IoMTk0LDExNiwxNimSyj7owwOvcmdiKDE5NCwxMTYsMTYpkso+6POTr3JnYigxOTQsMTE2LDE2KZLKPukkI69yZ2IoMTk0LDExNiwxNimSyj7pVLOvcmdiKDE5NCwxMTcsMTYpkso+6YVEr3JnYigxOTQsMTE3LDE2KZLKPum11K9yZ2IoMTk0LDExNywxNimSyj7p5mSvcmdiKDE5NCwxMTcsMTYpkso+6hb0r3JnYigxOTQsMTE3LDE1KZLKPupHhK9yZ2IoMTk0LDExOCwxNSmSyj7qeBSvcmdiKDE5NCwxMTgsMTUpkso+6qilr3JnYigxOTQsMTE4LDE1KZLKPurZNa9yZ2IoMTk0LDExOCwxNSmSyj7rCcWvcmdiKDE5NCwxMTgsMTUpkso+6zpVr3JnYigxOTQsMTE5LDE1KZLKPutq5a9yZ2IoMTk0LDExOSwxNSmSyj7rm3avcmdiKDE5NCwxMTksMTUpkso+68wGr3JnYigxOTQsMTE5LDE1KZLKPuv8lq9yZ2IoMTk0LDExOSwxNCmSyj7sLSavcmdiKDE5NCwxMjAsMTQpkso+7F22r3JnYigxOTQsMTIwLDE0KZLKPuyORq9yZ2IoMTk0LDEyMCwxNCmSyj7svtevcmdiKDE5NCwxMjAsMTQpkso+7O9nr3JnYigxOTQsMTIwLDE0KZLKPu0f969yZ2IoMTk0LDEyMSwxNCmSyj7tUIevcmdiKDE5NCwxMjEsMTQpkso+7YEXr3JnYigxOTQsMTIxLDE0KZLKPu2xp69yZ2IoMTk0LDEyMSwxNCmSyj7t4jivcmdiKDE5NCwxMjIsMTQpkso+7hLIr3JnYigxOTQsMTIyLDE0KZLKPu5DWK9yZ2IoMTk0LDEyMiwxMymSyj7uc+ivcmdiKDE5NCwxMjIsMTMpkso+7qR4r3JnYigxOTQsMTIyLDEzKZLKPu7VCK9yZ2IoMTk0LDEyMywxMymSyj7vBZmvcmdiKDE5NCwxMjMsMTMpkso+7zYpr3JnYigxOTQsMTIzLDEzKZLKPu9mua9yZ2IoMTk0LDEyMywxMymSyj7vl0mvcmdiKDE5NCwxMjMsMTMpkso+78fZr3JnYigxOTQsMTI0LDEzKZLKPu/4aa9yZ2IoMTkzLDEyNCwxMymSyj7wKPqvcmdiKDE5MywxMjQsMTMpkso+8FmKr3JnYigxOTMsMTI0LDEzKZLKPvCKGq9yZ2IoMTkzLDEyNCwxMimSyj7wuqqvcmdiKDE5MywxMjUsMTIpkso+8Os6r3JnYigxOTMsMTI1LDEyKZLKPvEby69yZ2IoMTkzLDEyNSwxMimSyj7xTFuvcmdiKDE5MywxMjUsMTIpkso+8Xzrr3JnYigxOTMsMTI1LDEyKZLKPvGte69yZ2IoMTkzLDEyNiwxMimSyj7x3guvcmdiKDE5MywxMjYsMTIpkso+8g6br3JnYigxOTMsMTI2LDEyKZLKPvI/LK9yZ2IoMTkzLDEyNiwxMimSyj7yb7yvcmdiKDE5MywxMjYsMTIpkso+8qBMr3JnYigxOTMsMTI3LDEyKZLKPvLQ3K9yZ2IoMTkzLDEyNywxMimSyj7zAWyvcmdiKDE5MywxMjcsMTIpkso+8zH8r3JnYigxOTMsMTI3LDExKZLKPvNija9yZ2IoMTkzLDEyNywxMSmSyj7zkx2vcmdiKDE5MywxMjcsMTEpkso+88Otr3JnYigxOTMsMTI4LDExKZLKPvP0Pa9yZ2IoMTkzLDEyOCwxMSmSyj70JM2vcmdiKDE5MywxMjgsMTEpkso+9FVdr3JnYigxOTMsMTI4LDExKZLKPvSF7q9yZ2IoMTkzLDEyOCwxMSmSyj70tn6vcmdiKDE5MywxMjksMTEpkso+9OcOr3JnYigxOTMsMTI5LDExKZLKPvUXnq9yZ2IoMTkzLDEyOSwxMSmSyj71SC6vcmdiKDE5MywxMjksMTEpkso+9Xi+r3JnYigxOTMsMTI5LDExKZLKPvWpT69yZ2IoMTkzLDEzMCwxMSmSyj712d+vcmdiKDE5MywxMzAsMTApkso+9gpvr3JnYigxOTMsMTMwLDEwKZLKPvY6/69yZ2IoMTkzLDEzMCwxMCmSyj72a4+vcmdiKDE5MywxMzAsMTApkso+9pwfr3JnYigxOTMsMTMxLDEwKZLKPvbMsK9yZ2IoMTkzLDEzMSwxMCmSyj72/UCvcmdiKDE5MywxMzEsMTApkso+9y3Qr3JnYigxOTMsMTMxLDEwKZLKPvdeYK9yZ2IoMTkzLDEzMSwxMCmSyj73jvCvcmdiKDE5MywxMzIsMTApkso+97+Br3JnYigxOTMsMTMyLDEwKZLKPvfwEa9yZ2IoMTkzLDEzMiwxMCmSyj74IKGvcmdiKDE5MywxMzIsMTApkso++FExr3JnYigxOTMsMTMyLDEwKZLKPviBwa9yZ2IoMTkzLDEzMiwxMCmSyj74slGvcmdiKDE5MywxMzMsMTApkso++OLir3JnYigxOTMsMTMzLDEwKZLKPvkTcq5yZ2IoMTkzLDEzMyw5KZLKPvlEAq5yZ2IoMTkzLDEzMyw5KZLKPvl0kq5yZ2IoMTkzLDEzMyw5KZLKPvmlIq5yZ2IoMTkzLDEzNCw5KZLKPvnVsq5yZ2IoMTkzLDEzNCw5KZLKPvoGQ65yZ2IoMTkzLDEzNCw5KZLKPvo2065yZ2IoMTkzLDEzNCw5KZLKPvpnY65yZ2IoMTkzLDEzNCw5KZLKPvqX865yZ2IoMTkzLDEzNCw5KZLKPvrIg65yZ2IoMTkzLDEzNSw5KZLKPvr5E65yZ2IoMTkyLDEzNSw5KZLKPvsppK5yZ2IoMTkyLDEzNSw5KZLKPvtaNK5yZ2IoMTkyLDEzNSw5KZLKPvuKxK5yZ2IoMTkyLDEzNSw5KZLKPvu7VK5yZ2IoMTkyLDEzNiw5KZLKPvvr5K5yZ2IoMTkyLDEzNiw5KZLKPvwcdK5yZ2IoMTkyLDEzNiw5KZLKPvxNBa5yZ2IoMTkyLDEzNiw5KZLKPvx9la5yZ2IoMTkyLDEzNiw5KZLKPvyuJa5yZ2IoMTkyLDEzNiw4KZLKPvzeta5yZ2IoMTkyLDEzNyw4KZLKPv0PRa5yZ2IoMTkyLDEzNyw4KZLKPv0/1q5yZ2IoMTkyLDEzNyw4KZLKPv1wZq5yZ2IoMTkyLDEzNyw4KZLKPv2g9q5yZ2IoMTkyLDEzNyw4KZLKPv3Rhq5yZ2IoMTkyLDEzOCw4KZLKPv4CFq5yZ2IoMTkyLDEzOCw4KZLKPv4ypq5yZ2IoMTkyLDEzOCw4KZLKPv5jN65yZ2IoMTkyLDEzOCw4KZLKPv6Tx65yZ2IoMTkyLDEzOCw4KZLKPv7EV65yZ2IoMTkyLDEzOCw4KZLKPv70565yZ2IoMTkyLDEzOSw4KZLKPv8ld65yZ2IoMTkyLDEzOSw4KZLK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Myw2KZLKPwfTO65yZ2IoMTg5LDE1Myw2KZLKPwfrg65yZ2IoMTg5LDE1Myw2KZLKPwgDy65yZ2IoMTg5LDE1Myw2KZLKPwgcE65yZ2IoMTg5LDE1Myw2KZLKPwg0W65yZ2IoMTg5LDE1Myw2KZLKPwhMpK5yZ2IoMTg5LDE1Myw2KZLKPwhk7K5yZ2IoMTg5LDE1NCw2KZLKPwh9NK5yZ2IoMTg5LDE1NCw1KZLKPwiVfK5yZ2IoMTg5LDE1NCw1KZLKPwitxK5yZ2IoMTg5LDE1NCw1KZLKPwjGDK5yZ2IoMTg5LDE1NCw1KZLKPwjeVK5yZ2IoMTg5LDE1NCw1KZLKPwj2nK5yZ2IoMTg5LDE1NCw1KZLKPwkO5K5yZ2IoMTg5LDE1NSw1KZLKPwknLK5yZ2IoMTg5LDE1NSw1KZLKPwk/dK5yZ2IoMTg5LDE1NSw1KZLKPwlXvK5yZ2IoMTg5LDE1NSw1KZLKPwlwBa5yZ2IoMTg5LDE1NSw1KZLKPwmITa5yZ2IoMTg5LDE1NSw1KZLKPwmgla5yZ2IoMTg5LDE1NSw1KZLKPwm43a5yZ2IoMTg5LDE1Niw1KZLKPwnRJa5yZ2IoMTg5LDE1Niw1KZLKPwnpba5yZ2IoMTg5LDE1Niw1KZLKPwoBta5yZ2IoMTg5LDE1Niw1KZLKPwoZ/a5yZ2IoMTg4LDE1Niw1KZLKPwoyRa5yZ2IoMTg4LDE1Niw1KZLKPwpKja5yZ2IoMTg4LDE1Niw1KZLKPwpi1a5yZ2IoMTg4LDE1Niw1KZLKPwp7Ha5yZ2IoMTg4LDE1Nyw1KZLKPwqTZq5yZ2IoMTg4LDE1Nyw1KZLKPwqrrq5yZ2IoMTg4LDE1Nyw1KZLKPwrD9q5yZ2IoMTg4LDE1Nyw1KZLKPwrcPq5yZ2IoMTg4LDE1Nyw1KZLKPwr0hq5yZ2IoMTg4LDE1Nyw1KZLKPwsMzq5yZ2IoMTg4LDE1Nyw1KZLKPwslFq5yZ2IoMTg4LDE1OCw1KZLKPws9Xq5yZ2IoMTg4LDE1OCw1KZLKPwtVpq5yZ2IoMTg4LDE1OCw1KZLKPwtt7q5yZ2IoMTg4LDE1OCw1KZLKPwuGNq5yZ2IoMTg4LDE1OCw1KZLKPwuef65yZ2IoMTg4LDE1OCw1KZLKPwu2x65yZ2IoMTg4LDE1OCw1KZLKPwvPD65yZ2IoMTg4LDE1OCw1KZLKPwvnV65yZ2IoMTg4LDE1OSw1KZLKPwv/n65yZ2IoMTg4LDE1OSw1KZLKPwwX565yZ2IoMTg4LDE1OSw1KZLKPwwwL65yZ2IoMTg4LDE1OSw1KZLKPwxId65yZ2IoMTg4LDE1OSw1KZLKPwxgv65yZ2IoMTg4LDE1OSw1KZLKPwx5B65yZ2IoMTg4LDE1OSw1KZLKPwyRT65yZ2IoMTg3LDE2MCw1KZLKPwypl65yZ2IoMTg3LDE2MCw1KZLKPwzB4K5yZ2IoMTg3LDE2MCw1KZLKPwzaKK5yZ2IoMTg3LDE2MCw1KZLKPwzycK5yZ2IoMTg3LDE2MCw1KZLKPw0KuK5yZ2IoMTg3LDE2MCw1KZLKPw0jAK5yZ2IoMTg3LDE2MCw1KZLKPw07SK5yZ2IoMTg3LDE2MCw1KZLKPw1TkK5yZ2IoMTg3LDE2MSw1KZLKPw1r2K5yZ2IoMTg3LDE2MSw1KZLKPw2EIK5yZ2IoMTg3LDE2MSw1KZLKPw2caK5yZ2IoMTg3LDE2MSw1KZLKPw20sK5yZ2IoMTg3LDE2MSw1KZLKPw3M+a5yZ2IoMTg3LDE2MSw1KZLKPw3lQa5yZ2IoMTg3LDE2MSw1KZLKPw39ia5yZ2IoMTg3LDE2MSw1KZLKPw4V0a5yZ2IoMTg3LDE2Miw1KZLKPw4uGa5yZ2IoMTg3LDE2Miw1KZLKPw5GYa5yZ2IoMTg3LDE2Miw1KZLKPw5eqa5yZ2IoMTg3LDE2Miw1KZLKPw528a5yZ2IoMTg3LDE2Miw1KZLKPw6POa5yZ2IoMTg3LDE2Miw1KZLKPw6nga5yZ2IoMTg3LDE2Miw1KZLKPw6/ya5yZ2IoMTg3LDE2Miw1KZLKPw7YEa5yZ2IoMTg2LDE2Myw1KZLKPw7wWq5yZ2IoMTg2LDE2Myw1KZLKPw8Ioq5yZ2IoMTg2LDE2Myw1KZLKPw8g6q5yZ2IoMTg2LDE2Myw1KZLKPw85Mq5yZ2IoMTg2LDE2Myw2KZLKPw9Req5yZ2IoMTg2LDE2Myw2KZLKPw9pwq5yZ2IoMTg2LDE2Myw2KZLKPw+CCq5yZ2IoMTg2LDE2Myw2KZLKPw+aUq5yZ2IoMTg2LDE2Myw2KZLKPw+ymq5yZ2IoMTg2LDE2NCw2KZLKPw/K4q5yZ2IoMTg2LDE2NCw2KZLKPw/jKq5yZ2IoMTg2LDE2NCw2KZLKPw/7cq5yZ2IoMTg2LDE2NCw2KZLKPxATu65yZ2IoMTg2LDE2NCw2KZLKPxAsA65yZ2IoMTg2LDE2NCw2KZLKPxBES65yZ2IoMTg2LDE2NCw2KZLKPxBck65yZ2IoMTg2LDE2NCw2KZLKPxB0265yZ2IoMTg2LDE2NSw2KZLKPxCNI65yZ2IoMTg2LDE2NSw2KZLKPxCla65yZ2IoMTg2LDE2NSw2KZLKPxC9s65yZ2IoMTg2LDE2NSw2KZLKPxDV+65yZ2IoMTg2LDE2NSw2KZLKPxDuQ65yZ2IoMTg2LDE2NSw2KZLKPxEGi65yZ2IoMTg1LDE2NSw2KZLKPxEe1K5yZ2IoMTg1LDE2NSw2KZLKPxE3HK5yZ2IoMTg1LDE2NSw2KZLKPxFPZK5yZ2IoMTg1LDE2Niw2KZLKPxFnrK5yZ2IoMTg1LDE2Niw2KZLKPxF/9K5yZ2IoMTg1LDE2Niw2KZLKPxGYPK5yZ2IoMTg1LDE2Niw2KZLKPxGwhK5yZ2IoMTg1LDE2Niw2KZLKPxHIzK5yZ2IoMTg1LDE2Niw2KZLKPxHhFK5yZ2IoMTg1LDE2Niw2KZLKPxH5XK5yZ2IoMTg1LDE2Niw2KZLKPxIRpK5yZ2IoMTg1LDE2Niw2KZLKPxIp7K5yZ2IoMTg1LDE2Nyw2KZLKPxJCNa5yZ2IoMTg1LDE2Nyw2KZLKPxJafa5yZ2IoMTg1LDE2Nyw2KZLKPxJyxa5yZ2IoMTg1LDE2Nyw2KZLKPxKLDa5yZ2IoMTg1LDE2Nyw2KZLKPxKjVa5yZ2IoMTg1LDE2Nyw2KZLKPxK7na5yZ2IoMTg1LDE2Nyw2KZLKPxLT5a5yZ2IoMTg1LDE2Nyw2KZLKPxLsLa5yZ2IoMTg1LDE2Nyw2KZLKPxMEda5yZ2IoMTg0LDE2OCw2KZLKPxMcva5yZ2IoMTg0LDE2OCw2KZLKPxM1Ba5yZ2IoMTg0LDE2OCw2KZLKPxNNTa5yZ2IoMTg0LDE2OCw2KZLKPxNllq5yZ2IoMTg0LDE2OCw2KZLKPxN93q5yZ2IoMTg0LDE2OCw2KZLKPxOWJq5yZ2IoMTg0LDE2OCw2KZLKPxOubq5yZ2IoMTg0LDE2OCw2KZLKPxPGtq5yZ2IoMTg0LDE2OCw2KZLKPxPe/q5yZ2IoMTg0LDE2OSw3KZLKPxP3Rq5yZ2IoMTg0LDE2OSw3KZLKPxQPjq5yZ2IoMTg0LDE2OSw3KZLKPxQn1q5yZ2IoMTg0LDE2OSw3KZLKPxRAHq5yZ2IoMTg0LDE2OSw3KZLKPxRYZq5yZ2IoMTg0LDE2OSw3KZLKPxRwr65yZ2IoMTg0LDE2OSw3KZLKPxSI965yZ2IoMTg0LDE2OSw3KZLKPxShP65yZ2IoMTg0LDE2OSw3KZLKPxS5h65yZ2IoMTg0LDE2OSw3KZLKPxTRz65yZ2IoMTg0LDE3MCw3KZLKPxTqF65yZ2IoMTg0LDE3MCw3KZLKPxUCX65yZ2IoMTg0LDE3MCw3KZLKPxUap65yZ2IoMTgzLDE3MCw3KZLKPxUy765yZ2IoMTgzLDE3MCw3KZLKPxVLN65yZ2IoMTgzLDE3MCw3KZLKPxVjf65yZ2IoMTgzLDE3MCw3KZLKPxV7x65yZ2IoMTgzLDE3MCw3KZLKPxWUEK5yZ2IoMTgzLDE3MCw3KZLKPxWsWK5yZ2IoMTgzLDE3MCw3KZLKPxXEoK5yZ2IoMTgzLDE3MSw3KZLKPxXc6K5yZ2IoMTgzLDE3MSw3KZLKPxX1MK5yZ2IoMTgzLDE3MSw3KZLKPxYNeK5yZ2IoMTgzLDE3MSw3KZLKPxYlwK5yZ2IoMTgzLDE3MSw3KZLKPxY+CK5yZ2IoMTgzLDE3MSw3KZLKPxZWUK5yZ2IoMTgzLDE3MSw4KZLKPxZumK5yZ2IoMTgzLDE3MSw4KZLKPxaG4K5yZ2IoMTgzLDE3MSw4KZLKPxafKa5yZ2IoMTgzLDE3MSw4KZLKPxa3ca5yZ2IoMTgzLDE3Miw4KZLKPxbPua5yZ2IoMTgzLDE3Miw4KZLKPxboAa5yZ2IoMTgzLDE3Miw4KZLKPxcASa5yZ2IoMTgyLDE3Miw4KZLKPxcYka5yZ2IoMTgyLDE3Miw4KZLKPxcw2a5yZ2IoMTgyLDE3Miw4KZLKPxdJIa5yZ2IoMTgyLDE3Miw4KZLKPxdhaa5yZ2IoMTgyLDE3Miw4KZLKPxd5sa5yZ2IoMTgyLDE3Miw4KZLKPxeR+a5yZ2IoMTgyLDE3Miw4KZLKPxeqQa5yZ2IoMTgyLDE3Myw4KZLKPxfCiq5yZ2IoMTgyLDE3Myw4KZLKPxfa0q5yZ2IoMTgyLDE3Myw4KZLKPxfzGq5yZ2IoMTgyLDE3Myw4KZLKPxgLYq5yZ2IoMTgyLDE3Myw4KZLKPxgjqq5yZ2IoMTgyLDE3Myw4KZLKPxg78q5yZ2IoMTgyLDE3Myw5KZLKPxhUOq5yZ2IoMTgyLDE3Myw5KZLKPxhsgq5yZ2IoMTgyLDE3Myw5KZLKPxiEyq5yZ2IoMTgyLDE3Myw5KZLKPxidEq5yZ2IoMTgyLDE3Myw5KZLKPxi1Wq5yZ2IoMTgyLDE3NCw5KZLKPxjNoq5yZ2IoMTgyLDE3NCw5KZLKPxjl665yZ2IoMTgxLDE3NCw5KZLKPxj+M65yZ2IoMTgxLDE3NCw5KZLKPxkWe65yZ2IoMTgxLDE3NCw5KZLKPxkuw65yZ2IoMTgxLDE3NCw5KZLKPxlHC65yZ2IoMTgxLDE3NCw5KZLKPxlfU65yZ2IoMTgxLDE3NCw5KZLKPxl3m65yZ2IoMTgxLDE3NCw5KZLKPxmP465yZ2IoMTgxLDE3NCw5KZLKPxmoK65yZ2IoMTgxLDE3NSw5KZLKPxnAc69yZ2IoMTgxLDE3NSwxMCmSyj8Z2LuvcmdiKDE4MSwxNzUsMTApkso/GfEEr3JnYigxODEsMTc1LDEwKZLKPxoJTK9yZ2IoMTgxLDE3NSwxMCmSyj8aIZSvcmdiKDE4MSwxNzUsMTApkso/Gjncr3JnYigxODEsMTc1LDEwKZLKPxpSJK9yZ2IoMTgxLDE3NSwxMCmSyj8aamyvcmdiKDE4MSwxNzUsMTApkso/GoK0r3JnYigxODEsMTc1LDEwKZLKPxqa/K9yZ2IoMTgxLDE3NSwxMCmSyj8as0SvcmdiKDE4MSwxNzUsMTApkso/GsuMr3JnYigxODAsMTc2LDEwKZLKPxrj1K9yZ2IoMTgwLDE3NiwxMCmSyj8a/ByvcmdiKDE4MCwxNzYsMTApkso/GxRlr3JnYigxODAsMTc2LDExKZLKPxssra9yZ2IoMTgwLDE3NiwxMSmSyj8bRPWvcmdiKDE4MCwxNzYsMTEpkso/G109r3JnYigxODAsMTc2LDExKZLKPxt1ha9yZ2IoMTgwLDE3NiwxMSmSyj8bjc2vcmdiKDE4MCwxNzYsMTEpkso/G6YVr3JnYigxODAsMTc2LDExKZLKPxu+Xa9yZ2IoMTgwLDE3NiwxMSmSyj8b1qWvcmdiKDE4MCwxNzcsMTEpkso/G+7tr3JnYigxODAsMTc3LDExKZLKPxwHNa9yZ2IoMTgwLDE3NywxMSmSyj8cH32vcmdiKDE4MCwxNzcsMTEpkso/HDfGr3JnYigxODAsMTc3LDEyKZLKPxxQDq9yZ2IoMTgwLDE3NywxMimSyj8caFavcmdiKDE4MCwxNzcsMTIpkso/HICer3JnYigxODAsMTc3LDEyKZLKPxyY5q9yZ2IoMTc5LDE3NywxMimSyj8csS6vcmdiKDE3OSwxNzcsMTIpkso/HMl2r3JnYigxNzksMTc3LDEyKZLKPxzhvq9yZ2IoMTc5LDE3NywxMimSyj8c+gavcmdiKDE3OSwxNzgsMTIpkso/HRJOr3JnYigxNzksMTc4LDEyKZLKPx0qlq9yZ2IoMTc5LDE3OCwxMimSyj8dQt+vcmdiKDE3OSwxNzgsMTMpkso/HVsnr3JnYigxNzksMTc4LDEzKZLKPx1zb69yZ2IoMTc5LDE3OCwxMymSyj8di7evcmdiKDE3OSwxNzgsMTMpkso/HaP/r3JnYigxNzksMTc4LDEzKZLKPx28R69yZ2IoMTc5LDE3OCwxMymSyj8d1I+vcmdiKDE3OSwxNzgsMTMpkso/HezXr3JnYigxNzksMTc4LDEzKZLKPx4FH69yZ2IoMTc5LDE3OCwxMymSyj8eHWevcmdiKDE3OSwxNzgsMTMpkso/HjWvr3JnYigxNzksMTc5LDE0KZLKPx5N969yZ2IoMTc5LDE3OSwxNCmSyj8eZkCvcmdiKDE3OCwxNzksMTQpkso/Hn6Ir3JnYigxNzgsMTc5LDE0KZLKPx6W0K9yZ2IoMTc4LDE3OSwxNCmSyj8erxivcmdiKDE3OCwxNzksMTQpkso/Hsdgr3JnYigxNzgsMTc5LDE0KZLKPx7fqK9yZ2IoMTc4LDE3OSwxNCmSyj8e9/CvcmdiKDE3OCwxNzksMTQpkso/HxA4r3JnYigxNzgsMTc5LDE1KZLKPx8ogK9yZ2IoMTc4LDE3OSwxNSmSyj8fQMivcmdiKDE3OCwxNzksMTUpkso/H1kQr3JnYigxNzgsMTgwLDE1KZLKPx9xWK9yZ2IoMTc4LDE4MCwxNSmSyj8fiaGvcmdiKDE3OCwxODAsMTUpkso/H6Hpr3JnYigxNzgsMTgwLDE1KZLKPx+6Ma9yZ2IoMTc4LDE4MCwxNSmSyj8f0nmvcmdiKDE3OCwxODAsMTYpkso/H+rBr3JnYigxNzgsMTgwLDE2KZLKPyADCa9yZ2IoMTc4LDE4MCwxNimSyj8gG1GvcmdiKDE3OCwxODAsMTYpkso/IDOZr3JnYigxNzcsMTgwLDE2KZLKPyBL4a9yZ2IoMTc3LDE4MCwxNimSyj8gZCmvcmdiKDE3NywxODAsMTYpkso/IHxxr3JnYigxNzcsMTgwLDE2KZLKPyCUuq9yZ2IoMTc3LDE4MCwxNymSyj8grQKvcmdiKDE3NywxODEsMTcpkso/IMVKr3JnYigxNzcsMTgxLDE3KZLKPyDdkq9yZ2IoMTc3LDE4MSwxNymSyj8g9dqvcmdiKDE3NywxODEsMTcpkso/IQ4ir3JnYigxNzcsMTgxLDE3KZLKPyEmaq9yZ2IoMTc3LDE4MSwxNymSyj8hPrKvcmdiKDE3NywxODEsMTgpkso/IVb6r3JnYigxNzcsMTgxLDE4KZLKPyFvQq9yZ2IoMTc3LDE4MSwxOCmSyj8hh4qvcmdiKDE3NywxODEsMTgpkso/IZ/Sr3JnYigxNzcsMTgxLDE4KZLKPyG4G69yZ2IoMTc3LDE4MSwxOCmSyj8h0GOvcmdiKDE3NywxODEsMTgpkso/Ieirr3JnYigxNzYsMTgyLDE5KZLKPyIA869yZ2IoMTc2LDE4MiwxOSmSyj8iGTuvcmdiKDE3NiwxODIsMTkpkso/IjGDr3JnYigxNzYsMTgyLDE5KZLKPyJJy69yZ2IoMTc2LDE4MiwxOSmSyj8iYhOvcmdiKDE3NiwxODIsMTkpkso/Inpbr3JnYigxNzYsMTgyLDIwKZLKPyKSo69yZ2IoMTc2LDE4MiwyMCmSyj8iquuvcmdiKDE3NiwxODIsMjApkso/IsM0r3JnYigxNzYsMTgyLDIwKZLKPyLbfK9yZ2IoMTc2LDE4MiwyMCmSyj8i88SvcmdiKDE3NiwxODIsMjApkso/IwwMr3JnYigxNzYsMTgyLDIwKZLKPyMkVK9yZ2IoMTc2LDE4MiwyMSmSyj8jPJyvcmdiKDE3NiwxODMsMjEpkso/I1Tkr3JnYigxNzYsMTgzLDIxKZLKPyNtLK9yZ2IoMTc2LDE4MywyMSmSyj8jhXSvcmdiKDE3NiwxODMsMjEpkso/I528r3JnYigxNzYsMTgzLDIxKZLKPyO2BK9yZ2IoMTc1LDE4MywyMimSyj8jzkyvcmdiKDE3NSwxODMsMjIpkso/I+aVr3JnYigxNzUsMTgzLDIyKZLKPyP+3a9yZ2IoMTc1LDE4MywyMimSyj8kFyWvcmdiKDE3NSwxODMsMjIpkso/JC9tr3JnYigxNzUsMTgzLDIzKZLKPyRHta9yZ2IoMTc1LDE4MywyMymSyj8kX/2vcmdiKDE3NSwxODMsMjMpkso/JHhFr3JnYigxNzUsMTgzLDIzKZLKPySQja9yZ2IoMTc1LDE4MywyMymSyj8kqNWvcmdiKDE3NSwxODQsMjMpkso/JMEdr3JnYigxNzUsMTg0LDI0KZLKPyTZZa9yZ2IoMTc1LDE4NCwyNCmSyj8k8a2vcmdiKDE3NSwxODQsMjQpkso/JQn2r3JnYigxNzUsMTg0LDI0KZLKPyUiPq9yZ2IoMTc1LDE4NCwyNCmSyj8lOoavcmdiKDE3NSwxODQsMjUpkso/JVLOr3JnYigxNzUsMTg0LDI1KZLKPyVrFq9yZ2IoMTc0LDE4NCwyNSmSyj8lg16vcmdiKDE3NCwxODQsMjUpkso/JZumr3JnYigxNzQsMTg0LDI1KZLKPyWz7q9yZ2IoMTc0LDE4NCwyNimSyj8lzDavcmdiKDE3NCwxODQsMjYpkso/JeR+r3JnYigxNzQsMTg0LDI2KZLKPyX8xq9yZ2IoMTc0LDE4NCwyNimSyj8mFQ+vcmdiKDE3NCwxODQsMjYpkso/Ji1Xr3JnYigxNzQsMTg1LDI3KZLKPyZFn69yZ2IoMTc0LDE4NSwyNymSyj8mXeevcmdiKDE3NCwxODUsMjcpkso/JnYvr3JnYigxNzQsMTg1LDI3KZLKPyaOd69yZ2IoMTc0LDE4NSwyNymSyj8mpr+vcmdiKDE3NCwxODUsMjgpkso/Jr8Hr3JnYigxNzQsMTg1LDI4KZLKPybXT69yZ2IoMTc0LDE4NSwyOCmSyj8m75evcmdiKDE3NCwxODUsMjgpkso/Jwffr3JnYigxNzQsMTg1LDI4KZLKPycgJ69yZ2IoMTc0LDE4NSwyOSmSyj8nOHCvcmdiKDE3MywxODUsMjkpkso/J1C4r3JnYigxNzMsMTg1LDI5KZLKPydpAK9yZ2IoMTczLDE4NSwyOSmSyj8ngUivcmdiKDE3MywxODUsMjkpkso/J5mQr3JnYigxNzMsMTg1LDMwKZLKPyex2K9yZ2IoMTczLDE4NiwzMCmSyj8nyiCvcmdiKDE3MywxODYsMzApkso/J+Jor3JnYigxNzMsMTg2LDMwKZLKPyf6sK9yZ2IoMTczLDE4NiwzMSmSyj8oEvivcmdiKDE3MywxODYsMzEpkso/KCtAr3JnYigxNzMsMTg2LDMxKZLKPyhDiK9yZ2IoMTczLDE4NiwzMSmSyj8oW9GvcmdiKDE3MywxODYsMzEpkso/KHQZr3JnYigxNzMsMTg2LDMyKZLKPyiMYa9yZ2IoMTczLDE4NiwzMimSyj8opKmvcmdiKDE3MywxODYsMzIpkso/KLzxr3JnYigxNzMsMTg2LDMyKZLKPyjVOa9yZ2IoMTczLDE4NiwzMymSyj8o7YGvcmdiKDE3MywxODYsMzMpkso/KQXJr3JnYigxNzIsMTg2LDMzKZLKPykeEa9yZ2IoMTcyLDE4NiwzMymSyj8pNlmvcmdiKDE3MiwxODYsMzQpkso/KU6hr3JnYigxNzIsMTg3LDM0KZLKPylm6q9yZ2IoMTcyLDE4NywzNCmSyj8pfzKvcmdiKDE3MiwxODcsMzQpkso/KZd6r3JnYigxNzIsMTg3LDM1KZLKPymvwq9yZ2IoMTcyLDE4NywzNSmSyj8pyAqvcmdiKDE3MiwxODcsMzUpkso/KeBSr3JnYigxNzIsMTg3LDM1KZLKPyn4mq9yZ2IoMTcyLDE4NywzNimSyj8qEOKvcmdiKDE3MiwxODcsMzYpkso/Kikqr3JnYigxNzIsMTg3LDM2KZLKPypBcq9yZ2IoMTcyLDE4NywzNimSyj8qWbqvcmdiKDE3MiwxODcsMzcpkso/KnICr3JnYigxNzIsMTg3LDM3KZLKPyqKS69yZ2IoMTcyLDE4NywzNymSyj8qopOvcmdiKDE3MiwxODcsMzcpkso/Krrbr3JnYigxNzIsMTg3LDM4KZLKPyrTI69yZ2IoMTcxLDE4NywzOCmSyj8q62uvcmdiKDE3MSwxODgsMzgpkso/KwOzr3JnYigxNzEsMTg4LDM4KZLKPysb+69yZ2IoMTcxLDE4OCwzOSmSyj8rNEOvcmdiKDE3MSwxODgsMzkpkso/K0yLr3JnYigxNzEsMTg4LDM5KZLKPytk069yZ2IoMTcxLDE4OCwzOSmSyj8rfRuvcmdiKDE3MSwxODgsNDApkso/K5Vjr3JnYigxNzEsMTg4LDQwKZLKPyutrK9yZ2IoMTcxLDE4OCw0MCmSyj8rxfSvcmdiKDE3MSwxODgsNDEpkso/K948r3JnYigxNzEsMTg4LDQxKZLKPyv2hK9yZ2IoMTcxLDE4OCw0MSmSyj8sDsyvcmdiKDE3MSwxODgsNDEpkso/LCcUr3JnYigxNzEsMTg4LDQyKZLKPyw/XK9yZ2IoMTcxLDE4OCw0MimSyj8sV6SvcmdiKDE3MSwxODgsNDIpkso/LG/sr3JnYigxNzEsMTg4LDQyKZLKPyyINK9yZ2IoMTcxLDE4OCw0MymSyj8soHyvcmdiKDE3MSwxODgsNDMpkso/LLjFr3JnYigxNzAsMTg5LDQzKZLKPyzRDa9yZ2IoMTcwLDE4OSw0NCmSyj8s6VWvcmdiKDE3MCwxODksNDQpkso/LQGdr3JnYigxNzAsMTg5LDQ0KZLKPy0Z5a9yZ2IoMTcwLDE4OSw0NCmSyj8tMi2vcmdiKDE3MCwxODksNDUpkso/LUp1r3JnYigxNzAsMTg5LDQ1KZLKPy1iva9yZ2IoMTcwLDE4OSw0NSmSyj8tewWvcmdiKDE3MCwxODksNDYpkso/LZNNr3JnYigxNzAsMTg5LDQ2KZLKPy2rla9yZ2IoMTcwLDE4OSw0NimSyj8tw92vcmdiKDE3MCwxODksNDYpkso/Ldwmr3JnYigxNzAsMTg5LDQ3KZLKPy30bq9yZ2IoMTcwLDE4OSw0NymSyj8uDLavcmdiKDE3MCwxODksNDcpkso/LiT+r3JnYigxNzAsMTg5LDQ4KZLKPy49Rq9yZ2IoMTcwLDE4OSw0OCmSyj8uVY6vcmdiKDE3MCwxODksNDgpkso/Lm3Wr3JnYigxNzAsMTg5LDQ4KZLKPy6GHq9yZ2IoMTY5LDE4OSw0OSmSyj8unmavcmdiKDE2OSwxOTAsNDkpkso/Lraur3JnYigxNjksMTkwLDQ5KZLKPy7O9q9yZ2IoMTY5LDE5MCw1MCmSyj8u5z+vcmdiKDE2OSwxOTAsNTApkso/Lv+Hr3JnYigxNjksMTkwLDUwKZLKPy8Xz69yZ2IoMTY5LDE5MCw1MSmSyj8vMBevcmdiKDE2OSwxOTAsNTEpkso/L0hfr3JnYigxNjksMTkwLDUxKZLKPy9gp69yZ2IoMTY5LDE5MCw1MSmSyj8veO+vcmdiKDE2OSwxOTAsNTIpkso/L5E3r3JnYigxNjksMTkwLDUyKZLKPy+pf69yZ2IoMTY5LDE5MCw1MimSyj8vwcevcmdiKDE2OSwxOTAsNTMpkso/L9oPr3JnYigxNjksMTkwLDUzKZLKPy/yV69yZ2IoMTY5LDE5MCw1MymSyj8wCqCvcmdiKDE2OSwxOTAsNTQpkso/MCLor3JnYigxNjksMTkwLDU0KZLKPzA7MK9yZ2IoMTY5LDE5MCw1NCmSyj8wU3ivcmdiKDE2OSwxOTAsNTUpkso/MGvAr3JnYigxNjksMTkwLDU1KZLKPzCECK9yZ2IoMTY4LDE5MCw1NSmSyj8wnFCvcmdiKDE2OCwxOTEsNTUpkso/MLSYr3JnYigxNjgsMTkxLDU2KZLKPzDM4K9yZ2IoMTY4LDE5MSw1NimSyj8w5SivcmdiKDE2OCwxOTEsNTYpkso/MP1wr3JnYigxNjgsMTkxLDU3KZLKPzEVuK9yZ2IoMTY4LDE5MSw1NymSyj8xLgGvcmdiKDE2OCwxOTEsNTcpkso/MUZJr3JnYigxNjgsMTkxLDU4KZLKPzFeka9yZ2IoMTY4LDE5MSw1OCmSyj8xdtmvcmdiKDE2OCwxOTEsNTgpkso/MY8hr3JnYigxNjgsMTkxLDU5KZLKPzGnaa9yZ2IoMTY4LDE5MSw1OSmSyj8xv7GvcmdiKDE2OCwxOTEsNTkpkso/Mdf5r3JnYigxNjgsMTkxLDYwKZLKPzHwQa9yZ2IoMTY4LDE5MSw2MCmSyj8yCImvcmdiKDE2OCwxOTEsNjApkso/MiDRr3JnYigxNjgsMTkxLDYxKZLKPzI5Gq9yZ2IoMTY4LDE5MSw2MSmSyj8yUWKvcmdiKDE2OCwxOTEsNjEpkso/Mmmqr3JnYigxNjgsMTkxLDYyKZLKPzKB8q9yZ2IoMTY3LDE5MSw2MimSyj8ymjqvcmdiKDE2NywxOTEsNjIpkso/MrKCr3JnYigxNjcsMTkyLDYzKZLKPzLKyq9yZ2IoMTY3LDE5Miw2MymSyj8y4xKvcmdiKDE2NywxOTIsNjMpkso/Mvtar3JnYigxNjcsMTkyLDYzKZLKPzMToq9yZ2IoMTY3LDE5Miw2NCmSyj8zK+qvcmdiKDE2NywxOTIsNjQpkso/M0Qyr3JnYigxNjcsMTkyLDY0KZLKPzNce69yZ2IoMTY3LDE5Miw2NSmSyj8zdMOvcmdiKDE2NywxOTIsNjUpkso/M40Lr3JnYigxNjcsMTkyLDY1KZLKPzOlU69yZ2IoMTY3LDE5Miw2NimSyj8zvZuvcmdiKDE2NywxOTIsNjYpkso/M9Xjr3JnYigxNjcsMTkyLDY2KZLKPzPuK69yZ2IoMTY3LDE5Miw2NymSyj80BnOvcmdiKDE2NywxOTIsNjcpkso/NB67r3JnYigxNjcsMTkyLDY3KZLKPzQ3A69yZ2IoMTY3LDE5Miw2OCmSyj80T0uvcmdiKDE2NywxOTIsNjgpkso/NGeTr3JnYigxNjcsMTkyLDY4KZLKPzR/3K9yZ2IoMTY3LDE5Miw2OSmSyj80mCSvcmdiKDE2NiwxOTIsNjkpkso/NLBsr3JnYigxNjYsMTkyLDY5KZLKPzTItK9yZ2IoMTY2LDE5Miw3MCmSyj804PyvcmdiKDE2NiwxOTIsNzApkso/NPlEr3JnYigxNjYsMTkzLDcwKZLKPzURjK9yZ2IoMTY2LDE5Myw3MSmSyj81KdSvcmdiKDE2NiwxOTMsNzEpkso/NUIcr3JnYigxNjYsMTkzLDcxKZLKPzVaZK9yZ2IoMTY2LDE5Myw3MimSyj81cqyvcmdiKDE2NiwxOTMsNzIpkso/NYr1r3JnYigxNjYsMTkzLDcyKZLKPzWjPa9yZ2IoMTY2LDE5Myw3MymSyj81u4WvcmdiKDE2NiwxOTMsNzMpkso/NdPNr3JnYigxNjYsMTkzLDczKZLKPzXsFa9yZ2IoMTY2LDE5Myw3NCmSyj82BF2vcmdiKDE2NiwxOTMsNzQpkso/Nhylr3JnYigxNjYsMTkzLDc0KZLKPzY07a9yZ2IoMTY2LDE5Myw3NSmSyj82TTWvcmdiKDE2NiwxOTMsNzUpkso/NmV9r3JnYigxNjYsMTkzLDc1KZLKPzZ9xa9yZ2IoMTY2LDE5Myw3NimSyj82lg2vcmdiKDE2NiwxOTMsNzYpkso/Nq5Wr3JnYigxNjYsMTkzLDc2KZLKPzbGnq9yZ2IoMTY2LDE5Myw3NymSyj823uavcmdiKDE2NSwxOTMsNzcpkso/Nvcur3JnYigxNjUsMTkzLDc4KZLKPzcPdq9yZ2IoMTY1LDE5Myw3OCmSyj83J76vcmdiKDE2NSwxOTMsNzgpkso/N0AGr3JnYigxNjUsMTkzLDc5KZLKPzdYTq9yZ2IoMTY1LDE5Myw3OSmSyj83cJavcmdiKDE2NSwxOTQsNzkpkso/N4jer3JnYigxNjUsMTk0LDgwKZLKPzehJq9yZ2IoMTY1LDE5NCw4MCmSyj83uW+vcmdiKDE2NSwxOTQsODApkso/N9G3r3JnYigxNjUsMTk0LDgxKZLKPzfp/69yZ2IoMTY1LDE5NCw4MSmSyj84AkevcmdiKDE2NSwxOTQsODEpkso/OBqPr3JnYigxNjUsMTk0LDgyKZLKPzgy169yZ2IoMTY1LDE5NCw4MimSyj84Sx+vcmdiKDE2NSwxOTQsODIpkso/OGNnr3JnYigxNjUsMTk0LDgzKZLKPzh7r69yZ2IoMTY1LDE5NCw4MymSyj84k/evcmdiKDE2NSwxOTQsODMpkso/OKw/r3JnYigxNjUsMTk0LDg0KZLKPzjEh69yZ2IoMTY1LDE5NCw4NCmSyj843NCvcmdiKDE2NSwxOTQsODQpkso/OPUYr3JnYigxNjUsMTk0LDg1KZLKPzkNYK9yZ2IoMTY1LDE5NCw4NSmSyj85JaivcmdiKDE2NSwxOTQsODUpkso/OT3wr3JnYigxNjUsMTk0LDg2KZLKPzlWOK9yZ2IoMTY0LDE5NCw4NimSyj85boCvcmdiKDE2NCwxOTQsODYpkso/OYbIr3JnYigxNjQsMTk0LDg3KZLKPzmfEK9yZ2IoMTY0LDE5NCw4NymSyj85t1ivcmdiKDE2NCwxOTQsODcpkso/Oc+gr3JnYigxNjQsMTk0LDg4KZLKPznn6K9yZ2IoMTY0LDE5NCw4OCmSyj86ADGvcmdiKDE2NCwxOTQsODgpkso/Ohh5r3JnYigxNjQsMTk1LDg5KZLKPzowwa9yZ2IoMTY0LDE5NSw4OSmSyj86SQmvcmdiKDE2NCwxOTUsODkpkso/OmFRr3JnYigxNjQsMTk1LDkwKZLKPzp5ma9yZ2IoMTY0LDE5NSw5MCmSyj86keGvcmdiKDE2NCwxOTUsOTApkso/Oqopr3JnYigxNjQsMTk1LDkxKZLKPzrCca9yZ2IoMTY0LDE5NSw5MSmSyj862rmvcmdiKDE2NCwxOTUsOTEpkso/OvMBr3JnYigxNjQsMTk1LDkyKZLKPzsLSq9yZ2IoMTY0LDE5NSw5MimSyj87I5KvcmdiKDE2NCwxOTUsOTIpkso/Ozvar3JnYigxNjQsMTk1LDkzKZLKPztUIq9yZ2IoMTY0LDE5NSw5MymSyj87bGqvcmdiKDE2NCwxOTUsOTMpkso/O4Syr3JnYigxNjQsMTk1LDk0KZLKPzuc+q9yZ2IoMTY0LDE5NSw5NCmSyj87tUKvcmdiKDE2NCwxOTUsOTQpkso/O82Kr3JnYigxNjQsMTk1LDk1KZLKPzvl0q9yZ2IoMTY0LDE5NSw5NSmSyj87/hqvcmdiKDE2NCwxOTUsOTUpkso/PBZir3JnYigxNjMsMTk1LDk2KZLKPzwuq69yZ2IoMTYzLDE5NSw5NimSyj88RvOvcmdiKDE2MywxOTUsOTYpkso/PF87r3JnYigxNjMsMTk1LDk3KZLKPzx3g69yZ2IoMTYzLDE5NSw5NymSyj88j8uvcmdiKDE2MywxOTUsOTcpkso/PKgTr3JnYigxNjMsMTk1LDk4KZLKPzzAW69yZ2IoMTYzLDE5NSw5OCmSyj882KOvcmdiKDE2MywxOTUsOTgpkso/PPDrr3JnYigxNjMsMTk2LDk5KZLKPz0JM69yZ2IoMTYzLDE5Niw5OSmSyj89IXuvcmdiKDE2MywxOTYsOTkpkso/PTnDsHJnYigxNjMsMTk2LDEwMCmSyj89UgywcmdiKDE2MywxOTYsMTAwKZLKPz1qVLByZ2IoMTYzLDE5NiwxMDApkso/PYKcsHJnYigxNjMsMTk2LDEwMSmSyj89muSwcmdiKDE2MywxOTYsMTAxKZLKPz2zLLByZ2IoMTYzLDE5NiwxMDEpkso/Pct0sHJnYigxNjMsMTk2LDEwMimSyj8947ywcmdiKDE2MywxOTYsMTAyKZLKPz38BLByZ2IoMTYzLDE5NiwxMDIpkso/PhRMsHJnYigxNjMsMTk2LDEwMymSyj8+LJSwcmdiKDE2MywxOTYsMTAzKZLKPz5E3LByZ2IoMTYzLDE5NiwxMDMpkso/Pl0lsHJnYigxNjMsMTk2LDEwNCmSyj8+dW2wcmdiKDE2MywxOTYsMTA0KZLKPz6NtbByZ2IoMTYzLDE5NiwxMDQpkso/PqX9sHJnYigxNjMsMTk2LDEwNCmSyj8+vkWwcmdiKDE2MywxOTYsMTA1KZLKPz7WjbByZ2IoMTYzLDE5NiwxMDUpkso/Pu7VsHJnYigxNjMsMTk2LDEwNSmSyj8/Bx2wcmdiKDE2MywxOTYsMTA2KZLKPz8fZbByZ2IoMTYzLDE5NiwxMDYpkso/PzetsHJnYigxNjMsMTk2LDEwNimSyj8/T/WwcmdiKDE2MywxOTYsMTA3KZLKPz9oPbByZ2IoMTYyLDE5NiwxMDcpkso/P4CGsHJnYigxNjIsMTk2LDEwNymSyj8/mM6wcmdiKDE2MiwxOTYsMTA4KZLKPz+xFrByZ2IoMTYyLDE5NiwxMDgpkso/P8lesHJnYigxNjIsMTk2LDEwOCmSyj8/4aawcmdiKDE2MiwxOTYsMTA5KZLKPz/57rByZ2IoMTYyLDE5NiwxMDkpkso/QBI2sHJnYigxNjIsMTk2LDEwOSmSyj9AKn6wcmdiKDE2MiwxOTYsMTEwKZLKP0BCxrByZ2IoMTYyLDE5NywxMTApkso/QFsOsHJnYigxNjIsMTk3LDExMCmSyj9Ac1awcmdiKDE2MiwxOTcsMTExKZLKP0CLnrByZ2IoMTYyLDE5NywxMTEpkso/QKPnsHJnYigxNjIsMTk3LDExMSmSyj9AvC+wcmdiKDE2MiwxOTcsMTExKZLKP0DUd7ByZ2IoMTYyLDE5NywxMTIpkso/QOy/sHJnYigxNjIsMTk3LDExMimSyj9BBQewcmdiKDE2MiwxOTcsMTEyKZLKP0EdT7ByZ2IoMTYyLDE5NywxMTMpkso/QTWXsHJnYigxNjIsMTk3LDExMymSyj9BTd+wcmdiKDE2MiwxOTcsMTEzKZLKP0FmJ7ByZ2IoMTYyLDE5NywxMTQpkso/QX5vsHJnYigxNjIsMTk3LDExNCmSyj9BlrewcmdiKDE2MiwxOTcsMTE0KZLKP0GvALByZ2IoMTYyLDE5NywxMTUpkso/QcdIsHJnYigxNjIsMTk3LDExNSmSyj9B35CwcmdiKDE2MiwxOTcsMTE1KZLKP0H32LByZ2IoMTYyLDE5NywxMTUpkso/QhAgsHJnYigxNjIsMTk3LDExNimSyj9CKGiwcmdiKDE2MiwxOTcsMTE2KZLKP0JAsLByZ2IoMTYyLDE5NywxMTYpkso/Qlj4sHJnYigxNjIsMTk3LDExNymSyj9CcUCwcmdiKDE2MiwxOTcsMTE3KZLKP0KJiLByZ2IoMTYyLDE5NywxMTcpkso/QqHQsHJnYigxNjIsMTk3LDExOCmSyj9CuhiwcmdiKDE2MiwxOTcsMTE4KZLKP0LSYbByZ2IoMTYyLDE5NywxMTgpkso/QuqpsHJnYigxNjIsMTk3LDExOCmSyj9DAvGwcmdiKDE2MiwxOTcsMTE5KZLKP0MbObByZ2IoMTYyLDE5NywxMTkpkso/QzOBsHJnYigxNjIsMTk3LDExOSmSyj9DS8mwcmdiKDE2MiwxOTcsMTIwKZLKP0NkEbByZ2IoMTYyLDE5NywxMjApkso/Q3xZsHJnYigxNjIsMTk3LDEyMCmSyj9DlKGwcmdiKDE2MiwxOTcsMTIxKZLKP0Os6bByZ2IoMTYyLDE5NywxMjEpkso/Q8UxsHJnYigxNjIsMTk3LDEyMSmSyj9D3XqwcmdiKDE2MiwxOTgsMTIxKZLKP0P1wrByZ2IoMTYyLDE5OCwxMjIpkso/RA4KsHJnYigxNjIsMTk4LDEyMimSyj9EJlKwcmdiKDE2MiwxOTgsMTIyKZLKP0Q+mrByZ2IoMTYxLDE5OCwxMjMpkso/RFbisHJnYigxNjEsMTk4LDEyMymSyj9EbyqwcmdiKDE2MSwxOTgsMTIzKZLKP0SHcrByZ2IoMTYxLDE5OCwxMjMpkso/RJ+6sHJnYigxNjEsMTk4LDEyNCmSyj9EuAKwcmdiKDE2MSwxOTgsMTI0KZLKP0TQSrByZ2IoMTYxLDE5OCwxMjQpkso/ROiSsHJnYigxNjEsMTk4LDEyNSmSyj9FANuwcmdiKDE2MSwxOTgsMTI1KZLKP0UZI7ByZ2IoMTYxLDE5OCwxMjUpkso/RTFrsHJnYigxNjEsMTk4LDEyNSmSyj9FSbOwcmdiKDE2MSwxOTgsMTI2KZLKP0Vh+7ByZ2IoMTYxLDE5OCwxMjYpkso/RXpDsHJnYigxNjEsMTk4LDEyNimSyj9FkouwcmdiKDE2MSwxOTgsMTI3KZLKP0Wq07ByZ2IoMTYxLDE5OCwxMjcpkso/RcMbsHJnYigxNjEsMTk4LDEyNymSyj9F22OwcmdiKDE2MSwxOTgsMTI3KZLKP0Xzq7ByZ2IoMTYxLDE5OCwxMjgpkso/RgvzsHJnYigxNjEsMTk4LDEyOCmSyj9GJDywcmdiKDE2MSwxOTgsMTI4KZLKP0Y8hLByZ2IoMTYxLDE5OCwxMjkpkso/RlTMsHJnYigxNjEsMTk4LDEyOSmSyj9GbRSwcmdiKDE2MSwxOTgsMTI5KZLKP0aFXLByZ2IoMTYxLDE5OCwxMjkpkso/Rp2ksHJnYigxNjEsMTk4LDEzMCmSyj9GteywcmdiKDE2MSwxOTgsMTMwKZLKP0bONLByZ2IoMTYxLDE5OCwxMzApkso/RuZ8sHJnYigxNjEsMTk4LDEzMCmSyj9G/sSwcmdiKDE2MSwxOTgsMTMxKZLKP0cXDLByZ2IoMTYxLDE5OCwxMzEpkso/Ry9VsHJnYigxNjEsMTk4LDEzMSmSyj9HR52wcmdiKDE2MSwxOTgsMTMyKZLKP0df5bByZ2IoMTYxLDE5OCwxMzIpkso/R3gtsHJnYigxNjEsMTk4LDEzMimSyj9HkHWwcmdiKDE2MSwxOTgsMTMyKZLKP0eovbByZ2IoMTYxLDE5OCwxMzMpkso/R8EFsHJnYigxNjEsMTk4LDEzMymSyj9H2U2wcmdiKDE2MSwxOTgsMTMzKZLKP0fxlbByZ2IoMTYxLDE5OCwxMzMpkso/SAndsHJnYigxNjEsMTk4LDEzNCmSyj9IIiWwcmdiKDE2MSwxOTgsMTM0KZLKP0g6bbByZ2IoMTYxLDE5OSwxMzQpkso/SFK2sHJnYigxNjEsMTk5LDEzNCmSyj9Iav6wcmdiKDE2MSwxOTksMTM1KZLKP0iDRrByZ2IoMTYxLDE5OSwxMzUpkso/SJuOsHJnYigxNjEsMTk5LDEzNSmSyj9Is9awcmdiKDE2MSwxOTksMTM1KZLKP0jMHrByZ2IoMTYxLDE5OSwxMzYpkso/SORmsHJnYigxNjEsMTk5LDEzNimSyj9I/K6wcmdiKDE2MSwxOTksMTM2KZLKP0kU9rByZ2IoMTYxLDE5OSwxMzYpkso/SS0+sHJnYigxNjEsMTk5LDEzNymSyj9JRYawcmdiKDE2MSwxOTksMTM3KZLKP0ldzrByZ2IoMTYxLDE5OSwxMzcpkso/SXYXsHJnYigxNjEsMTk5LDEzNymSyj9Jjl+wcmdiKDE2MSwxOTksMTM4KZLKP0mmp7ByZ2IoMTYxLDE5OSwxMzgpkso/Sb7vsHJnYigxNjEsMTk5LDEzOCmSyj9J1zewcmdiKDE2MSwxOTksMTM4KZLKP0nvf7ByZ2IoMTYxLDE5OSwxMzkpkso/SgfHsHJnYigxNjEsMTk5LDEzOSmSyj9KIA+wcmdiKDE2MSwxOTksMTM5KZLKP0o4V7ByZ2IoMTYxLDE5OSwxMzkpkso/SlCfsHJnYigxNjEsMTk5LDE0MCmSyj9KaOewcmdiKDE2MSwxOTksMTQwKZLKP0qBMLByZ2IoMTYxLDE5OSwxNDApkso/Spl4sHJnYigxNjEsMTk5LDE0MCmSyj9KscCwcmdiKDE2MSwxOTksMTQxKZLKP0rKCLByZ2IoMTYxLDE5OSwxNDEpkso/SuJQsHJnYigxNjEsMTk5LDE0MSmSyj9K+piwcmdiKDE2MSwxOTksMTQxKZLKP0sS4LByZ2IoMTYxLDE5OSwxNDIpkso/SysosHJnYigxNjEsMTk5LDE0MimSyj9LQ3CwcmdiKDE2MSwxOTksMTQyKZLKP0tbuLByZ2IoMTYxLDE5OSwxNDIpkso/S3QAsHJnYigxNjEsMTk5LDE0MymSyj9LjEiwcmdiKDE2MSwxOTksMTQzKZLKP0ukkbByZ2IoMTYxLDE5OSwxNDMpkso/S7zZsHJnYigxNjEsMTk5LDE0MymSyj9L1SGwcmdiKDE2MSwxOTksMTQ0KZLKP0vtabByZ2IoMTYxLDE5OSwxNDQpkso/TAWxsHJnYigxNjEsMTk5LDE0NCmSyj9MHfmwcmdiKDE2MSwxOTksMTQ0KZLKP0w2QbByZ2IoMTYxLDE5OSwxNDUpkso/TE6JsHJnYigxNjEsMTk5LDE0NSmSyj9MZtGwcmdiKDE2MSwxOTksMTQ1KZLKP0x/GbByZ2IoMTYxLDE5OSwxNDUpkso/TJdhsHJnYigxNjEsMTk5LDE0NSmSyj9Mr6mwcmdiKDE2MSwxOTksMTQ2KZLKP0zH8rByZ2IoMTYxLDE5OSwxNDYpkso/TOA6sHJnYigxNjEsMTk5LDE0NimSyj9M+IKwcmdiKDE2MSwxOTksMTQ2KZLKP00QyrByZ2IoMTYxLDE5OSwxNDcpkso/TSkSsHJnYigxNjEsMTk5LDE0NymSyj9NQVqwcmdiKDE2MSwxOTksMTQ3KZLKP01ZorByZ2IoMTYxLDE5OSwxNDcpkso/TXHqsHJnYigxNjEsMTk5LDE0NymSyj9NijKwcmdiKDE2MSwyMDAsMTQ4KZLKP02ierByZ2IoMTYxLDIwMCwxNDgpkso/TbrCsHJnYigxNjEsMjAwLDE0OCmSyj9N0wuwcmdiKDE2MSwyMDAsMTQ4KZLKP03rU7ByZ2IoMTYxLDIwMCwxNDkpkso/TgObsHJnYigxNjEsMjAwLDE0OSmSyj9OG+OwcmdiKDE2MiwyMDAsMTQ5KZLKP040K7ByZ2IoMTYyLDIwMCwxNDkpkso/TkxzsHJnYigxNjIsMjAwLDE0OSmSyj9OZLuwcmdiKDE2MiwyMDAsMTUwKZLKP059A7ByZ2IoMTYyLDIwMCwxNTApkso/TpVLsHJnYigxNjIsMjAwLDE1MCmSyj9OrZOwcmdiKDE2MiwyMDAsMTUwKZLKP07F27ByZ2IoMTYyLDIwMCwxNTEpkso/Tt4jsHJnYigxNjIsMjAwLDE1MSmSyj9O9mywcmdiKDE2MiwyMDAsMTUxKZLKP08OtLByZ2IoMTYyLDIwMCwxNTEpkso/Tyb8sHJnYigxNjIsMjAwLDE1MSmSyj9PP0SwcmdiKDE2MiwyMDAsMTUyKZLKP09XjLByZ2IoMTYyLDIwMCwxNTIpkso/T2/UsHJnYigxNjIsMjAwLDE1MimSyj9PiBywcmdiKDE2MiwyMDAsMTUyKZLKP0+gZLByZ2IoMTYyLDIwMCwxNTIpkso/T7issHJnYigxNjIsMjAwLDE1MymSyj9P0PSwcmdiKDE2MiwyMDAsMTUzKZLKP0/pPLByZ2IoMTYyLDIwMCwxNTMpkso/UAGFsHJnYigxNjIsMjAwLDE1MymSyj9QGc2wcmdiKDE2MiwyMDAsMTUzKZLKP1AyFbByZ2IoMTYyLDIwMCwxNTQpkso/UEpdsHJnYigxNjIsMjAwLDE1NCmSyj9QYqWwcmdiKDE2MiwyMDAsMTU0KZLKP1B67bByZ2IoMTYyLDIwMCwxNTQpkso/UJM1sHJnYigxNjIsMjAwLDE1NCmSyj9Qq32wcmdiKDE2MiwyMDAsMTU1KZLKP1DDxbByZ2IoMTYyLDIwMCwxNTUpkso/UNwNsHJnYigxNjIsMjAwLDE1NSmSyj9Q9FWwcmdiKDE2MiwyMDAsMTU1KZLKP1EMnbByZ2IoMTYyLDIwMCwxNTUpkso/USTmsHJnYigxNjIsMjAwLDE1NimSyj9RPS6wcmdiKDE2MiwyMDAsMTU2KZLKP1FVdrByZ2IoMTYyLDIwMCwxNTYpkso/UW2+sHJnYigxNjIsMjAwLDE1NimSyj9RhgawcmdiKDE2MiwyMDAsMTU2KZLKP1GeTrByZ2IoMTYyLDIwMCwxNTcpkso/UbaWsHJnYigxNjIsMjAwLDE1NymSyj9Rzt6wcmdiKDE2MiwyMDAsMTU3KZLKP1HnJrByZ2IoMTYyLDIwMCwxNTcpkso/Uf9usHJnYigxNjIsMjAwLDE1NymSyj9SF7awcmdiKDE2MiwyMDAsMTU4KZLKP1Iv/rByZ2IoMTYyLDIwMCwxNTgpkso/UkhHsHJnYigxNjIsMjAwLDE1OCmSyj9SYI+wcmdiKDE2MiwyMDAsMTU4KZLKP1J417ByZ2IoMTYzLDIwMCwxNTgpkso/UpEfsHJnYigxNjMsMjAwLDE1OSmSyj9SqWewcmdiKDE2MywyMDAsMTU5KZLKP1LBr7ByZ2IoMTYzLDIwMCwxNTkpkso/Utn3sHJnYigxNjMsMjAwLDE1OSmSyj9S8j+wcmdiKDE2MywyMDAsMTU5KZLKP1MKh7ByZ2IoMTYzLDIwMCwxNTkpkso/UyLPsHJnYigxNjMsMjAwLDE2MCmSyj9TOxewcmdiKDE2MywyMDAsMTYwKZLKP1NTYLByZ2IoMTYzLDIwMCwxNjApkso/U2uosHJnYigxNjMsMjAwLDE2MCmSyj9Tg/CwcmdiKDE2MywyMDAsMTYwKZLKP1OcOLByZ2IoMTYzLDIwMCwxNjEpkso/U7SAsHJnYigxNjMsMjAwLDE2MSmSyj9TzMiwcmdiKDE2MywyMDAsMTYxKZLKP1PlELByZ2IoMTYzLDIwMCwxNjEpkso/U/1YsHJnYigxNjMsMjAwLDE2MSmSyj9UFaCwcmdiKDE2MywyMDAsMTYxKZLKP1Qt6LByZ2IoMTYzLDIwMCwxNjIpkso/VEYwsHJnYigxNjMsMjAwLDE2MimSyj9UXniwcmdiKDE2MywyMDAsMTYyKZLKP1R2wbByZ2IoMTYzLDIwMCwxNjIpkso/VI8JsHJnYigxNjMsMjAwLDE2MimSyj9Up1GwcmdiKDE2MywyMDAsMTYzKZLKP1S/mbByZ2IoMTYzLDIwMCwxNjMpkso/VNfhsHJnYigxNjMsMjAxLDE2MymSyj9U8CmwcmdiKDE2MywyMDEsMTYzKZLKP1UIcbByZ2IoMTYzLDIwMSwxNjMpkso/VSC5sHJnYigxNjMsMjAxLDE2MymSyj9VOQGwcmdiKDE2NCwyMDEsMTY0KZLKP1VRSbByZ2IoMTY0LDIwMSwxNjQpkso/VWmRsHJnYigxNjQsMjAxLDE2NCmSyj9VgdmwcmdiKDE2NCwyMDEsMTY0KZLKP1WaIrByZ2IoMTY0LDIwMSwxNjQpkso/VbJqsHJnYigxNjQsMjAxLDE2NCmSyj9VyrKwcmdiKDE2NCwyMDEsMTY1KZLKP1Xi+rByZ2IoMTY0LDIwMSwxNjUpkso/VftCsHJnYigxNjQsMjAxLDE2NSmSyj9WE4qwcmdiKDE2NCwyMDEsMTY1KZLKP1Yr0rByZ2IoMTY0LDIwMSwxNjUpkso/VkQasHJnYigxNjQsMjAxLDE2NSmSyj9WXGKwcmdiKDE2NCwyMDEsMTY2KZLKP1Z0qrByZ2IoMTY0LDIwMSwxNjYpkso/VozysHJnYigxNjQsMjAxLDE2NimSyj9WpTuwcmdiKDE2NCwyMDEsMTY2KZLKP1a9g7ByZ2IoMTY0LDIwMSwxNjYpkso/VtXLsHJnYigxNjQsMjAxLDE2NimSyj9W7hOwcmdiKDE2NCwyMDEsMTY3KZLKP1cGW7ByZ2IoMTY0LDIwMSwxNjcpkso/Vx6jsHJnYigxNjQsMjAxLDE2NymSyj9XNuuwcmdiKDE2NCwyMDEsMTY3KZLKP1dPM7ByZ2IoMTY0LDIwMSwxNjcpkso/V2d7sHJnYigxNjQsMjAxLDE2NymSyj9Xf8OwcmdiKDE2NCwyMDEsMTY3KZLKP1eYC7ByZ2IoMTY1LDIwMSwxNjgpkso/V7BTsHJnYigxNjUsMjAxLDE2OCmSyj9XyJywcmdiKDE2NSwyMDEsMTY4KZLKP1fg5LByZ2IoMTY1LDIwMSwxNjgpkso/V/kssHJnYigxNjUsMjAxLDE2OCmSyj9YEXSwcmdiKDE2NSwyMDEsMTY4KZLKP1gpvLByZ2IoMTY1LDIwMSwxNjkpkso/WEIEsHJnYigxNjUsMjAxLDE2OSmSyj9YWkywcmdiKDE2NSwyMDEsMTY5KZLKP1hylLByZ2IoMTY1LDIwMSwxNjkpkso/WIrcsHJnYigxNjUsMjAxLDE2OSmSyj9YoySwcmdiKDE2NSwyMDEsMTY5KZLKP1i7bLByZ2IoMTY1LDIwMSwxNjkpkso/WNO0sHJnYigxNjUsMjAxLDE3MCmSyj9Y6/2wcmdiKDE2NSwyMDEsMTcwKZLKP1kERbByZ2IoMTY1LDIwMSwxNzApkso/WRyNsHJnYigxNjUsMjAxLDE3MCmSyj9ZNNWwcmdiKDE2NSwyMDEsMTcwKZLKP1lNHbByZ2IoMTY1LDIwMSwxNzApkso/WWVlsHJnYigxNjUsMjAxLDE3MCmSyj9Zfa2wcmdiKDE2NiwyMDEsMTcxKZLKP1mV9bByZ2IoMTY2LDIwMSwxNzEpkso/Wa49sHJnYigxNjYsMjAxLDE3MSmSyj9ZxoWwcmdiKDE2NiwyMDEsMTcxKZLKP1nezbByZ2IoMTY2LDIwMSwxNzEpkso/WfcWsHJnYigxNjYsMjAxLDE3MSmSyj9aD16wcmdiKDE2NiwyMDEsMTcxKZLKP1onprByZ2IoMTY2LDIwMSwxNzIpkso/Wj/usHJnYigxNjYsMjAxLDE3MimSyj9aWDawcmdiKDE2NiwyMDEsMTcyKZLKP1pwfrByZ2IoMTY2LDIwMSwxNzIpkso/WojGsHJnYigxNjYsMjAxLDE3MimSyj9aoQ6wcmdiKDE2NiwyMDEsMTcyKZLKP1q5VrByZ2IoMTY2LDIwMSwxNzIpkso/WtGesHJnYigxNjYsMjAxLDE3MymSyj9a6eawcmdiKDE2NiwyMDEsMTczKZLKP1sCLrByZ2IoMTY2LDIwMSwxNzMpkso/Wxp3sHJnYigxNjYsMjAxLDE3MymSyj9bMr+wcmdiKDE2NiwyMDEsMTczKZLKP1tLB7ByZ2IoMTY3LDIwMSwxNzMpkso/W2NPsHJnYigxNjcsMjAxLDE3MymSyj9be5ewcmdiKDE2NywyMDEsMTczKZLKP1uT37ByZ2IoMTY3LDIwMSwxNzQpkso/W6wnsHJnYigxNjcsMjAxLDE3NCmSyj9bxG+wcmdiKDE2NywyMDEsMTc0KZLKP1vct7ByZ2IoMTY3LDIwMSwxNzQpkso/W/T/sHJnYigxNjcsMjAxLDE3NCmSyj9cDUewcmdiKDE2NywyMDEsMTc0KZLKP1wlkLByZ2IoMTY3LDIwMSwxNzQpkso/XD3YsHJnYigxNjcsMjAxLDE3NSmSyj9cViCwcmdiKDE2NywyMDEsMTc1KZLKP1xuaLByZ2IoMTY3LDIwMSwxNzUpkso/XIawsHJnYigxNjcsMjAxLDE3NSmSyj9cnviwcmdiKDE2NywyMDEsMTc1KZLKP1y3QLByZ2IoMTY3LDIwMSwxNzUpkso/XM+IsHJnYigxNjcsMjAxLDE3NSmSyj9c59CwcmdiKDE2OCwyMDEsMTc1KZLKP10AGLByZ2IoMTY4LDIwMSwxNzYpkso/XRhgsHJnYigxNjgsMjAxLDE3NimSyj9dMKiwcmdiKDE2OCwyMDEsMTc2KZLKP11I8bByZ2IoMTY4LDIwMSwxNzYpkso/XWE5sHJnYigxNjgsMjAxLDE3NimSyj9deYGwcmdiKDE2OCwyMDEsMTc2KZLKP12RybByZ2IoMTY4LDIwMSwxNzYpkso/XaoRsHJnYigxNjgsMjAxLDE3NimSyj9dwlmwcmdiKDE2OCwyMDEsMTc2KZLKP13aobByZ2IoMTY4LDIwMSwxNzcpkso/XfLpsHJnYigxNjgsMjAxLDE3NymSyj9eCzGwcmdiKDE2OCwyMDEsMTc3KZLKP14jebByZ2IoMTY4LDIwMSwxNzcpkso/XjvBsHJnYigxNjgsMjAxLDE3NymSyj9eVAmwcmdiKDE2OCwyMDEsMTc3KZLKP15sUrByZ2IoMTY5LDIwMSwxNzcpkso/XoSasHJnYigxNjksMjAxLDE3NymSyj9enOKwcmdiKDE2OSwyMDEsMTc4KZLKP161KrByZ2IoMTY5LDIwMSwxNzgpkso/Xs1ysHJnYigxNjksMjAxLDE3OCmSyj9e5bqwcmdiKDE2OSwyMDEsMTc4KZLKP17+ArByZ2IoMTY5LDIwMSwxNzgpkso/XxZKsHJnYigxNjksMjAxLDE3OCmSyj9fLpKwcmdiKDE2OSwyMDEsMTc4KZLKP19G2rByZ2IoMTY5LDIwMSwxNzgpkso/X18isHJnYigxNjksMjAxLDE3OCmSyj9fd2uwcmdiKDE2OSwyMDEsMTc5KZLKP1+Ps7ByZ2IoMTY5LDIwMSwxNzkpkso/X6f7sHJnYigxNjksMjAxLDE3OSmSyj9fwEOwcmdiKDE2OSwyMDEsMTc5KZLKP1/Yi7ByZ2IoMTcwLDIwMSwxNzkpkso/X/DTsHJnYigxNzAsMjAxLDE3OSmSyj9gCRuwcmdiKDE3MCwyMDEsMTc5KZLKP2AhY7ByZ2IoMTcwLDIwMSwxNzkpkso/YDmrsHJnYigxNzAsMjAxLDE3OSmSyj9gUfOwcmdiKDE3MCwyMDEsMTgwKZLKP2BqO7ByZ2IoMTcwLDIwMSwxODApkso/YIKDsHJnYigxNzAsMjAxLDE4MCmSyj9gmsywcmdiKDE3MCwyMDEsMTgwKZLKP2CzFLByZ2IoMTcwLDIwMSwxODApkso/YMtcsHJnYigxNzAsMjAxLDE4MCmSyj9g46SwcmdiKDE3MCwyMDEsMTgwKZLKP2D77LByZ2IoMTcwLDIwMSwxODApkso/YRQ0sHJnYigxNzAsMjAxLDE4MCmSyj9hLHywcmdiKDE3MSwyMDEsMTgwKZLKP2FExLByZ2IoMTcxLDIwMSwxODEpkso/YV0MsHJnYigxNzEsMjAxLDE4MSmSyj9hdVSwcmdiKDE3MSwyMDEsMTgxKZLKP2GNnLByZ2IoMTcxLDIwMSwxODEpkso/YaXksHJnYigxNzEsMjAxLDE4MSmSyj9hvi2wcmdiKDE3MSwyMDEsMTgxKZLKP2HWdbByZ2IoMTcxLDIwMSwxODEpkso/Ye69sHJnYigxNzEsMjAxLDE4MSmSyj9iBwWwcmdiKDE3MSwyMDEsMTgxKZLKP2IfTbByZ2IoMTcxLDIwMSwxODEpkso/YjeVsHJnYigxNzEsMjAxLDE4MimSyj9iT92wcmdiKDE3MSwyMDEsMTgyKZLKP2JoJbByZ2IoMTcxLDIwMSwxODIpkso/YoBtsHJnYigxNzIsMjAxLDE4MimSyj9imLWwcmdiKDE3MiwyMDEsMTgyKZLKP2Kw/bByZ2IoMTcyLDIwMSwxODIpkso/YslGsHJnYigxNzIsMjAxLDE4MimSyj9i4Y6wcmdiKDE3MiwyMDEsMTgyKZLKP2L51rByZ2IoMTcyLDIwMSwxODIpkso/YxIesHJnYigxNzIsMjAxLDE4MimSyj9jKmawcmdiKDE3MiwyMDEsMTgzKZLKP2NCrrByZ2IoMTcyLDIwMSwxODMpkso/Y1r2sHJnYigxNzIsMjAxLDE4MymSyj9jcz6wcmdiKDE3MiwyMDEsMTgzKZLKP2OLhrByZ2IoMTcyLDIwMSwxODMpkso/Y6POsHJnYigxNzIsMjAxLDE4MymSyj9jvBawcmdiKDE3MywyMDEsMTgzKZLKP2PUXrByZ2IoMTczLDIwMSwxODMpkso/Y+ynsHJnYigxNzMsMjAxLDE4MymSyj9kBO+wcmdiKDE3MywyMDEsMTgzKZLKP2QdN7ByZ2IoMTczLDIwMSwxODMpkso/ZDV/sHJnYigxNzMsMjAxLDE4NCmSyj9kTcewcmdiKDE3MywyMDEsMTg0KZLKP2RmD7ByZ2IoMTczLDIwMSwxODQpkso/ZH5XsHJnYigxNzMsMjAxLDE4NCmSyj9klp+wcmdiKDE3MywyMDEsMTg0KZLKP2Su57ByZ2IoMTczLDIwMSwxODQpkso/ZMcvsHJnYigxNzMsMjAxLDE4NCmSyj9k33ewcmdiKDE3MywyMDEsMTg0KZLKP2T3wLByZ2IoMTc0LDIwMSwxODQpkso/ZRAIsHJnYigxNzQsMjAxLDE4NCmSyj9lKFCwcmdiKDE3NCwyMDEsMTg0KZLKP2VAmLByZ2IoMTc0LDIwMSwxODQpkso/ZVjgsHJnYigxNzQsMjAxLDE4NSmSyj9lcSiwcmdiKDE3NCwyMDEsMTg1KZLKP2WJcLByZ2IoMTc0LDIwMSwxODUpkso/ZaG4sHJnYigxNzQsMjAxLDE4NSmSyj9lugCwcmdiKDE3NCwyMDEsMTg1KZLKP2XSSLByZ2IoMTc0LDIwMSwxODUpkso/ZeqQsHJnYigxNzQsMjAxLDE4NSmSyj9mAtiwcmdiKDE3NCwyMDEsMTg1KZLKP2YbIbByZ2IoMTc0LDIwMSwxODUpkso/ZjNpsHJnYigxNzUsMjAxLDE4NSmSyj9mS7GwcmdiKDE3NSwyMDEsMTg1KZLKP2Zj+bByZ2IoMTc1LDIwMSwxODUpkso/ZnxBsHJnYigxNzUsMjAxLDE4NSmSyj9mlImwcmdiKDE3NSwyMDEsMTg2KZLKP2as0bByZ2IoMTc1LDIwMSwxODYpkso/ZsUZsHJnYigxNzUsMjAxLDE4NimSyj9m3WGwcmdiKDE3NSwyMDEsMTg2KZLKP2b1qbByZ2IoMTc1LDIwMSwxODYpkso/Zw3xsHJnYigxNzUsMjAxLDE4NimSyj9nJjmwcmdiKDE3NSwyMDEsMTg2KZLKP2c+grByZ2IoMTc1LDIwMSwxODYpkso/Z1bKsHJnYigxNzYsMjAxLDE4NimSyj9nbxKwcmdiKDE3NiwyMDEsMTg2KZLKP2eHWrByZ2IoMTc2LDIwMSwxODYpkso/Z5+isHJnYigxNzYsMjAxLDE4NimSyj9nt+qwcmdiKDE3NiwyMDEsMTg2KZLKP2fQMrByZ2IoMTc2LDIwMSwxODcpkso/Z+h6sHJnYigxNzYsMjAxLDE4NymSyj9oAMKwcmdiKDE3NiwyMDEsMTg3KZLKP2gZCrByZ2IoMTc2LDIwMSwxODcpkso/aDFSsHJnYigxNzYsMjAxLDE4NymSyj9oSZuwcmdiKDE3NiwyMDEsMTg3KZLKP2hh47ByZ2IoMTc2LDIwMSwxODcpkso/aHorsHJnYigxNzcsMjAxLDE4NymSyj9oknOwcmdiKDE3NywyMDEsMTg3KZLKP2iqu7ByZ2IoMTc3LDIwMSwxODcpkso/aMMDsHJnYigxNzcsMjAxLDE4NymSyj9o20uwcmdiKDE3NywyMDEsMTg3KZLKP2jzk7ByZ2IoMTc3LDIwMSwxODcpkso/aQvbsHJnYigxNzcsMjAxLDE4NymSyj9pJCOwcmdiKDE3NywyMDEsMTg4KZLKP2k8a7ByZ2IoMTc3LDIwMSwxODgpkso/aVSzsHJnYigxNzcsMjAxLDE4OCmSyj9pbPywcmdiKDE3NywyMDEsMTg4KZLKP2mFRLByZ2IoMTc3LDIwMSwxODgpkso/aZ2MsHJnYigxNzgsMjAxLDE4OCmSyj9ptdSwcmdiKDE3OCwyMDEsMTg4KZLKP2nOHLByZ2IoMTc4LDIwMSwxODgpkso/aeZksHJnYigxNzgsMjAxLDE4OCmSyj9p/qywcmdiKDE3OCwyMDEsMTg4KZLKP2oW9LByZ2IoMTc4LDIwMSwxODgpkso/ai88sHJnYigxNzgsMjAxLDE4OCmSyj9qR4SwcmdiKDE3OCwyMDEsMTg4KZLKP2pfzLByZ2IoMTc4LDIwMSwxODgpkso/angUsHJnYigxNzgsMjAxLDE4OCmSyj9qkF2wcmdiKDE3OCwyMDEsMTg4KZLKP2qopbByZ2IoMTc5LDIwMSwxODkpkso/asDtsHJnYigxNzksMjAxLDE4OSmSyj9q2TWwcmdiKDE3OSwyMDEsMTg5KZLKP2rxfbByZ2IoMTc5LDIwMSwxODkpkso/awnFsHJnYigxNzksMjAxLDE4OSmSyj9rIg2wcmdiKDE3OSwyMDEsMTg5KZLKP2s6VbByZ2IoMTc5LDIwMSwxODkpkso/a1KdsHJnYigxNzksMjAxLDE4OSmSyj9rauWwcmdiKDE3OSwyMDEsMTg5KZLKP2uDLbByZ2IoMTc5LDIwMSwxODkpkso/a5t2sHJnYigxNzksMjAxLDE4OSmSyj9rs76wcmdiKDE3OSwyMDEsMTg5KZLKP2vMBrByZ2IoMTgwLDIwMSwxODkpkso/a+ROsHJnYigxODAsMjAxLDE4OSmSyj9r/JawcmdiKDE4MCwyMDEsMTg5KZLKP2wU3rByZ2IoMTgwLDIwMSwxODkpkso/bC0msHJnYigxODAsMjAxLDE4OSmSyj9sRW6wcmdiKDE4MCwyMDEsMTkwKZLKP2xdtrByZ2IoMTgwLDIwMSwxOTApkso/bHX+sHJnYigxODAsMjAxLDE5MCmSyj9sjkawcmdiKDE4MCwyMDEsMTkwKZLKP2ymjrByZ2IoMTgwLDIwMSwxOTApkso/bL7XsHJnYigxODAsMjAxLDE5MCmSyj9s1x+wcmdiKDE4MSwyMDEsMTkwKZLKP2zvZ7ByZ2IoMTgxLDIwMSwxOTApkso/bQevsHJnYigxODEsMjAxLDE5MCmSyj9tH/ewcmdiKDE4MSwyMDEsMTkwKZLKP204P7ByZ2IoMTgxLDIwMSwxOTApkso/bVCHsHJnYigxODEsMjAxLDE5MCmSyj9taM+wcmdiKDE4MSwyMDEsMTkwKZLKP22BF7ByZ2IoMTgxLDIwMSwxOTApkso/bZlfsHJnYigxODEsMjAxLDE5MCmSyj9tsaewcmdiKDE4MSwyMDEsMTkwKZLKP23J77ByZ2IoMTgxLDIwMSwxOTApkso/beI4sHJnYigxODEsMjAxLDE5MCmSyj9t+oCwcmdiKDE4MiwyMDEsMTkwKZLKP24SyLByZ2IoMTgyLDIwMSwxOTEpkso/bisQsHJnYigxODIsMjAxLDE5MSmSyj9uQ1iwcmdiKDE4MiwyMDEsMTkxKZLKP25boLByZ2IoMTgyLDIwMSwxOTEpkso/bnPosHJnYigxODIsMjAxLDE5MSmSyj9ujDCwcmdiKDE4MiwyMDEsMTkxKZLKP26keLByZ2IoMTgyLDIwMSwxOTEpkso/brzAsHJnYigxODIsMjAxLDE5MSmSyj9u1QiwcmdiKDE4MiwyMDEsMTkxKZLKP27tUbByZ2IoMTgyLDIwMSwxOTEpkso/bwWZsHJnYigxODMsMjAxLDE5MSmSyj9vHeGwcmdiKDE4MywyMDEsMTkxKZLKP282KbByZ2IoMTgzLDIwMSwxOTEpkso/b05xsHJnYigxODMsMjAxLDE5MSmSyj9vZrmwcmdiKDE4MywyMDEsMTkxKZLKP29/AbByZ2IoMTgzLDIwMSwxOTEpkso/b5dJsHJnYigxODMsMjAxLDE5MSmSyj9vr5GwcmdiKDE4MywyMDEsMTkxKZLKP2/H2bByZ2IoMTgzLDIwMSwxOTEpkso/b+AhsHJnYigxODMsMjAxLDE5MSmSyj9v+GmwcmdiKDE4MywyMDEsMTkxKZLKP3AQsrByZ2IoMTgzLDIwMSwxOTEpkso/cCj6sHJnYigxODQsMjAxLDE5MimSyj9wQUKwcmdiKDE4NCwyMDEsMTkyKZLKP3BZirByZ2IoMTg0LDIwMSwxOTIpkso/cHHSsHJnYigxODQsMjAxLDE5MimSyj9wihqwcmdiKDE4NCwyMDEsMTkyKZLKP3CiYrByZ2IoMTg0LDIwMSwxOTIpkso/cLqqsHJnYigxODQsMjAxLDE5MimSyj9w0vKwcmdiKDE4NCwyMDEsMTkyKZLKP3DrOrByZ2IoMTg0LDIwMSwxOTIpkso/cQOCsHJnYigxODQsMjAxLDE5MimSyj9xG8uwcmdiKDE4NCwyMDEsMTkyKZLKP3E0E7ByZ2IoMTg1LDIwMSwxOTIpkso/cUxbsHJnYigxODUsMjAxLDE5MimSyj9xZKOwcmdiKDE4NSwyMDEsMTkyKZLKP3F867ByZ2IoMTg1LDIwMSwxOTIpkso/cZUzsHJnYigxODUsMjAxLDE5MimSyj9xrXuwcmdiKDE4NSwyMDEsMTkyKZLKP3HFw7ByZ2IoMTg1LDIwMSwxOTIpkso/cd4LsHJnYigxODUsMjAxLDE5MimSyj9x9lOwcmdiKDE4NSwyMDEsMTkyKZLKP3IOm7ByZ2IoMTg1LDIwMSwxOTIpkso/cibjsHJnYigxODUsMjAxLDE5MimSyj9yPyywcmdiKDE4NiwyMDEsMTkyKZLKP3JXdLByZ2IoMTg2LDIwMSwxOTIpkso/cm+8sHJnYigxODYsMjAxLDE5MimSyj9yiASwcmdiKDE4NiwyMDEsMTkyKZLKP3KgTLByZ2IoMTg2LDIwMSwxOTMpkso/criUsHJnYigxODYsMjAxLDE5MymSyj9y0NywcmdiKDE4NiwyMDEsMTkzKZLKP3LpJLByZ2IoMTg2LDIwMSwxOTMpkso/cwFssHJnYigxODYsMjAxLDE5MymSyj9zGbSwcmdiKDE4NiwyMDEsMTkzKZLKP3Mx/LByZ2IoMTg2LDIwMSwxOTMpkso/c0pEsHJnYigxODYsMjAxLDE5MymSyj9zYo2wcmdiKDE4NywyMDEsMTkzKZLKP3N61bByZ2IoMTg3LDIwMSwxOTMpkso/c5MdsHJnYigxODcsMjAxLDE5MymSyj9zq2WwcmdiKDE4NywyMDEsMTkzKZLKP3PDrbByZ2IoMTg3LDIwMSwxOTMpkso/c9v1sHJnYigxODcsMjAxLDE5MymSyj9z9D2wcmdiKDE4NywyMDEsMTkzKZLKP3QMhbByZ2IoMTg3LDIwMSwxOTMpkso/dCTNsHJnYigxODcsMjAxLDE5MymSyj90PRWwcmdiKDE4NywyMDEsMTkzKZLKP3RVXbByZ2IoMTg3LDIwMSwxOTMpkso/dG2msHJnYigxODgsMjAxLDE5MymSyj90he6wcmdiKDE4OCwyMDEsMTkzKZLKP3SeNrByZ2IoMTg4LDIwMSwxOTMpkso/dLZ+sHJnYigxODgsMjAxLDE5MymSyj90zsawcmdiKDE4OCwyMDEsMTkzKZLKP3TnDrByZ2IoMTg4LDIwMSwxOTMpkso/dP9WsHJnYigxODgsMjAxLDE5MymSyj91F56wcmdiKDE4OCwyMDEsMTkzKZLKP3Uv5rByZ2IoMTg4LDIwMSwxOTMpkso/dUgusHJnYigxODgsMjAxLDE5MymSyj91YHawcmdiKDE4OCwyMDEsMTkzKZLKP3V4vrByZ2IoMTg4LDIwMSwxOTMpkso/dZEHsHJnYigxODksMjAxLDE5MymSyj91qU+wcmdiKDE4OSwyMDEsMTkzKZLKP3XBl7ByZ2IoMTg5LDIwMSwxOTMpkso/ddnfsHJnYigxODksMjAxLDE5MymSyj918iewcmdiKDE4OSwyMDEsMTk0KZLKP3YKb7ByZ2IoMTg5LDIwMSwxOTQpkso/diK3sHJnYigxODksMjAxLDE5NCmSyj92Ov+wcmdiKDE4OSwyMDEsMTk0KZLKP3ZTR7ByZ2IoMTg5LDIwMSwxOTQpkso/dmuPsHJnYigxODksMjAxLDE5NCmSyj92g9ewcmdiKDE4OSwyMDEsMTk0KZLKP3acH7ByZ2IoMTg5LDIwMSwxOTQpkso/drRosHJnYigxOTAsMjAxLDE5NCmSyj92zLCwcmdiKDE5MCwyMDEsMTk0KZLKP3bk+LByZ2IoMTkwLDIwMSwxOTQpkso/dv1AsHJnYigxOTAsMjAxLDE5NCmSyj93FYiwcmdiKDE5MCwyMDEsMTk0KZLKP3ct0LByZ2IoMTkwLDIwMSwxOTQpkso/d0YYsHJnYigxOTAsMjAxLDE5NCmSyj93XmCwcmdiKDE5MCwyMDEsMTk0KZLKP3d2qLByZ2IoMTkwLDIwMSwxOTQpkso/d47wsHJnYigxOTAsMjAxLDE5NCmSyj93pziwcmdiKDE5MCwyMDEsMTk0KZLKP3e/gbByZ2IoMTkxLDIwMSwxOTQpkso/d9fJsHJnYigxOTEsMjAxLDE5NCmSyj938BGwcmdiKDE5MSwyMDEsMTk0KZLKP3gIWbByZ2IoMTkxLDIwMSwxOTQpkso/eCChsHJnYigxOTEsMjAxLDE5NCmSyj94OOmwcmdiKDE5MSwyMDEsMTk0KZLKP3hRMbByZ2IoMTkxLDIwMSwxOTQpkso/eGl5sHJnYigxOTEsMjAxLDE5NCmSyj94gcGwcmdiKDE5MSwyMDEsMTk0KZLKP3iaCbByZ2IoMTkxLDIwMSwxOTQpkso/eLJRsHJnYigxOTEsMjAxLDE5NCmSyj94ypmwcmdiKDE5MSwyMDEsMTk0KZLKP3ji4rByZ2IoMTkyLDIwMSwxOTQpkso/ePsqsHJnYigxOTIsMjAxLDE5NCmSyj95E3KwcmdiKDE5MiwyMDEsMTk0KZLKP3krurByZ2IoMTkyLDIwMSwxOTQpkso/eUQCsHJnYigxOTIsMjAxLDE5NCmSyj95XEqwcmdiKDE5MiwyMDEsMTk0KZLKP3l0krByZ2IoMTkyLDIwMSwxOTQpkso/eYzasHJnYigxOTIsMjAxLDE5NCmSyj95pSKwcmdiKDE5MiwyMDEsMTk0KZLKP3m9arByZ2IoMTkyLDIwMSwxOTQpkso/edWysHJnYigxOTIsMjAxLDE5NCmSyj957fqwcmdiKDE5MiwyMDEsMTk0KZLKP3oGQ7ByZ2IoMTkyLDIwMSwxOTQpkso/eh6LsHJnYigxOTMsMjAxLDE5NCmSyj96NtOwcmdiKDE5MywyMDEsMTk0KZLKP3pPG7ByZ2IoMTkzLDIwMSwxOTQpkso/emdjsHJnYigxOTMsMjAxLDE5NCmSyj96f6uwcmdiKDE5MywyMDEsMTk0KZLKP3qX87ByZ2IoMTkzLDIwMSwxOTQpkso/erA7sHJnYigxOTMsMjAxLDE5NCmSyj96yIOwcmdiKDE5MywyMDEsMTk0KZLKP3rgy7ByZ2IoMTkzLDIwMSwxOTQpkso/evkTsHJnYigxOTMsMjAxLDE5NCmSyj97EVywcmdiKDE5MywyMDEsMTk0KZLKP3sppLByZ2IoMTkzLDIwMSwxOTQpkso/e0HssHJnYigxOTQsMjAxLDE5NCmSyj97WjSwcmdiKDE5NCwyMDEsMTk0KZLKP3tyfLByZ2IoMTk0LDIwMSwxOTQpkso/e4rEsHJnYigxOTQsMjAxLDE5NCmSyj97owywcmdiKDE5NCwyMDEsMTk0KZLKP3u7VLByZ2IoMTk0LDIwMSwxOTQpkso/e9OcsHJnYigxOTQsMjAxLDE5NCmSyj976+SwcmdiKDE5NCwyMDEsMTk0KZLKP3wELLByZ2IoMTk0LDIwMSwxOTQpkso/fBx0sHJnYigxOTQsMjAxLDE5NCmSyj98NL2wcmdiKDE5NCwyMDEsMTk0KZLKP3xNBbByZ2IoMTk0LDIwMSwxOTQpkso/fGVNsHJnYigxOTUsMjAxLDE5NCmSyj98fZWwcmdiKDE5NSwyMDEsMTk0KZLKP3yV3bByZ2IoMTk1LDIwMSwxOTQpkso/fK4lsHJnYigxOTUsMjAxLDE5NCmSyj98xm2wcmdiKDE5NSwyMDEsMTk0KZLKP3zetbByZ2IoMTk1LDIwMSwxOTQpkso/fPb9sHJnYigxOTUsMjAxLDE5NCmSyj99D0WwcmdiKDE5NSwyMDEsMTk0KZLKP30njbByZ2IoMTk1LDIwMSwxOTQpkso/fT/WsHJnYigxOTUsMjAxLDE5NCmSyj99WB6wcmdiKDE5NSwyMDEsMTk0KZLKP31wZrByZ2IoMTk1LDIwMSwxOTQpkso/fYiusHJnYigxOTUsMjAxLDE5NCmSyj99oPawcmdiKDE5NiwyMDEsMTk0KZLKP325PrByZ2IoMTk2LDIwMSwxOTQpkso/fdGGsHJnYigxOTYsMjAxLDE5NCmSyj996c6wcmdiKDE5NiwyMDEsMTk0KZLKP34CFrByZ2IoMTk2LDIwMSwxOTQpkso/fhpesHJnYigxOTYsMjAxLDE5NCmSyj9+MqawcmdiKDE5NiwyMDEsMTk0KZLKP35K7rByZ2IoMTk2LDIwMSwxOTQpkso/fmM3sHJnYigxOTYsMjAxLDE5NCmSyj9+e3+wcmdiKDE5NiwyMDEsMTk0KZLKP36Tx7ByZ2IoMTk2LDIwMSwxOTQpkso/fqwPsHJnYigxOTYsMjAxLDE5NCmSyj9+xFewcmdiKDE5NiwyMDEsMTk0KZLKP37cn7ByZ2IoMTk3LDIwMSwxOTQpkso/fvTnsHJnYigxOTcsMjAxLDE5NCmSyj9/DS+wcmdiKDE5NywyMDEsMTk0KZLKP38ld7ByZ2IoMTk3LDIwMSwxOTQpkso/fz2/sHJnYigxOTcsMjAxLDE5NCmSyj9/VgewcmdiKDE5NywyMDEsMTk0KZLKP39uT7ByZ2IoMTk3LDIwMSwxOTQpkso/f4aYsHJnYigxOTcsMjAxLDE5NCmSyj9/nuCwcmdiKDE5NywyMDEsMTk0KZLKP3+3KLByZ2IoMTk3LDIwMSwxOTQpkso/f89wsHJnYigxOTcsMjAxLDE5NCmSyj9/57iwcmdiKDE5NywyMDEsMTk0KZLKP4AAALByZ2IoMTk3LDIwMSwxOTQppHNpemXKQAAAAKRjbWF4ykUcQACpc2hvd3NjYWxlw6Rtb2Rlp21hcmtlcnOhecdQFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApHR5cGWpc2NhdHRlcjNkpHRleHTHUBcAAPpDAAD6QwAA+kMAAPpDAAD6QwAA+kMAAPpDAAD6QwAA+kMAAPpDAAD6QwAA+kMAAPpDAAD6QwAA+kMAAPpDAAD6QwAA+kMAAPpDAAD6Q6F6x1AXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACtaG92ZXJ0ZW1wbGF0ZdlaeDogJXt4Oi4xZn0gY208YnI+eTogJXt5Oi4xZn0gY208YnI+ejogJXt6Oi4xZn0gY208YnI+PGI+VDE8L2I+OiAle3RleHR9IG1zPGV4dHJhPjwvZXh0cmE+oXjHUBfNzMy9+z23vSivob1WIIy9CCNtvWQFQr2/5xa9NpTXvO1YgbySdqy7knasO+1YgTw2lNc8v+cWPWQFQj0II209ViCMPSivoT37Pbc9zczMPdk1YjNiODQwOGMtODE4MS0xMWVmLTE0ZWItZTFjNTY5YjhiYjI5L2RlMjExOTc5ZDJiYTUyYTOEpmxheW91dIyleGF4aXOEqWdyaWRjb2xvcqV3aGl0ZaV0aXRsZYGkdGV4dKF4rXplcm9saW5lY29sb3Kld2hpdGWpY29uc3RyYWlupmRvbWFpbqdtb2RlYmFyhKVjb2xvcqRncmF5q2FjdGl2ZWNvbG9ysHJnYigyMjksMjM2LDI0NimnYmdjb2xvcq1yZ2JhKDAsMCwwLDApq29yaWVudGF0aW9uoWitcGFwZXJfYmdjb2xvcq1yZ2JhKDAsMCwwLDApqWhvdmVybW9kZadjbG9zZXN0qHRlbXBsYXRlgqZsYXlvdXTeABOpY29sb3JheGlzgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApXhheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Zalob3Zlcm1vZGWnY2xvc2VzdK1wYXBlcl9iZ2NvbG9ypXdoaXRlo2dlb4apc2hvd2xha2Vzw6hzaG93bGFuZMOpbGFuZGNvbG9ypyNFNUVDRjanYmdjb2xvcqV3aGl0ZaxzdWJ1bml0Y29sb3Kld2hpdGWpbGFrZWNvbG9ypXdoaXRlqmNvbG9yc2NhbGWDqnNlcXVlbnRpYWyaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGpZGl2ZXJnaW5nm5LKAAAAAKcjOGUwMTUykso9zMzNpyNjNTFiN2SSyj5MzM2nI2RlNzdhZZLKPpmZmqcjZjFiNmRhkso+zMzNpyNmZGUwZWaSyj8AAACnI2Y3ZjdmN5LKPxmZmqcjZTZmNWQwkso/MzMzpyNiOGUxODaSyj9MzM2nIzdmYmM0MZLKP2ZmZqcjNGQ5MjIxkso/gAAApyMyNzY0MTmvc2VxdWVudGlhbG1pbnVzmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxpXlheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Za1zaGFwZWRlZmF1bHRzgaRsaW5lgaVjb2xvcqcjMmEzZjVmqmhvdmVybGFiZWyBpWFsaWdupGxlZnSmbWFwYm94gaVzdHlsZaVsaWdodKVwb2xhcoOrYW5ndWxhcmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqpyYWRpYWxheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0Za9hdXRvdHlwZW51bWJlcnOmc3RyaWN0pGZvbnSBpWNvbG9ypyMyYTNmNWandGVybmFyeYSlYWF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqVjYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWlYmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlsmFubm90YXRpb25kZWZhdWx0c4OpYXJyb3doZWFkygAAAACqYXJyb3d3aWR0aMo/gAAAqmFycm93Y29sb3KnIzJhM2Y1ZqxwbG90X2JnY29sb3KnI0U1RUNGNqV0aXRsZYGheMo9TMzNpXNjZW5lg6V4YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWlemF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXlheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0Zahjb2xvcndheZqnIzYzNmVmYacjRUY1NTNCpyMwMGNjOTanI2FiNjNmYacjRkZBMTVBpyMxOWQzZjOnI0ZGNjY5MqcjQjZFODgwpyNGRjk3RkanI0ZFQ0I1MqRkYXRh3gAZrnNjYXR0ZXJwb2xhcmdskYKkdHlwZa5zY2F0dGVycG9sYXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmY2FycGV0kYOlYmF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaR0eXBlpmNhcnBldKVhYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlrHNjYXR0ZXJwb2xhcpGCpHR5cGWsc2NhdHRlcnBvbGFypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKlwYXJjb29yZHORgqRsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpcGFyY29vcmRzp3NjYXR0ZXKRgqR0eXBlp3NjYXR0ZXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAsmhpc3RvZ3JhbTJkY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZbJoaXN0b2dyYW0yZGNvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMadjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2NvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVyY2FycGV0kYKkdHlwZa1zY2F0dGVyY2FycGV0pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZtZXNoM2SRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWmbWVzaDNkp3N1cmZhY2WRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnc3VyZmFjZapjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJtYXBib3iRgqR0eXBlrXNjYXR0ZXJtYXBib3imbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqnNjYXR0ZXJnZW+RgqR0eXBlqnNjYXR0ZXJnZW+mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqWhpc3RvZ3JhbZGCpHR5cGWpaGlzdG9ncmFtpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKNwaWWRgqR0eXBlo3BpZaphdXRvbWFyZ2luw6pjaG9yb3BsZXRokYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqmNob3JvcGxldGipaGVhdG1hcGdskYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqWhlYXRtYXBnbKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxo2JhcpGEpHR5cGWjYmFyp2Vycm9yX3mBpWNvbG9ypyMyYTNmNWanZXJyb3JfeIGlY29sb3KnIzJhM2Y1ZqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKdoZWF0bWFwkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2hlYXRtYXCqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1jb250b3VyY2FycGV0kYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlrWNvbnRvdXJjYXJwZXSldGFibGWRg6R0eXBlpXRhYmxlpmhlYWRlcoKkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0M4RDRFM6VjZWxsc4KkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0VCRjBGOKlzY2F0dGVyM2SRg6RsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpc2NhdHRlcjNkpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKhiYXJwb2xhcpGCpHR5cGWoYmFycG9sYXKmbWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACpc2NhdHRlcmdskYKkdHlwZalzY2F0dGVyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAq2hpc3RvZ3JhbTJkkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlq2hpc3RvZ3JhbTJkqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGuc2NhdHRlcnRlcm5hcnmRgqR0eXBlrnNjYXR0ZXJ0ZXJuYXJ5pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZoZWlnaHTKRBYAAKV5YXhpc4SpZ3JpZGNvbG9ypXdoaXRlq3NjYWxlYW5jaG9yoXildGl0bGWBpHRleHShea16ZXJvbGluZWNvbG9ypXdoaXRlpGZvbnSBpWNvbG9ypGdyYXmlc2NlbmWFpXhheGlzhqlncmlkY29sb3Kld2hpdGWvYmFja2dyb3VuZGNvbG9ysHJnYigyMjksMjM2LDI0NimldGl0bGWheKVyYW5nZdcXzczMvc3MzD2qdGlja3N1ZmZpeKMgY22temVyb2xpbmVjb2xvcqV3aGl0Zathc3BlY3RyYXRpb4Oheco/gAAA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brtdZW67XWVuu11lbrseDUO7Hg1Dux4NQ7seDUO7Hg1Dux4NQ7seDUO7Hg1Dux4NQ7seDUO7Hg1Dux4NQ7seDUO7Hg1Dux4NQ7seDUO7Hg1Dux4NQ7seDUO7Hg1Du960F7vetBe73rQXu960F7vetBe73rQXu960F7vetBe73rQXu960F7vetBe73rQXu960F7vetBe73rQXu960F7vetBe73rQXu960F7vetBe7PrnYuj652Lo+udi6PrnYuj652Lo+udi6PrnYuj652Lo+udi6PrnYuj652Lo+udi6PrnYuj652Lo+udi6PrnYuj652Lo+udi6PrnYuj652Lq/CIK6vwiCur8Igrq/CIK6vwiCur8Igrq/CIK6vwiCur8Igrq/CIK6vwiCur8Igrq/CIK6vwiCur8Igrq/CIK6vwiCur8Igrq/CIK6vwiCuv5grbn+YK25/mCtuf5grbn+YK25/mCtuf5grbn+YK25/mCtuf5grbn+YK25/mCtuf5grbn+YK25/mCtuf5grbn+YK25/mCtuf5grbn+YK25/mCtOf5grTn+YK05/mCtOf5grTn+YK05/mCtOf5grTn+YK05/mCtOf5grTn+YK05/mCtOf5grTn+YK05/mCtOf5grTn+YK05/mCtOf5grTm/CII6vwiCOr8Igjq/CII6vwiCOr8Igjq/CII6vwiCOr8Igjq/CII6vwiCOr8Igjq/CII6vwiCOr8Igjq/CII6vwiCOr8Igjq/CII6vwiCOj652Do+udg6PrnYOj652Do+udg6PrnYOj652Do+udg6PrnYOj652Do+udg6PrnYOj652Do+udg6PrnYOj652Do+udg6PrnYOj652Do+udg63rQXO960FzvetBc73rQXO960FzvetBc73rQXO960FzvetBc73rQXO960FzvetBc73rQXO960FzvetBc73rQXO960FzvetBc73rQXO960FzseDUM7Hg1DOx4NQzseDUM7Hg1DOx4NQzseDUM7Hg1DOx4NQzseDUM7Hg1DOx4NQzseDUM7Hg1DOx4NQzseDUM7Hg1DOx4NQzseDUM7Hg1DO11lbjtdZW47XWVuO11lbjtdZW47XWVuO11lbjtdZW47XWVuO11lbjtdZW47XWVuO11lbjtdZW47XWVuO11lbjtdZW47XWVuO11lbjtdZW47zt6MO87e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D0GNKA9BjSgPQY0oD0GNKA9BjSgPQY0oD0GNKA9BjSgPQY0oD0GNKA9BjSgPQY0oD0GNKA9BjSgPQQAAIEEAACBBAAAgQQAAIEEAACBBAAAgQQAAIEEAACBBAAAgQQAAIEEAACBBAAAgQQAAIEEAACBBAAAgQQAAIEEAACBBAAAgQQAAIEEAACBBoXrIBkAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK1ob3ZlcnRlbXBsYXRl2Vt4OiAle3g6LjFmfSBjbTxicj55OiAle3k6LjFmfSBjbTxicj56OiAl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eGlzgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApXhheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Zalob3Zlcm1vZGWnY2xvc2VzdK1wYXBlcl9iZ2NvbG9ypXdoaXRlo2dlb4apc2hvd2xha2Vzw6hzaG93bGFuZMOpbGFuZGNvbG9ypyNFNUVDRjanYmdjb2xvcqV3aGl0ZaxzdWJ1bml0Y29sb3Kld2hpdGWpbGFrZWNvbG9ypXdoaXRlqmNvbG9yc2NhbGWDqnNlcXVlbnRpYWyaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGpZGl2ZXJnaW5nm5LKAAAAAKcjOGUwMTUykso9zMzNpyNjNTFiN2SSyj5MzM2nI2RlNzdhZZLKPpmZmqcjZjFiNmRhkso+zMzNpyNmZGUwZWaSyj8AAACnI2Y3ZjdmN5LKPxmZmqcjZTZmNWQwkso/MzMzpyNiOGUxODaSyj9MzM2nIzdmYmM0MZLKP2ZmZqcjNGQ5MjIxkso/gAAApyMyNzY0MTmvc2VxdWVudGlhbG1pbnVzmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxpXlheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Za1zaGFwZWRlZmF1bHRzgaRsaW5lgaVjb2xvcqcjMmEzZjVmqmhvdmVybGFiZWyBpWFsaWdupGxlZnSmbWFwYm94gaVzdHlsZaVsaWdodKVwb2xhcoOrYW5ndWxhcmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqpyYWRpYWxheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0Za9hdXRvdHlwZW51bWJlcnOmc3RyaWN0pGZvbnSBpWNvbG9ypyMyYTNmNWandGVybmFyeYSlYWF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqVjYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWlYmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlsmFubm90YXRpb25kZWZhdWx0c4OpYXJyb3doZWFkygAAAACqYXJyb3d3aWR0aMo/gAAAqmFycm93Y29sb3KnIzJhM2Y1ZqxwbG90X2JnY29sb3KnI0U1RUNGNqV0aXRsZYGheMo9TMzNpXNjZW5lg6V4YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWlemF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXlheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0Zahjb2xvcndheZqnIzYzNmVmYacjRUY1NTNCpyMwMGNjOTanI2FiNjNmYacjRkZBMTVBpyMxOWQzZjOnI0ZGNjY5MqcjQjZFODgwpyNGRjk3RkanI0ZFQ0I1MqRkYXRh3gAZrnNjYXR0ZXJwb2xhcmdskYKkdHlwZa5zY2F0dGVycG9sYXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmY2FycGV0kYOlYmF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaR0eXBlpmNhcnBldKVhYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlrHNjYXR0ZXJwb2xhcpGCpHR5cGWsc2NhdHRlcnBvbGFypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKlwYXJjb29yZHORgqRsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpcGFyY29vcmRzp3NjYXR0ZXKRgqR0eXBlp3NjYXR0ZXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAsmhpc3RvZ3JhbTJkY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZbJoaXN0b2dyYW0yZGNvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMadjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2NvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVyY2FycGV0kYKkdHlwZa1zY2F0dGVyY2FycGV0pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZtZXNoM2SRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWmbWVzaDNkp3N1cmZhY2WRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnc3VyZmFjZapjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJtYXBib3iRgqR0eXBlrXNjYXR0ZXJtYXBib3imbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqnNjYXR0ZXJnZW+RgqR0eXBlqnNjYXR0ZXJnZW+mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqWhpc3RvZ3JhbZGCpHR5cGWpaGlzdG9ncmFtpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKNwaWWRgqR0eXBlo3BpZaphdXRvbWFyZ2luw6pjaG9yb3BsZXRokYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqmNob3JvcGxldGipaGVhdG1hcGdskYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqWhlYXRtYXBnbKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxo2JhcpGEpHR5cGWjYmFyp2Vycm9yX3mBpWNvbG9ypyMyYTNmNWanZXJyb3JfeIGlY29sb3KnIzJhM2Y1ZqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKdoZWF0bWFwkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2hlYXRtYXCqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1jb250b3VyY2FycGV0kYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlrWNvbnRvdXJjYXJwZXSldGFibGWRg6R0eXBlpXRhYmxlpmhlYWRlcoKkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0M4RDRFM6VjZWxsc4KkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0VCRjBGOKlzY2F0dGVyM2SRg6RsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpc2NhdHRlcjNkpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKhiYXJwb2xhcpGCpHR5cGWoYmFycG9sYXKmbWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACpc2NhdHRlcmdskYKkdHlwZalzY2F0dGVyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAq2hpc3RvZ3JhbTJkkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlq2hpc3RvZ3JhbTJkqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGuc2NhdHRlcnRlcm5hcnmRgqR0eXBlrnNjYXR0ZXJ0ZXJuYXJ5pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKthbm5vdGF0aW9uc5KJp3lhbmNob3KmYm90dG9tp3hhbmNob3KmY2VudGVyoXnKP4AAAKRmb250gaRzaXplykGAAACpc2hvd2Fycm93wqR5cmVmpXBhcGVypHRleHSjR1JFpHhyZWalcGFwZXKheMo+ZmZmiad5YW5jaG9ypmJvdHRvbad4YW5jaG9ypmNlbnRlcqF5yj+AAACkZm9udIGkc2l6ZcpBgAAAqXNob3dhcnJvd8KkeXJlZqVwYXBlcqR0ZXh0olNFpHhyZWalcGFwZXKheMo/RmZmpm1hcmdpboShbMpCSAAAoWLKQkgAAKFyykJIAAChdMpCcAAApnNjZW5lMoGmZG9tYWlugqF51xcAAAAAAACAP6F41xfNzAw/AACAP6Zjb25maWeFqHNob3dMaW5rwqhlZGl0YWJsZcKqcmVzcG9uc2l2ZcOqc3RhdGljUGxvdMKqc2Nyb2xsWm9vbcOmZnJhbWVzkKRkYXRhlomkbW9kZaVsaW5lc6RsaW5lgaVjb2xvcqRncmF5oXnIAqAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApHR5cGWpc2NhdHRlcjNkpG5hbWWqVHJhamVjdG9yealob3ZlcmluZm+kc2tpcKVzY2VuZaZzY2VuZTGhesgCoBcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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3ABkt2hzdigyNTUuMCwgMTAwLjAsIDUwLjAp2SRoc3YoMjUyLjM2MzYzNjM2MzYzNjM3LCAxMDAuMCwgNTAuMCnZJGhzdigyNDkuNzI3MjcyNzI3MjcyNzIsIDEwMC4wLCA1MC4wKdk+aHN2KDI0Ny4wOTA5MDkwOTA5MDkxMiwgMTAwLjAwMDAwMDAwMDAwMDAxLCA1MC4wMDAwMDAwMDAwMDAwMSnZJGhzdigyNDQuNDU0NTQ1NDU0NTQ1NDQsIDEwMC4wLCA1MC4wKdkjaHN2KDI0MS44MTgxODE4MTgxODE4LCAxMDAuMCwgNTAuMCnZI2hzdigyMzkuMTgxODE4MTgxODE4MiwgMTAwLjAsIDUwLjAp2SRoc3YoMjM2LjU0NTQ1NDU0NTQ1NDU2LCAxMDAuMCwgNTAuMCnZJGhzdigyMzMuOTA5MDkwOTA5MDkwOTMsIDEwMC4wLCA1MC4wKdkkaHN2KDIzMS4yNzI3MjcyNzI3MjcyNSwgMTAwLjAsIDUwLjAp2SRoc3YoMjI4LjYzNjM2MzYzNjM2MzYzLCAxMDAuMCwgNTAuMCm3aHN2KDIyNi4wLCAxMDAuMCwgNTAuMCnZPWhzdigyMjMuNDU0NTQ1NDU0NTQ1NDQsIDk5Ljk5OTk5OTk5OTk5OTk5LCA0OS45OTk5OTk5OTk5OTk5OSnZI2hzdigyMjAuOTA5MDkwOTA5MDkwOSwgMTAwLjAsIDUwLjAp2T5oc3YoMjE4LjM2MzYzNjM2MzYzNjM3LCAxMDAuMDAwMDAwMDAwMDAwMDEsIDUwLjAwMDAwMDAwMDAwMDAxKdkjaHN2KDIxNS44MTgxODE4MTgxODE4LCAxMDAuMCwgNTAuMCnZJGhzdigyMTMuMjcyNzI3MjcyNzI3MjUsIDEwMC4wLCA1MC4wKdkkaHN2KDIxMC43MjcyNzI3MjcyNzI3MiwgMTAwLjAsIDUwLjAp2SNoc3YoMjA4LjE4MTgxODE4MTgxODIsIDEwMC4wLCA1MC4wKdkkaHN2KDIwNS42MzYzNjM2MzYzNjM2MywgMTAwLjAsIDUwLjAp2SRoc3YoMjAzLjA5MDkwOTA5MDkwOTA3LCAxMDAuMCwgNTAuMCnZJGhzdigyMDAuNTQ1NDU0NTQ1NDU0NTMsIDEwMC4wLCA1MC4wKbdoc3YoMTk4LjAsIDEwMC4wLCA1MC4wKdk9aHN2KDE5NS40NTQ1NDU0NTQ1NDU0NCwgOTkuOTk5OTk5OTk5OTk5OTksIDQ5Ljk5OTk5OTk5OTk5OTk5KdkjaHN2KDE5Mi45MDkwOTA5MDkwOTA5LCAxMDAuMCwgNTAuMCnZJGhzdigxOTAuMzYzNjM2MzYzNjM2MzcsIDEwMC4wLCA1MC4wKdkjaHN2KDE4Ny44MTgxODE4MTgxODE4LCAxMDAuMCwgNTAuMCnZJGhzdigxODUuMjcyNzI3MjcyNzI3MjgsIDEwMC4wLCA1MC4wKdkkaHN2KDE4Mi43MjcyNzI3MjcyNzI3MiwgMTAwLjAsIDUwLjAp2SNoc3YoMTgwLjE4MTgxODE4MTgxODIsIDEwMC4wLCA1MC4wKdkkaHN2KDE3Ny42MzYzNjM2MzYzNjM2MywgMTAwLjAsIDUwLjAp2SNoc3YoMTc1LjA5MDkwOTA5MDkwOTEsIDEwMC4wLCA1MC4wKdkkaHN2KDE3Mi41NDU0NTQ1NDU0NTQ1MywgMTAwLjAsIDUwLjApt2hzdigxNzAuMCwgMTAwLjAsIDUwLjAp2T1oc3YoMTY3LjM2MzYzNjM2MzYzNjM3LCA5OS45OTk5OTk5OTk5OTk5OSwgNDkuOTk5OTk5OTk5OTk5OTkp2SRoc3YoMTY0LjcyNzI3MjcyNzI3MjcyLCAxMDAuMCwgNTAuMCnZI2hzdigxNjIuMDkwOTA5MDkwOTA5MSwgMTAwLjAsIDUwLjAp2SRoc3YoMTU5LjQ1NDU0NTQ1NDU0NTQ0LCAxMDAuMCwgNTAuMCnZI2hzdigxNTYuODE4MTgxODE4MTgxOCwgMTAwLjAsIDUwLjAp2SNoc3YoMTU0LjE4MTgxODE4MTgxODIsIDEwMC4wLCA1MC4wKdkkaHN2KDE1MS41NDU0NTQ1NDU0NTQ1NiwgMTAwLjAsIDUwLjAp2SNoc3YoMTQ4LjkwOTA5MDkwOTA5MDksIDEwMC4wLCA1MC4wKdkkaHN2KDE0Ni4yNzI3MjcyNzI3MjcyNSwgMTAwLjAsIDUwLjAp2SRoc3YoMTQzLjYzNjM2MzYzNjM2MzYzLCAxMDAuMCwgNTAuMCm3aHN2KDE0MS4wLCAxMDAuMCwgNTAuMCnZJGhzdigxMzguNDU0NTQ1NDU0NTQ1NDcsIDEwMC4wLCA1MC4wKdkjaHN2KDEzNS45MDkwOTA5MDkwOTA5LCAxMDAuMCwgNTAuMCnZJGhzdigxMzMuMzYzNjM2MzYzNjM2MzUsIDEwMC4wLCA1MC4wKdkjaHN2KDEzMC44MTgxODE4MTgxODE4LCAxMDAuMCwgNTAuMCnZJGhzdigxMjguMjcyNzI3MjcyNzI3MjUsIDEwMC4wLCA1MC4wKdkkaHN2KDEyNS43MjcyNzI3MjcyNzI3MiwgMTAwLjAsIDUwLjAp2SRoc3YoMTIzLjE4MTgxODE4MTgxODE5LCAxMDAuMCwgNTAuMCnZJGhzdigxMjAuNjM2MzYzNjM2MzYzNjMsIDEwMC4wLCA1MC4wKdkjaHN2KDExOC4wOTA5MDkwOTA5MDkxLCAxMDAuMCwgNTAuMCnZJGhzdigxMTUuNTQ1NDU0NTQ1NDU0NTYsIDEwMC4wLCA1MC4wKbdoc3YoMTEzLjAsIDEwMC4wLCA1MC4wKdk9aHN2KDExMC40NTQ1NDU0NTQ1NDU0NSwgOTkuOTk5OTk5OTk5OTk5OTksIDQ5Ljk5OTk5OTk5OTk5OTk5KdkjaHN2KDEwNy45MDkwOTA5MDkwOTA5LCAxMDAuMCwgNTAuMCnZJGhzdigxMDUuMzYzNjM2MzYzNjM2MzYsIDEwMC4wLCA1MC4wKdkkaHN2KDEwMi44MTgxODE4MTgxODE4NCwgMTAwLjAsIDUwLjAp2SRoc3YoMTAwLjI3MjcyNzI3MjcyNzI1LCAxMDAuMCwgNTAuMCnZI2hzdig5Ny43MjcyNzI3MjcyNzI3MywgMTAwLjAsIDUwLjAp2SNoc3YoOTUuMTgxODE4MTgxODE4MTcsIDEwMC4wLCA1MC4wKdkjaHN2KDkyLjYzNjM2MzYzNjM2MzYzLCAxMDAuMCwgNTAuMCnZI2hzdig5MC4wOTA5MDkwOTA5MDkwNywgMTAwLjAsIDUwLjAp2SNoc3YoODcuNTQ1NDU0NTQ1NDU0NTMsIDEwMC4wLCA1MC4wKbZoc3YoODUuMCwgMTAwLjAsIDUwLjAp2SNoc3YoODIuMzYzNjM2MzYzNjM2MzUsIDEwMC4wLCA1MC4wKdkjaHN2KDc5LjcyNzI3MjcyNzI3MjczLCAxMDAuMCwgNTAuMCnZI2hzdig3Ny4wOTA5MDkwOTA5MDkwNywgMTAwLjAsIDUwLjAp2SNoc3YoNzQuNDU0NTQ1NDU0NTQ1NDUsIDEwMC4wLCA1MC4wKdkjaHN2KDcxLjgxODE4MTgxODE4MTgzLCAxMDAuMCwgNTAuMCnZI2hzdig2OS4xODE4MTgxODE4MTgxNywgMTAwLjAsIDUwLjAp2SNoc3YoNjYuNTQ1NDU0NTQ1NDU0NTYsIDEwMC4wLCA1MC4wKdkiaHN2KDYzLjkwOTA5MDkwOTA5MDksIDEwMC4wLCA1MC4wKdkjaHN2KDYxLjI3MjcyNzI3MjcyNzI3LCAxMDAuMCwgNTAuMCnZJGhzdig1OC42MzYzNjM2MzYzNjM2NTQsIDEwMC4wLCA1MC4wKbZoc3YoNTYuMCwgMTAwLjAsIDUwLjAp2Txoc3YoNTMuNDU0NTQ1NDU0NTQ1NDYsIDk5Ljk5OTk5OTk5OTk5OTk5LCA0OS45OTk5OTk5OTk5OTk5OSnZImhzdig1MC45MDkwOTA5MDkwOTA5LCAxMDAuMCwgNTAuMCnZI2hzdig0OC4zNjM2MzYzNjM2MzYzNiwgMTAwLjAsIDUwLjAp2SJoc3YoNDUuODE4MTgxODE4MTgxOCwgMTAwLjAsIDUwLjAp2SRoc3YoNDMuMjcyNzI3MjcyNzI3MjY2LCAxMDAuMCwgNTAuMCnZJGhzdig0MC43MjcyNzI3MjcyNzI3MzQsIDEwMC4wLCA1MC4wKdkjaHN2KDM4LjE4MTgxODE4MTgxODE3LCAxMDAuMCwgNTAuMCnZI2hzdigzNS42MzYzNjM2MzYzNjM2MywgMTAwLjAsIDUwLjAp2SRoc3YoMzMuMDkwOTA5MDkwOTA5MDY1LCAxMDAuMCwgNTAuMCnZJGhzdigzMC41NDU0NTQ1NDU0NTQ1MzYsIDEwMC4wLCA1MC4wKbZoc3YoMjguMCwgMTAwLjAsIDUwLjAp2SNoc3YoMjUuNDU0NTQ1NDU0NTQ1NDQsIDEwMC4wLCA1MC4wKdkkaHN2KDIyLjkwOTA5MDkwOTA5MDkwNywgMTAwLjAsIDUwLjAp2SRoc3YoMjAuMzYzNjM2MzYzNjM2MzQ2LCAxMDAuMCwgNTAuMCnZJGhzdigxNy44MTgxODE4MTgxODE4MTMsIDEwMC4wLCA1MC4wKdkkaHN2KDE1LjI3MjcyNzI3MjcyNzI1MiwgMTAwLjAsIDUwLjAp2SNoc3YoMTIuNzI3MjcyNzI3MjcyNzIsIDEwMC4wLCA1MC4wKdkkaHN2KDEwLjE4MTgxODE4MTgxODE4OSwgMTAwLjAsIDUwLjAp2SNoc3YoNy42MzYzNjM2MzYzNjM2MjYsIDEwMC4wLCA1MC4wKdkjaHN2KDUuMDkwOTA5MDkwOTA5MDkzLCAxMDAuMCwgNTAuMCnZI2hzdigyLjU0NTQ1NDU0NTQ1NDUzNCwgMTAwLjAsIDUwLjAptWhzdigwLjAsIDEwMC4wLCA1MC4wKaF5yAGQFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACkdHlwZalzY2F0dGVyM2Slc2NlbmWmc2NlbmUxrWhvdmVydGVtcGxhdGXZbGt4OiAle3g6LjFmfSBt4oG7wrk8YnI+a3k6ICV7eTouMWZ9IG3igbvCuTxicj5rejogJXt6Oi4xZn0gbeKBu8K5PGJyPjxiPnRfYWNxPC9iPjogJXt0ZXh0fSBtczxleHRyYT48L2V4dHJhPqF4yAGQF7YOjMVfOonFCWaGxbORg8VcvYDFDNJ7xV8pdsWygHDFBdhqxVgvZcWrhl/F/91ZxVI1VMWljE7F+ONIxUs7Q8Wekj3F8ek3xUVBMsWYmCzF6+8mxT5HIcWRnhvF5PUVxThNEMWLpArF3vsExWKm/sQIVfPErwPoxFWy3MT7YNHEog/GxEi+usTubK/ElBukxDvKmMTheI3EhyeCxFusbcSoCVfE9WZAxEHEKcSOIRPEtf34w064y8Pocp7DAltiwzTQB8ObFTXCmxU1QjTQB0MCW2JD6HKeQ064y0O1/fhDjiETREHEKUT1ZkBEqAlXRFusbUSHJ4JE4XiNRDvKmESUG6RE7myvREi+ukSiD8ZE+2DRRFWy3ESvA+hECFXzRGKm/kTe+wRFi6QKRThNEEXk9RVFkZ4bRT5HIUXr7yZFmJgsRUVBMkXx6TdFnpI9RUs7Q0X440hFpYxORVI1VEX/3VlFq4ZfRVgvZUUF2GpFsoBwRV8pdkUM0ntFXL2ARbORg0UJZoZFXzqJRbYOjEWHpm1hcmtlcoOmc3ltYm9spWNyb3NzpWNvbG9yo3JlZKRzaXplykEgAAChedYXAAAAAKR0eXBlqXNjYXR0ZXIzZKRuYW1lo2s9MKVzY2VuZaZzY2VuZTGhetYXAAAAAKF41hcAAAAAiaRtb2RlpWxpbmVzpGxpbmWBpWNvbG9ypGdyYXmhecgDnBcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACkdHlwZalzY2F0dGVyM2SkbmFtZapUcmFqZWN0b3J5qWhvdmVyaW5mb6Rza2lwpXNjZW5lpnNjZW5lMqF6yAOcFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKF4yAOcFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMr+GTG2DoxFtg6MRbYOjEW2DoxFtg6MRbYOjEW2DoxFtg6MRbYOjEW2DoxFtg6MRbYOjEW2DoxFtg6MRbYOjEW2DoxFtg6MRbYOjEW2DoxFtg6MRbYOjEW2DoxFtg6MRbYOjEW2DoxFtg6MRbYOjEW2DoxFtg6MRbYOjEW2DoxFtg6MRbYOjEW2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digyMjguNjM2MzYzNjM2MzYzNjMsIDEwMC4wLCA1MC4wKbdoc3YoMjI2LjAsIDEwMC4wLCA1MC4wKdk9aHN2KDIyMy40NTQ1NDU0NTQ1NDU0NCwgOTkuOTk5OTk5OTk5OTk5OTksIDQ5Ljk5OTk5OTk5OTk5OTk5KdkjaHN2KDIyMC45MDkwOTA5MDkwOTA5LCAxMDAuMCwgNTAuMCnZPmhzdigyMTguMzYzNjM2MzYzNjM2MzcsIDEwMC4wMDAwMDAwMDAwMDAwMSwgNTAuMDAwMDAwMDAwMDAwMDEp2SNoc3YoMjE1LjgxODE4MTgxODE4MTgsIDEwMC4wLCA1MC4wKdkkaHN2KDIxMy4yNzI3MjcyNzI3MjcyNSwgMTAwLjAsIDUwLjAp2SRoc3YoMjEwLjcyNzI3MjcyNzI3MjcyLCAxMDAuMCwgNTAuMCnZI2hzdigyMDguMTgxODE4MTgxODE4MiwgMTAwLjAsIDUwLjAp2SRoc3YoMjA1LjYzNjM2MzYzNjM2MzYzLCAxMDAuMCwgNTAuMCnZJGhzdigyMDMuMDkwOTA5MDkwOTA5MDcsIDEwMC4wLCA1MC4wKdkkaHN2KDIwMC41NDU0NTQ1NDU0NTQ1MywgMTAwLjAsIDUwLjApt2hzdigxOTguMCwgMTAwLjAsIDUwLjAp2T1oc3YoMTk1LjQ1NDU0NTQ1NDU0NTQ0LCA5OS45OTk5OTk5OTk5OTk5OSwgNDkuOTk5OTk5OTk5OTk5OTkp2SNoc3YoMTkyLjkwOTA5MDkwOTA5MDksIDEwMC4wLCA1MC4wKdkkaHN2KDE5MC4zNjM2MzYzNjM2MzYzNywgMTAwLjAsIDUwLjAp2SNoc3YoMTg3LjgxODE4MTgxODE4MTgsIDEwMC4wLCA1MC4wKdkkaHN2KDE4NS4yNzI3MjcyNzI3MjcyOCwgMTAwLjAsIDUwLjAp2SRoc3YoMTgyLjcyNzI3MjcyNzI3MjcyLCAxMDAuMCwgNTAuMCnZI2hzdigxODAuMTgxODE4MTgxODE4MiwgMTAwLjAsIDUwLjAp2SRoc3YoMTc3LjYzNjM2MzYzNjM2MzYzLCAxMDAuMCwgNTAuMCnZI2hzdigxNzUuMDkwOTA5MDkwOTA5MSwgMTAwLjAsIDUwLjAp2SRoc3YoMTcyLjU0NTQ1NDU0NTQ1NDUzLCAxMDAuMCwgNTAuMCm3aHN2KDE3MC4wLCAxMDAuMCwgNTAuMCnZPWhzdigxNjcuMzYzNjM2MzYzNjM2MzcsIDk5Ljk5OTk5OTk5OTk5OTk5LCA0OS45OTk5OTk5OTk5OTk5OSnZJGhzdigxNjQuNzI3MjcyNzI3MjcyNzIsIDEwMC4wLCA1MC4wKdkjaHN2KDE2Mi4wOTA5MDkwOTA5MDkxLCAxMDAuMCwgNTAuMCnZJGhzdigxNTkuNDU0NTQ1NDU0NTQ1NDQsIDEwMC4wLCA1MC4wKdkjaHN2KDE1Ni44MTgxODE4MTgxODE4LCAxMDAuMCwgNTAuMCnZI2hzdigxNTQuMTgxODE4MTgxODE4MiwgMTAwLjAsIDUwLjAp2SRoc3YoMTUxLjU0NTQ1NDU0NTQ1NDU2LCAxMDAuMCwgNTAuMCnZI2hzdigxNDguOTA5MDkwOTA5MDkwOSwgMTAwLjAsIDUwLjAp2SRoc3YoMTQ2LjI3MjcyNzI3MjcyNzI1LCAxMDAuMCwgNTAuMCnZJGhzdigxNDMuNjM2MzYzNjM2MzYzNjMsIDEwMC4wLCA1MC4wKbdoc3YoMTQxLjAsIDEwMC4wLCA1MC4wKdkkaHN2KDEzOC40NTQ1NDU0NTQ1NDU0NywgMTAwLjAsIDUwLjAp2SNoc3YoMTM1LjkwOTA5MDkwOTA5MDksIDEwMC4wLCA1MC4wKdkkaHN2KDEzMy4zNjM2MzYzNjM2MzYzNSwgMTAwLjAsIDUwLjAp2SNoc3YoMTMwLjgxODE4MTgxODE4MTgsIDEwMC4wLCA1MC4wKdkkaHN2KDEyOC4yNzI3MjcyNzI3MjcyNSwgMTAwLjAsIDUwLjAp2SRoc3YoMTI1LjcyNzI3MjcyNzI3MjcyLCAxMDAuMCwgNTAuMCnZJGhzdigxMjMuMTgxODE4MTgxODE4MTksIDEwMC4wLCA1MC4wKdkkaHN2KDEyMC42MzYzNjM2MzYzNjM2MywgMTAwLjAsIDUwLjAp2SNoc3YoMTE4LjA5MDkwOTA5MDkwOTEsIDEwMC4wLCA1MC4wKdkkaHN2KDExNS41NDU0NTQ1NDU0NTQ1NiwgMTAwLjAsIDUwLjApt2hzdigxMTMuMCwgMTAwLjAsIDUwLjAp2T1oc3YoMTEwLjQ1NDU0NTQ1NDU0NTQ1LCA5OS45OTk5OTk5OTk5OTk5OSwgNDkuOTk5OTk5OTk5OTk5OTkp2SNoc3YoMTA3LjkwOTA5MDkwOTA5MDksIDEwMC4wLCA1MC4wKdkkaHN2KDEwNS4zNjM2MzYzNjM2MzYzNiwgMTAwLjAsIDUwLjAp2SRoc3YoMTAyLjgxODE4MTgxODE4MTg0LCAxMDAuMCwgNTAuMCnZJGhzdigxMDAuMjcyNzI3MjcyNzI3MjUsIDEwMC4wLCA1MC4wKdkjaHN2KDk3LjcyNzI3MjcyNzI3MjczLCAxMDAuMCwgNTAuMCnZI2hzdig5NS4xODE4MTgxODE4MTgxNywgMTAwLjAsIDUwLjAp2SNoc3YoOTIuNjM2MzYzNjM2MzYzNjMsIDEwMC4wLCA1MC4wKdkjaHN2KDkwLjA5MDkwOTA5MDkwOTA3LCAxMDAuMCwgNTAuMCnZI2hzdig4Ny41NDU0NTQ1NDU0NTQ1MywgMTAwLjAsIDUwLjAptmhzdig4NS4wLCAxMDAuMCwgNTAuMCnZI2hzdig4Mi4zNjM2MzYzNjM2MzYzNSwgMTAwLjAsIDUwLjAp2SNoc3YoNzkuNzI3MjcyNzI3MjcyNzMsIDEwMC4wLCA1MC4wKdkjaHN2KDc3LjA5MDkwOTA5MDkwOTA3LCAxMDAuMCwgNTAuMCnZI2hzdig3NC40NTQ1NDU0NTQ1NDU0NSwgMTAwLjAsIDUwLjAp2SNoc3YoNzEuODE4MTgxODE4MTgxODMsIDEwMC4wLCA1MC4wKdkjaHN2KDY5LjE4MTgxODE4MTgxODE3LCAxMDAuMCwgNTAuMCnZI2hzdig2Ni41NDU0NTQ1NDU0NTQ1NiwgMTAwLjAsIDUwLjAp2SJoc3YoNjMuOTA5MDkwOTA5MDkwOSwgMTAwLjAsIDUwLjAp2SNoc3YoNjEuMjcyNzI3MjcyNzI3MjcsIDEwMC4wLCA1MC4wKdkkaHN2KDU4LjYzNjM2MzYzNjM2MzY1NCwgMTAwLjAsIDUwLjAptmhzdig1Ni4wLCAxMDAuMCwgNTAuMCnZPGhzdig1My40NTQ1NDU0NTQ1NDU0NiwgOTkuOTk5OTk5OTk5OTk5OTksIDQ5Ljk5OTk5OTk5OTk5OTk5KdkiaHN2KDUwLjkwOTA5MDkwOTA5MDksIDEwMC4wLCA1MC4wKdkjaHN2KDQ4LjM2MzYzNjM2MzYzNjM2LCAx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ZDAxYmM3NGYxNTMxNmI3hKZsYXlvdXSCqHRlbXBsYXRlgqZsYXlvdXTeABOpY29sb3JheGlzgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApXhheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Zalob3Zlcm1vZGWnY2xvc2VzdK1wYXBlcl9iZ2NvbG9ypXdoaXRlo2dlb4apc2hvd2xha2Vzw6hzaG93bGFuZMOpbGFuZGNvbG9ypyNFNUVDRjanYmdjb2xvcqV3aGl0ZaxzdWJ1bml0Y29sb3Kld2hpdGWpbGFrZWNvbG9ypXdoaXRlqmNvbG9yc2NhbGWDqnNlcXVlbnRpYWyaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGpZGl2ZXJnaW5nm5LKAAAAAKcjOGUwMTUykso9zMzNpyNjNTFiN2SSyj5MzM2nI2RlNzdhZZLKPpmZmqcjZjFiNmRhkso+zMzNpyNmZGUwZWaSyj8AAACnI2Y3ZjdmN5LKPxmZmqcjZTZmNWQwkso/MzMzpyNiOGUxODaSyj9MzM2nIzdmYmM0MZLKP2ZmZqcjNGQ5MjIxkso/gAAApyMyNzY0MTmvc2VxdWVudGlhbG1pbnVzmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxpXlheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Za1zaGFwZWRlZmF1bHRzgaRsaW5lgaVjb2xvcqcjMmEzZjVmqmhvdmVybGFiZWyBpWFsaWdupGxlZnSmbWFwYm94gaVzdHlsZaVsaWdodKVwb2xhcoOrYW5ndWxhcmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqpyYWRpYWxheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0Za9hdXRvdHlwZW51bWJlcnOmc3RyaWN0pGZvbnSBpWNvbG9ypyMyYTNmNWandGVybmFyeYSlYWF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqVjYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWlYmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlsmFubm90YXRpb25kZWZhdWx0c4OpYXJyb3doZWFkygAAAACqYXJyb3d3aWR0aMo/gAAAqmFycm93Y29sb3KnIzJhM2Y1ZqxwbG90X2JnY29sb3KnI0U1RUNGNqV0aXRsZYGheMo9TMzNpXNjZW5lg6V4YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWlemF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXlheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0Zahjb2xvcndheZqnIzYzNmVmYacjRUY1NTNCpyMwMGNjOTanI2FiNjNmYacjRkZBMTVBpyMxOWQzZjOnI0ZGNjY5MqcjQjZFODgwpyNGRjk3RkanI0ZFQ0I1MqRkYXRh3gAZrnNjYXR0ZXJwb2xhcmdskYKkdHlwZa5zY2F0dGVycG9sYXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmY2FycGV0kYOlYmF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaR0eXBlpmNhcnBldKVhYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlrHNjYXR0ZXJwb2xhcpGCpHR5cGWsc2NhdHRlcnBvbGFypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKlwYXJjb29yZHORgqRsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpcGFyY29vcmRzp3NjYXR0ZXKRgqR0eXBlp3NjYXR0ZXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAsmhpc3RvZ3JhbTJkY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZbJoaXN0b2dyYW0yZGNvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMadjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2NvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVyY2FycGV0kYKkdHlwZa1zY2F0dGVyY2FycGV0pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZtZXNoM2SRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWmbWVzaDNkp3N1cmZhY2WRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnc3VyZmFjZapjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJtYXBib3iRgqR0eXBlrXNjYXR0ZXJtYXBib3imbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqnNjYXR0ZXJnZW+RgqR0eXBlqnNjYXR0ZXJnZW+mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqWhpc3RvZ3JhbZGCpHR5cGWpaGlzdG9ncmFtpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKNwaWWRgqR0eXBlo3BpZaphdXRvbWFyZ2luw6pjaG9yb3BsZXRokYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqmNob3JvcGxldGipaGVhdG1hcGdskYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqWhlYXRtYXBnbKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxo2JhcpGEpHR5cGWjYmFyp2Vycm9yX3mBpWNvbG9ypyMyYTNmNWanZXJyb3JfeIGlY29sb3KnIzJhM2Y1ZqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKdoZWF0bWFwkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2hlYXRtYXCqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1jb250b3VyY2FycGV0kYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlrWNvbnRvdXJjYXJwZXSldGFibGWRg6R0eXBlpXRhYmxlpmhlYWRlcoKkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0M4RDRFM6VjZWxsc4KkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0VCRjBGOKlzY2F0dGVyM2SRg6RsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpc2NhdHRlcjNkpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKhiYXJwb2xhcpGCpHR5cGWoYmFycG9sYXKmbWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACpc2NhdHRlcmdskYKkdHlwZalzY2F0dGVyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAq2hpc3RvZ3Jh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zMzNpyNjNTFiN2SSyj5MzM2nI2RlNzdhZZLKPpmZmqcjZjFiNmRhkso+zMzNpyNmZGUwZWaSyj8AAACnI2Y3ZjdmN5LKPxmZmqcjZTZmNWQwkso/MzMzpyNiOGUxODaSyj9MzM2nIzdmYmM0MZLKP2ZmZqcjNGQ5MjIxkso/gAAApyMyNzY0MTmvc2VxdWVudGlhbG1pbnVzmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxpXlheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Za1zaGFwZWRlZmF1bHRzgaRsaW5lgaVjb2xvcqcjMmEzZjVmqmhvdmVybGFiZWyBpWFsaWdupGxlZnSmbWFwYm94gaVzdHlsZaVsaWdodKVwb2xhcoOrYW5ndWxhcmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqpyYWRpYWxheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0Za9hdXRvdHlwZW51bWJlcnOmc3RyaWN0pGZvbnSBpWNvbG9ypyMyYTNmNWandGVybmFyeYSlYWF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqVjYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWlYmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlsmFubm90YXRpb25kZWZhdWx0c4OpYXJyb3doZWFkygAAAACqYXJyb3d3aWR0aMo/gAAAqmFycm93Y29sb3KnIzJhM2Y1ZqxwbG90X2JnY29sb3KnI0U1RUNGNqV0aXRsZYGheMo9TMzNpXNjZW5lg6V4YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWlemF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXlheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0Zahjb2xvcndheZqnIzYzNmVmYacjRUY1NTNCpyMwMGNjOTanI2FiNjNmYacjRkZBMTVBpyMxOWQzZjOnI0ZGNjY5MqcjQjZFODgwpyNGRjk3RkanI0ZFQ0I1MqRkYXRh3gAZrnNjYXR0ZXJwb2xhcmdskYKkdHlwZa5zY2F0dGVycG9sYXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmY2FycGV0kYOlYmF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaR0eXBlpmNhcnBldKVhYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlrHNjYXR0ZXJwb2xhcpGCpHR5cGWsc2NhdHRlcnBvbGFypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKlwYXJjb29yZHORgqRsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpcGFyY29vcmRzp3NjYXR0ZXKRgqR0eXBlp3NjYXR0ZXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAsmhpc3RvZ3JhbTJkY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZbJoaXN0b2dyYW0yZGNvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMadjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2NvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVyY2FycGV0kYKkdHlwZa1zY2F0dGVyY2FycGV0pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZtZXNoM2SRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWmbWVzaDNkp3N1cmZhY2WRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnc3VyZmFjZapjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJtYXBib3iRgqR0eXBlrXNjYXR0ZXJtYXBib3imbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqnNjYXR0ZXJnZW+RgqR0eXBlqnNjYXR0ZXJnZW+mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqWhpc3RvZ3JhbZGCpHR5cGWpaGlzdG9ncmFtpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKNwaWWRgqR0eXBlo3BpZaphdXRvbWFyZ2luw6pjaG9yb3BsZXRokYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqmNob3JvcGxldGipaGVhdG1hcGdskYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqWhlYXRtYXBnbKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxo2JhcpGEpHR5cGWjYmFyp2Vycm9yX3mBpWNvbG9ypyMyYTNmNWanZXJyb3JfeIGlY29sb3KnIzJhM2Y1ZqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKdoZWF0bWFwkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2hlYXRtYXCqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1jb250b3VyY2FycGV0kYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlrWNvbnRvdXJjYXJwZXSldGFibGWRg6R0eXBlpXRhYmxlpmhlYWRlcoKkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0M4RDRFM6VjZWxsc4KkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0VCRjBGOKlzY2F0dGVyM2SRg6RsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpc2NhdHRlcjNkpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKhiYXJwb2xhcpGCpHR5cGWoYmFycG9sYXKmbWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACpc2NhdHRlcmdskYKkdHlwZalzY2F0dGVyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAq2hpc3RvZ3JhbTJkkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlq2hpc3RvZ3JhbTJkqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGuc2NhdHRlcnRlcm5hcnmRgqR0eXBlrnNjYXR0ZXJ0ZXJuYXJ5pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZtYXJnaW6EoWzKQkgAAKFiykJIAAChcspCSAAAoXTKQnAAAKZjb25maWeFqHNob3dMaW5rwqhlZGl0YWJsZcKqcmVzcG9uc2l2ZcOqc3RhdGljUGxvdMKqc2Nyb2xsWm9vbcOmZnJhbWVzkKRkYXRhkYOhecgBkBdckS472KsuOwv7LjtAfy87xzowO6ctMTs4WTI7bcAzO6tkNTsUSzc7H3U5OxXoOzt/qT47h71BO2ktRTs7/0g7+j1NO2zzUTsdLlc7LPxcO4VyYzt2pWo7jrJyO4O4ezvM8oI7erSIO+VEjzuUzJY7DIefO4W8qTs/2LU7x2vEO81Q1jslz+w7yv0EPJSwGDww0zQ8bmRgPKZ+ljxg9Oo89feJPd/tBD8ifgA/ZHoCP3r1AD+gKQI/2hsBP8ANAj9ZKwE/gwMCP7EvAT+DAwI/WSsBP78NAj/YGwE/nykCP3n1AD9kegI/In4AP+DtBD/x94k9ePTqPKF+ljymZGA8DdM0PK2wGDy3/QQ8Vc/sO2xQ1jv3a8Q7+de1O4u8qTv0hp872cyWO61EjzuttIg7hPKCO9a4eztasnI7hKVqO4xyYzvN+1w7dy5XO2/zUTu/PU07gP9IOzctRTuyvUE7Zak+O1vnOzsndTk7z0o3O91kNTv+vzM7O1kyO3otMTt9OjA7fH8vO/H6Ljs8rC47pHR5cGWnc2NhdHRlcqF4yAGQFwAAgD8AAABAAABAQAAAgEAAAKBAAADAQAAA4EAAAABBAAAQQQAAIEEAADBBAABAQQAAUEEAAGBBAABwQQAAgEEAAIhBAACQQQAAmEEAAKBBAACoQQAAsEEAALhBAADAQQAAyEEAANBBAADYQQAA4EEAAOhBAADwQQAA+EEAAABCAAAEQgAACEIAAAxCAAAQQgAAFEIAABhCAAAcQgAAIEIAACRCAAAoQgAALEIAADBCAAA0QgAAOEIAADxCAABAQgAAREIAAEhCAABMQgAAUEIAAFRCAABYQgAAXEIAAGBCAABkQgAAaEIAAGxCAABwQgAAdEIAAHhCAAB8QgAAgEIAAIJCAACEQgAAhkIAAIhCAACKQgAAjEIAAI5CAACQQgAAkkIAAJRCAACWQgAAmEIAAJpCAACcQgAAnkIAAKBCAACiQgAApEIAAKZCAACoQgAAqkIAAKxCAACuQgAAsEIAALJCAAC0QgAAtkIAALhCAAC6QgAAvEIAAL5CAADAQgAAwkIAAMRCAADGQgAAyELZNWIzYjg0MDhjLTgxODEtMTFlZi0xNGViLWUxYzU2OWI4YmIyOS83NGMzNmE0MjUyM2ExNjlmhKZsYXlvdXSDqHRlbXBsYXRlgqZsYXlvdXTeABOpY29sb3JheGlzgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApXhheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Zalob3Zlcm1vZGWnY2xvc2VzdK1wYXBlcl9iZ2NvbG9ypXdoaXRlo2dlb4apc2hvd2xha2Vzw6hzaG93bGFuZMOpbGFuZGNvbG9ypyNFNUVDRjanYmdjb2xvcqV3aGl0ZaxzdWJ1bml0Y29sb3Kld2hpdGWpbGFrZWNvbG9ypXdoaXRlqmNvbG9yc2NhbGWDqnNlcXVlbnRpYWyaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGpZGl2ZXJnaW5nm5LKAAAAAKcjOGUwMTUykso9zMzNpyNjNTFiN2SSyj5MzM2nI2RlNzdhZZLKPpmZmqcjZjFiNmRhkso+zMzNpyNmZGUwZWaSyj8AAACnI2Y3ZjdmN5LKPxmZmqcjZTZmNWQwkso/MzMzpyNiOGUxODaSyj9MzM2nIzdmYmM0MZLKP2ZmZqcjNGQ5MjIxkso/gAAApyMyNzY0MTmvc2VxdWVudGlhbG1pbnVzmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxpXlheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Za1zaGFwZWRlZmF1bHRzgaRsaW5lgaVjb2xvcqcjMmEzZjVmqmhvdmVybGFiZWyBpWFsaWdupGxlZnSmbWFwYm94gaVzdHlsZaVsaWdodKVwb2xhcoOrYW5ndWxhcmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqpyYWRpYWxheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0Za9hdXRvdHlwZW51bWJlcnOmc3RyaWN0pGZvbnSBpWNvbG9ypyMyYTNmNWandGVybmFyeYSlYWF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqVjYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWlYmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlsmFubm90YXRpb25kZWZhdWx0c4OpYXJyb3doZWFkygAAAACqYXJyb3d3aWR0aMo/gAAAqmFycm93Y29sb3KnIzJhM2Y1ZqxwbG90X2JnY29sb3KnI0U1RUNGNqV0aXRsZYGheMo9TMzNpXNjZW5lg6V4YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWlemF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXlheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0Zahjb2xvcndheZqnIzYzNmVmYacjRUY1NTNCpyMwMGNjOTanI2FiNjNmYacjRkZBMTVBpyMxOWQzZjOnI0ZGNjY5MqcjQjZFODgwpyNGRjk3RkanI0ZFQ0I1MqRkYXRh3gAZrnNjYXR0ZXJwb2xhcmdskYKkdHlwZa5zY2F0dGVycG9sYXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmY2FycGV0kYOlYmF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaR0eXBlpmNhcnBldKVhYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlrHNjYXR0ZXJwb2xhcpGCpHR5cGWsc2NhdHRlcnBvbGFypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKlwYXJjb29yZHORgqRsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpcGFyY29vcmRzp3NjYXR0ZXKRgqR0eXBlp3NjYXR0ZXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAsmhpc3RvZ3JhbTJkY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZbJoaXN0b2dyYW0yZGNvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMadjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2NvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVyY2FycGV0kYKkdHlwZa1zY2F0dGVyY2FycGV0pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZtZXNoM2SRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWmbWVzaDNkp3N1cmZhY2WRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnc3VyZmFjZapjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJtYXBib3iRgqR0eXBlrXNjYXR0ZXJtYXBib3imbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqnNjYXR0ZXJnZW+RgqR0eXBlqnNjYXR0ZXJnZW+mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqWhpc3RvZ3JhbZGCpHR5cGWpaGlzdG9ncmFtpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKNwaWWRgqR0eXBlo3BpZaphdXRvbWFyZ2luw6pjaG9yb3BsZXRokYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqmNob3JvcGxldGipaGVhdG1hcGdskYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqWhlYXRtYXBnbKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxo2JhcpGEpHR5cGWjYmFyp2Vycm9yX3mBpWNvbG9ypyMyYTNmNWanZXJyb3JfeIGlY29sb3KnIzJhM2Y1ZqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKdoZWF0bWFwkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2hlYXRtYXCqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1jb250b3VyY2FycGV0kYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlrWNvbnRvdXJjYXJwZXSldGFibGWRg6R0eXBlpXRhYmxlpmhlYWRlcoKkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0M4RDRFM6VjZWxsc4KkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0VCRjBGOKlzY2F0dGVyM2SRg6RsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpc2NhdHRlcjNkpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKhiYXJwb2xhcpGCpHR5cGWoYmFycG9sYXKmbWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACpc2NhdHRlcmdskYKkdHlwZalzY2F0dGVyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAq2hpc3RvZ3JhbTJkkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlq2hpc3RvZ3JhbTJkqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGuc2NhdHRlcnRlcm5hcnmRgqR0eXBlrnNjYXR0ZXJ0ZXJuYXJ5pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZtYXJnaW6EoWzKQkgAAKFiykJIAAChcspCSAAAoXTKQnAAAKV5YXhpc4GlcmFuZ2XXFwAAAADNzKBBpmNvbmZpZ4Woc2hvd0xpbmvCqGVkaXRhYmxlwqpyZXNwb25zaXZlw6pzdGF0aWNQbG90wqpzY3JvbGxab29tw6ZmcmFtZXOQpGRhdGGRhaZtYXJrZXKBpWNvbG9ypnB1cnBsZaF5yAGQFwAAoEFYZJ5B1MycQWg5m0EKqplBrx6YQU6XlkHbE5VBTpSTQZsYkkG5oJBBniyPQUG8jUGXT4xBmOaKQTmBiUFyH4hBOcGGQYVmhUFND4RBiLuCQS5rgUE0HoBBJ6l9QYYce0F0lnhB4BZ2Qbqdc0HxKnFBdb5uQTRYbEEh+GlBKZ5nQT9KZUFR/GJBUrRgQTFyXkHfNVxBTv9ZQW/OV0Eyo1VBin1TQWldUUG/Qk9Bfy1NQZwdS0EGE0lBsQ1HQY8NRUGSEkNBrhxBQdUrP0H7Pz1BElk7QQ13OUHhmTdBgcE1QeDtM0HyHjJBq1QwQf+OLkHjzSxBSRErQShZKUFzpSdBH/YlQSFLJEFupCJB+gEhQbtjH0GlyR1BrjMcQcyhGkH0ExlBHIoXQTkEFkFBghRBKgQTQeqJEUF3ExBByKAOQdIxDUGNxgtB7l4KQez6CEF/mgdBnD0GQTrkBEFSjgNB2TsCQcbsAEElQv9AZ7H8QEQn+kCpo/dAhib1QMqv8kBlP/BARtXtQF5x60CkdHlwZadzY2F0dGVypG5hbWWoVDItZGVjYXmheMgBkBcAAAAA/UoBP/1KgT988ME//UoBQL2dIUB88EFAO0NiQP1KgUBddJFAvZ2hQBzHsUB88MFA3BnSQDtD4kCbbPJA/UoBQa1fCUFddBFBDYkZQb2dIUFtsilBHMcxQczbOUF88EFBLAVKQdwZUkGMLlpBO0NiQetXakGbbHJBS4F6Qf1KgUFVVYVBrV+JQQVqjUFddJFBtX6VQQ2JmUFlk51BvZ2hQRWopUFtsqlBxbytQRzHsUF00bVBzNu5QSTmvUF88MFB1PrFQSwFykGED85B3BnSQTQk1kGMLtpB5DjeQTtD4kGTTeZB61fqQUNi7kGbbPJB83b2QUuB+kGji/5B/UoBQilQA0JVVQVCgVoHQq1fCULZZAtCBWoNQjFvD0JddBFCiXkTQrV+FULhgxdCDYkZQjmOG0Jlkx1CkZgfQr2dIULpoiNCFaglQkGtJ0JtsilCmbcrQsW8LULwwS9CHMcxQkjMM0J00TVCoNY3QszbOUL44DtCJOY9QlDrP0J88EFCqPVDQtT6RUIAAEhC2TViM2I4NDA4Yy04MTgxLTExZWYtMTRlYi1lMWM1NjliOGJiMjkvNmY3MDA1NmJjZjFkN2EzM4SmbGF5b3V0i6V4YXhpc4ircmFuZ2VzbGlkZXKBp3Zpc2libGXCqWdyaWRjb2xvcqV3aGl0Za1yYW5nZXNlbGVjdG9ygadidXR0b25zkoSkc3RlcMpBIAAAqHN0ZXBtb2RlqGJhY2t3YXJkpWxhYmVsojFtpWNvdW50yj+AAACBpHN0ZXCjYWxspXRpdGxlgaR0ZXh0oKVyYW5nZZCmZG9tYWlukK16ZXJvbGluZWNvbG9ypXdoaXRlqnRpY2tzdWZmaXijIG1zp21vZGViYXKIpWNvbG9ypGdyYXmrYWN0aXZlY29sb3KwcmdiKDIyOSwyMzYsMjQ2Kad5YW5jaG9ypmJvdHRvbad4YW5jaG9ypXJpZ2h0oXnKP4AAAKdiZ2NvbG9yrXJnYmEoMCwwLDAsMCmrb3JpZW50YXRpb26haKF4ygAAAACpaG92ZXJtb2Rlp2Nsb3Nlc3StcGFwZXJfYmdjb2xvcq1yZ2JhKDAsMCwwLDApqHRlbXBsYXRlgqZsYXlvdXTeABOpY29sb3JheGlzgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApXhheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Zalob3Zlcm1vZGWnY2xvc2VzdK1wYXBlcl9iZ2NvbG9ypXdoaXRlo2dlb4apc2hvd2xha2Vzw6hzaG93bGFuZMOpbGFuZGNvbG9ypyNFNUVDRjanYmdjb2xvcqV3aGl0ZaxzdWJ1bml0Y29sb3Kld2hpdGWpbGFrZWNvbG9ypXdoaXRlqmNvbG9yc2NhbGWDqnNlcXVlbnRpYWyaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGpZGl2ZXJnaW5nm5LKAAAAAKcjOGUwMTUykso9zMzNpyNjNTFiN2SSyj5MzM2nI2RlNzdhZZLKPpmZmqcjZjFiNmRhkso+zMzNpyNmZGUwZWaSyj8AAACnI2Y3ZjdmN5LKPxmZmqcjZTZmNWQwkso/MzMzpyNiOGUxODaSyj9MzM2nIzdmYmM0MZLKP2ZmZqcjNGQ5MjIxkso/gAAApyMyNzY0MTmvc2VxdWVudGlhbG1pbnVzmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxpXlheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Za1zaGFwZWRlZmF1bHRzgaRsaW5lgaVjb2xvcqcjMmEzZjVmqmhvdmVybGFiZWyBpWFsaWdupGxlZnSmbWFwYm94gaVzdHlsZaVsaWdodKVwb2xhcoOrYW5ndWxhcmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqpyYWRpYWxheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0Za9hdXRvdHlwZW51bWJlcnOmc3RyaWN0pGZvbnSBpWNvbG9ypyMyYTNmNWandGVybmFyeYSlYWF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqVjYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWlYmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlsmFubm90YXRpb25kZWZhdWx0c4OpYXJyb3doZWFkygAAAACqYXJyb3d3aWR0aMo/gAAAqmFycm93Y29sb3KnIzJhM2Y1ZqxwbG90X2JnY29sb3KnI0U1RUNGNqV0aXRsZYGheMo9TMzNpXNjZW5lg6V4YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWlemF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXlheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0Zahjb2xvcndheZqnIzYzNmVmYacjRUY1NTNCpyMwMGNjOTanI2FiNjNmYacjRkZBMTVBpyMxOWQzZjOnI0ZGNjY5MqcjQjZFODgwpyNGRjk3RkanI0ZFQ0I1MqRkYXRh3gAZrnNjYXR0ZXJwb2xhcmdskYKkdHlwZa5zY2F0dGVycG9sYXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmY2FycGV0kYOlYmF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaR0eXBlpmNhcnBldKVhYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlrHNjYXR0ZXJwb2xhcpGCpHR5cGWsc2NhdHRlcnBvbGFypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKlwYXJjb29yZHORgqRsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpcGFyY29vcmRzp3NjYXR0ZXKRgqR0eXBlp3NjYXR0ZXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAsmhpc3RvZ3JhbTJkY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZbJoaXN0b2dyYW0yZGNvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMadjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2NvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVyY2FycGV0kYKkdHlwZa1zY2F0dGVyY2FycGV0pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZtZXNoM2SRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWmbWVzaDNkp3N1cmZhY2WRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnc3VyZmFjZapjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJtYXBib3iRgqR0eXBlrXNjYXR0ZXJtYXBib3imbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqnNjYXR0ZXJnZW+RgqR0eXBlqnNjYXR0ZXJnZW+mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqWhpc3RvZ3JhbZGCpHR5cGWpaGlzdG9ncmFtpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKNwaWWRgqR0eXBlo3BpZaphdXRvbWFyZ2luw6pjaG9yb3BsZXRokYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqmNob3JvcGxldGipaGVhdG1hcGdskYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqWhlYXRtYXBnbKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxo2JhcpGEpHR5cGWjYmFyp2Vycm9yX3mBpWNvbG9ypyMyYTNmNWanZXJyb3JfeIGlY29sb3KnIzJhM2Y1ZqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKdoZWF0bWFwkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2hlYXRtYXCqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1jb250b3VyY2FycGV0kYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlrWNvbnRvdXJjYXJwZXSldGFibGWRg6R0eXBlpXRhYmxlpmhlYWRlcoKkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0M4RDRFM6VjZWxsc4KkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0VCRjBGOKlzY2F0dGVyM2SRg6RsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpc2NhdHRlcjNkpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKhiYXJwb2xhcpGCpHR5cGWoYmFycG9sYXKmbWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACpc2NhdHRlcmdskYKkdHlwZalzY2F0dGVyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAq2hpc3RvZ3JhbTJkkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlq2hpc3RvZ3JhbTJkqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGuc2NhdHRlcnRlcm5hcnmRgqR0eXBlrnNjYXR0ZXJ0ZXJuYXJ5pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZsZWdlbmSFp3lhbmNob3KmYm90dG9tp3hhbmNob3KkbGVmdKF5yj+AAACrb3JpZW50YXRpb26haKF4ygAAAACleWF4aXODqWdyaWRjb2xvcqV3aGl0Za16ZXJvbGluZWNvbG9ypXdoaXRlqmZpeGVkcmFuZ2XCpGZvbnSBpWNvbG9ypGdyYXmldGl0bGWgrHBsb3RfYmdjb2xvcrByZ2IoMjI5LDIzNiwyNDYppm1hcmdpboShbMoAAAAAoWLKAAAAAKFyygAAAAChdMoAAAAApmNvbmZpZ4i2bW9kZUJhckJ1dHRvbnNUb1JlbW92ZZqkem9vbahzZWxlY3QyZKdsYXNzbzJkqWF1dG9TY2FsZaxyZXNldFNjYWxlMmSjcGFurXRhYmxlUm90YXRpb26zcmVzZXRDYW1lcmFMYXN0U2F2ZaZ6b29tSW6nem9vbU91dKtkaXNwbGF5bG9nb8K0dG9JbWFnZUJ1dHRvbk9wdGlvbnOBpmZvcm1hdKNzdmeoc2hvd0xpbmvCqGVkaXRhYmxlwqpyZXNwb25zaXZlw6pzdGF0aWNQbG90wqpzY3JvbGxab29tw6ZmcmFtZXOQpGRhdGGXiqpzaG93bGVnZW5kw6ZtYXJrZXKBpWNvbG9ypyM2MzZFRkGleGF4aXOheKF5xzAXAACAfwAAAADKayhBymsoQQAAAAAAAIB/AACAfwAAAADKayhBymsoQQAAAAAAAIB/pHR5cGWnc2NhdHRlcqRuYW1lokd4pXlheGlzoXmrbGVnZW5kZ3JvdXCiR3itaG92ZXJ0ZW1wbGF0ZbwoJXt4Oi40Zn0gbXMsICV7eTouMmZ9IG1UL20poXjHMBcAAIB/clAWP3JQFj8HZSlBB2UpQQAAgH8AAIB/DsoyQQ7KMkEHZflBB2X5QQAAgH+KqnNob3dsZWdlbmTDpm1hcmtlcoGlY29sb3KnI0VGNTUzQqV4YXhpc6F4oXnYFwAAgH8AAIB/AACAfwAAgH+kdHlwZadzY2F0dGVypG5hbWWiR3mleWF4aXOheatsZWdlbmRncm91cKJHea1ob3ZlcnRlbXBsYXRlvCgle3g6LjRmfSBtcywgJXt5Oi4yZn0gbVQvbSmheNgXAACAfwAAgH8AAIB/AACAf4qqc2hvd2xlZ2VuZMOmbWFya2VygaVjb2xvcqcjMDBDQzk2pXhheGlzoXihedgXAACAfwAAgH8AAIB/AACAf6R0eXBlp3NjYXR0ZXKkbmFtZaJHeqV5YXhpc6F5q2xlZ2VuZGdyb3Vwokd6rWhvdmVydGVtcGxhdGW8KCV7eDouNGZ9IG1zLCAle3k6LjJmfSBtVC9tKaF42BcAAIB/AACAfwAAgH8AAIB/iqpzaG93bGVnZW5kw6ZtYXJrZXKBpWNvbG9ypyNBQjYzRkGleGF4aXOheKF5xzAXAAAAAAAAIEEAACBBAAAAAAAAgH8AAIB/AAAAAAAAoEEAAKBBAAAAAAAAgH8AAIB/pHR5cGWnc2NhdHRlcqRuYW1lp3xCMXxfQU2leWF4aXOheatsZWdlbmRncm91cKd8QjF8X0FNrWhvdmVydGVtcGxhdGW7KCV7eDouNGZ9IG1zLCAle3k6LjJmfSDOvFQpoXjHMBcAAAAAAAAAAHJQFj9yUBY/AACAfwAAgH8HZSlBB2UpQQ7KMkEOyjJBAACAfwAAgH+MqnNob3dsZWdlbmTDpXhheGlzoXindmlzaWJsZapsZWdlbmRvbmx5pG5hbWWo4oigQjFfQU2kdGV4dMcwFwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAP6V5YXhpc6F5q2xlZ2VuZGdyb3VwqOKIoEIxX0FNpm1hcmtlcoGlY29sb3KnI0ZGQTE1QaF5xzAXAAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AAAAANsPyT/bD8k/AAAAAAAAgH8AAIB/pHR5cGWnc2NhdHRlcq1ob3ZlcnRlbXBsYXRl2SIoJXt4Oi40Zn0gbXMsIOKIoEIxOiAle3k6LjRmfSByYWQpoXjHMBcAAAAAAAAAAHJQFj9yUBY/AACAfwAAgH8HZSlBB2UpQQ7KMkEOyjJBAACAfwAAgH+NqnNob3dsZWdlbmTDpXhheGlzoXindmlzaWJsZapsZWdlbmRvbmx5pG5hbWWlQjFfRk2kdGV4dMcwFwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAP6V5YXhpc6F5q2xlZ2VuZGdyb3VwpUIxX0ZNpm1hcmtlcoGlY29sb3KnI0FCNjNGQaRsaW5lgaRkYXNoo2RvdKF5xzAXAAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/pHR5cGWnc2NhdHRlcq1ob3ZlcnRlbXBsYXRl2SIoJXt4Oi40Zn0gbXMsIEIxX0ZNOiAle3k6LjRmfSBrSHopoXjHMBcAAAAAAAAAAHJQFj9yUBY/AACAfwAAgH8HZSlBB2UpQQ7KMkEOyjJBAACAfwAAgH+LqnNob3dsZWdlbmTDpG1vZGWkbGluZaV4YXhpc6F4pG5hbWWjQURDpXlheGlzoXmrbGVnZW5kZ3JvdXCjQURDpm1hcmtlcoGlY29sb3KnIzE5RDNGM6F5xyAXAACAfwAAgH8AAIB/AAAAAAAAgD8AAIA/AAAAAAAAgH+kdHlwZadzY2F0dGVyrWhvdmVydGVtcGxhdGW1KCV7eDouNGZ9IG1zLCAle3k6aX0poXjHIBcAAIB/AACAfwAAgH8OyjJBDsoyQQdl+UEHZflBAACAf9k1YjNiODQwOGMtODE4MS0xMWVmLTE0ZWItZTFjNTY5YjhiYjI5LzQyMmQ0OTE4OWMzNjNmNTeEpmxheW91dIenbW9kZWJhcoilY29sb3KkZ3JheathY3RpdmVjb2xvcrByZ2IoMjI5LDIzNiwyNDYpp3lhbmNob3KmYm90dG9tp3hhbmNob3KlcmlnaHSheco/gAAAp2JnY29sb3KtcmdiYSgwLDAsMCwwKatvcmllbnRhdGlvbqFooXjKAAAAAK1wYXBlcl9iZ2NvbG9yrXJnYmEoMCwwLDAsMCmkZm9udIGlY29sb3KkZ3Jheah0ZW1wbGF0ZYKmbGF5b3V03gATqWNvbG9yYXhpc4GoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKV4YXhpc4epZ3JpZGNvbG9ypXdoaXRlrXplcm9saW5ld2lkdGjKQAAAAKV0aXRsZYGoc3RhbmRvZmbKQXAAAKV0aWNrc6CtemVyb2xpbmVjb2xvcqV3aGl0ZaphdXRvbWFyZ2luw6lsaW5lY29sb3Kld2hpdGWpaG92ZXJtb2Rlp2Nsb3Nlc3StcGFwZXJfYmdjb2xvcqV3aGl0ZaNnZW+GqXNob3dsYWtlc8Ooc2hvd2xhbmTDqWxhbmRjb2xvcqcjRTVFQ0Y2p2JnY29sb3Kld2hpdGWsc3VidW5pdGNvbG9ypXdoaXRlqWxha2Vjb2xvcqV3aGl0Zapjb2xvcnNjYWxlg6pzZXF1ZW50aWFsmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxqWRpdmVyZ2luZ5uSygAAAACnIzhlMDE1MpLKPczMzacjYzUxYjdkkso+TMzNpyNkZTc3YWWSyj6ZmZqnI2YxYjZkYZLKPszMzacjZmRlMGVmkso/AAAApyNmN2Y3ZjeSyj8ZmZqnI2U2ZjVkMJLKPzMzM6cjYjhlMTg2kso/TMzNpyM3ZmJjNDGSyj9mZmanIzRkOTIyMZLKP4AAAKcjMjc2NDE5r3NlcXVlbnRpYWxtaW51c5qSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMaV5YXhpc4epZ3JpZGNvbG9ypXdoaXRlrXplcm9saW5ld2lkdGjKQAAAAKV0aXRsZYGoc3RhbmRvZmbKQXAAAKV0aWNrc6CtemVyb2xpbmVjb2xvcqV3aGl0ZaphdXRvbWFyZ2luw6lsaW5lY29sb3Kld2hpdGWtc2hhcGVkZWZhdWx0c4GkbGluZYGlY29sb3KnIzJhM2Y1Zqpob3ZlcmxhYmVsgaVhbGlnbqRsZWZ0pm1hcGJveIGlc3R5bGWlbGlnaHSlcG9sYXKDq2FuZ3VsYXJheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZadiZ2NvbG9ypyNFNUVDRjaqcmFkaWFsYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWvYXV0b3R5cGVudW1iZXJzpnN0cmljdKRmb250gaVjb2xvcqcjMmEzZjVmp3Rlcm5hcnmEpWFheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZadiZ2NvbG9ypyNFNUVDRjalY2F4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlpWJheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZbJhbm5vdGF0aW9uZGVmYXVsdHODqWFycm93aGVhZMoAAAAAqmFycm93d2lkdGjKP4AAAKphcnJvd2NvbG9ypyMyYTNmNWascGxvdF9iZ2NvbG9ypyNFNUVDRjaldGl0bGWBoXjKPUzMzaVzY2VuZYOleGF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXpheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0ZaV5YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWoY29sb3J3YXmapyM2MzZlZmGnI0VGNTUzQqcjMDBjYzk2pyNhYjYzZmGnI0ZGQTE1QacjMTlkM2YzpyNGRjY2OTKnI0I2RTg4MKcjRkY5N0ZGpyNGRUNCNTKkZGF0Yd4AGa5zY2F0dGVycG9sYXJnbJGCpHR5cGWuc2NhdHRlcnBvbGFyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApmNhcnBldJGDpWJheGlzhalncmlkY29sb3Kld2hpdGWsZW5kbGluZWNvbG9ypyMyYTNmNWaubWlub3JncmlkY29sb3Kld2hpdGWuc3RhcnRsaW5lY29sb3KnIzJhM2Y1ZqlsaW5lY29sb3Kld2hpdGWkdHlwZaZjYXJwZXSlYWF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaxzY2F0dGVycG9sYXKRgqR0eXBlrHNjYXR0ZXJwb2xhcqZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACpcGFyY29vcmRzkYKkbGluZYGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqXBhcmNvb3Jkc6dzY2F0dGVykYKkdHlwZadzY2F0dGVypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAALJoaXN0b2dyYW0yZGNvbnRvdXKRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWyaGlzdG9ncmFtMmRjb250b3VyqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGnY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadjb250b3VyqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtc2NhdHRlcmNhcnBldJGCpHR5cGWtc2NhdHRlcmNhcnBldKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmbWVzaDNkkYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlpm1lc2gzZKdzdXJmYWNlkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp3N1cmZhY2WqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVybWFwYm94kYKkdHlwZa1zY2F0dGVybWFwYm94pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKpzY2F0dGVyZ2VvkYKkdHlwZapzY2F0dGVyZ2Vvpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKloaXN0b2dyYW2RgqR0eXBlqWhpc3RvZ3JhbaZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACjcGllkYKkdHlwZaNwaWWqYXV0b21hcmdpbsOqY2hvcm9wbGV0aJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZapjaG9yb3BsZXRoqWhlYXRtYXBnbJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZaloZWF0bWFwZ2yqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMaNiYXKRhKR0eXBlo2JhcqdlcnJvcl95gaVjb2xvcqcjMmEzZjVmp2Vycm9yX3iBpWNvbG9ypyMyYTNmNWambWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACnaGVhdG1hcJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadoZWF0bWFwqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtY29udG91cmNhcnBldJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZa1jb250b3VyY2FycGV0pXRhYmxlkYOkdHlwZaV0YWJsZaZoZWFkZXKCpGxpbmWBpWNvbG9ypXdoaXRlpGZpbGyBpWNvbG9ypyNDOEQ0RTOlY2VsbHOCpGxpbmWBpWNvbG9ypXdoaXRlpGZpbGyBpWNvbG9ypyNFQkYwRjipc2NhdHRlcjNkkYOkbGluZYGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqXNjYXR0ZXIzZKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACoYmFycG9sYXKRgqR0eXBlqGJhcnBvbGFypm1hcmtlcoGkbGluZYKlY29sb3KnI0U1RUNGNqV3aWR0aMo/AAAAqXNjYXR0ZXJnbJGCpHR5cGWpc2NhdHRlcmdspm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKtoaXN0b2dyYW0yZJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZatoaXN0b2dyYW0yZKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrnNjYXR0ZXJ0ZXJuYXJ5kYKkdHlwZa5zY2F0dGVydGVybmFyeaZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAAClc2NlbmWFpmNhbWVyYYKidXCDoXnKP4AAAKF6ygAAAACheMoAAAAAo2V5ZYOhecoAAAAAoXrKP9mZmqF4ygAAAACleGF4aXOFqWdyaWRjb2xvcqV3aGl0Za9iYWNrZ3JvdW5kY29sb3KwcmdiKDIyOSwyMzYsMjQ2KaV0aXRsZatreCBbbeKBu8K5XaVyYW5nZdcXiRfgxYkX4EWtemVyb2xpbmVjb2xvcqV3aGl0ZaV5YXhpc4WpZ3JpZGNvbG9ypXdoaXRlr2JhY2tncm91bmRjb2xvcrByZ2IoMjI5LDIzNiwyNDYppXRpdGxlq2t5IFtt4oG7wrldpXJhbmdl1xenESjFpxEoRa16ZXJvbGluZWNvbG9ypXdoaXRlpXpheGlzhalncmlkY29sb3Kld2hpdGWvYmFja2dyb3VuZGNvbG9ysHJnYigyMjksMjM2LDI0NimldGl0bGWra3ogW23igbvCuV2lcmFuZ2XXF6cRKMWnEShFrXplcm9saW5lY29sb3Kld2hpdGWqYXNwZWN0bW9kZaRjdWJlpm1hcmdpboShbMoAAAAAoWLKQkgAAKFyygAAAAChdMoAAAAApmxlZ2VuZIWneWFuY2hvcqZib3R0b22neGFuY2hvcqRsZWZ0oXnKP4AAAKtvcmllbnRhdGlvbqFooXjKAAAAAKZjb25maWeItm1vZGVCYXJCdXR0b25zVG9SZW1vdmWWpHpvb22jcGFurXRhYmxlUm90YXRpb261cmVzZXRDYW1lcmFMYXN0U2F2ZTNkrW9yYml0Um90YXRpb260cmVzZXRDYW1lcmFEZWZhdWx0M2SrZGlzcGxheWxvZ2/CtHRvSW1hZ2VCdXR0b25PcHRpb25zgaZmb3JtYXSjc3ZnqHNob3dMaW5rwqhlZGl0YWJsZcKqcmVzcG9uc2l2ZcOqc3RhdGljUGxvdMKqc2Nyb2xsWm9vbcOmZnJhbWVzkKRkYXRhk4ikbW9kZaVsaW5lc6RsaW5lgaVjb2xvcqRncmF5oXnIAqAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApHR5cGWpc2NhdHRlcjNkpG5hbWWqVHJhamVjdG9yealob3ZlcmluZm+kc2tpcKF6yAKgFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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2SNoc3YoMjA4LjE4MTgxODE4MTgxODIsIDEwMC4wLCA1MC4wKdkkaHN2KDIwNS42MzYzNjM2MzYzNjM2MywgMTAwLjAsIDUwLjAp2SRoc3YoMjAzLjA5MDkwOTA5MDkwOTA3LCAxMDAuMCwgNTAuMCnZJGhzdigyMDAuNTQ1NDU0NTQ1NDU0NTMsIDEwMC4wLCA1MC4wKbdoc3YoMTk4LjAsIDEwMC4wLCA1MC4wKdk9aHN2KDE5NS40NTQ1NDU0NTQ1NDU0NCwgOTkuOTk5OTk5OTk5OTk5OTksIDQ5Ljk5OTk5OTk5OTk5OTk5KdkjaHN2KDE5Mi45MDkwOTA5MDkwOTA5LCAxMDAuMCwgNTAuMCnZJGhzdigxOTAuMzYzNjM2MzYzNjM2MzcsIDEwMC4wLCA1MC4wKdkjaHN2KDE4Ny44MTgxODE4MTgxODE4LCAxMDAuMCwgNTAuMCnZJGhzdigxODUuMjcyNzI3MjcyNzI3MjgsIDEwMC4wLCA1MC4wKdkkaHN2KDE4Mi43MjcyNzI3MjcyNzI3MiwgMTAwLjAsIDUwLjAp2SNoc3YoMTgwLjE4MTgxODE4MTgxODIsIDEwMC4wLCA1MC4wKdkkaHN2KDE3Ny42MzYzNjM2MzYzNjM2MywgMTAwLjAsIDUwLjAp2SNoc3YoMTc1LjA5MDkwOTA5MDkwOTEsIDEwMC4wLCA1MC4wKdkkaHN2KDE3Mi41NDU0NTQ1NDU0NTQ1MywgMTAwLjAsIDUwLjApt2hzdigxNzAuMCwgMTAwLjAsIDUwLjAp2T1oc3YoMTY3LjM2MzYzNjM2MzYzNjM3LCA5OS45OTk5OTk5OTk5OTk5OSwgNDkuOTk5OTk5OTk5OTk5OTkp2SRoc3YoMTY0LjcyNzI3MjcyNzI3MjcyLCAxMDAuMCwgNTAuMCnZI2hzdigxNjIuMDkwOTA5MDkwOTA5MSwgMTAwLjAsIDUwLjAp2SRoc3YoMTU5LjQ1NDU0NTQ1NDU0NTQ0LCAxMDAuMCwgNTAuMCnZI2hzdigxNTYuODE4MTgxODE4MTgxOCwgMTAwLjAsIDUwLjAp2SNoc3YoMTU0LjE4MTgxODE4MTgxODIsIDEwMC4wLCA1MC4wKdkkaHN2KDE1MS41NDU0NTQ1NDU0NTQ1NiwgMTAwLjAsIDUwLjAp2SNoc3YoMTQ4LjkwOTA5MDkwOTA5MDksIDEwMC4wLCA1MC4wKdkkaHN2KDE0Ni4yNzI3MjcyNzI3MjcyNSwgMTAwLjAsIDUwLjAp2SRoc3YoMTQzLjYzNjM2MzYzNjM2MzYzLCAxMDAuMCwgNTAuMCm3aHN2KDE0MS4wLCAxMDAuMCwgNTAuMCnZJGhzdigxMzguNDU0NTQ1NDU0NTQ1NDcsIDEwMC4wLCA1MC4wKdkjaHN2KDEzNS45MDkwOTA5MDkwOTA5LCAxMDAuMCwgNTAuMCnZJGhzdigxMzMuMzYzNjM2MzYzNjM2MzUsIDEwMC4wLCA1MC4wKdkjaHN2KDEzMC44MTgxODE4MTgxODE4LCAxMDAuMCwgNTAuMCnZJGhzdigxMjguMjcyNzI3MjcyNzI3MjUsIDEwMC4wLCA1MC4wKdkkaHN2KDEyNS43MjcyNzI3MjcyNzI3MiwgMTAwLjAsIDUwLjAp2SRoc3YoMTIzLjE4MTgxODE4MTgxODE5LCAxMDAuMCwgNTAuMCnZJGhzdigxMjAuNjM2MzYzNjM2MzYzNjMsIDEwMC4wLCA1MC4wKdkjaHN2KDExOC4wOTA5MDkwOTA5MDkxLCAxMDAuMCwgNTAuMCnZJGhzdigxMTUuNTQ1NDU0NTQ1NDU0NTYsIDEwMC4wLCA1MC4wKbdoc3YoMTEzLjAsIDEwMC4wLCA1MC4wKdk9aHN2KDExMC40NTQ1NDU0NTQ1NDU0NSwgOTkuOTk5OTk5OTk5OTk5OTksIDQ5Ljk5OTk5OTk5OTk5OTk5KdkjaHN2KDEwNy45MDkwOTA5MDkwOTA5LCAxMDAuMCwgNTAuMCnZJGhzdigxMDUuMzYzNjM2MzYzNjM2MzYsIDEwMC4wLCA1MC4wKdkkaHN2KDEwMi44MTgxODE4MTgxODE4NCwgMTAwLjAsIDUwLjAp2SRoc3YoMTAwLjI3MjcyNzI3MjcyNzI1LCAxMDAuMCwgNTAuMCnZI2hzdig5Ny43MjcyNzI3MjcyNzI3MywgMTAwLjAsIDUwLjAp2SNoc3YoOTUuMTgxODE4MTgxODE4MTcsIDEwMC4wLCA1MC4wKdkjaHN2KDkyLjYzNjM2MzYzNjM2MzYzLCAxMDAuMCwgNTAuMCnZI2hzdig5MC4wOTA5MDkwOTA5MDkwNywgMTAwLjAsIDUwLjAp2SNoc3YoODcuNTQ1NDU0NTQ1NDU0NTMsIDEwMC4wLCA1MC4wKbZoc3YoODUuMCwgMTAwLjAsIDUwLjAp2SNoc3YoODIuMzYzNjM2MzYzNjM2MzUsIDEwMC4wLCA1MC4wKdkjaHN2KDc5LjcyNzI3MjcyNzI3MjczLCAxMDAuMCwgNTAuMCnZI2hzdig3Ny4wOTA5MDkwOTA5MDkwNywgMTAwLjAsIDUwLjAp2SNoc3YoNzQuNDU0NTQ1NDU0NTQ1NDUsIDEwMC4wLCA1MC4wKdkjaHN2KDcxLjgxODE4MTgxODE4MTgzLCAxMDAuMCwgNTAuMCnZI2hzdig2OS4xODE4MTgxODE4MTgxNywgMTAwLjAsIDUwLjAp2SNoc3YoNjYuNTQ1NDU0NTQ1NDU0NTYsIDEwMC4wLCA1MC4wKdkiaHN2KDYzLjkwOTA5MDkwOTA5MDksIDEwMC4wLCA1MC4wKdkjaHN2KDYxLjI3MjcyNzI3MjcyNzI3LCAxMDAuMCwgNTAuMCnZJGhzdig1OC42MzYzNjM2MzYzNjM2NTQsIDEwMC4wLCA1MC4wKbZoc3YoNTYuMCwgMTAwLjAsIDUwLjAp2Txoc3YoNTMuNDU0NTQ1NDU0NTQ1NDYsIDk5Ljk5OTk5OTk5OTk5OTk5LCA0OS45OTk5OTk5OTk5OTk5OSnZImhzdig1MC45MDkwOTA5MDkwOTA5LCAxMDAuMCwgNTAuMCnZI2hzdig0OC4zNjM2MzYzNjM2MzYzNiwgMTAwLjAsIDUwLjAp2SJoc3YoNDUuODE4MTgxODE4MTgxOCwgMTAwLjAsIDUwLjAp2SRoc3YoNDMuMjcyNzI3MjcyNzI3MjY2LCAxMDAuMCwgNTAuMCnZJGhzdig0MC43MjcyNzI3MjcyNzI3MzQsIDEwMC4wLCA1MC4wKdkjaHN2KDM4LjE4MTgxODE4MTgxODE3LCAxMDAuMCwgNTAuMCnZI2hzdigzNS42MzYzNjM2MzYzNjM2MywgMTAwLjAsIDUwLjAp2SRoc3YoMzMuMDkwOTA5MDkwOTA5MDY1LCAxMDAuMCwgNTAuMCnZJGhzdigzMC41NDU0NTQ1NDU0NTQ1MzYsIDEwMC4wLCA1MC4wKbZoc3YoMjguMCwgMTAwLjAsIDUwLjAp2SNoc3YoMjUuNDU0NTQ1NDU0NTQ1NDQsIDEwMC4wLCA1MC4wKdkk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OOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxqWRpdmVyZ2luZ5uSygAAAACnIzhlMDE1MpLKPczMzacjYzUxYjdkkso+TMzNpyNkZTc3YWWSyj6ZmZqnI2YxYjZkYZLKPszMzacjZmRlMGVmkso/AAAApyNmN2Y3ZjeSyj8ZmZqnI2U2ZjVkMJLKPzMzM6cjYjhlMTg2kso/TMzNpyM3ZmJjNDGSyj9mZmanIzRkOTIyMZLKP4AAAKcjMjc2NDE5r3NlcXVlbnRpYWxtaW51c5qSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMaV5YXhpc4epZ3JpZGNvbG9ypXdoaXRlrXplcm9saW5ld2lkdGjKQAAAAKV0aXRsZYGoc3RhbmRvZmbKQXAAAKV0aWNrc6CtemVyb2xpbmVjb2xvcqV3aGl0ZaphdXRvbWFyZ2luw6lsaW5lY29sb3Kld2hpdGWtc2hhcGVkZWZhdWx0c4GkbGluZYGlY29sb3KnIzJhM2Y1Zqpob3ZlcmxhYmVsgaVhbGlnbqRsZWZ0pm1hcGJveIGlc3R5bGWlbGlnaHSlcG9sYXKDq2FuZ3VsYXJheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZadiZ2NvbG9ypyNFNUVDRjaqcmFkaWFsYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWvYXV0b3R5cGVudW1iZXJzpnN0cmljdKRmb250gaVjb2xvcqcjMmEzZjVmp3Rlcm5hcnmEpWFheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZadiZ2NvbG9ypyNFNUVDRjalY2F4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlpWJheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZbJhbm5vdGF0aW9uZGVmYXVsdHODqWFycm93aGVhZMoAAAAAqmFycm93d2lkdGjKP4AAAKphcnJvd2NvbG9ypyMyYTNmNWascGxvdF9iZ2NvbG9ypyNFNUVDRjaldGl0bGWBoXjKPUzMzaVzY2VuZYOleGF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXpheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0ZaV5YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWoY29sb3J3YXmapyM2MzZlZmGnI0VGNTUzQqcjMDBjYzk2pyNhYjYzZmGnI0ZGQTE1QacjMTlkM2YzpyNGRjY2OTKnI0I2RTg4MKcjRkY5N0ZGpyNGRUNCNTKkZGF0Yd4AGa5zY2F0dGVycG9sYXJnbJGCpHR5cGWuc2NhdHRlcnBvbGFyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApmNhcnBldJGDpWJheGlzhalncmlkY29sb3Kld2hpdGWsZW5kbGluZWNvbG9ypyMyYTNmNWaubWlub3JncmlkY29sb3Kld2hpdGWuc3RhcnRsaW5lY29sb3KnIzJhM2Y1ZqlsaW5lY29sb3Kld2hpdGWkdHlwZaZjYXJwZXSlYWF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaxzY2F0dGVycG9sYXKRgqR0eXBlrHNjYXR0ZXJwb2xhcqZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACpcGFyY29vcmRzkYKkbGluZYGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqXBhcmNvb3Jkc6dzY2F0dGVykYKkdHlwZadzY2F0dGVypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAALJoaXN0b2dyYW0yZGNvbnRvdXKRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWyaGlzdG9ncmFtMmRjb250b3VyqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGnY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadjb250b3VyqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtc2NhdHRlcmNhcnBldJGCpHR5cGWtc2NhdHRlcmNhcnBldKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmbWVzaDNkkYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlpm1lc2gzZKdzdXJmYWNlkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp3N1cmZhY2WqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVybWFwYm94kYKkdHlwZa1zY2F0dGVybWFwYm94pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKpzY2F0dGVyZ2VvkYKkdHlwZapzY2F0dGVyZ2Vvpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKloaXN0b2dyYW2RgqR0eXBlqWhpc3RvZ3JhbaZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACjcGllkYKkdHlwZaNwaWWqYXV0b21hcmdpbsOqY2hvcm9wbGV0aJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZapjaG9yb3BsZXRoqWhlYXRtYXBnbJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZaloZWF0bWFwZ2yqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMaNiYXKRhKR0eXBlo2JhcqdlcnJvcl95gaVjb2xvcqcjMmEzZjVmp2Vycm9yX3iBpWNvbG9ypyMyYTNmNWambWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACnaGVhdG1hcJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadoZWF0bWFwqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtY29udG91cmNhcnBldJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZa1jb250b3VyY2FycGV0pXRhYmxlkYOkdHlwZaV0YWJsZaZoZWFkZXKCpGxpbmWBpWNvbG9ypXdoaXRlpGZpbGyBpWNvbG9ypyNDOEQ0RTOlY2VsbHOCpGxpbmWBpWNvbG9ypXdoaXRlpGZpbGyBpWNvbG9ypyNFQkYwRjipc2NhdHRlcjNkkYOkbGluZYGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqXNjYXR0ZXIzZKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACoYmFycG9sYXKRgqR0eXBlqGJhcnBvbGFypm1hcmtlcoGkbGluZYKlY29sb3KnI0U1RUNGNqV3aWR0aMo/AAAAqXNjYXR0ZXJnbJGCpHR5cGWpc2NhdHRlcmdspm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKtoaXN0b2dyYW0yZJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZatoaXN0b2dyYW0yZKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrnNjYXR0ZXJ0ZXJuYXJ5kYKkdHlwZa5zY2F0dGVydGVybmFyeaZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmbWFyZ2luhKFsykJIAAChYspCSAAAoXLKQkgAAKF0ykJwAACmY29uZmlnhahzaG93TGlua8KoZWRpdGFibGXCqnJlc3BvbnNpdmXDqnN0YXRpY1Bsb3TCqnNjcm9sbFpvb23DpmZyYW1lc5CkZGF0YZGDoXnIAZAX+yOlOp83pToDeKU6u/GlOsWapjo4fqc67pKoOsTnqTq3cKs6xD6tOjZKrzoXoLE66Dy0OqoutzpXdLo6eB2+OqoswjrFs8Y6I7nLOhhS0Tp3jdc66ITeOpVQ5jogF+863/74OogfAjtujgg7Y/cPO2yWGDshuCI7Mc0uO+9tPTuYhU87iHJmO9M8gjtwwpY7oYS0O1WK4zvbVhw8gP1+PGJMJz0LIDI/W+IvP+LvMT/UVTA/094xP+K3MD9s+zE/kAExP28UMj9tIDE/Tw8yP7YLMT/K6zE/tcwwP7vDMT+9djA/yMYxP2ITMD+e3TE/4MIoPQdAgTyw3x48/n7nO3W8tzs7c5k76YeEO8FnajtK+VI7G3hAO7x+MTuZHiU7d70aO+/mETswTgo7OrUDOw3f+zqntPE6RbPoOg2x4DrVidk6WyLTOulhzTrGNsg6UI/DOo5fvzqGmLs6Rje4OosstTrydrI6wwmwOlHprTreBaw6AmeqOkYAqTpj2Kc6QeGmOjwmpjonmqU6J0ilOqR0eXBlp3NjYXR0ZXKheMgBkBcAAIA/AAAAQAAAQEAAAIBAAACgQAAAwEAAAOBAAAAAQQAAEEEAACBBAAAwQQAAQEEAAFBBAABgQQAAcEEAAIBBAACIQQAAkEEAAJhBAACgQQAAqEEAALBBAAC4QQAAwEEAAMhBAADQQQAA2EEAAOBBAADoQQAA8EEAAPhBAAAAQgAABEIAAAhCAAAMQgAAEEIAABRCAAAYQgAAHEIAACBCAAAkQgAAKEIAACxCAAAwQgAANEIAADhCAAA8QgAAQEIAAERCAABIQgAATEIAAFBCAABUQgAAWEIAAFxCAABgQgAAZEIAAGhCAABsQgAAcEIAAHRCAAB4QgAAfEIAAIBCAACCQgAAhEIAAIZCAACIQgAAikIAAIxCAACOQgAAkEIAAJJCAACUQgAAlkIAAJhCAACaQgAAnEIAAJ5CAACgQgAAokIAAKRCAACmQgAAqEIAAKpCAACsQgAArkIAALBCAACyQgAAtEIAALZCAAC4QgAAukIAALxCAAC+QgAAwEIAAMJCAADEQgAAxkIAAMhC2TViM2I4NDA4Yy04MTgxLTExZWYtMTRlYi1lMWM1NjliOGJiMjkvMTRlYzQ5ODI2YWJmYjAwZYSmbGF5b3V0jKV4YXhpc4ercmFuZ2VzbGlkZXKBp3Zpc2libGXCqWdyaWRjb2xvcqV3aGl0Za1yYW5nZXNlbGVjdG9ygadidXR0b25zkoSkc3RlcMpBIAAAqHN0ZXBtb2RlqGJhY2t3YXJkpWxhYmVsojFtpWNvdW50yj+AAACBpHN0ZXCjYWxspXRpdGxlgaR0ZXh0oKVyYW5nZZCtemVyb2xpbmVjb2xvcqV3aGl0Zap0aWNrc3VmZml4oyBtc6dtb2RlYmFyiKVjb2xvcqRncmF5q2FjdGl2ZWNvbG9ysHJnYigyMjksMjM2LDI0NimneWFuY2hvcqZib3R0b22neGFuY2hvcqVyaWdodKF5yj+AAACnYmdjb2xvcq1yZ2JhKDAsMCwwLDApq29yaWVudGF0aW9uoWiheMoAAAAAqWhvdmVybW9kZadjbG9zZXN0rXBhcGVyX2JnY29sb3KtcmdiYSgwLDAsMCwwKah0ZW1wbGF0ZYKmbGF5b3V03gATqWNvbG9yYXhpc4GoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKV4YXhpc4epZ3JpZGNvbG9ypXdoaXRlrXplcm9saW5ld2lkdGjKQAAAAKV0aXRsZYGoc3RhbmRvZmbKQXAAAKV0aWNrc6CtemVyb2xpbmVjb2xvcqV3aGl0ZaphdXRvbWFyZ2luw6lsaW5lY29sb3Kld2hpdGWpaG92ZXJtb2Rlp2Nsb3Nlc3StcGFwZXJfYmdjb2xvcqV3aGl0ZaNnZW+GqXNob3dsYWtlc8Ooc2hvd2xhbmTDqWxhbmRjb2xvcqcjRTVFQ0Y2p2JnY29sb3Kld2hpdGWsc3VidW5pdGNvbG9ypXdoaXRlqWxha2Vjb2xvcqV3aGl0Zapjb2xvcnNjYWxlg6pzZXF1ZW50aWFsmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxqWRpdmVyZ2luZ5uSygAAAACnIzhlMDE1MpLKPczMzacjYzUxYjdkkso+TMzNpyNkZTc3YWWSyj6ZmZqnI2YxYjZkYZLKPszMzacjZmRlMGVmkso/AAAApyNmN2Y3ZjeSyj8ZmZqnI2U2ZjVkMJLKPzMzM6cjYjhlMTg2kso/TMzNpyM3ZmJjNDGSyj9mZmanIzRkOTIyMZLKP4AAAKcjMjc2NDE5r3NlcXVlbnRpYWxtaW51c5qSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMaV5YXhpc4epZ3JpZGNvbG9ypXdoaXRlrXplcm9saW5ld2lkdGjKQAAAAKV0aXRsZYGoc3RhbmRvZmbKQXAAAKV0aWNrc6CtemVyb2xpbmVjb2xvcqV3aGl0ZaphdXRvbWFyZ2luw6lsaW5lY29sb3Kld2hpdGWtc2hhcGVkZWZhdWx0c4GkbGluZYGlY29sb3KnIzJhM2Y1Zqpob3ZlcmxhYmVsgaVhbGlnbqRsZWZ0pm1hcGJveIGlc3R5bGWlbGlnaHSlcG9sYXKDq2FuZ3VsYXJheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZadiZ2NvbG9ypyNFNUVDRjaqcmFkaWFsYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWvYXV0b3R5cGVudW1iZXJzpnN0cmljdKRmb250gaVjb2xvcqcjMmEzZjVmp3Rlcm5hcnmEpWFheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZadiZ2NvbG9ypyNFNUVDRjalY2F4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlpWJheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZbJhbm5vdGF0aW9uZGVmYXVsdHODqWFycm93aGVhZMoAAAAAqmFycm93d2lkdGjKP4AAAKphcnJvd2NvbG9ypyMyYTNmNWascGxvdF9iZ2NvbG9ypyNFNUVDRjaldGl0bGWBoXjKPUzMzaVzY2VuZYOleGF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXpheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0ZaV5YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWoY29sb3J3YXmapyM2MzZlZmGnI0VGNTUzQqcjMDBjYzk2pyNhYjYzZmGnI0ZGQTE1QacjMTlkM2YzpyNGRjY2OTKnI0I2RTg4MKcjRkY5N0ZGpyNGRUNCNTKkZGF0Yd4AGa5zY2F0dGVycG9sYXJnbJGCpHR5cGWuc2NhdHRlcnBvbGFyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApmNhcnBldJGDpWJheGlzhalncmlkY29sb3Kld2hpdGWsZW5kbGluZWNvbG9ypyMyYTNmNWaubWlub3JncmlkY29sb3Kld2hpdGWuc3RhcnRsaW5lY29sb3KnIzJhM2Y1ZqlsaW5lY29sb3Kld2hpdGWkdHlwZaZjYXJwZXSlYWF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaxzY2F0dGVycG9sYXKRgqR0eXBlrHNjYXR0ZXJwb2xhcqZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACpcGFyY29vcmRzkYKkbGluZYGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqXBhcmNvb3Jkc6dzY2F0dGVykYKkdHlwZadzY2F0dGVypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAALJoaXN0b2dyYW0yZGNvbnRvdXKRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWyaGlzdG9ncmFtMmRjb250b3VyqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGnY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadjb250b3VyqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtc2NhdHRlcmNhcnBldJGCpHR5cGWtc2NhdHRlcmNhcnBldKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmbWVzaDNkkYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlpm1lc2gzZKdzdXJmYWNlkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp3N1cmZhY2WqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVybWFwYm94kYKkdHlwZa1zY2F0dGVybWFwYm94pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKpzY2F0dGVyZ2VvkYKkdHlwZapzY2F0dGVyZ2Vvpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKloaXN0b2dyYW2RgqR0eXBlqWhpc3RvZ3JhbaZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACjcGllkYKkdHlwZaNwaWWqYXV0b21hcmdpbsOqY2hvcm9wbGV0aJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZapjaG9yb3BsZXRoqWhlYXRtYXBnbJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZaloZWF0bWFwZ2yqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMaNiYXKRhKR0eXBlo2JhcqdlcnJvcl95gaVjb2xvcqcjMmEzZjVmp2Vycm9yX3iBpWNvbG9ypyMyYTNmNWambWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACnaGVhdG1hcJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadoZWF0bWFwqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtY29udG91cmNhcnBldJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZa1jb250b3VyY2FycGV0pXRhYmxlkYOkdHlwZaV0YWJsZaZoZWFkZXKCpGxpbmWBpWNvbG9ypXdoaXRlpGZpbGyBpWNvbG9ypyNDOEQ0RTOlY2VsbHOCpGxpbmWBpWNvbG9ypXdoaXRlpGZpbGyBpWNvbG9ypyNFQkYwRjipc2NhdHRlcjNkkYOkbGluZYGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqXNjYXR0ZXIzZKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACoYmFycG9sYXKRgqR0eXBlqGJhcnBvbGFypm1hcmtlcoGkbGluZYKlY29sb3KnI0U1RUNGNqV3aWR0aMo/AAAAqXNjYXR0ZXJnbJGCpHR5cGWpc2NhdHRlcmdspm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKtoaXN0b2dyYW0yZJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZatoaXN0b2dyYW0yZKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrnNjYXR0ZXJ0ZXJuYXJ5kYKkdHlwZa5zY2F0dGVydGVybmFyeaZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmbGVnZW5khad5YW5jaG9ypmJvdHRvbad4YW5jaG9ypGxlZnSheco/gAAAq29yaWVudGF0aW9uoWiheMoAAAAApXlheGlzg6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmVjb2xvcqV3aGl0ZapmaXhlZHJhbmdlwqZzaGFwZXOQpGZvbnSBpWNvbG9ypGdyYXmrYW5ub3RhdGlvbnOQrHBsb3RfYmdjb2xvcrByZ2IoMjI5LDIzNiwyNDYppm1hcmdpboShbMoAAAAAoWLKAAAAAKFyygAAAAChdMoAAAAApmNvbmZpZ4i2bW9kZUJhckJ1dHRvbnNUb1JlbW92ZZikem9vbalhdXRvU2NhbGWscmVzZXRTY2FsZTJko3Bhbq10YWJsZVJvdGF0aW9us3Jlc2V0Q2FtZXJhTGFzdFNhdmWm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3EExEt5B7q/fQapN4UFn6+JBJInkQeEm5kGdxOdBWmLpQRcA60HUnexBkDvuQU3Z70EKd/FBxxTzQYSy9EHZNWIzYjg0MDhjLTgxODEtMTFlZi0xNGViLWUxYzU2OWI4YmIyOS81Yjk4MmFjNGFmOTIxZGU1hKZsYXlvdXSIqnNob3dsZWdlbmTCpnhheGlzMYKmZG9tYWlu1xcAAAAAZmbmPqZhbmNob3KieTGmeWF4aXMxg6VyYW5nZdcXAAAAAM3MTD+mZG9tYWlu1xcAAAAAAACAP6ZhbmNob3KieDGodGVtcGxhdGWCpmxheW91dN4AE6ljb2xvcmF4aXOBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACleGF4aXOHqWdyaWRjb2xvcqV3aGl0Za16ZXJvbGluZXdpZHRoykAAAACldGl0bGWBqHN0YW5kb2ZmykFwAACldGlja3OgrXplcm9saW5lY29sb3Kld2hpdGWqYXV0b21hcmdpbsOpbGluZWNvbG9ypXdoaXRlqWhvdmVybW9kZadjbG9zZXN0rXBhcGVyX2JnY29sb3Kld2hpdGWjZ2VvhqlzaG93bGFrZXPDqHNob3dsYW5kw6lsYW5kY29sb3KnI0U1RUNGNqdiZ2NvbG9ypXdoaXRlrHN1YnVuaXRjb2xvcqV3aGl0ZalsYWtlY29sb3Kld2hpdGWqY29sb3JzY2FsZYOqc2VxdWVudGlhbJqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMalkaXZlcmdpbmebksoAAAAApyM4ZTAxNTKSyj3MzM2nI2M1MWI3ZJLKPkzMzacjZGU3N2Flkso+mZmapyNmMWI2ZGGSyj7MzM2nI2ZkZTBlZpLKPwAAAKcjZjdmN2Y3kso/GZmapyNlNmY1ZDCSyj8zMzOnI2I4ZTE4NpLKP0zMzacjN2ZiYzQxkso/ZmZmpyM0ZDkyMjGSyj+AAACnIzI3NjQxOa9zZXF1ZW50aWFsbWludXOaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGleWF4aXOHqWdyaWRjb2xvcqV3aGl0Za16ZXJvbGluZXdpZHRoykAAAACldGl0bGWBqHN0YW5kb2ZmykFwAACldGlja3OgrXplcm9saW5lY29sb3Kld2hpdGWqYXV0b21hcmdpbsOpbGluZWNvbG9ypXdoaXRlrXNoYXBlZGVmYXVsdHOBpGxpbmWBpWNvbG9ypyMyYTNmNWaqaG92ZXJsYWJlbIGlYWxpZ26kbGVmdKZtYXBib3iBpXN0eWxlpWxpZ2h0pXBvbGFyg6thbmd1bGFyYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWnYmdjb2xvcqcjRTVFQ0Y2qnJhZGlhbGF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlr2F1dG90eXBlbnVtYmVyc6ZzdHJpY3SkZm9udIGlY29sb3KnIzJhM2Y1Zqd0ZXJuYXJ5hKVhYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWnYmdjb2xvcqcjRTVFQ0Y2pWNheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZaViYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWyYW5ub3RhdGlvbmRlZmF1bHRzg6lhcnJvd2hlYWTKAAAAAKphcnJvd3dpZHRoyj+AAACqYXJyb3djb2xvcqcjMmEzZjVmrHBsb3RfYmdjb2xvcqcjRTVFQ0Y2pXRpdGxlgaF4yj1MzM2lc2NlbmWDpXhheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0ZaV6YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWleWF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlqGNvbG9yd2F5mqcjNjM2ZWZhpyNFRjU1M0KnIzAwY2M5NqcjYWI2M2ZhpyNGRkExNUGnIzE5ZDNmM6cjRkY2NjkypyNCNkU4ODCnI0ZGOTdGRqcjRkVDQjUypGRhdGHeABmuc2NhdHRlcnBvbGFyZ2yRgqR0eXBlrnNjYXR0ZXJwb2xhcmdspm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZjYXJwZXSRg6ViYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlpHR5cGWmY2FycGV0pWFheGlzhalncmlkY29sb3Kld2hpdGWsZW5kbGluZWNvbG9ypyMyYTNmNWaubWlub3JncmlkY29sb3Kld2hpdGWuc3RhcnRsaW5lY29sb3KnIzJhM2Y1ZqlsaW5lY29sb3Kld2hpdGWsc2NhdHRlcnBvbGFykYKkdHlwZaxzY2F0dGVycG9sYXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqXBhcmNvb3Jkc5GCpGxpbmWBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZalwYXJjb29yZHOnc2NhdHRlcpGCpHR5cGWnc2NhdHRlcqZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACyaGlzdG9ncmFtMmRjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlsmhpc3RvZ3JhbTJkY29udG91cqpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxp2NvbnRvdXKRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnY29udG91cqpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJjYXJwZXSRgqR0eXBlrXNjYXR0ZXJjYXJwZXSmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApm1lc2gzZJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZaZtZXNoM2Snc3VyZmFjZZGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadzdXJmYWNlqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtc2NhdHRlcm1hcGJveJGCpHR5cGWtc2NhdHRlcm1hcGJveKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACqc2NhdHRlcmdlb5GCpHR5cGWqc2NhdHRlcmdlb6ZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACpaGlzdG9ncmFtkYKkdHlwZaloaXN0b2dyYW2mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAo3BpZZGCpHR5cGWjcGllqmF1dG9tYXJnaW7DqmNob3JvcGxldGiRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWqY2hvcm9wbGV0aKloZWF0bWFwZ2yRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpaGVhdG1hcGdsqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGjYmFykYSkdHlwZaNiYXKnZXJyb3JfeYGlY29sb3KnIzJhM2Y1ZqdlcnJvcl94gaVjb2xvcqcjMmEzZjVmpm1hcmtlcoGkbGluZYKlY29sb3KnI0U1RUNGNqV3aWR0aMo/AAAAp2hlYXRtYXCRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnaGVhdG1hcKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrWNvbnRvdXJjYXJwZXSRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWtY29udG91cmNhcnBldKV0YWJsZZGDpHR5cGWldGFibGWmaGVhZGVygqRsaW5lgaVjb2xvcqV3aGl0ZaRmaWxsgaVjb2xvcqcjQzhENEUzpWNlbGxzgqRsaW5lgaVjb2xvcqV3aGl0ZaRmaWxsgaVjb2xvcqcjRUJGMEY4qXNjYXR0ZXIzZJGDpGxpbmWBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZalzY2F0dGVyM2SmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqGJhcnBvbGFykYKkdHlwZahiYXJwb2xhcqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKlzY2F0dGVyZ2yRgqR0eXBlqXNjYXR0ZXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACraGlzdG9ncmFtMmSRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWraGlzdG9ncmFtMmSqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa5zY2F0dGVydGVybmFyeZGCpHR5cGWuc2NhdHRlcnRlcm5hcnmmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApnhheGlzMoKmZG9tYWlu1xfNzAw/AACAP6ZhbmNob3KieTKmbWFyZ2luhKFsykJIAAChYspCSAAAoXLKQkgAAKF0ykJwAACmeWF4aXMyg6VyYW5nZdcXAAAAAM3MTD+mZG9tYWlu1xcAAAAAAACAP6ZhbmNob3KieDKrYW5ub3RhdGlvbnOSiad5YW5jaG9ypmJvdHRvbad4YW5jaG9ypmNlbnRlcqF5yj+AAACkZm9udIGkc2l6ZcpBgAAAqXNob3dhcnJvd8KkeXJlZqVwYXBlcqR0ZXh0pkdSRS1UMqR4cmVmpXBhcGVyoXjKPmZmZomneWFuY2hvcqZib3R0b22neGFuY2hvcqZjZW50ZXKheco/gAAApGZvbnSBpHNpemXKQYAAAKlzaG93YXJyb3fCpHlyZWalcGFwZXKkdGV4dKdHUkUtVDIqpHhyZWalcGFwZXKheMo/RmZmpmNvbmZpZ4Woc2hvd0xpbmvCqGVkaXRhYmxlwqpyZXNwb25zaXZlw6pzdGF0aWNQbG90wqpzY3JvbGxab29tw6ZmcmFtZXOQpGRhdGGShaV4YXhpc6J4MaF5yAGQF4WHuTq7o7k6B/q5Oo2JujqPUrs60lm8OkmdvTqiIb86q+jAOpX2wjo6T8U6z/fHOjnzyjogS846oAXSOjcs1jp8y9o6AOzfOmyf5TpU9Os6WQPzOo7m+jqs2wE7ZNEGO6VoDDvRwRI71QEaO2BaIjvJCyw742s3O+/1RDsRUlU7yHxpO1Z6gTs/E5I735uoO2r8yDusbfs7glAqPG92hjwHYB099z42P8lcMT9NDzQ/ChAyP+qvMz9DRjI/G40zP9xbMj8WgDM/3GEyPxaAMz/cWzI/G40zP0NGMj/qrzM/CRAyP00PND/JXDE/+T42PwhgHT1ydoY8g1AqPHBt+zuH/Mg7opuoO0MTkjteeoE7+HxpO+NRVTsL9kQ7CGw3O4ELLDskWiI7tgEaO9XBEjsAaQw7ldEGO3PbATsW5vo6JQPzOm316zqynuU6zOvfOgXL2jpsLNY60gXSOpdLzjq788o6zfbHOjtPxTqO98I6pujAOrohvzrSnL0691i8OhJTuzq6iLo6DPq5Op+juTqkdHlwZadzY2F0dGVypXlheGlzonkxoXjIAZAXAACAPwAAAEAAAEBAAACAQAAAoEAAAMBAAADgQAAAAEEAABBBAAAgQQAAMEEAAEBBAABQQQAAYEEAAHBBAACAQQAAiEEAAJBBAACYQQAAoEEAAKhBAACwQQAAuEEAAMBBAADIQQAA0EEAANhBAADgQQAA6EEAAPBBAAD4QQAAAEIAAARCAAAIQgAADEIAABBCAAAUQgAAGEIAABxCAAAgQgAAJEIAAChCAAAsQgAAMEIAADRCAAA4QgAAPEIAAEBCAABEQgAASEIAAExCAABQQgAAVEIAAFhCAABcQgAAYEIAAGRCAABoQgAAbEIAAHBCAAB0QgAAeEIAAHxCAACAQgAAgkIAAIRCAACGQgAAiEIAAIpCAACMQgAAjkIAAJBCAACSQgAAlEIAAJZCAACYQgAAmkIAAJxCAACeQgAAoEIAAKJCAACkQgAApkIAAKhCAACqQgAArEIAAK5CAACwQgAAskIAALRCAAC2QgAAuEIAALpCAAC8QgAAvkIAAMBCAADCQgAAxEIAAMZCAADIQoWleGF4aXOieDKhecgBkBdckS472KsuOwv7LjtAfy87xzowO6ctMTs4WTI7bcAzO6tkNTsUSzc7H3U5OxXoOzt/qT47h71BO2ktRTs7/0g7+j1NO2zzUTsdLlc7LPxcO4VyYzt2pWo7jrJyO4O4ezvM8oI7erSIO+VEjzuUzJY7DIefO4W8qTs/2LU7x2vEO81Q1jslz+w7yv0EPJSwGDww0zQ8bmRgPKZ+ljxg9Oo89feJPd/tBD8ifgA/ZHoCP3r1AD+gKQI/2hsBP8ANAj9ZKwE/gwMCP7EvAT+DAwI/WSsBP78NAj/YGwE/nykCP3n1AD9kegI/In4AP+DtBD/x94k9ePTqPKF+ljymZGA8DdM0PK2wGDy3/QQ8Vc/sO2xQ1jv3a8Q7+de1O4u8qTv0hp872cyWO61EjzuttIg7hPKCO9a4eztasnI7hKVqO4xyYzvN+1w7dy5XO2/zUTu/PU07gP9IOzctRTuyvUE7Zak+O1vnOzsndTk7z0o3O91kNTv+vzM7O1kyO3otMTt9OjA7fH8vO/H6Ljs8rC47pHR5cGWnc2NhdHRlcqV5YXhpc6J5MqF4yAGQFwAAgD8AAABAAABAQAAAgEAAAKBAAADAQAAA4EAAAABBAAAQQQAAIEEAADBBAABAQQAAUEEAAGBBAABwQQAAgEEAAIhBAACQQQAAmEEAAKBBAACoQQAAsEEAALhBAADAQQAAyEEAANBBAADYQQAA4EEAAOhBAADwQQAA+EEAAABCAAAEQgAACEIAAAxCAAAQQgAAFEIAABhCAAAcQgAAIEIAACRCAAAoQgAALEIAADBCAAA0QgAAOEIAADxCAABAQgAAREIAAEhCAABMQgAAUEIAAFRCAABYQgAAXEIAAGBCAABkQgAAaEIAAGxCAABwQgAAdEIAAHhCAAB8QgAAgEIAAIJCAACEQgAAhkIAAIhCAACKQgAAjEIAAI5CAACQQgAAkkIAAJRCAACWQgAAmEIAAJpCAACcQgAAnkIAAKBCAACiQgAApEIAAKZCAACoQgAAqkIAAKxCAACuQgAAsEIAALJCAAC0QgAAtkIAALhCAAC6QgAAvEIAAL5CAADAQgAAwkIAAMRCAADGQgAAyELZNWIzYjg0MDhjLTgxODEtMTFlZi0xNGViLWUxYzU2OWI4YmIyOS82ZDU5MjMyMThiMzQ3YWIwhKZsYXlvdXSMpXhheGlzh6tyYW5nZXNsaWRlcoGndmlzaWJsZcKpZ3JpZGNvbG9ypXdoaXRlrXJhbmdlc2VsZWN0b3KBp2J1dHRvbnOShKRzdGVwykEgAACoc3RlcG1vZGWoYmFja3dhcmSlbGFiZWyiMW2lY291bnTKP4AAAIGkc3RlcKNhbGyldGl0bGWBpHRleHSgpXJhbmdlkK16ZXJvbGluZWNvbG9ypXdoaXRlqnRpY2tzdWZmaXijIG1zp21vZGViYXKIpWNvbG9ypGdyYXmrYWN0aXZlY29sb3KwcmdiKDIyOSwyMzYsMjQ2Kad5YW5jaG9ypmJvdHRvbad4YW5jaG9ypXJpZ2h0oXnKP4AAAKdiZ2NvbG9yrXJnYmEoMCwwLDAsMCmrb3JpZW50YXRpb26haKF4ygAAAACpaG92ZXJtb2Rlp2Nsb3Nlc3StcGFwZXJfYmdjb2xvcq1yZ2JhKDAsMCwwLDApqHRlbXBsYXRlgqZsYXlvdXTeABOpY29sb3JheGlzgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApXhheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Zalob3Zlcm1vZGWnY2xvc2VzdK1wYXBlcl9iZ2NvbG9ypXdoaXRlo2dlb4apc2hvd2xha2Vzw6hzaG93bGFuZMOpbGFuZGNvbG9ypyNFNUVDRjanYmdjb2xvcqV3aGl0ZaxzdWJ1bml0Y29sb3Kld2hpdGWpbGFrZWNvbG9ypXdoaXRlqmNvbG9yc2NhbGWDqnNlcXVlbnRpYWyaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGpZGl2ZXJnaW5nm5LKAAAAAKcjOGUwMTUykso9zMzNpyNjNTFiN2SSyj5MzM2nI2RlNzdhZZLKPpmZmqcjZjFiNmRhkso+zMzNpyNmZGUwZWaSyj8AAACnI2Y3ZjdmN5LKPxmZmqcjZTZmNWQwkso/MzMzpyNiOGUxODaSyj9MzM2nIzdmYmM0MZLKP2ZmZqcjNGQ5MjIxkso/gAAApyMyNzY0MTmvc2VxdWVudGlhbG1pbnVzmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxpXlheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Za1zaGFwZWRlZmF1bHRzgaRsaW5lgaVjb2xvcqcjMmEzZjVmqmhvdmVybGFiZWyBpWFsaWdupGxlZnSmbWFwYm94gaVzdHlsZaVsaWdodKVwb2xhcoOrYW5ndWxhcmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqpyYWRpYWxheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0Za9hdXRvdHlwZW51bWJlcnOmc3RyaWN0pGZvbnSBpWNvbG9ypyMyYTNmNWandGVybmFyeYSlYWF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqVjYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWlYmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlsmFubm90YXRpb25kZWZhdWx0c4OpYXJyb3doZWFkygAAAACqYXJyb3d3aWR0aMo/gAAAqmFycm93Y29sb3KnIzJhM2Y1ZqxwbG90X2JnY29sb3KnI0U1RUNGNqV0aXRsZYGheMo9TMzNpXNjZW5lg6V4YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWlemF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXlheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0Zahjb2xvcndheZqnIzYzNmVmYacjRUY1NTNCpyMwMGNjOTanI2FiNjNmYacjRkZBMTVBpyMxOWQzZjOnI0ZGNjY5MqcjQjZFODgwpyNGRjk3RkanI0ZFQ0I1MqRkYXRh3gAZrnNjYXR0ZXJwb2xhcmdskYKkdHlwZa5zY2F0dGVycG9sYXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmY2FycGV0kYOlYmF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaR0eXBlpmNhcnBldKVhYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlrHNjYXR0ZXJwb2xhcpGCpHR5cGWsc2NhdHRlcnBvbGFypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKlwYXJjb29yZHORgqRsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpcGFyY29vcmRzp3NjYXR0ZXKRgqR0eXBlp3NjYXR0ZXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAsmhpc3RvZ3JhbTJkY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZbJoaXN0b2dyYW0yZGNvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMadjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2NvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVyY2FycGV0kYKkdHlwZa1zY2F0dGVyY2FycGV0pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZtZXNoM2SRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWmbWVzaDNkp3N1cmZhY2WRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnc3VyZmFjZapjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJtYXBib3iRgqR0eXBlrXNjYXR0ZXJtYXBib3imbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqnNjYXR0ZXJnZW+RgqR0eXBlqnNjYXR0ZXJnZW+mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqWhpc3RvZ3JhbZGCpHR5cGWpaGlzdG9ncmFtpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKNwaWWRgqR0eXBlo3BpZaphdXRvbWFyZ2luw6pjaG9yb3BsZXRokYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqmNob3JvcGxldGipaGVhdG1hcGdskYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqWhlYXRtYXBnbKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxo2JhcpGEpHR5cGWjYmFyp2Vycm9yX3mBpWNvbG9ypyMyYTNmNWanZXJyb3JfeIGlY29sb3KnIzJhM2Y1ZqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKdoZWF0bWFwkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2hlYXRtYXCqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1jb250b3VyY2FycGV0kYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlrWNvbnRvdXJjYXJwZXSldGFibGWRg6R0eXBlpXRhYmxlpmhlYWRlcoKkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0M4RDRFM6VjZWxsc4KkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0VCRjBGOKlzY2F0dGVyM2SRg6RsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpc2NhdHRlcjNkpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKhiYXJwb2xhcpGCpHR5cGWoYmFycG9sYXKmbWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACpc2NhdHRlcmdskYKkdHlwZalzY2F0dGVyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAq2hpc3RvZ3JhbTJkkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlq2hpc3RvZ3JhbTJkqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGuc2NhdHRlcnRlcm5hcnmRgqR0eXBlrnNjYXR0ZXJ0ZXJuYXJ5pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZsZWdlbmSFp3lhbmNob3KmYm90dG9tp3hhbmNob3KkbGVmdKF5yj+AAACrb3JpZW50YXRpb26haKF4ygAAAACleWF4aXODqWdyaWRjb2xvcqV3aGl0Za16ZXJvbGluZWNvbG9ypXdoaXRlqmZpeGVkcmFuZ2XCpnNoYXBlc5CkZm9udIGlY29sb3KkZ3Jheathbm5vdGF0aW9uc5CscGxvdF9iZ2NvbG9ysHJnYigyMjksMjM2LDI0NimmbWFyZ2luhKFsygAAAAChYsoAAAAAoXLKAAAAAKF0ygAAAACmY29uZmlniLZtb2RlQmFyQnV0dG9uc1RvUmVtb3ZlmKR6b29tqWF1dG9TY2FsZaxyZXNldFNjYWxlMmSjcGFurXRhYmxlUm90YXRpb26zcmVzZXRDYW1l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2c4VQvjTF0IX2RlCNd4bQlTjHUJz6B9Cke0hQrDyI0LP9yVC7vwnQgwCKkIrByxCSgwuQmgRMEKHFjJCphs0QsUgNkLjJThCAis6QiEwPEI/NT5CXjpAQn0/QkKcRERCuklGQtlOSEL4U0pC+FNKQtk1YjNiODQwOGMtODE4MS0xMWVmLTE0ZWItZTFjNTY5YjhiYjI5L2ZiNDBjYzRhNDBmY2U2M2GEpmxheW91dIyleGF4aXOHq3Jhbmdlc2xpZGVygad2aXNpYmxlwqlncmlkY29sb3Kld2hpdGWtcmFuZ2VzZWxlY3RvcoGnYnV0dG9uc5KEpHN0ZXDKQSAAAKhzdGVwbW9kZahiYWNrd2FyZKVsYWJlbKIxbaVjb3VudMo/gAAAgaRzdGVwo2FsbKV0aXRsZYGkdGV4dKClcmFuZ2WQrXplcm9saW5lY29sb3Kld2hpdGWqdGlja3N1ZmZpeKMgbXOnbW9kZWJhcoilY29sb3KkZ3JheathY3RpdmVjb2xvcrByZ2IoMjI5LDIzNiwyNDYpp3lhbmNob3KmYm90dG9tp3hhbmNob3KlcmlnaHSheco/gAAAp2JnY29sb3KtcmdiYSgwLDAsMCwwKatvcmllbnRhdGlvbqFooXjKAAAAAKlob3Zlcm1vZGWnY2xvc2VzdK1wYXBlcl9iZ2NvbG9yrXJnYmEoMCwwLDAsMCmodGVtcGxhdGWCpmxheW91dN4AE6ljb2xvcmF4aXOBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACleGF4aXOHqWdyaWRjb2xvcqV3aGl0Za16ZXJvbGluZXdpZHRoykAAAACldGl0bGWBqHN0YW5kb2ZmykFwAACldGlja3OgrXplcm9saW5lY29sb3Kld2hpdGWqYXV0b21hcmdpbsOpbGluZWNvbG9ypXdoaXRlqWhvdmVybW9kZadjbG9zZXN0rXBhcGVyX2JnY29sb3Kld2hpdGWjZ2VvhqlzaG93bGFrZXPDqHNob3dsYW5kw6lsYW5kY29sb3KnI0U1RUNGNqdiZ2NvbG9ypXdoaXRlrHN1YnVuaXRjb2xvcqV3aGl0ZalsYWtlY29sb3Kld2hpdGWqY29sb3JzY2FsZYOqc2VxdWVudGlhbJqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMalkaXZlcmdpbmebksoAAAAApyM4ZTAxNTKSyj3MzM2nI2M1MWI3ZJLKPkzMzacjZGU3N2Flkso+mZmapyNmMWI2ZGGSyj7MzM2nI2ZkZTBlZpLKPwAAAKcjZjdmN2Y3kso/GZmapyNlNmY1ZDCSyj8zMzOnI2I4ZTE4NpLKP0zMzacjN2ZiYzQxkso/ZmZmpyM0ZDkyMjGSyj+AAACnIzI3NjQxOa9zZXF1ZW50aWFsbWludXOaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGleWF4aXOHqWdyaWRjb2xvcqV3aGl0Za16ZXJvbGluZXdpZHRoykAAAACldGl0bGWBqHN0YW5kb2ZmykFwAACldGlja3OgrXplcm9saW5lY29sb3Kld2hpdGWqYXV0b21hcmdpbsOpbGluZWNvbG9ypXdoaXRlrXNoYXBlZGVmYXVsdHOBpGxpbmWBpWNvbG9ypyMyYTNmNWaqaG92ZXJsYWJlbIGlYWxpZ26kbGVmdKZtYXBib3iBpXN0eWxlpWxpZ2h0pXBvbGFyg6thbmd1bGFyYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWnYmdjb2xvcqcjRTVFQ0Y2qnJhZGlhbGF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlr2F1dG90eXBlbnVtYmVyc6ZzdHJpY3SkZm9udIGlY29sb3KnIzJhM2Y1Zqd0ZXJuYXJ5hKVhYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWnYmdjb2xvcqcjRTVFQ0Y2pWNheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZaViYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWyYW5ub3RhdGlvbmRlZmF1bHRzg6lhcnJvd2hlYWTKAAAAAKphcnJvd3dpZHRoyj+AAACqYXJyb3djb2xvcqcjMmEzZjVmrHBsb3RfYmdjb2xvcqcjRTVFQ0Y2pXRpdGxlgaF4yj1MzM2lc2NlbmWDpXhheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0ZaV6YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWleWF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlqGNvbG9yd2F5mqcjNjM2ZWZhpyNFRjU1M0KnIzAwY2M5NqcjYWI2M2ZhpyNGRkExNUGnIzE5ZDNmM6cjRkY2NjkypyNCNkU4ODCnI0ZGOTdGRqcjRkVDQjUypGRhdGHeABmuc2NhdHRlcnBvbGFyZ2yRgqR0eXBlrnNjYXR0ZXJwb2xhcmdspm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZjYXJwZXSRg6ViYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlpHR5cGWmY2FycGV0pWFheGlzhalncmlkY29sb3Kld2hpdGWsZW5kbGluZWNvbG9ypyMyYTNmNWaubWlub3JncmlkY29sb3Kld2hpdGWuc3RhcnRsaW5lY29sb3KnIzJhM2Y1ZqlsaW5lY29sb3Kld2hpdGWsc2NhdHRlcnBvbGFykYKkdHlwZaxzY2F0dGVycG9sYXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqXBhcmNvb3Jkc5GCpGxpbmWBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZalwYXJjb29yZHOnc2NhdHRlcpGCpHR5cGWnc2NhdHRlcqZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACyaGlzdG9ncmFtMmRjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlsmhpc3RvZ3JhbTJkY29udG91cqpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxp2NvbnRvdXKRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnY29udG91cqpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJjYXJwZXSRgqR0eXBlrXNjYXR0ZXJjYXJwZXSmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApm1lc2gzZJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZaZtZXNoM2Snc3VyZmFjZZGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadzdXJmYWNlqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtc2NhdHRlcm1hcGJveJGCpHR5cGWtc2NhdHRlcm1hcGJveKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACqc2NhdHRlcmdlb5GCpHR5cGWqc2NhdHRlcmdlb6ZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACpaGlzdG9ncmFtkYKkdHlwZaloaXN0b2dyYW2mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAo3BpZZGCpHR5cGWjcGllqmF1dG9tYXJnaW7DqmNob3JvcGxldGiRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWqY2hvcm9wbGV0aKloZWF0bWFwZ2yRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpaGVhdG1hcGdsqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGjYmFykYSkdHlwZaNiYXKnZXJyb3JfeYGlY29sb3KnIzJhM2Y1ZqdlcnJvcl94gaVjb2xvcqcjMmEzZjVmpm1hcmtlcoGkbGluZYKlY29sb3KnI0U1RUNGNqV3aWR0aMo/AAAAp2hlYXRtYXCRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnaGVhdG1hcKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrWNvbnRvdXJjYXJwZXSRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWtY29udG91cmNhcnBldKV0YWJsZZGDpHR5cGWldGFibGWmaGVhZGVygqRsaW5lgaVjb2xvcqV3aGl0ZaRmaWxsgaVjb2xvcqcjQzhENEUzpWNlbGxzgqRsaW5lgaVjb2xvcqV3aGl0ZaRmaWxsgaVjb2xvcqcjRUJGMEY4qXNjYXR0ZXIzZJGDpGxpbmWBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZalzY2F0dGVyM2SmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqGJhcnBvbGFykYKkdHlwZahiYXJwb2xhcqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKlzY2F0dGVyZ2yRgqR0eXBlqXNjYXR0ZXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACraGlzdG9ncmFtMmSRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWraGlzdG9ncmFtMmSqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa5zY2F0dGVydGVybmFyeZGCpHR5cGWuc2NhdHRlcnRlcm5hcnmmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApmxlZ2VuZIWneWFuY2hvcqZib3R0b22neGFuY2hvcqRsZWZ0oXnKP4AAAKtvcmllbnRhdGlvbqFooXjKAAAAAKV5YXhpc4OpZ3JpZGNvbG9ypXdoaXRlrXplcm9saW5lY29sb3Kld2hpdGWqZml4ZWRyYW5nZcKmc2hhcGVzkKRmb250gaVjb2xvcqRncmF5q2Fubm90YXRpb25zkKxwbG90X2JnY29sb3KwcmdiKDIyOSwyMzYsMjQ2KaZtYXJnaW6EoWzKAAAAAKFiygAAAAChcsoAAAAAoXTKAAAAAKZjb25maWeItm1vZGVCYXJCdXR0b25zVG9SZW1vdmWYpHpvb22pYXV0b1NjYWxlrHJlc2V0U2NhbGUyZKNwYW6tdGFibGVSb3RhdGlvbrNyZXNldENhbWVyYUxhc3RTYXZlpnpvb21Jbqd6b29tT3V0q2Rpc3BsYXlsb2dvwrR0b0ltYWdlQnV0dG9uT3B0aW9uc4GmZm9ybWF0o3N2Z6hzaG93TGlua8KoZWRpdGFibGXCqnJlc3BvbnNpdmXDqnN0YXRpY1Bsb3TCqnNjcm9sbFpvb23DpmZyYW1lc5CkZGF0YZSFoXnIAZQXCS49P/TIBT8tAAI+WO+ePm5yIz+1iT4/9nUXPz7Nbj4/cFQ+AP4TPy72Pz8XXyk/vNKuPg4w0T1yRAQ/gOZBP5LEPD/Ejuo+8dc1PK5e5z7I/EQ/cXZTP47DFz/3PRA+VZ/CPphFSj9si3A//jBDP/b+mj7wzJY+CMlTPyMZjT/CQ4A/QL0HP/YnOD5eQmY/osCvP25jsz/WCmo/R9ACPAwiiD8oX/k/MHcSQAxx6T+q8/E+XnjQPwachECkhtNAbrQIQUnvGEGZRhdB3k0EQY5MyEDCuHVAn/m8P0KW1j40kco/y7H4P2Yizz/MQV0/dPHPO7UKNj8ygYg/i9WCP1mvJz9yMQM+HjC9PhTfLj/LKjw/EyEKP21mQD4qakE+1DjuPlqODz9sG+w+FilePuQAoT34pKU+aKzhPuiKzT4nB2w+oFe1O8SsZD7A5LM+3p20PpbWcD7UIDo9cQMYPm7pjz43X58+DhdwPqxZqD393Lg90g5lPpK4jD6qx2s+auPfPWzPMj0EqTM+nwJ4PgAAgH+kdHlwZadzY2F0dGVypG5hbWWmfFModCl8rWhvdmVydGVtcGxhdGW8KCV7eDouNGZ9IG1zLCAle3k6LjNmfSBhLnUuKaF4yAGUF1pkKUG+nyxBI9svQYcWM0HsUTZBUI05QbTIPEEZBEBBfT9DQeF6RkFGtklBqvFMQQ4tUEFzaFNB16NWQTvfWUGgGl1BBFZgQWiRY0HNzGZBMQhqQZZDbUH6fnBBXrpzQcP1dkEnMXpBi2x9QfhTgEGq8YFBXI+DQQ4thUHByoZBc2iIQSUGikHXo4tBiUGNQTvfjkHufJBBoBqSQVK4k0EEVpVBtvOWQWiRmEEbL5pBzcybQX9qnUExCJ9B46WgQZZDokFI4aNB+n6lQawcp0FeuqhBEFiqQcP1q0F1k61BJzGvQdnOsEGLbLJBPQq0QfCntUGiRbdBVOO4QQaBukG4HrxBary9QR1av0HP98BBgZXCQTMzxEHl0MVBmG7HQUoMyUH8qcpBrkfMQWDlzUESg89BxSDRQXe+0kEpXNRB2/nVQY2X10E/NdlB8tLaQaRw3EFWDt5BCKzfQbpJ4UFt5+JBH4XkQdEi5kGDwOdBNV7pQef76kGamexBTDfuQf7U70GwcvFBYhDzQRSu9EEUrvRBhaF5yAGUFwAAgDMAAMCyAAAAMQAA4LIAACAzAABAMwAAwLIAAAAAAACgMgAAwDIAAECzAAAAswAAgDIAACCyAADAsgAAADMAAAAAAAAgMwAAYLIAAICyAAAAMwAAgDIAAKAzAABAsgAAwLIAAEAzAAAAMwAAgDIAAMCyAACAsgAAgDMAAMCzAAAAswAAgDMAAEAyAACAswAAYLQAAEC0AAAAAAAAGDMAAMAzAAAANAAAgLMAAIA0AADgMwAAgDMAAEC1AAAANQAAAAAAAMA1AAAAAAAAgDQAAIC1AAAANQAAgLMAAIAyAAAANAAAAAAAAOA0AABgtAAABLMAAACzAACAswAAILQAACA0AAAAswAAAAAAAIAzAADAswAAYDQAAAAAAAAAsgAAwDMAAICzAAAgtAAAYLMAAECyAACgMwAAADQAAAAzAAAAMwAAgDEAAACzAACgswAAoLMAAICyAAAgsgAAAAAAAIAyAACAswAAAAAAAICxAADAMgAAgDIAAKAzAADAMwAAwLIAAAAyAACAsgAAALMAAMD/pHR5cGWnc2NhdHRlcqRuYW1lqFJle1ModCl9rWhvdmVydGVtcGxhdGW8KCV7eDouNGZ9IG1zLCAle3k6LjNmfSBhLnUuKaF4yAGUF1pkKUG+nyxBI9svQYcWM0HsUTZBUI05QbTIPEEZBEBBfT9DQeF6RkFGtklBqvFMQQ4tUEFzaFNB16NWQTvfWUGgGl1BBFZgQWiRY0HNzGZBMQhqQZZDbUH6fnBBXrpzQcP1dkEnMXpBi2x9QfhTgEGq8YFBXI+DQQ4thUHByoZBc2iIQSUGikHXo4tBiUGNQTvfjkHufJBBoBqSQVK4k0EEVpVBtvOWQWiRmEEbL5pBzcybQX9qnUExCJ9B46WgQZZDokFI4aNB+n6lQawcp0FeuqhBEFiqQcP1q0F1k61BJzGvQdnOsEGLbLJBPQq0QfCntUGiRbdBVOO4QQaBukG4HrxBary9QR1av0HP98BBgZXCQTMzxEHl0MVBmG7HQUoMyUH8qcpBrkfMQWDlzUESg89BxSDRQXe+0kEpXNRB2/nVQY2X10E/NdlB8tLaQaRw3EFWDt5BCKzfQbpJ4UFt5+JBH4XkQdEi5kGDwOdBNV7pQef76kGamexBTDfuQf7U70GwcvFBYhDzQRSu9EEUrvRBhaF5yAGUFwkuPb/0yAW/LQACvljvnj5uciM/tYk+P/Z1Fz8+zW4+P3BUvgD+E78u9j+/F18pv7zSrr4OMNE9ckQEP4DmQT+SxDw/xI7qPvHXNTyuXue+yPxEv3F2U7+Owxe/9z0QvlWfwj6YRUo/bItwP/4wQz/2/po+8MyWvgjJU78jGY2/wkOAv0C9B7/2Jzg+XkJmP6LArz9uY7M/1gpqP0fQAjwMIoi/KF/5vzB3EsAMcem/qvPxvl540D8GnIRApIbTQG60CEFJ7xhBmUYXQd5NBEGOTMhAwrh1QJ/5vD9Clta+NJHKv8ux+L9mIs+/zEFdv3Txzzu1CjY/MoGIP4vVgj9Zryc/cjEDPh4wvb4U3y6/yyo8vxMhCr9tZkC+KmpBPtQ47j5ajg8/bBvsPhYpXj7kAKG9+KSlvmis4b7ois2+JwdsvqBXtTvErGQ+wOSzPt6dtD6W1nA+1CA6PXEDGL5u6Y++N1+fvg4XcL6sWai9/dy4PdIOZT6SuIw+qsdrPmrj3z1szzK9BKkzvp8CeL4AAIB/pHR5cGWnc2NhdHRlcqRuYW1lqElte1ModCl9rWhvdmVydGVtcGxhdGW8KCV7eDouNGZ9IG1zLCAle3k6LjNmfSBhLnUuKaF4yAGUF1pkKUG+nyxBI9svQYcWM0HsUTZBUI05QbTIPEEZBEBBfT9DQeF6RkFGtklBqvFMQQ4tUEFzaFNB16NWQTvfWUGgGl1BBFZgQWiRY0HNzGZBMQhqQZZDbUH6fnBBXrpzQcP1dkEnMXpBi2x9QfhTgEGq8YFBXI+DQQ4thUHByoZBc2iIQSUGikHXo4tBiUGNQTvfjkHufJBBoBqSQVK4k0EEVpVBtvOWQWiRmEEbL5pBzcybQX9qnUExCJ9B46WgQZZDokFI4aNB+n6lQawcp0FeuqhBEFiqQcP1q0F1k61BJzGvQdnOsEGLbLJBPQq0QfCntUGiRbdBVOO4QQaBukG4HrxBary9QR1av0HP98BBgZXCQTMzxEHl0MVBmG7HQUoMyUH8qcpBrkfMQWDlzUESg89BxSDRQXe+0kEpXNRB2/nVQY2X10E/NdlB8tLaQaRw3EFWDt5BCKzfQbpJ4UFt5+JBH4XkQdEi5kGDwOdBNV7pQef76kGamexBTDfuQf7U70GwcvFBYhDzQRSu9EEUrvRBhaZtYXJrZXKBpWNvbG9ypnB1cnBsZaF5yAGQF7N3gUEP8oBB9GyAQcXQf0GzyH5Bs8F9QcK7fEHftntBCbN6QUCweUGCrnhBzq13QSOudkGAr3VB5LF0QU21c0G7uXJBLb9xQaLFcEEYzW9Bj9VuQQXfbUF56WxB7PRrQVoBa0HEDmpBKR1pQYcsaEHdPGdBK05mQW9gZUGoc2RB1odjQfecYkELs2FBEMpgQQbiX0Hr+l5BvxReQYAvXUEuS1xByGdbQUyFWkG7o1lBEsNYQVHjV0F3BFdBgiZWQXRJVUFJbVRBAZJTQZy3UkEZ3lFBdgVRQbItUEHNVk9BxoBOQZyrTUFO10xB3ANMQUMxS0GEX0pBnY5JQY6+SEFW70dB9CBHQWZTRkGthkVBx7pEQbTvQ0FyJUNBAVxCQWCTQUGPy0BBiwRAQVU+P0HreD5BTrQ9QXvwPEFyLTxBM2s7QbypOkEN6TlBJCk5QQJqOEGlqzdBDe42QTgxNkEndTVB17k0QUn/M0F7RTNBbYwyQR/UMUGOHDFBu2UwQaWvL0FK+i5Bq0UuQcaRLUGkdHlwZadzY2F0dGVypG5hbWWoVDItZGVjYXmheMgBkBcHZSlBgaAsQfrbL0F0FzNB7VI2QWeOOUHgyTxBWgVAQdNAQ0FNfEZBxrdJQUDzTEG6LlBBM2pTQa2lVkEm4VlBoBxdQRlYYEGTk2NBDM9mQYYKakH/RW1BeYFwQfK8c0Fs+HZB5jN6QV9vfUFsVYBBKfOBQeaQg0GjLoVBX8yGQRxqiEHZB4pBlqWLQVJDjUEP4Y5BzH6QQYkckkFGupNBAliVQb/1lkF8k5hBOTGaQfXOm0GybJ1BbwqfQSyooEHoRaJBpeOjQWKBpUEfH6dB27yoQZhaqkFV+KtBEpatQc8zr0GL0bBBSG+yQQUNtEHCqrVBfki3QTvmuEH4g7pBtSG8QXG/vUEuXb9B6/rAQaiYwkFlNsRBIdTFQd5xx0GbD8lBWK3KQRRLzEHR6M1BjobPQUsk0UEHwtJBxF/UQYH91UE+m9dB+zjZQbfW2kF0dNxBMRLeQe6v30GqTeFBZ+viQSSJ5EHhJuZBncTnQVpi6UEXAOtB1J3sQZA77kFN2e9BCnfxQccU80GEsvRB2TViM2I4NDA4Yy04MTgxLTExZWYtMTRlYi1lMWM1NjliOGJiMjkvODAzNmY4MGZlY2Q5ZjgxN4SmbGF5b3V0iKpzaG93bGVnZW5kwqZ4YXhpczGJq3Jhbmdlc2xpZGVygad2aXNpYmxlwqlncmlkY29sb3Kld2hpdGWtcmFuZ2VzZWxlY3RvcoGnYnV0dG9uc5KEpHN0ZXDKQSAAAKhzdGVwbW9kZahiYWNrd2FyZKVsYWJlbKIxbaVjb3VudMo/gAAAgaRzdGVwo2FsbKV0aXRsZYGkdGV4dKCmZG9tYWlu1xcAAAAAZmbmPqVyYW5nZZCtemVyb2xpbmVjb2xvcqV3aGl0Zap0aWNrc3VmZml4oyBtc6ZhbmNob3KieTGmeWF4aXMxhqlncmlkY29sb3Kld2hpdGWlcmFuZ2XXFwAAoMAAAIRBpmRvbWFpbtcXAAAAAAAAgD+temVyb2xpbmVjb2xvcqV3aGl0ZaZhbmNob3KieDGqZml4ZWRyYW5nZcKodGVtcGxhdGWCpmxheW91dN4AE6ljb2xvcmF4aXOBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACleGF4aXOHqWdyaWRjb2xvcqV3aGl0Za16ZXJvbGluZXdpZHRoykAAAACldGl0bGWBqHN0YW5kb2ZmykFwAACldGlja3OgrXplcm9saW5lY29sb3Kld2hpdGWqYXV0b21hcmdpbsOpbGluZWNvbG9ypXdoaXRlqWhvdmVybW9kZadjbG9zZXN0rXBhcGVyX2JnY29sb3Kld2hpdGWjZ2VvhqlzaG93bGFrZXPDqHNob3dsYW5kw6lsYW5kY29sb3KnI0U1RUNGNqdiZ2NvbG9ypXdoaXRlrHN1YnVuaXRjb2xvcqV3aGl0ZalsYWtlY29sb3Kld2hpdGWqY29sb3JzY2FsZYOqc2VxdWVudGlhbJqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMalkaXZlcmdpbmebksoAAAAApyM4ZTAxNTKSyj3MzM2nI2M1MWI3ZJLKPkzMzacjZGU3N2Flkso+mZmapyNmMWI2ZGGSyj7MzM2nI2ZkZTBlZpLKPwAAAKcjZjdmN2Y3kso/GZmapyNlNmY1ZDCSyj8zMzOnI2I4ZTE4NpLKP0zMzacjN2ZiYzQxkso/ZmZmpyM0ZDkyMjGSyj+AAACnIzI3NjQxOa9zZXF1ZW50aWFsbWludXOaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGleWF4aXOHqWdyaWRjb2xvcqV3aGl0Za16ZXJvbGluZXdpZHRoykAAAACldGl0bGWBqHN0YW5kb2ZmykFwAACldGlja3OgrXplcm9saW5lY29sb3Kld2hpdGWqYXV0b21hcmdpbsOpbGluZWNvbG9ypXdoaXRlrXNoYXBlZGVmYXVsdHOBpGxpbmWBpWNvbG9ypyMyYTNmNWaqaG92ZXJsYWJlbIGlYWxpZ26kbGVmdKZtYXBib3iBpXN0eWxlpWxpZ2h0pXBvbGFyg6thbmd1bGFyYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWnYmdjb2xvcqcjRTVFQ0Y2qnJhZGlhbGF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlr2F1dG90eXBlbnVtYmVyc6ZzdHJpY3SkZm9udIGlY29sb3KnIzJhM2Y1Zqd0ZXJuYXJ5hKVhYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWnYmdjb2xvcqcjRTVFQ0Y2pWNheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZaViYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWyYW5ub3RhdGlvbmRlZmF1bHRzg6lhcnJvd2hlYWTKAAAAAKphcnJvd3dpZHRoyj+AAACqYXJyb3djb2xvcqcjMmEzZjVmrHBsb3RfYmdjb2xvcqcjRTVFQ0Y2pXRpdGxlgaF4yj1MzM2lc2NlbmWDpXhheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0ZaV6YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWleWF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlqGNvbG9yd2F5mqcjNjM2ZWZhpyNFRjU1M0KnIzAwY2M5NqcjYWI2M2ZhpyNGRkExNUGnIzE5ZDNmM6cjRkY2NjkypyNCNkU4ODCnI0ZGOTdGRqcjRkVDQjUypGRhdGHeABmuc2NhdHRlcnBvbGFyZ2yRgqR0eXBlrnNjYXR0ZXJwb2xhcmdspm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZjYXJwZXSRg6ViYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlpHR5cGWmY2FycGV0pWFheGlzhalncmlkY29sb3Kld2hpdGWsZW5kbGluZWNvbG9ypyMyYTNmNWaubWlub3JncmlkY29sb3Kld2hpdGWuc3RhcnRsaW5lY29sb3KnIzJhM2Y1ZqlsaW5lY29sb3Kld2hpdGWsc2NhdHRlcnBvbGFykYKkdHlwZaxzY2F0dGVycG9sYXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqXBhcmNvb3Jkc5GCpGxpbmWBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZalwYXJjb29yZHOnc2NhdHRlcpGCpHR5cGWnc2NhdHRlcqZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACyaGlzdG9ncmFtMmRjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlsmhpc3RvZ3JhbTJkY29udG91cqpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxp2NvbnRvdXKRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnY29udG91cqpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJjYXJwZXSRgqR0eXBlrXNjYXR0ZXJjYXJwZXSmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApm1lc2gzZJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZaZtZXNoM2Snc3VyZmFjZZGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadzdXJmYWNlqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtc2NhdHRlcm1hcGJveJGCpHR5cGWtc2NhdHRlcm1hcGJveKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACqc2NhdHRlcmdlb5GCpHR5cGWqc2NhdHRlcmdlb6ZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACpaGlzdG9ncmFtkYKkdHlwZaloaXN0b2dyYW2mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAo3BpZZGCpHR5cGWjcGllqmF1dG9tYXJnaW7DqmNob3JvcGxldGiRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWqY2hvcm9wbGV0aKloZWF0bWFwZ2yRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpaGVhdG1hcGdsqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGjYmFykYSkdHlwZaNiYXKnZXJyb3JfeYGlY29sb3KnIzJhM2Y1ZqdlcnJvcl94gaVjb2xvcqcjMmEzZjVmpm1hcmtlcoGkbGluZYKlY29sb3KnI0U1RUNGNqV3aWR0aMo/AAAAp2hlYXRtYXCRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnaGVhdG1hcKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrWNvbnRvdXJjYXJwZXSRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWtY29udG91cmNhcnBldKV0YWJsZZGDpHR5cGWldGFibGWmaGVhZGVygqRsaW5lgaVjb2xvcqV3aGl0ZaRmaWxsgaVjb2xvcqcjQzhENEUzpWNlbGxzgqRsaW5lgaVjb2xvcqV3aGl0ZaRmaWxsgaVjb2xvcqcjRUJGMEY4qXNjYXR0ZXIzZJGDpGxpbmWBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZalzY2F0dGVyM2SmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqGJhcnBvbGFykYKkdHlwZahiYXJwb2xhcqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKlzY2F0dGVyZ2yRgqR0eXBlqXNjYXR0ZXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACraGlzdG9ncmFtMmSRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWraGlzdG9ncmFtMmSqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa5zY2F0dGVydGVybmFyeZGCpHR5cGWuc2NhdHRlcnRlcm5hcnmmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApnhheGlzMomrcmFuZ2VzbGlkZXKBp3Zpc2libGXCqWdyaWRjb2xvcqV3aGl0Za1yYW5nZXNlbGVjdG9ygadidXR0b25zkoSkc3RlcMpBIAAAqHN0ZXBtb2RlqGJhY2t3YXJkpWxhYmVsojFtpWNvdW50yj+AAACBpHN0ZXCjYWxspXRpdGxlgaR0ZXh0oKZkb21haW7XF83MDD8AAIA/pXJhbmdlkK16ZXJvbGluZWNvbG9ypXdoaXRlqnRpY2tzdWZmaXijIG1zpmFuY2hvcqJ5MqZtYXJnaW6EoWzKQkgAAKFiykJIAAChcspCSAAAoXTKQnAAAKZ5YXhpczKGqWdyaWRjb2xvcqV3aGl0ZaVyYW5nZdcXAACgwAAAhEGmZG9tYWlu1xcAAAAAAACAP616ZXJvbGluZWNvbG9ypXdoaXRlpmFuY2hvcqJ4MqpmaXhlZHJhbmdlwqthbm5vdGF0aW9uc5KJp3lhbmNob3KmYm90dG9tp3hhbmNob3KmY2VudGVyoXnKP4AAAKRmb250gaRzaXplykGAAACpc2hvd2Fycm93wqR5cmVmpXBhcGVypHRleHSmR1JFLVQypHhyZWalcGFwZXKheMo+ZmZmiad5YW5jaG9ypmJvdHRvbad4YW5jaG9ypmNlbnRlcqF5yj+AAACkZm9udIGkc2l6ZcpBgAAAqXNob3dhcnJvd8KkeXJlZqVwYXBlcqR0ZXh0p0dSRS1UMiqkeHJlZqVwYXBlcqF4yj9GZmamY29uZmlnhahzaG93TGlua8KoZWRpdGFibGXCqnJlc3BvbnNpdmXDqnN0YXRpY1Bsb3TCqnNjcm9sbFpvb23DpmZyYW1lc5CkZGF0YZiHpXhheGlzongxoXnIAZQXJtZMP5BRET+wqg0+GsatPsJPMz/gwFE/ZlInP4RghD7EY2w+DEolP741Vz/YnT4/iYbFPhhK7T0cphY/wMJdP4DMWD8eRQc/gJ1SPNqaBj+hO2Y/VUd4PxMDMz8w8Co+i8DnPqIHcj9Kn5A/ZOJrPwRDvD6gG7g+aPWBP9IVrj+5Gp8/FkwpP5DzZj4GM5E/oOveP07Z5D9wKZY/QPYoPHXIsD9n6CJAx4xAQPRoGkA1DyE/J6oLQHHYskBilQ9B9NU6QVZwUkEk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YmEoMCwwLDAsMCmkZm9udIGlY29sb3KkZ3Jheah0ZW1wbGF0ZYKmbGF5b3V03gATqWNvbG9yYXhpc4GoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKV4YXhpc4epZ3JpZGNvbG9ypXdoaXRlrXplcm9saW5ld2lkdGjKQAAAAKV0aXRsZYGoc3RhbmRvZmbKQXAAAKV0aWNrc6CtemVyb2xpbmVjb2xvcqV3aGl0ZaphdXRvbWFyZ2luw6lsaW5lY29sb3Kld2hpdGWpaG92ZXJtb2Rlp2Nsb3Nlc3StcGFwZXJfYmdjb2xvcqV3aGl0ZaNnZW+GqXNob3dsYWtlc8Ooc2hvd2xhbmTDqWxhbmRjb2xvcqcjRTVFQ0Y2p2JnY29sb3Kld2hpdGWsc3VidW5pdGNvbG9ypXdoaXRlqWxha2Vjb2xvcqV3aGl0Zapjb2xvcnNjYWxlg6pzZXF1ZW50aWFsmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxqWRpdmVyZ2luZ5uSygAAAACnIzhlMDE1MpLKPczMzacjYzUxYjdkkso+TMzNpyNkZTc3YWWSyj6ZmZqnI2YxYjZkYZLKPszMzacjZmRlMGVmkso/AAAApyNmN2Y3ZjeSyj8ZmZqnI2U2ZjVkMJLKPzMzM6cjYjhlMTg2kso/TMzNpyM3ZmJjNDGSyj9mZmanIzRkOTIyMZLKP4AAAKcjMjc2NDE5r3NlcXVlbnRpYWxtaW51c5qSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMaV5YXhpc4epZ3JpZGNvbG9ypXdoaXRlrXplcm9saW5ld2lkdGjKQAAAAKV0aXRsZYGoc3RhbmRvZmbKQXAAAKV0aWNrc6CtemVyb2xpbmVjb2xvcqV3aGl0ZaphdXRvbWFyZ2luw6lsaW5lY29sb3Kld2hpdGWtc2hhcGVkZWZhdWx0c4GkbGluZYGlY29sb3KnIzJhM2Y1Zqpob3ZlcmxhYmVsgaVhbGlnbqRsZWZ0pm1hcGJveIGlc3R5bGWlbGlnaHSlcG9sYXKDq2FuZ3VsYXJheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZadiZ2NvbG9ypyNFNUVDRjaqcmFkaWFsYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWvYXV0b3R5cGVudW1iZXJzpnN0cmljdKRmb250gaVjb2xvcqcjMmEzZjVmp3Rlcm5hcnmEpWFheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZadiZ2NvbG9ypyNFNUVDRjalY2F4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlpWJheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZbJhbm5vdGF0aW9uZGVmYXVsdHODqWFycm93aGVhZMoAAAAAqmFycm93d2lkdGjKP4AAAKphcnJvd2NvbG9ypyMyYTNmNWascGxvdF9iZ2NvbG9ypyNFNUVDRjaldGl0bGWBoXjKPUzMzaVzY2VuZYOleGF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXpheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0ZaV5YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWoY29sb3J3YXmapyM2MzZlZmGnI0VGNTUzQqcjMDBjYzk2pyNhYjYzZmGnI0ZGQTE1QacjMTlkM2YzpyNGRjY2OTKnI0I2RTg4MKcjRkY5N0ZGpyNGRUNCNTKkZGF0Yd4AGa5zY2F0dGVycG9sYXJnbJGCpHR5cGWuc2NhdHRlcnBvbGFyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApmNhcnBldJGDpWJheGlzhalncmlkY29sb3Kld2hpdGWsZW5kbGluZWNvbG9ypyMyYTNmNWaubWlub3JncmlkY29sb3Kld2hpdGWuc3RhcnRsaW5lY29sb3KnIzJhM2Y1ZqlsaW5lY29sb3Kld2hpdGWkdHlwZaZjYXJwZXSlYWF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaxzY2F0dGVycG9sYXKRgqR0eXBlrHNjYXR0ZXJwb2xhcqZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACpcGFyY29vcmRzkYKkbGluZYGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqXBhcmNvb3Jkc6dzY2F0dGVykYKkdHlwZadzY2F0dGVypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAALJoaXN0b2dyYW0yZGNvbnRvdXKRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWyaGlzdG9ncmFtMmRjb250b3VyqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGnY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadjb250b3VyqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtc2NhdHRlcmNhcnBldJGCpHR5cGWtc2NhdHRlcmNhcnBldKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmbWVzaDNkkYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlpm1lc2gzZKdzdXJmYWNlkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp3N1cmZhY2WqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVybWFwYm94kYKkdHlwZa1zY2F0dGVybWFwYm94pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKpzY2F0dGVyZ2VvkYKkdHlwZapzY2F0dGVyZ2Vvpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKloaXN0b2dyYW2RgqR0eXBlqWhpc3RvZ3JhbaZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACjcGllkYKkdHlwZaNwaWWqYXV0b21hcmdpbsOqY2hvcm9wbGV0aJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZapjaG9yb3BsZXRoqWhlYXRtYXBnbJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZaloZWF0bWFwZ2yqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMaNiYXKRhKR0eXBlo2JhcqdlcnJvcl95gaVjb2xvcqcjMmEzZjVmp2Vycm9yX3iBpWNvbG9ypyMyYTNmNWambWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACnaGVhdG1hcJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadoZWF0bWFwqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtY29udG91cmNhcnBldJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZa1jb250b3VyY2FycGV0pXRhYmxlkYOkdHlwZaV0YWJsZaZoZWFkZXKCpGxpbmWBpWNvbG9ypXdoaXRlpGZpbGyBpWNvbG9ypyNDOEQ0RTOlY2VsbHOCpGxpbmWBpWNvbG9ypXdoaXRlpGZpbGyBpWNvbG9ypyNFQkYwRjipc2NhdHRlcjNkkYOkbGluZYGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqXNjYXR0ZXIzZKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACoYmFycG9sYXKRgqR0eXBlqGJhcnBvbGFypm1hcmtlcoGkbGluZYKlY29sb3KnI0U1RUNGNqV3aWR0aMo/AAAAqXNjYXR0ZXJnbJGCpHR5cGWpc2NhdHRlcmdspm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKtoaXN0b2dyYW0yZJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZatoaXN0b2dyYW0yZKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrnNjYXR0ZXJ0ZXJuYXJ5kYKkdHlwZa5zY2F0dGVydGVybmFyeaZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAAClc2NlbmWFpmNhbWVyYYKidXCDoXnKP4AAAKF6ygAAAACheMoAAAAAo2V5ZYOhecoAAAAAoXrKP9mZmqF4ygAAAACleGF4aXOFqWdyaWRjb2xvcqV3aGl0Za9iYWNrZ3JvdW5kY29sb3KwcmdiKDIyOSwyMzYsMjQ2KaV0aXRsZatreCBbbeKBu8K5XaVyYW5nZdcXiRfgxYkX4EWtemVyb2xpbmVjb2xvcqV3aGl0ZaV5YXhpc4WpZ3JpZGNvbG9ypXdoaXRlr2JhY2tncm91bmRjb2xvcrByZ2IoMjI5LDIzNiwyNDYppXRpdGxlq2t5IFtt4oG7wrldpXJhbmdl1xenESjFpxEoRa16ZXJvbGluZWNvbG9ypXdoaXRlpXpheGlzhalncmlkY29sb3Kld2hpdGWvYmFja2dyb3VuZGNvbG9ysHJnYigyMjksMjM2LDI0NimldGl0bGWra3ogW23igbvCuV2lcmFuZ2XXF6cRKMWnEShFrXplcm9saW5lY29sb3Kld2hpdGWqYXNwZWN0bW9kZaRjdWJlpm1hcmdpboShbMoAAAAAoWLKQkgAAKFyygAAAAChdMoAAAAApmxlZ2VuZIWneWFuY2hvcqZib3R0b22neGFuY2hvcqRsZWZ0oXnKP4AAAKtvcmllbnRhdGlvbqFooXjKAAAAAKZjb25maWeItm1vZGVCYXJCdXR0b25zVG9SZW1vdmWWpHpvb22jcGFurXRhYmxlUm90YXRpb261cmVzZXRDYW1lcmFMYXN0U2F2ZTNkrW9yYml0Um90YXRpb260cmVzZXRDYW1lcmFEZWZhdWx0M2SrZGlzcGxheWxvZ2/CtHRvSW1hZ2VCdXR0b25PcHRpb25zgaZmb3JtYXSjc3ZnqHNob3dMaW5rwqhlZGl0YWJsZcKqcmVzcG9uc2l2ZcOqc3RhdGljUGxvdMKqc2Nyb2xsWm9vbcOmZnJhbWVzkKRkYXRhk4ikbW9kZaVsaW5lc6RsaW5lgaVjb2xvcqRncmF5oXnIA5wXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApHR5cGWpc2NhdHRlcjNkpG5hbWWqVHJhamVjdG9yealob3ZlcmluZm+kc2tpcKF6yAOcFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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c3YoMjE4LjM2MzYzNjM2MzYzNjM3LCAxMDAuMDAwMDAwMDAwMDAwMDEsIDUwLjAwMDAwMDAwMDAwMDAxKdkjaHN2KDIxNS44MTgxODE4MTgxODE4LCAxMDAuMCwgNTAuMCnZJGhzdigyMTMuMjcyNzI3MjcyNzI3MjUsIDEwMC4wLCA1MC4wKdkkaHN2KDIxMC43MjcyNzI3MjcyNzI3MiwgMTAwLjAsIDUwLjAp2SNoc3YoMjA4LjE4MTgxODE4MTgxODIsIDEwMC4wLCA1MC4wKdkkaHN2KDIwNS42MzYzNjM2MzYzNjM2MywgMTAwLjAsIDUwLjAp2SRoc3YoMjAzLjA5MDkwOTA5MDkwOTA3LCAxMDAuMCwgNTAuMCnZJGhzdigyMDAuNTQ1NDU0NTQ1NDU0NTMsIDEwMC4wLCA1MC4wKbdoc3YoMTk4LjAsIDEwMC4wLCA1MC4wKdk9aHN2KDE5NS40NTQ1NDU0NTQ1NDU0NCwgOTkuOTk5OTk5OTk5OTk5OTksIDQ5Ljk5OTk5OTk5OTk5OTk5KdkjaHN2KDE5Mi45MDkwOTA5MDkwOTA5LCAxMDAuMCwgNTAuMCnZJGhzdigxOTAuMzYzNjM2MzYzNjM2MzcsIDEwMC4wLCA1MC4wKdkjaHN2KDE4Ny44MTgxODE4MTgxODE4LCAxMDAuMCwgNTAuMCnZJGhzdigxODUuMjcyNzI3MjcyNzI3MjgsIDEwMC4wLCA1MC4wKdkkaHN2KDE4Mi43MjcyNzI3MjcyNzI3MiwgMTAwLjAsIDUwLjAp2SNoc3YoMTgwLjE4MTgxODE4MTgxODIsIDEwMC4wLCA1MC4wKdkkaHN2KDE3Ny42MzYzNjM2MzYzNjM2MywgMTAwLjAsIDUwLjAp2SNoc3YoMTc1LjA5MDkwOTA5MDkwOTEsIDEwMC4wLCA1MC4wKdkkaHN2KDE3Mi41NDU0NTQ1NDU0NTQ1MywgMTAwLjAsIDUwLjApt2hzdigxNzAuMCwgMTAwLjAsIDUwLjAp2T1oc3YoMTY3LjM2MzYzNjM2MzYzNjM3LCA5OS45OTk5OTk5OTk5OTk5OSwgNDkuOTk5OTk5OTk5OTk5OTkp2SRoc3YoMTY0LjcyNzI3MjcyNzI3MjcyLCAxMDAuMCwgNTAuMCnZI2hzdigxNjIuMDkwOTA5MDkwOTA5MSwgMTAwLjAsIDUwLjAp2SRoc3YoMTU5LjQ1NDU0NTQ1NDU0NTQ0LCAxMDAuMCwgNTAuMCnZI2hzdigxNTYuODE4MTgxODE4MTgxOCwgMTAwLjAsIDUwLjAp2SNoc3YoMTU0LjE4MTgxODE4MTgxODIsIDEwMC4wLCA1MC4wKdkkaHN2KDE1MS41NDU0NTQ1NDU0NTQ1NiwgMTAwLjAsIDUwLjAp2SNoc3YoMTQ4LjkwOTA5MDkwOTA5MDksIDEwMC4wLCA1MC4wKdkkaHN2KDE0Ni4yNzI3MjcyNzI3MjcyNSwgMTAwLjAsIDUwLjAp2SRoc3YoMTQzLjYzNjM2MzYzNjM2MzYzLCAxMDAuMCwgNTAuMCm3aHN2KDE0MS4wLCAxMDAuMCwgNTAuMCnZJGhzdigxMzguNDU0NTQ1NDU0NTQ1NDcsIDEwMC4wLCA1MC4wKdkjaHN2KDEzNS45MDkwOTA5MDkwOTA5LCAxMDAuMCwgNTAuMCnZJGhzdigxMzMuMzYzNjM2MzYzNjM2MzUsIDEwMC4wLCA1MC4wKdkjaHN2KDEzMC44MTgxODE4MTgxODE4LCAxMDAuMCwgNTAuMCnZJGhzdigxMjguMjcyNzI3MjcyNzI3MjUsIDEwMC4wLCA1MC4wKdkkaHN2KDEyNS43MjcyNzI3MjcyNzI3MiwgMTAwLjAsIDUwLjAp2SRoc3YoMTIzLjE4MTgxODE4MTgxODE5LCAxMDAuMCwgNTAuMCnZJGhzdigxMjAuNjM2MzYzNjM2MzYzNjMsIDEwMC4wLCA1MC4wKdkjaHN2KDExOC4wOTA5MDkwOTA5MDkxLCAxMDAuMCwgNTAuMCnZJGhzdigxMTUuNTQ1NDU0NTQ1NDU0NTYsIDEwMC4wLCA1MC4wKbdoc3YoMTEzLjAsIDEwMC4wLCA1MC4wKdk9aHN2KDExMC40NTQ1NDU0NTQ1NDU0NSwgOTkuOTk5OTk5OTk5OTk5OTksIDQ5Ljk5OTk5OTk5OTk5OTk5KdkjaHN2KDEwNy45MDkwOTA5MDkwOTA5LCAxMDAuMCwgNTAuMCnZJGhzdigxMDUuMzYzNjM2MzYzNjM2MzYsIDEwMC4wLCA1MC4wKdkkaHN2KDEwMi44MTgxODE4MTgxODE4NCwgMTAwLjAsIDUwLjAp2SRoc3YoMTAwLjI3MjcyNzI3MjcyNzI1LCAxMDAuMCwgNTAuMCnZI2hzdig5Ny43MjcyNzI3MjcyNzI3MywgMTAwLjAsIDUwLjAp2SNoc3YoOTUuMTgxODE4MTgxODE4MTcsIDEwMC4wLCA1MC4wKdkjaHN2KDkyLjYzNjM2MzYzNjM2MzYzLCAxMDAuMCwgNTAuMCnZI2hzdig5MC4wOTA5MDkwOTA5MDkwNywgMTAwLjAsIDUwLjAp2SNoc3YoODcuNTQ1NDU0NTQ1NDU0NTMsIDEwMC4wLCA1MC4wKbZoc3YoODUuMCwgMTAwLjAsIDUwLjAp2SNoc3YoODIuMzYzNjM2MzYzNjM2MzUsIDEwMC4wLCA1MC4wKdkjaHN2KDc5LjcyNzI3MjcyNzI3MjczLCAxMDAuMCwgNTAuMCnZI2hzdig3Ny4wOTA5MDkwOTA5MDkwNywgMTAwLjAsIDUwLjAp2SNoc3YoNzQuNDU0NTQ1NDU0NTQ1NDUsIDEwMC4wLCA1MC4wKdkjaHN2KDcxLjgxODE4MTgxODE4MTgzLCAxMDAuMCwgNTAuMCnZI2hzdig2OS4xODE4MTgxODE4MTgxNywgMTAwLjAsIDUwLjAp2SNoc3YoNjYuNTQ1NDU0NTQ1NDU0NTYsIDEwMC4wLCA1MC4wKdkiaHN2KDYzLjkwOTA5MDkwOTA5MDksIDEwMC4wLCA1MC4wKdkjaHN2KDYxLjI3MjcyNzI3MjcyNzI3LCAxMDAuMCwgNTAuMCnZJGhzdig1OC42MzYzNjM2MzYzNjM2NTQsIDEwMC4wLCA1MC4wKbZoc3YoNTYuMCwgMTAwLjAsIDUwLjAp2Txoc3YoNTMuNDU0NTQ1NDU0NTQ1NDYsIDk5Ljk5OTk5OTk5OTk5OTk5LCA0OS45OTk5OTk5OTk5OTk5OSnZImhzdig1MC45MDkwOTA5MDkwOTA5LCAxMDAuMCwgNTAuMCnZI2hzdig0OC4zNjM2MzYzNjM2MzYzNiwgMTAwLjAsIDUwLjAp2SJoc3YoNDUuODE4MTgxODE4MTgxOCwgMTAwLjAsIDUwLjAp2SRoc3YoNDMuMjcyNzI3MjcyNzI3MjY2LCAxMDAuMCwgNTAuMCnZJGhzdig0MC43MjcyNzI3MjcyNzI3MzQsIDEwMC4wLCA1MC4wKdkjaHN2KDM4LjE4MTgxODE4MTgxODE3LCAxMDAuMCwgNTAuMCnZI2hzdigzNS42MzYzNjM2MzYzNjM2MywgMTAwLjAsIDUwLjAp2SRoc3YoMzMuMDkwOTA5MDkwOTA5MDY1LCAxMDAuMCwgNTAuMCnZJGhzdigzMC41NDU0NTQ1NDU0NTQ1MzYsIDEwMC4wLCA1MC4wKbZoc3YoMjguMCwgMTAwLjAsIDUwLjAp2SNoc3YoMjUuNDU0NTQ1NDU0NTQ1NDQsIDEwMC4wLCA1MC4wKdkkaHN2KDIyLjkwOTA5MDkwOTA5MDkwNywgMTAwLjAsIDUwLjAp2SRoc3YoMjAuMzYzNjM2MzYzNjM2MzQ2LCAxMDAuMCwgNTAuMCnZJGhzdigxNy44MTgxODE4MTgxODE4MTMsIDEwMC4wLCA1MC4wKdkkaHN2KDE1LjI3MjcyNzI3MjcyNzI1MiwgMTAwLjAsIDUwLjAp2SNoc3YoMTIuNzI3MjcyNzI3MjcyNzIsIDEwMC4wLCA1MC4wKdkkaHN2KDEwLjE4MTgxODE4MTgxODE4OSwgMTAwLjAsIDUwLjAp2SNoc3YoNy42MzYzNjM2MzYzNjM2MjYsIDEwMC4wLCA1MC4wKdkjaHN2KDUuMDkwOTA5MDkwOTA5MDkzLCAxMDAuMCwgNTAuMCnZI2hzdigyLjU0NTQ1NDU0NTQ1NDUzNCwgMTAwLjAsIDUwLjAptWhzdigwLjAsIDEwMC4wLCA1MC4wKaF5yAGQFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACkdHlwZalzY2F0dGVyM2SkbmFtZaNBREOkdGV4dMgBkBe0yDJBGQQ2QX0/OUHhejxBRrY/QarxQkEOLUZBc2hJQdejTEFU409BuB5TQR1aVkGBlVlB5dBcQUoMYEGuR2NBEoNmQXe+aUHb+WxBPzVwQaRwc0EIrHZBbed5QdEifUEbL4BBzcyBQX9qg0ExCIVB46WGQZZDiEFI4YlB+n6LQawcjUFeuo5BEFiQQcP1kUF1k5NBJzGVQdnOlkGLbJhBPQqaQfCnm0GiRZ1BVOOeQQaBoEG4HqJBaryjQR1apUHP96ZBgZWoQTMzqkHl0KtBmG6tQUoMr0H8qbBBrkeyQWDls0ESg7VB0SK3QYPAuEE1XrpB5/u7QZqZvUFMN79B/tTAQbBywkFiEMRBFK7FQcdLx0F56chBK4fKQd0kzEGPws1BQmDPQfT90EGmm9JBWDnUQQrX1UG8dNdBbxLZQSGw2kHTTdxBhevdQTeJ30HpJuFBnMTiQU5i5EEAAOZBsp3nQWQ76UEX2epByXbsQXsU7kEtsu9B30/xQZHt8kFEi/RB9ij2QajG90FaZPlBoXrIAZAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK1ob3ZlcnRlbXBsYXRl2WxreDogJXt4Oi4xZn0gbeKBu8K5PGJyPmt5OiAle3k6LjFmfSBt4oG7wrk8YnI+a3o6ICV7ejouMWZ9IG3igbvCuTxicj48Yj50X2FjcTwvYj46ICV7dGV4dH0gbXM8ZXh0cmE+PC9leHRyYT6heMgBkBe2DozFXzqJxQlmhsWzkYPFXL2AxQzSe8VfKXbFsoBwxQXYasVYL2XFq4Zfxf/dWcVSNVTFpYxOxfjjSMVLO0PFnpI9xfHpN8VFQTLFmJgsxevvJsU+RyHFkZ4bxeT1FcU4TRDFi6QKxd77BMVipv7ECFXzxK8D6MRVstzE+2DRxKIPxsRIvrrE7myvxJQbpMQ7ypjE4XiNxIcngsRbrG3EqAlXxPVmQMRBxCnEjiETxLX9+MNOuMvD6HKewwJbYsM00AfDmxU1wpsVNUI00AdDAltiQ+hynkNOuMtDtf34Q44hE0RBxClE9WZARKgJV0RbrG1EhyeCROF4jUQ7yphElBukRO5sr0RIvrpEog/GRPtg0URVstxErwPoRAhV80Ripv5E3vsERYukCkU4TRBF5PUVRZGeG0U+RyFF6+8mRZiYLEVFQTJF8ek3RZ6SPUVLO0NF+ONIRaWMTkVSNVRF/91ZRauGX0VYL2VFBdhqRbKAcEVfKXZFDNJ7RVy9gEWzkYNFCWaGRV86iUW2DoxFhqZtYXJrZXKDpnN5bWJvbKVjcm9zc6Vjb2xvcqNyZWSkc2l6ZcpBIAAAoXnWFwAAAACkdHlwZalzY2F0dGVyM2SkbmFtZaNrPTChetYXAAAAAKF41hcAAAAA2TViM2I4NDA4Yy04MTgxLTExZWYtMTRlYi1lMWM1NjliOGJiMjkvYjdiZjk2ZTRiMWIwMWM4Y4SmbGF5b3V0i6V4YXhpc4ircmFuZ2VzbGlkZXKBp3Zpc2libGXCqWdyaWRjb2xvcqV3aGl0Za1yYW5nZXNlbGVjdG9ygadidXR0b25zkoSkc3RlcMpBIAAAqHN0ZXBtb2RlqGJhY2t3YXJkpWxhYmVsojFtpWNvdW50yj+AAACBpHN0ZXCjYWxspXRpdGxlgaR0ZXh0oKVyYW5nZZCmZG9tYWlukK16ZXJvbGluZWNvbG9ypXdoaXRlqnRpY2tzdWZmaXijIG1zp21vZGViYXKIpWNvbG9ypGdyYXmrYWN0aXZlY29sb3KwcmdiKDIyOSwyMzYsMjQ2Kad5YW5jaG9ypmJvdHRvbad4YW5jaG9ypXJpZ2h0oXnKP4AAAKdiZ2NvbG9yrXJnYmEoMCwwLDAsMCmrb3JpZW50YXRpb26haKF4ygAAAACpaG92ZXJtb2Rlp2Nsb3Nlc3StcGFwZXJfYmdjb2xvcq1yZ2JhKDAsMCwwLDApqHRlbXBsYXRlgqZsYXlvdXTeABOpY29sb3JheGlzgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApXhheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Zalob3Zlcm1vZGWnY2xvc2VzdK1wYXBlcl9iZ2NvbG9ypXdoaXRlo2dlb4apc2hvd2xha2Vzw6hzaG93bGFuZMOpbGFuZGNvbG9ypyNFNUVDRjanYmdjb2xvcqV3aGl0ZaxzdWJ1bml0Y29sb3Kld2hpdGWpbGFrZWNvbG9ypXdoaXRlqmNvbG9yc2NhbGWDqnNlcXVlbnRpYWyaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGpZGl2ZXJnaW5nm5LKAAAAAKcjOGUwMTUykso9zMzNpyNjNTFiN2SSyj5MzM2nI2RlNzdhZZLKPpmZmqcjZjFiNmRhkso+zMzNpyNmZGUwZWaSyj8AAACnI2Y3ZjdmN5LKPxmZmqcjZTZmNWQwkso/MzMzpyNiOGUxODaSyj9MzM2nIzdmYmM0MZLKP2ZmZqcjNGQ5MjIxkso/gAAApyMyNzY0MTmvc2VxdWVudGlhbG1pbnVzmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxpXlheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Za1zaGFwZWRlZmF1bHRzgaRsaW5lgaVjb2xvcqcjMmEzZjVmqmhvdmVybGFiZWyBpWFsaWdupGxlZnSmbWFwYm94gaVzdHlsZaVsaWdodKVwb2xhcoOrYW5ndWxhcmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqpyYWRpYWxheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0Za9hdXRvdHlwZW51bWJlcnOmc3RyaWN0pGZvbnSBpWNvbG9ypyMyYTNmNWandGVybmFyeYSlYWF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqVjYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWlYmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlsmFubm90YXRpb25kZWZhdWx0c4OpYXJyb3doZWFkygAAAACqYXJyb3d3aWR0aMo/gAAAqmFycm93Y29sb3KnIzJhM2Y1ZqxwbG90X2JnY29sb3KnI0U1RUNGNqV0aXRsZYGheMo9TMzNpXNjZW5lg6V4YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWlemF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXlheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0Zahjb2xvcndheZqnIzYzNmVmYacjRUY1NTNCpyMwMGNjOTanI2FiNjNmYacjRkZBMTVBpyMxOWQzZjOnI0ZGNjY5MqcjQjZFODgwpyNGRjk3RkanI0ZFQ0I1MqRkYXRh3gAZrnNjYXR0ZXJwb2xhcmdskYKkdHlwZa5zY2F0dGVycG9sYXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmY2FycGV0kYOlYmF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaR0eXBlpmNhcnBldKVhYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlrHNjYXR0ZXJwb2xhcpGCpHR5cGWsc2NhdHRlcnBvbGFypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKlwYXJjb29yZHORgqRsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpcGFyY29vcmRzp3NjYXR0ZXKRgqR0eXBlp3NjYXR0ZXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAsmhpc3RvZ3JhbTJkY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZbJoaXN0b2dyYW0yZGNvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMadjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2NvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVyY2FycGV0kYKkdHlwZa1zY2F0dGVyY2FycGV0pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZtZXNoM2SRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWmbWVzaDNkp3N1cmZhY2WRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnc3VyZmFjZapjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJtYXBib3iRgqR0eXBlrXNjYXR0ZXJtYXBib3imbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqnNjYXR0ZXJnZW+RgqR0eXBlqnNjYXR0ZXJnZW+mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqWhpc3RvZ3JhbZGCpHR5cGWpaGlzdG9ncmFtpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKNwaWWRgqR0eXBlo3BpZaphdXRvbWFyZ2luw6pjaG9yb3BsZXRokYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqmNob3JvcGxldGipaGVhdG1hcGdskYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqWhlYXRtYXBnbKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxo2JhcpGEpHR5cGWjYmFyp2Vycm9yX3mBpWNvbG9ypyMyYTNmNWanZXJyb3JfeIGlY29sb3KnIzJhM2Y1ZqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKdoZWF0bWFwkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2hlYXRtYXCqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1jb250b3VyY2FycGV0kYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlrWNvbnRvdXJjYXJwZXSldGFibGWRg6R0eXBlpXRhYmxlpmhlYWRlcoKkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0M4RDRFM6VjZWxsc4KkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0VCRjBGOKlzY2F0dGVyM2SRg6RsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpc2NhdHRlcjNkpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKhiYXJwb2xhcpGCpHR5cGWoYmFycG9sYXKmbWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACpc2NhdHRlcmdskYKkdHlwZalzY2F0dGVyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAq2hpc3RvZ3JhbTJkkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlq2hpc3RvZ3JhbTJkqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGuc2NhdHRlcnRlcm5hcnmRgqR0eXBlrnNjYXR0ZXJ0ZXJuYXJ5pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZsZWdlbmSFp3lhbmNob3KmYm90dG9tp3hhbmNob3KkbGVmdKF5yj+AAACrb3JpZW50YXRpb26haKF4ygAAAACleWF4aXODqWdyaWRjb2xvcqV3aGl0Za16ZXJvbGluZWNvbG9ypXdoaXRlqmZpeGVkcmFuZ2XCpGZvbnSBpWNvbG9ypGdyYXmldGl0bGWgrHBsb3RfYmdjb2xvcrByZ2IoMjI5LDIzNiwyNDYppm1hcmdpboShbMoAAAAAoWLKAAAAAKFyygAAAAChdMoAAAAApmNvbmZpZ4i2bW9kZUJhckJ1dHRvbnNUb1JlbW92ZZqkem9vbahzZWxlY3QyZKdsYXNzbzJkqWF1dG9TY2FsZaxyZXNldFNjYWxlMmSjcGFurXRhYmxlUm90YXRpb26zcmVzZXRDYW1lcmFMYXN0U2F2ZaZ6b29tSW6nem9vbU91dKtkaXNwbGF5bG9nb8K0dG9JbWFnZUJ1dHRvbk9wdGlvbnOBpmZvcm1hdKNzdmeoc2hvd0xpbmvCqGVkaXRhYmxlwqpyZXNwb25zaXZlw6pzdGF0aWNQbG90wqpzY3JvbGxab29tw6ZmcmFtZXOQpGRhdGGXiqpzaG93bGVnZW5kw6ZtYXJrZXKBpWNvbG9ypyM2MzZFRkGleGF4aXOheKF5xywXAACAfwAAAADKayjBymsowQAAAAAAAIB/AAAAAMprKEHKayhBAAAAAAAAgH+kdHlwZadzY2F0dGVypG5hbWWiR3ileWF4aXOheatsZWdlbmRncm91cKJHeK1ob3ZlcnRlbXBsYXRlvCgle3g6LjRmfSBtcywgJXt5Oi4yZn0gbVQvbSmheMcsFwAAgH9yUBY/clAWPwdlKUEHZSlBAACAfwdlKUEHZSlBhLL0QYSy9EEAAIB/iqpzaG93bGVnZW5kw6ZtYXJrZXKBpWNvbG9ypyNFRjU1M0KleGF4aXOheKF5xwwXAACAfwAAgH8AAIB/pHR5cGWnc2NhdHRlcqRuYW1lokd5pXlheGlzoXmrbGVnZW5kZ3JvdXCiR3mtaG92ZXJ0ZW1wbGF0ZbwoJXt4Oi40Zn0gbXMsICV7eTouMmZ9IG1UL20poXjHDBcAAIB/AACAfwAAgH+KqnNob3dsZWdlbmTDpm1hcmtlcoGlY29sb3KnIzAwQ0M5NqV4YXhpc6F4oXnHDBcAAIB/AACAfwAAgH+kdHlwZadzY2F0dGVypG5hbWWiR3qleWF4aXOheatsZWdlbmRncm91cKJHeq1ob3ZlcnRlbXBsYXRlvCgle3g6LjRmfSBtcywgJXt5Oi4yZn0gbVQvbSmheMcMFwAAgH8AAIB/AACAf4qqc2hvd2xlZ2VuZMOmbWFya2VygaVjb2xvcqcjQUI2M0ZBpXhheGlzoXihecccFwAAAAAAACBBAAAgQQAAAAAAAIB/AACAfwAAgH+kdHlwZadzY2F0dGVypG5hbWWnfEIxfF9BTaV5YXhpc6F5q2xlZ2VuZGdyb3Vwp3xCMXxfQU2taG92ZXJ0ZW1wbGF0ZbsoJXt4Oi40Zn0gbXMsICV7eTouMmZ9IM68VCmheMccFwAAAAAAAAAAclAWP3JQFj8AAIB/AACAfwAAgH+MqnNob3dsZWdlbmTDpXhheGlzoXindmlzaWJsZapsZWdlbmRvbmx5pG5hbWWo4oigQjFfQU2kdGV4dMccFwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD+leWF4aXOheatsZWdlbmRncm91cKjiiKBCMV9BTaZtYXJrZXKBpWNvbG9ypyNGRkExNUGhecccFwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH+kdHlwZadzY2F0dGVyrWhvdmVydGVtcGxhdGXZIigle3g6LjRmfSBtcywg4oigQjE6ICV7eTouNGZ9IHJhZCmheMccFwAAAAAAAAAAclAWP3JQFj8AAIB/AACAfwAAgH+NqnNob3dsZWdlbmTDpXhheGlzoXindmlzaWJsZapsZWdlbmRvbmx5pG5hbWWlQjFfRk2kdGV4dMccFwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD+leWF4aXOheatsZWdlbmRncm91cKVCMV9GTaZtYXJrZXKBpWNvbG9ypyNBQjYzRkGkbGluZYGkZGFzaKNkb3ShecccFwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH+kdHlwZadzY2F0dGVyrWhvdmVydGVtcGxhdGXZIigle3g6LjRmfSBtcywgQjFfRk06ICV7eTouNGZ9IGtIeimheMccFwAAAAAAAAAAclAWP3JQFj8AAIB/AACAfwAAgH+LqnNob3dsZWdlbmTDpG1vZGWkbGluZaV4YXhpc6F4pG5hbWWjQURDpXlheGlzoXmrbGVnZW5kZ3JvdXCjQURDpm1hcmtlcoGlY29sb3KnIzE5RDNGM6F5xxwXAACAfwAAgH8AAAAAAACAPwAAgD8AAAAAAACAf6R0eXBlp3NjYXR0ZXKtaG92ZXJ0ZW1wbGF0ZbUoJXt4Oi40Zn0gbXMsICV7eTppfSmheMccFwAAgH8AAIB/B2UpQQdlKUGEsvRBhLL0QQAAgH/ZNWIzYjg0MDhjLTgxODEtMTFlZi0xNGViLWUxYzU2OWI4YmIyOS85MTE3ZDQwZDU0NjllMzBmhKZsYXlvdXSLpXhheGlziKtyYW5nZXNsaWRlcoGndmlzaWJsZcKpZ3JpZGNvbG9ypXdoaXRlrXJhbmdlc2VsZWN0b3KBp2J1dHRvbnOShKRzdGVwykEgAACoc3RlcG1vZGWoYmFja3dhcmSlbGFiZWyiMW2lY291bnTKP4AAAIGkc3RlcKNhbGyldGl0bGWBpHRleHSgpXJhbmdlkKZkb21haW6QrXplcm9saW5lY29sb3Kld2hpdGWqdGlja3N1ZmZpeKMgbXOnbW9kZWJhcoilY29sb3KkZ3JheathY3RpdmVjb2xvcrByZ2IoMjI5LDIzNiwyNDYpp3lhbmNob3KmYm90dG9tp3hhbmNob3KlcmlnaHSheco/gAAAp2JnY29sb3KtcmdiYSgwLDAsMCwwKatvcmllbnRhdGlvbqFooXjKAAAAAKlob3Zlcm1vZGWnY2xvc2VzdK1wYXBlcl9iZ2NvbG9yrXJnYmEoMCwwLDAsMCmodGVtcGxhdGWCpmxheW91dN4AE6ljb2xvcmF4aXOBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACleGF4aXOHqWdyaWRjb2xvcqV3aGl0Za16ZXJvbGluZXdpZHRoykAAAACldGl0bGWBqHN0YW5kb2ZmykFwAACldGlja3OgrXplcm9saW5lY29sb3Kld2hpdGWqYXV0b21hcmdpbsOpbGluZWNvbG9ypXdoaXRlqWhvdmVybW9kZadjbG9zZXN0rXBhcGVyX2JnY29sb3Kld2hpdGWjZ2VvhqlzaG93bGFrZXPDqHNob3dsYW5kw6lsYW5kY29sb3KnI0U1RUNGNqdiZ2NvbG9ypXdoaXRlrHN1YnVuaXRjb2xvcqV3aGl0ZalsYWtlY29sb3Kld2hpdGWqY29sb3JzY2FsZYOqc2VxdWVudGlhbJqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMalkaXZlcmdpbmebksoAAAAApyM4ZTAxNTKSyj3MzM2nI2M1MWI3ZJLKPkzMzacjZGU3N2Flkso+mZmapyNmMWI2ZGGSyj7MzM2nI2ZkZTBlZpLKPwAAAKcjZjdmN2Y3kso/GZmapyNlNmY1ZDCSyj8zMzOnI2I4ZTE4NpLKP0zMzacjN2ZiYzQxkso/ZmZmpyM0ZDkyMjGSyj+AAACnIzI3NjQxOa9zZXF1ZW50aWFsbWludXOaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGleWF4aXOHqWdyaWRjb2xvcqV3aGl0Za16ZXJvbGluZXdpZHRoykAAAACldGl0bGWBqHN0YW5kb2ZmykFwAACldGlja3OgrXplcm9saW5lY29sb3Kld2hpdGWqYXV0b21hcmdpbsOpbGluZWNvbG9ypXdoaXRlrXNoYXBlZGVmYXVsdHOBpGxpbmWBpWNvbG9ypyMyYTNmNWaqaG92ZXJsYWJlbIGlYWxpZ26kbGVmdKZtYXBib3iBpXN0eWxlpWxpZ2h0pXBvbGFyg6thbmd1bGFyYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWnYmdjb2xvcqcjRTVFQ0Y2qnJhZGlhbGF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlr2F1dG90eXBlbnVtYmVyc6ZzdHJpY3SkZm9udIGlY29sb3KnIzJhM2Y1Zqd0ZXJuYXJ5hKVhYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWnYmdjb2xvcqcjRTVFQ0Y2pWNheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZaViYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWyYW5ub3RhdGlvbmRlZmF1bHRzg6lhcnJvd2hlYWTKAAAAAKphcnJvd3dpZHRoyj+AAACqYXJyb3djb2xvcqcjMmEzZjVmrHBsb3RfYmdjb2xvcqcjRTVFQ0Y2pXRpdGxlgaF4yj1MzM2lc2NlbmWDpXhheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0ZaV6YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWleWF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlqGNvbG9yd2F5mqcjNjM2ZWZhpyNFRjU1M0KnIzAwY2M5NqcjYWI2M2ZhpyNGRkExNUGnIzE5ZDNmM6cjRkY2NjkypyNCNkU4ODCnI0ZGOTdGRqcjRkVDQjUypGRhdGHeABmuc2NhdHRlcnBvbGFyZ2yRgqR0eXBlrnNjYXR0ZXJwb2xhcmdspm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZjYXJwZXSRg6ViYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlpHR5cGWmY2FycGV0pWFheGlzhalncmlkY29sb3Kld2hpdGWsZW5kbGluZWNvbG9ypyMyYTNmNWaubWlub3JncmlkY29sb3Kld2hpdGWuc3RhcnRsaW5lY29sb3KnIzJhM2Y1ZqlsaW5lY29sb3Kld2hpdGWsc2NhdHRlcnBvbGFykYKkdHlwZaxzY2F0dGVycG9sYXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqXBhcmNvb3Jkc5GCpGxpbmWBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZalwYXJjb29yZHOnc2NhdHRlcpGCpHR5cGWnc2NhdHRlcqZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACyaGlzdG9ncmFtMmRjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlsmhpc3RvZ3JhbTJkY29udG91cqpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxp2NvbnRvdXKRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnY29udG91cqpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJjYXJwZXSRgqR0eXBlrXNjYXR0ZXJjYXJwZXSmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApm1lc2gzZJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZaZtZXNoM2Snc3VyZmFjZZGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadzdXJmYWNlqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtc2NhdHRlcm1hcGJveJGCpHR5cGWtc2NhdHRlcm1hcGJveKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACqc2NhdHRlcmdlb5GCpHR5cGWqc2NhdHRlcmdlb6ZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACpaGlzdG9ncmFtkYKkdHlwZaloaXN0b2dyYW2mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAo3BpZZGCpHR5cGWjcGllqmF1dG9tYXJnaW7DqmNob3JvcGxldGiRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWqY2hvcm9wbGV0aKloZWF0bWFwZ2yRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpaGVhdG1hcGdsqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGjYmFykYSkdHlwZaNiYXKnZXJyb3JfeYGlY29sb3KnIzJhM2Y1ZqdlcnJvcl94gaVjb2xvcqcjMmEzZjVmpm1hcmtlcoGkbGluZYKlY29sb3KnI0U1RUNGNqV3aWR0aMo/AAAAp2hlYXRtYXCRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnaGVhdG1hcKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrWNvbnRvdXJjYXJwZXSRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWtY29udG91cmNhcnBldKV0YWJsZZGDpHR5cGWldGFibGWmaGVhZGVygqRsaW5lgaVjb2xvcqV3aGl0ZaRmaWxsgaVjb2xvcqcjQzhENEUzpWNlbGxzgqRsaW5lgaVjb2xvcqV3aGl0ZaRmaWxsgaVjb2xvcqcjRUJGMEY4qXNjYXR0ZXIzZJGDpGxpbmWBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZalzY2F0dGVyM2SmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqGJhcnBvbGFykYKkdHlwZahiYXJwb2xhcqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKlzY2F0dGVyZ2yRgqR0eXBlqXNjYXR0ZXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACraGlzdG9ncmFtMmSRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWraGlzdG9ncmFtMmSqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa5zY2F0dGVydGVybmFyeZGCpHR5cGWuc2NhdHRlcnRlcm5hcnmmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApmxlZ2VuZIWneWFuY2hvcqZib3R0b22neGFuY2hvcqRsZWZ0oXnKP4AAAKtvcmllbnRhdGlvbqFooXjKAAAAAKV5YXhpc4OpZ3JpZGNvbG9ypXdoaXRlrXplcm9saW5lY29sb3Kld2hpdGWqZml4ZWRyYW5nZcKkZm9udIGlY29sb3KkZ3JheaV0aXRsZaCscGxvdF9iZ2NvbG9ysHJnYigyMjksMjM2LDI0NimmbWFyZ2luhKFsygAAAAChYsoAAAAAoXLKAAAAAKF0ygAAAACmY29uZmlniLZtb2RlQmFyQnV0dG9uc1RvUmVtb3ZlmqR6b29tqHNlbGVjdDJkp2xhc3NvMmSpYXV0b1NjYWxlrHJlc2V0U2NhbGUyZKNwYW6tdGFibGVSb3RhdGlvbrNyZXNldENhbWVyYUxhc3RTYXZlpnpvb21Jbqd6b29tT3V0q2Rpc3BsYXlsb2dvwrR0b0ltYWdlQnV0dG9uT3B0aW9uc4GmZm9ybWF0o3N2Z6hzaG93TGlua8KoZWRpdGFibGXCqnJlc3BvbnNpdmXDqnN0YXRpY1Bsb3TCqnNjcm9sbFpvb23DpmZyYW1lc5CkZGF0YZeKqnNob3dsZWdlbmTDpm1hcmtlcoGlY29sb3KnIzYzNkVGQaV4YXhpc6F4oXnXFwAAgH8AAIB/pHR5cGWnc2NhdHRlcqRuYW1lokd4pXlheGlzoXmrbGVnZW5kZ3Jv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cmVjb21waWxlZC6nUGx1dG9VSdoE4QobWzBtG1sxbUluc3RhbnRpYXRpbmcuLi4bWzIybQobWzkwbT09PRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQWJzdHJhY3RQbHV0b0RpbmdldGplcyDilIAgdjEuMy4xCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQmFzZURpcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjIuMyAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBJT0NhcHR1cmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjIuNAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEZpeGVkUG9pbnROdW1iZXJzIOKUgOKUgOKUgOKUgOKUgOKUgCB2MC44LjQKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBQbHV0b1VJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC43LjU4ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ29sb3JzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xMi4xMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENvbG9yU2NoZW1lcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjMuMjQuMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKG1swbRtbMW1SZXNvbHZpbmcuLi4bWzIybQobWzkwbT09PRtbMzltChtbMzJtG1sxbSAgTm8gQ2hhbmdlcxtbMjJtG1szOW0gdG8gYC90bXAvamxfRmtnR1UwL1Byb2plY3QudG9tbGAKG1sz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cnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjIuMyAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBJT0NhcHR1cmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjIuNAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEZpeGVkUG9pbnROdW1iZXJzIOKUgOKUgOKUgOKUgOKUgOKUgCB2MC44LjQKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBQbHV0b1VJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC43LjU4ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ29sb3JzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xMi4xMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENvbG9yU2NoZW1lcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjMuMjQuMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKG1swbRtbMW1SZXNvbHZpbmcuLi4bWzIybQobWzkwbT09PRtbMzltChtbMzJtG1sxbSAgTm8gQ2hhbmdlcxtbMjJtG1szOW0gdG8gYC90bXAvamxfRmtnR1UwL1Byb2plY3QudG9tbGAKG1szMm0bWzFtICAgIFVwZGF0aW5nG1syMm0bWzM5bSBgL3RtcC9qbF9Ga2dHVTAvTWFuaWZlc3QudG9tbGAKICAbWzkwbVs4ZTg1MGI5MF0gG1szOW0bWzkzbeKGkSBsaWJibGFzdHJhbXBvbGluZV9qbGwgdjUuOC4wKzEg4oeSIHY1LjExLjArMBtbMzltCgobWzBtG1sxbVByZWNvbXBpbGluZy4uLhtbMjJt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LjQKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBGaXhlZFBvaW50TnVtYmVycyDilIDilIDilIDilIDilIDilIAgdjAuOC40ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gUGx1dG9VSSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNy41OAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENvbG9ycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMTIuMTAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBDb2xvclNjaGVtZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYzLjI0LjAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgChtbMG0bWzFtUmVzb2x2aW5nLi4uG1syMm0KG1s5MG09PT0bWzM5bQobWzMybRtbMW0gIE5vIENoYW5nZXMbWzIybRtbMzltIHRvIGAvdG1wL2psX0ZrZ0dVMC9Qcm9qZWN0LnRvbWxgChtbMzJtG1sxbSAgICBVcGRhdGluZxtbMjJtG1szOW0gYC90bXAvamxfRmtnR1UwL01hbmlmZXN0LnRvbWxgCiAgG1s5MG1bOGU4NTBiOTBdIBtbMzltG1s5M23ihpEgbGliYmxhc3RyYW1wb2xpbmVfamxsIHY1LjguMCsxIOKHkiB2NS4xMS4wKzAbWzM5bQoKG1swbRtbMW1QcmVjb21waWxpbmcuLi4bWzIybQobWzkwbT09PRtbMzltChtbMzJtG1sxbSAgQWN0aXZhdGluZxtbMjJtG1szOW0gcHJvamVjdCBhdCBgL3RtcC9qbF9Ga2dHVTBgChtbMzJtG1sxbVByZWNvbXBpbGluZxtbMjJtG1szOW0gcHJvamVjdC4uLgogIDI0IGRlcGVuZGVuY2llcyBzdWNjZXNzZnVsbHkgcHJlY29tcGlsZWQgaW4gNzIgc2Vjb25kcy4gMTU4IGFscmVhZHkgcHJlY29tcGlsZWQup2VuYWJsZWTDt3Jlc3RhcnRfcmVjb21tZW5kZWRfbXNnwLRyZXN0YXJ0X3JlcXVpcmVkX21zZ8CtYnVzeV9wYWNrYWdlc5C2d2FpdGluZ19mb3JfcGVybWlzc2lvbsLZLHdhaXRpbmdfZm9yX3Blcm1pc3Npb25fYnV0X3Byb2JhYmx5X2Rpc2FibGVkwqtjZWxsX2lucHV0c94ALtkkNThiZTQxNTAtMmI3YS00ZjllLWE3ZDctNDBhMDg2ZmQzYTUzhKdjZWxsX2lk2SQ1OGJlNDE1MC0yYjdhLTRmOWUtYTdkNy00MGEwODZmZDNhNTOkY29kZdmwaWYgYWN0aXZpdHlfZmluaXNoZWQKICAgIGh0bWwiIiIKICAgIDxzY3JpcHQ+CiAgICBjb25zdCB7ZGVmYXVsdDogY29uZmV0dGl9ID0gYXdhaXQgaW1wb3J0KCJodHRwczovL2Nkbi5za3lwYWNrLmRldi9jYW52YXMtY29uZmV0dGlAMSIpCiAgICBjb25mZXR0aSgpCiAgICA8L3NjcmlwdD4KICAgICIiIgplbmSobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMPZJGYxMWEyZmEyLWVmZjktNDk3OS1iNzM5LTNkYTJiMjRhOWE0NYSnY2VsbF9pZNkkZjExYTJmYTItZWZmOS00OTc5LWI3MzktM2RhMmIyNGE5YTQ1pGNvZGXaARttZCIiIgpHZW5lcmF0ZSBhIHZpcnR1YWwgb2JqZWN0OgogLSAoMS40KSBBIFBoYW50b20gd2l0aCAyMCBzcGlucywgd2l0aCBwcm9wZXJ0aWVzOgogICAtIGBvYmoueGAgID0gWy0xLCAxXSBtbSAoMjAgc3BpbnMgYWxvbmcgdGhlICR4JC1heGlzKQogICAtIGBvYmouz4FgICAuPSAxCiAgIC0gYG9iai5UMWAgLj0gNTAwIG1zCiAgIC0gYG9iai5UMmAgLj0gNTAgbXMKIC0gKDEuNSkgUGxvdCB0aGUgZ2VuZXJhdGVkIGBQaGFudG9tYCAoY2hlY2sgYHBsb3RfcGhhbnRvbV9tYXBgJ3MgZG9jcykKIiIiqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTD2SQ5NzEwNGM0Ni1lODFmLTQ0NGEtOTU3Zi0wYmJiMWIwMmYxYjiEp2NlbGxfaWTZJDk3MTA0YzQ2LWU4MWYtNDQ0YS05NTdmLTBiYmIxYjAyZjFiOKRjb2Rl2gZTbWQiIiIKIyAzLiAkVF97Mn1eeyp9JC1kZWNheQoKVGhlICQkVF97Mn1eeyp9JCQtZGVjYXkgaXMgdGhlIHNpZ25hbCBkZWNheSBwcm9kdWNlZCBieSBtaWNyb3Njb3BpYyBkaXN0cmlidXRpb24gb2Ygb2ZmLXJlc29uYW5jZS4KCiQoUmVzb3VyY2UoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9MSUJSRWh1Yi9NUkktcHJvY2Vzc2luZy0yMDIzL21haW4vMDItc2ltdWxhdGlvbi9GaWd1cmVzL1Qyc3Rhci5wbmciLCA6d2lkdGg9PiI0MDBweCIpKQoKVGhlIGV4YWN0IGRpc3RyaWJ1dGlvbiBvZiBvZmYtcmVzb25hbmNlIGlzCgokJHBfe1xEZWx0YSB3fSh3KSA9IFxmcmFje1RfMl57J319e1xwaSgxK1RfMl57JzJ9IHdeMil9LFxxdWFkXHRleHR7d2l0aCB9XGZyYWN7MX17VF8yXnsqfX0gPSBcZnJhY3sxfXtUXzJ9ICsgXGZyYWN7MX17VF8yXnsnfX0uJCQKCkluIHRoaXMgZXhjZXJjaXNlIHdlIHdpbGwgc2ltcGxpZnkgdGhpcyBkaXN0cmlidXRpb24sIGJ1dCB3ZSB3aWxsIG9idGFpbiBhIHNpbWlsYXIgZWZmZWN0LgoKLSAoMy4xKSBDcmVhdGUgYSBuZXcgcGhhbnRvbSBuYW1lZCBgb2JqX3Qyc3RhcmAgd2l0aCBzcGlucyBhdCB0aGUgc2FtZSBwb3NpdGlvbnMgYXMgdGhlIG9yaWdpbmFsIHBoYW50b20gYG9iamAsIGVhY2ggaGF2aW5nIGEgbGluZWFyIGRpc3RyaWJ1dGlvbiBvZiBvZmYtcmVzb25hbmNlLiBUbyBhY2hpZXZlIHRoaXMsIGZvbGxvdyB0aGVzZSBzdGVwczoKICAgKiAoMy4xLjEpIENyZWF0ZSBhbiBlbXB0eSBwaGFudG9tIGNhbGxlZCBgb2JqX3Qyc3RhcmAuCiAgICogKDMuMS4yKSBDcmVhdGUgYSBsaW5lYXIgb2ZmLXJlc29uYW5jZSBkaXN0cmlidXRpb24gc3VjaCB0aGF0IHRoZSByYW5nZSAkJDJccGkgWy0xMCwgMTBdXCxcbWF0aHJte3JhZC9zfSQkIGlzIGNvdmVyZWQgdW5pZm9ybWx5IHdpdGggJCROX3tcbWF0aHJte2lzb2Nocm9tYXRzfX0gPSAyMCQkICh1c2UgdGhlIGZ1bmN0aW9uIGByYW5nZShzdGFydCwgc3RvcCwgbGVuZ3RoKWApLgogICAqICgzLjEuMykgSXRlcmF0ZSBvdmVyIHRoZSBlbGVtZW50cyBgb2ZmYCBvZiB0aGUgbGluZWFyIGRpc3RyaWJ1dGlvbiAoYGZvcmAgbG9vcCkgYW5kIGNyZWF0ZSBjb3BpZXMgb2YgdGhlIG9yaWdpbmFsIHBoYW50b20gKGBvYmpfYXV4ID0gY29weShvYmopYCkgYW5kIHNldCB0aGUgb2ZmLXJlc29uYW5jZSBvZiB0aGF0IGNvcHkgdG8gYG9mZmAgd2l0aCBgb2JqX2F1eC7OlHcgLj0gb2ZmYC4KICAgKiAoMy4xLjQpIFVwZGF0ZSBgb2JqX3Qyc3RhcmAgYnkgYXBwZW5kaW5nIHRoZSBtb2RpZmllZCBjb3BpZXMgYG9ial9hdXhgIChgb2JqX3Qyc3RhciArPSBvYmpfYXV4YCkuCiAgICogKDMuMS41KSBGaW5hbGx5LCBvdXRzaWRlIHRoZSBsb29wLCBkaXZpZGUgdGhlIHByb3RvbiBkZW5zaXR5IGBvYmpfdDJzdGFyLs+BYCBieSAkJE5fe1xtYXRocm17aXNvY2hyb21hdHN9fSA9IDIwJCQgYW5kIHJlbmFtZSB0aGUgcGhhbnRvbSBgb2JqX3Qyc3Rhci5uYW1lID0gIlQyIHN0YXIgcGhhbnRvbSJgLgoKIC0gKDMuMikgUGxvdCBgb2JqX3Qyc3RhcmAgd2l0aCBgcGxvdF9waGFudG9tX21hcChvYmpfdDJzdGFyLCA6zpR3KWAgYW5kIHZlcmlmeSBpdCBpcyBjb3JyZWN0CgoiIiKobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMPZJGU0YzgwYzI0LTIwZmQtNDJlNS05ZGNkLWE2NTk1ODU2OWMwMYSnY2VsbF9pZNkkZTRjODBjMjQtMjBmZC00MmU1LTlkY2QtYTY1OTU4NTY5YzAxpGNvZGXaBGhtZCIiIgojIDIuIEdyYWRpZW50IEVjaG8KCiQoUmVzb3VyY2UoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9MSUJSRWh1Yi9NUkktcHJvY2Vzc2luZy0yMDIzL21haW4vMDItc2ltdWxhdGlvbi9GaWd1cmVzL0dSRS5naWYiLCA6d2lkdGg9PiI0MDBweCIpKQoKVGhlIGdyYWRpZW50IGVjaG8gaXMgb25lIG9mIHRoZSBmaXJzdCBzdGVwcyB0byBjcmVhdGUgYW4gaW1hZ2UuIFRoZSBiaWcgCmJyZWFrdGhyb3VnaCB3YXMgdGhlIGFkZGl0aW9uIG9mIGxpbmVhcmx5IGluY3JlYXNpbmcgbWFnbmV0aWMgZmllbGRzLCBvciBncmFkaWVudHMsIHRvIGVuY29kZSB0aGUgc3BpbidzIHBvc2l0aW9ucyBpbiB0aGVpciBmcmVxdWVuY3kgKE1tbWgsIHNvbWVvbmUgc2FpZCBGb3VyaWVyPykuIFRoaXMgd29ya3MgZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlIGZyZXF1ZW5jeSAkJGYkJCBvZiBhIHNwaW4gaXMgCgokJGYoeCkgPSBcZnJhY3tcZ2FtbWF9ezJccGl9IEJfeih4KSA9IFxmcmFje1xnYW1tYX17MlxwaX0gR194IHguJCQKCkxldCdzIGNyZWF0ZSBhIGRpZmZlcmVudCBzZXF1ZW5jZS4KIC0gQ3JlYXRlIGEgOTAtZGVnIGhhcmQgUkYgcHVsc2UgYW5kIHB1dCBpdCBpbiBhIHZhcmlhYmxlIGBzZXFfZ3JlYAogLSAoMi4xKSBDcmVhdGUgYSBncmFkaWVudCB3aXRoIGFyZWEgYC1BeGAgdXNpbmcgYGd4X3ByZSA9IEdyYWQoQSxULHJpc2UsZmFsbClgIGFwcGVuZCB0byBgc2VxX2dyZWAuIEFzIGFuIG9wdGlvbmFsIGNoYWxsZW5nZSwgcHV0IGBneF9wcmUucmlzZWAgYW5kIGBneF9wcmUuZmFsbGAgc28gdGhlIHNhdGlzZnkgdGhlIGBzeXNgIHJlcXVpZXJlbWVudHMKIC0gKDIuMikgQXBwZW5kIGEgYFNlcXVlbmNlYCBibG9jayBjYWxsZWQgYHJlYWRvdXRgIHRoYXQgaW5jbHVkZXM6IAogICAtIEEgZ3JhZGllbnQgb2YgdHdpY2UgdGhlIGFyZWEsIG9yIGAyQXhgLiBDYWxsIGl0IGBneGAKICAgLSBBbiBgQURDYCB3aXRoIGBhZGMyLmRlbGF5ID0gZ3gucmlzZWAgYW5kIGBhZGMyLlQgPSBneC5UYAogLSAoMi4zKSBQbG90IGBzZXFfZ3JlYCBhbmQgaXRzIGstc3BhY2UKIC0gKDIuNCkgUGxvdCB0aGUgJCRrJCQtc3BhY2Ugd2l0aCB0aGUgYHBsb3Rfa3NwYWNlYCBmdW5jdGlvbgoiIiKobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMPZJDE4YzgyZmYxLTBiZGUtNGZhMC04NDhjLWQwZWI3M2QxYWM3Y4SnY2VsbF9pZNkkMThjODJmZjEtMGJkZS00ZmEwLTg0OGMtZDBlYjczZDFhYzdjpGNvZGXaATsjICgzLjUpIENvbXBhcmUgdGhlIHBsb3QgaW4gKDMuNCkgd2l0aCAoMi42KQpiZWdpbgoJc2lnbmFsX2xheW91dCA9IExheW91dCh5YXhpcz1hdHRyKHJhbmdlPVstNSwgMTYuNV0pKQoJcmVsYXlvdXQhKHNpZ25hbF9ncmUsIHNpZ25hbF9sYXlvdXQ7IHRpdGxlPSJHUkUtVDIiKQoJcmVsYXlvdXQhKHNpZ25hbF90Ml9zdGFyX2dyZSwgc2lnbmFsX2xheW91dDsgdGl0bGU9IkdSRS1UMioiKQoJZmlnX3NpZ25hbF8yID0gW3NpZ25hbF9ncmUgc2lnbmFsX3QyX3N0YXJfZ3JlXQoJcmVsYXlvdXQoZmlnX3NpZ25hbF8yLCBzaG93bGVnZW5kPWZhbHNlKQplbmSobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMLZJDFjNzliMzdlLWQ0ZTAtNDkwZi05NDY2LTIwY2UyOGYwMTdhZYSnY2VsbF9pZNkkMWM3OWIzN2UtZDRlMC00OTBmLTk0NjYtMjBjZTI4ZjAxN2FlpGNvZGXaAZ4jICg0LjgpIENvbXBhcmUgdGhlIHNpZ25hbCBvYnRhaW5lZCBpbiAoNC43KSB3aXRoIHRoZSBvbmUgYXQgKDMuNCkKYmVnaW4KCXRfYWRjX3NlID0gS29tYU1SSUNvcmUuZ2V0X2FkY19zYW1wbGluZ190aW1lcyhzZXFfc2UpKjFlMwoJc2lnbmFsX3QyX3N0YXJfc2UgPSBwbG90X3NpZ25hbChyYXdfdDJfc3Rhcl9zZTsgc2xpZGVyPWZhbHNlKQoJYWRkdHJhY2VzIShzaWduYWxfdDJfc3Rhcl9zZSwgdDJfZGVjYXkodF9hZGNfc2UpKQoJcmVsYXlvdXQhKHNpZ25hbF90Ml9zdGFyX3NlLCBzaWduYWxfbGF5b3V0OyB0aXRsZT0iU0UiKQoJZmlnX3NpZ25hbF8zID0gW3NpZ25hbF9ncmUgc2lnbmFsX3QyX3N0YXJfZ3JlIHNpZ25hbF90Ml9zdGFyX3NlXQoJcmVsYXlvdXQoZmlnX3NpZ25hbF8zLCBzaG93bGVnZW5kPWZhbHNlKQplbmSobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMLZJGFiOGRjMWNlLWQxZWYtNDNhMC05NDk1LWRhYzkzMWI1MmFlY4SnY2VsbF9pZNkkYWI4ZGMxY2UtZDFlZi00M2EwLTk0OTUtZGFjOTMxYjUyYWVjpGNvZGXZRSMgU2V0IHRoaXMgYm9vbGVhbiB0byBgdHJ1ZWAgd2hlbiB5b3UgZmluaXNoCmFjdGl2aXR5X2ZpbmlzaGVkID0gdHJ1ZahtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkOGI0YTFhZDktMmQ2YS00YzhmLWJiOGUtZjQzYzJkMDU4MTk1hKdjZWxsX2lk2SQ4YjRhMWFkOS0yZDZhLTRjOGYtYmI4ZS1mNDNjMmQwNTgxOTWkY29kZdlGIyAoMi4zKSBQbG90IGBzZXFfZ3JlYCBhbmQgdGhlIGstc3BhY2UKcGxvdF9zZXEoc2VxX2dyZTsgc2xpZGVyPWZhbHNlKahtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkMzVmZjM0MDItZGMzNi00YjkxLWJlYzktYjRkMjFmYWYzZTY4hKdjZWxsX2lk2SQzNWZmMzQwMi1kYzM2LTRiOTEtYmVjOS1iNGQyMWZhZjNlNjikY29kZdk9IyAoMS41KSBQbG90IHRoZSBnZW5lcmF0ZWQgUGhhbnRvbQpwbG90X3BoYW50b21fbWFwKG9iaiwgOlQxKahtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkNGE0YTZiZDMtYjgyMC00NzljLTg5ZTMtZjNjZTc5YTMxNmRihKdjZWxsX2lk2SQ0YTRhNmJkMy1iODIwLTQ3OWMtODllMy1mM2NlNzlhMzE2ZGKkY29kZdlnIyAoMy42KSBSZWNvbnN0cnVjdCB0aGUgMUQgaW1hZ2UKcmVjb25fdDJfc3Rhcl9ncmUgPSBwbG90KGFicy4oZmZ0YyhyYXdfdDJfc3Rhcl9ncmUucHJvZmlsZXNbMV0uZGF0YSkpKahtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkMjdlNjU2ODAtMjJhMC00MDc5LWI2ZGYtZDYwYTMyMThlNTJlhKdjZWxsX2lk2SQyN2U2NTY4MC0yMmEwLTQwNzktYjZkZi1kNjBhMzIxOGU1MmWkY29kZdoByCMgKDQuNSkgQ3JlYXRlIGNvbmNhdGVuYXRpbmcgdGhlc2UgYmxvY2tzIGludG8gYSBzZXF1ZW5jZSBjYWxsZWQgYHNlcV9zZWAKYmVnaW4KCSMgKDQuMSkgQSA5MGRlZyBoYXJkIFJGIHB1bHNlCglzZXFfc2UgPSBTZXF1ZW5jZSgpCglzZXFfc2UgKz0gcmYKICAgICMgKDQuMikgQSBgRGVsYXlgIG9mIFRFLzIgd2l0aCBhIHBvc2l0aXZlIGdyYWRpZW50IChhcmVhIGBBeGApCglzZXFfc2UgKz0gLTEqZ3hfcHJlCgkjICg0LjMpIEEgMTgwZGVnIGhhcmQgUkYgcHVsc2UKCXNlcV9zZSArPSAoMC4wKzIuMGltKSpyZgoJIyAoNC40KSBBIHJlYWRvdXQgZ3JhZGllbnQgb2YgYXJlYSBgMkF4YCB3aXRoIGFuIEFEQyAoc2ltaWxhciB0byAoMi4yKSksIHN1Y2ggdGhhdCB0aGUgbWlkZGxlIG9mIHRoZSBncmFkaWVudCBhbmQgQURDIGFyZSBpbiAkJFxtYXRocm17VEV9JCQKCXNlcV9zZSArPSByZWFkb3V0CmVuZKhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkMGY5NmE4M2QtOTZlZi00NzY4LTkzMzAtODdjNDY2ZTM1YzkzhKdjZWxsX2lk2SQwZjk2YTgzZC05NmVmLTQ3NjgtOTMzMC04N2M0NjZlMzVjOTOkY29kZdmDIyAoMi44KSBEbyB5b3Ugbm90aWNlIGFueXRoaW5nIHdlaXJkPyBDaGFuZ2UgQXghCkBiaW5kIEF4IFNsaWRlcihyYW5nZSgwLCAyMCwgMjApKjFlLTUsIGRlZmF1bHQ9MTBlLTUpICMgR3JhZGllbnQncyBhcmVhIGluIFtUL20gc12obWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMLZJDVkZjk3ODc0LWYwOWMtNDE3My1hMmY2LTg5M2RiMzIyY2NhZoSnY2VsbF9pZNkkNWRmOTc4NzQtZjA5Yy00MTczLWEyZjYtODkzZGIzMjJjY2FmpGNvZGXZJ21kIiMgVW5kZXJzdGFuZGluZyBiYXNpYyBNUkkgc2VxdWVuY2VzIqhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw9kkZTRlZjUxNDUtYTYzYy00ZjkxLWFjMDQtM2I1YmYxNmMwODQyhKdjZWxsX2lk2SRlNGVmNTE0NS1hNjNjLTRmOTEtYWMwNC0zYjViZjE2YzA4NDKkY29kZdlaIyAoMy4zKSBTaW11bGF0ZSB0aGUgc2VxX2dyZSBzZXF1ZW5jZQpyYXdfdDJfc3Rhcl9ncmUgPSBzaW11bGF0ZShvYmpfdDJzdGFyLCBzZXFfZ3JlLCBzeXMpqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTC2SQ3YTY2YWI0Ny05MThmLTQ1ODItODk1Zi0xYjQ2OTA1NjIwNTGEp2NlbGxfaWTZJDdhNjZhYjQ3LTkxOGYtNDU4Mi04OTVmLTFiNDY5MDU2MjA1MaRjb2Rl2VMjICgxLjcpIFBsb3QgdGhlIHJlc3VsdGluZyByYXcgZGF0YSB3aXRoIHBsb3Rfc2lnbmFsCnBsb3Rfc2lnbmFsKHJhdzsgc2xpZGVyPWZhbHNlKahtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkZDZiMTcyOWEtODc0ZC0xMWVlLTE1MWEtOWIwZmNjZTJjNGZkhKdjZWxsX2lk2SRkNmIxNzI5YS04NzRkLTExZWUtMTUxYS05YjBmY2NlMmM0ZmSkY29kZdk7dXNpbmcgS29tYU1SSUNvcmUsIEtvbWFNUklQbG90cywgRkZUVywgUGx1dG9QbG90bHksIFBsdXRvVUmobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMLZJDlhODhhNTRiLWJjYzctNDFhZC04ZTYwLWY0ZDQ1MGRjY2IyZISnY2VsbF9pZNkkOWE4OGE1NGItYmNjNy00MWFkLThlNjAtZjRkNDUwZGNjYjJkpGNvZGXZwSMgKDIuNykgUmVjb25zdHJ1Y3QgdGhlIDFEIGltYWdlCmJlZ2luCiAgICBmZnRjKHg7IGRpbXM9WzEsMl0pID0gZmZ0c2hpZnQoZmZ0KGlmZnRzaGlmdCh4LCBkaW1zKSwgZGltcyksIGRpbXMpL3Byb2Qoc2l6ZSh4KVtkaW1zXSkKICAgIHJlY29uX2dyZSA9IHBsb3QoYWJzLihmZnRjKHJhd19ncmUucHJvZmlsZXNbMV0uZGF0YSkpKQplbmSobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMLZJGM0N2E1MGI4LWM5MzAtNGM5Ni05YjM0LTI3NzIxODY2MzRkOYSnY2VsbF9pZNkkYzQ3YTUwYjgtYzkzMC00Yzk2LTliMzQtMjc3MjE4NjYzNGQ5pGNvZGXZZiMgKDEuNikgRmluYWxseSwgdXNlIHRoZSBnZW5lcmF0ZWQgc2VxLCBvYmosIGFuZCBzeXMgdG8gc2ltdWxhdGUgdGhlIEZJRApyYXcgPSBzaW11bGF0ZShvYmosIHNlcSwgc3lzKahtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkNDFkMTRkZWMtYjg1Mi00MzE2LWFlZmItYzNkMDhmYTQzMjE2hKdjZWxsX2lk2SQ0MWQxNGRlYy1iODUyLTQzMTYtYWVmYi1jM2QwOGZhNDMyMTakY29kZdnVIyAoMi42KSBQbG90IHRoZSBzaW11bGF0ZWQgc2lnbmFsCmJlZ2luCgl0X2FkY19ncmUgPSBLb21hTVJJQ29yZS5nZXRfYWRjX3NhbXBsaW5nX3RpbWVzKHNlcV9ncmUpKjFlMwoJc2lnbmFsX2dyZSA9IHBsb3Rfc2lnbmFsKHJhd19ncmU7IHNsaWRlcj1mYWxzZSkKICAgIGFkZHRyYWNlcyEoc2lnbmFsX2dyZSwgdDJfZGVjYXkodF9hZGNfZ3JlKSkKCXNpZ25hbF9ncmUKZW5kqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTC2SRlZTdlODFlNy00ODRjLTQ0YTgtYTE5MS1mNzNlMjQ3MDdjZTmEp2NlbGxfaWTZJGVlN2U4MWU3LTQ4NGMtNDRhOC1hMTkxLWY3M2UyNDcwN2NlOaRjb2Rl2gLMIyAoMy4xKSBDcmVhdGUgdGhlIG5ldyBvYmpfdDJzdGFyIHBoYW50b20gCmJlZ2luCiAgICAjICgzLjEuMSkgQ3JlYXRlIGFuIGVtcHR5IHBoYW50b20KCW9ial90MnN0YXIgPSBQaGFudG9te0Zsb2F0NjR9KHg9W10pCiAgICAjICgzLjEuMikgRGVmaW5lIHRoZSBsaW5lYXIgb2ZmLXJlc29uYW5jZSBkaXN0cmlidXRpb24KCU5pc28gPSAyMAoJbGluZWFyX29mZnJlc29uYW5jZV9kaXN0cmlidXRpb24gPSAyz4AgLiogcmFuZ2UoLTEwLCAxMCwgTmlzbykKCSMgKDMuMS4zKSBJdGVyYXRlIG92ZXIgdGhlIGxpbmVhciBvZmYtcmVzb25hbmNlIGRpc3RyaWJ1dGlvbiBhbmQgLi4uCglmb3Igb2ZmID0gbGluZWFyX29mZnJlc29uYW5jZV9kaXN0cmlidXRpb24KCQkjIC4uLiBjb3B5IHRoZSBvcmlnaW5hbCBwaGFudG9tIGFuZCBtb2RpZnkgaXRzIG9mZi1yZXNvbmFuY2UKCSAgICBhdXggPSBjb3B5KG9iaikKCQlhdXguzpR3IC49IG9mZgoJCWF1eC55ICAuKz0gb2ZmICogMWUtNiAgIyBTbyB0aGUgZGlzdHJpYnV0aW9uIGlzIHZpc2libGUKCQkjICgzLjEuNCkgVXBkYXRlIHRoZSBwaGFudG9tCgkJb2JqX3Qyc3RhciArPSBhdXgKCWVuZAoJIyAoMy4xLjUpIERpdmlkZSB0aGUgcHJvdG9uIGRlbnNpdHkgYW5kIHJlbmFtZSB0aGUgcGhhbnRvbQoJb2JqX3Qyc3Rhci7PgSAuPSAxLjAgLyBOaXNvCglvYmpfdDJzdGFyLm5hbWUgPSAiVDIgc3RhciBwaGFudG9tIgplbmSobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMLZJDM0ODI0ZGI3LTEzYzQtNDVlMi1iZWZhLWYwMjdiOWI1ODVjMISnY2VsbF9pZNkkMzQ4MjRkYjctMTNjNC00NWUyLWJlZmEtZjAyN2I5YjU4NWMwpGNvZGXZp2JlZ2luCglyZWxheW91dCEocmVjb25fdDJfc3Rhcl9zZSwgcmVjb25fbGF5b3V0OyB0aXRsZT0iU0UiKQoJZmlnX3JlY29uXzMgPSBbcmVjb25fZ3JlIHJlY29uX3QyX3N0YXJfZ3JlIHJlY29uX3QyX3N0YXJfc2VdCglyZWxheW91dChmaWdfcmVjb25fMywgc2hvd2xlZ2VuZD1mYWxzZSkKZW5kqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTC2SRmMWYzYjcwMC01OTE2LTQ5NmYtYjkzOC00NmY3ZjA4YjRlYjaEp2NlbGxfaWTZJGYxZjNiNzAwLTU5MTYtNDk2Zi1iOTM4LTQ2ZjdmMDhiNGViNqRjb2Rl2XAjICg0LjYpIFBsb3Qgc2VxX3NlIGFuZCBpdHMgay1zcGFjZS4gSXMgdGhlIGstc3BhY2UgdGhlIHNhbWUgYXMgc2VxX2dyZSBpbiAoMi4zKT8KcGxvdF9zZXEoc2VxX3NlOyBzbGlkZXI9ZmFsc2UpqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTC2SQ5MTc5YWE0MC1iYjQwLTRhMzYtYWUxZS0wMGFlNDI5MzVhNWaEp2NlbGxfaWTZJDkxNzlhYTQwLWJiNDAtNGEzNi1hZTFlLTAwYWU0MjkzNWE1ZqRjb2Rl2gF+IyAoMi4xKSBDcmVhdGUgYSBncmFkaWVudCBgZ3hfcHJlYCwgdXNlIHRoZSB2YXJpYWJsZSBgQXhgISEKYmVnaW4KCVRfZ3hfcHJlID0gMTBlLTMKCWd4X3ByZSA9IEdyYWQoLUF4L1RfZ3hfcHJlLCBUX2d4X3ByZSwgMCwgMCkKCXNlcV9ncmUgPSBTZXF1ZW5jZSgpCglzZXFfZ3JlICs9IHJmCglzZXFfZ3JlICs9IGd4X3ByZQojICgyLjIpIEFwcGVuZCBhIGBTZXF1ZW5jZWAgYmxvY2sgY2FsbGVkIGByZWFkb3V0YAoJZ3ggPSBHcmFkKDIqQXgvKDJUX2d4X3ByZSksIDJUX2d4X3ByZSwgMCwgMCkKCWFkYzIgPSBBREMoMTAwLCAyVF9neF9wcmUpCglyZWFkb3V0ID0gU2VxdWVuY2UoW2d4OztdLCBbUkYoMCwwKTs7XSwgW2FkYzJdKQoJc2VxX2dyZSArPSByZWFkb3V0CmVuZKhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkYWRhNjAyZDItNGY0Yi00ZmI0LWE3NjMtOGE2MzllMDVmZjM4hKdjZWxsX2lk2SRhZGE2MDJkMi00ZjRiLTRmYjQtYTc2My04YTYzOWUwNWZmMzikY29kZdlLIyAoMi41KSBTaW11bGF0ZSB0aGUgc2VxX2dyZSBzZXF1ZW5jZQpyYXdfZ3JlID0gc2ltdWxhdGUob2JqLCBzZXFfZ3JlLCBzeXMpqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTC2SQ5NzQ3OTQzNy05Y2UzLTRiMzMtOTEzNC0wZjJhZjg5YmNjYjWEp2NlbGxfaWTZJDk3NDc5NDM3LTljZTMtNGIzMy05MTM0LTBmMmFmODliY2NiNaRjb2Rl2V8jICg0LjcpIFNpbXVsYXRlIHVzaW5nIHNlcV9zZSBhbmQgb2JqX3Qyc3RhcgpyYXdfdDJfc3Rhcl9zZSA9IHNpbXVsYXRlKG9ial90MnN0YXIsIHNlcV9zZSwgc3lzKahtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkMmU2NWFlMzEtZjUwYS00NjJiLTk3NDQtODBiZjZjZGIzODhlhKdjZWxsX2lk2SQyZTY1YWUzMS1mNTBhLTQ2MmItOTc0NC04MGJmNmNkYjM4OGWkY29kZdllIyAoNC45KSBSZWNvbnN0cnVjdCB0aGUgMUQgaW1hZ2UKcmVjb25fdDJfc3Rhcl9zZSA9IHBsb3QoYWJzLihmZnRjKHJhd190Ml9zdGFyX3NlLnByb2ZpbGVzWzFdLmRhdGEpKSmobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMLZJDg1MjlmMzZkLTJkMzktNGI0NS1hODIxLTAxYzgzNDY1MzlmZISnY2VsbF9pZNkkODUyOWYzNmQtMmQzOS00YjQ1LWE4MjEtMDFjODM0NjUzOWZkpGNvZGXZSVRhYmxlT2ZDb250ZW50cygpICMgVGhlcmUgc2hvdWxkIGJlIGEgdGFibGUgb2YgY29udGVudHMgb24gdGhlIHJpZ2h0IC0tLT6obWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMPZJDQ1OTUyNTEyLWFhZjEtNDNkOC1hOTVlLWMzMmJiMjYzM2Y0MoSnY2VsbF9pZNkkNDU5NTI1MTItYWFmMS00M2Q4LWE5NWUtYzMyYmIyNjMzZjQypGNvZGXZoW1kIiIiCiAtICg0LjcpIFNpbXVsYXRlIHVzaW5nIGBzZXFfc2VgIGFuZCBgb2JqX3Qyc3RhcmAKIC0gKDQuOCkgQ29tcGFyZSB0aGUgc2lnbmFsIG9idGFpbmVkIGluICg0LjYpIHdpdGggdGhlIG9uZSBhdCAoMy41KQogLSAoNC45KSBSZWNvbnN0cnVjdCB0aGUgMUQgaW1hZ2UKIiIiqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTD2SQ5NjQ0MDRmNi03ZjQ2LTRkZjktYWQ5OC05MjE5NDhjM2JlNjmEp2NlbGxfaWTZJDk2NDQwNGY2LTdmNDYtNGRmOS1hZDk4LTkyMTk0OGMzYmU2OaRjb2Rl2gEDYmVnaW4KCXJlY29uX2xheW91dCA9IExheW91dCh5YXhpcz1hdHRyKHJhbmdlPVswLCAwLjhdKSkKCXJlbGF5b3V0IShyZWNvbl9ncmUsIHJlY29uX2xheW91dDsgdGl0bGU9IkdSRS1UMiIpCglyZWxheW91dCEocmVjb25fdDJfc3Rhcl9ncmUsIHJlY29uX2xheW91dDsgdGl0bGU9IkdSRS1UMioiKQoJZmlnX3JlY29uXzIgPSBbcmVjb25fZ3JlIHJlY29uX3QyX3N0YXJfZ3JlXQoJcmVsYXlvdXQoZmlnX3JlY29uXzIsIHNob3dsZWdlbmQ9ZmFsc2UpCmVuZKhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkZDE2ZWZhNjItZGNlNy00ZWMzLTllM2MtYjVlMTY3NzM3N2ZjhKdjZWxsX2lk2SRkMTZlZmE2Mi1kY2U3LTRlYzMtOWUzYy1iNWUxNjc3Mzc3ZmOkY29kZdmSIyAoMS40KSBBIFBoYW50b20gd2l0aCAyMCBzcGlucwpiZWdpbgoJb2JqID0gUGhhbnRvbSh4PWNvbGxlY3QocmFuZ2UoLTFlLTMsMWUtMywyMCkpKQoJb2JqLs+BIC49IDEKCW9iai5UMSAuPSA1MDBlLTMKCW9iai5UMiAuPSA1MGUtMwoJbm90aGluZwplbmSobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMLZJGMwMmYzODk4LTEwY2ItNGYxZS1iNWVmLWViNDJiODAzYmFlZISnY2VsbF9pZNkkYzAyZjM4OTgtMTBjYi00ZjFlLWI1ZWYtZWI0MmI4MDNiYWVkpGNvZGXZnGJlZ2luCglyZWxheW91dCEoa3NwYWNlX2dyZTsgdGl0bGU9IkdSRSIpCglyZWxheW91dCEoa3NwYWNlX3NlOyB0aXRsZT0iU0UiKQoJZmlnX2tzcGFjZSA9IFtrc3BhY2VfZ3JlIGtzcGFjZV9zZV0KCXJlbGF5b3V0KGZpZ19rc3BhY2UsIHNob3dsZWdlbmQ9ZmFsc2UpCmVuZKhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkMmVlN2JhNDctMDJlNS00YjAyLWExNjItZGRiZDVlZDQ3YzdihKdjZWxsX2lk2SQyZWU3YmE0Ny0wMmU1LTRiMDItYTE2Mi1kZGJkNWVkNDdjN2KkY29kZdk6IyAoMy4yKSBQbG90IG9ial90MnN0YXIKcGxvdF9waGFudG9tX21hcChvYmpfdDJzdGFyLCA6zpR3KahtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkNzQ2NjZjMWEtMjY3My00OTM2LTk4MmItNjIyOWJmOTJhZjY2hKdjZWxsX2lk2SQ3NDY2NmMxYS0yNjczLTQ5MzYtOTgyYi02MjI5YmY5MmFmNjakY29kZdnubWQiIiIKIC0gKDIuNSkgU2ltdWxhdGUgdGhlIGBzZXFfZ3JlYCBzZXF1ZW5jZQogLSAoMi42KSBQbG90IHRoZSBzaW11bGF0ZWQgc2lnbmFsCiAtICgyLjcpIFJlY29uc3RydWN0IHRoZSAxRCBpbWFnZQogLSAoMi44KSBEbyB5b3Ugbm90aWNlIGFueXRoaW5nIHdlaXJkPyBJZiB0aGUgYW5zd2VyIGlzIHllcywgdHJ5IGFkanVzdGluZyBgQXhgIHRvIGNoYW5nZSB0aGUgYEZPVmAgb2YgdGhlIGFjcXVpc2l0aW9uCiIiIqhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw9kkZWE1NDIyNzEtMDFjMi00OTYyLWE3MDgtODA0YjIzYTg2MWI5hKdjZWxsX2lk2SRlYTU0MjI3MS0wMWMyLTQ5NjItYTcwOC04MDRiMjNhODYxYjmkY29kZdnqbWQiIiIKIC0gKDEuNikgRmluYWxseSwgdXNlIHRoZSBnZW5lcmF0ZWQgYHNlcWAsIGBvYmpgLCBhbmQgYHN5c2AgdG8gc2ltdWxhdGUgdGhlIEZJRCAoY2hlY2sgYHNpbXVsYXRlYCdzIGRvY3MpCiAtICgxLjcpIFBsb3QgdGhlIHJlc3VsdGluZyByYXcgZGF0YSB3aXRoIGBwbG90X3NpZ25hbGAuCiAtICgxLjgpIElzIHRoZSBzaWduYWwgdGhlIHNhbWUgYXMgYHBsb3QodCwgZXhwLigtdCAuLyBUMikpYD8KIiIiqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTD2SRjNmUzM2NiOC1mNDJjLTQ2NDMtOTI1Ny0xMjRkMjgwNGQzZGGEp2NlbGxfaWTZJGM2ZTMzY2I4LWY0MmMtNDY0My05MjU3LTEyNGQyODA0ZDNkYaRjb2Rl2aojICgxLjEpIEEgOTAtZGVnIGJsb2NrIFJGIHB1bHNlCmJlZ2luCglzeXMgPSBTY2FubmVyKCkKCWR1clJGID0gz4AvMi8oMs+AKs6zKnN5cy5CMSk7ICM5MC1kZWdyZWUgaGFyZCBleGNpdGF0aW9uIHB1bHNlCglyZiA9IFB1bHNlRGVzaWduZXIuUkZfaGFyZChzeXMuQjEsIGR1clJGLCBzeXMpCmVuZKhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkMjc2ODYyNjItMWExZS00NWZhLWI0ZWUtOTBhZTFkOWVlMzRlhKdjZWxsX2lk2SQyNzY4NjI2Mi0xYTFlLTQ1ZmEtYjRlZS05MGFlMWQ5ZWUzNGWkY29kZdmlbWQiIiIKIC0gKDMuMykgU2ltdWxhdGUgdGhlIGBzZXFfZ3JlYCBzZXF1ZW5jZQogLSAoMy40KSBQbG90IHRoZSBzaW11bGF0ZWQgc2lnbmFsCiAtICgzLjUpIENvbXBhcmUgdGhlIHBsb3QgaW4gKDMuNSkgd2l0aCAoMi42KQogLSAoMy42KSBSZWNvbnN0cnVjdCB0aGUgMUQgaW1hZ2UKIiIiqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTD2SQ2ZGZlMzM4ZC1kZTg1LTRhZGItYjAzMC0wOTQ1NWZhZTc4YTCEp2NlbGxfaWTZJDZkZmUzMzhkLWRlODUtNGFkYi1iMDMwLTA5NDU1ZmFlNzhhMKRjb2Rl2b5tZCIiIgpXZWxjb21lIHRvIHRoZSBoYW5kcy1vbiBzZXNzaW9uIG9uIE1SSSBzaW11bGF0aW9uLiBMZXQncyBoYXZlIHNvbWUgZnVuIQoKSWYgeW91IGhhdmUgYW55IGRvdWJ0cyBhYm91dCBob3cgdG8gdXNlIGEgZnVuY3Rpb24sIHBsZWFzZSBzZWFyY2ggaW4gdGhlICoqTGl2ZSBEb2NzKiogYXQgdGhlIGJvdHRvbSByaWdodC4KIiIiqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTD2SQ4ZTQ3NGFkZC04NjUxLTQzMWItYjQ4MS03YTEzOTAzN2RiZDKEp2NlbGxfaWTZJDhlNDc0YWRkLTg2NTEtNDMxYi1iNDgxLTdhMTM5MDM3ZGJkMqRjb2Rl2gLXbWQiIiIjIDEuIEZyZWUgSW5kdWN0aW9uIERlY2F5IChGSUQpClRoZSBmcmVlIGluZHVjdGlvbiBkZWNheSBpcyB0aGUgc2ltcGxlc3Qgb2JzZXJ2YWJsZSBOTVIgc2lnbmFsLiBUaGlzIHNpZ25hbCBpcyB0aGUgb25lIHRoYXQgZm9sbG93cyBhIHNpbmdsZSB0aXBwaW5nIFJGIHB1bHNlLgoKJChQbHV0b1VJLlJlc291cmNlKCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vTElCUkVodWIvTVJJLXByb2Nlc3NpbmctMjAyMy9tYWluLzAyLXNpbXVsYXRpb24vRmlndXJlcy9GSUQucG5nIiwgOndpZHRoPT4iMzAwcHgiKSkKVG8gcmVjcmVhdGUgdGhpcyBleHBlcmltZW50LCB3ZSB3aWxsIG5lZWQgdG8gZGVmaW5lIGEgYFNlcXVlbmNlYDoKIC0gKDEuMSkgQSA5MC1kZWcgYmxvY2sgUkYgcHVsc2UsIHB1dCBpdCBpbiBhIHZhcmlhYmxlIGBzZXFgIChjaGVjayBgUHVsc2VEZXNpZ25lci5SRl9oYXJkYCdzIGRvY3MgdXNpbmcgdGhlIExpdmUgRG9jcykKIC0gKDEuMikgQW4gQURDIHRvIGNhcHR1cmUgdGhlIHNpZ25hbCBpbiBhIHZhcmlhYmxlIGBhZGNgLCBjb25jYXRlbmF0ZSB3aXRoICgxLjEpIHVzaW5nIGBzZXEgKz0gYWRjYAogLSAoMS4zKSBQbG90IHRoZSBnZW5lcmF0ZWQgYFNlcXVlbmNlYCAoY2hlY2sgYHBsb3Rfc2VxYCdzIGRvY3MpCgpGb3IgdGhlIGhhcmR3YXJlIGxpbWl0cyB1c2UgdGhlIGRlZmF1bHQgc2Nhbm5lciBgc3lzID0gU2Nhbm5lcigpYC4gCiIiIqhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw9kkZmU4YmJjZDItZThmNS00MjI1LTgwYzMtNDdlNzMxNzZmYjNkhKdjZWxsX2lk2SRmZThiYmNkMi1lOGY1LTQyMjUtODBjMy00N2U3MzE3NmZiM2SkY29kZdlNbWQiIiIKQ29uZ3JhdHVsYXRpb25zISB5b3UgZmluaXNoZWQgdGhlIHNpbXVsYXRpb24gaGFuZHMtb24gc2Vzc2lvbiDwn6WzIQoiIiKobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMPZJDFhODNkODk3LTcwNWItNDQzZC04OWE0LWVhNWUzZTZhM2MwN4SnY2VsbF9pZNkkMWE4M2Q4OTctNzA1Yi00NDNkLTg5YTQtZWE1ZTNlNmEzYzA3pGNvZGXZtSMgKDMuNCkgUGxvdCB0aGUgc2ltdWxhdGVkIHNpZ25hbApiZWdpbgoJc2lnbmFsX3QyX3N0YXJfZ3JlID0gcGxvdF9zaWduYWwocmF3X3QyX3N0YXJfZ3JlOyBzbGlkZXI9ZmFsc2UpCglhZGR0cmFjZXMhKHNpZ25hbF90Ml9zdGFyX2dyZSwgdDJfZGVjYXkodF9hZGNfZ3JlKSkKCXNpZ25hbF90Ml9zdGFyX2dyZQplbmSobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMLZJDRlMTQzNGUxLTY3M2YtNDIwNi1hMjcxLTllZGVjMTBlYmQ2YYSnY2VsbF9pZNkkNGUxNDM0ZTEtNjczZi00MjA2LWEyNzEtOWVkZWMxMGViZDZhpGNvZGW/a3NwYWNlX3NlID0gcGxvdF9rc3BhY2Uoc2VxX3NlKahtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkMzM1N2EyODMtYTIzNC00ZDE1LThmZGYtN2ZiZWM1OGIzM2E3hKdjZWxsX2lk2SQzMzU3YTI4My1hMjM0LTRkMTUtOGZkZi03ZmJlYzU4YjMzYTekY29kZdoDV21kIiIiCiMgNC4gU3BpbiBFY2hvCgokKFJlc291cmNlKCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vTElCUkVodWIvTVJJLXByb2Nlc3NpbmctMjAyMy9tYWluLzAyLXNpbXVsYXRpb24vRmlndXJlcy9TRS5naWYiLCA6d2lkdGg9PiI0MDBweCIpKQoKVGhlIHNwaW4gZWNobyBleHBlcmltZW50IGhhcyB0aGUgYWR2YW50YWdlIHRoYXQgdGhlIGVjaG8gc2lnbmFsIGFtcGxpdHVkIGl0IGlzIG1vZHVsYXRlZCBieSAkJFxleHAoLXQvVF8yKSQkIGFuZCBub3QgJCRcZXhwKC10L1RfMl57Kn0pJCQuCgpGb3IgdGhpcyBzZWN0aW9uIHdlIHdpbGwgdXNlIHRoZSBwaGFudG9tIGBvYmpfdDJzdGFyYCBhbmQgYSBuZXcgc2VxdWVuY2UgYHNlcV9zZWAuCgpGb3IgdGhpcyBzZXF1ZW5jZSB3ZSB3aWxsIG5lZWQ6CiAtICg0LjEpIEEgOTBkZWcgaGFyZCBSRiBwdWxzZQogLSAoNC4yKSBBIGBEZWxheWAgb2YgJCRcbWF0aHJte1RFfS8yJCQgd2l0aCBhIHBvc2l0aXZlIGdyYWRpZW50IChhcmVhIGBBeGApCiAtICg0LjMpIEEgMTgwZGVnIGhhcmQgUkYgcHVsc2UKIC0gKDQuNCkgQSByZWFkb3V0IGdyYWRpZW50IG9mIGFyZWEgYDJBeGAgd2l0aCBhbiBBREMgKHNpbWlsYXIgdG8gKDIuMikpLCBzdWNoIHRoYXQgdGhlIG1pZGRsZSBvZiB0aGUgZ3JhZGllbnQgYW5kIEFEQyBhcmUgaW4gJCRcbWF0aHJte1RFfSQkCiAtICg0LjUpIENyZWF0ZSBjb25jYXRlbmF0aW5nIHRoZXNlIGJsb2NrcyBpbnRvIGEgc2VxdWVuY2UgY2FsbGVkIGBzZXFfc2VgCiAtICg0LjYpIFBsb3QgYHNlcV9zZWAgYW5kIGl0cyBrLXNwYWNlLiBJcyB0aGUgay1zcGFjZSB0aGUgc2FtZSBhcyBgc2VxX2dyZWAgaW4gKDIuMyk/CiIiIqhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw9kkM2FiY2E0MDYtMmU2Yi00YjM3LTg4MzUtNjVjZmFkOWQwY2FhhKdjZWxsX2lk2SQzYWJjYTQwNi0yZTZiLTRiMzctODgzNS02NWNmYWQ5ZDBjYWGkY29kZdlcIyAoMi40KSBQbG90IHRoZSAkayQtc3BhY2Ugd2l0aCB0aGUgYHBsb3Rfa3NwYWNlYCBmdW5jdGlvbgprc3BhY2VfZ3JlID0gcGxvdF9rc3BhY2Uoc2VxX2dyZSmobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMLZJDA5NzU1NDdkLTY3ZDktNGU2Yi04OGZmLWE5ZGQwNmE3ZjllZoSnY2VsbF9pZNkkMDk3NTU0N2QtNjdkOS00ZTZiLTg4ZmYtYTlkZDA2YTdmOWVmpGNvZGXZcyMgKDEuMykgUGxvdCB0aGUgZ2VuZXJhdGVkIFNlcXVlbmNlCmJlZ2luCglzZXEgPSBTZXF1ZW5jZSgpCglzZXEgKz0gcmYKCXNlcSArPSBhZGMKCXBsb3Rfc2VxKHNlcTsgc2xpZGVyPWZhbHNlKQplbmSobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMLZJDEyMzFiODMyLTQ3YjEtNGNjYi05YjU2LWE2NzgzODU5OGNjN4SnY2VsbF9pZNkkMTIzMWI4MzItNDdiMS00Y2NiLTliNTYtYTY3ODM4NTk4Y2M3pGNvZGXZ6yMgKDEuOCkgSXMgdGhlIHNpZ25hbCB0aGUgc2FtZSBhcyBgcGxvdCh0LCBleHAuKC10IC4vIFQyKSlgPwpiZWdpbgoJdCA9IHJhbmdlKDAsIDUwLCAxMDApCgl0Ml9kZWNheSh0KSA9IHNjYXR0ZXIoeD10LCB5PTIwLjAuKmV4cC4oLXQgLi8gNTApLCBuYW1lPSJUMi1kZWNheSIsIG1hcmtlcl9jb2xvcj0icHVycGxlIikKCXBsb3QodDJfZGVjYXkodCksIExheW91dCh5YXhpc19yYW5nZT1bMCwgMjAuMV0pKQplbmSobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMLZJDAyNjY2MzJkLTVjYTQtNDE5Ni1hNTIzLTMzYTY2ZGQ3MGUwY4SnY2VsbF9pZNkkMDI2NjYzMmQtNWNhNC00MTk2LWE1MjMtMzNhNjZkZDcwZTBjpGNvZGXZOiMgKDEuMikgQW4gQURDIHRvIGNhcHR1cmUgdGhlIHNpZ25hbAphZGMgPSBBREMoMTAwLCA1MGUtMymobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMKrbm90ZWJvb2tfaWTZJGIzYjg0MDhjLTgxODEtMTFlZi0xNGViLWUxYzU2OWI4YmIyOatpbl90ZW1wX2RpcsKobWV0YWRhdGGBq2Zyb250bWF0dGVyg6V0aXRsZdkhVW5kZXJzdGFuZGluZyBiYXNpYyBNUkkgc2VxdWVuY2VzpHRhZ3ORq2VkdWNhdGlvbmFsq2Rlc2NyaXB0aW9u2UJGcmVlIEluZHVjdGlvbiBEZWNheSAoRklEKSwgR3JhZGllbnQgRWNobyAoR0UpLCBhbmQgU3BpbiBFY2hvIChTRSk=";
+window.pluto_statefile = "data:;base64,3gARpWJvbmRzgKxjZWxsX3Jlc3VsdHPeAC7ZJDU4YmU0MTUwLTJiN2EtNGY5ZS1hN2Q3LTQwYTA4NmZkM2E1M4qmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnZdDxzY3JpcHQ+CmNvbnN0IHtkZWZhdWx0OiBjb25mZXR0aX0gPSBhd2FpdCBpbXBvcnQoImh0dHBzOi8vY2RuLnNreXBhY2suZGV2L2NhbnZhcy1jb25mZXR0aUAxIikKY29uZmV0dGkoKQo8L3NjcmlwdD4KpG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv8hO3o0EsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQ1OGJlNDE1MC0yYjdhLTRmOWUtYTdkNy00MGEwODZmZDNhNTO5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4AJF7vtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkZjExYTJmYTItZWZmOS00OTc5LWI3MzktM2RhMmIyNGE5YTQ1iqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedoCLjxkaXYgY2xhc3M9Im1hcmtkb3duIj48cD5HZW5lcmF0ZSBhIHZpcnR1YWwgb2JqZWN0OjwvcD4KPHVsPgo8bGk+PHA+JiM0MDsxLjQmIzQxOyBBIFBoYW50b20gd2l0aCAyMCBzcGlucywgd2l0aCBwcm9wZXJ0aWVzOjwvcD4KPHVsPgo8bGk+PHA+PGNvZGU+b2JqLng8L2NvZGU+ICAmIzYxOyAmIzkxOy0xLCAxJiM5MzsgbW0gJiM0MDsyMCBzcGlucyBhbG9uZyB0aGUgPHNwYW4gY2xhc3M9InRleCI+JHgkPC9zcGFuPi1heGlzJiM0MTs8L3A+CjwvbGk+CjxsaT48cD48Y29kZT5vYmouz4E8L2NvZGU+ICAuJiM2MTsgMTwvcD4KPC9saT4KPGxpPjxwPjxjb2RlPm9iai5UMTwvY29kZT4gLiYjNjE7IDUwMCBtczwvcD4KPC9saT4KPGxpPjxwPjxjb2RlPm9iai5UMjwvY29kZT4gLiYjNjE7IDUwIG1zPC9wPgo8L2xpPgo8L3VsPgo8L2xpPgo8bGk+PHA+JiM0MDsxLjUmIzQxOyBQbG90IHRoZSBnZW5lcmF0ZWQgPGNvZGU+UGhhbnRvbTwvY29kZT4gJiM0MDtjaGVjayA8Y29kZT5wbG90X3BoYW50b21fbWFwPC9jb2RlPiYjMzk7cyBkb2NzJiM0MTs8L3A+CjwvbGk+CjwvdWw+CjwvZGl2PqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b/ILVI9ybBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkZjExYTJmYTItZWZmOS00OTc5LWI3MzktM2RhMmIyNGE5YTQ1uWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAApOz7VwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDk3MTA0YzQ2LWU4MWYtNDQ0YS05NTdmLTBiYmIxYjAyZjFiOIqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnaCe48ZGl2IGNsYXNzPSJtYXJrZG93biI+PGgxPjMuIDxzcGFuIGNsYXNzPSJ0ZXgiPiRUXyYjMTIzOzImIzEyNTteJiMxMjM7KiYjMTI1OyQ8L3NwYW4+LWRlY2F5PC9oMT4KPHA+VGhlIDxzcGFuIGNsYXNzPSJ0ZXgiPiRUXyYjMTIzOzImIzEyNTteJiMxMjM7KiYjMTI1OyQ8L3NwYW4+LWRlY2F5IGlzIHRoZSBzaWduYWwgZGVjYXkgcHJvZHVjZWQgYnkgbWljcm9zY29waWMgZGlzdHJpYnV0aW9uIG9mIG9mZi1yZXNvbmFuY2UuPC9wPgo8aW1nIGNvbnRyb2xzPScnIHNyYz0naHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0xJQlJFaHViL01SSS1wcm9jZXNzaW5nLTIwMjMvbWFpbi8wMi1zaW11bGF0aW9uL0ZpZ3VyZXMvVDJzdGFyLnBuZycgdHlwZT0naW1hZ2UvcG5nJyB3aWR0aD0nNDAwcHgnPjwvaW1nPgo8cD5UaGUgZXhhY3QgZGlzdHJpYnV0aW9uIG9mIG9mZi1yZXNvbmFuY2UgaXM8L3A+CjxwIGNsYXNzPSJ0ZXgiPiQkcF8mIzEyMztcRGVsdGEgdyYjMTI1OyYjNDA7dyYjNDE7ICYjNjE7IFxmcmFjJiMxMjM7VF8yXiYjMTIzOyYjMzk7JiMxMjU7JiMxMjU7JiMxMjM7XHBpJiM0MDsxJiM0MztUXzJeJiMxMjM7JiMzOTsyJiMxMjU7IHdeMiYjNDE7JiMxMjU7LFxxdWFkXHRleHQmIzEyMzt3aXRoICYjMTI1O1xmcmFjJiMxMjM7MSYjMTI1OyYjMTIzO1RfMl4mIzEyMzsqJiMxMjU7JiMxMjU7ICYjNjE7IFxmcmFjJiMxMjM7MSYjMTI1OyYjMTIzO1RfMiYjMTI1OyAmIzQzOyBcZnJhYyYjMTIzOzEmIzEyNTsmIzEyMztUXzJeJiMxMjM7JiMzOTsmIzEyNTsmIzEyNTsuJCQ8L3A+CjxwPkluIHRoaXMgZXhjZXJjaXNlIHdlIHdpbGwgc2ltcGxpZnkgdGhpcyBkaXN0cmlidXRpb24sIGJ1dCB3ZSB3aWxsIG9idGFpbiBhIHNpbWlsYXIgZWZmZWN0LjwvcD4KPHVsPgo8bGk+PHA+JiM0MDszLjEmIzQxOyBDcmVhdGUgYSBuZXcgcGhhbnRvbSBuYW1lZCA8Y29kZT5vYmpfdDJzdGFyPC9jb2RlPiB3aXRoIHNwaW5zIGF0IHRoZSBzYW1lIHBvc2l0aW9ucyBhcyB0aGUgb3JpZ2luYWwgcGhhbnRvbSA8Y29kZT5vYmo8L2NvZGU+LCBlYWNoIGhhdmluZyBhIGxpbmVhciBkaXN0cmlidXRpb24gb2Ygb2ZmLXJlc29uYW5jZS4gVG8gYWNoaWV2ZSB0aGlzLCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPgo8dWw+CjxsaT48cD4mIzQwOzMuMS4xJiM0MTsgQ3JlYXRlIGFuIGVtcHR5IHBoYW50b20gY2FsbGVkIDxjb2RlPm9ial90MnN0YXI8L2NvZGU+LjwvcD4KPC9saT4KPGxpPjxwPiYjNDA7My4xLjImIzQxOyBDcmVhdGUgYSBsaW5lYXIgb2ZmLXJlc29uYW5jZSBkaXN0cmlidXRpb24gc3VjaCB0aGF0IHRoZSByYW5nZSA8c3BhbiBjbGFzcz0idGV4Ij4kMlxwaSAmIzkxOy0xMCwgMTAmIzkzO1wsXG1hdGhybSYjMTIzO3JhZC9zJiMxMjU7JDwvc3Bhbj4gaXMgY292ZXJlZCB1bmlmb3JtbHkgd2l0aCA8c3BhbiBjbGFzcz0idGV4Ij4kTl8mIzEyMztcbWF0aHJtJiMxMjM7aXNvY2hyb21hdHMmIzEyNTsmIzEyNTsgJiM2MTsgMjAkPC9zcGFuPiAmIzQwO3VzZSB0aGUgZnVuY3Rpb24gPGNvZGU+cmFuZ2UmIzQwO3N0YXJ0LCBzdG9wLCBsZW5ndGgmIzQxOzwvY29kZT4mIzQxOy48L3A+CjwvbGk+CjxsaT48cD4mIzQwOzMuMS4zJiM0MTsgSXRlcmF0ZSBvdmVyIHRoZSBlbGVtZW50cyA8Y29kZT5vZmY8L2NvZGU+IG9mIHRoZSBsaW5lYXIgZGlzdHJpYnV0aW9uICYjNDA7PGNvZGU+Zm9yPC9jb2RlPiBsb29wJiM0MTsgYW5kIGNyZWF0ZSBjb3BpZXMgb2YgdGhlIG9yaWdpbmFsIHBoYW50b20gJiM0MDs8Y29kZT5vYmpfYXV4ICYjNjE7IGNvcHkmIzQwO29iaiYjNDE7PC9jb2RlPiYjNDE7IGFuZCBzZXQgdGhlIG9mZi1yZXNvbmFuY2Ugb2YgdGhhdCBjb3B5IHRvIDxjb2RlPm9mZjwvY29kZT4gd2l0aCA8Y29kZT5vYmpfYXV4Ls6UdyAuJiM2MTsgb2ZmPC9jb2RlPi48L3A+CjwvbGk+CjxsaT48cD4mIzQwOzMuMS40JiM0MTsgVXBkYXRlIDxjb2RlPm9ial90MnN0YXI8L2NvZGU+IGJ5IGFwcGVuZGluZyB0aGUgbW9kaWZpZWQgY29waWVzIDxjb2RlPm9ial9hdXg8L2NvZGU+ICYjNDA7PGNvZGU+b2JqX3Qyc3RhciAmIzQzOyYjNjE7IG9ial9hdXg8L2NvZGU+JiM0MTsuPC9wPgo8L2xpPgo8bGk+PHA+JiM0MDszLjEuNSYjNDE7IEZpbmFsbHksIG91dHNpZGUgdGhlIGxvb3AsIGRpdmlkZSB0aGUgcHJvdG9uIGRlbnNpdHkgPGNvZGU+b2JqX3Qyc3Rhci7PgTwvY29kZT4gYnkgPHNwYW4gY2xhc3M9InRleCI+JE5fJiMxMjM7XG1hdGhybSYjMTIzO2lzb2Nocm9tYXRzJiMxMjU7JiMxMjU7ICYjNjE7IDIwJDwvc3Bhbj4gYW5kIHJlbmFtZSB0aGUgcGhhbnRvbSA8Y29kZT5vYmpfdDJzdGFyLm5hbWUgJiM2MTsgJnF1b3Q7VDIgc3RhciBwaGFudG9tJnF1b3Q7PC9jb2RlPi48L3A+CjwvbGk+CjwvdWw+CjwvbGk+CjxsaT48cD4mIzQwOzMuMiYjNDE7IFBsb3QgPGNvZGU+b2JqX3Qyc3RhcjwvY29kZT4gd2l0aCA8Y29kZT5wbG90X3BoYW50b21fbWFwJiM0MDtvYmpfdDJzdGFyLCA6zpR3JiM0MTs8L2NvZGU+IGFuZCB2ZXJpZnkgaXQgaXMgY29ycmVjdDwvcD4KPC9saT4KPC91bD4KPC9kaXY+pG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv8hORi8WsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQ5NzEwNGM0Ni1lODFmLTQ0NGEtOTU3Zi0wYmJiMWIwMmYxYji5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4AE0SDtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkZTRjODBjMjQtMjBmZC00MmU1LTlkY2QtYTY1OTU4NTY5YzAxiqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedoGkjxkaXYgY2xhc3M9Im1hcmtkb3duIj48aDE+Mi4gR3JhZGllbnQgRWNobzwvaDE+CjxpbWcgY29udHJvbHM9Jycgc3JjPSdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vTElCUkVodWIvTVJJLXByb2Nlc3NpbmctMjAyMy9tYWluLzAyLXNpbXVsYXRpb24vRmlndXJlcy9HUkUuZ2lmJyB0eXBlPSdpbWFnZS9naWYnIHdpZHRoPSc0MDBweCc+PC9pbWc+CjxwPlRoZSBncmFkaWVudCBlY2hvIGlzIG9uZSBvZiB0aGUgZmlyc3Qgc3RlcHMgdG8gY3JlYXRlIGFuIGltYWdlLiBUaGUgYmlnICBicmVha3Rocm91Z2ggd2FzIHRoZSBhZGRpdGlvbiBvZiBsaW5lYXJseSBpbmNyZWFzaW5nIG1hZ25ldGljIGZpZWxkcywgb3IgZ3JhZGllbnRzLCB0byBlbmNvZGUgdGhlIHNwaW4mIzM5O3MgcG9zaXRpb25zIGluIHRoZWlyIGZyZXF1ZW5jeSAmIzQwO01tbWgsIHNvbWVvbmUgc2FpZCBGb3VyaWVyPyYjNDE7LiBUaGlzIHdvcmtzIGR1ZSB0byB0aGUgZmFjdCB0aGF0IHRoZSBmcmVxdWVuY3kgPHNwYW4gY2xhc3M9InRleCI+JGYkPC9zcGFuPiBvZiBhIHNwaW4gaXMgPC9wPgo8cCBjbGFzcz0idGV4Ij4kJGYmIzQwO3gmIzQxOyAmIzYxOyBcZnJhYyYjMTIzO1xnYW1tYSYjMTI1OyYjMTIzOzJccGkmIzEyNTsgQl96JiM0MDt4JiM0MTsgJiM2MTsgXGZyYWMmIzEyMztcZ2FtbWEmIzEyNTsmIzEyMzsyXHBpJiMxMjU7IEdfeCB4LiQkPC9wPgo8cD5MZXQmIzM5O3MgY3JlYXRlIGEgZGlmZmVyZW50IHNlcXVlbmNlLjwvcD4KPHVsPgo8bGk+PHA+Q3JlYXRlIGEgOTAtZGVnIGhhcmQgUkYgcHVsc2UgYW5kIHB1dCBpdCBpbiBhIHZhcmlhYmxlIDxjb2RlPnNlcV9ncmU8L2NvZGU+PC9wPgo8L2xpPgo8bGk+PHA+JiM0MDsyLjEmIzQxOyBDcmVhdGUgYSBncmFkaWVudCB3aXRoIGFyZWEgPGNvZGU+LUF4PC9jb2RlPiB1c2luZyA8Y29kZT5neF9wcmUgJiM2MTsgR3JhZCYjNDA7QSxULHJpc2UsZmFsbCYjNDE7PC9jb2RlPiBhcHBlbmQgdG8gPGNvZGU+c2VxX2dyZTwvY29kZT4uIEFzIGFuIG9wdGlvbmFsIGNoYWxsZW5nZSwgcHV0IDxjb2RlPmd4X3ByZS5yaXNlPC9jb2RlPiBhbmQgPGNvZGU+Z3hfcHJlLmZhbGw8L2NvZGU+IHNvIHRoZSBzYXRpc2Z5IHRoZSA8Y29kZT5zeXM8L2NvZGU+IHJlcXVpZXJlbWVudHM8L3A+CjwvbGk+CjxsaT48cD4mIzQwOzIuMiYjNDE7IEFwcGVuZCBhIDxjb2RlPlNlcXVlbmNlPC9jb2RlPiBibG9jayBjYWxsZWQgPGNvZGU+cmVhZG91dDwvY29kZT4gdGhhdCBpbmNsdWRlczogPC9wPgo8dWw+CjxsaT48cD5BIGdyYWRpZW50IG9mIHR3aWNlIHRoZSBhcmVhLCBvciA8Y29kZT4yQXg8L2NvZGU+LiBDYWxsIGl0IDxjb2RlPmd4PC9jb2RlPjwvcD4KPC9saT4KPGxpPjxwPkFuIDxjb2RlPkFEQzwvY29kZT4gd2l0aCA8Y29kZT5hZGMyLmRlbGF5ICYjNjE7IGd4LnJpc2U8L2NvZGU+IGFuZCA8Y29kZT5hZGMyLlQgJiM2MTsgZ3guVDwvY29kZT48L3A+CjwvbGk+CjwvdWw+CjwvbGk+CjxsaT48cD4mIzQwOzIuMyYjNDE7IFBsb3QgPGNvZGU+c2VxX2dyZTwvY29kZT4gYW5kIGl0cyBrLXNwYWNlPC9wPgo8L2xpPgo8bGk+PHA+JiM0MDsyLjQmIzQxOyBQbG90IHRoZSA8c3BhbiBjbGFzcz0idGV4Ij4kayQ8L3NwYW4+LXNwYWNlIHdpdGggdGhlIDxjb2RlPnBsb3Rfa3NwYWNlPC9jb2RlPiBmdW5jdGlvbjwvcD4KPC9saT4KPC91bD4KPC9kaXY+pG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv8hNAndksHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SRlNGM4MGMyNC0yMGZkLTQyZTUtOWRjZC1hNjU5NTg1NjljMDG5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4Acp/VtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkMThjODJmZjEtMGJkZS00ZmEwLTg0OGMtZDBlYjczZDFhYzdjiqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedpqiQk8c2NyaXB0IGlkPSdwbG90XzEnPgoJCS8vIFdlIHN0YXJ0IGJ5IHB1dHRpbmcgYWxsIHRoZSB2YXJpYWJsZSBpbnRlcnBvbGF0aW9uIGhlcmUgYXQgdGhlIGJlZ2lubmluZwoJCS8vIFdlIGhhdmUgdG8gY29udmVydCBhbGwgdHlwZWRhcnJheXMgaW4gdGhlIGxheW91dCB0byBub3JtYWwgYXJyYXlzLiBTZWUgSXNzdWUgIzI1CgkJLy8gV2UgdXNlIGxvZGFzaCBmb3IgdGhpcyBmb3IgY29tcGFjdG5lc3MKCQlmdW5jdGlvbiByZW1vdmVUeXBlZEFycmF5KG8pIHsKCQkJcmV0dXJuIF8uaXNUeXBlZEFycmF5KG8pID8gQXJyYXkuZnJvbShvKSA6CgkJCV8uaXNQbGFpbk9iamVjdChvKSA/IF8ubWFwVmFsdWVzKG8sIHJlbW92ZVR5cGVkQXJyYXkpIDogCgkJCW8KCQl9CgoJCS8vIFB1Ymxpc2ggdGhlIHBsb3Qgb2JqZWN0IHRvIEpTCgkJbGV0IHBsb3Rfb2JqID0gXy51cGRhdGUoLyogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBBYnN0cmFjdFBsdXRvRGluZ2V0amVzLkRpc3BsYXkucHVibGlzaGVkX3RvX2pzICovIGdldFB1Ymxpc2hlZE9iamVjdCgiN2JjYzA1YjAtODFkYS0xMWVmLTIwNDAtMzU4NWM5YjQ5NTRmL2U4MjQxYjJlNTU1NTYyOTQiKSwgImxheW91dCIsIHJlbW92ZVR5cGVkQXJyYXkpCgkJLy8gR2V0IHRoZSBwbG90bHkgbGlzdGVuZXJzCgkJY29uc3QgcGxvdGx5X2xpc3RlbmVycyA9IHt9CgkJLy8gR2V0IHRoZSBKUyBsaXN0ZW5lcnMKCQljb25zdCBqc19saXN0ZW5lcnMgPSB7fQoJCS8vIERlYWwgd2l0aCBldmVudHVhbCBjdXN0b20gY2xhc3NlcwoJCWxldCBjdXN0b21fY2xhc3NsaXN0ID0gW10KCgoJCS8vIExvYWQgdGhlIHBsb3RseSBsaWJyYXJ5CgkJbGV0IFBsb3RseSA9IHVuZGVmaW5lZAoJCXRyeSB7CgkJCWxldCBfbW9kID0gYXdhaXQgaW1wb3J0KCIuL3Bsb3RseWpzL3Bsb3RseWpzLTIuMjYuMi5taW4uanMiKQoJCQlQbG90bHkgPSBfbW9kLmRlZmF1bHQKCQl9IGNhdGNoIChlKSB7CgkJCWNvbnNvbGUubG9nKCJMb2NhbCBsb2FkIGZhaWxlZCwgdHJ5aW5nIHdpdGggdGhlIHdlYiBlc20uc2ggdmVyc2lvbiIpCgkJCWxldCBfbW9kID0gYXdhaXQgaW1wb3J0KCJodHRwczovL2VzbS5zaC92MTM1L3Bsb3RseS5qcy1kaXN0LW1pbkAyLjI2LjIvZXNuZXh0L3Bsb3RseS5qcy1kaXN0LW1pbi5tanMiKQoJCQlQbG90bHkgPSBfbW9kLmRlZmF1bHQKCQl9CgoJCS8vIENoZWNrIGlmIHdlIGhhdmUgdG8gZm9yY2UgbG9jYWwgbWF0aGpheCBmb250IGNhY2hlCgkJaWYgKGZhbHNlICYmIHdpbmRvdz8uTWF0aEpheD8uY29uZmlnPy5zdmc/LmZvbnRDYWNoZSA9PT0gJ2dsb2JhbCcpIHsKCQkJd2luZG93Lk1hdGhKYXguY29uZmlnLnN2Zy5mb250Q2FjaGUgPSAnbG9jYWwnCgkJfQoKCQkvLyBGbGFnIHRvIGNoZWNrIGlmIHRoaXMgY2VsbCB3YXMgIG1hbnVhbGx5IHJhbiBvciByZWFjdGl2ZWx5IHJhbgpjb25zdCBmaXJzdFJ1biA9IHRoaXMgPyBmYWxzZSA6IHRydWUKY29uc3QgQ09OVEFJTkVSID0gdGhpcyA/PyBodG1sYDxkaXYgY2xhc3M9J3BsdXRvcGxvdGx5LWNvbnRhaW5lcic+YApjb25zdCBQTE9UID0gQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoJy5qcy1wbG90bHktcGxvdCcpID8/IENPTlRBSU5FUi5hcHBlbmRDaGlsZChodG1sYDxkaXY+YCkKY29uc3QgcGFyZW50ID0gQ09OVEFJTkVSLnBhcmVudEVsZW1lbnQKLy8gV2UgdXNlIGEgY29udHJvbGxlciB0byByZW1vdmUgZXZlbnQgbGlzdGVuZXJzIHVwb24gaW52YWxpZGF0aW9uCmNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCkKLy8gV2UgaGF2ZSB0byBhZGQgdGhpcyB0byBrZWVwIHN1cHBvcnRpbmcgQGJpbmQgd2l0aCB0aGUgb2xkIEFQSSB1c2luZyBQTE9UClBMT1QuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoZSkgPT4gewoJQ09OVEFJTkVSLnZhbHVlID0gUExPVC52YWx1ZQoJaWYgKGUuYnViYmxlcykgewoJCXJldHVybgoJfQoJQ09OVEFJTkVSLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdpbnB1dCcpKQp9LCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSkKCgkvLyBUaGlzIGNyZWF0ZSB0aGUgc3R5bGUgc3ViZGl2IG9uIGZpcnN0IHJ1bgoJZmlyc3RSdW4gJiYgQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgCgk8c3R5bGU+CgkucGx1dG9wbG90bHktY29udGFpbmVyIHsKCQl3aWR0aDogMTAwJTsKCQloZWlnaHQ6IDEwMCU7CgkJbWluLWhlaWdodDogMDsKCQltaW4td2lkdGg6IDA7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyIC5qcy1wbG90bHktcGxvdCAucGxvdGx5IGRpdiB7CgkJbWFyZ2luOiAwIGF1dG87IC8vIFRoaXMgY2VudGVycyB0aGUgcGxvdAoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5wb3BwZWQtb3V0IHsKCQlvdmVyZmxvdzogYXV0bzsKCQl6LWluZGV4OiAxMDAwOwoJCXBvc2l0aW9uOiBmaXhlZDsKCQlyZXNpemU6IGJvdGg7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwcHg7CgkJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDBweDsKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIHsKCQlkaXNwbGF5OiBmbGV4OwoJCWZsZXgtZmxvdzogcm93IHdyYXA7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMTJweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMTJweDsKCQlwb3NpdGlvbjogZml4ZWQ7CgkJei1pbmRleDogMTAwMTsKCQljdXJzb3I6IG1vdmU7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCAtMTAwJSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgc3BhbiB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCWZsZXg6IDEKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyLmhpZGRlbiB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3BhbiB7CgkJcG9zaXRpb246IHJlbGF0aXZlOwoJfQoJLmNsaXBib2FyZC12YWx1ZSB7CgkJcGFkZGluZy1yaWdodDogNXB4OwoJCXBhZGRpbmctbGVmdDogMnB4OwoJCWN1cnNvcjogdGV4dDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZmlsZW5hbWUgewoJCWZsZXg6IDAgMCAxMDAlOwoJCXRleHQtYWxpZ246IGNlbnRlcjsKCQlib3JkZXItdG9wOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJbWFyZ2luLXRvcDogNXB4OwoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5maWxlbmFtZSB7CgkJbWFyZ2luLWxlZnQ6IDNweDsKCQl0ZXh0LWFsaWduOiBsZWZ0OwoJCW1pbi13aWR0aDogbWluKDYwJSwgbWluLWNvbnRlbnQpOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5maWxlc2F2ZSAuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgLmxhYmVsIHsKCQlmbGV4OiAwIDAgMDsKCX0KCS5jbGlwYm9hcmQtdmFsdWUuZm9ybWF0IHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7CgkJZmxleDogMSAwIGF1dG87CgkJbWluLXdpZHRoOiAzMHB4OwoJCW1hcmdpbi1yaWdodDogMTBweDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyB7CgkJZGlzcGxheTogaW5saW5lLWZsZXg7CgkJZmxleC1mbG93OiBjb2x1bW47CgkJcG9zaXRpb246IGFic29sdXRlOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJcGFkZGluZy1sZWZ0OiAzcHg7CgkJei1pbmRleDogMjAwMDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9uczpob3ZlciB7CgkJY3Vyc29yOiBwb2ludGVyOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCXBhZGRpbmc6IDNweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtM3B4LCAtNnB4KTsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyAuZm9ybWF0LW9wdGlvbiB7CgkJZGlzcGxheTogbm9uZTsKCX0KCWRpdi5mb3JtYXQtb3B0aW9uczpob3ZlciAuZm9ybWF0LW9wdGlvbiB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246bm90KC5zZWxlY3RlZCkgewoJCW1hcmdpbi10b3A6IDNweDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyAuZm9ybWF0LW9wdGlvbi5zZWxlY3RlZCB7CgkJb3JkZXI6IC0xOwoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5mb3JtYXQtb3B0aW9uOmhvdmVyIHsKCQliYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCX0KCXNwYW4uY29uZmlnLXZhbHVlIHsKCQlmb250LXdlaWdodDogbm9ybWFsOwoJCWNvbG9yOiB2YXIoLS1wbHV0by1vdXRwdXQtY29sb3IpOwoJCWRpc3BsYXk6IG5vbmU7CgkJcG9zaXRpb246IGFic29sdXRlOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCBjYWxjKC0xMDAlIC0gMTBweCkpOwoJCXBhZGRpbmc6IDVweDsKCX0KCS5sYWJlbCB7CgkJdXNlci1zZWxlY3Q6IG5vbmU7Cgl9CgkubGFiZWw6aG92ZXIgc3Bhbi5jb25maWctdmFsdWUgewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQltaW4td2lkdGg6IDE1MHB4OwoJfQoJLmNsaXBib2FyZC1zcGFuLm1hdGNoaW5nLWNvbmZpZyAubGFiZWwgewoJCWNvbG9yOiB2YXIoLS1jbS1tYWNyby1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZGlmZmVyZW50LWNvbmZpZyAubGFiZWwgewoJCWNvbG9yOiB2YXIoLS1jbS10YWctY29sb3IpOwoJCWZvbnQtd2VpZ2h0OiBib2xkOwoJfQo8L3N0eWxlPgpgKQoKbGV0IG9yaWdpbmFsX2hlaWdodCA9IHBsb3Rfb2JqLmxheW91dC5oZWlnaHQKbGV0IG9yaWdpbmFsX3dpZHRoID0gcGxvdF9vYmoubGF5b3V0LndpZHRoCi8vIEZvciB0aGUgaGVpZ2h0IHdlIGhhdmUgdG8gYWxzbyBwdXQgYSBmaXhlZCB2YWx1ZSBpbiBjYXNlIHRoZSBwbG90IGlzIHB1dCBvbiBhIG5vbi1maXhlZC1zaXplIGNvbnRhaW5lciAobGlrZSB0aGUgZGVmYXVsdCB3cmFwcGVyKQovLyBXZSBkZWZpbmUgYSB2YXJpYWJsZSB0byBjaGVjayB3aGV0aGVyIHdlIHN0aWxsIGhhdmUgdG8gcmVtb3ZlIHRoZSBmaXhlZCBoZWlnaHQKbGV0IHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IGZpcnN0UnVuCmxldCBjb250YWluZXJfaGVpZ2h0ID0gb3JpZ2luYWxfaGVpZ2h0ID8/IFBMT1QuY29udGFpbmVyX2hlaWdodCA/PyA0MDAKQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9IGNvbnRhaW5lcl9oZWlnaHQgKyAncHgnCgovLyBXZSBjcmVhdGUgYSBQcm9taXNlIHZlcnNpb24gb2Ygc2V0VGltZW91dApmdW5jdGlvbiBkZWxheShtcykgewogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpOwp9CgovLyBXZSBpbXBvcnQgaW50ZXJhY3QgZm9yIGRyYWdnaW5nL3Jlc2l6aW5nCmNvbnN0IHsgZGVmYXVsdDogaW50ZXJhY3QgfSA9IGF3YWl0IGltcG9ydCgnaHR0cHM6Ly9lc20uc2gvaW50ZXJhY3Rqc0AxLjEwLjE5JykKCgpmdW5jdGlvbiBnZXRJbWFnZU9wdGlvbnMoKSB7CiAgY29uc3QgbyA9IHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICByZXR1cm4gewogICAgZm9ybWF0OiBvLmZvcm1hdCA/PyAicG5nIiwKICAgIHdpZHRoOiBvLndpZHRoID8/IG9yaWdpbmFsX3dpZHRoLAogICAgaGVpZ2h0OiBvLmhlaWdodCA/PyBvcmlnaW5hbF9oZWlnaHQsCiAgICBzY2FsZTogby5zY2FsZSA/PyAxLAogICAgZmlsZW5hbWU6IG8uZmlsZW5hbWUgPz8gIm5ld3Bsb3QiLAogIH07Cn0KCmNvbnN0IENMSVBCT0FSRF9IRUFERVIgPQogIENPTlRBSU5FUi5xdWVyeVNlbGVjdG9yKCIucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciIpID8/CiAgQ09OVEFJTkVSLmluc2VydEFkamFjZW50RWxlbWVudCgKICAgICJhZnRlcmJlZ2luIiwKICAgIGh0bWxgPGRpdiBjbGFzcz0icGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBoaWRkZW4iPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gZm9ybWF0IgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZvcm1hdDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBmb3JtYXQiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gd2lkdGgiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+V2lkdGg6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgd2lkdGgiPjwvc3Bhbj5weDwvc3BhbgogICAgICA+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBoZWlnaHQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+SGVpZ2h0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGhlaWdodCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHNjYWxlIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPlNjYWxlOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIHNjYWxlIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2V0Ij5TZXQ8L2J1dHRvbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gdW5zZXQiPlVuc2V0PC9idXR0b24+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmaWxlbmFtZSIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5GaWxlbmFtZTo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBmaWxlbmFtZSI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICA8L2Rpdj5gCiAgKTsKCmZ1bmN0aW9uIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpIHsKICBjb25zdCB2YWxpZF9jbGFzc2VzID0gWwogICAgIm1pc3NpbmctY29uZmlnIiwKICAgICJtYXRjaGluZy1jb25maWciLAogICAgImRpZmZlcmVudC1jb25maWciLAogIF07CiAgZnVuY3Rpb24gc2V0Q2xhc3MoY2wpIHsKICAgIGZvciAoY29uc3QgbmFtZSBvZiB2YWxpZF9jbGFzc2VzKSB7CiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKG5hbWUsIG5hbWUgPT0gY2wpOwogICAgfQogIH0KICAvLyBXZSB1c2UgdGhlIGN1c3RvbSBnZXR0ZXJzIHdlJ2xsIHNldCB1cCBpbiB0aGUgY29udGFpbmVyCiAgY29uc3QgeyB1aV92YWx1ZSwgY29uZmlnX3ZhbHVlLCBjb25maWdfc3Bhbiwga2V5IH0gPSBjb250YWluZXI7CiAgaWYgKGNvbmZpZ192YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICBzZXRDbGFzcygibWlzc2luZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaXMgbm90IHByZXNlbnQgaW4gdGhlIGNvbmZpZy5gOwogIH0gZWxzZSBpZiAodWlfdmFsdWUgPT0gY29uZmlnX3ZhbHVlKSB7CiAgICBzZXRDbGFzcygibWF0Y2hpbmctY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGhhcyB0aGUgc2FtZSB2YWx1ZSBpbiB0aGUgY29uZmlnIGFuZCBpbiB0aGUgaGVhZGVyLmA7CiAgfSBlbHNlIHsKICAgIHNldENsYXNzKCJkaWZmZXJlbnQtY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGhhcyBhIGRpZmZlcmVudCB2YWx1ZSAoPGVtPiR7Y29uZmlnX3ZhbHVlfTwvZW0+KSBpbiB0aGUgY29uZmlnLmA7CiAgfQogIC8vIEFkZCBpbmZvIGFib3V0IHNldHRpbmcgYW5kIHVuc2V0dGluZwogIGNvbmZpZ19zcGFuLmluc2VydEFkamFjZW50SFRNTCgKICAgICJiZWZvcmVlbmQiLAogICAgYDxicj5DbGljayBvbiB0aGUgbGFiZWwgPGVtPjxiPm9uY2U8L2I+PC9lbT4gdG8gc2V0IHRoZSBjdXJyZW50IFVJIHZhbHVlIGluIHRoZSBjb25maWcuYAogICk7CiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIDxlbT48Yj50d2ljZTwvYj48L2VtPiB0byByZW1vdmUgdGhpcyBrZXkgZnJvbSB0aGUgY29uZmlnLmAKICApOwp9Cgpjb25zdCB2YWxpZF9mb3JtYXRzID0gWyJwbmciLCAic3ZnIiwgIndlYnAiLCAianBlZyIsICJmdWxsLWpzb24iXTsKZnVuY3Rpb24gaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHNwYW4sIGtleSwgdmFsdWUpIHsKICBjb25zdCBjb250YWluZXIgPSBzcGFuLmNsb3Nlc3QoIi5jbGlwYm9hcmQtc3BhbiIpOwogIHNwYW4uY29udGVudEVkaXRhYmxlID0ga2V5ID09PSAiZm9ybWF0IiA/ICJmYWxzZSIgOiAidHJ1ZSI7CiAgbGV0IHBhcnNlID0gKHgpID0+IHg7CiAgbGV0IHVwZGF0ZSA9ICh4KSA9PiAoc3Bhbi50ZXh0Q29udGVudCA9IHgpOwogIGlmIChrZXkgPT09ICJ3aWR0aCIgfHwga2V5ID09PSAiaGVpZ2h0IikgewogICAgcGFyc2UgPSAoeCkgPT4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KHgpKTsKICB9IGVsc2UgaWYgKGtleSA9PT0gInNjYWxlIikgewogICAgcGFyc2UgPSBwYXJzZUZsb2F0OwogIH0gZWxzZSBpZiAoa2V5ID09PSAiZm9ybWF0IikgewogICAgLy8gV2UgcmVtb3ZlIGNvbnRlbnRFZGl0YWJsZQogICAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSAiZmFsc2UiOwogICAgLy8gSGVyZSB3ZSBmaXJzdCBhZGQgdGhlIHN1YnNwYW5zIGZvciBlYWNoIG9wdGlvbgogICAgY29uc3Qgb3B0c19kaXYgPSBzcGFuLmFwcGVuZENoaWxkKGh0bWxgPGRpdiBjbGFzcz0iZm9ybWF0LW9wdGlvbnMiPjwvZGl2PmApOwogICAgZm9yIChjb25zdCBmbXQgb2YgdmFsaWRfZm9ybWF0cykgewogICAgICBjb25zdCBvcHQgPSBvcHRzX2Rpdi5hcHBlbmRDaGlsZCgKICAgICAgICBodG1sYDxzcGFuIGNsYXNzPSJmb3JtYXQtb3B0aW9uICR7Zm10fSI+JHtmbXR9PC9zcGFuPmAKICAgICAgKTsKICAgICAgb3B0Lm9uY2xpY2sgPSAoZSkgPT4gewogICAgICAgIHNwYW4udmFsdWUgPSBvcHQudGV4dENvbnRlbnQ7CiAgICAgIH07CiAgICB9CiAgICBwYXJzZSA9ICh4KSA9PiB7CiAgICAgIHJldHVybiB2YWxpZF9mb3JtYXRzLmluY2x1ZGVzKHgpID8geCA6IGxvY2FsVmFsdWU7CiAgICB9OwogICAgdXBkYXRlID0gKHgpID0+IHsKICAgICAgZm9yIChjb25zdCBvcHQgb2Ygb3B0c19kaXYuY2hpbGRyZW4pIHsKICAgICAgICBvcHQuY2xhc3NMaXN0LnRvZ2dsZSgic2VsZWN0ZWQiLCBvcHQudGV4dENvbnRlbnQgPT09IHgpOwogICAgICB9CiAgICB9OwogIH0gZWxzZSB7CiAgICAvLyBXZSBvbmx5IGhhdmUgZmlsZW5hbWUgaGVyZQogIH0KICBsZXQgbG9jYWxWYWx1ZTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBsb2NhbFZhbHVlOwogICAgfSwKICAgIHNldDogKHZhbCkgPT4gewogICAgICBpZiAodmFsICE9PSAiIikgewogICAgICAgIGxvY2FsVmFsdWUgPSBwYXJzZSh2YWwpOwogICAgICB9CiAgICAgIHVwZGF0ZShsb2NhbFZhbHVlKTsKICAgICAgY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcik7CiAgICB9LAogIH0pOwogIC8vIFdlIGFsc28gYXNzaWduIGEgbGlzdGVuZXIgc28gdGhhdCB0aGUgZWRpdGFibGUgaXMgYmx1cnJlZCB3aGVuIGVudGVyIGlzIHByZXNzZWQKICBzcGFuLm9ua2V5ZG93biA9IChlKSA9PiB7CiAgICBpZiAoZS5rZXlDb2RlID09PSAxMykgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHNwYW4uYmx1cigpOwogICAgfQogIH07CiAgc3Bhbi52YWx1ZSA9IHZhbHVlOwp9CgpmdW5jdGlvbiBpbml0aWFsaXplQ29uZmlnVmFsdWVTcGFuKHNwYW4sIGtleSkgewogIC8vIEhlcmUgd2UgbW9zdGx5IHdhbnQgdG8gZGVmaW5lIHRoZSBzZXR0ZXIgYW5kIGdldHRlcgogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwYW4sICJ2YWx1ZSIsIHsKICAgIGdldDogKCkgPT4gewogICAgICByZXR1cm4gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV07CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIC8vIGlmIHVuZGVmaW5lZCBpcyBwYXNzZWQsIHdlIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgb3B0aW9ucwogICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsKICAgICAgICBkZWxldGUgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV0gPSB2YWw7CiAgICAgIH0KICAgICAgY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcik7CiAgICB9LAogIH0pOwp9Cgpjb25zdCBjb25maWdfc3BhbnMgPSB7fTsKZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZ2V0SW1hZ2VPcHRpb25zKCkpKSB7CiAgY29uc3QgY29udGFpbmVyID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKGAuY2xpcGJvYXJkLXNwYW4uJHtrZXl9YCk7CiAgY29uc3QgbGFiZWwgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmxhYmVsIik7CiAgLy8gV2UgZ2l2ZSB0aGUgbGFiZWwgYSBmdW5jdGlvbiB0aGF0IG9uIHNpbmdsZSBjbGljayB3aWxsIHNldCB0aGUgY3VycmVudCB2YWx1ZSBhbmQgd2l0aCBkb3VibGUgY2xpY2sgd2lsbCB1bnNldCBpdAogIGxhYmVsLm9uY2xpY2sgPSBEdWFsQ2xpY2soCiAgICAoKSA9PiB7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBjb250YWluZXIudWlfdmFsdWU7CiAgICB9LAogICAgKGUpID0+IHsKICAgICAgY29uc29sZS5sb2coImUiLCBlKTsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gdW5kZWZpbmVkOwogICAgfQogICk7CiAgY29uc3QgdWlfdmFsdWVfc3BhbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXZhbHVlIik7CiAgY29uc3QgY29uZmlnX3ZhbHVlX3NwYW4gPQogICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jb25maWctdmFsdWUiKSA/PwogICAgbGFiZWwuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgICAiYWZ0ZXJiZWdpbiIsCiAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImNvbmZpZy12YWx1ZSI+PC9zcGFuPmAKICAgICk7CiAgLy8gQXNzaW5nIHRoZSB0d28gc3BhbnMgYXMgcHJvcGVydGllcyBvZiB0aGUgY29udGFpbmluZyBzcGFuCiAgY29udGFpbmVyLnVpX3NwYW4gPSB1aV92YWx1ZV9zcGFuOwogIGNvbnRhaW5lci5jb25maWdfc3BhbiA9IGNvbmZpZ192YWx1ZV9zcGFuOwogIGNvbnRhaW5lci5rZXkgPSBrZXk7CiAgY29uZmlnX3NwYW5zW2tleV0gPSBjb250YWluZXI7CiAgaWYgKGZpcnN0UnVuKSB7CiAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPQogICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPz8ge307CiAgICAvLyBXZSBkbyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHZhbHVlIHNwYW4KICAgIGluaXRpYWxpemVVSVZhbHVlU3Bhbih1aV92YWx1ZV9zcGFuLCBrZXksIHZhbHVlKTsKICAgIC8vIFRoZW4gd2UgaW5pdGlhbGl6ZSB0aGUgY29uZmlnIHZhbHVlCiAgICBpbml0aWFsaXplQ29uZmlnVmFsdWVTcGFuKGNvbmZpZ192YWx1ZV9zcGFuLCBrZXkpOwogICAgLy8gV2UgcHV0IHNvbWUgY29udmVuaWVuY2UgZ2V0dGVycy9zZXR0ZXJzCiAgICAvLyB1aV92YWx1ZSBmb3J3YXJkCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAidWlfdmFsdWUiLCB7CiAgICAgIGdldDogKCkgPT4gdWlfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgdWlfdmFsdWVfc3Bhbi52YWx1ZSA9IHZhbDsKICAgICAgfSwKICAgIH0pOwogICAgLy8gY29uZmlnX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJjb25maWdfdmFsdWUiLCB7CiAgICAgIGdldDogKCkgPT4gY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUsCiAgICAgIHNldDogKHZhbCkgPT4gewogICAgICAgIGNvbmZpZ192YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgfQp9CgovLyBUaGVzZSBvYmplY3RzIHdpbGwgY29udGFpbiB0aGUgZGVmYXVsdCB2YWx1ZQoKLy8gVGhpcyBjb2RlIHVwZGF0ZXMgdGhlIGltYWdlIG9wdGlvbnMgaW4gdGhlIFBMT1QgY29uZmlnIHdpdGggdGhlIHByb3ZpZGVkIG9uZXMKZnVuY3Rpb24gc2V0SW1hZ2VPcHRpb25zKG8pIHsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IG9ba2V5XTsKICB9Cn0KZnVuY3Rpb24gdW5zZXRJbWFnZU9wdGlvbnMoKSB7CiAgc2V0SW1hZ2VPcHRpb25zKHt9KTsKfQoKY29uc3Qgc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnNldCIpOwpjb25zdCB1bnNldF9idXR0b24gPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtc3Bhbi51bnNldCIpOwppZiAoZmlyc3RSdW4pIHsKICBzZXRfYnV0dG9uLm9uY2xpY2sgPSAoZSkgPT4gewogICAgZm9yIChjb25zdCBjb250YWluZXIgb2YgT2JqZWN0LnZhbHVlcyhjb25maWdfc3BhbnMpKSB7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBjb250YWluZXIudWlfdmFsdWU7CiAgICB9CiAgfTsKICB1bnNldF9idXR0b24ub25jbGljayA9IHVuc2V0SW1hZ2VPcHRpb25zOwp9CgovLyBXZSBhZGQgYSBmdW5jdGlvbiB0byBjaGVjayBpZiB0aGUgY2xpcGJvYXJkIGlzIHBvcHBlZCBvdXQKQ09OVEFJTkVSLmlzUG9wcGVkT3V0ID0gKCkgPT4gewogIHJldHVybiBDT05UQUlORVIuY2xhc3NMaXN0LmNvbnRhaW5zKCJwb3BwZWQtb3V0Iik7Cn07CgpDTElQQk9BUkRfSEVBREVSLm9ubW91c2Vkb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgaWYgKGV2ZW50LnRhcmdldC5tYXRjaGVzKCJzcGFuLmNsaXBib2FyZC12YWx1ZSIpKSB7CiAgICBjb25zb2xlLmxvZygiV2UgZG9uJ3QgbW92ZSEiKTsKICAgIHJldHVybjsKICB9CiAgY29uc3Qgc3RhcnQgPSB7CiAgICBsZWZ0OiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS5sZWZ0KSwKICAgIHRvcDogcGFyc2VGbG9hdChDT05UQUlORVIuc3R5bGUudG9wKSwKICAgIFg6IGV2ZW50LnBhZ2VYLAogICAgWTogZXZlbnQucGFnZVksCiAgfTsKICBmdW5jdGlvbiBtb3ZlQXQoZXZlbnQsIHN0YXJ0KSB7CiAgICBjb25zdCB0b3AgPSBldmVudC5wYWdlWSAtIHN0YXJ0LlkgKyBzdGFydC50b3AgKyAicHgiOwogICAgY29uc3QgbGVmdCA9IGV2ZW50LnBhZ2VYIC0gc3RhcnQuWCArIHN0YXJ0LmxlZnQgKyAicHgiOwogICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gbGVmdDsKICAgIENPTlRBSU5FUi5zdHlsZS5sZWZ0ID0gbGVmdDsKICAgIENPTlRBSU5FUi5zdHlsZS50b3AgPSB0b3A7CiAgfQoKICAvLyBtb3ZlIG91ciBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYmFsbCB1bmRlciB0aGUgcG9pbnRlcgogIG1vdmVBdChldmVudCwgc3RhcnQpOwogIGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGV2ZW50KSB7CiAgICBtb3ZlQXQoZXZlbnQsIHN0YXJ0KTsKICB9CgogIC8vIFdlIHVzZSB0aGlzIHRvIHJlbW92ZSB0aGUgbW91c2Vtb3ZlIHdoZW4gY2xpY2tpbmcgb3V0c2lkZSBvZiB0aGUgY29udGFpbmVyCiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgLy8gbW92ZSB0aGUgY29udGFpbmVyIG9uIG1vdXNlbW92ZQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIG9uTW91c2VNb3ZlLCB7CiAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLAogIH0pOwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAibW91c2Vkb3duIiwKICAgIChlKSA9PiB7CiAgICAgIGlmIChlLnRhcmdldC5jbG9zZXN0KCIucGx1dG9wbG90bHktY29udGFpbmVyIikgIT09IENPTlRBSU5FUikgewogICAgICAgIGNsZWFuVXAoKTsKICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9LAogICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0KICApOwoKICBmdW5jdGlvbiBjbGVhblVwKCkgewogICAgY29uc29sZS5sb2coImNsZWFuaW5nIHVwIHRoZSBwbG90IG1vdmUgbGlzdGVuZXIiKTsKICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gbnVsbDsKICB9CgogIC8vICgzKSBkcm9wIHRoZSBiYWxsLCByZW1vdmUgdW5uZWVkZWQgaGFuZGxlcnMKICBDTElQQk9BUkRfSEVBREVSLm9ubW91c2V1cCA9IGNsZWFuVXA7Cn07CgpmdW5jdGlvbiBzZW5kVG9DbGlwYm9hcmQoYmxvYikgewogIGlmICghbmF2aWdhdG9yLmNsaXBib2FyZCkgewogICAgYWxlcnQoCiAgICAgICJUaGUgQ2xpcGJvYXJkIEFQSSBkb2VzIG5vdCBzZWVtIHRvIGJlIGF2YWlsYWJsZSwgbWFrZSBzdXJlIHRoZSBQbHV0byBub3RlYm9vayBpcyBiZWluZyB1c2VkIGZyb20gZWl0aGVyIGxvY2FsaG9zdCBvciBhbiBodHRwcyBzb3VyY2UuIgogICAgKTsKICB9CiAgbmF2aWdhdG9yLmNsaXBib2FyZAogICAgLndyaXRlKFsKICAgICAgbmV3IENsaXBib2FyZEl0ZW0oewogICAgICAgIC8vIFRoZSBrZXkgaXMgZGV0ZXJtaW5lZCBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgYmxvYidzIHR5cGUuCiAgICAgICAgW2Jsb2IudHlwZV06IGJsb2IsCiAgICAgIH0pLAogICAgXSkKICAgIC50aGVuKAogICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgY29uc29sZS5sb2coIkFzeW5jOiBDb3B5aW5nIHRvIGNsaXBib2FyZCB3YXMgc3VjY2Vzc2Z1bCEiKTsKICAgICAgfSwKICAgICAgZnVuY3Rpb24gKGVycikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkFzeW5jOiBDb3VsZCBub3QgY29weSB0ZXh0OiAiLCBlcnIpOwogICAgICB9CiAgICApOwp9CgpmdW5jdGlvbiBjb3B5SW1hZ2VUb0NsaXBib2FyZCgpIHsKICAvLyBXZSBleHRyYWN0IHRoZSBpbWFnZSBvcHRpb25zIGZyb20gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMgKGlmIHRoZXkgZXhpc3QpCiAgY29uc3QgY29uZmlnID0ge307CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGxldCB2YWwgPQogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID8/CiAgICAgIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IGNvbnRhaW5lci51aV92YWx1ZSA6IHVuZGVmaW5lZCk7CiAgICAvLyBJZiB3ZSBoYXZlIHVuZGVmaW5lZCB3ZSBkb24ndCBjcmVhdGUgdGhlIGtleS4gV2UgYWxzbyBpZ25vcmUgZm9ybWF0IGJlY2F1c2UgdGhlIGNsaXBib2FyZCBvbmx5IHN1cHBvcnRzIHBuZy4KICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS50b0ltYWdlKFBMT1QsIGNvbmZpZykudGhlbihmdW5jdGlvbiAoZGF0YVVybCkgewogICAgZmV0Y2goZGF0YVVybCkKICAgICAgLnRoZW4oKHJlcykgPT4gcmVzLmJsb2IoKSkKICAgICAgLnRoZW4oKGJsb2IpID0+IHsKICAgICAgICBjb25zdCBwYXN0ZV9yZWNlaXZlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3Bhc3RlLXJlY2VpdmVyLnBsdXRvcGxvdGx5JykKICAgICAgICBpZiAocGFzdGVfcmVjZWl2ZXIpIHsKICAgICAgICAgIHBhc3RlX3JlY2VpdmVyLmF0dGFjaEltYWdlKGRhdGFVcmwsIENPTlRBSU5FUikKICAgICAgICB9CiAgICAgICAgc2VuZFRvQ2xpcGJvYXJkKGJsb2IpCiAgICAgIH0pOwogIH0pOwp9CgpmdW5jdGlvbiBzYXZlSW1hZ2VUb0ZpbGUoKSB7CiAgY29uc3QgY29uZmlnID0ge307CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGxldCB2YWwgPQogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID8/CiAgICAgIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IGNvbnRhaW5lci51aV92YWx1ZSA6IHVuZGVmaW5lZCk7CiAgICAvLyBJZiB3ZSBoYXZlIHVuZGVmaW5lZCB3ZSBkb24ndCBjcmVhdGUgdGhlIGtleS4KICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbmZpZ1trZXldID0gdmFsOwogIH0KICBQbG90bHkuZG93bmxvYWRJbWFnZShQTE9ULCBjb25maWcpOwp9CgpsZXQgY29udGFpbmVyX3JlY3QgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAsIHRvcDogMCwgbGVmdDogMCB9OwpmdW5jdGlvbiB1bnBvcF9jb250YWluZXIoY2wpIHsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZSgicG9wcGVkLW91dCIsIGZhbHNlKTsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgZmFsc2UpOwogIC8vIFdlIGZpeCB0aGUgaGVpZ2h0IGJhY2sgdG8gdGhlIHZhbHVlIGl0IGhhZCBiZWZvcmUgcG9wb3V0LCBhbHNvIHNldHRpbmcgdGhlIGZsYWcgdG8gc2lnbmFsIHRoYXQgdXBvbiBmaXJzdCByZXNpemUgd2UgcmVtb3ZlIHRoZSBmaXhlZCBpbmxpbmUtc3R5bGUKICBDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0ICsgInB4IjsKICByZW1vdmVfY29udGFpbmVyX3NpemUgPSB0cnVlOwogIC8vIFdlIHNldCB0aGUgb3RoZXIgZml4ZWQgaW5saW5lLXN0eWxlcyB0byBudWxsCiAgQ09OVEFJTkVSLnN0eWxlLndpZHRoID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9ICIiOwogIENPTlRBSU5FUi5zdHlsZS5sZWZ0ID0gIiI7CiAgLy8gV2UgYWxzbyByZW1vdmUgdGhlIENMSVBCT0FSRF9IRUFERVIKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLndpZHRoID0gIiI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gIiI7CiAgLy8gRmluYWxseSB3ZSByZW1vdmUgdGhlIGhpZGRlbiBjbGFzcyB0byB0aGUgaGVhZGVyCiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCB0cnVlKTsKICByZXR1cm47Cn0KZnVuY3Rpb24gcG9wb3V0X2NvbnRhaW5lcihvcHRzKSB7CiAgY29uc3QgY2wgPSBvcHRzPy5jbDsKICBjb25zdCB0YXJnZXRfY29udGFpbmVyX3NpemUgPSBvcHRzPy50YXJnZXRfY29udGFpbmVyX3NpemUgPz8ge307CiAgY29uc3QgdGFyZ2V0X3Bsb3Rfc2l6ZSA9IG9wdHM/LnRhcmdldF9wbG90X3NpemUgPz8ge307CiAgaWYgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICByZXR1cm4gdW5wb3BfY29udGFpbmVyKGNsKTsKICB9CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoY2wsIGNsID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IHRydWUpOwogIC8vIFdlIGV4dHJhY3QgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgY29udGFpbmVyLCBzYXZlIHRoZW0gYW5kIGZpeCB0aGVtCiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfSA9IENPTlRBSU5FUi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICBjb250YWluZXJfcmVjdCA9IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH07CiAgLy8gV2Ugc2F2ZSB0aGUgY3VycmVudCBwbG90IHNpemUgYmVmb3JlIHdlIHBvcCBhcyBpdCB3aWxsIGZpbGwgdGhlIHNjcmVlbgogIGNvbnN0IGN1cnJlbnRfcGxvdF9zaXplID0gewogICAgd2lkdGg6IFBMT1QuX2Z1bGxMYXlvdXQud2lkdGgsCiAgICBoZWlnaHQ6IFBMT1QuX2Z1bGxMYXlvdXQuaGVpZ2h0LAogIH07CiAgLy8gV2UgaGF2ZSB0byBzYXZlIHRoZSBwYWQgZGF0YSBiZWZvcmUgcG9wcGluZyBzbyB3ZSBjYW4gcmVzaXplIHByZWNpc2VseQogIGNvbnN0IHBhZCA9IHt9OwogIHBhZC51bnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZSgicG9wcGVkLW91dCIsIHRydWUpOwogIHBhZC5wb3BwZWQgPSBnZXRTaXplRGF0YSgpLmNvbnRhaW5lcl9wYWQ7CiAgLy8gV2UgZG8gdG9wIGFuZCBsZWZ0IGJhc2VkIG9uIHRoZSBjdXJyZW50IHJlY3QKICBmb3IgKGNvbnN0IGtleSBvZiBbInRvcCIsICJsZWZ0Il0pIHsKICAgIGNvbnN0IHN0YXJ0X3ZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNvbnRhaW5lcl9yZWN0W2tleV07CiAgICBsZXQgb2Zmc2V0ID0gMDsKICAgIGZvciAoY29uc3Qga2luZCBvZiBbInBhZGRpbmciLCAiYm9yZGVyIl0pIHsKICAgICAgb2Zmc2V0ICs9IHBhZC5wb3BwZWRba2luZF1ba2V5XSAtIHBhZC51bnBvcHBlZFtraW5kXVtrZXldOwogICAgfQogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSBzdGFydF92YWwgLSBvZmZzZXQgKyAicHgiOwogICAgaWYgKGtleSA9PT0gImxlZnQiKSB7CiAgICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGVba2V5XSA9IENPTlRBSU5FUi5zdHlsZVtrZXldOwogICAgfQogIH0KICAvLyBXZSBjb21wdXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGRlcGVuZGluZyBvbiBldmVudHVhbCBjb25maWcgZGF0YQogIGNvbnN0IGNzeiA9IGNvbXB1dGVDb250YWluZXJTaXplKHsKICAgIHdpZHRoOgogICAgICB0YXJnZXRfcGxvdF9zaXplLndpZHRoID8/CiAgICAgIGNvbmZpZ19zcGFucy53aWR0aC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6CiAgICAgIHRhcmdldF9wbG90X3NpemUuaGVpZ2h0ID8/CiAgICAgIGNvbmZpZ19zcGFucy5oZWlnaHQuY29uZmlnX3ZhbHVlID8/CiAgICAgIGN1cnJlbnRfcGxvdF9zaXplLmhlaWdodCwKICB9KTsKICBmb3IgKGNvbnN0IGtleSBvZiBbIndpZHRoIiwgImhlaWdodCJdKSB7CiAgICBjb25zdCB2YWwgPSB0YXJnZXRfY29udGFpbmVyX3NpemVba2V5XSA/PyBjc3pba2V5XTsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gdmFsICsgInB4IjsKICAgIGlmIChrZXkgPT09ICJ3aWR0aCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIENMSVBCT0FSRF9IRUFERVIuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgZmFsc2UpOwogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CgogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAibW91c2Vkb3duIiwKICAgIChlKSA9PiB7CiAgICAgIGlmIChlLnRhcmdldC5jbG9zZXN0KCIucGx1dG9wbG90bHktY29udGFpbmVyIikgIT09IENPTlRBSU5FUikgewogICAgICAgIHVucG9wX2NvbnRhaW5lcigpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7Cn0KCkNPTlRBSU5FUi5wb3BPdXQgPSBwb3BvdXRfY29udGFpbmVyOwoKZnVuY3Rpb24gRHVhbENsaWNrKHNpbmdsZV9mdW5jLCBkYmxfZnVuYykgewogIGxldCBuY2xpY2tzID0gMDsKICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHsKICAgIG5jbGlja3MgKz0gMTsKICAgIGlmIChuY2xpY2tzID4gMSkgewogICAgICBkYmxfZnVuYyguLi5hcmdzKTsKICAgICAgbmNsaWNrcyA9IDA7CiAgICB9IGVsc2UgewogICAgICBkZWxheSgzMDApLnRoZW4oKCkgPT4gewogICAgICAgIGlmIChuY2xpY2tzID09IDEpIHsKICAgICAgICAgIHNpbmdsZV9mdW5jKC4uLmFyZ3MpOwogICAgICAgIH0KICAgICAgICBuY2xpY2tzID0gMDsKICAgICAgfSk7CiAgICB9CiAgfTsKfQoKLy8gV2UgcmVtb3ZlIHRoZSBkZWZhdWx0IGRvd25sb2FkIGltYWdlIGJ1dHRvbgpwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSA9IF8udW5pb24oCiAgcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9SZW1vdmUsCiAgWyJ0b0ltYWdlIl0KKTsKLy8gV2UgYWRkIHRoZSBjdXN0b20gYnV0dG9uIHRvIHRoZSBtb2RlYmFyCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb0FkZCwKICBbCiAgICB7CiAgICAgIG5hbWU6ICJDb3B5IFBORyB0byBDbGlwYm9hcmQiLAogICAgICBpY29uOiB7CiAgICAgICAgaGVpZ2h0OiA1MjAsCiAgICAgICAgd2lkdGg6IDUyMCwKICAgICAgICBwYXRoOiAiTTI4MCA2NGg0MGMzNS4zIDAgNjQgMjguNyA2NCA2NFY0NDhjMCAzNS4zLTI4LjcgNjQtNjQgNjRINjRjLTM1LjMgMC02NC0yOC43LTY0LTY0VjEyOEMwIDkyLjcgMjguNyA2NCA2NCA2NGg0MCA5LjZDMTIxIDI3LjUgMTUzLjMgMCAxOTIgMHM3MSAyNy41IDc4LjQgNjRIMjgwek02NCAxMTJjLTguOCAwLTE2IDcuMi0xNiAxNlY0NDhjMCA4LjggNy4yIDE2IDE2IDE2SDMyMGM4LjggMCAxNi03LjIgMTYtMTZWMTI4YzAtOC44LTcuMi0xNi0xNi0xNkgzMDR2MjRjMCAxMy4zLTEwLjcgMjQtMjQgMjRIMTkyIDEwNGMtMTMuMyAwLTI0LTEwLjctMjQtMjRWMTEySDY0em0xMjgtOGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6IiwKICAgICAgfSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKGNvcHlJbWFnZVRvQ2xpcGJvYXJkLCAoKSA9PiB7CiAgICAgICAgcG9wb3V0X2NvbnRhaW5lcigpOwogICAgICB9KSwKICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICJEb3dubG9hZCBJbWFnZSIsCiAgICAgIGljb246IFBsb3RseS5JY29ucy5jYW1lcmEsCiAgICAgIGRpcmVjdGlvbjogInVwIiwKICAgICAgY2xpY2s6IER1YWxDbGljayhzYXZlSW1hZ2VUb0ZpbGUsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKHsgY2w6ICJmaWxlc2F2ZSIgfSk7CiAgICAgIH0pLAogICAgfSwKICBdCik7CgpmdW5jdGlvbiBnZXRPZmZzZXREYXRhKGVsKSB7CiAgbGV0IGNzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwsIG51bGwpOwogIGNvbnN0IG9kYXRhID0gewogICAgcGFkZGluZzogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdMZWZ0KSwKICAgICAgcmlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1JpZ2h0KSwKICAgICAgdG9wOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdUb3ApLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MucGFkZGluZ0JvdHRvbSksCiAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdMZWZ0KSArIHBhcnNlRmxvYXQoY3MucGFkZGluZ1JpZ2h0KSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdUb3ApICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgIH0sCiAgICBib3JkZXI6IHsKICAgICAgbGVmdDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgdG9wOiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSwKICAgICAgYm90dG9tOiBwYXJzZUZsb2F0KGNzLmJvcmRlckJvdHRvbVdpZHRoKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MuYm9yZGVyTGVmdFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyUmlnaHRXaWR0aCksCiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChjcy5ib3JkZXJUb3BXaWR0aCkgKyBwYXJzZUZsb2F0KGNzLmJvcmRlckJvdHRvbVdpZHRoKSwKICAgIH0KICB9OwogIGlmIChlbCA9PT0gUExPVCkgewogICAgLy8gRm9yIHRoZSBQTE9UIHdlIGFsc28gd2FudCB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgb2Zmc2V0CiAgICBvZGF0YS5vZmZzZXQgPSB7CiAgICAgIHRvcDogUExPVC5vZmZzZXRQYXJlbnQgPT0gQ09OVEFJTkVSID8gUExPVC5vZmZzZXRUb3AgOiAwLAogICAgICBsZWZ0OiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldExlZnQgOiAwLAogICAgfQogIH0KICByZXR1cm4gb2RhdGE7Cn0KZnVuY3Rpb24gZ2V0U2l6ZURhdGEoKSB7CiAgY29uc3QgZGF0YSA9IHsKICAgIHBsb3RfcGFkOiBnZXRPZmZzZXREYXRhKFBMT1QpLAogICAgcGxvdF9yZWN0OiBQTE9ULmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogICAgY29udGFpbmVyX3BhZDogZ2V0T2Zmc2V0RGF0YShDT05UQUlORVIpLAogICAgY29udGFpbmVyX3JlY3Q6IENPTlRBSU5FUi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICB9OwogIHJldHVybiBkYXRhOwp9CmZ1bmN0aW9uIGNvbXB1dGVDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICBjb25zdCBjb21wdXRlZF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICBjb25zdCBvZmZzZXRzID0gY29tcHV0ZWRfc2l6ZS5vZmZzZXRzOwoKICBjb25zdCBwbG90X2RhdGEgPSB7CiAgICB3aWR0aDogd2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCwKICAgIGhlaWdodDogaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH07CgogIHJldHVybiB7CiAgICB3aWR0aDogKHdpZHRoID8/IGNvbXB1dGVkX3NpemUud2lkdGgpICsgb2Zmc2V0cy53aWR0aCwKICAgIGhlaWdodDogKGhlaWdodCA/PyBjb21wdXRlZF9zaXplLmhlaWdodCkgKyBvZmZzZXRzLmhlaWdodCwKICAgIG5vQ2hhbmdlOiB3aWR0aCA9PSBjb21wdXRlZF9zaXplLndpZHRoICYmIGhlaWdodCA9PSBjb21wdXRlZF9zaXplLmhlaWdodCwKICB9Cn0KCi8vIFRoaXMgZnVuY3Rpb24gd2lsbCBjaGFuZ2UgdGhlIGNvbnRhaW5lciBzaXplIHNvIHRoYXQgdGhlIHJlc3VsdGluZyBwbG90IHdpbGwgYmUgbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIHNwZWNzCmZ1bmN0aW9uIGNoYW5nZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGlmICghQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIGNvbnNvbGUubG9nKCJUcmllZCB0byBjaGFuZ2UgY29udGFpbmVyIHNpemUgd2hlbiBub3QgcG9wcGVkLCBpZ25vcmluZyIpOwogICAgcmV0dXJuOwogIH0KCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhKTsKCiAgaWYgKGNzei5ub0NoYW5nZSkgewogICAgY29uc29sZS5sb2coIlNpemUgaXMgdGhlIHNhbWUgYXMgY3VycmVudCwgaWdub3JpbmciKTsKICAgIHJldHVybgogIH0KICAvLyBXZSBhcmUgbm93IGdvaW5nIHRvIHNldCBoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBjb250YWluZXIKICBmb3IgKGNvbnN0IGtleSBvZiBbIndpZHRoIiwgImhlaWdodCJdKSB7CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IGNzeltrZXldICsgInB4IjsKICB9Cn0KLy8gV2Ugbm93IGNyZWF0ZSB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIHVwZGF0ZSB0aGUgcGxvdCBiYXNlZCBvbiB0aGUgdmFsdWVzIHNwZWNpZmllZApmdW5jdGlvbiB1cGRhdGVGcm9tSGVhZGVyKCkgewogIGNvbnN0IGhlYWRlcl9kYXRhID0gewogICAgaGVpZ2h0OiBjb25maWdfc3BhbnMuaGVpZ2h0LnVpX3ZhbHVlLAogICAgd2lkdGg6IGNvbmZpZ19zcGFucy53aWR0aC51aV92YWx1ZSwKICB9OwogIGNoYW5nZUNvbnRhaW5lclNpemUoaGVhZGVyX2RhdGEpOwp9Ci8vIFdlIGFzc2lnbiB0aGlzIGZ1bmN0aW9uIHRvIHRoZSBvbmJsdXIgZXZlbnQgb2Ygd2lkdGggYW5kIGhlaWdodAppZiAoZmlyc3RSdW4pIHsKICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGNvbnRhaW5lci51aV9zcGFuLm9uYmx1ciA9IChlKSA9PiB7CiAgICAgIGNvbnRhaW5lci51aV92YWx1ZSA9IGNvbnRhaW5lci51aV9zcGFuLnRleHRDb250ZW50OwogICAgICB1cGRhdGVGcm9tSGVhZGVyKCk7CiAgICB9OwogIH0KfQovLyBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBwbG90IHNpemUgdG8gdXNlIGZvciByZWxheW91dCBhcyBhIGZ1bmN0aW9uIG9mIHRoZSBjb250YWluZXIgc2l6ZQpmdW5jdGlvbiBjb21wdXRlUGxvdFNpemUoZGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICAvLyBSZW1vdmUgUGFkZGluZwogIGNvbnN0IHsgY29udGFpbmVyX3BhZCwgcGxvdF9wYWQsIGNvbnRhaW5lcl9yZWN0IH0gPSBkYXRhOwogIGNvbnN0IG9mZnNldHMgPSB7CiAgICB3aWR0aDoKICAgICAgcGxvdF9wYWQucGFkZGluZy53aWR0aCArCiAgICAgIHBsb3RfcGFkLmJvcmRlci53aWR0aCArCiAgICAgIHBsb3RfcGFkLm9mZnNldC5sZWZ0ICsKICAgICAgY29udGFpbmVyX3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgY29udGFpbmVyX3BhZC5ib3JkZXIud2lkdGgsCiAgICBoZWlnaHQ6CiAgICAgIHBsb3RfcGFkLnBhZGRpbmcuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLmhlaWdodCArCiAgICAgIHBsb3RfcGFkLm9mZnNldC50b3AgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcuaGVpZ2h0ICsKICAgICAgY29udGFpbmVyX3BhZC5ib3JkZXIuaGVpZ2h0LAogIH07CiAgY29uc3Qgc3ogPSB7CiAgICB3aWR0aDogTWF0aC5yb3VuZChjb250YWluZXJfcmVjdC53aWR0aCAtIG9mZnNldHMud2lkdGgpLAogICAgaGVpZ2h0OiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LmhlaWdodCAtIG9mZnNldHMuaGVpZ2h0KSwKICAgIG9mZnNldHMsCiAgfTsKICByZXR1cm4gc3o7Cn0KCi8vIENyZWF0ZSB0aGUgcmVzaXplT2JzZXJ2ZXIgdG8gbWFrZSB0aGUgcGxvdCBldmVuIG1vcmUgcmVzcG9uc2l2ZSEgOm1hZ2ljOgpjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4gewogIGNvbnN0IHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKTsKICBjb25zdCB7Y29udGFpbmVyX3JlY3QsIGNvbnRhaW5lcl9wYWR9ID0gc2l6ZURhdGE7CiAgbGV0IHBsb3Rfc2l6ZSA9IGNvbXB1dGVQbG90U2l6ZShzaXplRGF0YSk7CiAgLy8gV2Ugc2F2ZSB0aGUgaGVpZ2h0IGluIHRoZSBQTE9UIG9iamVjdAogIFBMT1QuY29udGFpbmVyX2hlaWdodCA9IGNvbnRhaW5lcl9yZWN0LmhlaWdodDsKICAvLyBXZSBkZWFsIHdpdGggc29tZSBzdHVmZiBpZiB0aGUgY29udGFpbmVyIGlzIHBvcHBwZWQKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLndpZHRoID0gY29udGFpbmVyX3JlY3Qud2lkdGggKyAicHgiOwogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9IGNvbnRhaW5lcl9yZWN0LmxlZnQgKyAicHgiOwogIGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUgPSBwbG90X3NpemUuaGVpZ2h0OwogIGNvbmZpZ19zcGFucy53aWR0aC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS53aWR0aDsKICAvKiAKCQlUaGUgYWRkaXRpb24gb2YgdGhlIGludmFsaWQgYXJndW1lbnQgYHBsdXRvcmVzaXplYCBzZWVtcyB0byBmaXggdGhlIHByb2JsZW0gd2l0aCBjYWxsaW5nIGByZWxheW91dGAgc2ltcGx5IHdpdGggYHthdXRvc2l6ZTogdHJ1ZX1gIGFzIHVwZGF0ZSBicmVha2luZyBtb3VzZSByZWxheW91dCBldmVudHMgdHJhY2tpbmcuIAoJCVNlZSBodHRwczovL2dpdGh1Yi5jb20vcGxvdGx5L3Bsb3RseS5qcy9pc3N1ZXMvNjE1NiBmb3IgZGV0YWlscwoJCSovCiAgbGV0IGNvbmZpZyA9IHsKICAgIC8vIElmIHRoaXMgaXMgcG9wcGVkIG91dCwgd2UgaWdub3JlIHRoZSBvcmlnaW5hbCB3aWR0aC9oZWlnaHQKICAgIHdpZHRoOiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyB1bmRlZmluZWQgOiBvcmlnaW5hbF93aWR0aCkgPz8gcGxvdF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyB1bmRlZmluZWQgOiBvcmlnaW5hbF9oZWlnaHQpID8/IHBsb3Rfc2l6ZS5oZWlnaHQsCiAgICBwbHV0b3Jlc2l6ZTogdHJ1ZSwKICB9OwogIFBsb3RseS5yZWxheW91dChQTE9ULCBjb25maWcpLnRoZW4oKCkgPT4gewogICAgaWYgKHJlbW92ZV9jb250YWluZXJfc2l6ZSAmJiAhQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgdGhlIGZpcnN0IHJlc2l6ZSB1cG9uIHBsb3QgY3JlYXRpb24gdG8gYWxyZWFkeSBiZSB3aXRob3V0IGEgZml4ZWQgaGVpZ2h0CiAgICAgIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSAiIjsKICAgICAgQ09OVEFJTkVSLnN0eWxlLndpZHRoID0gIiI7CiAgICAgIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IGZhbHNlOwogICAgfQogIH0pOwp9KTsKCnJlc2l6ZU9ic2VydmVyLm9ic2VydmUoQ09OVEFJTkVSKTsKCgpQbG90bHkucmVhY3QoUExPVCwgcGxvdF9vYmopLnRoZW4oKCkgPT4gewoJLy8gQXNzaWduIHRoZSBQbG90bHkgZXZlbnQgbGlzdGVuZXJzCglmb3IgKGNvbnN0IFtrZXksIGxpc3RlbmVyX3ZlY10gb2YgT2JqZWN0LmVudHJpZXMocGxvdGx5X2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULm9uKGtleSwgbGlzdGVuZXIpCgkJfQoJfQoJLy8gQXNzaWduIHRoZSBKUyBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhqc19saXN0ZW5lcnMpKSB7CgkJZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcl92ZWMpIHsKCQkJUExPVC5hZGRFdmVudExpc3RlbmVyKGtleSwgbGlzdGVuZXIsIHsKCQkJCXNpZ25hbDogY29udHJvbGxlci5zaWduYWwKCQkJfSkKCQl9Cgl9Cn0KKQoKCmludmFsaWRhdGlvbi50aGVuKCgpID0+IHsKCS8vIFJlbW92ZSBhbGwgcGxvdGx5IGxpc3RlbmVycwoJUExPVC5yZW1vdmVBbGxMaXN0ZW5lcnMoKQoJLy8gUmVtb3ZlIGFsbCBKUyBsaXN0ZW5lcnMKCWNvbnRyb2xsZXIuYWJvcnQoKQoJLy8gUmVtb3ZlIHRoZSByZXNpemVPYnNlcnZlcgoJcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpCn0pCgoKCgkJcmV0dXJuIENPTlRBSU5FUgoJPC9zY3JpcHQ+CqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b/ITpiih7BwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkMThjODJmZjEtMGJkZS00ZmEwLTg0OGMtZDBlYjczZDFhYzdjuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOIL02brVwdWJsaXNoZWRfb2JqZWN0X2tleXOR2TU3YmNjMDViMC04MWRhLTExZWYtMjA0MC0zNTg1YzliNDk1NGYvZTgyNDFiMmU1NTU1NjI5NLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQxYzc5YjM3ZS1kNGUwLTQ5MGYtOTQ2Ni0yMGNlMjhmMDE3YWWKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52mqJCTxzY3JpcHQgaWQ9J3Bsb3RfMSc+CgkJLy8gV2Ugc3RhcnQgYnkgcHV0dGluZyBhbGwgdGhlIHZhcmlhYmxlIGludGVycG9sYXRpb24gaGVyZSBhdCB0aGUgYmVnaW5uaW5nCgkJLy8gV2UgaGF2ZSB0byBjb252ZXJ0IGFsbCB0eXBlZGFycmF5cyBpbiB0aGUgbGF5b3V0IHRvIG5vcm1hbCBhcnJheXMuIFNlZSBJc3N1ZSAjMjUKCQkvLyBXZSB1c2UgbG9kYXNoIGZvciB0aGlzIGZvciBjb21wYWN0bmVzcwoJCWZ1bmN0aW9uIHJlbW92ZVR5cGVkQXJyYXkobykgewoJCQlyZXR1cm4gXy5pc1R5cGVkQXJyYXkobykgPyBBcnJheS5mcm9tKG8pIDoKCQkJXy5pc1BsYWluT2JqZWN0KG8pID8gXy5tYXBWYWx1ZXMobywgcmVtb3ZlVHlwZWRBcnJheSkgOiAKCQkJbwoJCX0KCgkJLy8gUHVibGlzaCB0aGUgcGxvdCBvYmplY3QgdG8gSlMKCQlsZXQgcGxvdF9vYmogPSBfLnVwZGF0ZSgvKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIEFic3RyYWN0UGx1dG9EaW5nZXRqZXMuRGlzcGxheS5wdWJsaXNoZWRfdG9fanMgKi8gZ2V0UHVibGlzaGVkT2JqZWN0KCI3YmNjMDViMC04MWRhLTExZWYtMjA0MC0zNTg1YzliNDk1NGYvNjc0NzE5NWYxOGUzMzc5OSIpLCAibGF5b3V0IiwgcmVtb3ZlVHlwZWRBcnJheSkKCQkvLyBHZXQgdGhlIHBsb3RseSBsaXN0ZW5lcnMKCQljb25zdCBwbG90bHlfbGlzdGVuZXJzID0ge30KCQkvLyBHZXQgdGhlIEpTIGxpc3RlbmVycwoJCWNvbnN0IGpzX2xpc3RlbmVycyA9IHt9CgkJLy8gRGVhbCB3aXRoIGV2ZW50dWFsIGN1c3RvbSBjbGFzc2VzCgkJbGV0IGN1c3RvbV9jbGFzc2xpc3QgPSBbXQoKCgkJLy8gTG9hZCB0aGUgcGxvdGx5IGxpYnJhcnkKCQlsZXQgUGxvdGx5ID0gdW5kZWZpbmVkCgkJdHJ5IHsKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoIi4vcGxvdGx5anMvcGxvdGx5anMtMi4yNi4yLm1pbi5qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0gY2F0Y2ggKGUpIHsKCQkJY29uc29sZS5sb2coIkxvY2FsIGxvYWQgZmFpbGVkLCB0cnlpbmcgd2l0aCB0aGUgd2ViIGVzbS5zaCB2ZXJzaW9uIikKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoImh0dHBzOi8vZXNtLnNoL3YxMzUvcGxvdGx5LmpzLWRpc3QtbWluQDIuMjYuMi9lc25leHQvcGxvdGx5LmpzLWRpc3QtbWluLm1qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0KCgkJLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0byBmb3JjZSBsb2NhbCBtYXRoamF4IGZvbnQgY2FjaGUKCQlpZiAoZmFsc2UgJiYgd2luZG93Py5NYXRoSmF4Py5jb25maWc/LnN2Zz8uZm9udENhY2hlID09PSAnZ2xvYmFsJykgewoJCQl3aW5kb3cuTWF0aEpheC5jb25maWcuc3ZnLmZvbnRDYWNoZSA9ICdsb2NhbCcKCQl9CgoJCS8vIEZsYWcgdG8gY2hlY2sgaWYgdGhpcyBjZWxsIHdhcyAgbWFudWFsbHkgcmFuIG9yIHJlYWN0aXZlbHkgcmFuCmNvbnN0IGZpcnN0UnVuID0gdGhpcyA/IGZhbHNlIDogdHJ1ZQpjb25zdCBDT05UQUlORVIgPSB0aGlzID8/IGh0bWxgPGRpdiBjbGFzcz0ncGx1dG9wbG90bHktY29udGFpbmVyJz5gCmNvbnN0IFBMT1QgPSBDT05UQUlORVIucXVlcnlTZWxlY3RvcignLmpzLXBsb3RseS1wbG90JykgPz8gQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgPGRpdj5gKQpjb25zdCBwYXJlbnQgPSBDT05UQUlORVIucGFyZW50RWxlbWVudAovLyBXZSB1c2UgYSBjb250cm9sbGVyIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lcnMgdXBvbiBpbnZhbGlkYXRpb24KY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKQovLyBXZSBoYXZlIHRvIGFkZCB0aGlzIHRvIGtlZXAgc3VwcG9ydGluZyBAYmluZCB3aXRoIHRoZSBvbGQgQVBJIHVzaW5nIFBMT1QKUExPVC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChlKSA9PiB7CglDT05UQUlORVIudmFsdWUgPSBQTE9ULnZhbHVlCglpZiAoZS5idWJibGVzKSB7CgkJcmV0dXJuCgl9CglDT05UQUlORVIuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2lucHV0JykpCn0sIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KQoKCS8vIFRoaXMgY3JlYXRlIHRoZSBzdHlsZSBzdWJkaXYgb24gZmlyc3QgcnVuCglmaXJzdFJ1biAmJiBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGAKCTxzdHlsZT4KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgewoJCXdpZHRoOiAxMDAlOwoJCWhlaWdodDogMTAwJTsKCQltaW4taGVpZ2h0OiAwOwoJCW1pbi13aWR0aDogMDsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgLmpzLXBsb3RseS1wbG90IC5wbG90bHkgZGl2IHsKCQltYXJnaW46IDAgYXV0bzsgLy8gVGhpcyBjZW50ZXJzIHRoZSBwbG90Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLnBvcHBlZC1vdXQgewoJCW92ZXJmbG93OiBhdXRvOwoJCXotaW5kZXg6IDEwMDA7CgkJcG9zaXRpb246IGZpeGVkOwoJCXJlc2l6ZTogYm90aDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDBweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMHB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgewoJCWRpc3BsYXk6IGZsZXg7CgkJZmxleC1mbG93OiByb3cgd3JhcDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAxMnB4OwoJCXBvc2l0aW9uOiBmaXhlZDsKCQl6LWluZGV4OiAxMDAxOwoJCWN1cnNvcjogbW92ZTsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIC0xMDAlKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBzcGFuIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJZmxleDogMQoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIuaGlkZGVuIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuIHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlIHsKCQlwYWRkaW5nLXJpZ2h0OiA1cHg7CgkJcGFkZGluZy1sZWZ0OiAycHg7CgkJY3Vyc29yOiB0ZXh0OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZmxleDogMCAwIDEwMCU7CgkJdGV4dC1hbGlnbjogY2VudGVyOwoJCWJvcmRlci10b3A6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQltYXJnaW4tdG9wOiA1cHg7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZpbGVuYW1lIHsKCQltYXJnaW4tbGVmdDogM3B4OwoJCXRleHQtYWxpZ246IGxlZnQ7CgkJbWluLXdpZHRoOiBtaW4oNjAlLCBtaW4tY29udGVudCk7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCAubGFiZWwgewoJCWZsZXg6IDAgMCAwOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5mb3JtYXQgewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCQlmbGV4OiAxIDAgYXV0bzsKCQltaW4td2lkdGg6IDMwcHg7CgkJbWFyZ2luLXJpZ2h0OiAxMHB4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCQlmbGV4LWZsb3c6IGNvbHVtbjsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlwYWRkaW5nLWxlZnQ6IDNweDsKCQl6LWluZGV4OiAyMDAwOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIHsKCQljdXJzb3I6IHBvaW50ZXI7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJcGFkZGluZzogM3B4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKC0zcHgsIC02cHgpOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpub3QoLnNlbGVjdGVkKSB7CgkJbWFyZ2luLXRvcDogM3B4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uLnNlbGVjdGVkIHsKCQlvcmRlcjogLTE7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246aG92ZXIgewoJCWJhY2tncm91bmQtY29sb3I6IHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJfQoJc3Bhbi5jb25maWctdmFsdWUgewoJCWZvbnQtd2VpZ2h0OiBub3JtYWw7CgkJY29sb3I6IHZhcigtLXBsdXRvLW91dHB1dC1jb2xvcik7CgkJZGlzcGxheTogbm9uZTsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIGNhbGMoLTEwMCUgLSAxMHB4KSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLmxhYmVsIHsKCQl1c2VyLXNlbGVjdDogbm9uZTsKCX0KCS5sYWJlbDpob3ZlciBzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCW1pbi13aWR0aDogMTUwcHg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4ubWF0Y2hpbmctY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLW1hY3JvLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5kaWZmZXJlbnQtY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLXRhZy1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9Cjwvc3R5bGU+CmApCgpsZXQgb3JpZ2luYWxfaGVpZ2h0ID0gcGxvdF9vYmoubGF5b3V0LmhlaWdodApsZXQgb3JpZ2luYWxfd2lkdGggPSBwbG90X29iai5sYXlvdXQud2lkdGgKLy8gRm9yIHRoZSBoZWlnaHQgd2UgaGF2ZSB0byBhbHNvIHB1dCBhIGZpeGVkIHZhbHVlIGluIGNhc2UgdGhlIHBsb3QgaXMgcHV0IG9uIGEgbm9uLWZpeGVkLXNpemUgY29udGFpbmVyIChsaWtlIHRoZSBkZWZhdWx0IHdyYXBwZXIpCi8vIFdlIGRlZmluZSBhIHZhcmlhYmxlIHRvIGNoZWNrIHdoZXRoZXIgd2Ugc3RpbGwgaGF2ZSB0byByZW1vdmUgdGhlIGZpeGVkIGhlaWdodApsZXQgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmlyc3RSdW4KbGV0IGNvbnRhaW5lcl9oZWlnaHQgPSBvcmlnaW5hbF9oZWlnaHQgPz8gUExPVC5jb250YWluZXJfaGVpZ2h0ID8/IDQwMApDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX2hlaWdodCArICdweCcKCi8vIFdlIGNyZWF0ZSBhIFByb21pc2UgdmVyc2lvbiBvZiBzZXRUaW1lb3V0CmZ1bmN0aW9uIGRlbGF5KG1zKSB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7Cn0KCi8vIFdlIGltcG9ydCBpbnRlcmFjdCBmb3IgZHJhZ2dpbmcvcmVzaXppbmcKY29uc3QgeyBkZWZhdWx0OiBpbnRlcmFjdCB9ID0gYXdhaXQgaW1wb3J0KCdodHRwczovL2VzbS5zaC9pbnRlcmFjdGpzQDEuMTAuMTknKQoKCmZ1bmN0aW9uIGdldEltYWdlT3B0aW9ucygpIHsKICBjb25zdCBvID0gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogIHJldHVybiB7CiAgICBmb3JtYXQ6IG8uZm9ybWF0ID8/ICJwbmciLAogICAgd2lkdGg6IG8ud2lkdGggPz8gb3JpZ2luYWxfd2lkdGgsCiAgICBoZWlnaHQ6IG8uaGVpZ2h0ID8/IG9yaWdpbmFsX2hlaWdodCwKICAgIHNjYWxlOiBvLnNjYWxlID8/IDEsCiAgICBmaWxlbmFtZTogby5maWxlbmFtZSA/PyAibmV3cGxvdCIsCiAgfTsKfQoKY29uc3QgQ0xJUEJPQVJEX0hFQURFUiA9CiAgQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoIi5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIikgPz8KICBDT05UQUlORVIuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgImFmdGVyYmVnaW4iLAogICAgaHRtbGA8ZGl2IGNsYXNzPSJwbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIGhpZGRlbiI+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmb3JtYXQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+Rm9ybWF0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZvcm1hdCI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB3aWR0aCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5XaWR0aDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSB3aWR0aCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGhlaWdodCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5IZWlnaHQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgaGVpZ2h0Ij48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2NhbGUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+U2NhbGU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgc2NhbGUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzZXQiPlNldDwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB1bnNldCI+VW5zZXQ8L2J1dHRvbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZpbGVuYW1lIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZpbGVuYW1lOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZpbGVuYW1lIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgIDwvZGl2PmAKICApOwoKZnVuY3Rpb24gY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcikgewogIGNvbnN0IHZhbGlkX2NsYXNzZXMgPSBbCiAgICAibWlzc2luZy1jb25maWciLAogICAgIm1hdGNoaW5nLWNvbmZpZyIsCiAgICAiZGlmZmVyZW50LWNvbmZpZyIsCiAgXTsKICBmdW5jdGlvbiBzZXRDbGFzcyhjbCkgewogICAgZm9yIChjb25zdCBuYW1lIG9mIHZhbGlkX2NsYXNzZXMpIHsKICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUobmFtZSwgbmFtZSA9PSBjbCk7CiAgICB9CiAgfQogIC8vIFdlIHVzZSB0aGUgY3VzdG9tIGdldHRlcnMgd2UnbGwgc2V0IHVwIGluIHRoZSBjb250YWluZXIKICBjb25zdCB7IHVpX3ZhbHVlLCBjb25maWdfdmFsdWUsIGNvbmZpZ19zcGFuLCBrZXkgfSA9IGNvbnRhaW5lcjsKICBpZiAoY29uZmlnX3ZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgIHNldENsYXNzKCJtaXNzaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBpcyBub3QgcHJlc2VudCBpbiB0aGUgY29uZmlnLmA7CiAgfSBlbHNlIGlmICh1aV92YWx1ZSA9PSBjb25maWdfdmFsdWUpIHsKICAgIHNldENsYXNzKCJtYXRjaGluZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIHRoZSBzYW1lIHZhbHVlIGluIHRoZSBjb25maWcgYW5kIGluIHRoZSBoZWFkZXIuYDsKICB9IGVsc2UgewogICAgc2V0Q2xhc3MoImRpZmZlcmVudC1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIGEgZGlmZmVyZW50IHZhbHVlICg8ZW0+JHtjb25maWdfdmFsdWV9PC9lbT4pIGluIHRoZSBjb25maWcuYDsKICB9CiAgLy8gQWRkIGluZm8gYWJvdXQgc2V0dGluZyBhbmQgdW5zZXR0aW5nCiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIG9uIHRoZSBsYWJlbCA8ZW0+PGI+b25jZTwvYj48L2VtPiB0byBzZXQgdGhlIGN1cnJlbnQgVUkgdmFsdWUgaW4gdGhlIGNvbmZpZy5gCiAgKTsKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgPGVtPjxiPnR3aWNlPC9iPjwvZW0+IHRvIHJlbW92ZSB0aGlzIGtleSBmcm9tIHRoZSBjb25maWcuYAogICk7Cn0KCmNvbnN0IHZhbGlkX2Zvcm1hdHMgPSBbInBuZyIsICJzdmciLCAid2VicCIsICJqcGVnIiwgImZ1bGwtanNvbiJdOwpmdW5jdGlvbiBpbml0aWFsaXplVUlWYWx1ZVNwYW4oc3Bhbiwga2V5LCB2YWx1ZSkgewogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSBrZXkgPT09ICJmb3JtYXQiID8gImZhbHNlIiA6ICJ0cnVlIjsKICBsZXQgcGFyc2UgPSAoeCkgPT4geDsKICBsZXQgdXBkYXRlID0gKHgpID0+IChzcGFuLnRleHRDb250ZW50ID0geCk7CiAgaWYgKGtleSA9PT0gIndpZHRoIiB8fCBrZXkgPT09ICJoZWlnaHQiKSB7CiAgICBwYXJzZSA9ICh4KSA9PiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoeCkpOwogIH0gZWxzZSBpZiAoa2V5ID09PSAic2NhbGUiKSB7CiAgICBwYXJzZSA9IHBhcnNlRmxvYXQ7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAvLyBXZSByZW1vdmUgY29udGVudEVkaXRhYmxlCiAgICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9ICJmYWxzZSI7CiAgICAvLyBIZXJlIHdlIGZpcnN0IGFkZCB0aGUgc3Vic3BhbnMgZm9yIGVhY2ggb3B0aW9uCiAgICBjb25zdCBvcHRzX2RpdiA9IHNwYW4uYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2IGNsYXNzPSJmb3JtYXQtb3B0aW9ucyI+PC9kaXY+YCk7CiAgICBmb3IgKGNvbnN0IGZtdCBvZiB2YWxpZF9mb3JtYXRzKSB7CiAgICAgIGNvbnN0IG9wdCA9IG9wdHNfZGl2LmFwcGVuZENoaWxkKAogICAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImZvcm1hdC1vcHRpb24gJHtmbXR9Ij4ke2ZtdH08L3NwYW4+YAogICAgICApOwogICAgICBvcHQub25jbGljayA9IChlKSA9PiB7CiAgICAgICAgc3Bhbi52YWx1ZSA9IG9wdC50ZXh0Q29udGVudDsKICAgICAgfTsKICAgIH0KICAgIHBhcnNlID0gKHgpID0+IHsKICAgICAgcmV0dXJuIHZhbGlkX2Zvcm1hdHMuaW5jbHVkZXMoeCkgPyB4IDogbG9jYWxWYWx1ZTsKICAgIH07CiAgICB1cGRhdGUgPSAoeCkgPT4gewogICAgICBmb3IgKGNvbnN0IG9wdCBvZiBvcHRzX2Rpdi5jaGlsZHJlbikgewogICAgICAgIG9wdC5jbGFzc0xpc3QudG9nZ2xlKCJzZWxlY3RlZCIsIG9wdC50ZXh0Q29udGVudCA9PT0geCk7CiAgICAgIH0KICAgIH07CiAgfSBlbHNlIHsKICAgIC8vIFdlIG9ubHkgaGF2ZSBmaWxlbmFtZSBoZXJlCiAgfQogIGxldCBsb2NhbFZhbHVlOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIGxvY2FsVmFsdWU7CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIGlmICh2YWwgIT09ICIiKSB7CiAgICAgICAgbG9jYWxWYWx1ZSA9IHBhcnNlKHZhbCk7CiAgICAgIH0KICAgICAgdXBkYXRlKGxvY2FsVmFsdWUpOwogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7CiAgLy8gV2UgYWxzbyBhc3NpZ24gYSBsaXN0ZW5lciBzbyB0aGF0IHRoZSBlZGl0YWJsZSBpcyBibHVycmVkIHdoZW4gZW50ZXIgaXMgcHJlc3NlZAogIHNwYW4ub25rZXlkb3duID0gKGUpID0+IHsKICAgIGlmIChlLmtleUNvZGUgPT09IDEzKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgc3Bhbi5ibHVyKCk7CiAgICB9CiAgfTsKICBzcGFuLnZhbHVlID0gdmFsdWU7Cn0KCmZ1bmN0aW9uIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oc3Bhbiwga2V5KSB7CiAgLy8gSGVyZSB3ZSBtb3N0bHkgd2FudCB0byBkZWZpbmUgdGhlIHNldHRlciBhbmQgZ2V0dGVyCiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgLy8gaWYgdW5kZWZpbmVkIGlzIHBhc3NlZCwgd2UgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBvcHRpb25zCiAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGRlbGV0ZSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XSA9IHZhbDsKICAgICAgfQogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7Cn0KCmNvbnN0IGNvbmZpZ19zcGFucyA9IHt9Owpmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhnZXRJbWFnZU9wdGlvbnMoKSkpIHsKICBjb25zdCBjb250YWluZXIgPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoYC5jbGlwYm9hcmQtc3Bhbi4ke2tleX1gKTsKICBjb25zdCBsYWJlbCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIubGFiZWwiKTsKICAvLyBXZSBnaXZlIHRoZSBsYWJlbCBhIGZ1bmN0aW9uIHRoYXQgb24gc2luZ2xlIGNsaWNrIHdpbGwgc2V0IHRoZSBjdXJyZW50IHZhbHVlIGFuZCB3aXRoIGRvdWJsZSBjbGljayB3aWxsIHVuc2V0IGl0CiAgbGFiZWwub25jbGljayA9IER1YWxDbGljaygKICAgICgpID0+IHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0sCiAgICAoZSkgPT4gewogICAgICBjb25zb2xlLmxvZygiZSIsIGUpOwogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSB1bmRlZmluZWQ7CiAgICB9CiAgKTsKICBjb25zdCB1aV92YWx1ZV9zcGFuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtdmFsdWUiKTsKICBjb25zdCBjb25maWdfdmFsdWVfc3BhbiA9CiAgICBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNvbmZpZy12YWx1ZSIpID8/CiAgICBsYWJlbC5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAgICJhZnRlcmJlZ2luIiwKICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iY29uZmlnLXZhbHVlIj48L3NwYW4+YAogICAgKTsKICAvLyBBc3NpbmcgdGhlIHR3byBzcGFucyBhcyBwcm9wZXJ0aWVzIG9mIHRoZSBjb250YWluaW5nIHNwYW4KICBjb250YWluZXIudWlfc3BhbiA9IHVpX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmNvbmZpZ19zcGFuID0gY29uZmlnX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmtleSA9IGtleTsKICBjb25maWdfc3BhbnNba2V5XSA9IGNvbnRhaW5lcjsKICBpZiAoZmlyc3RSdW4pIHsKICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA9CiAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICAgIC8vIFdlIGRvIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdmFsdWUgc3BhbgogICAgaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHVpX3ZhbHVlX3NwYW4sIGtleSwgdmFsdWUpOwogICAgLy8gVGhlbiB3ZSBpbml0aWFsaXplIHRoZSBjb25maWcgdmFsdWUKICAgIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oY29uZmlnX3ZhbHVlX3NwYW4sIGtleSk7CiAgICAvLyBXZSBwdXQgc29tZSBjb252ZW5pZW5jZSBnZXR0ZXJzL3NldHRlcnMKICAgIC8vIHVpX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJ1aV92YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiB1aV92YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICB1aV92YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgICAvLyBjb25maWdfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgImNvbmZpZ192YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICB9Cn0KCi8vIFRoZXNlIG9iamVjdHMgd2lsbCBjb250YWluIHRoZSBkZWZhdWx0IHZhbHVlCgovLyBUaGlzIGNvZGUgdXBkYXRlcyB0aGUgaW1hZ2Ugb3B0aW9ucyBpbiB0aGUgUExPVCBjb25maWcgd2l0aCB0aGUgcHJvdmlkZWQgb25lcwpmdW5jdGlvbiBzZXRJbWFnZU9wdGlvbnMobykgewogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gb1trZXldOwogIH0KfQpmdW5jdGlvbiB1bnNldEltYWdlT3B0aW9ucygpIHsKICBzZXRJbWFnZU9wdGlvbnMoe30pOwp9Cgpjb25zdCBzZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4uc2V0Iik7CmNvbnN0IHVuc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnVuc2V0Iik7CmlmIChmaXJzdFJ1bikgewogIHNldF9idXR0b24ub25jbGljayA9IChlKSA9PiB7CiAgICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0KICB9OwogIHVuc2V0X2J1dHRvbi5vbmNsaWNrID0gdW5zZXRJbWFnZU9wdGlvbnM7Cn0KCi8vIFdlIGFkZCBhIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBjbGlwYm9hcmQgaXMgcG9wcGVkIG91dApDT05UQUlORVIuaXNQb3BwZWRPdXQgPSAoKSA9PiB7CiAgcmV0dXJuIENPTlRBSU5FUi5jbGFzc0xpc3QuY29udGFpbnMoInBvcHBlZC1vdXQiKTsKfTsKCkNMSVBCT0FSRF9IRUFERVIub25tb3VzZWRvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHsKICBpZiAoZXZlbnQudGFyZ2V0Lm1hdGNoZXMoInNwYW4uY2xpcGJvYXJkLXZhbHVlIikpIHsKICAgIGNvbnNvbGUubG9nKCJXZSBkb24ndCBtb3ZlISIpOwogICAgcmV0dXJuOwogIH0KICBjb25zdCBzdGFydCA9IHsKICAgIGxlZnQ6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLmxlZnQpLAogICAgdG9wOiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS50b3ApLAogICAgWDogZXZlbnQucGFnZVgsCiAgICBZOiBldmVudC5wYWdlWSwKICB9OwogIGZ1bmN0aW9uIG1vdmVBdChldmVudCwgc3RhcnQpIHsKICAgIGNvbnN0IHRvcCA9IGV2ZW50LnBhZ2VZIC0gc3RhcnQuWSArIHN0YXJ0LnRvcCArICJweCI7CiAgICBjb25zdCBsZWZ0ID0gZXZlbnQucGFnZVggLSBzdGFydC5YICsgc3RhcnQubGVmdCArICJweCI7CiAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9IHRvcDsKICB9CgogIC8vIG1vdmUgb3VyIGFic29sdXRlbHkgcG9zaXRpb25lZCBiYWxsIHVuZGVyIHRoZSBwb2ludGVyCiAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQpIHsKICAgIG1vdmVBdChldmVudCwgc3RhcnQpOwogIH0KCiAgLy8gV2UgdXNlIHRoaXMgdG8gcmVtb3ZlIHRoZSBtb3VzZW1vdmUgd2hlbiBjbGlja2luZyBvdXRzaWRlIG9mIHRoZSBjb250YWluZXIKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICAvLyBtb3ZlIHRoZSBjb250YWluZXIgb24gbW91c2Vtb3ZlCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgb25Nb3VzZU1vdmUsIHsKICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsCiAgfSk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgY2xlYW5VcCgpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7CgogIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICBjb25zb2xlLmxvZygiY2xlYW5pbmcgdXAgdGhlIHBsb3QgbW92ZSBsaXN0ZW5lciIpOwogICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBudWxsOwogIH0KCiAgLy8gKDMpIGRyb3AgdGhlIGJhbGwsIHJlbW92ZSB1bm5lZWRlZCBoYW5kbGVycwogIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gY2xlYW5VcDsKfTsKCmZ1bmN0aW9uIHNlbmRUb0NsaXBib2FyZChibG9iKSB7CiAgaWYgKCFuYXZpZ2F0b3IuY2xpcGJvYXJkKSB7CiAgICBhbGVydCgKICAgICAgIlRoZSBDbGlwYm9hcmQgQVBJIGRvZXMgbm90IHNlZW0gdG8gYmUgYXZhaWxhYmxlLCBtYWtlIHN1cmUgdGhlIFBsdXRvIG5vdGVib29rIGlzIGJlaW5nIHVzZWQgZnJvbSBlaXRoZXIgbG9jYWxob3N0IG9yIGFuIGh0dHBzIHNvdXJjZS4iCiAgICApOwogIH0KICBuYXZpZ2F0b3IuY2xpcGJvYXJkCiAgICAud3JpdGUoWwogICAgICBuZXcgQ2xpcGJvYXJkSXRlbSh7CiAgICAgICAgLy8gVGhlIGtleSBpcyBkZXRlcm1pbmVkIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBibG9iJ3MgdHlwZS4KICAgICAgICBbYmxvYi50eXBlXTogYmxvYiwKICAgICAgfSksCiAgICBdKQogICAgLnRoZW4oCiAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICBjb25zb2xlLmxvZygiQXN5bmM6IENvcHlpbmcgdG8gY2xpcGJvYXJkIHdhcyBzdWNjZXNzZnVsISIpOwogICAgICB9LAogICAgICBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiQXN5bmM6IENvdWxkIG5vdCBjb3B5IHRleHQ6ICIsIGVycik7CiAgICAgIH0KICAgICk7Cn0KCmZ1bmN0aW9uIGNvcHlJbWFnZVRvQ2xpcGJvYXJkKCkgewogIC8vIFdlIGV4dHJhY3QgdGhlIGltYWdlIG9wdGlvbnMgZnJvbSB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycyAoaWYgdGhleSBleGlzdCkKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LiBXZSBhbHNvIGlnbm9yZSBmb3JtYXQgYmVjYXVzZSB0aGUgY2xpcGJvYXJkIG9ubHkgc3VwcG9ydHMgcG5nLgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gImZvcm1hdCIpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LnRvSW1hZ2UoUExPVCwgY29uZmlnKS50aGVuKGZ1bmN0aW9uIChkYXRhVXJsKSB7CiAgICBmZXRjaChkYXRhVXJsKQogICAgICAudGhlbigocmVzKSA9PiByZXMuYmxvYigpKQogICAgICAudGhlbigoYmxvYikgPT4gewogICAgICAgIGNvbnN0IHBhc3RlX3JlY2VpdmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigncGFzdGUtcmVjZWl2ZXIucGx1dG9wbG90bHknKQogICAgICAgIGlmIChwYXN0ZV9yZWNlaXZlcikgewogICAgICAgICAgcGFzdGVfcmVjZWl2ZXIuYXR0YWNoSW1hZ2UoZGF0YVVybCwgQ09OVEFJTkVSKQogICAgICAgIH0KICAgICAgICBzZW5kVG9DbGlwYm9hcmQoYmxvYikKICAgICAgfSk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHNhdmVJbWFnZVRvRmlsZSgpIHsKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS5kb3dubG9hZEltYWdlKFBMT1QsIGNvbmZpZyk7Cn0KCmxldCBjb250YWluZXJfcmVjdCA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCwgdG9wOiAwLCBsZWZ0OiAwIH07CmZ1bmN0aW9uIHVucG9wX2NvbnRhaW5lcihjbCkgewogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgZmFsc2UpOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBmYWxzZSk7CiAgLy8gV2UgZml4IHRoZSBoZWlnaHQgYmFjayB0byB0aGUgdmFsdWUgaXQgaGFkIGJlZm9yZSBwb3BvdXQsIGFsc28gc2V0dGluZyB0aGUgZmxhZyB0byBzaWduYWwgdGhhdCB1cG9uIGZpcnN0IHJlc2l6ZSB3ZSByZW1vdmUgdGhlIGZpeGVkIGlubGluZS1zdHlsZQogIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQgKyAicHgiOwogIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IHRydWU7CiAgLy8gV2Ugc2V0IHRoZSBvdGhlciBmaXhlZCBpbmxpbmUtc3R5bGVzIHRvIG51bGwKICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICBDT05UQUlORVIuc3R5bGUudG9wID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBXZSBhbHNvIHJlbW92ZSB0aGUgQ0xJUEJPQVJEX0hFQURFUgogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSAiIjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBGaW5hbGx5IHdlIHJlbW92ZSB0aGUgaGlkZGVuIGNsYXNzIHRvIHRoZSBoZWFkZXIKICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIHRydWUpOwogIHJldHVybjsKfQpmdW5jdGlvbiBwb3BvdXRfY29udGFpbmVyKG9wdHMpIHsKICBjb25zdCBjbCA9IG9wdHM/LmNsOwogIGNvbnN0IHRhcmdldF9jb250YWluZXJfc2l6ZSA9IG9wdHM/LnRhcmdldF9jb250YWluZXJfc2l6ZSA/PyB7fTsKICBjb25zdCB0YXJnZXRfcGxvdF9zaXplID0gb3B0cz8udGFyZ2V0X3Bsb3Rfc2l6ZSA/PyB7fTsKICBpZiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIHJldHVybiB1bnBvcF9jb250YWluZXIoY2wpOwogIH0KICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgY2wgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdHJ1ZSk7CiAgLy8gV2UgZXh0cmFjdCB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjb250YWluZXIsIHNhdmUgdGhlbSBhbmQgZml4IHRoZW0KICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9ID0gQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogIGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfTsKICAvLyBXZSBzYXZlIHRoZSBjdXJyZW50IHBsb3Qgc2l6ZSBiZWZvcmUgd2UgcG9wIGFzIGl0IHdpbGwgZmlsbCB0aGUgc2NyZWVuCiAgY29uc3QgY3VycmVudF9wbG90X3NpemUgPSB7CiAgICB3aWR0aDogUExPVC5fZnVsbExheW91dC53aWR0aCwKICAgIGhlaWdodDogUExPVC5fZnVsbExheW91dC5oZWlnaHQsCiAgfTsKICAvLyBXZSBoYXZlIHRvIHNhdmUgdGhlIHBhZCBkYXRhIGJlZm9yZSBwb3BwaW5nIHNvIHdlIGNhbiByZXNpemUgcHJlY2lzZWx5CiAgY29uc3QgcGFkID0ge307CiAgcGFkLnVucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgdHJ1ZSk7CiAgcGFkLnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICAvLyBXZSBkbyB0b3AgYW5kIGxlZnQgYmFzZWQgb24gdGhlIGN1cnJlbnQgcmVjdAogIGZvciAoY29uc3Qga2V5IG9mIFsidG9wIiwgImxlZnQiXSkgewogICAgY29uc3Qgc3RhcnRfdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY29udGFpbmVyX3JlY3Rba2V5XTsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgZm9yIChjb25zdCBraW5kIG9mIFsicGFkZGluZyIsICJib3JkZXIiXSkgewogICAgICBvZmZzZXQgKz0gcGFkLnBvcHBlZFtraW5kXVtrZXldIC0gcGFkLnVucG9wcGVkW2tpbmRdW2tleV07CiAgICB9CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHN0YXJ0X3ZhbCAtIG9mZnNldCArICJweCI7CiAgICBpZiAoa2V5ID09PSAibGVmdCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIC8vIFdlIGNvbXB1dGUgdGhlIHdpZHRoIGFuZCBoZWlnaHQgZGVwZW5kaW5nIG9uIGV2ZW50dWFsIGNvbmZpZyBkYXRhCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoewogICAgd2lkdGg6CiAgICAgIHRhcmdldF9wbG90X3NpemUud2lkdGggPz8KICAgICAgY29uZmlnX3NwYW5zLndpZHRoLmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS5oZWlnaHQgPz8KICAgICAgY29uZmlnX3NwYW5zLmhlaWdodC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUuaGVpZ2h0LAogIH0pOwogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIGNvbnN0IHZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNzeltrZXldOwogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSB2YWwgKyAicHgiOwogICAgaWYgKGtleSA9PT0gIndpZHRoIikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCBmYWxzZSk7CiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgdW5wb3BfY29udGFpbmVyKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKfQoKQ09OVEFJTkVSLnBvcE91dCA9IHBvcG91dF9jb250YWluZXI7CgpmdW5jdGlvbiBEdWFsQ2xpY2soc2luZ2xlX2Z1bmMsIGRibF9mdW5jKSB7CiAgbGV0IG5jbGlja3MgPSAwOwogIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykgewogICAgbmNsaWNrcyArPSAxOwogICAgaWYgKG5jbGlja3MgPiAxKSB7CiAgICAgIGRibF9mdW5jKC4uLmFyZ3MpOwogICAgICBuY2xpY2tzID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIGRlbGF5KDMwMCkudGhlbigoKSA9PiB7CiAgICAgICAgaWYgKG5jbGlja3MgPT0gMSkgewogICAgICAgICAgc2luZ2xlX2Z1bmMoLi4uYXJncyk7CiAgICAgICAgfQogICAgICAgIG5jbGlja3MgPSAwOwogICAgICB9KTsKICAgIH0KICB9Owp9CgovLyBXZSByZW1vdmUgdGhlIGRlZmF1bHQgZG93bmxvYWQgaW1hZ2UgYnV0dG9uCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSwKICBbInRvSW1hZ2UiXQopOwovLyBXZSBhZGQgdGhlIGN1c3RvbSBidXR0b24gdG8gdGhlIG1vZGViYXIKcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkLAogIFsKICAgIHsKICAgICAgbmFtZTogIkNvcHkgUE5HIHRvIENsaXBib2FyZCIsCiAgICAgIGljb246IHsKICAgICAgICBoZWlnaHQ6IDUyMCwKICAgICAgICB3aWR0aDogNTIwLAogICAgICAgIHBhdGg6ICJNMjgwIDY0aDQwYzM1LjMgMCA2NCAyOC43IDY0IDY0VjQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEg2NGMtMzUuMyAwLTY0LTI4LjctNjQtNjRWMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0aDQwIDkuNkMxMjEgMjcuNSAxNTMuMyAwIDE5MiAwczcxIDI3LjUgNzguNCA2NEgyODB6TTY0IDExMmMtOC44IDAtMTYgNy4yLTE2IDE2VjQ0OGMwIDguOCA3LjIgMTYgMTYgMTZIMzIwYzguOCAwIDE2LTcuMiAxNi0xNlYxMjhjMC04LjgtNy4yLTE2LTE2LTE2SDMwNHYyNGMwIDEzLjMtMTAuNyAyNC0yNCAyNEgxOTIgMTA0Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNFYxMTJINjR6bTEyOC04YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHoiLAogICAgICB9LAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soY29weUltYWdlVG9DbGlwYm9hcmQsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKCk7CiAgICAgIH0pLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIkRvd25sb2FkIEltYWdlIiwKICAgICAgaWNvbjogUGxvdGx5Lkljb25zLmNhbWVyYSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKHNhdmVJbWFnZVRvRmlsZSwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoeyBjbDogImZpbGVzYXZlIiB9KTsKICAgICAgfSksCiAgICB9LAogIF0KKTsKCmZ1bmN0aW9uIGdldE9mZnNldERhdGEoZWwpIHsKICBsZXQgY3MgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgbnVsbCk7CiAgY29uc3Qgb2RhdGEgPSB7CiAgICBwYWRkaW5nOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgfSwKICAgIGJvcmRlcjogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgfQogIH07CiAgaWYgKGVsID09PSBQTE9UKSB7CiAgICAvLyBGb3IgdGhlIFBMT1Qgd2UgYWxzbyB3YW50IHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBvZmZzZXQKICAgIG9kYXRhLm9mZnNldCA9IHsKICAgICAgdG9wOiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldFRvcCA6IDAsCiAgICAgIGxlZnQ6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0TGVmdCA6IDAsCiAgICB9CiAgfQogIHJldHVybiBvZGF0YTsKfQpmdW5jdGlvbiBnZXRTaXplRGF0YSgpIHsKICBjb25zdCBkYXRhID0gewogICAgcGxvdF9wYWQ6IGdldE9mZnNldERhdGEoUExPVCksCiAgICBwbG90X3JlY3Q6IFBMT1QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgICBjb250YWluZXJfcGFkOiBnZXRPZmZzZXREYXRhKENPTlRBSU5FUiksCiAgICBjb250YWluZXJfcmVjdDogQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogIH07CiAgcmV0dXJuIGRhdGE7Cn0KZnVuY3Rpb24gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGNvbnN0IGNvbXB1dGVkX3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIGNvbnN0IG9mZnNldHMgPSBjb21wdXRlZF9zaXplLm9mZnNldHM7CgogIGNvbnN0IHBsb3RfZGF0YSA9IHsKICAgIHdpZHRoOiB3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiBoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfTsKCiAgcmV0dXJuIHsKICAgIHdpZHRoOiAod2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCkgKyBvZmZzZXRzLndpZHRoLAogICAgaGVpZ2h0OiAoaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0KSArIG9mZnNldHMuaGVpZ2h0LAogICAgbm9DaGFuZ2U6IHdpZHRoID09IGNvbXB1dGVkX3NpemUud2lkdGggJiYgaGVpZ2h0ID09IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH0KfQoKLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGNoYW5nZSB0aGUgY29udGFpbmVyIHNpemUgc28gdGhhdCB0aGUgcmVzdWx0aW5nIHBsb3Qgd2lsbCBiZSBtYXRjaGluZyB0aGUgcHJvdmlkZWQgc3BlY3MKZnVuY3Rpb24gY2hhbmdlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgaWYgKCFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgY29uc29sZS5sb2coIlRyaWVkIHRvIGNoYW5nZSBjb250YWluZXIgc2l6ZSB3aGVuIG5vdCBwb3BwZWQsIGlnbm9yaW5nIik7CiAgICByZXR1cm47CiAgfQoKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEpOwoKICBpZiAoY3N6Lm5vQ2hhbmdlKSB7CiAgICBjb25zb2xlLmxvZygiU2l6ZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50LCBpZ25vcmluZyIpOwogICAgcmV0dXJuCiAgfQogIC8vIFdlIGFyZSBub3cgZ29pbmcgdG8gc2V0IGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGNvbnRhaW5lcgogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gY3N6W2tleV0gKyAicHgiOwogIH0KfQovLyBXZSBub3cgY3JlYXRlIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgdXBkYXRlIHRoZSBwbG90IGJhc2VkIG9uIHRoZSB2YWx1ZXMgc3BlY2lmaWVkCmZ1bmN0aW9uIHVwZGF0ZUZyb21IZWFkZXIoKSB7CiAgY29uc3QgaGVhZGVyX2RhdGEgPSB7CiAgICBoZWlnaHQ6IGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUsCiAgICB3aWR0aDogY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlLAogIH07CiAgY2hhbmdlQ29udGFpbmVyU2l6ZShoZWFkZXJfZGF0YSk7Cn0KLy8gV2UgYXNzaWduIHRoaXMgZnVuY3Rpb24gdG8gdGhlIG9uYmx1ciBldmVudCBvZiB3aWR0aCBhbmQgaGVpZ2h0CmlmIChmaXJzdFJ1bikgewogIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLnVpX3NwYW4ub25ibHVyID0gKGUpID0+IHsKICAgICAgY29udGFpbmVyLnVpX3ZhbHVlID0gY29udGFpbmVyLnVpX3NwYW4udGV4dENvbnRlbnQ7CiAgICAgIHVwZGF0ZUZyb21IZWFkZXIoKTsKICAgIH07CiAgfQp9Ci8vIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIHBsb3Qgc2l6ZSB0byB1c2UgZm9yIHJlbGF5b3V0IGFzIGEgZnVuY3Rpb24gb2YgdGhlIGNvbnRhaW5lciBzaXplCmZ1bmN0aW9uIGNvbXB1dGVQbG90U2l6ZShkYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIC8vIFJlbW92ZSBQYWRkaW5nCiAgY29uc3QgeyBjb250YWluZXJfcGFkLCBwbG90X3BhZCwgY29udGFpbmVyX3JlY3QgfSA9IGRhdGE7CiAgY29uc3Qgb2Zmc2V0cyA9IHsKICAgIHdpZHRoOgogICAgICBwbG90X3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLndpZHRoICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LmxlZnQgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci53aWR0aCwKICAgIGhlaWdodDoKICAgICAgcGxvdF9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBwbG90X3BhZC5ib3JkZXIuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LnRvcCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci5oZWlnaHQsCiAgfTsKICBjb25zdCBzeiA9IHsKICAgIHdpZHRoOiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LndpZHRoIC0gb2Zmc2V0cy53aWR0aCksCiAgICBoZWlnaHQ6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3QuaGVpZ2h0IC0gb2Zmc2V0cy5oZWlnaHQpLAogICAgb2Zmc2V0cywKICB9OwogIHJldHVybiBzejsKfQoKLy8gQ3JlYXRlIHRoZSByZXNpemVPYnNlcnZlciB0byBtYWtlIHRoZSBwbG90IGV2ZW4gbW9yZSByZXNwb25zaXZlISA6bWFnaWM6CmNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7CiAgY29uc3Qgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpOwogIGNvbnN0IHtjb250YWluZXJfcmVjdCwgY29udGFpbmVyX3BhZH0gPSBzaXplRGF0YTsKICBsZXQgcGxvdF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICAvLyBXZSBzYXZlIHRoZSBoZWlnaHQgaW4gdGhlIFBMT1Qgb2JqZWN0CiAgUExPVC5jb250YWluZXJfaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0OwogIC8vIFdlIGRlYWwgd2l0aCBzb21lIHN0dWZmIGlmIHRoZSBjb250YWluZXIgaXMgcG9wcHBlZAogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSBjb250YWluZXJfcmVjdC53aWR0aCArICJweCI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gY29udGFpbmVyX3JlY3QubGVmdCArICJweCI7CiAgY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS5oZWlnaHQ7CiAgY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlID0gcGxvdF9zaXplLndpZHRoOwogIC8qIAoJCVRoZSBhZGRpdGlvbiBvZiB0aGUgaW52YWxpZCBhcmd1bWVudCBgcGx1dG9yZXNpemVgIHNlZW1zIHRvIGZpeCB0aGUgcHJvYmxlbSB3aXRoIGNhbGxpbmcgYHJlbGF5b3V0YCBzaW1wbHkgd2l0aCBge2F1dG9zaXplOiB0cnVlfWAgYXMgdXBkYXRlIGJyZWFraW5nIG1vdXNlIHJlbGF5b3V0IGV2ZW50cyB0cmFja2luZy4gCgkJU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wbG90bHkvcGxvdGx5LmpzL2lzc3Vlcy82MTU2IGZvciBkZXRhaWxzCgkJKi8KICBsZXQgY29uZmlnID0gewogICAgLy8gSWYgdGhpcyBpcyBwb3BwZWQgb3V0LCB3ZSBpZ25vcmUgdGhlIG9yaWdpbmFsIHdpZHRoL2hlaWdodAogICAgd2lkdGg6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX3dpZHRoKSA/PyBwbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX2hlaWdodCkgPz8gcGxvdF9zaXplLmhlaWdodCwKICAgIHBsdXRvcmVzaXplOiB0cnVlLAogIH07CiAgUGxvdGx5LnJlbGF5b3V0KFBMT1QsIGNvbmZpZykudGhlbigoKSA9PiB7CiAgICBpZiAocmVtb3ZlX2NvbnRhaW5lcl9zaXplICYmICFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBhdm9pZCB0aGUgZmlyc3QgcmVzaXplIHVwb24gcGxvdCBjcmVhdGlvbiB0byBhbHJlYWR5IGJlIHdpdGhvdXQgYSBmaXhlZCBoZWlnaHQKICAgICAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9ICIiOwogICAgICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICAgICAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmFsc2U7CiAgICB9CiAgfSk7Cn0pOwoKcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShDT05UQUlORVIpOwoKClBsb3RseS5yZWFjdChQTE9ULCBwbG90X29iaikudGhlbigoKSA9PiB7CgkvLyBBc3NpZ24gdGhlIFBsb3RseSBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhwbG90bHlfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1Qub24oa2V5LCBsaXN0ZW5lcikKCQl9Cgl9CgkvLyBBc3NpZ24gdGhlIEpTIGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKGpzX2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULmFkZEV2ZW50TGlzdGVuZXIoa2V5LCBsaXN0ZW5lciwgewoJCQkJc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbAoJCQl9KQoJCX0KCX0KfQopCgoKaW52YWxpZGF0aW9uLnRoZW4oKCkgPT4gewoJLy8gUmVtb3ZlIGFsbCBwbG90bHkgbGlzdGVuZXJzCglQTE9ULnJlbW92ZUFsbExpc3RlbmVycygpCgkvLyBSZW1vdmUgYWxsIEpTIGxpc3RlbmVycwoJY29udHJvbGxlci5hYm9ydCgpCgkvLyBSZW1vdmUgdGhlIHJlc2l6ZU9ic2VydmVyCglyZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCkKfSkKCgoKCQlyZXR1cm4gQ09OVEFJTkVSCgk8L3NjcmlwdD4KpG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv8hOyASKsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQxYzc5YjM3ZS1kNGUwLTQ5MGYtOTQ2Ni0yMGNlMjhmMDE3YWW5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4EG5fstXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5HZNTdiY2MwNWIwLTgxZGEtMTFlZi0yMDQwLTM1ODVjOWI0OTU0Zi82NzQ3MTk1ZjE4ZTMzNzk5uGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJGFiOGRjMWNlLWQxZWYtNDNhMC05NDk1LWRhYzkzMWI1MmFlY4qmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHmkdHJ1ZaRtaW1lqnRleHQvcGxhaW6scm9vdGFzc2lnbmVlsWFjdGl2aXR5X2ZpbmlzaGVksmxhc3RfcnVuX3RpbWVzdGFtcMtB2b/ITtXlEbBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkYWI4ZGMxY2UtZDFlZi00M2EwLTk0OTUtZGFjOTMxYjUyYWVjuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXNKyq1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQ4YjRhMWFkOS0yZDZhLTRjOGYtYmI4ZS1mNDNjMmQwNTgxOTWKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52mqJCTxzY3JpcHQgaWQ9J3Bsb3RfMSc+CgkJLy8gV2Ugc3RhcnQgYnkgcHV0dGluZyBhbGwgdGhlIHZhcmlhYmxlIGludGVycG9sYXRpb24gaGVyZSBhdCB0aGUgYmVnaW5uaW5nCgkJLy8gV2UgaGF2ZSB0byBjb252ZXJ0IGFsbCB0eXBlZGFycmF5cyBpbiB0aGUgbGF5b3V0IHRvIG5vcm1hbCBhcnJheXMuIFNlZSBJc3N1ZSAjMjUKCQkvLyBXZSB1c2UgbG9kYXNoIGZvciB0aGlzIGZvciBjb21wYWN0bmVzcwoJCWZ1bmN0aW9uIHJlbW92ZVR5cGVkQXJyYXkobykgewoJCQlyZXR1cm4gXy5pc1R5cGVkQXJyYXkobykgPyBBcnJheS5mcm9tKG8pIDoKCQkJXy5pc1BsYWluT2JqZWN0KG8pID8gXy5tYXBWYWx1ZXMobywgcmVtb3ZlVHlwZWRBcnJheSkgOiAKCQkJbwoJCX0KCgkJLy8gUHVibGlzaCB0aGUgcGxvdCBvYmplY3QgdG8gSlMKCQlsZXQgcGxvdF9vYmogPSBfLnVwZGF0ZSgvKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIEFic3RyYWN0UGx1dG9EaW5nZXRqZXMuRGlzcGxheS5wdWJsaXNoZWRfdG9fanMgKi8gZ2V0UHVibGlzaGVkT2JqZWN0KCI3YmNjMDViMC04MWRhLTExZWYtMjA0MC0zNTg1YzliNDk1NGYvM2FlMDliMDgxMjk5NjFkNiIpLCAibGF5b3V0IiwgcmVtb3ZlVHlwZWRBcnJheSkKCQkvLyBHZXQgdGhlIHBsb3RseSBsaXN0ZW5lcnMKCQljb25zdCBwbG90bHlfbGlzdGVuZXJzID0ge30KCQkvLyBHZXQgdGhlIEpTIGxpc3RlbmVycwoJCWNvbnN0IGpzX2xpc3RlbmVycyA9IHt9CgkJLy8gRGVhbCB3aXRoIGV2ZW50dWFsIGN1c3RvbSBjbGFzc2VzCgkJbGV0IGN1c3RvbV9jbGFzc2xpc3QgPSBbXQoKCgkJLy8gTG9hZCB0aGUgcGxvdGx5IGxpYnJhcnkKCQlsZXQgUGxvdGx5ID0gdW5kZWZpbmVkCgkJdHJ5IHsKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoIi4vcGxvdGx5anMvcGxvdGx5anMtMi4yNi4yLm1pbi5qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0gY2F0Y2ggKGUpIHsKCQkJY29uc29sZS5sb2coIkxvY2FsIGxvYWQgZmFpbGVkLCB0cnlpbmcgd2l0aCB0aGUgd2ViIGVzbS5zaCB2ZXJzaW9uIikKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoImh0dHBzOi8vZXNtLnNoL3YxMzUvcGxvdGx5LmpzLWRpc3QtbWluQDIuMjYuMi9lc25leHQvcGxvdGx5LmpzLWRpc3QtbWluLm1qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0KCgkJLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0byBmb3JjZSBsb2NhbCBtYXRoamF4IGZvbnQgY2FjaGUKCQlpZiAoZmFsc2UgJiYgd2luZG93Py5NYXRoSmF4Py5jb25maWc/LnN2Zz8uZm9udENhY2hlID09PSAnZ2xvYmFsJykgewoJCQl3aW5kb3cuTWF0aEpheC5jb25maWcuc3ZnLmZvbnRDYWNoZSA9ICdsb2NhbCcKCQl9CgoJCS8vIEZsYWcgdG8gY2hlY2sgaWYgdGhpcyBjZWxsIHdhcyAgbWFudWFsbHkgcmFuIG9yIHJlYWN0aXZlbHkgcmFuCmNvbnN0IGZpcnN0UnVuID0gdGhpcyA/IGZhbHNlIDogdHJ1ZQpjb25zdCBDT05UQUlORVIgPSB0aGlzID8/IGh0bWxgPGRpdiBjbGFzcz0ncGx1dG9wbG90bHktY29udGFpbmVyJz5gCmNvbnN0IFBMT1QgPSBDT05UQUlORVIucXVlcnlTZWxlY3RvcignLmpzLXBsb3RseS1wbG90JykgPz8gQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgPGRpdj5gKQpjb25zdCBwYXJlbnQgPSBDT05UQUlORVIucGFyZW50RWxlbWVudAovLyBXZSB1c2UgYSBjb250cm9sbGVyIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lcnMgdXBvbiBpbnZhbGlkYXRpb24KY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKQovLyBXZSBoYXZlIHRvIGFkZCB0aGlzIHRvIGtlZXAgc3VwcG9ydGluZyBAYmluZCB3aXRoIHRoZSBvbGQgQVBJIHVzaW5nIFBMT1QKUExPVC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChlKSA9PiB7CglDT05UQUlORVIudmFsdWUgPSBQTE9ULnZhbHVlCglpZiAoZS5idWJibGVzKSB7CgkJcmV0dXJuCgl9CglDT05UQUlORVIuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2lucHV0JykpCn0sIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KQoKCS8vIFRoaXMgY3JlYXRlIHRoZSBzdHlsZSBzdWJkaXYgb24gZmlyc3QgcnVuCglmaXJzdFJ1biAmJiBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGAKCTxzdHlsZT4KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgewoJCXdpZHRoOiAxMDAlOwoJCWhlaWdodDogMTAwJTsKCQltaW4taGVpZ2h0OiAwOwoJCW1pbi13aWR0aDogMDsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgLmpzLXBsb3RseS1wbG90IC5wbG90bHkgZGl2IHsKCQltYXJnaW46IDAgYXV0bzsgLy8gVGhpcyBjZW50ZXJzIHRoZSBwbG90Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLnBvcHBlZC1vdXQgewoJCW92ZXJmbG93OiBhdXRvOwoJCXotaW5kZXg6IDEwMDA7CgkJcG9zaXRpb246IGZpeGVkOwoJCXJlc2l6ZTogYm90aDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDBweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMHB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgewoJCWRpc3BsYXk6IGZsZXg7CgkJZmxleC1mbG93OiByb3cgd3JhcDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAxMnB4OwoJCXBvc2l0aW9uOiBmaXhlZDsKCQl6LWluZGV4OiAxMDAxOwoJCWN1cnNvcjogbW92ZTsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIC0xMDAlKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBzcGFuIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJZmxleDogMQoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIuaGlkZGVuIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuIHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlIHsKCQlwYWRkaW5nLXJpZ2h0OiA1cHg7CgkJcGFkZGluZy1sZWZ0OiAycHg7CgkJY3Vyc29yOiB0ZXh0OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZmxleDogMCAwIDEwMCU7CgkJdGV4dC1hbGlnbjogY2VudGVyOwoJCWJvcmRlci10b3A6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQltYXJnaW4tdG9wOiA1cHg7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZpbGVuYW1lIHsKCQltYXJnaW4tbGVmdDogM3B4OwoJCXRleHQtYWxpZ246IGxlZnQ7CgkJbWluLXdpZHRoOiBtaW4oNjAlLCBtaW4tY29udGVudCk7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCAubGFiZWwgewoJCWZsZXg6IDAgMCAwOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5mb3JtYXQgewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCQlmbGV4OiAxIDAgYXV0bzsKCQltaW4td2lkdGg6IDMwcHg7CgkJbWFyZ2luLXJpZ2h0OiAxMHB4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCQlmbGV4LWZsb3c6IGNvbHVtbjsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlwYWRkaW5nLWxlZnQ6IDNweDsKCQl6LWluZGV4OiAyMDAwOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIHsKCQljdXJzb3I6IHBvaW50ZXI7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJcGFkZGluZzogM3B4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKC0zcHgsIC02cHgpOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpub3QoLnNlbGVjdGVkKSB7CgkJbWFyZ2luLXRvcDogM3B4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uLnNlbGVjdGVkIHsKCQlvcmRlcjogLTE7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246aG92ZXIgewoJCWJhY2tncm91bmQtY29sb3I6IHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJfQoJc3Bhbi5jb25maWctdmFsdWUgewoJCWZvbnQtd2VpZ2h0OiBub3JtYWw7CgkJY29sb3I6IHZhcigtLXBsdXRvLW91dHB1dC1jb2xvcik7CgkJZGlzcGxheTogbm9uZTsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIGNhbGMoLTEwMCUgLSAxMHB4KSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLmxhYmVsIHsKCQl1c2VyLXNlbGVjdDogbm9uZTsKCX0KCS5sYWJlbDpob3ZlciBzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCW1pbi13aWR0aDogMTUwcHg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4ubWF0Y2hpbmctY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLW1hY3JvLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5kaWZmZXJlbnQtY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLXRhZy1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9Cjwvc3R5bGU+CmApCgpsZXQgb3JpZ2luYWxfaGVpZ2h0ID0gcGxvdF9vYmoubGF5b3V0LmhlaWdodApsZXQgb3JpZ2luYWxfd2lkdGggPSBwbG90X29iai5sYXlvdXQud2lkdGgKLy8gRm9yIHRoZSBoZWlnaHQgd2UgaGF2ZSB0byBhbHNvIHB1dCBhIGZpeGVkIHZhbHVlIGluIGNhc2UgdGhlIHBsb3QgaXMgcHV0IG9uIGEgbm9uLWZpeGVkLXNpemUgY29udGFpbmVyIChsaWtlIHRoZSBkZWZhdWx0IHdyYXBwZXIpCi8vIFdlIGRlZmluZSBhIHZhcmlhYmxlIHRvIGNoZWNrIHdoZXRoZXIgd2Ugc3RpbGwgaGF2ZSB0byByZW1vdmUgdGhlIGZpeGVkIGhlaWdodApsZXQgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmlyc3RSdW4KbGV0IGNvbnRhaW5lcl9oZWlnaHQgPSBvcmlnaW5hbF9oZWlnaHQgPz8gUExPVC5jb250YWluZXJfaGVpZ2h0ID8/IDQwMApDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX2hlaWdodCArICdweCcKCi8vIFdlIGNyZWF0ZSBhIFByb21pc2UgdmVyc2lvbiBvZiBzZXRUaW1lb3V0CmZ1bmN0aW9uIGRlbGF5KG1zKSB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7Cn0KCi8vIFdlIGltcG9ydCBpbnRlcmFjdCBmb3IgZHJhZ2dpbmcvcmVzaXppbmcKY29uc3QgeyBkZWZhdWx0OiBpbnRlcmFjdCB9ID0gYXdhaXQgaW1wb3J0KCdodHRwczovL2VzbS5zaC9pbnRlcmFjdGpzQDEuMTAuMTknKQoKCmZ1bmN0aW9uIGdldEltYWdlT3B0aW9ucygpIHsKICBjb25zdCBvID0gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogIHJldHVybiB7CiAgICBmb3JtYXQ6IG8uZm9ybWF0ID8/ICJwbmciLAogICAgd2lkdGg6IG8ud2lkdGggPz8gb3JpZ2luYWxfd2lkdGgsCiAgICBoZWlnaHQ6IG8uaGVpZ2h0ID8/IG9yaWdpbmFsX2hlaWdodCwKICAgIHNjYWxlOiBvLnNjYWxlID8/IDEsCiAgICBmaWxlbmFtZTogby5maWxlbmFtZSA/PyAibmV3cGxvdCIsCiAgfTsKfQoKY29uc3QgQ0xJUEJPQVJEX0hFQURFUiA9CiAgQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoIi5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIikgPz8KICBDT05UQUlORVIuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgImFmdGVyYmVnaW4iLAogICAgaHRtbGA8ZGl2IGNsYXNzPSJwbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIGhpZGRlbiI+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmb3JtYXQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+Rm9ybWF0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZvcm1hdCI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB3aWR0aCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5XaWR0aDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSB3aWR0aCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGhlaWdodCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5IZWlnaHQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgaGVpZ2h0Ij48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2NhbGUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+U2NhbGU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgc2NhbGUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzZXQiPlNldDwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB1bnNldCI+VW5zZXQ8L2J1dHRvbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZpbGVuYW1lIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZpbGVuYW1lOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZpbGVuYW1lIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgIDwvZGl2PmAKICApOwoKZnVuY3Rpb24gY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcikgewogIGNvbnN0IHZhbGlkX2NsYXNzZXMgPSBbCiAgICAibWlzc2luZy1jb25maWciLAogICAgIm1hdGNoaW5nLWNvbmZpZyIsCiAgICAiZGlmZmVyZW50LWNvbmZpZyIsCiAgXTsKICBmdW5jdGlvbiBzZXRDbGFzcyhjbCkgewogICAgZm9yIChjb25zdCBuYW1lIG9mIHZhbGlkX2NsYXNzZXMpIHsKICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUobmFtZSwgbmFtZSA9PSBjbCk7CiAgICB9CiAgfQogIC8vIFdlIHVzZSB0aGUgY3VzdG9tIGdldHRlcnMgd2UnbGwgc2V0IHVwIGluIHRoZSBjb250YWluZXIKICBjb25zdCB7IHVpX3ZhbHVlLCBjb25maWdfdmFsdWUsIGNvbmZpZ19zcGFuLCBrZXkgfSA9IGNvbnRhaW5lcjsKICBpZiAoY29uZmlnX3ZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgIHNldENsYXNzKCJtaXNzaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBpcyBub3QgcHJlc2VudCBpbiB0aGUgY29uZmlnLmA7CiAgfSBlbHNlIGlmICh1aV92YWx1ZSA9PSBjb25maWdfdmFsdWUpIHsKICAgIHNldENsYXNzKCJtYXRjaGluZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIHRoZSBzYW1lIHZhbHVlIGluIHRoZSBjb25maWcgYW5kIGluIHRoZSBoZWFkZXIuYDsKICB9IGVsc2UgewogICAgc2V0Q2xhc3MoImRpZmZlcmVudC1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIGEgZGlmZmVyZW50IHZhbHVlICg8ZW0+JHtjb25maWdfdmFsdWV9PC9lbT4pIGluIHRoZSBjb25maWcuYDsKICB9CiAgLy8gQWRkIGluZm8gYWJvdXQgc2V0dGluZyBhbmQgdW5zZXR0aW5nCiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIG9uIHRoZSBsYWJlbCA8ZW0+PGI+b25jZTwvYj48L2VtPiB0byBzZXQgdGhlIGN1cnJlbnQgVUkgdmFsdWUgaW4gdGhlIGNvbmZpZy5gCiAgKTsKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgPGVtPjxiPnR3aWNlPC9iPjwvZW0+IHRvIHJlbW92ZSB0aGlzIGtleSBmcm9tIHRoZSBjb25maWcuYAogICk7Cn0KCmNvbnN0IHZhbGlkX2Zvcm1hdHMgPSBbInBuZyIsICJzdmciLCAid2VicCIsICJqcGVnIiwgImZ1bGwtanNvbiJdOwpmdW5jdGlvbiBpbml0aWFsaXplVUlWYWx1ZVNwYW4oc3Bhbiwga2V5LCB2YWx1ZSkgewogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSBrZXkgPT09ICJmb3JtYXQiID8gImZhbHNlIiA6ICJ0cnVlIjsKICBsZXQgcGFyc2UgPSAoeCkgPT4geDsKICBsZXQgdXBkYXRlID0gKHgpID0+IChzcGFuLnRleHRDb250ZW50ID0geCk7CiAgaWYgKGtleSA9PT0gIndpZHRoIiB8fCBrZXkgPT09ICJoZWlnaHQiKSB7CiAgICBwYXJzZSA9ICh4KSA9PiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoeCkpOwogIH0gZWxzZSBpZiAoa2V5ID09PSAic2NhbGUiKSB7CiAgICBwYXJzZSA9IHBhcnNlRmxvYXQ7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAvLyBXZSByZW1vdmUgY29udGVudEVkaXRhYmxlCiAgICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9ICJmYWxzZSI7CiAgICAvLyBIZXJlIHdlIGZpcnN0IGFkZCB0aGUgc3Vic3BhbnMgZm9yIGVhY2ggb3B0aW9uCiAgICBjb25zdCBvcHRzX2RpdiA9IHNwYW4uYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2IGNsYXNzPSJmb3JtYXQtb3B0aW9ucyI+PC9kaXY+YCk7CiAgICBmb3IgKGNvbnN0IGZtdCBvZiB2YWxpZF9mb3JtYXRzKSB7CiAgICAgIGNvbnN0IG9wdCA9IG9wdHNfZGl2LmFwcGVuZENoaWxkKAogICAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImZvcm1hdC1vcHRpb24gJHtmbXR9Ij4ke2ZtdH08L3NwYW4+YAogICAgICApOwogICAgICBvcHQub25jbGljayA9IChlKSA9PiB7CiAgICAgICAgc3Bhbi52YWx1ZSA9IG9wdC50ZXh0Q29udGVudDsKICAgICAgfTsKICAgIH0KICAgIHBhcnNlID0gKHgpID0+IHsKICAgICAgcmV0dXJuIHZhbGlkX2Zvcm1hdHMuaW5jbHVkZXMoeCkgPyB4IDogbG9jYWxWYWx1ZTsKICAgIH07CiAgICB1cGRhdGUgPSAoeCkgPT4gewogICAgICBmb3IgKGNvbnN0IG9wdCBvZiBvcHRzX2Rpdi5jaGlsZHJlbikgewogICAgICAgIG9wdC5jbGFzc0xpc3QudG9nZ2xlKCJzZWxlY3RlZCIsIG9wdC50ZXh0Q29udGVudCA9PT0geCk7CiAgICAgIH0KICAgIH07CiAgfSBlbHNlIHsKICAgIC8vIFdlIG9ubHkgaGF2ZSBmaWxlbmFtZSBoZXJlCiAgfQogIGxldCBsb2NhbFZhbHVlOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIGxvY2FsVmFsdWU7CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIGlmICh2YWwgIT09ICIiKSB7CiAgICAgICAgbG9jYWxWYWx1ZSA9IHBhcnNlKHZhbCk7CiAgICAgIH0KICAgICAgdXBkYXRlKGxvY2FsVmFsdWUpOwogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7CiAgLy8gV2UgYWxzbyBhc3NpZ24gYSBsaXN0ZW5lciBzbyB0aGF0IHRoZSBlZGl0YWJsZSBpcyBibHVycmVkIHdoZW4gZW50ZXIgaXMgcHJlc3NlZAogIHNwYW4ub25rZXlkb3duID0gKGUpID0+IHsKICAgIGlmIChlLmtleUNvZGUgPT09IDEzKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgc3Bhbi5ibHVyKCk7CiAgICB9CiAgfTsKICBzcGFuLnZhbHVlID0gdmFsdWU7Cn0KCmZ1bmN0aW9uIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oc3Bhbiwga2V5KSB7CiAgLy8gSGVyZSB3ZSBtb3N0bHkgd2FudCB0byBkZWZpbmUgdGhlIHNldHRlciBhbmQgZ2V0dGVyCiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgLy8gaWYgdW5kZWZpbmVkIGlzIHBhc3NlZCwgd2UgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBvcHRpb25zCiAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGRlbGV0ZSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XSA9IHZhbDsKICAgICAgfQogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7Cn0KCmNvbnN0IGNvbmZpZ19zcGFucyA9IHt9Owpmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhnZXRJbWFnZU9wdGlvbnMoKSkpIHsKICBjb25zdCBjb250YWluZXIgPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoYC5jbGlwYm9hcmQtc3Bhbi4ke2tleX1gKTsKICBjb25zdCBsYWJlbCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIubGFiZWwiKTsKICAvLyBXZSBnaXZlIHRoZSBsYWJlbCBhIGZ1bmN0aW9uIHRoYXQgb24gc2luZ2xlIGNsaWNrIHdpbGwgc2V0IHRoZSBjdXJyZW50IHZhbHVlIGFuZCB3aXRoIGRvdWJsZSBjbGljayB3aWxsIHVuc2V0IGl0CiAgbGFiZWwub25jbGljayA9IER1YWxDbGljaygKICAgICgpID0+IHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0sCiAgICAoZSkgPT4gewogICAgICBjb25zb2xlLmxvZygiZSIsIGUpOwogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSB1bmRlZmluZWQ7CiAgICB9CiAgKTsKICBjb25zdCB1aV92YWx1ZV9zcGFuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtdmFsdWUiKTsKICBjb25zdCBjb25maWdfdmFsdWVfc3BhbiA9CiAgICBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNvbmZpZy12YWx1ZSIpID8/CiAgICBsYWJlbC5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAgICJhZnRlcmJlZ2luIiwKICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iY29uZmlnLXZhbHVlIj48L3NwYW4+YAogICAgKTsKICAvLyBBc3NpbmcgdGhlIHR3byBzcGFucyBhcyBwcm9wZXJ0aWVzIG9mIHRoZSBjb250YWluaW5nIHNwYW4KICBjb250YWluZXIudWlfc3BhbiA9IHVpX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmNvbmZpZ19zcGFuID0gY29uZmlnX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmtleSA9IGtleTsKICBjb25maWdfc3BhbnNba2V5XSA9IGNvbnRhaW5lcjsKICBpZiAoZmlyc3RSdW4pIHsKICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA9CiAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICAgIC8vIFdlIGRvIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdmFsdWUgc3BhbgogICAgaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHVpX3ZhbHVlX3NwYW4sIGtleSwgdmFsdWUpOwogICAgLy8gVGhlbiB3ZSBpbml0aWFsaXplIHRoZSBjb25maWcgdmFsdWUKICAgIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oY29uZmlnX3ZhbHVlX3NwYW4sIGtleSk7CiAgICAvLyBXZSBwdXQgc29tZSBjb252ZW5pZW5jZSBnZXR0ZXJzL3NldHRlcnMKICAgIC8vIHVpX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJ1aV92YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiB1aV92YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICB1aV92YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgICAvLyBjb25maWdfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgImNvbmZpZ192YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICB9Cn0KCi8vIFRoZXNlIG9iamVjdHMgd2lsbCBjb250YWluIHRoZSBkZWZhdWx0IHZhbHVlCgovLyBUaGlzIGNvZGUgdXBkYXRlcyB0aGUgaW1hZ2Ugb3B0aW9ucyBpbiB0aGUgUExPVCBjb25maWcgd2l0aCB0aGUgcHJvdmlkZWQgb25lcwpmdW5jdGlvbiBzZXRJbWFnZU9wdGlvbnMobykgewogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gb1trZXldOwogIH0KfQpmdW5jdGlvbiB1bnNldEltYWdlT3B0aW9ucygpIHsKICBzZXRJbWFnZU9wdGlvbnMoe30pOwp9Cgpjb25zdCBzZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4uc2V0Iik7CmNvbnN0IHVuc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnVuc2V0Iik7CmlmIChmaXJzdFJ1bikgewogIHNldF9idXR0b24ub25jbGljayA9IChlKSA9PiB7CiAgICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0KICB9OwogIHVuc2V0X2J1dHRvbi5vbmNsaWNrID0gdW5zZXRJbWFnZU9wdGlvbnM7Cn0KCi8vIFdlIGFkZCBhIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBjbGlwYm9hcmQgaXMgcG9wcGVkIG91dApDT05UQUlORVIuaXNQb3BwZWRPdXQgPSAoKSA9PiB7CiAgcmV0dXJuIENPTlRBSU5FUi5jbGFzc0xpc3QuY29udGFpbnMoInBvcHBlZC1vdXQiKTsKfTsKCkNMSVBCT0FSRF9IRUFERVIub25tb3VzZWRvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHsKICBpZiAoZXZlbnQudGFyZ2V0Lm1hdGNoZXMoInNwYW4uY2xpcGJvYXJkLXZhbHVlIikpIHsKICAgIGNvbnNvbGUubG9nKCJXZSBkb24ndCBtb3ZlISIpOwogICAgcmV0dXJuOwogIH0KICBjb25zdCBzdGFydCA9IHsKICAgIGxlZnQ6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLmxlZnQpLAogICAgdG9wOiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS50b3ApLAogICAgWDogZXZlbnQucGFnZVgsCiAgICBZOiBldmVudC5wYWdlWSwKICB9OwogIGZ1bmN0aW9uIG1vdmVBdChldmVudCwgc3RhcnQpIHsKICAgIGNvbnN0IHRvcCA9IGV2ZW50LnBhZ2VZIC0gc3RhcnQuWSArIHN0YXJ0LnRvcCArICJweCI7CiAgICBjb25zdCBsZWZ0ID0gZXZlbnQucGFnZVggLSBzdGFydC5YICsgc3RhcnQubGVmdCArICJweCI7CiAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9IHRvcDsKICB9CgogIC8vIG1vdmUgb3VyIGFic29sdXRlbHkgcG9zaXRpb25lZCBiYWxsIHVuZGVyIHRoZSBwb2ludGVyCiAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQpIHsKICAgIG1vdmVBdChldmVudCwgc3RhcnQpOwogIH0KCiAgLy8gV2UgdXNlIHRoaXMgdG8gcmVtb3ZlIHRoZSBtb3VzZW1vdmUgd2hlbiBjbGlja2luZyBvdXRzaWRlIG9mIHRoZSBjb250YWluZXIKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICAvLyBtb3ZlIHRoZSBjb250YWluZXIgb24gbW91c2Vtb3ZlCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgb25Nb3VzZU1vdmUsIHsKICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsCiAgfSk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgY2xlYW5VcCgpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7CgogIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICBjb25zb2xlLmxvZygiY2xlYW5pbmcgdXAgdGhlIHBsb3QgbW92ZSBsaXN0ZW5lciIpOwogICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBudWxsOwogIH0KCiAgLy8gKDMpIGRyb3AgdGhlIGJhbGwsIHJlbW92ZSB1bm5lZWRlZCBoYW5kbGVycwogIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gY2xlYW5VcDsKfTsKCmZ1bmN0aW9uIHNlbmRUb0NsaXBib2FyZChibG9iKSB7CiAgaWYgKCFuYXZpZ2F0b3IuY2xpcGJvYXJkKSB7CiAgICBhbGVydCgKICAgICAgIlRoZSBDbGlwYm9hcmQgQVBJIGRvZXMgbm90IHNlZW0gdG8gYmUgYXZhaWxhYmxlLCBtYWtlIHN1cmUgdGhlIFBsdXRvIG5vdGVib29rIGlzIGJlaW5nIHVzZWQgZnJvbSBlaXRoZXIgbG9jYWxob3N0IG9yIGFuIGh0dHBzIHNvdXJjZS4iCiAgICApOwogIH0KICBuYXZpZ2F0b3IuY2xpcGJvYXJkCiAgICAud3JpdGUoWwogICAgICBuZXcgQ2xpcGJvYXJkSXRlbSh7CiAgICAgICAgLy8gVGhlIGtleSBpcyBkZXRlcm1pbmVkIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBibG9iJ3MgdHlwZS4KICAgICAgICBbYmxvYi50eXBlXTogYmxvYiwKICAgICAgfSksCiAgICBdKQogICAgLnRoZW4oCiAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICBjb25zb2xlLmxvZygiQXN5bmM6IENvcHlpbmcgdG8gY2xpcGJvYXJkIHdhcyBzdWNjZXNzZnVsISIpOwogICAgICB9LAogICAgICBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiQXN5bmM6IENvdWxkIG5vdCBjb3B5IHRleHQ6ICIsIGVycik7CiAgICAgIH0KICAgICk7Cn0KCmZ1bmN0aW9uIGNvcHlJbWFnZVRvQ2xpcGJvYXJkKCkgewogIC8vIFdlIGV4dHJhY3QgdGhlIGltYWdlIG9wdGlvbnMgZnJvbSB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycyAoaWYgdGhleSBleGlzdCkKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LiBXZSBhbHNvIGlnbm9yZSBmb3JtYXQgYmVjYXVzZSB0aGUgY2xpcGJvYXJkIG9ubHkgc3VwcG9ydHMgcG5nLgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gImZvcm1hdCIpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LnRvSW1hZ2UoUExPVCwgY29uZmlnKS50aGVuKGZ1bmN0aW9uIChkYXRhVXJsKSB7CiAgICBmZXRjaChkYXRhVXJsKQogICAgICAudGhlbigocmVzKSA9PiByZXMuYmxvYigpKQogICAgICAudGhlbigoYmxvYikgPT4gewogICAgICAgIGNvbnN0IHBhc3RlX3JlY2VpdmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigncGFzdGUtcmVjZWl2ZXIucGx1dG9wbG90bHknKQogICAgICAgIGlmIChwYXN0ZV9yZWNlaXZlcikgewogICAgICAgICAgcGFzdGVfcmVjZWl2ZXIuYXR0YWNoSW1hZ2UoZGF0YVVybCwgQ09OVEFJTkVSKQogICAgICAgIH0KICAgICAgICBzZW5kVG9DbGlwYm9hcmQoYmxvYikKICAgICAgfSk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHNhdmVJbWFnZVRvRmlsZSgpIHsKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS5kb3dubG9hZEltYWdlKFBMT1QsIGNvbmZpZyk7Cn0KCmxldCBjb250YWluZXJfcmVjdCA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCwgdG9wOiAwLCBsZWZ0OiAwIH07CmZ1bmN0aW9uIHVucG9wX2NvbnRhaW5lcihjbCkgewogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgZmFsc2UpOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBmYWxzZSk7CiAgLy8gV2UgZml4IHRoZSBoZWlnaHQgYmFjayB0byB0aGUgdmFsdWUgaXQgaGFkIGJlZm9yZSBwb3BvdXQsIGFsc28gc2V0dGluZyB0aGUgZmxhZyB0byBzaWduYWwgdGhhdCB1cG9uIGZpcnN0IHJlc2l6ZSB3ZSByZW1vdmUgdGhlIGZpeGVkIGlubGluZS1zdHlsZQogIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQgKyAicHgiOwogIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IHRydWU7CiAgLy8gV2Ugc2V0IHRoZSBvdGhlciBmaXhlZCBpbmxpbmUtc3R5bGVzIHRvIG51bGwKICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICBDT05UQUlORVIuc3R5bGUudG9wID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBXZSBhbHNvIHJlbW92ZSB0aGUgQ0xJUEJPQVJEX0hFQURFUgogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSAiIjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBGaW5hbGx5IHdlIHJlbW92ZSB0aGUgaGlkZGVuIGNsYXNzIHRvIHRoZSBoZWFkZXIKICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIHRydWUpOwogIHJldHVybjsKfQpmdW5jdGlvbiBwb3BvdXRfY29udGFpbmVyKG9wdHMpIHsKICBjb25zdCBjbCA9IG9wdHM/LmNsOwogIGNvbnN0IHRhcmdldF9jb250YWluZXJfc2l6ZSA9IG9wdHM/LnRhcmdldF9jb250YWluZXJfc2l6ZSA/PyB7fTsKICBjb25zdCB0YXJnZXRfcGxvdF9zaXplID0gb3B0cz8udGFyZ2V0X3Bsb3Rfc2l6ZSA/PyB7fTsKICBpZiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIHJldHVybiB1bnBvcF9jb250YWluZXIoY2wpOwogIH0KICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgY2wgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdHJ1ZSk7CiAgLy8gV2UgZXh0cmFjdCB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjb250YWluZXIsIHNhdmUgdGhlbSBhbmQgZml4IHRoZW0KICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9ID0gQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogIGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfTsKICAvLyBXZSBzYXZlIHRoZSBjdXJyZW50IHBsb3Qgc2l6ZSBiZWZvcmUgd2UgcG9wIGFzIGl0IHdpbGwgZmlsbCB0aGUgc2NyZWVuCiAgY29uc3QgY3VycmVudF9wbG90X3NpemUgPSB7CiAgICB3aWR0aDogUExPVC5fZnVsbExheW91dC53aWR0aCwKICAgIGhlaWdodDogUExPVC5fZnVsbExheW91dC5oZWlnaHQsCiAgfTsKICAvLyBXZSBoYXZlIHRvIHNhdmUgdGhlIHBhZCBkYXRhIGJlZm9yZSBwb3BwaW5nIHNvIHdlIGNhbiByZXNpemUgcHJlY2lzZWx5CiAgY29uc3QgcGFkID0ge307CiAgcGFkLnVucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgdHJ1ZSk7CiAgcGFkLnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICAvLyBXZSBkbyB0b3AgYW5kIGxlZnQgYmFzZWQgb24gdGhlIGN1cnJlbnQgcmVjdAogIGZvciAoY29uc3Qga2V5IG9mIFsidG9wIiwgImxlZnQiXSkgewogICAgY29uc3Qgc3RhcnRfdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY29udGFpbmVyX3JlY3Rba2V5XTsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgZm9yIChjb25zdCBraW5kIG9mIFsicGFkZGluZyIsICJib3JkZXIiXSkgewogICAgICBvZmZzZXQgKz0gcGFkLnBvcHBlZFtraW5kXVtrZXldIC0gcGFkLnVucG9wcGVkW2tpbmRdW2tleV07CiAgICB9CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHN0YXJ0X3ZhbCAtIG9mZnNldCArICJweCI7CiAgICBpZiAoa2V5ID09PSAibGVmdCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIC8vIFdlIGNvbXB1dGUgdGhlIHdpZHRoIGFuZCBoZWlnaHQgZGVwZW5kaW5nIG9uIGV2ZW50dWFsIGNvbmZpZyBkYXRhCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoewogICAgd2lkdGg6CiAgICAgIHRhcmdldF9wbG90X3NpemUud2lkdGggPz8KICAgICAgY29uZmlnX3NwYW5zLndpZHRoLmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS5oZWlnaHQgPz8KICAgICAgY29uZmlnX3NwYW5zLmhlaWdodC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUuaGVpZ2h0LAogIH0pOwogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIGNvbnN0IHZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNzeltrZXldOwogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSB2YWwgKyAicHgiOwogICAgaWYgKGtleSA9PT0gIndpZHRoIikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCBmYWxzZSk7CiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgdW5wb3BfY29udGFpbmVyKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKfQoKQ09OVEFJTkVSLnBvcE91dCA9IHBvcG91dF9jb250YWluZXI7CgpmdW5jdGlvbiBEdWFsQ2xpY2soc2luZ2xlX2Z1bmMsIGRibF9mdW5jKSB7CiAgbGV0IG5jbGlja3MgPSAwOwogIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykgewogICAgbmNsaWNrcyArPSAxOwogICAgaWYgKG5jbGlja3MgPiAxKSB7CiAgICAgIGRibF9mdW5jKC4uLmFyZ3MpOwogICAgICBuY2xpY2tzID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIGRlbGF5KDMwMCkudGhlbigoKSA9PiB7CiAgICAgICAgaWYgKG5jbGlja3MgPT0gMSkgewogICAgICAgICAgc2luZ2xlX2Z1bmMoLi4uYXJncyk7CiAgICAgICAgfQogICAgICAgIG5jbGlja3MgPSAwOwogICAgICB9KTsKICAgIH0KICB9Owp9CgovLyBXZSByZW1vdmUgdGhlIGRlZmF1bHQgZG93bmxvYWQgaW1hZ2UgYnV0dG9uCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSwKICBbInRvSW1hZ2UiXQopOwovLyBXZSBhZGQgdGhlIGN1c3RvbSBidXR0b24gdG8gdGhlIG1vZGViYXIKcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkLAogIFsKICAgIHsKICAgICAgbmFtZTogIkNvcHkgUE5HIHRvIENsaXBib2FyZCIsCiAgICAgIGljb246IHsKICAgICAgICBoZWlnaHQ6IDUyMCwKICAgICAgICB3aWR0aDogNTIwLAogICAgICAgIHBhdGg6ICJNMjgwIDY0aDQwYzM1LjMgMCA2NCAyOC43IDY0IDY0VjQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEg2NGMtMzUuMyAwLTY0LTI4LjctNjQtNjRWMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0aDQwIDkuNkMxMjEgMjcuNSAxNTMuMyAwIDE5MiAwczcxIDI3LjUgNzguNCA2NEgyODB6TTY0IDExMmMtOC44IDAtMTYgNy4yLTE2IDE2VjQ0OGMwIDguOCA3LjIgMTYgMTYgMTZIMzIwYzguOCAwIDE2LTcuMiAxNi0xNlYxMjhjMC04LjgtNy4yLTE2LTE2LTE2SDMwNHYyNGMwIDEzLjMtMTAuNyAyNC0yNCAyNEgxOTIgMTA0Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNFYxMTJINjR6bTEyOC04YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHoiLAogICAgICB9LAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soY29weUltYWdlVG9DbGlwYm9hcmQsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKCk7CiAgICAgIH0pLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIkRvd25sb2FkIEltYWdlIiwKICAgICAgaWNvbjogUGxvdGx5Lkljb25zLmNhbWVyYSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKHNhdmVJbWFnZVRvRmlsZSwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoeyBjbDogImZpbGVzYXZlIiB9KTsKICAgICAgfSksCiAgICB9LAogIF0KKTsKCmZ1bmN0aW9uIGdldE9mZnNldERhdGEoZWwpIHsKICBsZXQgY3MgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgbnVsbCk7CiAgY29uc3Qgb2RhdGEgPSB7CiAgICBwYWRkaW5nOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgfSwKICAgIGJvcmRlcjogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgfQogIH07CiAgaWYgKGVsID09PSBQTE9UKSB7CiAgICAvLyBGb3IgdGhlIFBMT1Qgd2UgYWxzbyB3YW50IHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBvZmZzZXQKICAgIG9kYXRhLm9mZnNldCA9IHsKICAgICAgdG9wOiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldFRvcCA6IDAsCiAgICAgIGxlZnQ6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0TGVmdCA6IDAsCiAgICB9CiAgfQogIHJldHVybiBvZGF0YTsKfQpmdW5jdGlvbiBnZXRTaXplRGF0YSgpIHsKICBjb25zdCBkYXRhID0gewogICAgcGxvdF9wYWQ6IGdldE9mZnNldERhdGEoUExPVCksCiAgICBwbG90X3JlY3Q6IFBMT1QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgICBjb250YWluZXJfcGFkOiBnZXRPZmZzZXREYXRhKENPTlRBSU5FUiksCiAgICBjb250YWluZXJfcmVjdDogQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogIH07CiAgcmV0dXJuIGRhdGE7Cn0KZnVuY3Rpb24gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGNvbnN0IGNvbXB1dGVkX3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIGNvbnN0IG9mZnNldHMgPSBjb21wdXRlZF9zaXplLm9mZnNldHM7CgogIGNvbnN0IHBsb3RfZGF0YSA9IHsKICAgIHdpZHRoOiB3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiBoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfTsKCiAgcmV0dXJuIHsKICAgIHdpZHRoOiAod2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCkgKyBvZmZzZXRzLndpZHRoLAogICAgaGVpZ2h0OiAoaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0KSArIG9mZnNldHMuaGVpZ2h0LAogICAgbm9DaGFuZ2U6IHdpZHRoID09IGNvbXB1dGVkX3NpemUud2lkdGggJiYgaGVpZ2h0ID09IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH0KfQoKLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGNoYW5nZSB0aGUgY29udGFpbmVyIHNpemUgc28gdGhhdCB0aGUgcmVzdWx0aW5nIHBsb3Qgd2lsbCBiZSBtYXRjaGluZyB0aGUgcHJvdmlkZWQgc3BlY3MKZnVuY3Rpb24gY2hhbmdlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgaWYgKCFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgY29uc29sZS5sb2coIlRyaWVkIHRvIGNoYW5nZSBjb250YWluZXIgc2l6ZSB3aGVuIG5vdCBwb3BwZWQsIGlnbm9yaW5nIik7CiAgICByZXR1cm47CiAgfQoKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEpOwoKICBpZiAoY3N6Lm5vQ2hhbmdlKSB7CiAgICBjb25zb2xlLmxvZygiU2l6ZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50LCBpZ25vcmluZyIpOwogICAgcmV0dXJuCiAgfQogIC8vIFdlIGFyZSBub3cgZ29pbmcgdG8gc2V0IGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGNvbnRhaW5lcgogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gY3N6W2tleV0gKyAicHgiOwogIH0KfQovLyBXZSBub3cgY3JlYXRlIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgdXBkYXRlIHRoZSBwbG90IGJhc2VkIG9uIHRoZSB2YWx1ZXMgc3BlY2lmaWVkCmZ1bmN0aW9uIHVwZGF0ZUZyb21IZWFkZXIoKSB7CiAgY29uc3QgaGVhZGVyX2RhdGEgPSB7CiAgICBoZWlnaHQ6IGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUsCiAgICB3aWR0aDogY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlLAogIH07CiAgY2hhbmdlQ29udGFpbmVyU2l6ZShoZWFkZXJfZGF0YSk7Cn0KLy8gV2UgYXNzaWduIHRoaXMgZnVuY3Rpb24gdG8gdGhlIG9uYmx1ciBldmVudCBvZiB3aWR0aCBhbmQgaGVpZ2h0CmlmIChmaXJzdFJ1bikgewogIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLnVpX3NwYW4ub25ibHVyID0gKGUpID0+IHsKICAgICAgY29udGFpbmVyLnVpX3ZhbHVlID0gY29udGFpbmVyLnVpX3NwYW4udGV4dENvbnRlbnQ7CiAgICAgIHVwZGF0ZUZyb21IZWFkZXIoKTsKICAgIH07CiAgfQp9Ci8vIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIHBsb3Qgc2l6ZSB0byB1c2UgZm9yIHJlbGF5b3V0IGFzIGEgZnVuY3Rpb24gb2YgdGhlIGNvbnRhaW5lciBzaXplCmZ1bmN0aW9uIGNvbXB1dGVQbG90U2l6ZShkYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIC8vIFJlbW92ZSBQYWRkaW5nCiAgY29uc3QgeyBjb250YWluZXJfcGFkLCBwbG90X3BhZCwgY29udGFpbmVyX3JlY3QgfSA9IGRhdGE7CiAgY29uc3Qgb2Zmc2V0cyA9IHsKICAgIHdpZHRoOgogICAgICBwbG90X3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLndpZHRoICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LmxlZnQgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci53aWR0aCwKICAgIGhlaWdodDoKICAgICAgcGxvdF9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBwbG90X3BhZC5ib3JkZXIuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LnRvcCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci5oZWlnaHQsCiAgfTsKICBjb25zdCBzeiA9IHsKICAgIHdpZHRoOiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LndpZHRoIC0gb2Zmc2V0cy53aWR0aCksCiAgICBoZWlnaHQ6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3QuaGVpZ2h0IC0gb2Zmc2V0cy5oZWlnaHQpLAogICAgb2Zmc2V0cywKICB9OwogIHJldHVybiBzejsKfQoKLy8gQ3JlYXRlIHRoZSByZXNpemVPYnNlcnZlciB0byBtYWtlIHRoZSBwbG90IGV2ZW4gbW9yZSByZXNwb25zaXZlISA6bWFnaWM6CmNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7CiAgY29uc3Qgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpOwogIGNvbnN0IHtjb250YWluZXJfcmVjdCwgY29udGFpbmVyX3BhZH0gPSBzaXplRGF0YTsKICBsZXQgcGxvdF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICAvLyBXZSBzYXZlIHRoZSBoZWlnaHQgaW4gdGhlIFBMT1Qgb2JqZWN0CiAgUExPVC5jb250YWluZXJfaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0OwogIC8vIFdlIGRlYWwgd2l0aCBzb21lIHN0dWZmIGlmIHRoZSBjb250YWluZXIgaXMgcG9wcHBlZAogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSBjb250YWluZXJfcmVjdC53aWR0aCArICJweCI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gY29udGFpbmVyX3JlY3QubGVmdCArICJweCI7CiAgY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS5oZWlnaHQ7CiAgY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlID0gcGxvdF9zaXplLndpZHRoOwogIC8qIAoJCVRoZSBhZGRpdGlvbiBvZiB0aGUgaW52YWxpZCBhcmd1bWVudCBgcGx1dG9yZXNpemVgIHNlZW1zIHRvIGZpeCB0aGUgcHJvYmxlbSB3aXRoIGNhbGxpbmcgYHJlbGF5b3V0YCBzaW1wbHkgd2l0aCBge2F1dG9zaXplOiB0cnVlfWAgYXMgdXBkYXRlIGJyZWFraW5nIG1vdXNlIHJlbGF5b3V0IGV2ZW50cyB0cmFja2luZy4gCgkJU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wbG90bHkvcGxvdGx5LmpzL2lzc3Vlcy82MTU2IGZvciBkZXRhaWxzCgkJKi8KICBsZXQgY29uZmlnID0gewogICAgLy8gSWYgdGhpcyBpcyBwb3BwZWQgb3V0LCB3ZSBpZ25vcmUgdGhlIG9yaWdpbmFsIHdpZHRoL2hlaWdodAogICAgd2lkdGg6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX3dpZHRoKSA/PyBwbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX2hlaWdodCkgPz8gcGxvdF9zaXplLmhlaWdodCwKICAgIHBsdXRvcmVzaXplOiB0cnVlLAogIH07CiAgUGxvdGx5LnJlbGF5b3V0KFBMT1QsIGNvbmZpZykudGhlbigoKSA9PiB7CiAgICBpZiAocmVtb3ZlX2NvbnRhaW5lcl9zaXplICYmICFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBhdm9pZCB0aGUgZmlyc3QgcmVzaXplIHVwb24gcGxvdCBjcmVhdGlvbiB0byBhbHJlYWR5IGJlIHdpdGhvdXQgYSBmaXhlZCBoZWlnaHQKICAgICAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9ICIiOwogICAgICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICAgICAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmFsc2U7CiAgICB9CiAgfSk7Cn0pOwoKcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShDT05UQUlORVIpOwoKClBsb3RseS5yZWFjdChQTE9ULCBwbG90X29iaikudGhlbigoKSA9PiB7CgkvLyBBc3NpZ24gdGhlIFBsb3RseSBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhwbG90bHlfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1Qub24oa2V5LCBsaXN0ZW5lcikKCQl9Cgl9CgkvLyBBc3NpZ24gdGhlIEpTIGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKGpzX2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULmFkZEV2ZW50TGlzdGVuZXIoa2V5LCBsaXN0ZW5lciwgewoJCQkJc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbAoJCQl9KQoJCX0KCX0KfQopCgoKaW52YWxpZGF0aW9uLnRoZW4oKCkgPT4gewoJLy8gUmVtb3ZlIGFsbCBwbG90bHkgbGlzdGVuZXJzCglQTE9ULnJlbW92ZUFsbExpc3RlbmVycygpCgkvLyBSZW1vdmUgYWxsIEpTIGxpc3RlbmVycwoJY29udHJvbGxlci5hYm9ydCgpCgkvLyBSZW1vdmUgdGhlIHJlc2l6ZU9ic2VydmVyCglyZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCkKfSkKCgoKCQlyZXR1cm4gQ09OVEFJTkVSCgk8L3NjcmlwdD4KpG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv8hNXY/vsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQ4YjRhMWFkOS0yZDZhLTRjOGYtYmI4ZS1mNDNjMmQwNTgxOTW5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4IxhVAtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5HZNTdiY2MwNWIwLTgxZGEtMTFlZi0yMDQwLTM1ODVjOWI0OTU0Zi8zYWUwOWIwODEyOTk2MWQ2uGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDM1ZmYzNDAyLWRjMzYtNGI5MS1iZWM5LWI0ZDIxZmFmM2U2OIqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnaaokJPHNjcmlwdCBpZD0ncGxvdF8xJz4KCQkvLyBXZSBzdGFydCBieSBwdXR0aW5nIGFsbCB0aGUgdmFyaWFibGUgaW50ZXJwb2xhdGlvbiBoZXJlIGF0IHRoZSBiZWdpbm5pbmcKCQkvLyBXZSBoYXZlIHRvIGNvbnZlcnQgYWxsIHR5cGVkYXJyYXlzIGluIHRoZSBsYXlvdXQgdG8gbm9ybWFsIGFycmF5cy4gU2VlIElzc3VlICMyNQoJCS8vIFdlIHVzZSBsb2Rhc2ggZm9yIHRoaXMgZm9yIGNvbXBhY3RuZXNzCgkJZnVuY3Rpb24gcmVtb3ZlVHlwZWRBcnJheShvKSB7CgkJCXJldHVybiBfLmlzVHlwZWRBcnJheShvKSA/IEFycmF5LmZyb20obykgOgoJCQlfLmlzUGxhaW5PYmplY3QobykgPyBfLm1hcFZhbHVlcyhvLCByZW1vdmVUeXBlZEFycmF5KSA6IAoJCQlvCgkJfQoKCQkvLyBQdWJsaXNoIHRoZSBwbG90IG9iamVjdCB0byBKUwoJCWxldCBwbG90X29iaiA9IF8udXBkYXRlKC8qIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgQWJzdHJhY3RQbHV0b0RpbmdldGplcy5EaXNwbGF5LnB1Ymxpc2hlZF90b19qcyAqLyBnZXRQdWJsaXNoZWRPYmplY3QoIjdiY2MwNWIwLTgxZGEtMTFlZi0yMDQwLTM1ODVjOWI0OTU0Zi8yZjJkMjA4NjVlNGNhOGRiIiksICJsYXlvdXQiLCByZW1vdmVUeXBlZEFycmF5KQoJCS8vIEdldCB0aGUgcGxvdGx5IGxpc3RlbmVycwoJCWNvbnN0IHBsb3RseV9saXN0ZW5lcnMgPSB7fQoJCS8vIEdldCB0aGUgSlMgbGlzdGVuZXJzCgkJY29uc3QganNfbGlzdGVuZXJzID0ge30KCQkvLyBEZWFsIHdpdGggZXZlbnR1YWwgY3VzdG9tIGNsYXNzZXMKCQlsZXQgY3VzdG9tX2NsYXNzbGlzdCA9IFtdCgoKCQkvLyBMb2FkIHRoZSBwbG90bHkgbGlicmFyeQoJCWxldCBQbG90bHkgPSB1bmRlZmluZWQKCQl0cnkgewoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiLi9wbG90bHlqcy9wbG90bHlqcy0yLjI2LjIubWluLmpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfSBjYXRjaCAoZSkgewoJCQljb25zb2xlLmxvZygiTG9jYWwgbG9hZCBmYWlsZWQsIHRyeWluZyB3aXRoIHRoZSB3ZWIgZXNtLnNoIHZlcnNpb24iKQoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiaHR0cHM6Ly9lc20uc2gvdjEzNS9wbG90bHkuanMtZGlzdC1taW5AMi4yNi4yL2VzbmV4dC9wbG90bHkuanMtZGlzdC1taW4ubWpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfQoKCQkvLyBDaGVjayBpZiB3ZSBoYXZlIHRvIGZvcmNlIGxvY2FsIG1hdGhqYXggZm9udCBjYWNoZQoJCWlmIChmYWxzZSAmJiB3aW5kb3c/Lk1hdGhKYXg/LmNvbmZpZz8uc3ZnPy5mb250Q2FjaGUgPT09ICdnbG9iYWwnKSB7CgkJCXdpbmRvdy5NYXRoSmF4LmNvbmZpZy5zdmcuZm9udENhY2hlID0gJ2xvY2FsJwoJCX0KCgkJLy8gRmxhZyB0byBjaGVjayBpZiB0aGlzIGNlbGwgd2FzICBtYW51YWxseSByYW4gb3IgcmVhY3RpdmVseSByYW4KY29uc3QgZmlyc3RSdW4gPSB0aGlzID8gZmFsc2UgOiB0cnVlCmNvbnN0IENPTlRBSU5FUiA9IHRoaXMgPz8gaHRtbGA8ZGl2IGNsYXNzPSdwbHV0b3Bsb3RseS1jb250YWluZXInPmAKY29uc3QgUExPVCA9IENPTlRBSU5FUi5xdWVyeVNlbGVjdG9yKCcuanMtcGxvdGx5LXBsb3QnKSA/PyBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2PmApCmNvbnN0IHBhcmVudCA9IENPTlRBSU5FUi5wYXJlbnRFbGVtZW50Ci8vIFdlIHVzZSBhIGNvbnRyb2xsZXIgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVycyB1cG9uIGludmFsaWRhdGlvbgpjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpCi8vIFdlIGhhdmUgdG8gYWRkIHRoaXMgdG8ga2VlcCBzdXBwb3J0aW5nIEBiaW5kIHdpdGggdGhlIG9sZCBBUEkgdXNpbmcgUExPVApQTE9ULmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGUpID0+IHsKCUNPTlRBSU5FUi52YWx1ZSA9IFBMT1QudmFsdWUKCWlmIChlLmJ1YmJsZXMpIHsKCQlyZXR1cm4KCX0KCUNPTlRBSU5FUi5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnaW5wdXQnKSkKfSwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pCgoJLy8gVGhpcyBjcmVhdGUgdGhlIHN0eWxlIHN1YmRpdiBvbiBmaXJzdCBydW4KCWZpcnN0UnVuICYmIENPTlRBSU5FUi5hcHBlbmRDaGlsZChodG1sYAoJPHN0eWxlPgoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciB7CgkJd2lkdGg6IDEwMCU7CgkJaGVpZ2h0OiAxMDAlOwoJCW1pbi1oZWlnaHQ6IDA7CgkJbWluLXdpZHRoOiAwOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciAuanMtcGxvdGx5LXBsb3QgLnBsb3RseSBkaXYgewoJCW1hcmdpbjogMCBhdXRvOyAvLyBUaGlzIGNlbnRlcnMgdGhlIHBsb3QKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIucG9wcGVkLW91dCB7CgkJb3ZlcmZsb3c6IGF1dG87CgkJei1pbmRleDogMTAwMDsKCQlwb3NpdGlvbjogZml4ZWQ7CgkJcmVzaXplOiBib3RoOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMHB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwcHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciB7CgkJZGlzcGxheTogZmxleDsKCQlmbGV4LWZsb3c6IHJvdyB3cmFwOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDEycHg7CgkJcG9zaXRpb246IGZpeGVkOwoJCXotaW5kZXg6IDEwMDE7CgkJY3Vyc29yOiBtb3ZlOwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgLTEwMCUpOwoJCXBhZGRpbmc6IDVweDsKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIHNwYW4gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQlmbGV4OiAxCgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlci5oaWRkZW4gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuY2xpcGJvYXJkLXNwYW4gewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCX0KCS5jbGlwYm9hcmQtdmFsdWUgewoJCXBhZGRpbmctcmlnaHQ6IDVweDsKCQlwYWRkaW5nLWxlZnQ6IDJweDsKCQljdXJzb3I6IHRleHQ7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlmbGV4OiAwIDAgMTAwJTsKCQl0ZXh0LWFsaWduOiBjZW50ZXI7CgkJYm9yZGVyLXRvcDogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCW1hcmdpbi10b3A6IDVweDsKCQlkaXNwbGF5OiBub25lOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5maWxlc2F2ZSAuY2xpcGJvYXJkLXNwYW4uZmlsZW5hbWUgewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5jbGlwYm9hcmQtdmFsdWUuZmlsZW5hbWUgewoJCW1hcmdpbi1sZWZ0OiAzcHg7CgkJdGV4dC1hbGlnbjogbGVmdDsKCQltaW4td2lkdGg6IG1pbig2MCUsIG1pbi1jb250ZW50KTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogaW5saW5lLWZsZXg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IC5sYWJlbCB7CgkJZmxleDogMCAwIDA7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZvcm1hdCB7CgkJcG9zaXRpb246IHJlbGF0aXZlOwoJCWZsZXg6IDEgMCBhdXRvOwoJCW1pbi13aWR0aDogMzBweDsKCQltYXJnaW4tcmlnaHQ6IDEwcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJCWZsZXgtZmxvdzogY29sdW1uOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXBhZGRpbmctbGVmdDogM3B4OwoJCXotaW5kZXg6IDIwMDA7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgewoJCWN1cnNvcjogcG9pbnRlcjsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlwYWRkaW5nOiAzcHg7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTNweCwgLTZweCk7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5mb3JtYXQtb3B0aW9uOm5vdCguc2VsZWN0ZWQpIHsKCQltYXJnaW4tdG9wOiAzcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24uc2VsZWN0ZWQgewoJCW9yZGVyOiAtMTsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpob3ZlciB7CgkJYmFja2dyb3VuZC1jb2xvcjogdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7Cgl9CglzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZm9udC13ZWlnaHQ6IG5vcm1hbDsKCQljb2xvcjogdmFyKC0tcGx1dG8tb3V0cHV0LWNvbG9yKTsKCQlkaXNwbGF5OiBub25lOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgY2FsYygtMTAwJSAtIDEwcHgpKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkubGFiZWwgewoJCXVzZXItc2VsZWN0OiBub25lOwoJfQoJLmxhYmVsOmhvdmVyIHNwYW4uY29uZmlnLXZhbHVlIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJbWluLXdpZHRoOiAxNTBweDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5tYXRjaGluZy1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tbWFjcm8tY29sb3IpOwoJCWZvbnQtd2VpZ2h0OiBib2xkOwoJfQoJLmNsaXBib2FyZC1zcGFuLmRpZmZlcmVudC1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tdGFnLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KPC9zdHlsZT4KYCkKCmxldCBvcmlnaW5hbF9oZWlnaHQgPSBwbG90X29iai5sYXlvdXQuaGVpZ2h0CmxldCBvcmlnaW5hbF93aWR0aCA9IHBsb3Rfb2JqLmxheW91dC53aWR0aAovLyBGb3IgdGhlIGhlaWdodCB3ZSBoYXZlIHRvIGFsc28gcHV0IGEgZml4ZWQgdmFsdWUgaW4gY2FzZSB0aGUgcGxvdCBpcyBwdXQgb24gYSBub24tZml4ZWQtc2l6ZSBjb250YWluZXIgKGxpa2UgdGhlIGRlZmF1bHQgd3JhcHBlcikKLy8gV2UgZGVmaW5lIGEgdmFyaWFibGUgdG8gY2hlY2sgd2hldGhlciB3ZSBzdGlsbCBoYXZlIHRvIHJlbW92ZSB0aGUgZml4ZWQgaGVpZ2h0CmxldCByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmaXJzdFJ1bgpsZXQgY29udGFpbmVyX2hlaWdodCA9IG9yaWdpbmFsX2hlaWdodCA/PyBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPz8gNDAwCkNPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfaGVpZ2h0ICsgJ3B4JwoKLy8gV2UgY3JlYXRlIGEgUHJvbWlzZSB2ZXJzaW9uIG9mIHNldFRpbWVvdXQKZnVuY3Rpb24gZGVsYXkobXMpIHsKICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTsKfQoKLy8gV2UgaW1wb3J0IGludGVyYWN0IGZvciBkcmFnZ2luZy9yZXNpemluZwpjb25zdCB7IGRlZmF1bHQ6IGludGVyYWN0IH0gPSBhd2FpdCBpbXBvcnQoJ2h0dHBzOi8vZXNtLnNoL2ludGVyYWN0anNAMS4xMC4xOScpCgoKZnVuY3Rpb24gZ2V0SW1hZ2VPcHRpb25zKCkgewogIGNvbnN0IG8gPSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPz8ge307CiAgcmV0dXJuIHsKICAgIGZvcm1hdDogby5mb3JtYXQgPz8gInBuZyIsCiAgICB3aWR0aDogby53aWR0aCA/PyBvcmlnaW5hbF93aWR0aCwKICAgIGhlaWdodDogby5oZWlnaHQgPz8gb3JpZ2luYWxfaGVpZ2h0LAogICAgc2NhbGU6IG8uc2NhbGUgPz8gMSwKICAgIGZpbGVuYW1lOiBvLmZpbGVuYW1lID8/ICJuZXdwbG90IiwKICB9Owp9Cgpjb25zdCBDTElQQk9BUkRfSEVBREVSID0KICBDT05UQUlORVIucXVlcnlTZWxlY3RvcigiLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIiKSA/PwogIENPTlRBSU5FUi5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAiYWZ0ZXJiZWdpbiIsCiAgICBodG1sYDxkaXYgY2xhc3M9InBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgaGlkZGVuIj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZvcm1hdCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5Gb3JtYXQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZm9ybWF0Ij48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHdpZHRoIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPldpZHRoOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIHdpZHRoIj48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gaGVpZ2h0IgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkhlaWdodDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBoZWlnaHQiPjwvc3Bhbj5weDwvc3BhbgogICAgICA+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzY2FsZSIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5TY2FsZTo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBzY2FsZSI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHNldCI+U2V0PC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHVuc2V0Ij5VbnNldDwvYnV0dG9uPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gZmlsZW5hbWUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+RmlsZW5hbWU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZmlsZW5hbWUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgPC9kaXY+YAogICk7CgpmdW5jdGlvbiBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKSB7CiAgY29uc3QgdmFsaWRfY2xhc3NlcyA9IFsKICAgICJtaXNzaW5nLWNvbmZpZyIsCiAgICAibWF0Y2hpbmctY29uZmlnIiwKICAgICJkaWZmZXJlbnQtY29uZmlnIiwKICBdOwogIGZ1bmN0aW9uIHNldENsYXNzKGNsKSB7CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgdmFsaWRfY2xhc3NlcykgewogICAgICBjb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZShuYW1lLCBuYW1lID09IGNsKTsKICAgIH0KICB9CiAgLy8gV2UgdXNlIHRoZSBjdXN0b20gZ2V0dGVycyB3ZSdsbCBzZXQgdXAgaW4gdGhlIGNvbnRhaW5lcgogIGNvbnN0IHsgdWlfdmFsdWUsIGNvbmZpZ192YWx1ZSwgY29uZmlnX3NwYW4sIGtleSB9ID0gY29udGFpbmVyOwogIGlmIChjb25maWdfdmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgc2V0Q2xhc3MoIm1pc3NpbmctY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGlzIG5vdCBwcmVzZW50IGluIHRoZSBjb25maWcuYDsKICB9IGVsc2UgaWYgKHVpX3ZhbHVlID09IGNvbmZpZ192YWx1ZSkgewogICAgc2V0Q2xhc3MoIm1hdGNoaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgdGhlIHNhbWUgdmFsdWUgaW4gdGhlIGNvbmZpZyBhbmQgaW4gdGhlIGhlYWRlci5gOwogIH0gZWxzZSB7CiAgICBzZXRDbGFzcygiZGlmZmVyZW50LWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgYSBkaWZmZXJlbnQgdmFsdWUgKDxlbT4ke2NvbmZpZ192YWx1ZX08L2VtPikgaW4gdGhlIGNvbmZpZy5gOwogIH0KICAvLyBBZGQgaW5mbyBhYm91dCBzZXR0aW5nIGFuZCB1bnNldHRpbmcKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgb24gdGhlIGxhYmVsIDxlbT48Yj5vbmNlPC9iPjwvZW0+IHRvIHNldCB0aGUgY3VycmVudCBVSSB2YWx1ZSBpbiB0aGUgY29uZmlnLmAKICApOwogIGNvbmZpZ19zcGFuLmluc2VydEFkamFjZW50SFRNTCgKICAgICJiZWZvcmVlbmQiLAogICAgYDxicj5DbGljayA8ZW0+PGI+dHdpY2U8L2I+PC9lbT4gdG8gcmVtb3ZlIHRoaXMga2V5IGZyb20gdGhlIGNvbmZpZy5gCiAgKTsKfQoKY29uc3QgdmFsaWRfZm9ybWF0cyA9IFsicG5nIiwgInN2ZyIsICJ3ZWJwIiwgImpwZWciLCAiZnVsbC1qc29uIl07CmZ1bmN0aW9uIGluaXRpYWxpemVVSVZhbHVlU3BhbihzcGFuLCBrZXksIHZhbHVlKSB7CiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9IGtleSA9PT0gImZvcm1hdCIgPyAiZmFsc2UiIDogInRydWUiOwogIGxldCBwYXJzZSA9ICh4KSA9PiB4OwogIGxldCB1cGRhdGUgPSAoeCkgPT4gKHNwYW4udGV4dENvbnRlbnQgPSB4KTsKICBpZiAoa2V5ID09PSAid2lkdGgiIHx8IGtleSA9PT0gImhlaWdodCIpIHsKICAgIHBhcnNlID0gKHgpID0+IE1hdGgucm91bmQocGFyc2VGbG9hdCh4KSk7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJzY2FsZSIpIHsKICAgIHBhcnNlID0gcGFyc2VGbG9hdDsKICB9IGVsc2UgaWYgKGtleSA9PT0gImZvcm1hdCIpIHsKICAgIC8vIFdlIHJlbW92ZSBjb250ZW50RWRpdGFibGUKICAgIHNwYW4uY29udGVudEVkaXRhYmxlID0gImZhbHNlIjsKICAgIC8vIEhlcmUgd2UgZmlyc3QgYWRkIHRoZSBzdWJzcGFucyBmb3IgZWFjaCBvcHRpb24KICAgIGNvbnN0IG9wdHNfZGl2ID0gc3Bhbi5hcHBlbmRDaGlsZChodG1sYDxkaXYgY2xhc3M9ImZvcm1hdC1vcHRpb25zIj48L2Rpdj5gKTsKICAgIGZvciAoY29uc3QgZm10IG9mIHZhbGlkX2Zvcm1hdHMpIHsKICAgICAgY29uc3Qgb3B0ID0gb3B0c19kaXYuYXBwZW5kQ2hpbGQoCiAgICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iZm9ybWF0LW9wdGlvbiAke2ZtdH0iPiR7Zm10fTwvc3Bhbj5gCiAgICAgICk7CiAgICAgIG9wdC5vbmNsaWNrID0gKGUpID0+IHsKICAgICAgICBzcGFuLnZhbHVlID0gb3B0LnRleHRDb250ZW50OwogICAgICB9OwogICAgfQogICAgcGFyc2UgPSAoeCkgPT4gewogICAgICByZXR1cm4gdmFsaWRfZm9ybWF0cy5pbmNsdWRlcyh4KSA/IHggOiBsb2NhbFZhbHVlOwogICAgfTsKICAgIHVwZGF0ZSA9ICh4KSA9PiB7CiAgICAgIGZvciAoY29uc3Qgb3B0IG9mIG9wdHNfZGl2LmNoaWxkcmVuKSB7CiAgICAgICAgb3B0LmNsYXNzTGlzdC50b2dnbGUoInNlbGVjdGVkIiwgb3B0LnRleHRDb250ZW50ID09PSB4KTsKICAgICAgfQogICAgfTsKICB9IGVsc2UgewogICAgLy8gV2Ugb25seSBoYXZlIGZpbGVuYW1lIGhlcmUKICB9CiAgbGV0IGxvY2FsVmFsdWU7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwYW4sICJ2YWx1ZSIsIHsKICAgIGdldDogKCkgPT4gewogICAgICByZXR1cm4gbG9jYWxWYWx1ZTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgaWYgKHZhbCAhPT0gIiIpIHsKICAgICAgICBsb2NhbFZhbHVlID0gcGFyc2UodmFsKTsKICAgICAgfQogICAgICB1cGRhdGUobG9jYWxWYWx1ZSk7CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKICAvLyBXZSBhbHNvIGFzc2lnbiBhIGxpc3RlbmVyIHNvIHRoYXQgdGhlIGVkaXRhYmxlIGlzIGJsdXJyZWQgd2hlbiBlbnRlciBpcyBwcmVzc2VkCiAgc3Bhbi5vbmtleWRvd24gPSAoZSkgPT4gewogICAgaWYgKGUua2V5Q29kZSA9PT0gMTMpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBzcGFuLmJsdXIoKTsKICAgIH0KICB9OwogIHNwYW4udmFsdWUgPSB2YWx1ZTsKfQoKZnVuY3Rpb24gaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3BhbihzcGFuLCBrZXkpIHsKICAvLyBIZXJlIHdlIG1vc3RseSB3YW50IHRvIGRlZmluZSB0aGUgc2V0dGVyIGFuZCBnZXR0ZXIKICBjb25zdCBjb250YWluZXIgPSBzcGFuLmNsb3Nlc3QoIi5jbGlwYm9hcmQtc3BhbiIpOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgfSwKICAgIHNldDogKHZhbCkgPT4gewogICAgICAvLyBpZiB1bmRlZmluZWQgaXMgcGFzc2VkLCB3ZSByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIG9wdGlvbnMKICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZGVsZXRlIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgICB9IGVsc2UgewogICAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldID0gdmFsOwogICAgICB9CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKfQoKY29uc3QgY29uZmlnX3NwYW5zID0ge307CmZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGdldEltYWdlT3B0aW9ucygpKSkgewogIGNvbnN0IGNvbnRhaW5lciA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcihgLmNsaXBib2FyZC1zcGFuLiR7a2V5fWApOwogIGNvbnN0IGxhYmVsID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5sYWJlbCIpOwogIC8vIFdlIGdpdmUgdGhlIGxhYmVsIGEgZnVuY3Rpb24gdGhhdCBvbiBzaW5nbGUgY2xpY2sgd2lsbCBzZXQgdGhlIGN1cnJlbnQgdmFsdWUgYW5kIHdpdGggZG91YmxlIGNsaWNrIHdpbGwgdW5zZXQgaXQKICBsYWJlbC5vbmNsaWNrID0gRHVhbENsaWNrKAogICAgKCkgPT4gewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfSwKICAgIChlKSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJlIiwgZSk7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IHVuZGVmaW5lZDsKICAgIH0KICApOwogIGNvbnN0IHVpX3ZhbHVlX3NwYW4gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC12YWx1ZSIpOwogIGNvbnN0IGNvbmZpZ192YWx1ZV9zcGFuID0KICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuY29uZmlnLXZhbHVlIikgPz8KICAgIGxhYmVsLmluc2VydEFkamFjZW50RWxlbWVudCgKICAgICAgImFmdGVyYmVnaW4iLAogICAgICBodG1sYDxzcGFuIGNsYXNzPSJjb25maWctdmFsdWUiPjwvc3Bhbj5gCiAgICApOwogIC8vIEFzc2luZyB0aGUgdHdvIHNwYW5zIGFzIHByb3BlcnRpZXMgb2YgdGhlIGNvbnRhaW5pbmcgc3BhbgogIGNvbnRhaW5lci51aV9zcGFuID0gdWlfdmFsdWVfc3BhbjsKICBjb250YWluZXIuY29uZmlnX3NwYW4gPSBjb25maWdfdmFsdWVfc3BhbjsKICBjb250YWluZXIua2V5ID0ga2V5OwogIGNvbmZpZ19zcGFuc1trZXldID0gY29udGFpbmVyOwogIGlmIChmaXJzdFJ1bikgewogICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID0KICAgICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogICAgLy8gV2UgZG8gdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSB2YWx1ZSBzcGFuCiAgICBpbml0aWFsaXplVUlWYWx1ZVNwYW4odWlfdmFsdWVfc3Bhbiwga2V5LCB2YWx1ZSk7CiAgICAvLyBUaGVuIHdlIGluaXRpYWxpemUgdGhlIGNvbmZpZyB2YWx1ZQogICAgaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3Bhbihjb25maWdfdmFsdWVfc3Bhbiwga2V5KTsKICAgIC8vIFdlIHB1dCBzb21lIGNvbnZlbmllbmNlIGdldHRlcnMvc2V0dGVycwogICAgLy8gdWlfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgInVpX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IHVpX3ZhbHVlX3NwYW4udmFsdWUsCiAgICAgIHNldDogKHZhbCkgPT4gewogICAgICAgIHVpX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICAgIC8vIGNvbmZpZ192YWx1ZSBmb3J3YXJkCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAiY29uZmlnX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IGNvbmZpZ192YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSA9IHZhbDsKICAgICAgfSwKICAgIH0pOwogIH0KfQoKLy8gVGhlc2Ugb2JqZWN0cyB3aWxsIGNvbnRhaW4gdGhlIGRlZmF1bHQgdmFsdWUKCi8vIFRoaXMgY29kZSB1cGRhdGVzIHRoZSBpbWFnZSBvcHRpb25zIGluIHRoZSBQTE9UIGNvbmZpZyB3aXRoIHRoZSBwcm92aWRlZCBvbmVzCmZ1bmN0aW9uIHNldEltYWdlT3B0aW9ucyhvKSB7CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBvW2tleV07CiAgfQp9CmZ1bmN0aW9uIHVuc2V0SW1hZ2VPcHRpb25zKCkgewogIHNldEltYWdlT3B0aW9ucyh7fSk7Cn0KCmNvbnN0IHNldF9idXR0b24gPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtc3Bhbi5zZXQiKTsKY29uc3QgdW5zZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4udW5zZXQiKTsKaWYgKGZpcnN0UnVuKSB7CiAgc2V0X2J1dHRvbi5vbmNsaWNrID0gKGUpID0+IHsKICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfQogIH07CiAgdW5zZXRfYnV0dG9uLm9uY2xpY2sgPSB1bnNldEltYWdlT3B0aW9uczsKfQoKLy8gV2UgYWRkIGEgZnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIGNsaXBib2FyZCBpcyBwb3BwZWQgb3V0CkNPTlRBSU5FUi5pc1BvcHBlZE91dCA9ICgpID0+IHsKICByZXR1cm4gQ09OVEFJTkVSLmNsYXNzTGlzdC5jb250YWlucygicG9wcGVkLW91dCIpOwp9OwoKQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNlZG93biA9IGZ1bmN0aW9uIChldmVudCkgewogIGlmIChldmVudC50YXJnZXQubWF0Y2hlcygic3Bhbi5jbGlwYm9hcmQtdmFsdWUiKSkgewogICAgY29uc29sZS5sb2coIldlIGRvbid0IG1vdmUhIik7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IHN0YXJ0ID0gewogICAgbGVmdDogcGFyc2VGbG9hdChDT05UQUlORVIuc3R5bGUubGVmdCksCiAgICB0b3A6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLnRvcCksCiAgICBYOiBldmVudC5wYWdlWCwKICAgIFk6IGV2ZW50LnBhZ2VZLAogIH07CiAgZnVuY3Rpb24gbW92ZUF0KGV2ZW50LCBzdGFydCkgewogICAgY29uc3QgdG9wID0gZXZlbnQucGFnZVkgLSBzdGFydC5ZICsgc3RhcnQudG9wICsgInB4IjsKICAgIGNvbnN0IGxlZnQgPSBldmVudC5wYWdlWCAtIHN0YXJ0LlggKyBzdGFydC5sZWZ0ICsgInB4IjsKICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUudG9wID0gdG9wOwogIH0KCiAgLy8gbW92ZSBvdXIgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGJhbGwgdW5kZXIgdGhlIHBvaW50ZXIKICBtb3ZlQXQoZXZlbnQsIHN0YXJ0KTsKICBmdW5jdGlvbiBvbk1vdXNlTW92ZShldmVudCkgewogICAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgfQoKICAvLyBXZSB1c2UgdGhpcyB0byByZW1vdmUgdGhlIG1vdXNlbW92ZSB3aGVuIGNsaWNraW5nIG91dHNpZGUgb2YgdGhlIGNvbnRhaW5lcgogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CgogIC8vIG1vdmUgdGhlIGNvbnRhaW5lciBvbiBtb3VzZW1vdmUKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCBvbk1vdXNlTW92ZSwgewogICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCwKICB9KTsKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICBjbGVhblVwKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKCiAgZnVuY3Rpb24gY2xlYW5VcCgpIHsKICAgIGNvbnNvbGUubG9nKCJjbGVhbmluZyB1cCB0aGUgcGxvdCBtb3ZlIGxpc3RlbmVyIik7CiAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICBDTElQQk9BUkRfSEVBREVSLm9ubW91c2V1cCA9IG51bGw7CiAgfQoKICAvLyAoMykgZHJvcCB0aGUgYmFsbCwgcmVtb3ZlIHVubmVlZGVkIGhhbmRsZXJzCiAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBjbGVhblVwOwp9OwoKZnVuY3Rpb24gc2VuZFRvQ2xpcGJvYXJkKGJsb2IpIHsKICBpZiAoIW5hdmlnYXRvci5jbGlwYm9hcmQpIHsKICAgIGFsZXJ0KAogICAgICAiVGhlIENsaXBib2FyZCBBUEkgZG9lcyBub3Qgc2VlbSB0byBiZSBhdmFpbGFibGUsIG1ha2Ugc3VyZSB0aGUgUGx1dG8gbm90ZWJvb2sgaXMgYmVpbmcgdXNlZCBmcm9tIGVpdGhlciBsb2NhbGhvc3Qgb3IgYW4gaHR0cHMgc291cmNlLiIKICAgICk7CiAgfQogIG5hdmlnYXRvci5jbGlwYm9hcmQKICAgIC53cml0ZShbCiAgICAgIG5ldyBDbGlwYm9hcmRJdGVtKHsKICAgICAgICAvLyBUaGUga2V5IGlzIGRldGVybWluZWQgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIGJsb2IncyB0eXBlLgogICAgICAgIFtibG9iLnR5cGVdOiBibG9iLAogICAgICB9KSwKICAgIF0pCiAgICAudGhlbigKICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgIGNvbnNvbGUubG9nKCJBc3luYzogQ29weWluZyB0byBjbGlwYm9hcmQgd2FzIHN1Y2Nlc3NmdWwhIik7CiAgICAgIH0sCiAgICAgIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJBc3luYzogQ291bGQgbm90IGNvcHkgdGV4dDogIiwgZXJyKTsKICAgICAgfQogICAgKTsKfQoKZnVuY3Rpb24gY29weUltYWdlVG9DbGlwYm9hcmQoKSB7CiAgLy8gV2UgZXh0cmFjdCB0aGUgaW1hZ2Ugb3B0aW9ucyBmcm9tIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzIChpZiB0aGV5IGV4aXN0KQogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuIFdlIGFsc28gaWdub3JlIGZvcm1hdCBiZWNhdXNlIHRoZSBjbGlwYm9hcmQgb25seSBzdXBwb3J0cyBwbmcuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwga2V5ID09PSAiZm9ybWF0IikgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbmZpZ1trZXldID0gdmFsOwogIH0KICBQbG90bHkudG9JbWFnZShQTE9ULCBjb25maWcpLnRoZW4oZnVuY3Rpb24gKGRhdGFVcmwpIHsKICAgIGZldGNoKGRhdGFVcmwpCiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5ibG9iKCkpCiAgICAgIC50aGVuKChibG9iKSA9PiB7CiAgICAgICAgY29uc3QgcGFzdGVfcmVjZWl2ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdwYXN0ZS1yZWNlaXZlci5wbHV0b3Bsb3RseScpCiAgICAgICAgaWYgKHBhc3RlX3JlY2VpdmVyKSB7CiAgICAgICAgICBwYXN0ZV9yZWNlaXZlci5hdHRhY2hJbWFnZShkYXRhVXJsLCBDT05UQUlORVIpCiAgICAgICAgfQogICAgICAgIHNlbmRUb0NsaXBib2FyZChibG9iKQogICAgICB9KTsKICB9KTsKfQoKZnVuY3Rpb24gc2F2ZUltYWdlVG9GaWxlKCkgewogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LmRvd25sb2FkSW1hZ2UoUExPVCwgY29uZmlnKTsKfQoKbGV0IGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwLCB0b3A6IDAsIGxlZnQ6IDAgfTsKZnVuY3Rpb24gdW5wb3BfY29udGFpbmVyKGNsKSB7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCBmYWxzZSk7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoY2wsIGZhbHNlKTsKICAvLyBXZSBmaXggdGhlIGhlaWdodCBiYWNrIHRvIHRoZSB2YWx1ZSBpdCBoYWQgYmVmb3JlIHBvcG91dCwgYWxzbyBzZXR0aW5nIHRoZSBmbGFnIHRvIHNpZ25hbCB0aGF0IHVwb24gZmlyc3QgcmVzaXplIHdlIHJlbW92ZSB0aGUgZml4ZWQgaW5saW5lLXN0eWxlCiAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9IGNvbnRhaW5lcl9yZWN0LmhlaWdodCArICJweCI7CiAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gdHJ1ZTsKICAvLyBXZSBzZXQgdGhlIG90aGVyIGZpeGVkIGlubGluZS1zdHlsZXMgdG8gbnVsbAogIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogIENPTlRBSU5FUi5zdHlsZS50b3AgPSAiIjsKICBDT05UQUlORVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIFdlIGFsc28gcmVtb3ZlIHRoZSBDTElQQk9BUkRfSEVBREVSCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9ICIiOwogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIEZpbmFsbHkgd2UgcmVtb3ZlIHRoZSBoaWRkZW4gY2xhc3MgdG8gdGhlIGhlYWRlcgogIENMSVBCT0FSRF9IRUFERVIuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgdHJ1ZSk7CiAgcmV0dXJuOwp9CmZ1bmN0aW9uIHBvcG91dF9jb250YWluZXIob3B0cykgewogIGNvbnN0IGNsID0gb3B0cz8uY2w7CiAgY29uc3QgdGFyZ2V0X2NvbnRhaW5lcl9zaXplID0gb3B0cz8udGFyZ2V0X2NvbnRhaW5lcl9zaXplID8/IHt9OwogIGNvbnN0IHRhcmdldF9wbG90X3NpemUgPSBvcHRzPy50YXJnZXRfcGxvdF9zaXplID8/IHt9OwogIGlmIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgcmV0dXJuIHVucG9wX2NvbnRhaW5lcihjbCk7CiAgfQogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBjbCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0cnVlKTsKICAvLyBXZSBleHRyYWN0IHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNvbnRhaW5lciwgc2F2ZSB0aGVtIGFuZCBmaXggdGhlbQogIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH0gPSBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgY29udGFpbmVyX3JlY3QgPSB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9OwogIC8vIFdlIHNhdmUgdGhlIGN1cnJlbnQgcGxvdCBzaXplIGJlZm9yZSB3ZSBwb3AgYXMgaXQgd2lsbCBmaWxsIHRoZSBzY3JlZW4KICBjb25zdCBjdXJyZW50X3Bsb3Rfc2l6ZSA9IHsKICAgIHdpZHRoOiBQTE9ULl9mdWxsTGF5b3V0LndpZHRoLAogICAgaGVpZ2h0OiBQTE9ULl9mdWxsTGF5b3V0LmhlaWdodCwKICB9OwogIC8vIFdlIGhhdmUgdG8gc2F2ZSB0aGUgcGFkIGRhdGEgYmVmb3JlIHBvcHBpbmcgc28gd2UgY2FuIHJlc2l6ZSBwcmVjaXNlbHkKICBjb25zdCBwYWQgPSB7fTsKICBwYWQudW5wb3BwZWQgPSBnZXRTaXplRGF0YSgpLmNvbnRhaW5lcl9wYWQ7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCB0cnVlKTsKICBwYWQucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIC8vIFdlIGRvIHRvcCBhbmQgbGVmdCBiYXNlZCBvbiB0aGUgY3VycmVudCByZWN0CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ0b3AiLCAibGVmdCJdKSB7CiAgICBjb25zdCBzdGFydF92YWwgPSB0YXJnZXRfY29udGFpbmVyX3NpemVba2V5XSA/PyBjb250YWluZXJfcmVjdFtrZXldOwogICAgbGV0IG9mZnNldCA9IDA7CiAgICBmb3IgKGNvbnN0IGtpbmQgb2YgWyJwYWRkaW5nIiwgImJvcmRlciJdKSB7CiAgICAgIG9mZnNldCArPSBwYWQucG9wcGVkW2tpbmRdW2tleV0gLSBwYWQudW5wb3BwZWRba2luZF1ba2V5XTsKICAgIH0KICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gc3RhcnRfdmFsIC0gb2Zmc2V0ICsgInB4IjsKICAgIGlmIChrZXkgPT09ICJsZWZ0IikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgLy8gV2UgY29tcHV0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBkZXBlbmRpbmcgb24gZXZlbnR1YWwgY29uZmlnIGRhdGEKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7CiAgICB3aWR0aDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS53aWR0aCA/PwogICAgICBjb25maWdfc3BhbnMud2lkdGguY29uZmlnX3ZhbHVlID8/CiAgICAgIGN1cnJlbnRfcGxvdF9zaXplLndpZHRoLAogICAgaGVpZ2h0OgogICAgICB0YXJnZXRfcGxvdF9zaXplLmhlaWdodCA/PwogICAgICBjb25maWdfc3BhbnMuaGVpZ2h0LmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS5oZWlnaHQsCiAgfSk7CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgY29uc3QgdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY3N6W2tleV07CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHZhbCArICJweCI7CiAgICBpZiAoa2V5ID09PSAid2lkdGgiKSB7CiAgICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGVba2V5XSA9IENPTlRBSU5FUi5zdHlsZVtrZXldOwogICAgfQogIH0KICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIGZhbHNlKTsKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICB1bnBvcF9jb250YWluZXIoKTsKICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9LAogICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0KICApOwp9CgpDT05UQUlORVIucG9wT3V0ID0gcG9wb3V0X2NvbnRhaW5lcjsKCmZ1bmN0aW9uIER1YWxDbGljayhzaW5nbGVfZnVuYywgZGJsX2Z1bmMpIHsKICBsZXQgbmNsaWNrcyA9IDA7CiAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7CiAgICBuY2xpY2tzICs9IDE7CiAgICBpZiAobmNsaWNrcyA+IDEpIHsKICAgICAgZGJsX2Z1bmMoLi4uYXJncyk7CiAgICAgIG5jbGlja3MgPSAwOwogICAgfSBlbHNlIHsKICAgICAgZGVsYXkoMzAwKS50aGVuKCgpID0+IHsKICAgICAgICBpZiAobmNsaWNrcyA9PSAxKSB7CiAgICAgICAgICBzaW5nbGVfZnVuYyguLi5hcmdzKTsKICAgICAgICB9CiAgICAgICAgbmNsaWNrcyA9IDA7CiAgICAgIH0pOwogICAgfQogIH07Cn0KCi8vIFdlIHJlbW92ZSB0aGUgZGVmYXVsdCBkb3dubG9hZCBpbWFnZSBidXR0b24KcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9SZW1vdmUgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlLAogIFsidG9JbWFnZSJdCik7Ci8vIFdlIGFkZCB0aGUgY3VzdG9tIGJ1dHRvbiB0byB0aGUgbW9kZWJhcgpwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb0FkZCA9IF8udW5pb24oCiAgcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQsCiAgWwogICAgewogICAgICBuYW1lOiAiQ29weSBQTkcgdG8gQ2xpcGJvYXJkIiwKICAgICAgaWNvbjogewogICAgICAgIGhlaWdodDogNTIwLAogICAgICAgIHdpZHRoOiA1MjAsCiAgICAgICAgcGF0aDogIk0yODAgNjRoNDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRWNDQ4YzAgMzUuMy0yOC43IDY0LTY0IDY0SDY0Yy0zNS4zIDAtNjQtMjguNy02NC02NFYxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRoNDAgOS42QzEyMSAyNy41IDE1My4zIDAgMTkyIDBzNzEgMjcuNSA3OC40IDY0SDI4MHpNNjQgMTEyYy04LjggMC0xNiA3LjItMTYgMTZWNDQ4YzAgOC44IDcuMiAxNiAxNiAxNkgzMjBjOC44IDAgMTYtNy4yIDE2LTE2VjEyOGMwLTguOC03LjItMTYtMTYtMTZIMzA0djI0YzAgMTMuMy0xMC43IDI0LTI0IDI0SDE5MiAxMDRjLTEzLjMgMC0yNC0xMC43LTI0LTI0VjExMkg2NHptMTI4LThhMjQgMjQgMCAxIDAgMC00OCAyNCAyNCAwIDEgMCAwIDQ4eiIsCiAgICAgIH0sCiAgICAgIGRpcmVjdGlvbjogInVwIiwKICAgICAgY2xpY2s6IER1YWxDbGljayhjb3B5SW1hZ2VUb0NsaXBib2FyZCwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoKTsKICAgICAgfSksCiAgICB9LAogICAgewogICAgICBuYW1lOiAiRG93bmxvYWQgSW1hZ2UiLAogICAgICBpY29uOiBQbG90bHkuSWNvbnMuY2FtZXJhLAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soc2F2ZUltYWdlVG9GaWxlLCAoKSA9PiB7CiAgICAgICAgcG9wb3V0X2NvbnRhaW5lcih7IGNsOiAiZmlsZXNhdmUiIH0pOwogICAgICB9KSwKICAgIH0sCiAgXQopOwoKZnVuY3Rpb24gZ2V0T2Zmc2V0RGF0YShlbCkgewogIGxldCBjcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsLCBudWxsKTsKICBjb25zdCBvZGF0YSA9IHsKICAgIHBhZGRpbmc6IHsKICAgICAgbGVmdDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSwKICAgICAgYm90dG9tOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSArIHBhcnNlRmxvYXQoY3MucGFkZGluZ0JvdHRvbSksCiAgICB9LAogICAgYm9yZGVyOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyTGVmdFdpZHRoKSwKICAgICAgcmlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyUmlnaHRXaWR0aCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5ib3JkZXJUb3BXaWR0aCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCkgKyBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICB9CiAgfTsKICBpZiAoZWwgPT09IFBMT1QpIHsKICAgIC8vIEZvciB0aGUgUExPVCB3ZSBhbHNvIHdhbnQgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIG9mZnNldAogICAgb2RhdGEub2Zmc2V0ID0gewogICAgICB0b3A6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0VG9wIDogMCwKICAgICAgbGVmdDogUExPVC5vZmZzZXRQYXJlbnQgPT0gQ09OVEFJTkVSID8gUExPVC5vZmZzZXRMZWZ0IDogMCwKICAgIH0KICB9CiAgcmV0dXJuIG9kYXRhOwp9CmZ1bmN0aW9uIGdldFNpemVEYXRhKCkgewogIGNvbnN0IGRhdGEgPSB7CiAgICBwbG90X3BhZDogZ2V0T2Zmc2V0RGF0YShQTE9UKSwKICAgIHBsb3RfcmVjdDogUExPVC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICAgIGNvbnRhaW5lcl9wYWQ6IGdldE9mZnNldERhdGEoQ09OVEFJTkVSKSwKICAgIGNvbnRhaW5lcl9yZWN0OiBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgfTsKICByZXR1cm4gZGF0YTsKfQpmdW5jdGlvbiBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgY29uc3QgY29tcHV0ZWRfc2l6ZSA9IGNvbXB1dGVQbG90U2l6ZShzaXplRGF0YSk7CiAgY29uc3Qgb2Zmc2V0cyA9IGNvbXB1dGVkX3NpemUub2Zmc2V0czsKCiAgY29uc3QgcGxvdF9kYXRhID0gewogICAgd2lkdGg6IHdpZHRoID8/IGNvbXB1dGVkX3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IGhlaWdodCA/PyBjb21wdXRlZF9zaXplLmhlaWdodCwKICB9OwoKICByZXR1cm4gewogICAgd2lkdGg6ICh3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoKSArIG9mZnNldHMud2lkdGgsCiAgICBoZWlnaHQ6IChoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQpICsgb2Zmc2V0cy5oZWlnaHQsCiAgICBub0NoYW5nZTogd2lkdGggPT0gY29tcHV0ZWRfc2l6ZS53aWR0aCAmJiBoZWlnaHQgPT0gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfQp9CgovLyBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hhbmdlIHRoZSBjb250YWluZXIgc2l6ZSBzbyB0aGF0IHRoZSByZXN1bHRpbmcgcGxvdCB3aWxsIGJlIG1hdGNoaW5nIHRoZSBwcm92aWRlZCBzcGVjcwpmdW5jdGlvbiBjaGFuZ2VDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICBpZiAoIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICBjb25zb2xlLmxvZygiVHJpZWQgdG8gY2hhbmdlIGNvbnRhaW5lciBzaXplIHdoZW4gbm90IHBvcHBlZCwgaWdub3JpbmciKTsKICAgIHJldHVybjsKICB9CgogIGNvbnN0IGNzeiA9IGNvbXB1dGVDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSk7CgogIGlmIChjc3oubm9DaGFuZ2UpIHsKICAgIGNvbnNvbGUubG9nKCJTaXplIGlzIHRoZSBzYW1lIGFzIGN1cnJlbnQsIGlnbm9yaW5nIik7CiAgICByZXR1cm4KICB9CiAgLy8gV2UgYXJlIG5vdyBnb2luZyB0byBzZXQgaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgY29udGFpbmVyCiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSBjc3pba2V5XSArICJweCI7CiAgfQp9Ci8vIFdlIG5vdyBjcmVhdGUgdGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCB1cGRhdGUgdGhlIHBsb3QgYmFzZWQgb24gdGhlIHZhbHVlcyBzcGVjaWZpZWQKZnVuY3Rpb24gdXBkYXRlRnJvbUhlYWRlcigpIHsKICBjb25zdCBoZWFkZXJfZGF0YSA9IHsKICAgIGhlaWdodDogY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSwKICAgIHdpZHRoOiBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUsCiAgfTsKICBjaGFuZ2VDb250YWluZXJTaXplKGhlYWRlcl9kYXRhKTsKfQovLyBXZSBhc3NpZ24gdGhpcyBmdW5jdGlvbiB0byB0aGUgb25ibHVyIGV2ZW50IG9mIHdpZHRoIGFuZCBoZWlnaHQKaWYgKGZpcnN0UnVuKSB7CiAgZm9yIChjb25zdCBjb250YWluZXIgb2YgT2JqZWN0LnZhbHVlcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIudWlfc3Bhbi5vbmJsdXIgPSAoZSkgPT4gewogICAgICBjb250YWluZXIudWlfdmFsdWUgPSBjb250YWluZXIudWlfc3Bhbi50ZXh0Q29udGVudDsKICAgICAgdXBkYXRlRnJvbUhlYWRlcigpOwogICAgfTsKICB9Cn0KLy8gVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgcGxvdCBzaXplIHRvIHVzZSBmb3IgcmVsYXlvdXQgYXMgYSBmdW5jdGlvbiBvZiB0aGUgY29udGFpbmVyIHNpemUKZnVuY3Rpb24gY29tcHV0ZVBsb3RTaXplKGRhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgLy8gUmVtb3ZlIFBhZGRpbmcKICBjb25zdCB7IGNvbnRhaW5lcl9wYWQsIHBsb3RfcGFkLCBjb250YWluZXJfcmVjdCB9ID0gZGF0YTsKICBjb25zdCBvZmZzZXRzID0gewogICAgd2lkdGg6CiAgICAgIHBsb3RfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBwbG90X3BhZC5ib3JkZXIud2lkdGggKwogICAgICBwbG90X3BhZC5vZmZzZXQubGVmdCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy53aWR0aCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLndpZHRoLAogICAgaGVpZ2h0OgogICAgICBwbG90X3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIHBsb3RfcGFkLmJvcmRlci5oZWlnaHQgKwogICAgICBwbG90X3BhZC5vZmZzZXQudG9wICsKICAgICAgY29udGFpbmVyX3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLmhlaWdodCwKICB9OwogIGNvbnN0IHN6ID0gewogICAgd2lkdGg6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3Qud2lkdGggLSBvZmZzZXRzLndpZHRoKSwKICAgIGhlaWdodDogTWF0aC5yb3VuZChjb250YWluZXJfcmVjdC5oZWlnaHQgLSBvZmZzZXRzLmhlaWdodCksCiAgICBvZmZzZXRzLAogIH07CiAgcmV0dXJuIHN6Owp9CgovLyBDcmVhdGUgdGhlIHJlc2l6ZU9ic2VydmVyIHRvIG1ha2UgdGhlIHBsb3QgZXZlbiBtb3JlIHJlc3BvbnNpdmUhIDptYWdpYzoKY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHsKICBjb25zdCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCk7CiAgY29uc3Qge2NvbnRhaW5lcl9yZWN0LCBjb250YWluZXJfcGFkfSA9IHNpemVEYXRhOwogIGxldCBwbG90X3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIC8vIFdlIHNhdmUgdGhlIGhlaWdodCBpbiB0aGUgUExPVCBvYmplY3QKICBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQ7CiAgLy8gV2UgZGVhbCB3aXRoIHNvbWUgc3R1ZmYgaWYgdGhlIGNvbnRhaW5lciBpcyBwb3BwcGVkCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9IGNvbnRhaW5lcl9yZWN0LndpZHRoICsgInB4IjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBjb250YWluZXJfcmVjdC5sZWZ0ICsgInB4IjsKICBjb25maWdfc3BhbnMuaGVpZ2h0LnVpX3ZhbHVlID0gcGxvdF9zaXplLmhlaWdodDsKICBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUgPSBwbG90X3NpemUud2lkdGg7CiAgLyogCgkJVGhlIGFkZGl0aW9uIG9mIHRoZSBpbnZhbGlkIGFyZ3VtZW50IGBwbHV0b3Jlc2l6ZWAgc2VlbXMgdG8gZml4IHRoZSBwcm9ibGVtIHdpdGggY2FsbGluZyBgcmVsYXlvdXRgIHNpbXBseSB3aXRoIGB7YXV0b3NpemU6IHRydWV9YCBhcyB1cGRhdGUgYnJlYWtpbmcgbW91c2UgcmVsYXlvdXQgZXZlbnRzIHRyYWNraW5nLiAKCQlTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Bsb3RseS9wbG90bHkuanMvaXNzdWVzLzYxNTYgZm9yIGRldGFpbHMKCQkqLwogIGxldCBjb25maWcgPSB7CiAgICAvLyBJZiB0aGlzIGlzIHBvcHBlZCBvdXQsIHdlIGlnbm9yZSB0aGUgb3JpZ2luYWwgd2lkdGgvaGVpZ2h0CiAgICB3aWR0aDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfd2lkdGgpID8/IHBsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfaGVpZ2h0KSA/PyBwbG90X3NpemUuaGVpZ2h0LAogICAgcGx1dG9yZXNpemU6IHRydWUsCiAgfTsKICBQbG90bHkucmVsYXlvdXQoUExPVCwgY29uZmlnKS50aGVuKCgpID0+IHsKICAgIGlmIChyZW1vdmVfY29udGFpbmVyX3NpemUgJiYgIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIHRoZSBmaXJzdCByZXNpemUgdXBvbiBwbG90IGNyZWF0aW9uIHRvIGFscmVhZHkgYmUgd2l0aG91dCBhIGZpeGVkIGhlaWdodAogICAgICBDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gIiI7CiAgICAgIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogICAgICByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmYWxzZTsKICAgIH0KICB9KTsKfSk7CgpyZXNpemVPYnNlcnZlci5vYnNlcnZlKENPTlRBSU5FUik7CgoKUGxvdGx5LnJlYWN0KFBMT1QsIHBsb3Rfb2JqKS50aGVuKCgpID0+IHsKCS8vIEFzc2lnbiB0aGUgUGxvdGx5IGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKHBsb3RseV9saXN0ZW5lcnMpKSB7CgkJZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcl92ZWMpIHsKCQkJUExPVC5vbihrZXksIGxpc3RlbmVyKQoJCX0KCX0KCS8vIEFzc2lnbiB0aGUgSlMgZXZlbnQgbGlzdGVuZXJzCglmb3IgKGNvbnN0IFtrZXksIGxpc3RlbmVyX3ZlY10gb2YgT2JqZWN0LmVudHJpZXMoanNfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1QuYWRkRXZlbnRMaXN0ZW5lcihrZXksIGxpc3RlbmVyLCB7CgkJCQlzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsCgkJCX0pCgkJfQoJfQp9CikKCgppbnZhbGlkYXRpb24udGhlbigoKSA9PiB7CgkvLyBSZW1vdmUgYWxsIHBsb3RseSBsaXN0ZW5lcnMKCVBMT1QucmVtb3ZlQWxsTGlzdGVuZXJzKCkKCS8vIFJlbW92ZSBhbGwgSlMgbGlzdGVuZXJzCgljb250cm9sbGVyLmFib3J0KCkKCS8vIFJlbW92ZSB0aGUgcmVzaXplT2JzZXJ2ZXIKCXJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKQp9KQoKCgoJCXJldHVybiBDT05UQUlORVIKCTwvc2NyaXB0PgqkbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/yEcIldGwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJDM1ZmYzNDAyLWRjMzYtNGI5MS1iZWM5LWI0ZDIxZmFmM2U2OLlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzi4NtjW1cHVibGlzaGVkX29iamVjdF9rZXlzkdk1N2JjYzA1YjAtODFkYS0xMWVmLTIwNDAtMzU4NWM5YjQ5NTRmLzJmMmQyMDg2NWU0Y2E4ZGK4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkNGE0YTZiZDMtYjgyMC00NzljLTg5ZTMtZjNjZTc5YTMxNmRiiqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedpqiQk8c2NyaXB0IGlkPSdwbG90XzEnPgoJCS8vIFdlIHN0YXJ0IGJ5IHB1dHRpbmcgYWxsIHRoZSB2YXJpYWJsZSBpbnRlcnBvbGF0aW9uIGhlcmUgYXQgdGhlIGJlZ2lubmluZwoJCS8vIFdlIGhhdmUgdG8gY29udmVydCBhbGwgdHlwZWRhcnJheXMgaW4gdGhlIGxheW91dCB0byBub3JtYWwgYXJyYXlzLiBTZWUgSXNzdWUgIzI1CgkJLy8gV2UgdXNlIGxvZGFzaCBmb3IgdGhpcyBmb3IgY29tcGFjdG5lc3MKCQlmdW5jdGlvbiByZW1vdmVUeXBlZEFycmF5KG8pIHsKCQkJcmV0dXJuIF8uaXNUeXBlZEFycmF5KG8pID8gQXJyYXkuZnJvbShvKSA6CgkJCV8uaXNQbGFpbk9iamVjdChvKSA/IF8ubWFwVmFsdWVzKG8sIHJlbW92ZVR5cGVkQXJyYXkpIDogCgkJCW8KCQl9CgoJCS8vIFB1Ymxpc2ggdGhlIHBsb3Qgb2JqZWN0IHRvIEpTCgkJbGV0IHBsb3Rfb2JqID0gXy51cGRhdGUoLyogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBBYnN0cmFjdFBsdXRvRGluZ2V0amVzLkRpc3BsYXkucHVibGlzaGVkX3RvX2pzICovIGdldFB1Ymxpc2hlZE9iamVjdCgiN2JjYzA1YjAtODFkYS0xMWVmLTIwNDAtMzU4NWM5YjQ5NTRmLzc5NGExNjU0OTcxZDBjODEiKSwgImxheW91dCIsIHJlbW92ZVR5cGVkQXJyYXkpCgkJLy8gR2V0IHRoZSBwbG90bHkgbGlzdGVuZXJzCgkJY29uc3QgcGxvdGx5X2xpc3RlbmVycyA9IHt9CgkJLy8gR2V0IHRoZSBKUyBsaXN0ZW5lcnMKCQljb25zdCBqc19saXN0ZW5lcnMgPSB7fQoJCS8vIERlYWwgd2l0aCBldmVudHVhbCBjdXN0b20gY2xhc3NlcwoJCWxldCBjdXN0b21fY2xhc3NsaXN0ID0gW10KCgoJCS8vIExvYWQgdGhlIHBsb3RseSBsaWJyYXJ5CgkJbGV0IFBsb3RseSA9IHVuZGVmaW5lZAoJCXRyeSB7CgkJCWxldCBfbW9kID0gYXdhaXQgaW1wb3J0KCIuL3Bsb3RseWpzL3Bsb3RseWpzLTIuMjYuMi5taW4uanMiKQoJCQlQbG90bHkgPSBfbW9kLmRlZmF1bHQKCQl9IGNhdGNoIChlKSB7CgkJCWNvbnNvbGUubG9nKCJMb2NhbCBsb2FkIGZhaWxlZCwgdHJ5aW5nIHdpdGggdGhlIHdlYiBlc20uc2ggdmVyc2lvbiIpCgkJCWxldCBfbW9kID0gYXdhaXQgaW1wb3J0KCJodHRwczovL2VzbS5zaC92MTM1L3Bsb3RseS5qcy1kaXN0LW1pbkAyLjI2LjIvZXNuZXh0L3Bsb3RseS5qcy1kaXN0LW1pbi5tanMiKQoJCQlQbG90bHkgPSBfbW9kLmRlZmF1bHQKCQl9CgoJCS8vIENoZWNrIGlmIHdlIGhhdmUgdG8gZm9yY2UgbG9jYWwgbWF0aGpheCBmb250IGNhY2hlCgkJaWYgKGZhbHNlICYmIHdpbmRvdz8uTWF0aEpheD8uY29uZmlnPy5zdmc/LmZvbnRDYWNoZSA9PT0gJ2dsb2JhbCcpIHsKCQkJd2luZG93Lk1hdGhKYXguY29uZmlnLnN2Zy5mb250Q2FjaGUgPSAnbG9jYWwnCgkJfQoKCQkvLyBGbGFnIHRvIGNoZWNrIGlmIHRoaXMgY2VsbCB3YXMgIG1hbnVhbGx5IHJhbiBvciByZWFjdGl2ZWx5IHJhbgpjb25zdCBmaXJzdFJ1biA9IHRoaXMgPyBmYWxzZSA6IHRydWUKY29uc3QgQ09OVEFJTkVSID0gdGhpcyA/PyBodG1sYDxkaXYgY2xhc3M9J3BsdXRvcGxvdGx5LWNvbnRhaW5lcic+YApjb25zdCBQTE9UID0gQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoJy5qcy1wbG90bHktcGxvdCcpID8/IENPTlRBSU5FUi5hcHBlbmRDaGlsZChodG1sYDxkaXY+YCkKY29uc3QgcGFyZW50ID0gQ09OVEFJTkVSLnBhcmVudEVsZW1lbnQKLy8gV2UgdXNlIGEgY29udHJvbGxlciB0byByZW1vdmUgZXZlbnQgbGlzdGVuZXJzIHVwb24gaW52YWxpZGF0aW9uCmNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCkKLy8gV2UgaGF2ZSB0byBhZGQgdGhpcyB0byBrZWVwIHN1cHBvcnRpbmcgQGJpbmQgd2l0aCB0aGUgb2xkIEFQSSB1c2luZyBQTE9UClBMT1QuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoZSkgPT4gewoJQ09OVEFJTkVSLnZhbHVlID0gUExPVC52YWx1ZQoJaWYgKGUuYnViYmxlcykgewoJCXJldHVybgoJfQoJQ09OVEFJTkVSLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdpbnB1dCcpKQp9LCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSkKCgkvLyBUaGlzIGNyZWF0ZSB0aGUgc3R5bGUgc3ViZGl2IG9uIGZpcnN0IHJ1bgoJZmlyc3RSdW4gJiYgQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgCgk8c3R5bGU+CgkucGx1dG9wbG90bHktY29udGFpbmVyIHsKCQl3aWR0aDogMTAwJTsKCQloZWlnaHQ6IDEwMCU7CgkJbWluLWhlaWdodDogMDsKCQltaW4td2lkdGg6IDA7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyIC5qcy1wbG90bHktcGxvdCAucGxvdGx5IGRpdiB7CgkJbWFyZ2luOiAwIGF1dG87IC8vIFRoaXMgY2VudGVycyB0aGUgcGxvdAoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5wb3BwZWQtb3V0IHsKCQlvdmVyZmxvdzogYXV0bzsKCQl6LWluZGV4OiAxMDAwOwoJCXBvc2l0aW9uOiBmaXhlZDsKCQlyZXNpemU6IGJvdGg7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwcHg7CgkJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDBweDsKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIHsKCQlkaXNwbGF5OiBmbGV4OwoJCWZsZXgtZmxvdzogcm93IHdyYXA7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMTJweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMTJweDsKCQlwb3NpdGlvbjogZml4ZWQ7CgkJei1pbmRleDogMTAwMTsKCQljdXJzb3I6IG1vdmU7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCAtMTAwJSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgc3BhbiB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCWZsZXg6IDEKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyLmhpZGRlbiB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3BhbiB7CgkJcG9zaXRpb246IHJlbGF0aXZlOwoJfQoJLmNsaXBib2FyZC12YWx1ZSB7CgkJcGFkZGluZy1yaWdodDogNXB4OwoJCXBhZGRpbmctbGVmdDogMnB4OwoJCWN1cnNvcjogdGV4dDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZmlsZW5hbWUgewoJCWZsZXg6IDAgMCAxMDAlOwoJCXRleHQtYWxpZ246IGNlbnRlcjsKCQlib3JkZXItdG9wOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJbWFyZ2luLXRvcDogNXB4OwoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5maWxlbmFtZSB7CgkJbWFyZ2luLWxlZnQ6IDNweDsKCQl0ZXh0LWFsaWduOiBsZWZ0OwoJCW1pbi13aWR0aDogbWluKDYwJSwgbWluLWNvbnRlbnQpOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5maWxlc2F2ZSAuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgLmxhYmVsIHsKCQlmbGV4OiAwIDAgMDsKCX0KCS5jbGlwYm9hcmQtdmFsdWUuZm9ybWF0IHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7CgkJZmxleDogMSAwIGF1dG87CgkJbWluLXdpZHRoOiAzMHB4OwoJCW1hcmdpbi1yaWdodDogMTBweDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyB7CgkJZGlzcGxheTogaW5saW5lLWZsZXg7CgkJZmxleC1mbG93OiBjb2x1bW47CgkJcG9zaXRpb246IGFic29sdXRlOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJcGFkZGluZy1sZWZ0OiAzcHg7CgkJei1pbmRleDogMjAwMDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9uczpob3ZlciB7CgkJY3Vyc29yOiBwb2ludGVyOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCXBhZGRpbmc6IDNweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtM3B4LCAtNnB4KTsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyAuZm9ybWF0LW9wdGlvbiB7CgkJZGlzcGxheTogbm9uZTsKCX0KCWRpdi5mb3JtYXQtb3B0aW9uczpob3ZlciAuZm9ybWF0LW9wdGlvbiB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246bm90KC5zZWxlY3RlZCkgewoJCW1hcmdpbi10b3A6IDNweDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyAuZm9ybWF0LW9wdGlvbi5zZWxlY3RlZCB7CgkJb3JkZXI6IC0xOwoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5mb3JtYXQtb3B0aW9uOmhvdmVyIHsKCQliYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCX0KCXNwYW4uY29uZmlnLXZhbHVlIHsKCQlmb250LXdlaWdodDogbm9ybWFsOwoJCWNvbG9yOiB2YXIoLS1wbHV0by1vdXRwdXQtY29sb3IpOwoJCWRpc3BsYXk6IG5vbmU7CgkJcG9zaXRpb246IGFic29sdXRlOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCBjYWxjKC0xMDAlIC0gMTBweCkpOwoJCXBhZGRpbmc6IDVweDsKCX0KCS5sYWJlbCB7CgkJdXNlci1zZWxlY3Q6IG5vbmU7Cgl9CgkubGFiZWw6aG92ZXIgc3Bhbi5jb25maWctdmFsdWUgewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQltaW4td2lkdGg6IDE1MHB4OwoJfQoJLmNsaXBib2FyZC1zcGFuLm1hdGNoaW5nLWNvbmZpZyAubGFiZWwgewoJCWNvbG9yOiB2YXIoLS1jbS1tYWNyby1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZGlmZmVyZW50LWNvbmZpZyAubGFiZWwgewoJCWNvbG9yOiB2YXIoLS1jbS10YWctY29sb3IpOwoJCWZvbnQtd2VpZ2h0OiBib2xkOwoJfQo8L3N0eWxlPgpgKQoKbGV0IG9yaWdpbmFsX2hlaWdodCA9IHBsb3Rfb2JqLmxheW91dC5oZWlnaHQKbGV0IG9yaWdpbmFsX3dpZHRoID0gcGxvdF9vYmoubGF5b3V0LndpZHRoCi8vIEZvciB0aGUgaGVpZ2h0IHdlIGhhdmUgdG8gYWxzbyBwdXQgYSBmaXhlZCB2YWx1ZSBpbiBjYXNlIHRoZSBwbG90IGlzIHB1dCBvbiBhIG5vbi1maXhlZC1zaXplIGNvbnRhaW5lciAobGlrZSB0aGUgZGVmYXVsdCB3cmFwcGVyKQovLyBXZSBkZWZpbmUgYSB2YXJpYWJsZSB0byBjaGVjayB3aGV0aGVyIHdlIHN0aWxsIGhhdmUgdG8gcmVtb3ZlIHRoZSBmaXhlZCBoZWlnaHQKbGV0IHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IGZpcnN0UnVuCmxldCBjb250YWluZXJfaGVpZ2h0ID0gb3JpZ2luYWxfaGVpZ2h0ID8/IFBMT1QuY29udGFpbmVyX2hlaWdodCA/PyA0MDAKQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9IGNvbnRhaW5lcl9oZWlnaHQgKyAncHgnCgovLyBXZSBjcmVhdGUgYSBQcm9taXNlIHZlcnNpb24gb2Ygc2V0VGltZW91dApmdW5jdGlvbiBkZWxheShtcykgewogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpOwp9CgovLyBXZSBpbXBvcnQgaW50ZXJhY3QgZm9yIGRyYWdnaW5nL3Jlc2l6aW5nCmNvbnN0IHsgZGVmYXVsdDogaW50ZXJhY3QgfSA9IGF3YWl0IGltcG9ydCgnaHR0cHM6Ly9lc20uc2gvaW50ZXJhY3Rqc0AxLjEwLjE5JykKCgpmdW5jdGlvbiBnZXRJbWFnZU9wdGlvbnMoKSB7CiAgY29uc3QgbyA9IHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICByZXR1cm4gewogICAgZm9ybWF0OiBvLmZvcm1hdCA/PyAicG5nIiwKICAgIHdpZHRoOiBvLndpZHRoID8/IG9yaWdpbmFsX3dpZHRoLAogICAgaGVpZ2h0OiBvLmhlaWdodCA/PyBvcmlnaW5hbF9oZWlnaHQsCiAgICBzY2FsZTogby5zY2FsZSA/PyAxLAogICAgZmlsZW5hbWU6IG8uZmlsZW5hbWUgPz8gIm5ld3Bsb3QiLAogIH07Cn0KCmNvbnN0IENMSVBCT0FSRF9IRUFERVIgPQogIENPTlRBSU5FUi5xdWVyeVNlbGVjdG9yKCIucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciIpID8/CiAgQ09OVEFJTkVSLmluc2VydEFkamFjZW50RWxlbWVudCgKICAgICJhZnRlcmJlZ2luIiwKICAgIGh0bWxgPGRpdiBjbGFzcz0icGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBoaWRkZW4iPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gZm9ybWF0IgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZvcm1hdDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBmb3JtYXQiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gd2lkdGgiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+V2lkdGg6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgd2lkdGgiPjwvc3Bhbj5weDwvc3BhbgogICAgICA+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBoZWlnaHQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+SGVpZ2h0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGhlaWdodCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHNjYWxlIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPlNjYWxlOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIHNjYWxlIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2V0Ij5TZXQ8L2J1dHRvbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gdW5zZXQiPlVuc2V0PC9idXR0b24+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmaWxlbmFtZSIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5GaWxlbmFtZTo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBmaWxlbmFtZSI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICA8L2Rpdj5gCiAgKTsKCmZ1bmN0aW9uIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpIHsKICBjb25zdCB2YWxpZF9jbGFzc2VzID0gWwogICAgIm1pc3NpbmctY29uZmlnIiwKICAgICJtYXRjaGluZy1jb25maWciLAogICAgImRpZmZlcmVudC1jb25maWciLAogIF07CiAgZnVuY3Rpb24gc2V0Q2xhc3MoY2wpIHsKICAgIGZvciAoY29uc3QgbmFtZSBvZiB2YWxpZF9jbGFzc2VzKSB7CiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKG5hbWUsIG5hbWUgPT0gY2wpOwogICAgfQogIH0KICAvLyBXZSB1c2UgdGhlIGN1c3RvbSBnZXR0ZXJzIHdlJ2xsIHNldCB1cCBpbiB0aGUgY29udGFpbmVyCiAgY29uc3QgeyB1aV92YWx1ZSwgY29uZmlnX3ZhbHVlLCBjb25maWdfc3Bhbiwga2V5IH0gPSBjb250YWluZXI7CiAgaWYgKGNvbmZpZ192YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICBzZXRDbGFzcygibWlzc2luZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaXMgbm90IHByZXNlbnQgaW4gdGhlIGNvbmZpZy5gOwogIH0gZWxzZSBpZiAodWlfdmFsdWUgPT0gY29uZmlnX3ZhbHVlKSB7CiAgICBzZXRDbGFzcygibWF0Y2hpbmctY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGhhcyB0aGUgc2FtZSB2YWx1ZSBpbiB0aGUgY29uZmlnIGFuZCBpbiB0aGUgaGVhZGVyLmA7CiAgfSBlbHNlIHsKICAgIHNldENsYXNzKCJkaWZmZXJlbnQtY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGhhcyBhIGRpZmZlcmVudCB2YWx1ZSAoPGVtPiR7Y29uZmlnX3ZhbHVlfTwvZW0+KSBpbiB0aGUgY29uZmlnLmA7CiAgfQogIC8vIEFkZCBpbmZvIGFib3V0IHNldHRpbmcgYW5kIHVuc2V0dGluZwogIGNvbmZpZ19zcGFuLmluc2VydEFkamFjZW50SFRNTCgKICAgICJiZWZvcmVlbmQiLAogICAgYDxicj5DbGljayBvbiB0aGUgbGFiZWwgPGVtPjxiPm9uY2U8L2I+PC9lbT4gdG8gc2V0IHRoZSBjdXJyZW50IFVJIHZhbHVlIGluIHRoZSBjb25maWcuYAogICk7CiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIDxlbT48Yj50d2ljZTwvYj48L2VtPiB0byByZW1vdmUgdGhpcyBrZXkgZnJvbSB0aGUgY29uZmlnLmAKICApOwp9Cgpjb25zdCB2YWxpZF9mb3JtYXRzID0gWyJwbmciLCAic3ZnIiwgIndlYnAiLCAianBlZyIsICJmdWxsLWpzb24iXTsKZnVuY3Rpb24gaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHNwYW4sIGtleSwgdmFsdWUpIHsKICBjb25zdCBjb250YWluZXIgPSBzcGFuLmNsb3Nlc3QoIi5jbGlwYm9hcmQtc3BhbiIpOwogIHNwYW4uY29udGVudEVkaXRhYmxlID0ga2V5ID09PSAiZm9ybWF0IiA/ICJmYWxzZSIgOiAidHJ1ZSI7CiAgbGV0IHBhcnNlID0gKHgpID0+IHg7CiAgbGV0IHVwZGF0ZSA9ICh4KSA9PiAoc3Bhbi50ZXh0Q29udGVudCA9IHgpOwogIGlmIChrZXkgPT09ICJ3aWR0aCIgfHwga2V5ID09PSAiaGVpZ2h0IikgewogICAgcGFyc2UgPSAoeCkgPT4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KHgpKTsKICB9IGVsc2UgaWYgKGtleSA9PT0gInNjYWxlIikgewogICAgcGFyc2UgPSBwYXJzZUZsb2F0OwogIH0gZWxzZSBpZiAoa2V5ID09PSAiZm9ybWF0IikgewogICAgLy8gV2UgcmVtb3ZlIGNvbnRlbnRFZGl0YWJsZQogICAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSAiZmFsc2UiOwogICAgLy8gSGVyZSB3ZSBmaXJzdCBhZGQgdGhlIHN1YnNwYW5zIGZvciBlYWNoIG9wdGlvbgogICAgY29uc3Qgb3B0c19kaXYgPSBzcGFuLmFwcGVuZENoaWxkKGh0bWxgPGRpdiBjbGFzcz0iZm9ybWF0LW9wdGlvbnMiPjwvZGl2PmApOwogICAgZm9yIChjb25zdCBmbXQgb2YgdmFsaWRfZm9ybWF0cykgewogICAgICBjb25zdCBvcHQgPSBvcHRzX2Rpdi5hcHBlbmRDaGlsZCgKICAgICAgICBodG1sYDxzcGFuIGNsYXNzPSJmb3JtYXQtb3B0aW9uICR7Zm10fSI+JHtmbXR9PC9zcGFuPmAKICAgICAgKTsKICAgICAgb3B0Lm9uY2xpY2sgPSAoZSkgPT4gewogICAgICAgIHNwYW4udmFsdWUgPSBvcHQudGV4dENvbnRlbnQ7CiAgICAgIH07CiAgICB9CiAgICBwYXJzZSA9ICh4KSA9PiB7CiAgICAgIHJldHVybiB2YWxpZF9mb3JtYXRzLmluY2x1ZGVzKHgpID8geCA6IGxvY2FsVmFsdWU7CiAgICB9OwogICAgdXBkYXRlID0gKHgpID0+IHsKICAgICAgZm9yIChjb25zdCBvcHQgb2Ygb3B0c19kaXYuY2hpbGRyZW4pIHsKICAgICAgICBvcHQuY2xhc3NMaXN0LnRvZ2dsZSgic2VsZWN0ZWQiLCBvcHQudGV4dENvbnRlbnQgPT09IHgpOwogICAgICB9CiAgICB9OwogIH0gZWxzZSB7CiAgICAvLyBXZSBvbmx5IGhhdmUgZmlsZW5hbWUgaGVyZQogIH0KICBsZXQgbG9jYWxWYWx1ZTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBsb2NhbFZhbHVlOwogICAgfSwKICAgIHNldDogKHZhbCkgPT4gewogICAgICBpZiAodmFsICE9PSAiIikgewogICAgICAgIGxvY2FsVmFsdWUgPSBwYXJzZSh2YWwpOwogICAgICB9CiAgICAgIHVwZGF0ZShsb2NhbFZhbHVlKTsKICAgICAgY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcik7CiAgICB9LAogIH0pOwogIC8vIFdlIGFsc28gYXNzaWduIGEgbGlzdGVuZXIgc28gdGhhdCB0aGUgZWRpdGFibGUgaXMgYmx1cnJlZCB3aGVuIGVudGVyIGlzIHByZXNzZWQKICBzcGFuLm9ua2V5ZG93biA9IChlKSA9PiB7CiAgICBpZiAoZS5rZXlDb2RlID09PSAxMykgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHNwYW4uYmx1cigpOwogICAgfQogIH07CiAgc3Bhbi52YWx1ZSA9IHZhbHVlOwp9CgpmdW5jdGlvbiBpbml0aWFsaXplQ29uZmlnVmFsdWVTcGFuKHNwYW4sIGtleSkgewogIC8vIEhlcmUgd2UgbW9zdGx5IHdhbnQgdG8gZGVmaW5lIHRoZSBzZXR0ZXIgYW5kIGdldHRlcgogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwYW4sICJ2YWx1ZSIsIHsKICAgIGdldDogKCkgPT4gewogICAgICByZXR1cm4gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV07CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIC8vIGlmIHVuZGVmaW5lZCBpcyBwYXNzZWQsIHdlIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgb3B0aW9ucwogICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsKICAgICAgICBkZWxldGUgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV0gPSB2YWw7CiAgICAgIH0KICAgICAgY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcik7CiAgICB9LAogIH0pOwp9Cgpjb25zdCBjb25maWdfc3BhbnMgPSB7fTsKZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZ2V0SW1hZ2VPcHRpb25zKCkpKSB7CiAgY29uc3QgY29udGFpbmVyID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKGAuY2xpcGJvYXJkLXNwYW4uJHtrZXl9YCk7CiAgY29uc3QgbGFiZWwgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmxhYmVsIik7CiAgLy8gV2UgZ2l2ZSB0aGUgbGFiZWwgYSBmdW5jdGlvbiB0aGF0IG9uIHNpbmdsZSBjbGljayB3aWxsIHNldCB0aGUgY3VycmVudCB2YWx1ZSBhbmQgd2l0aCBkb3VibGUgY2xpY2sgd2lsbCB1bnNldCBpdAogIGxhYmVsLm9uY2xpY2sgPSBEdWFsQ2xpY2soCiAgICAoKSA9PiB7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBjb250YWluZXIudWlfdmFsdWU7CiAgICB9LAogICAgKGUpID0+IHsKICAgICAgY29uc29sZS5sb2coImUiLCBlKTsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gdW5kZWZpbmVkOwogICAgfQogICk7CiAgY29uc3QgdWlfdmFsdWVfc3BhbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXZhbHVlIik7CiAgY29uc3QgY29uZmlnX3ZhbHVlX3NwYW4gPQogICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jb25maWctdmFsdWUiKSA/PwogICAgbGFiZWwuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgICAiYWZ0ZXJiZWdpbiIsCiAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImNvbmZpZy12YWx1ZSI+PC9zcGFuPmAKICAgICk7CiAgLy8gQXNzaW5nIHRoZSB0d28gc3BhbnMgYXMgcHJvcGVydGllcyBvZiB0aGUgY29udGFpbmluZyBzcGFuCiAgY29udGFpbmVyLnVpX3NwYW4gPSB1aV92YWx1ZV9zcGFuOwogIGNvbnRhaW5lci5jb25maWdfc3BhbiA9IGNvbmZpZ192YWx1ZV9zcGFuOwogIGNvbnRhaW5lci5rZXkgPSBrZXk7CiAgY29uZmlnX3NwYW5zW2tleV0gPSBjb250YWluZXI7CiAgaWYgKGZpcnN0UnVuKSB7CiAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPQogICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPz8ge307CiAgICAvLyBXZSBkbyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHZhbHVlIHNwYW4KICAgIGluaXRpYWxpemVVSVZhbHVlU3Bhbih1aV92YWx1ZV9zcGFuLCBrZXksIHZhbHVlKTsKICAgIC8vIFRoZW4gd2UgaW5pdGlhbGl6ZSB0aGUgY29uZmlnIHZhbHVlCiAgICBpbml0aWFsaXplQ29uZmlnVmFsdWVTcGFuKGNvbmZpZ192YWx1ZV9zcGFuLCBrZXkpOwogICAgLy8gV2UgcHV0IHNvbWUgY29udmVuaWVuY2UgZ2V0dGVycy9zZXR0ZXJzCiAgICAvLyB1aV92YWx1ZSBmb3J3YXJkCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAidWlfdmFsdWUiLCB7CiAgICAgIGdldDogKCkgPT4gdWlfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgdWlfdmFsdWVfc3Bhbi52YWx1ZSA9IHZhbDsKICAgICAgfSwKICAgIH0pOwogICAgLy8gY29uZmlnX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJjb25maWdfdmFsdWUiLCB7CiAgICAgIGdldDogKCkgPT4gY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUsCiAgICAgIHNldDogKHZhbCkgPT4gewogICAgICAgIGNvbmZpZ192YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgfQp9CgovLyBUaGVzZSBvYmplY3RzIHdpbGwgY29udGFpbiB0aGUgZGVmYXVsdCB2YWx1ZQoKLy8gVGhpcyBjb2RlIHVwZGF0ZXMgdGhlIGltYWdlIG9wdGlvbnMgaW4gdGhlIFBMT1QgY29uZmlnIHdpdGggdGhlIHByb3ZpZGVkIG9uZXMKZnVuY3Rpb24gc2V0SW1hZ2VPcHRpb25zKG8pIHsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IG9ba2V5XTsKICB9Cn0KZnVuY3Rpb24gdW5zZXRJbWFnZU9wdGlvbnMoKSB7CiAgc2V0SW1hZ2VPcHRpb25zKHt9KTsKfQoKY29uc3Qgc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnNldCIpOwpjb25zdCB1bnNldF9idXR0b24gPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtc3Bhbi51bnNldCIpOwppZiAoZmlyc3RSdW4pIHsKICBzZXRfYnV0dG9uLm9uY2xpY2sgPSAoZSkgPT4gewogICAgZm9yIChjb25zdCBjb250YWluZXIgb2YgT2JqZWN0LnZhbHVlcyhjb25maWdfc3BhbnMpKSB7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBjb250YWluZXIudWlfdmFsdWU7CiAgICB9CiAgfTsKICB1bnNldF9idXR0b24ub25jbGljayA9IHVuc2V0SW1hZ2VPcHRpb25zOwp9CgovLyBXZSBhZGQgYSBmdW5jdGlvbiB0byBjaGVjayBpZiB0aGUgY2xpcGJvYXJkIGlzIHBvcHBlZCBvdXQKQ09OVEFJTkVSLmlzUG9wcGVkT3V0ID0gKCkgPT4gewogIHJldHVybiBDT05UQUlORVIuY2xhc3NMaXN0LmNvbnRhaW5zKCJwb3BwZWQtb3V0Iik7Cn07CgpDTElQQk9BUkRfSEVBREVSLm9ubW91c2Vkb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgaWYgKGV2ZW50LnRhcmdldC5tYXRjaGVzKCJzcGFuLmNsaXBib2FyZC12YWx1ZSIpKSB7CiAgICBjb25zb2xlLmxvZygiV2UgZG9uJ3QgbW92ZSEiKTsKICAgIHJldHVybjsKICB9CiAgY29uc3Qgc3RhcnQgPSB7CiAgICBsZWZ0OiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS5sZWZ0KSwKICAgIHRvcDogcGFyc2VGbG9hdChDT05UQUlORVIuc3R5bGUudG9wKSwKICAgIFg6IGV2ZW50LnBhZ2VYLAogICAgWTogZXZlbnQucGFnZVksCiAgfTsKICBmdW5jdGlvbiBtb3ZlQXQoZXZlbnQsIHN0YXJ0KSB7CiAgICBjb25zdCB0b3AgPSBldmVudC5wYWdlWSAtIHN0YXJ0LlkgKyBzdGFydC50b3AgKyAicHgiOwogICAgY29uc3QgbGVmdCA9IGV2ZW50LnBhZ2VYIC0gc3RhcnQuWCArIHN0YXJ0LmxlZnQgKyAicHgiOwogICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gbGVmdDsKICAgIENPTlRBSU5FUi5zdHlsZS5sZWZ0ID0gbGVmdDsKICAgIENPTlRBSU5FUi5zdHlsZS50b3AgPSB0b3A7CiAgfQoKICAvLyBtb3ZlIG91ciBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYmFsbCB1bmRlciB0aGUgcG9pbnRlcgogIG1vdmVBdChldmVudCwgc3RhcnQpOwogIGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGV2ZW50KSB7CiAgICBtb3ZlQXQoZXZlbnQsIHN0YXJ0KTsKICB9CgogIC8vIFdlIHVzZSB0aGlzIHRvIHJlbW92ZSB0aGUgbW91c2Vtb3ZlIHdoZW4gY2xpY2tpbmcgb3V0c2lkZSBvZiB0aGUgY29udGFpbmVyCiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgLy8gbW92ZSB0aGUgY29udGFpbmVyIG9uIG1vdXNlbW92ZQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIG9uTW91c2VNb3ZlLCB7CiAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLAogIH0pOwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAibW91c2Vkb3duIiwKICAgIChlKSA9PiB7CiAgICAgIGlmIChlLnRhcmdldC5jbG9zZXN0KCIucGx1dG9wbG90bHktY29udGFpbmVyIikgIT09IENPTlRBSU5FUikgewogICAgICAgIGNsZWFuVXAoKTsKICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9LAogICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0KICApOwoKICBmdW5jdGlvbiBjbGVhblVwKCkgewogICAgY29uc29sZS5sb2coImNsZWFuaW5nIHVwIHRoZSBwbG90IG1vdmUgbGlzdGVuZXIiKTsKICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gbnVsbDsKICB9CgogIC8vICgzKSBkcm9wIHRoZSBiYWxsLCByZW1vdmUgdW5uZWVkZWQgaGFuZGxlcnMKICBDTElQQk9BUkRfSEVBREVSLm9ubW91c2V1cCA9IGNsZWFuVXA7Cn07CgpmdW5jdGlvbiBzZW5kVG9DbGlwYm9hcmQoYmxvYikgewogIGlmICghbmF2aWdhdG9yLmNsaXBib2FyZCkgewogICAgYWxlcnQoCiAgICAgICJUaGUgQ2xpcGJvYXJkIEFQSSBkb2VzIG5vdCBzZWVtIHRvIGJlIGF2YWlsYWJsZSwgbWFrZSBzdXJlIHRoZSBQbHV0byBub3RlYm9vayBpcyBiZWluZyB1c2VkIGZyb20gZWl0aGVyIGxvY2FsaG9zdCBvciBhbiBodHRwcyBzb3VyY2UuIgogICAgKTsKICB9CiAgbmF2aWdhdG9yLmNsaXBib2FyZAogICAgLndyaXRlKFsKICAgICAgbmV3IENsaXBib2FyZEl0ZW0oewogICAgICAgIC8vIFRoZSBrZXkgaXMgZGV0ZXJtaW5lZCBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgYmxvYidzIHR5cGUuCiAgICAgICAgW2Jsb2IudHlwZV06IGJsb2IsCiAgICAgIH0pLAogICAgXSkKICAgIC50aGVuKAogICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgY29uc29sZS5sb2coIkFzeW5jOiBDb3B5aW5nIHRvIGNsaXBib2FyZCB3YXMgc3VjY2Vzc2Z1bCEiKTsKICAgICAgfSwKICAgICAgZnVuY3Rpb24gKGVycikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkFzeW5jOiBDb3VsZCBub3QgY29weSB0ZXh0OiAiLCBlcnIpOwogICAgICB9CiAgICApOwp9CgpmdW5jdGlvbiBjb3B5SW1hZ2VUb0NsaXBib2FyZCgpIHsKICAvLyBXZSBleHRyYWN0IHRoZSBpbWFnZSBvcHRpb25zIGZyb20gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMgKGlmIHRoZXkgZXhpc3QpCiAgY29uc3QgY29uZmlnID0ge307CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGxldCB2YWwgPQogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID8/CiAgICAgIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IGNvbnRhaW5lci51aV92YWx1ZSA6IHVuZGVmaW5lZCk7CiAgICAvLyBJZiB3ZSBoYXZlIHVuZGVmaW5lZCB3ZSBkb24ndCBjcmVhdGUgdGhlIGtleS4gV2UgYWxzbyBpZ25vcmUgZm9ybWF0IGJlY2F1c2UgdGhlIGNsaXBib2FyZCBvbmx5IHN1cHBvcnRzIHBuZy4KICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS50b0ltYWdlKFBMT1QsIGNvbmZpZykudGhlbihmdW5jdGlvbiAoZGF0YVVybCkgewogICAgZmV0Y2goZGF0YVVybCkKICAgICAgLnRoZW4oKHJlcykgPT4gcmVzLmJsb2IoKSkKICAgICAgLnRoZW4oKGJsb2IpID0+IHsKICAgICAgICBjb25zdCBwYXN0ZV9yZWNlaXZlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3Bhc3RlLXJlY2VpdmVyLnBsdXRvcGxvdGx5JykKICAgICAgICBpZiAocGFzdGVfcmVjZWl2ZXIpIHsKICAgICAgICAgIHBhc3RlX3JlY2VpdmVyLmF0dGFjaEltYWdlKGRhdGFVcmwsIENPTlRBSU5FUikKICAgICAgICB9CiAgICAgICAgc2VuZFRvQ2xpcGJvYXJkKGJsb2IpCiAgICAgIH0pOwogIH0pOwp9CgpmdW5jdGlvbiBzYXZlSW1hZ2VUb0ZpbGUoKSB7CiAgY29uc3QgY29uZmlnID0ge307CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGxldCB2YWwgPQogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID8/CiAgICAgIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IGNvbnRhaW5lci51aV92YWx1ZSA6IHVuZGVmaW5lZCk7CiAgICAvLyBJZiB3ZSBoYXZlIHVuZGVmaW5lZCB3ZSBkb24ndCBjcmVhdGUgdGhlIGtleS4KICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbmZpZ1trZXldID0gdmFsOwogIH0KICBQbG90bHkuZG93bmxvYWRJbWFnZShQTE9ULCBjb25maWcpOwp9CgpsZXQgY29udGFpbmVyX3JlY3QgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAsIHRvcDogMCwgbGVmdDogMCB9OwpmdW5jdGlvbiB1bnBvcF9jb250YWluZXIoY2wpIHsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZSgicG9wcGVkLW91dCIsIGZhbHNlKTsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgZmFsc2UpOwogIC8vIFdlIGZpeCB0aGUgaGVpZ2h0IGJhY2sgdG8gdGhlIHZhbHVlIGl0IGhhZCBiZWZvcmUgcG9wb3V0LCBhbHNvIHNldHRpbmcgdGhlIGZsYWcgdG8gc2lnbmFsIHRoYXQgdXBvbiBmaXJzdCByZXNpemUgd2UgcmVtb3ZlIHRoZSBmaXhlZCBpbmxpbmUtc3R5bGUKICBDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0ICsgInB4IjsKICByZW1vdmVfY29udGFpbmVyX3NpemUgPSB0cnVlOwogIC8vIFdlIHNldCB0aGUgb3RoZXIgZml4ZWQgaW5saW5lLXN0eWxlcyB0byBudWxsCiAgQ09OVEFJTkVSLnN0eWxlLndpZHRoID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9ICIiOwogIENPTlRBSU5FUi5zdHlsZS5sZWZ0ID0gIiI7CiAgLy8gV2UgYWxzbyByZW1vdmUgdGhlIENMSVBCT0FSRF9IRUFERVIKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLndpZHRoID0gIiI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gIiI7CiAgLy8gRmluYWxseSB3ZSByZW1vdmUgdGhlIGhpZGRlbiBjbGFzcyB0byB0aGUgaGVhZGVyCiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCB0cnVlKTsKICByZXR1cm47Cn0KZnVuY3Rpb24gcG9wb3V0X2NvbnRhaW5lcihvcHRzKSB7CiAgY29uc3QgY2wgPSBvcHRzPy5jbDsKICBjb25zdCB0YXJnZXRfY29udGFpbmVyX3NpemUgPSBvcHRzPy50YXJnZXRfY29udGFpbmVyX3NpemUgPz8ge307CiAgY29uc3QgdGFyZ2V0X3Bsb3Rfc2l6ZSA9IG9wdHM/LnRhcmdldF9wbG90X3NpemUgPz8ge307CiAgaWYgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICByZXR1cm4gdW5wb3BfY29udGFpbmVyKGNsKTsKICB9CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoY2wsIGNsID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IHRydWUpOwogIC8vIFdlIGV4dHJhY3QgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgY29udGFpbmVyLCBzYXZlIHRoZW0gYW5kIGZpeCB0aGVtCiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfSA9IENPTlRBSU5FUi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICBjb250YWluZXJfcmVjdCA9IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH07CiAgLy8gV2Ugc2F2ZSB0aGUgY3VycmVudCBwbG90IHNpemUgYmVmb3JlIHdlIHBvcCBhcyBpdCB3aWxsIGZpbGwgdGhlIHNjcmVlbgogIGNvbnN0IGN1cnJlbnRfcGxvdF9zaXplID0gewogICAgd2lkdGg6IFBMT1QuX2Z1bGxMYXlvdXQud2lkdGgsCiAgICBoZWlnaHQ6IFBMT1QuX2Z1bGxMYXlvdXQuaGVpZ2h0LAogIH07CiAgLy8gV2UgaGF2ZSB0byBzYXZlIHRoZSBwYWQgZGF0YSBiZWZvcmUgcG9wcGluZyBzbyB3ZSBjYW4gcmVzaXplIHByZWNpc2VseQogIGNvbnN0IHBhZCA9IHt9OwogIHBhZC51bnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZSgicG9wcGVkLW91dCIsIHRydWUpOwogIHBhZC5wb3BwZWQgPSBnZXRTaXplRGF0YSgpLmNvbnRhaW5lcl9wYWQ7CiAgLy8gV2UgZG8gdG9wIGFuZCBsZWZ0IGJhc2VkIG9uIHRoZSBjdXJyZW50IHJlY3QKICBmb3IgKGNvbnN0IGtleSBvZiBbInRvcCIsICJsZWZ0Il0pIHsKICAgIGNvbnN0IHN0YXJ0X3ZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNvbnRhaW5lcl9yZWN0W2tleV07CiAgICBsZXQgb2Zmc2V0ID0gMDsKICAgIGZvciAoY29uc3Qga2luZCBvZiBbInBhZGRpbmciLCAiYm9yZGVyIl0pIHsKICAgICAgb2Zmc2V0ICs9IHBhZC5wb3BwZWRba2luZF1ba2V5XSAtIHBhZC51bnBvcHBlZFtraW5kXVtrZXldOwogICAgfQogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSBzdGFydF92YWwgLSBvZmZzZXQgKyAicHgiOwogICAgaWYgKGtleSA9PT0gImxlZnQiKSB7CiAgICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGVba2V5XSA9IENPTlRBSU5FUi5zdHlsZVtrZXldOwogICAgfQogIH0KICAvLyBXZSBjb21wdXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGRlcGVuZGluZyBvbiBldmVudHVhbCBjb25maWcgZGF0YQogIGNvbnN0IGNzeiA9IGNvbXB1dGVDb250YWluZXJTaXplKHsKICAgIHdpZHRoOgogICAgICB0YXJnZXRfcGxvdF9zaXplLndpZHRoID8/CiAgICAgIGNvbmZpZ19zcGFucy53aWR0aC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6CiAgICAgIHRhcmdldF9wbG90X3NpemUuaGVpZ2h0ID8/CiAgICAgIGNvbmZpZ19zcGFucy5oZWlnaHQuY29uZmlnX3ZhbHVlID8/CiAgICAgIGN1cnJlbnRfcGxvdF9zaXplLmhlaWdodCwKICB9KTsKICBmb3IgKGNvbnN0IGtleSBvZiBbIndpZHRoIiwgImhlaWdodCJdKSB7CiAgICBjb25zdCB2YWwgPSB0YXJnZXRfY29udGFpbmVyX3NpemVba2V5XSA/PyBjc3pba2V5XTsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gdmFsICsgInB4IjsKICAgIGlmIChrZXkgPT09ICJ3aWR0aCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIENMSVBCT0FSRF9IRUFERVIuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgZmFsc2UpOwogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CgogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAibW91c2Vkb3duIiwKICAgIChlKSA9PiB7CiAgICAgIGlmIChlLnRhcmdldC5jbG9zZXN0KCIucGx1dG9wbG90bHktY29udGFpbmVyIikgIT09IENPTlRBSU5FUikgewogICAgICAgIHVucG9wX2NvbnRhaW5lcigpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7Cn0KCkNPTlRBSU5FUi5wb3BPdXQgPSBwb3BvdXRfY29udGFpbmVyOwoKZnVuY3Rpb24gRHVhbENsaWNrKHNpbmdsZV9mdW5jLCBkYmxfZnVuYykgewogIGxldCBuY2xpY2tzID0gMDsKICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHsKICAgIG5jbGlja3MgKz0gMTsKICAgIGlmIChuY2xpY2tzID4gMSkgewogICAgICBkYmxfZnVuYyguLi5hcmdzKTsKICAgICAgbmNsaWNrcyA9IDA7CiAgICB9IGVsc2UgewogICAgICBkZWxheSgzMDApLnRoZW4oKCkgPT4gewogICAgICAgIGlmIChuY2xpY2tzID09IDEpIHsKICAgICAgICAgIHNpbmdsZV9mdW5jKC4uLmFyZ3MpOwogICAgICAgIH0KICAgICAgICBuY2xpY2tzID0gMDsKICAgICAgfSk7CiAgICB9CiAgfTsKfQoKLy8gV2UgcmVtb3ZlIHRoZSBkZWZhdWx0IGRvd25sb2FkIGltYWdlIGJ1dHRvbgpwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSA9IF8udW5pb24oCiAgcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9SZW1vdmUsCiAgWyJ0b0ltYWdlIl0KKTsKLy8gV2UgYWRkIHRoZSBjdXN0b20gYnV0dG9uIHRvIHRoZSBtb2RlYmFyCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb0FkZCwKICBbCiAgICB7CiAgICAgIG5hbWU6ICJDb3B5IFBORyB0byBDbGlwYm9hcmQiLAogICAgICBpY29uOiB7CiAgICAgICAgaGVpZ2h0OiA1MjAsCiAgICAgICAgd2lkdGg6IDUyMCwKICAgICAgICBwYXRoOiAiTTI4MCA2NGg0MGMzNS4zIDAgNjQgMjguNyA2NCA2NFY0NDhjMCAzNS4zLTI4LjcgNjQtNjQgNjRINjRjLTM1LjMgMC02NC0yOC43LTY0LTY0VjEyOEMwIDkyLjcgMjguNyA2NCA2NCA2NGg0MCA5LjZDMTIxIDI3LjUgMTUzLjMgMCAxOTIgMHM3MSAyNy41IDc4LjQgNjRIMjgwek02NCAxMTJjLTguOCAwLTE2IDcuMi0xNiAxNlY0NDhjMCA4LjggNy4yIDE2IDE2IDE2SDMyMGM4LjggMCAxNi03LjIgMTYtMTZWMTI4YzAtOC44LTcuMi0xNi0xNi0xNkgzMDR2MjRjMCAxMy4zLTEwLjcgMjQtMjQgMjRIMTkyIDEwNGMtMTMuMyAwLTI0LTEwLjctMjQtMjRWMTEySDY0em0xMjgtOGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6IiwKICAgICAgfSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKGNvcHlJbWFnZVRvQ2xpcGJvYXJkLCAoKSA9PiB7CiAgICAgICAgcG9wb3V0X2NvbnRhaW5lcigpOwogICAgICB9KSwKICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICJEb3dubG9hZCBJbWFnZSIsCiAgICAgIGljb246IFBsb3RseS5JY29ucy5jYW1lcmEsCiAgICAgIGRpcmVjdGlvbjogInVwIiwKICAgICAgY2xpY2s6IER1YWxDbGljayhzYXZlSW1hZ2VUb0ZpbGUsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKHsgY2w6ICJmaWxlc2F2ZSIgfSk7CiAgICAgIH0pLAogICAgfSwKICBdCik7CgpmdW5jdGlvbiBnZXRPZmZzZXREYXRhKGVsKSB7CiAgbGV0IGNzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwsIG51bGwpOwogIGNvbnN0IG9kYXRhID0gewogICAgcGFkZGluZzogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdMZWZ0KSwKICAgICAgcmlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1JpZ2h0KSwKICAgICAgdG9wOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdUb3ApLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MucGFkZGluZ0JvdHRvbSksCiAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdMZWZ0KSArIHBhcnNlRmxvYXQoY3MucGFkZGluZ1JpZ2h0KSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdUb3ApICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgIH0sCiAgICBib3JkZXI6IHsKICAgICAgbGVmdDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgdG9wOiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSwKICAgICAgYm90dG9tOiBwYXJzZUZsb2F0KGNzLmJvcmRlckJvdHRvbVdpZHRoKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MuYm9yZGVyTGVmdFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyUmlnaHRXaWR0aCksCiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChjcy5ib3JkZXJUb3BXaWR0aCkgKyBwYXJzZUZsb2F0KGNzLmJvcmRlckJvdHRvbVdpZHRoKSwKICAgIH0KICB9OwogIGlmIChlbCA9PT0gUExPVCkgewogICAgLy8gRm9yIHRoZSBQTE9UIHdlIGFsc28gd2FudCB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgb2Zmc2V0CiAgICBvZGF0YS5vZmZzZXQgPSB7CiAgICAgIHRvcDogUExPVC5vZmZzZXRQYXJlbnQgPT0gQ09OVEFJTkVSID8gUExPVC5vZmZzZXRUb3AgOiAwLAogICAgICBsZWZ0OiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldExlZnQgOiAwLAogICAgfQogIH0KICByZXR1cm4gb2RhdGE7Cn0KZnVuY3Rpb24gZ2V0U2l6ZURhdGEoKSB7CiAgY29uc3QgZGF0YSA9IHsKICAgIHBsb3RfcGFkOiBnZXRPZmZzZXREYXRhKFBMT1QpLAogICAgcGxvdF9yZWN0OiBQTE9ULmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogICAgY29udGFpbmVyX3BhZDogZ2V0T2Zmc2V0RGF0YShDT05UQUlORVIpLAogICAgY29udGFpbmVyX3JlY3Q6IENPTlRBSU5FUi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICB9OwogIHJldHVybiBkYXRhOwp9CmZ1bmN0aW9uIGNvbXB1dGVDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICBjb25zdCBjb21wdXRlZF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICBjb25zdCBvZmZzZXRzID0gY29tcHV0ZWRfc2l6ZS5vZmZzZXRzOwoKICBjb25zdCBwbG90X2RhdGEgPSB7CiAgICB3aWR0aDogd2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCwKICAgIGhlaWdodDogaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH07CgogIHJldHVybiB7CiAgICB3aWR0aDogKHdpZHRoID8/IGNvbXB1dGVkX3NpemUud2lkdGgpICsgb2Zmc2V0cy53aWR0aCwKICAgIGhlaWdodDogKGhlaWdodCA/PyBjb21wdXRlZF9zaXplLmhlaWdodCkgKyBvZmZzZXRzLmhlaWdodCwKICAgIG5vQ2hhbmdlOiB3aWR0aCA9PSBjb21wdXRlZF9zaXplLndpZHRoICYmIGhlaWdodCA9PSBjb21wdXRlZF9zaXplLmhlaWdodCwKICB9Cn0KCi8vIFRoaXMgZnVuY3Rpb24gd2lsbCBjaGFuZ2UgdGhlIGNvbnRhaW5lciBzaXplIHNvIHRoYXQgdGhlIHJlc3VsdGluZyBwbG90IHdpbGwgYmUgbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIHNwZWNzCmZ1bmN0aW9uIGNoYW5nZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGlmICghQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIGNvbnNvbGUubG9nKCJUcmllZCB0byBjaGFuZ2UgY29udGFpbmVyIHNpemUgd2hlbiBub3QgcG9wcGVkLCBpZ25vcmluZyIpOwogICAgcmV0dXJuOwogIH0KCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhKTsKCiAgaWYgKGNzei5ub0NoYW5nZSkgewogICAgY29uc29sZS5sb2coIlNpemUgaXMgdGhlIHNhbWUgYXMgY3VycmVudCwgaWdub3JpbmciKTsKICAgIHJldHVybgogIH0KICAvLyBXZSBhcmUgbm93IGdvaW5nIHRvIHNldCBoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBjb250YWluZXIKICBmb3IgKGNvbnN0IGtleSBvZiBbIndpZHRoIiwgImhlaWdodCJdKSB7CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IGNzeltrZXldICsgInB4IjsKICB9Cn0KLy8gV2Ugbm93IGNyZWF0ZSB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIHVwZGF0ZSB0aGUgcGxvdCBiYXNlZCBvbiB0aGUgdmFsdWVzIHNwZWNpZmllZApmdW5jdGlvbiB1cGRhdGVGcm9tSGVhZGVyKCkgewogIGNvbnN0IGhlYWRlcl9kYXRhID0gewogICAgaGVpZ2h0OiBjb25maWdfc3BhbnMuaGVpZ2h0LnVpX3ZhbHVlLAogICAgd2lkdGg6IGNvbmZpZ19zcGFucy53aWR0aC51aV92YWx1ZSwKICB9OwogIGNoYW5nZUNvbnRhaW5lclNpemUoaGVhZGVyX2RhdGEpOwp9Ci8vIFdlIGFzc2lnbiB0aGlzIGZ1bmN0aW9uIHRvIHRoZSBvbmJsdXIgZXZlbnQgb2Ygd2lkdGggYW5kIGhlaWdodAppZiAoZmlyc3RSdW4pIHsKICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGNvbnRhaW5lci51aV9zcGFuLm9uYmx1ciA9IChlKSA9PiB7CiAgICAgIGNvbnRhaW5lci51aV92YWx1ZSA9IGNvbnRhaW5lci51aV9zcGFuLnRleHRDb250ZW50OwogICAgICB1cGRhdGVGcm9tSGVhZGVyKCk7CiAgICB9OwogIH0KfQovLyBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBwbG90IHNpemUgdG8gdXNlIGZvciByZWxheW91dCBhcyBhIGZ1bmN0aW9uIG9mIHRoZSBjb250YWluZXIgc2l6ZQpmdW5jdGlvbiBjb21wdXRlUGxvdFNpemUoZGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICAvLyBSZW1vdmUgUGFkZGluZwogIGNvbnN0IHsgY29udGFpbmVyX3BhZCwgcGxvdF9wYWQsIGNvbnRhaW5lcl9yZWN0IH0gPSBkYXRhOwogIGNvbnN0IG9mZnNldHMgPSB7CiAgICB3aWR0aDoKICAgICAgcGxvdF9wYWQucGFkZGluZy53aWR0aCArCiAgICAgIHBsb3RfcGFkLmJvcmRlci53aWR0aCArCiAgICAgIHBsb3RfcGFkLm9mZnNldC5sZWZ0ICsKICAgICAgY29udGFpbmVyX3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgY29udGFpbmVyX3BhZC5ib3JkZXIud2lkdGgsCiAgICBoZWlnaHQ6CiAgICAgIHBsb3RfcGFkLnBhZGRpbmcuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLmhlaWdodCArCiAgICAgIHBsb3RfcGFkLm9mZnNldC50b3AgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcuaGVpZ2h0ICsKICAgICAgY29udGFpbmVyX3BhZC5ib3JkZXIuaGVpZ2h0LAogIH07CiAgY29uc3Qgc3ogPSB7CiAgICB3aWR0aDogTWF0aC5yb3VuZChjb250YWluZXJfcmVjdC53aWR0aCAtIG9mZnNldHMud2lkdGgpLAogICAgaGVpZ2h0OiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LmhlaWdodCAtIG9mZnNldHMuaGVpZ2h0KSwKICAgIG9mZnNldHMsCiAgfTsKICByZXR1cm4gc3o7Cn0KCi8vIENyZWF0ZSB0aGUgcmVzaXplT2JzZXJ2ZXIgdG8gbWFrZSB0aGUgcGxvdCBldmVuIG1vcmUgcmVzcG9uc2l2ZSEgOm1hZ2ljOgpjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4gewogIGNvbnN0IHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKTsKICBjb25zdCB7Y29udGFpbmVyX3JlY3QsIGNvbnRhaW5lcl9wYWR9ID0gc2l6ZURhdGE7CiAgbGV0IHBsb3Rfc2l6ZSA9IGNvbXB1dGVQbG90U2l6ZShzaXplRGF0YSk7CiAgLy8gV2Ugc2F2ZSB0aGUgaGVpZ2h0IGluIHRoZSBQTE9UIG9iamVjdAogIFBMT1QuY29udGFpbmVyX2hlaWdodCA9IGNvbnRhaW5lcl9yZWN0LmhlaWdodDsKICAvLyBXZSBkZWFsIHdpdGggc29tZSBzdHVmZiBpZiB0aGUgY29udGFpbmVyIGlzIHBvcHBwZWQKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLndpZHRoID0gY29udGFpbmVyX3JlY3Qud2lkdGggKyAicHgiOwogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9IGNvbnRhaW5lcl9yZWN0LmxlZnQgKyAicHgiOwogIGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUgPSBwbG90X3NpemUuaGVpZ2h0OwogIGNvbmZpZ19zcGFucy53aWR0aC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS53aWR0aDsKICAvKiAKCQlUaGUgYWRkaXRpb24gb2YgdGhlIGludmFsaWQgYXJndW1lbnQgYHBsdXRvcmVzaXplYCBzZWVtcyB0byBmaXggdGhlIHByb2JsZW0gd2l0aCBjYWxsaW5nIGByZWxheW91dGAgc2ltcGx5IHdpdGggYHthdXRvc2l6ZTogdHJ1ZX1gIGFzIHVwZGF0ZSBicmVha2luZyBtb3VzZSByZWxheW91dCBldmVudHMgdHJhY2tpbmcuIAoJCVNlZSBodHRwczovL2dpdGh1Yi5jb20vcGxvdGx5L3Bsb3RseS5qcy9pc3N1ZXMvNjE1NiBmb3IgZGV0YWlscwoJCSovCiAgbGV0IGNvbmZpZyA9IHsKICAgIC8vIElmIHRoaXMgaXMgcG9wcGVkIG91dCwgd2UgaWdub3JlIHRoZSBvcmlnaW5hbCB3aWR0aC9oZWlnaHQKICAgIHdpZHRoOiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyB1bmRlZmluZWQgOiBvcmlnaW5hbF93aWR0aCkgPz8gcGxvdF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyB1bmRlZmluZWQgOiBvcmlnaW5hbF9oZWlnaHQpID8/IHBsb3Rfc2l6ZS5oZWlnaHQsCiAgICBwbHV0b3Jlc2l6ZTogdHJ1ZSwKICB9OwogIFBsb3RseS5yZWxheW91dChQTE9ULCBjb25maWcpLnRoZW4oKCkgPT4gewogICAgaWYgKHJlbW92ZV9jb250YWluZXJfc2l6ZSAmJiAhQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgdGhlIGZpcnN0IHJlc2l6ZSB1cG9uIHBsb3QgY3JlYXRpb24gdG8gYWxyZWFkeSBiZSB3aXRob3V0IGEgZml4ZWQgaGVpZ2h0CiAgICAgIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSAiIjsKICAgICAgQ09OVEFJTkVSLnN0eWxlLndpZHRoID0gIiI7CiAgICAgIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IGZhbHNlOwogICAgfQogIH0pOwp9KTsKCnJlc2l6ZU9ic2VydmVyLm9ic2VydmUoQ09OVEFJTkVSKTsKCgpQbG90bHkucmVhY3QoUExPVCwgcGxvdF9vYmopLnRoZW4oKCkgPT4gewoJLy8gQXNzaWduIHRoZSBQbG90bHkgZXZlbnQgbGlzdGVuZXJzCglmb3IgKGNvbnN0IFtrZXksIGxpc3RlbmVyX3ZlY10gb2YgT2JqZWN0LmVudHJpZXMocGxvdGx5X2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULm9uKGtleSwgbGlzdGVuZXIpCgkJfQoJfQoJLy8gQXNzaWduIHRoZSBKUyBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhqc19saXN0ZW5lcnMpKSB7CgkJZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcl92ZWMpIHsKCQkJUExPVC5hZGRFdmVudExpc3RlbmVyKGtleSwgbGlzdGVuZXIsIHsKCQkJCXNpZ25hbDogY29udHJvbGxlci5zaWduYWwKCQkJfSkKCQl9Cgl9Cn0KKQoKCmludmFsaWRhdGlvbi50aGVuKCgpID0+IHsKCS8vIFJlbW92ZSBhbGwgcGxvdGx5IGxpc3RlbmVycwoJUExPVC5yZW1vdmVBbGxMaXN0ZW5lcnMoKQoJLy8gUmVtb3ZlIGFsbCBKUyBsaXN0ZW5lcnMKCWNvbnRyb2xsZXIuYWJvcnQoKQoJLy8gUmVtb3ZlIHRoZSByZXNpemVPYnNlcnZlcgoJcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpCn0pCgoKCgkJcmV0dXJuIENPTlRBSU5FUgoJPC9zY3JpcHQ+CqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWWxcmVjb25fdDJfc3Rhcl9ncmWybGFzdF9ydW5fdGltZXN0YW1wy0HZv8hOmlpssHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQ0YTRhNmJkMy1iODIwLTQ3OWMtODllMy1mM2NlNzlhMzE2ZGK5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4ALHePtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5HZNTdiY2MwNWIwLTgxZGEtMTFlZi0yMDQwLTM1ODVjOWI0OTU0Zi83OTRhMTY1NDk3MWQwYzgxuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDI3ZTY1NjgwLTIyYTAtNDA3OS1iNmRmLWQ2MGEzMjE4ZTUyZYqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnZSFNlcXVlbmNlWyDPhCA9IDMxLjE3NCBtcyB8IGJsb2NrczogNCB8IEFEQzogMSB8IEdSOiAyIHwgUkY6IDIgfCBERUY6IDAgXaRtaW1lqnRleHQvcGxhaW6scm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/yE6pWDKwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJDI3ZTY1NjgwLTIyYTAtNDA3OS1iNmRmLWQ2MGEzMjE4ZTUyZblkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgCsX0+1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQwZjk2YTgzZC05NmVmLTQ3NjgtOTMzMC04N2M0NjZlMzVjOTOKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52WM8Ym9uZCBkZWY9IkF4IiB1bmlxdWVfaWQ9IkJmWGQmIzQzO2J1VmVuWnUiPjxpbnB1dCB0eXBlPSdyYW5nZScgbWluPScxJyBtYXg9JzIwJyB2YWx1ZT0nMTEnPjwvYm9uZD6kbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/yE0w+7WwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJDBmOTZhODNkLTk2ZWYtNDc2OC05MzMwLTg3YzQ2NmUzNWM5M7lkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzhOWkdm1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQ1ZGY5Nzg3NC1mMDljLTQxNzMtYTJmNi04OTNkYjMyMmNjYWaKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52Uc8ZGl2IGNsYXNzPSJtYXJrZG93biI+PGgxPlVuZGVyc3RhbmRpbmcgYmFzaWMgTVJJIHNlcXVlbmNlczwvaDE+CjwvZGl2PqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b/ILVH9P7BwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkNWRmOTc4NzQtZjA5Yy00MTczLWEyZjYtODkzZGIzMjJjY2FmuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAALNUrVwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJGU0ZWY1MTQ1LWE2M2MtNGY5MS1hYzA0LTNiNWJmMTZjMDg0MoqmcXVldWVkwqRsb2dzkoikbGluZf+jbXNnktkuUnVubmluZyBzaW11bGF0aW9uIGluIHRoZSBDUFUgd2l0aCAyIHRocmVhZChzKap0ZXh0L3BsYWlup2NlbGxfaWTZJGU0ZWY1MTQ1LWE2M2MtNGY5MS1hYzA0LTNiNWJmMTZjMDg0MqZrd2FyZ3OVkqxrb21hX3ZlcnNpb26SqHYiMC44LjMiqnRleHQvcGxhaW6SqnNpbV9tZXRob2SShaZwcmVmaXixS29tYU1SSUNvcmUuQmxvY2ioZWxlbWVudHOQpHR5cGWmc3RydWN0rHByZWZpeF9zaG9ydKVCbG9jaKhvYmplY3RpZLBmZmZmZmZmZjJhZjZkOGRh2SFhcHBsaWNhdGlvbi92bmQucGx1dG8udHJlZStvYmplY3SSpXNwaW5zkqM0MDCqdGV4dC9wbGFpbpKrdGltZV9wb2ludHOSozE0Oap0ZXh0L3BsYWlukqphZGNfcG9pbnRzkqMxMDCqdGV4dC9wbGFpbqJpZLRLb21hTVJJQ29yZV82YmZkODllYaRmaWxl2U4vaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL0tvbWFNUklDb3JlL3dQZ3M3L3NyYy9zaW11bGF0aW9uL1NpbXVsYXRvckNvcmUuamylZ3JvdXCtU2ltdWxhdG9yQ29yZaVsZXZlbKRJbmZviKRsaW5l/6Ntc2eS2U4gIDAuMDIwODcxIHNlY29uZHMgKDIwLjgyIGsgYWxsb2NhdGlvbnM6IDQuNjIzIE1pQiwgMTY2LjYyJSBjb21waWxhdGlvbiB0aW1lKQqqdGV4dC9wbGFpbqdjZWxsX2lk2SRlNGVmNTE0NS1hNjNjLTRmOTEtYWMwNC0zYjViZjE2YzA4NDKma3dhcmdzkKJpZLRQbHV0b1J1bm5lcl9kMWFjYjgxZaRmaWxl2VIvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1BsdXRvL1J2ZUdIL3NyYy9ydW5uZXIvUGx1dG9SdW5uZXIvc3JjL1BsdXRvUnVubmVyLmpspWdyb3Vwq1BsdXRvUnVubmVypWxldmVsrkxvZ0xldmVsKC01NTUpp3J1bm5pbmfCpm91dHB1dIakYm9kedk8UmF3QWNxdWlzaXRpb25EYXRhW1NlcU5hbWU6IE5vTmFtZSB8IDEgUHJvZmlsZShzKSBvZiAxMDDDlzFdpG1pbWWqdGV4dC9wbGFpbqxyb290YXNzaWduZWWvcmF3X3QyX3N0YXJfZ3Jlsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b/ITmQ08LBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkZTRlZjUxNDUtYTYzYy00ZjkxLWFjMDQtM2I1YmYxNmMwODQyuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOA39fsrVwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDdhNjZhYjQ3LTkxOGYtNDU4Mi04OTVmLTFiNDY5MDU2MjA1MYqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnaaokJPHNjcmlwdCBpZD0ncGxvdF8xJz4KCQkvLyBXZSBzdGFydCBieSBwdXR0aW5nIGFsbCB0aGUgdmFyaWFibGUgaW50ZXJwb2xhdGlvbiBoZXJlIGF0IHRoZSBiZWdpbm5pbmcKCQkvLyBXZSBoYXZlIHRvIGNvbnZlcnQgYWxsIHR5cGVkYXJyYXlzIGluIHRoZSBsYXlvdXQgdG8gbm9ybWFsIGFycmF5cy4gU2VlIElzc3VlICMyNQoJCS8vIFdlIHVzZSBsb2Rhc2ggZm9yIHRoaXMgZm9yIGNvbXBhY3RuZXNzCgkJZnVuY3Rpb24gcmVtb3ZlVHlwZWRBcnJheShvKSB7CgkJCXJldHVybiBfLmlzVHlwZWRBcnJheShvKSA/IEFycmF5LmZyb20obykgOgoJCQlfLmlzUGxhaW5PYmplY3QobykgPyBfLm1hcFZhbHVlcyhvLCByZW1vdmVUeXBlZEFycmF5KSA6IAoJCQlvCgkJfQoKCQkvLyBQdWJsaXNoIHRoZSBwbG90IG9iamVjdCB0byBKUwoJCWxldCBwbG90X29iaiA9IF8udXBkYXRlKC8qIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgQWJzdHJhY3RQbHV0b0RpbmdldGplcy5EaXNwbGF5LnB1Ymxpc2hlZF90b19qcyAqLyBnZXRQdWJsaXNoZWRPYmplY3QoIjdiY2MwNWIwLTgxZGEtMTFlZi0yMDQwLTM1ODVjOWI0OTU0Zi9hNzU0MjU2YmZhNDczNWFiIiksICJsYXlvdXQiLCByZW1vdmVUeXBlZEFycmF5KQoJCS8vIEdldCB0aGUgcGxvdGx5IGxpc3RlbmVycwoJCWNvbnN0IHBsb3RseV9saXN0ZW5lcnMgPSB7fQoJCS8vIEdldCB0aGUgSlMgbGlzdGVuZXJzCgkJY29uc3QganNfbGlzdGVuZXJzID0ge30KCQkvLyBEZWFsIHdpdGggZXZlbnR1YWwgY3VzdG9tIGNsYXNzZXMKCQlsZXQgY3VzdG9tX2NsYXNzbGlzdCA9IFtdCgoKCQkvLyBMb2FkIHRoZSBwbG90bHkgbGlicmFyeQoJCWxldCBQbG90bHkgPSB1bmRlZmluZWQKCQl0cnkgewoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiLi9wbG90bHlqcy9wbG90bHlqcy0yLjI2LjIubWluLmpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfSBjYXRjaCAoZSkgewoJCQljb25zb2xlLmxvZygiTG9jYWwgbG9hZCBmYWlsZWQsIHRyeWluZyB3aXRoIHRoZSB3ZWIgZXNtLnNoIHZlcnNpb24iKQoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiaHR0cHM6Ly9lc20uc2gvdjEzNS9wbG90bHkuanMtZGlzdC1taW5AMi4yNi4yL2VzbmV4dC9wbG90bHkuanMtZGlzdC1taW4ubWpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfQoKCQkvLyBDaGVjayBpZiB3ZSBoYXZlIHRvIGZvcmNlIGxvY2FsIG1hdGhqYXggZm9udCBjYWNoZQoJCWlmIChmYWxzZSAmJiB3aW5kb3c/Lk1hdGhKYXg/LmNvbmZpZz8uc3ZnPy5mb250Q2FjaGUgPT09ICdnbG9iYWwnKSB7CgkJCXdpbmRvdy5NYXRoSmF4LmNvbmZpZy5zdmcuZm9udENhY2hlID0gJ2xvY2FsJwoJCX0KCgkJLy8gRmxhZyB0byBjaGVjayBpZiB0aGlzIGNlbGwgd2FzICBtYW51YWxseSByYW4gb3IgcmVhY3RpdmVseSByYW4KY29uc3QgZmlyc3RSdW4gPSB0aGlzID8gZmFsc2UgOiB0cnVlCmNvbnN0IENPTlRBSU5FUiA9IHRoaXMgPz8gaHRtbGA8ZGl2IGNsYXNzPSdwbHV0b3Bsb3RseS1jb250YWluZXInPmAKY29uc3QgUExPVCA9IENPTlRBSU5FUi5xdWVyeVNlbGVjdG9yKCcuanMtcGxvdGx5LXBsb3QnKSA/PyBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2PmApCmNvbnN0IHBhcmVudCA9IENPTlRBSU5FUi5wYXJlbnRFbGVtZW50Ci8vIFdlIHVzZSBhIGNvbnRyb2xsZXIgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVycyB1cG9uIGludmFsaWRhdGlvbgpjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpCi8vIFdlIGhhdmUgdG8gYWRkIHRoaXMgdG8ga2VlcCBzdXBwb3J0aW5nIEBiaW5kIHdpdGggdGhlIG9sZCBBUEkgdXNpbmcgUExPVApQTE9ULmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGUpID0+IHsKCUNPTlRBSU5FUi52YWx1ZSA9IFBMT1QudmFsdWUKCWlmIChlLmJ1YmJsZXMpIHsKCQlyZXR1cm4KCX0KCUNPTlRBSU5FUi5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnaW5wdXQnKSkKfSwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pCgoJLy8gVGhpcyBjcmVhdGUgdGhlIHN0eWxlIHN1YmRpdiBvbiBmaXJzdCBydW4KCWZpcnN0UnVuICYmIENPTlRBSU5FUi5hcHBlbmRDaGlsZChodG1sYAoJPHN0eWxlPgoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciB7CgkJd2lkdGg6IDEwMCU7CgkJaGVpZ2h0OiAxMDAlOwoJCW1pbi1oZWlnaHQ6IDA7CgkJbWluLXdpZHRoOiAwOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciAuanMtcGxvdGx5LXBsb3QgLnBsb3RseSBkaXYgewoJCW1hcmdpbjogMCBhdXRvOyAvLyBUaGlzIGNlbnRlcnMgdGhlIHBsb3QKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIucG9wcGVkLW91dCB7CgkJb3ZlcmZsb3c6IGF1dG87CgkJei1pbmRleDogMTAwMDsKCQlwb3NpdGlvbjogZml4ZWQ7CgkJcmVzaXplOiBib3RoOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMHB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwcHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciB7CgkJZGlzcGxheTogZmxleDsKCQlmbGV4LWZsb3c6IHJvdyB3cmFwOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDEycHg7CgkJcG9zaXRpb246IGZpeGVkOwoJCXotaW5kZXg6IDEwMDE7CgkJY3Vyc29yOiBtb3ZlOwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgLTEwMCUpOwoJCXBhZGRpbmc6IDVweDsKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIHNwYW4gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQlmbGV4OiAxCgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlci5oaWRkZW4gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuY2xpcGJvYXJkLXNwYW4gewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCX0KCS5jbGlwYm9hcmQtdmFsdWUgewoJCXBhZGRpbmctcmlnaHQ6IDVweDsKCQlwYWRkaW5nLWxlZnQ6IDJweDsKCQljdXJzb3I6IHRleHQ7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlmbGV4OiAwIDAgMTAwJTsKCQl0ZXh0LWFsaWduOiBjZW50ZXI7CgkJYm9yZGVyLXRvcDogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCW1hcmdpbi10b3A6IDVweDsKCQlkaXNwbGF5OiBub25lOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5maWxlc2F2ZSAuY2xpcGJvYXJkLXNwYW4uZmlsZW5hbWUgewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5jbGlwYm9hcmQtdmFsdWUuZmlsZW5hbWUgewoJCW1hcmdpbi1sZWZ0OiAzcHg7CgkJdGV4dC1hbGlnbjogbGVmdDsKCQltaW4td2lkdGg6IG1pbig2MCUsIG1pbi1jb250ZW50KTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogaW5saW5lLWZsZXg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IC5sYWJlbCB7CgkJZmxleDogMCAwIDA7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZvcm1hdCB7CgkJcG9zaXRpb246IHJlbGF0aXZlOwoJCWZsZXg6IDEgMCBhdXRvOwoJCW1pbi13aWR0aDogMzBweDsKCQltYXJnaW4tcmlnaHQ6IDEwcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJCWZsZXgtZmxvdzogY29sdW1uOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXBhZGRpbmctbGVmdDogM3B4OwoJCXotaW5kZXg6IDIwMDA7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgewoJCWN1cnNvcjogcG9pbnRlcjsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlwYWRkaW5nOiAzcHg7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTNweCwgLTZweCk7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5mb3JtYXQtb3B0aW9uOm5vdCguc2VsZWN0ZWQpIHsKCQltYXJnaW4tdG9wOiAzcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24uc2VsZWN0ZWQgewoJCW9yZGVyOiAtMTsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpob3ZlciB7CgkJYmFja2dyb3VuZC1jb2xvcjogdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7Cgl9CglzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZm9udC13ZWlnaHQ6IG5vcm1hbDsKCQljb2xvcjogdmFyKC0tcGx1dG8tb3V0cHV0LWNvbG9yKTsKCQlkaXNwbGF5OiBub25lOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgY2FsYygtMTAwJSAtIDEwcHgpKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkubGFiZWwgewoJCXVzZXItc2VsZWN0OiBub25lOwoJfQoJLmxhYmVsOmhvdmVyIHNwYW4uY29uZmlnLXZhbHVlIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJbWluLXdpZHRoOiAxNTBweDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5tYXRjaGluZy1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tbWFjcm8tY29sb3IpOwoJCWZvbnQtd2VpZ2h0OiBib2xkOwoJfQoJLmNsaXBib2FyZC1zcGFuLmRpZmZlcmVudC1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tdGFnLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KPC9zdHlsZT4KYCkKCmxldCBvcmlnaW5hbF9oZWlnaHQgPSBwbG90X29iai5sYXlvdXQuaGVpZ2h0CmxldCBvcmlnaW5hbF93aWR0aCA9IHBsb3Rfb2JqLmxheW91dC53aWR0aAovLyBGb3IgdGhlIGhlaWdodCB3ZSBoYXZlIHRvIGFsc28gcHV0IGEgZml4ZWQgdmFsdWUgaW4gY2FzZSB0aGUgcGxvdCBpcyBwdXQgb24gYSBub24tZml4ZWQtc2l6ZSBjb250YWluZXIgKGxpa2UgdGhlIGRlZmF1bHQgd3JhcHBlcikKLy8gV2UgZGVmaW5lIGEgdmFyaWFibGUgdG8gY2hlY2sgd2hldGhlciB3ZSBzdGlsbCBoYXZlIHRvIHJlbW92ZSB0aGUgZml4ZWQgaGVpZ2h0CmxldCByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmaXJzdFJ1bgpsZXQgY29udGFpbmVyX2hlaWdodCA9IG9yaWdpbmFsX2hlaWdodCA/PyBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPz8gNDAwCkNPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfaGVpZ2h0ICsgJ3B4JwoKLy8gV2UgY3JlYXRlIGEgUHJvbWlzZSB2ZXJzaW9uIG9mIHNldFRpbWVvdXQKZnVuY3Rpb24gZGVsYXkobXMpIHsKICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTsKfQoKLy8gV2UgaW1wb3J0IGludGVyYWN0IGZvciBkcmFnZ2luZy9yZXNpemluZwpjb25zdCB7IGRlZmF1bHQ6IGludGVyYWN0IH0gPSBhd2FpdCBpbXBvcnQoJ2h0dHBzOi8vZXNtLnNoL2ludGVyYWN0anNAMS4xMC4xOScpCgoKZnVuY3Rpb24gZ2V0SW1hZ2VPcHRpb25zKCkgewogIGNvbnN0IG8gPSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPz8ge307CiAgcmV0dXJuIHsKICAgIGZvcm1hdDogby5mb3JtYXQgPz8gInBuZyIsCiAgICB3aWR0aDogby53aWR0aCA/PyBvcmlnaW5hbF93aWR0aCwKICAgIGhlaWdodDogby5oZWlnaHQgPz8gb3JpZ2luYWxfaGVpZ2h0LAogICAgc2NhbGU6IG8uc2NhbGUgPz8gMSwKICAgIGZpbGVuYW1lOiBvLmZpbGVuYW1lID8/ICJuZXdwbG90IiwKICB9Owp9Cgpjb25zdCBDTElQQk9BUkRfSEVBREVSID0KICBDT05UQUlORVIucXVlcnlTZWxlY3RvcigiLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIiKSA/PwogIENPTlRBSU5FUi5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAiYWZ0ZXJiZWdpbiIsCiAgICBodG1sYDxkaXYgY2xhc3M9InBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgaGlkZGVuIj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZvcm1hdCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5Gb3JtYXQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZm9ybWF0Ij48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHdpZHRoIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPldpZHRoOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIHdpZHRoIj48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gaGVpZ2h0IgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkhlaWdodDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBoZWlnaHQiPjwvc3Bhbj5weDwvc3BhbgogICAgICA+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzY2FsZSIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5TY2FsZTo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBzY2FsZSI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHNldCI+U2V0PC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHVuc2V0Ij5VbnNldDwvYnV0dG9uPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gZmlsZW5hbWUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+RmlsZW5hbWU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZmlsZW5hbWUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgPC9kaXY+YAogICk7CgpmdW5jdGlvbiBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKSB7CiAgY29uc3QgdmFsaWRfY2xhc3NlcyA9IFsKICAgICJtaXNzaW5nLWNvbmZpZyIsCiAgICAibWF0Y2hpbmctY29uZmlnIiwKICAgICJkaWZmZXJlbnQtY29uZmlnIiwKICBdOwogIGZ1bmN0aW9uIHNldENsYXNzKGNsKSB7CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgdmFsaWRfY2xhc3NlcykgewogICAgICBjb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZShuYW1lLCBuYW1lID09IGNsKTsKICAgIH0KICB9CiAgLy8gV2UgdXNlIHRoZSBjdXN0b20gZ2V0dGVycyB3ZSdsbCBzZXQgdXAgaW4gdGhlIGNvbnRhaW5lcgogIGNvbnN0IHsgdWlfdmFsdWUsIGNvbmZpZ192YWx1ZSwgY29uZmlnX3NwYW4sIGtleSB9ID0gY29udGFpbmVyOwogIGlmIChjb25maWdfdmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgc2V0Q2xhc3MoIm1pc3NpbmctY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGlzIG5vdCBwcmVzZW50IGluIHRoZSBjb25maWcuYDsKICB9IGVsc2UgaWYgKHVpX3ZhbHVlID09IGNvbmZpZ192YWx1ZSkgewogICAgc2V0Q2xhc3MoIm1hdGNoaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgdGhlIHNhbWUgdmFsdWUgaW4gdGhlIGNvbmZpZyBhbmQgaW4gdGhlIGhlYWRlci5gOwogIH0gZWxzZSB7CiAgICBzZXRDbGFzcygiZGlmZmVyZW50LWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgYSBkaWZmZXJlbnQgdmFsdWUgKDxlbT4ke2NvbmZpZ192YWx1ZX08L2VtPikgaW4gdGhlIGNvbmZpZy5gOwogIH0KICAvLyBBZGQgaW5mbyBhYm91dCBzZXR0aW5nIGFuZCB1bnNldHRpbmcKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgb24gdGhlIGxhYmVsIDxlbT48Yj5vbmNlPC9iPjwvZW0+IHRvIHNldCB0aGUgY3VycmVudCBVSSB2YWx1ZSBpbiB0aGUgY29uZmlnLmAKICApOwogIGNvbmZpZ19zcGFuLmluc2VydEFkamFjZW50SFRNTCgKICAgICJiZWZvcmVlbmQiLAogICAgYDxicj5DbGljayA8ZW0+PGI+dHdpY2U8L2I+PC9lbT4gdG8gcmVtb3ZlIHRoaXMga2V5IGZyb20gdGhlIGNvbmZpZy5gCiAgKTsKfQoKY29uc3QgdmFsaWRfZm9ybWF0cyA9IFsicG5nIiwgInN2ZyIsICJ3ZWJwIiwgImpwZWciLCAiZnVsbC1qc29uIl07CmZ1bmN0aW9uIGluaXRpYWxpemVVSVZhbHVlU3BhbihzcGFuLCBrZXksIHZhbHVlKSB7CiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9IGtleSA9PT0gImZvcm1hdCIgPyAiZmFsc2UiIDogInRydWUiOwogIGxldCBwYXJzZSA9ICh4KSA9PiB4OwogIGxldCB1cGRhdGUgPSAoeCkgPT4gKHNwYW4udGV4dENvbnRlbnQgPSB4KTsKICBpZiAoa2V5ID09PSAid2lkdGgiIHx8IGtleSA9PT0gImhlaWdodCIpIHsKICAgIHBhcnNlID0gKHgpID0+IE1hdGgucm91bmQocGFyc2VGbG9hdCh4KSk7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJzY2FsZSIpIHsKICAgIHBhcnNlID0gcGFyc2VGbG9hdDsKICB9IGVsc2UgaWYgKGtleSA9PT0gImZvcm1hdCIpIHsKICAgIC8vIFdlIHJlbW92ZSBjb250ZW50RWRpdGFibGUKICAgIHNwYW4uY29udGVudEVkaXRhYmxlID0gImZhbHNlIjsKICAgIC8vIEhlcmUgd2UgZmlyc3QgYWRkIHRoZSBzdWJzcGFucyBmb3IgZWFjaCBvcHRpb24KICAgIGNvbnN0IG9wdHNfZGl2ID0gc3Bhbi5hcHBlbmRDaGlsZChodG1sYDxkaXYgY2xhc3M9ImZvcm1hdC1vcHRpb25zIj48L2Rpdj5gKTsKICAgIGZvciAoY29uc3QgZm10IG9mIHZhbGlkX2Zvcm1hdHMpIHsKICAgICAgY29uc3Qgb3B0ID0gb3B0c19kaXYuYXBwZW5kQ2hpbGQoCiAgICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iZm9ybWF0LW9wdGlvbiAke2ZtdH0iPiR7Zm10fTwvc3Bhbj5gCiAgICAgICk7CiAgICAgIG9wdC5vbmNsaWNrID0gKGUpID0+IHsKICAgICAgICBzcGFuLnZhbHVlID0gb3B0LnRleHRDb250ZW50OwogICAgICB9OwogICAgfQogICAgcGFyc2UgPSAoeCkgPT4gewogICAgICByZXR1cm4gdmFsaWRfZm9ybWF0cy5pbmNsdWRlcyh4KSA/IHggOiBsb2NhbFZhbHVlOwogICAgfTsKICAgIHVwZGF0ZSA9ICh4KSA9PiB7CiAgICAgIGZvciAoY29uc3Qgb3B0IG9mIG9wdHNfZGl2LmNoaWxkcmVuKSB7CiAgICAgICAgb3B0LmNsYXNzTGlzdC50b2dnbGUoInNlbGVjdGVkIiwgb3B0LnRleHRDb250ZW50ID09PSB4KTsKICAgICAgfQogICAgfTsKICB9IGVsc2UgewogICAgLy8gV2Ugb25seSBoYXZlIGZpbGVuYW1lIGhlcmUKICB9CiAgbGV0IGxvY2FsVmFsdWU7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwYW4sICJ2YWx1ZSIsIHsKICAgIGdldDogKCkgPT4gewogICAgICByZXR1cm4gbG9jYWxWYWx1ZTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgaWYgKHZhbCAhPT0gIiIpIHsKICAgICAgICBsb2NhbFZhbHVlID0gcGFyc2UodmFsKTsKICAgICAgfQogICAgICB1cGRhdGUobG9jYWxWYWx1ZSk7CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKICAvLyBXZSBhbHNvIGFzc2lnbiBhIGxpc3RlbmVyIHNvIHRoYXQgdGhlIGVkaXRhYmxlIGlzIGJsdXJyZWQgd2hlbiBlbnRlciBpcyBwcmVzc2VkCiAgc3Bhbi5vbmtleWRvd24gPSAoZSkgPT4gewogICAgaWYgKGUua2V5Q29kZSA9PT0gMTMpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBzcGFuLmJsdXIoKTsKICAgIH0KICB9OwogIHNwYW4udmFsdWUgPSB2YWx1ZTsKfQoKZnVuY3Rpb24gaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3BhbihzcGFuLCBrZXkpIHsKICAvLyBIZXJlIHdlIG1vc3RseSB3YW50IHRvIGRlZmluZSB0aGUgc2V0dGVyIGFuZCBnZXR0ZXIKICBjb25zdCBjb250YWluZXIgPSBzcGFuLmNsb3Nlc3QoIi5jbGlwYm9hcmQtc3BhbiIpOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgfSwKICAgIHNldDogKHZhbCkgPT4gewogICAgICAvLyBpZiB1bmRlZmluZWQgaXMgcGFzc2VkLCB3ZSByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIG9wdGlvbnMKICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZGVsZXRlIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgICB9IGVsc2UgewogICAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldID0gdmFsOwogICAgICB9CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKfQoKY29uc3QgY29uZmlnX3NwYW5zID0ge307CmZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGdldEltYWdlT3B0aW9ucygpKSkgewogIGNvbnN0IGNvbnRhaW5lciA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcihgLmNsaXBib2FyZC1zcGFuLiR7a2V5fWApOwogIGNvbnN0IGxhYmVsID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5sYWJlbCIpOwogIC8vIFdlIGdpdmUgdGhlIGxhYmVsIGEgZnVuY3Rpb24gdGhhdCBvbiBzaW5nbGUgY2xpY2sgd2lsbCBzZXQgdGhlIGN1cnJlbnQgdmFsdWUgYW5kIHdpdGggZG91YmxlIGNsaWNrIHdpbGwgdW5zZXQgaXQKICBsYWJlbC5vbmNsaWNrID0gRHVhbENsaWNrKAogICAgKCkgPT4gewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfSwKICAgIChlKSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJlIiwgZSk7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IHVuZGVmaW5lZDsKICAgIH0KICApOwogIGNvbnN0IHVpX3ZhbHVlX3NwYW4gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC12YWx1ZSIpOwogIGNvbnN0IGNvbmZpZ192YWx1ZV9zcGFuID0KICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuY29uZmlnLXZhbHVlIikgPz8KICAgIGxhYmVsLmluc2VydEFkamFjZW50RWxlbWVudCgKICAgICAgImFmdGVyYmVnaW4iLAogICAgICBodG1sYDxzcGFuIGNsYXNzPSJjb25maWctdmFsdWUiPjwvc3Bhbj5gCiAgICApOwogIC8vIEFzc2luZyB0aGUgdHdvIHNwYW5zIGFzIHByb3BlcnRpZXMgb2YgdGhlIGNvbnRhaW5pbmcgc3BhbgogIGNvbnRhaW5lci51aV9zcGFuID0gdWlfdmFsdWVfc3BhbjsKICBjb250YWluZXIuY29uZmlnX3NwYW4gPSBjb25maWdfdmFsdWVfc3BhbjsKICBjb250YWluZXIua2V5ID0ga2V5OwogIGNvbmZpZ19zcGFuc1trZXldID0gY29udGFpbmVyOwogIGlmIChmaXJzdFJ1bikgewogICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID0KICAgICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogICAgLy8gV2UgZG8gdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSB2YWx1ZSBzcGFuCiAgICBpbml0aWFsaXplVUlWYWx1ZVNwYW4odWlfdmFsdWVfc3Bhbiwga2V5LCB2YWx1ZSk7CiAgICAvLyBUaGVuIHdlIGluaXRpYWxpemUgdGhlIGNvbmZpZyB2YWx1ZQogICAgaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3Bhbihjb25maWdfdmFsdWVfc3Bhbiwga2V5KTsKICAgIC8vIFdlIHB1dCBzb21lIGNvbnZlbmllbmNlIGdldHRlcnMvc2V0dGVycwogICAgLy8gdWlfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgInVpX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IHVpX3ZhbHVlX3NwYW4udmFsdWUsCiAgICAgIHNldDogKHZhbCkgPT4gewogICAgICAgIHVpX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICAgIC8vIGNvbmZpZ192YWx1ZSBmb3J3YXJkCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAiY29uZmlnX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IGNvbmZpZ192YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSA9IHZhbDsKICAgICAgfSwKICAgIH0pOwogIH0KfQoKLy8gVGhlc2Ugb2JqZWN0cyB3aWxsIGNvbnRhaW4gdGhlIGRlZmF1bHQgdmFsdWUKCi8vIFRoaXMgY29kZSB1cGRhdGVzIHRoZSBpbWFnZSBvcHRpb25zIGluIHRoZSBQTE9UIGNvbmZpZyB3aXRoIHRoZSBwcm92aWRlZCBvbmVzCmZ1bmN0aW9uIHNldEltYWdlT3B0aW9ucyhvKSB7CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBvW2tleV07CiAgfQp9CmZ1bmN0aW9uIHVuc2V0SW1hZ2VPcHRpb25zKCkgewogIHNldEltYWdlT3B0aW9ucyh7fSk7Cn0KCmNvbnN0IHNldF9idXR0b24gPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtc3Bhbi5zZXQiKTsKY29uc3QgdW5zZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4udW5zZXQiKTsKaWYgKGZpcnN0UnVuKSB7CiAgc2V0X2J1dHRvbi5vbmNsaWNrID0gKGUpID0+IHsKICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfQogIH07CiAgdW5zZXRfYnV0dG9uLm9uY2xpY2sgPSB1bnNldEltYWdlT3B0aW9uczsKfQoKLy8gV2UgYWRkIGEgZnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIGNsaXBib2FyZCBpcyBwb3BwZWQgb3V0CkNPTlRBSU5FUi5pc1BvcHBlZE91dCA9ICgpID0+IHsKICByZXR1cm4gQ09OVEFJTkVSLmNsYXNzTGlzdC5jb250YWlucygicG9wcGVkLW91dCIpOwp9OwoKQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNlZG93biA9IGZ1bmN0aW9uIChldmVudCkgewogIGlmIChldmVudC50YXJnZXQubWF0Y2hlcygic3Bhbi5jbGlwYm9hcmQtdmFsdWUiKSkgewogICAgY29uc29sZS5sb2coIldlIGRvbid0IG1vdmUhIik7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IHN0YXJ0ID0gewogICAgbGVmdDogcGFyc2VGbG9hdChDT05UQUlORVIuc3R5bGUubGVmdCksCiAgICB0b3A6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLnRvcCksCiAgICBYOiBldmVudC5wYWdlWCwKICAgIFk6IGV2ZW50LnBhZ2VZLAogIH07CiAgZnVuY3Rpb24gbW92ZUF0KGV2ZW50LCBzdGFydCkgewogICAgY29uc3QgdG9wID0gZXZlbnQucGFnZVkgLSBzdGFydC5ZICsgc3RhcnQudG9wICsgInB4IjsKICAgIGNvbnN0IGxlZnQgPSBldmVudC5wYWdlWCAtIHN0YXJ0LlggKyBzdGFydC5sZWZ0ICsgInB4IjsKICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUudG9wID0gdG9wOwogIH0KCiAgLy8gbW92ZSBvdXIgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGJhbGwgdW5kZXIgdGhlIHBvaW50ZXIKICBtb3ZlQXQoZXZlbnQsIHN0YXJ0KTsKICBmdW5jdGlvbiBvbk1vdXNlTW92ZShldmVudCkgewogICAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgfQoKICAvLyBXZSB1c2UgdGhpcyB0byByZW1vdmUgdGhlIG1vdXNlbW92ZSB3aGVuIGNsaWNraW5nIG91dHNpZGUgb2YgdGhlIGNvbnRhaW5lcgogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CgogIC8vIG1vdmUgdGhlIGNvbnRhaW5lciBvbiBtb3VzZW1vdmUKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCBvbk1vdXNlTW92ZSwgewogICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCwKICB9KTsKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICBjbGVhblVwKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKCiAgZnVuY3Rpb24gY2xlYW5VcCgpIHsKICAgIGNvbnNvbGUubG9nKCJjbGVhbmluZyB1cCB0aGUgcGxvdCBtb3ZlIGxpc3RlbmVyIik7CiAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICBDTElQQk9BUkRfSEVBREVSLm9ubW91c2V1cCA9IG51bGw7CiAgfQoKICAvLyAoMykgZHJvcCB0aGUgYmFsbCwgcmVtb3ZlIHVubmVlZGVkIGhhbmRsZXJzCiAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBjbGVhblVwOwp9OwoKZnVuY3Rpb24gc2VuZFRvQ2xpcGJvYXJkKGJsb2IpIHsKICBpZiAoIW5hdmlnYXRvci5jbGlwYm9hcmQpIHsKICAgIGFsZXJ0KAogICAgICAiVGhlIENsaXBib2FyZCBBUEkgZG9lcyBub3Qgc2VlbSB0byBiZSBhdmFpbGFibGUsIG1ha2Ugc3VyZSB0aGUgUGx1dG8gbm90ZWJvb2sgaXMgYmVpbmcgdXNlZCBmcm9tIGVpdGhlciBsb2NhbGhvc3Qgb3IgYW4gaHR0cHMgc291cmNlLiIKICAgICk7CiAgfQogIG5hdmlnYXRvci5jbGlwYm9hcmQKICAgIC53cml0ZShbCiAgICAgIG5ldyBDbGlwYm9hcmRJdGVtKHsKICAgICAgICAvLyBUaGUga2V5IGlzIGRldGVybWluZWQgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIGJsb2IncyB0eXBlLgogICAgICAgIFtibG9iLnR5cGVdOiBibG9iLAogICAgICB9KSwKICAgIF0pCiAgICAudGhlbigKICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgIGNvbnNvbGUubG9nKCJBc3luYzogQ29weWluZyB0byBjbGlwYm9hcmQgd2FzIHN1Y2Nlc3NmdWwhIik7CiAgICAgIH0sCiAgICAgIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJBc3luYzogQ291bGQgbm90IGNvcHkgdGV4dDogIiwgZXJyKTsKICAgICAgfQogICAgKTsKfQoKZnVuY3Rpb24gY29weUltYWdlVG9DbGlwYm9hcmQoKSB7CiAgLy8gV2UgZXh0cmFjdCB0aGUgaW1hZ2Ugb3B0aW9ucyBmcm9tIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzIChpZiB0aGV5IGV4aXN0KQogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuIFdlIGFsc28gaWdub3JlIGZvcm1hdCBiZWNhdXNlIHRoZSBjbGlwYm9hcmQgb25seSBzdXBwb3J0cyBwbmcuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwga2V5ID09PSAiZm9ybWF0IikgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbmZpZ1trZXldID0gdmFsOwogIH0KICBQbG90bHkudG9JbWFnZShQTE9ULCBjb25maWcpLnRoZW4oZnVuY3Rpb24gKGRhdGFVcmwpIHsKICAgIGZldGNoKGRhdGFVcmwpCiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5ibG9iKCkpCiAgICAgIC50aGVuKChibG9iKSA9PiB7CiAgICAgICAgY29uc3QgcGFzdGVfcmVjZWl2ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdwYXN0ZS1yZWNlaXZlci5wbHV0b3Bsb3RseScpCiAgICAgICAgaWYgKHBhc3RlX3JlY2VpdmVyKSB7CiAgICAgICAgICBwYXN0ZV9yZWNlaXZlci5hdHRhY2hJbWFnZShkYXRhVXJsLCBDT05UQUlORVIpCiAgICAgICAgfQogICAgICAgIHNlbmRUb0NsaXBib2FyZChibG9iKQogICAgICB9KTsKICB9KTsKfQoKZnVuY3Rpb24gc2F2ZUltYWdlVG9GaWxlKCkgewogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LmRvd25sb2FkSW1hZ2UoUExPVCwgY29uZmlnKTsKfQoKbGV0IGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwLCB0b3A6IDAsIGxlZnQ6IDAgfTsKZnVuY3Rpb24gdW5wb3BfY29udGFpbmVyKGNsKSB7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCBmYWxzZSk7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoY2wsIGZhbHNlKTsKICAvLyBXZSBmaXggdGhlIGhlaWdodCBiYWNrIHRvIHRoZSB2YWx1ZSBpdCBoYWQgYmVmb3JlIHBvcG91dCwgYWxzbyBzZXR0aW5nIHRoZSBmbGFnIHRvIHNpZ25hbCB0aGF0IHVwb24gZmlyc3QgcmVzaXplIHdlIHJlbW92ZSB0aGUgZml4ZWQgaW5saW5lLXN0eWxlCiAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9IGNvbnRhaW5lcl9yZWN0LmhlaWdodCArICJweCI7CiAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gdHJ1ZTsKICAvLyBXZSBzZXQgdGhlIG90aGVyIGZpeGVkIGlubGluZS1zdHlsZXMgdG8gbnVsbAogIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogIENPTlRBSU5FUi5zdHlsZS50b3AgPSAiIjsKICBDT05UQUlORVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIFdlIGFsc28gcmVtb3ZlIHRoZSBDTElQQk9BUkRfSEVBREVSCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9ICIiOwogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIEZpbmFsbHkgd2UgcmVtb3ZlIHRoZSBoaWRkZW4gY2xhc3MgdG8gdGhlIGhlYWRlcgogIENMSVBCT0FSRF9IRUFERVIuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgdHJ1ZSk7CiAgcmV0dXJuOwp9CmZ1bmN0aW9uIHBvcG91dF9jb250YWluZXIob3B0cykgewogIGNvbnN0IGNsID0gb3B0cz8uY2w7CiAgY29uc3QgdGFyZ2V0X2NvbnRhaW5lcl9zaXplID0gb3B0cz8udGFyZ2V0X2NvbnRhaW5lcl9zaXplID8/IHt9OwogIGNvbnN0IHRhcmdldF9wbG90X3NpemUgPSBvcHRzPy50YXJnZXRfcGxvdF9zaXplID8/IHt9OwogIGlmIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgcmV0dXJuIHVucG9wX2NvbnRhaW5lcihjbCk7CiAgfQogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBjbCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0cnVlKTsKICAvLyBXZSBleHRyYWN0IHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNvbnRhaW5lciwgc2F2ZSB0aGVtIGFuZCBmaXggdGhlbQogIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH0gPSBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgY29udGFpbmVyX3JlY3QgPSB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9OwogIC8vIFdlIHNhdmUgdGhlIGN1cnJlbnQgcGxvdCBzaXplIGJlZm9yZSB3ZSBwb3AgYXMgaXQgd2lsbCBmaWxsIHRoZSBzY3JlZW4KICBjb25zdCBjdXJyZW50X3Bsb3Rfc2l6ZSA9IHsKICAgIHdpZHRoOiBQTE9ULl9mdWxsTGF5b3V0LndpZHRoLAogICAgaGVpZ2h0OiBQTE9ULl9mdWxsTGF5b3V0LmhlaWdodCwKICB9OwogIC8vIFdlIGhhdmUgdG8gc2F2ZSB0aGUgcGFkIGRhdGEgYmVmb3JlIHBvcHBpbmcgc28gd2UgY2FuIHJlc2l6ZSBwcmVjaXNlbHkKICBjb25zdCBwYWQgPSB7fTsKICBwYWQudW5wb3BwZWQgPSBnZXRTaXplRGF0YSgpLmNvbnRhaW5lcl9wYWQ7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCB0cnVlKTsKICBwYWQucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIC8vIFdlIGRvIHRvcCBhbmQgbGVmdCBiYXNlZCBvbiB0aGUgY3VycmVudCByZWN0CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ0b3AiLCAibGVmdCJdKSB7CiAgICBjb25zdCBzdGFydF92YWwgPSB0YXJnZXRfY29udGFpbmVyX3NpemVba2V5XSA/PyBjb250YWluZXJfcmVjdFtrZXldOwogICAgbGV0IG9mZnNldCA9IDA7CiAgICBmb3IgKGNvbnN0IGtpbmQgb2YgWyJwYWRkaW5nIiwgImJvcmRlciJdKSB7CiAgICAgIG9mZnNldCArPSBwYWQucG9wcGVkW2tpbmRdW2tleV0gLSBwYWQudW5wb3BwZWRba2luZF1ba2V5XTsKICAgIH0KICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gc3RhcnRfdmFsIC0gb2Zmc2V0ICsgInB4IjsKICAgIGlmIChrZXkgPT09ICJsZWZ0IikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgLy8gV2UgY29tcHV0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBkZXBlbmRpbmcgb24gZXZlbnR1YWwgY29uZmlnIGRhdGEKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7CiAgICB3aWR0aDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS53aWR0aCA/PwogICAgICBjb25maWdfc3BhbnMud2lkdGguY29uZmlnX3ZhbHVlID8/CiAgICAgIGN1cnJlbnRfcGxvdF9zaXplLndpZHRoLAogICAgaGVpZ2h0OgogICAgICB0YXJnZXRfcGxvdF9zaXplLmhlaWdodCA/PwogICAgICBjb25maWdfc3BhbnMuaGVpZ2h0LmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS5oZWlnaHQsCiAgfSk7CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgY29uc3QgdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY3N6W2tleV07CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHZhbCArICJweCI7CiAgICBpZiAoa2V5ID09PSAid2lkdGgiKSB7CiAgICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGVba2V5XSA9IENPTlRBSU5FUi5zdHlsZVtrZXldOwogICAgfQogIH0KICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIGZhbHNlKTsKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICB1bnBvcF9jb250YWluZXIoKTsKICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9LAogICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0KICApOwp9CgpDT05UQUlORVIucG9wT3V0ID0gcG9wb3V0X2NvbnRhaW5lcjsKCmZ1bmN0aW9uIER1YWxDbGljayhzaW5nbGVfZnVuYywgZGJsX2Z1bmMpIHsKICBsZXQgbmNsaWNrcyA9IDA7CiAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7CiAgICBuY2xpY2tzICs9IDE7CiAgICBpZiAobmNsaWNrcyA+IDEpIHsKICAgICAgZGJsX2Z1bmMoLi4uYXJncyk7CiAgICAgIG5jbGlja3MgPSAwOwogICAgfSBlbHNlIHsKICAgICAgZGVsYXkoMzAwKS50aGVuKCgpID0+IHsKICAgICAgICBpZiAobmNsaWNrcyA9PSAxKSB7CiAgICAgICAgICBzaW5nbGVfZnVuYyguLi5hcmdzKTsKICAgICAgICB9CiAgICAgICAgbmNsaWNrcyA9IDA7CiAgICAgIH0pOwogICAgfQogIH07Cn0KCi8vIFdlIHJlbW92ZSB0aGUgZGVmYXVsdCBkb3dubG9hZCBpbWFnZSBidXR0b24KcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9SZW1vdmUgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlLAogIFsidG9JbWFnZSJdCik7Ci8vIFdlIGFkZCB0aGUgY3VzdG9tIGJ1dHRvbiB0byB0aGUgbW9kZWJhcgpwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb0FkZCA9IF8udW5pb24oCiAgcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQsCiAgWwogICAgewogICAgICBuYW1lOiAiQ29weSBQTkcgdG8gQ2xpcGJvYXJkIiwKICAgICAgaWNvbjogewogICAgICAgIGhlaWdodDogNTIwLAogICAgICAgIHdpZHRoOiA1MjAsCiAgICAgICAgcGF0aDogIk0yODAgNjRoNDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRWNDQ4YzAgMzUuMy0yOC43IDY0LTY0IDY0SDY0Yy0zNS4zIDAtNjQtMjguNy02NC02NFYxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRoNDAgOS42QzEyMSAyNy41IDE1My4zIDAgMTkyIDBzNzEgMjcuNSA3OC40IDY0SDI4MHpNNjQgMTEyYy04LjggMC0xNiA3LjItMTYgMTZWNDQ4YzAgOC44IDcuMiAxNiAxNiAxNkgzMjBjOC44IDAgMTYtNy4yIDE2LTE2VjEyOGMwLTguOC03LjItMTYtMTYtMTZIMzA0djI0YzAgMTMuMy0xMC43IDI0LTI0IDI0SDE5MiAxMDRjLTEzLjMgMC0yNC0xMC43LTI0LTI0VjExMkg2NHptMTI4LThhMjQgMjQgMCAxIDAgMC00OCAyNCAyNCAwIDEgMCAwIDQ4eiIsCiAgICAgIH0sCiAgICAgIGRpcmVjdGlvbjogInVwIiwKICAgICAgY2xpY2s6IER1YWxDbGljayhjb3B5SW1hZ2VUb0NsaXBib2FyZCwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoKTsKICAgICAgfSksCiAgICB9LAogICAgewogICAgICBuYW1lOiAiRG93bmxvYWQgSW1hZ2UiLAogICAgICBpY29uOiBQbG90bHkuSWNvbnMuY2FtZXJhLAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soc2F2ZUltYWdlVG9GaWxlLCAoKSA9PiB7CiAgICAgICAgcG9wb3V0X2NvbnRhaW5lcih7IGNsOiAiZmlsZXNhdmUiIH0pOwogICAgICB9KSwKICAgIH0sCiAgXQopOwoKZnVuY3Rpb24gZ2V0T2Zmc2V0RGF0YShlbCkgewogIGxldCBjcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsLCBudWxsKTsKICBjb25zdCBvZGF0YSA9IHsKICAgIHBhZGRpbmc6IHsKICAgICAgbGVmdDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSwKICAgICAgYm90dG9tOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSArIHBhcnNlRmxvYXQoY3MucGFkZGluZ0JvdHRvbSksCiAgICB9LAogICAgYm9yZGVyOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyTGVmdFdpZHRoKSwKICAgICAgcmlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyUmlnaHRXaWR0aCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5ib3JkZXJUb3BXaWR0aCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCkgKyBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICB9CiAgfTsKICBpZiAoZWwgPT09IFBMT1QpIHsKICAgIC8vIEZvciB0aGUgUExPVCB3ZSBhbHNvIHdhbnQgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIG9mZnNldAogICAgb2RhdGEub2Zmc2V0ID0gewogICAgICB0b3A6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0VG9wIDogMCwKICAgICAgbGVmdDogUExPVC5vZmZzZXRQYXJlbnQgPT0gQ09OVEFJTkVSID8gUExPVC5vZmZzZXRMZWZ0IDogMCwKICAgIH0KICB9CiAgcmV0dXJuIG9kYXRhOwp9CmZ1bmN0aW9uIGdldFNpemVEYXRhKCkgewogIGNvbnN0IGRhdGEgPSB7CiAgICBwbG90X3BhZDogZ2V0T2Zmc2V0RGF0YShQTE9UKSwKICAgIHBsb3RfcmVjdDogUExPVC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICAgIGNvbnRhaW5lcl9wYWQ6IGdldE9mZnNldERhdGEoQ09OVEFJTkVSKSwKICAgIGNvbnRhaW5lcl9yZWN0OiBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgfTsKICByZXR1cm4gZGF0YTsKfQpmdW5jdGlvbiBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgY29uc3QgY29tcHV0ZWRfc2l6ZSA9IGNvbXB1dGVQbG90U2l6ZShzaXplRGF0YSk7CiAgY29uc3Qgb2Zmc2V0cyA9IGNvbXB1dGVkX3NpemUub2Zmc2V0czsKCiAgY29uc3QgcGxvdF9kYXRhID0gewogICAgd2lkdGg6IHdpZHRoID8/IGNvbXB1dGVkX3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IGhlaWdodCA/PyBjb21wdXRlZF9zaXplLmhlaWdodCwKICB9OwoKICByZXR1cm4gewogICAgd2lkdGg6ICh3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoKSArIG9mZnNldHMud2lkdGgsCiAgICBoZWlnaHQ6IChoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQpICsgb2Zmc2V0cy5oZWlnaHQsCiAgICBub0NoYW5nZTogd2lkdGggPT0gY29tcHV0ZWRfc2l6ZS53aWR0aCAmJiBoZWlnaHQgPT0gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfQp9CgovLyBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hhbmdlIHRoZSBjb250YWluZXIgc2l6ZSBzbyB0aGF0IHRoZSByZXN1bHRpbmcgcGxvdCB3aWxsIGJlIG1hdGNoaW5nIHRoZSBwcm92aWRlZCBzcGVjcwpmdW5jdGlvbiBjaGFuZ2VDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICBpZiAoIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICBjb25zb2xlLmxvZygiVHJpZWQgdG8gY2hhbmdlIGNvbnRhaW5lciBzaXplIHdoZW4gbm90IHBvcHBlZCwgaWdub3JpbmciKTsKICAgIHJldHVybjsKICB9CgogIGNvbnN0IGNzeiA9IGNvbXB1dGVDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSk7CgogIGlmIChjc3oubm9DaGFuZ2UpIHsKICAgIGNvbnNvbGUubG9nKCJTaXplIGlzIHRoZSBzYW1lIGFzIGN1cnJlbnQsIGlnbm9yaW5nIik7CiAgICByZXR1cm4KICB9CiAgLy8gV2UgYXJlIG5vdyBnb2luZyB0byBzZXQgaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgY29udGFpbmVyCiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSBjc3pba2V5XSArICJweCI7CiAgfQp9Ci8vIFdlIG5vdyBjcmVhdGUgdGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCB1cGRhdGUgdGhlIHBsb3QgYmFzZWQgb24gdGhlIHZhbHVlcyBzcGVjaWZpZWQKZnVuY3Rpb24gdXBkYXRlRnJvbUhlYWRlcigpIHsKICBjb25zdCBoZWFkZXJfZGF0YSA9IHsKICAgIGhlaWdodDogY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSwKICAgIHdpZHRoOiBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUsCiAgfTsKICBjaGFuZ2VDb250YWluZXJTaXplKGhlYWRlcl9kYXRhKTsKfQovLyBXZSBhc3NpZ24gdGhpcyBmdW5jdGlvbiB0byB0aGUgb25ibHVyIGV2ZW50IG9mIHdpZHRoIGFuZCBoZWlnaHQKaWYgKGZpcnN0UnVuKSB7CiAgZm9yIChjb25zdCBjb250YWluZXIgb2YgT2JqZWN0LnZhbHVlcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIudWlfc3Bhbi5vbmJsdXIgPSAoZSkgPT4gewogICAgICBjb250YWluZXIudWlfdmFsdWUgPSBjb250YWluZXIudWlfc3Bhbi50ZXh0Q29udGVudDsKICAgICAgdXBkYXRlRnJvbUhlYWRlcigpOwogICAgfTsKICB9Cn0KLy8gVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgcGxvdCBzaXplIHRvIHVzZSBmb3IgcmVsYXlvdXQgYXMgYSBmdW5jdGlvbiBvZiB0aGUgY29udGFpbmVyIHNpemUKZnVuY3Rpb24gY29tcHV0ZVBsb3RTaXplKGRhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgLy8gUmVtb3ZlIFBhZGRpbmcKICBjb25zdCB7IGNvbnRhaW5lcl9wYWQsIHBsb3RfcGFkLCBjb250YWluZXJfcmVjdCB9ID0gZGF0YTsKICBjb25zdCBvZmZzZXRzID0gewogICAgd2lkdGg6CiAgICAgIHBsb3RfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBwbG90X3BhZC5ib3JkZXIud2lkdGggKwogICAgICBwbG90X3BhZC5vZmZzZXQubGVmdCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy53aWR0aCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLndpZHRoLAogICAgaGVpZ2h0OgogICAgICBwbG90X3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIHBsb3RfcGFkLmJvcmRlci5oZWlnaHQgKwogICAgICBwbG90X3BhZC5vZmZzZXQudG9wICsKICAgICAgY29udGFpbmVyX3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLmhlaWdodCwKICB9OwogIGNvbnN0IHN6ID0gewogICAgd2lkdGg6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3Qud2lkdGggLSBvZmZzZXRzLndpZHRoKSwKICAgIGhlaWdodDogTWF0aC5yb3VuZChjb250YWluZXJfcmVjdC5oZWlnaHQgLSBvZmZzZXRzLmhlaWdodCksCiAgICBvZmZzZXRzLAogIH07CiAgcmV0dXJuIHN6Owp9CgovLyBDcmVhdGUgdGhlIHJlc2l6ZU9ic2VydmVyIHRvIG1ha2UgdGhlIHBsb3QgZXZlbiBtb3JlIHJlc3BvbnNpdmUhIDptYWdpYzoKY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHsKICBjb25zdCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCk7CiAgY29uc3Qge2NvbnRhaW5lcl9yZWN0LCBjb250YWluZXJfcGFkfSA9IHNpemVEYXRhOwogIGxldCBwbG90X3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIC8vIFdlIHNhdmUgdGhlIGhlaWdodCBpbiB0aGUgUExPVCBvYmplY3QKICBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQ7CiAgLy8gV2UgZGVhbCB3aXRoIHNvbWUgc3R1ZmYgaWYgdGhlIGNvbnRhaW5lciBpcyBwb3BwcGVkCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9IGNvbnRhaW5lcl9yZWN0LndpZHRoICsgInB4IjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBjb250YWluZXJfcmVjdC5sZWZ0ICsgInB4IjsKICBjb25maWdfc3BhbnMuaGVpZ2h0LnVpX3ZhbHVlID0gcGxvdF9zaXplLmhlaWdodDsKICBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUgPSBwbG90X3NpemUud2lkdGg7CiAgLyogCgkJVGhlIGFkZGl0aW9uIG9mIHRoZSBpbnZhbGlkIGFyZ3VtZW50IGBwbHV0b3Jlc2l6ZWAgc2VlbXMgdG8gZml4IHRoZSBwcm9ibGVtIHdpdGggY2FsbGluZyBgcmVsYXlvdXRgIHNpbXBseSB3aXRoIGB7YXV0b3NpemU6IHRydWV9YCBhcyB1cGRhdGUgYnJlYWtpbmcgbW91c2UgcmVsYXlvdXQgZXZlbnRzIHRyYWNraW5nLiAKCQlTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Bsb3RseS9wbG90bHkuanMvaXNzdWVzLzYxNTYgZm9yIGRldGFpbHMKCQkqLwogIGxldCBjb25maWcgPSB7CiAgICAvLyBJZiB0aGlzIGlzIHBvcHBlZCBvdXQsIHdlIGlnbm9yZSB0aGUgb3JpZ2luYWwgd2lkdGgvaGVpZ2h0CiAgICB3aWR0aDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfd2lkdGgpID8/IHBsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfaGVpZ2h0KSA/PyBwbG90X3NpemUuaGVpZ2h0LAogICAgcGx1dG9yZXNpemU6IHRydWUsCiAgfTsKICBQbG90bHkucmVsYXlvdXQoUExPVCwgY29uZmlnKS50aGVuKCgpID0+IHsKICAgIGlmIChyZW1vdmVfY29udGFpbmVyX3NpemUgJiYgIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIHRoZSBmaXJzdCByZXNpemUgdXBvbiBwbG90IGNyZWF0aW9uIHRvIGFscmVhZHkgYmUgd2l0aG91dCBhIGZpeGVkIGhlaWdodAogICAgICBDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gIiI7CiAgICAgIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogICAgICByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmYWxzZTsKICAgIH0KICB9KTsKfSk7CgpyZXNpemVPYnNlcnZlci5vYnNlcnZlKENPTlRBSU5FUik7CgoKUGxvdGx5LnJlYWN0KFBMT1QsIHBsb3Rfb2JqKS50aGVuKCgpID0+IHsKCS8vIEFzc2lnbiB0aGUgUGxvdGx5IGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKHBsb3RseV9saXN0ZW5lcnMpKSB7CgkJZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcl92ZWMpIHsKCQkJUExPVC5vbihrZXksIGxpc3RlbmVyKQoJCX0KCX0KCS8vIEFzc2lnbiB0aGUgSlMgZXZlbnQgbGlzdGVuZXJzCglmb3IgKGNvbnN0IFtrZXksIGxpc3RlbmVyX3ZlY10gb2YgT2JqZWN0LmVudHJpZXMoanNfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1QuYWRkRXZlbnRMaXN0ZW5lcihrZXksIGxpc3RlbmVyLCB7CgkJCQlzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsCgkJCX0pCgkJfQoJfQp9CikKCgppbnZhbGlkYXRpb24udGhlbigoKSA9PiB7CgkvLyBSZW1vdmUgYWxsIHBsb3RseSBsaXN0ZW5lcnMKCVBMT1QucmVtb3ZlQWxsTGlzdGVuZXJzKCkKCS8vIFJlbW92ZSBhbGwgSlMgbGlzdGVuZXJzCgljb250cm9sbGVyLmFib3J0KCkKCS8vIFJlbW92ZSB0aGUgcmVzaXplT2JzZXJ2ZXIKCXJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKQp9KQoKCgoJCXJldHVybiBDT05UQUlORVIKCTwvc2NyaXB0PgqkbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/yEzc49KwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJDdhNjZhYjQ3LTkxOGYtNDU4Mi04OTVmLTFiNDY5MDU2MjA1MblkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzhRNhWG1cHVibGlzaGVkX29iamVjdF9rZXlzkdk1N2JjYzA1YjAtODFkYS0xMWVmLTIwNDAtMzU4NWM5YjQ5NTRmL2E3NTQyNTZiZmE0NzM1YWK4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkZDZiMTcyOWEtODc0ZC0xMWVlLTE1MWEtOWIwZmNjZTJjNGZkiqZxdWV1ZWTCpGxvZ3ORiKRsaW5l/6Ntc2eS2StOZXcgS29tYU1SSVBsb3RzIGJhY2tlbmQgc2V0OiBQbHV0b1Bsb3RseS4KqnRleHQvcGxhaW6nY2VsbF9pZNkkZDZiMTcyOWEtODc0ZC0xMWVlLTE1MWEtOWIwZmNjZTJjNGZkpmt3YXJnc5CiaWS1S29tYU1SSVBsb3RzX2Y3NmU0NjZhpGZpbGXZRi9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvS29tYU1SSVBsb3RzL2dkTUxnL3NyYy91aS9QbG90QmFja2VuZHMuamylZ3JvdXCsUGxvdEJhY2tlbmRzpWxldmVspEluZm+ncnVubmluZ8Kmb3V0cHV0hqRib2R5oKRtaW1lqnRleHQvcGxhaW6scm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/yEHKOjuwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJGQ2YjE3MjlhLTg3NGQtMTFlZS0xNTFhLTliMGZjY2UyYzRmZLlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzvwFkgO1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQ5YTg4YTU0Yi1iY2M3LTQxYWQtOGU2MC1mNGQ0NTBkY2NiMmSKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52mqJCTxzY3JpcHQgaWQ9J3Bsb3RfMSc+CgkJLy8gV2Ugc3RhcnQgYnkgcHV0dGluZyBhbGwgdGhlIHZhcmlhYmxlIGludGVycG9sYXRpb24gaGVyZSBhdCB0aGUgYmVnaW5uaW5nCgkJLy8gV2UgaGF2ZSB0byBjb252ZXJ0IGFsbCB0eXBlZGFycmF5cyBpbiB0aGUgbGF5b3V0IHRvIG5vcm1hbCBhcnJheXMuIFNlZSBJc3N1ZSAjMjUKCQkvLyBXZSB1c2UgbG9kYXNoIGZvciB0aGlzIGZvciBjb21wYWN0bmVzcwoJCWZ1bmN0aW9uIHJlbW92ZVR5cGVkQXJyYXkobykgewoJCQlyZXR1cm4gXy5pc1R5cGVkQXJyYXkobykgPyBBcnJheS5mcm9tKG8pIDoKCQkJXy5pc1BsYWluT2JqZWN0KG8pID8gXy5tYXBWYWx1ZXMobywgcmVtb3ZlVHlwZWRBcnJheSkgOiAKCQkJbwoJCX0KCgkJLy8gUHVibGlzaCB0aGUgcGxvdCBvYmplY3QgdG8gSlMKCQlsZXQgcGxvdF9vYmogPSBfLnVwZGF0ZSgvKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIEFic3RyYWN0UGx1dG9EaW5nZXRqZXMuRGlzcGxheS5wdWJsaXNoZWRfdG9fanMgKi8gZ2V0UHVibGlzaGVkT2JqZWN0KCI3YmNjMDViMC04MWRhLTExZWYtMjA0MC0zNTg1YzliNDk1NGYvODdhY2M5ZTQ4MGM1YjFiYSIpLCAibGF5b3V0IiwgcmVtb3ZlVHlwZWRBcnJheSkKCQkvLyBHZXQgdGhlIHBsb3RseSBsaXN0ZW5lcnMKCQljb25zdCBwbG90bHlfbGlzdGVuZXJzID0ge30KCQkvLyBHZXQgdGhlIEpTIGxpc3RlbmVycwoJCWNvbnN0IGpzX2xpc3RlbmVycyA9IHt9CgkJLy8gRGVhbCB3aXRoIGV2ZW50dWFsIGN1c3RvbSBjbGFzc2VzCgkJbGV0IGN1c3RvbV9jbGFzc2xpc3QgPSBbXQoKCgkJLy8gTG9hZCB0aGUgcGxvdGx5IGxpYnJhcnkKCQlsZXQgUGxvdGx5ID0gdW5kZWZpbmVkCgkJdHJ5IHsKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoIi4vcGxvdGx5anMvcGxvdGx5anMtMi4yNi4yLm1pbi5qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0gY2F0Y2ggKGUpIHsKCQkJY29uc29sZS5sb2coIkxvY2FsIGxvYWQgZmFpbGVkLCB0cnlpbmcgd2l0aCB0aGUgd2ViIGVzbS5zaCB2ZXJzaW9uIikKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoImh0dHBzOi8vZXNtLnNoL3YxMzUvcGxvdGx5LmpzLWRpc3QtbWluQDIuMjYuMi9lc25leHQvcGxvdGx5LmpzLWRpc3QtbWluLm1qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0KCgkJLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0byBmb3JjZSBsb2NhbCBtYXRoamF4IGZvbnQgY2FjaGUKCQlpZiAoZmFsc2UgJiYgd2luZG93Py5NYXRoSmF4Py5jb25maWc/LnN2Zz8uZm9udENhY2hlID09PSAnZ2xvYmFsJykgewoJCQl3aW5kb3cuTWF0aEpheC5jb25maWcuc3ZnLmZvbnRDYWNoZSA9ICdsb2NhbCcKCQl9CgoJCS8vIEZsYWcgdG8gY2hlY2sgaWYgdGhpcyBjZWxsIHdhcyAgbWFudWFsbHkgcmFuIG9yIHJlYWN0aXZlbHkgcmFuCmNvbnN0IGZpcnN0UnVuID0gdGhpcyA/IGZhbHNlIDogdHJ1ZQpjb25zdCBDT05UQUlORVIgPSB0aGlzID8/IGh0bWxgPGRpdiBjbGFzcz0ncGx1dG9wbG90bHktY29udGFpbmVyJz5gCmNvbnN0IFBMT1QgPSBDT05UQUlORVIucXVlcnlTZWxlY3RvcignLmpzLXBsb3RseS1wbG90JykgPz8gQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgPGRpdj5gKQpjb25zdCBwYXJlbnQgPSBDT05UQUlORVIucGFyZW50RWxlbWVudAovLyBXZSB1c2UgYSBjb250cm9sbGVyIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lcnMgdXBvbiBpbnZhbGlkYXRpb24KY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKQovLyBXZSBoYXZlIHRvIGFkZCB0aGlzIHRvIGtlZXAgc3VwcG9ydGluZyBAYmluZCB3aXRoIHRoZSBvbGQgQVBJIHVzaW5nIFBMT1QKUExPVC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChlKSA9PiB7CglDT05UQUlORVIudmFsdWUgPSBQTE9ULnZhbHVlCglpZiAoZS5idWJibGVzKSB7CgkJcmV0dXJuCgl9CglDT05UQUlORVIuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2lucHV0JykpCn0sIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KQoKCS8vIFRoaXMgY3JlYXRlIHRoZSBzdHlsZSBzdWJkaXYgb24gZmlyc3QgcnVuCglmaXJzdFJ1biAmJiBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGAKCTxzdHlsZT4KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgewoJCXdpZHRoOiAxMDAlOwoJCWhlaWdodDogMTAwJTsKCQltaW4taGVpZ2h0OiAwOwoJCW1pbi13aWR0aDogMDsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgLmpzLXBsb3RseS1wbG90IC5wbG90bHkgZGl2IHsKCQltYXJnaW46IDAgYXV0bzsgLy8gVGhpcyBjZW50ZXJzIHRoZSBwbG90Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLnBvcHBlZC1vdXQgewoJCW92ZXJmbG93OiBhdXRvOwoJCXotaW5kZXg6IDEwMDA7CgkJcG9zaXRpb246IGZpeGVkOwoJCXJlc2l6ZTogYm90aDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDBweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMHB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgewoJCWRpc3BsYXk6IGZsZXg7CgkJZmxleC1mbG93OiByb3cgd3JhcDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAxMnB4OwoJCXBvc2l0aW9uOiBmaXhlZDsKCQl6LWluZGV4OiAxMDAxOwoJCWN1cnNvcjogbW92ZTsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIC0xMDAlKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBzcGFuIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJZmxleDogMQoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIuaGlkZGVuIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuIHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlIHsKCQlwYWRkaW5nLXJpZ2h0OiA1cHg7CgkJcGFkZGluZy1sZWZ0OiAycHg7CgkJY3Vyc29yOiB0ZXh0OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZmxleDogMCAwIDEwMCU7CgkJdGV4dC1hbGlnbjogY2VudGVyOwoJCWJvcmRlci10b3A6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQltYXJnaW4tdG9wOiA1cHg7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZpbGVuYW1lIHsKCQltYXJnaW4tbGVmdDogM3B4OwoJCXRleHQtYWxpZ246IGxlZnQ7CgkJbWluLXdpZHRoOiBtaW4oNjAlLCBtaW4tY29udGVudCk7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCAubGFiZWwgewoJCWZsZXg6IDAgMCAwOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5mb3JtYXQgewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCQlmbGV4OiAxIDAgYXV0bzsKCQltaW4td2lkdGg6IDMwcHg7CgkJbWFyZ2luLXJpZ2h0OiAxMHB4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCQlmbGV4LWZsb3c6IGNvbHVtbjsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlwYWRkaW5nLWxlZnQ6IDNweDsKCQl6LWluZGV4OiAyMDAwOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIHsKCQljdXJzb3I6IHBvaW50ZXI7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJcGFkZGluZzogM3B4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKC0zcHgsIC02cHgpOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpub3QoLnNlbGVjdGVkKSB7CgkJbWFyZ2luLXRvcDogM3B4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uLnNlbGVjdGVkIHsKCQlvcmRlcjogLTE7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246aG92ZXIgewoJCWJhY2tncm91bmQtY29sb3I6IHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJfQoJc3Bhbi5jb25maWctdmFsdWUgewoJCWZvbnQtd2VpZ2h0OiBub3JtYWw7CgkJY29sb3I6IHZhcigtLXBsdXRvLW91dHB1dC1jb2xvcik7CgkJZGlzcGxheTogbm9uZTsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIGNhbGMoLTEwMCUgLSAxMHB4KSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLmxhYmVsIHsKCQl1c2VyLXNlbGVjdDogbm9uZTsKCX0KCS5sYWJlbDpob3ZlciBzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCW1pbi13aWR0aDogMTUwcHg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4ubWF0Y2hpbmctY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLW1hY3JvLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5kaWZmZXJlbnQtY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLXRhZy1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9Cjwvc3R5bGU+CmApCgpsZXQgb3JpZ2luYWxfaGVpZ2h0ID0gcGxvdF9vYmoubGF5b3V0LmhlaWdodApsZXQgb3JpZ2luYWxfd2lkdGggPSBwbG90X29iai5sYXlvdXQud2lkdGgKLy8gRm9yIHRoZSBoZWlnaHQgd2UgaGF2ZSB0byBhbHNvIHB1dCBhIGZpeGVkIHZhbHVlIGluIGNhc2UgdGhlIHBsb3QgaXMgcHV0IG9uIGEgbm9uLWZpeGVkLXNpemUgY29udGFpbmVyIChsaWtlIHRoZSBkZWZhdWx0IHdyYXBwZXIpCi8vIFdlIGRlZmluZSBhIHZhcmlhYmxlIHRvIGNoZWNrIHdoZXRoZXIgd2Ugc3RpbGwgaGF2ZSB0byByZW1vdmUgdGhlIGZpeGVkIGhlaWdodApsZXQgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmlyc3RSdW4KbGV0IGNvbnRhaW5lcl9oZWlnaHQgPSBvcmlnaW5hbF9oZWlnaHQgPz8gUExPVC5jb250YWluZXJfaGVpZ2h0ID8/IDQwMApDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX2hlaWdodCArICdweCcKCi8vIFdlIGNyZWF0ZSBhIFByb21pc2UgdmVyc2lvbiBvZiBzZXRUaW1lb3V0CmZ1bmN0aW9uIGRlbGF5KG1zKSB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7Cn0KCi8vIFdlIGltcG9ydCBpbnRlcmFjdCBmb3IgZHJhZ2dpbmcvcmVzaXppbmcKY29uc3QgeyBkZWZhdWx0OiBpbnRlcmFjdCB9ID0gYXdhaXQgaW1wb3J0KCdodHRwczovL2VzbS5zaC9pbnRlcmFjdGpzQDEuMTAuMTknKQoKCmZ1bmN0aW9uIGdldEltYWdlT3B0aW9ucygpIHsKICBjb25zdCBvID0gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogIHJldHVybiB7CiAgICBmb3JtYXQ6IG8uZm9ybWF0ID8/ICJwbmciLAogICAgd2lkdGg6IG8ud2lkdGggPz8gb3JpZ2luYWxfd2lkdGgsCiAgICBoZWlnaHQ6IG8uaGVpZ2h0ID8/IG9yaWdpbmFsX2hlaWdodCwKICAgIHNjYWxlOiBvLnNjYWxlID8/IDEsCiAgICBmaWxlbmFtZTogby5maWxlbmFtZSA/PyAibmV3cGxvdCIsCiAgfTsKfQoKY29uc3QgQ0xJUEJPQVJEX0hFQURFUiA9CiAgQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoIi5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIikgPz8KICBDT05UQUlORVIuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgImFmdGVyYmVnaW4iLAogICAgaHRtbGA8ZGl2IGNsYXNzPSJwbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIGhpZGRlbiI+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmb3JtYXQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+Rm9ybWF0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZvcm1hdCI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB3aWR0aCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5XaWR0aDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSB3aWR0aCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGhlaWdodCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5IZWlnaHQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgaGVpZ2h0Ij48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2NhbGUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+U2NhbGU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgc2NhbGUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzZXQiPlNldDwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB1bnNldCI+VW5zZXQ8L2J1dHRvbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZpbGVuYW1lIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZpbGVuYW1lOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZpbGVuYW1lIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgIDwvZGl2PmAKICApOwoKZnVuY3Rpb24gY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcikgewogIGNvbnN0IHZhbGlkX2NsYXNzZXMgPSBbCiAgICAibWlzc2luZy1jb25maWciLAogICAgIm1hdGNoaW5nLWNvbmZpZyIsCiAgICAiZGlmZmVyZW50LWNvbmZpZyIsCiAgXTsKICBmdW5jdGlvbiBzZXRDbGFzcyhjbCkgewogICAgZm9yIChjb25zdCBuYW1lIG9mIHZhbGlkX2NsYXNzZXMpIHsKICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUobmFtZSwgbmFtZSA9PSBjbCk7CiAgICB9CiAgfQogIC8vIFdlIHVzZSB0aGUgY3VzdG9tIGdldHRlcnMgd2UnbGwgc2V0IHVwIGluIHRoZSBjb250YWluZXIKICBjb25zdCB7IHVpX3ZhbHVlLCBjb25maWdfdmFsdWUsIGNvbmZpZ19zcGFuLCBrZXkgfSA9IGNvbnRhaW5lcjsKICBpZiAoY29uZmlnX3ZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgIHNldENsYXNzKCJtaXNzaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBpcyBub3QgcHJlc2VudCBpbiB0aGUgY29uZmlnLmA7CiAgfSBlbHNlIGlmICh1aV92YWx1ZSA9PSBjb25maWdfdmFsdWUpIHsKICAgIHNldENsYXNzKCJtYXRjaGluZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIHRoZSBzYW1lIHZhbHVlIGluIHRoZSBjb25maWcgYW5kIGluIHRoZSBoZWFkZXIuYDsKICB9IGVsc2UgewogICAgc2V0Q2xhc3MoImRpZmZlcmVudC1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIGEgZGlmZmVyZW50IHZhbHVlICg8ZW0+JHtjb25maWdfdmFsdWV9PC9lbT4pIGluIHRoZSBjb25maWcuYDsKICB9CiAgLy8gQWRkIGluZm8gYWJvdXQgc2V0dGluZyBhbmQgdW5zZXR0aW5nCiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIG9uIHRoZSBsYWJlbCA8ZW0+PGI+b25jZTwvYj48L2VtPiB0byBzZXQgdGhlIGN1cnJlbnQgVUkgdmFsdWUgaW4gdGhlIGNvbmZpZy5gCiAgKTsKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgPGVtPjxiPnR3aWNlPC9iPjwvZW0+IHRvIHJlbW92ZSB0aGlzIGtleSBmcm9tIHRoZSBjb25maWcuYAogICk7Cn0KCmNvbnN0IHZhbGlkX2Zvcm1hdHMgPSBbInBuZyIsICJzdmciLCAid2VicCIsICJqcGVnIiwgImZ1bGwtanNvbiJdOwpmdW5jdGlvbiBpbml0aWFsaXplVUlWYWx1ZVNwYW4oc3Bhbiwga2V5LCB2YWx1ZSkgewogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSBrZXkgPT09ICJmb3JtYXQiID8gImZhbHNlIiA6ICJ0cnVlIjsKICBsZXQgcGFyc2UgPSAoeCkgPT4geDsKICBsZXQgdXBkYXRlID0gKHgpID0+IChzcGFuLnRleHRDb250ZW50ID0geCk7CiAgaWYgKGtleSA9PT0gIndpZHRoIiB8fCBrZXkgPT09ICJoZWlnaHQiKSB7CiAgICBwYXJzZSA9ICh4KSA9PiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoeCkpOwogIH0gZWxzZSBpZiAoa2V5ID09PSAic2NhbGUiKSB7CiAgICBwYXJzZSA9IHBhcnNlRmxvYXQ7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAvLyBXZSByZW1vdmUgY29udGVudEVkaXRhYmxlCiAgICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9ICJmYWxzZSI7CiAgICAvLyBIZXJlIHdlIGZpcnN0IGFkZCB0aGUgc3Vic3BhbnMgZm9yIGVhY2ggb3B0aW9uCiAgICBjb25zdCBvcHRzX2RpdiA9IHNwYW4uYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2IGNsYXNzPSJmb3JtYXQtb3B0aW9ucyI+PC9kaXY+YCk7CiAgICBmb3IgKGNvbnN0IGZtdCBvZiB2YWxpZF9mb3JtYXRzKSB7CiAgICAgIGNvbnN0IG9wdCA9IG9wdHNfZGl2LmFwcGVuZENoaWxkKAogICAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImZvcm1hdC1vcHRpb24gJHtmbXR9Ij4ke2ZtdH08L3NwYW4+YAogICAgICApOwogICAgICBvcHQub25jbGljayA9IChlKSA9PiB7CiAgICAgICAgc3Bhbi52YWx1ZSA9IG9wdC50ZXh0Q29udGVudDsKICAgICAgfTsKICAgIH0KICAgIHBhcnNlID0gKHgpID0+IHsKICAgICAgcmV0dXJuIHZhbGlkX2Zvcm1hdHMuaW5jbHVkZXMoeCkgPyB4IDogbG9jYWxWYWx1ZTsKICAgIH07CiAgICB1cGRhdGUgPSAoeCkgPT4gewogICAgICBmb3IgKGNvbnN0IG9wdCBvZiBvcHRzX2Rpdi5jaGlsZHJlbikgewogICAgICAgIG9wdC5jbGFzc0xpc3QudG9nZ2xlKCJzZWxlY3RlZCIsIG9wdC50ZXh0Q29udGVudCA9PT0geCk7CiAgICAgIH0KICAgIH07CiAgfSBlbHNlIHsKICAgIC8vIFdlIG9ubHkgaGF2ZSBmaWxlbmFtZSBoZXJlCiAgfQogIGxldCBsb2NhbFZhbHVlOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIGxvY2FsVmFsdWU7CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIGlmICh2YWwgIT09ICIiKSB7CiAgICAgICAgbG9jYWxWYWx1ZSA9IHBhcnNlKHZhbCk7CiAgICAgIH0KICAgICAgdXBkYXRlKGxvY2FsVmFsdWUpOwogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7CiAgLy8gV2UgYWxzbyBhc3NpZ24gYSBsaXN0ZW5lciBzbyB0aGF0IHRoZSBlZGl0YWJsZSBpcyBibHVycmVkIHdoZW4gZW50ZXIgaXMgcHJlc3NlZAogIHNwYW4ub25rZXlkb3duID0gKGUpID0+IHsKICAgIGlmIChlLmtleUNvZGUgPT09IDEzKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgc3Bhbi5ibHVyKCk7CiAgICB9CiAgfTsKICBzcGFuLnZhbHVlID0gdmFsdWU7Cn0KCmZ1bmN0aW9uIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oc3Bhbiwga2V5KSB7CiAgLy8gSGVyZSB3ZSBtb3N0bHkgd2FudCB0byBkZWZpbmUgdGhlIHNldHRlciBhbmQgZ2V0dGVyCiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgLy8gaWYgdW5kZWZpbmVkIGlzIHBhc3NlZCwgd2UgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBvcHRpb25zCiAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGRlbGV0ZSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XSA9IHZhbDsKICAgICAgfQogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7Cn0KCmNvbnN0IGNvbmZpZ19zcGFucyA9IHt9Owpmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhnZXRJbWFnZU9wdGlvbnMoKSkpIHsKICBjb25zdCBjb250YWluZXIgPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoYC5jbGlwYm9hcmQtc3Bhbi4ke2tleX1gKTsKICBjb25zdCBsYWJlbCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIubGFiZWwiKTsKICAvLyBXZSBnaXZlIHRoZSBsYWJlbCBhIGZ1bmN0aW9uIHRoYXQgb24gc2luZ2xlIGNsaWNrIHdpbGwgc2V0IHRoZSBjdXJyZW50IHZhbHVlIGFuZCB3aXRoIGRvdWJsZSBjbGljayB3aWxsIHVuc2V0IGl0CiAgbGFiZWwub25jbGljayA9IER1YWxDbGljaygKICAgICgpID0+IHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0sCiAgICAoZSkgPT4gewogICAgICBjb25zb2xlLmxvZygiZSIsIGUpOwogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSB1bmRlZmluZWQ7CiAgICB9CiAgKTsKICBjb25zdCB1aV92YWx1ZV9zcGFuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtdmFsdWUiKTsKICBjb25zdCBjb25maWdfdmFsdWVfc3BhbiA9CiAgICBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNvbmZpZy12YWx1ZSIpID8/CiAgICBsYWJlbC5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAgICJhZnRlcmJlZ2luIiwKICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iY29uZmlnLXZhbHVlIj48L3NwYW4+YAogICAgKTsKICAvLyBBc3NpbmcgdGhlIHR3byBzcGFucyBhcyBwcm9wZXJ0aWVzIG9mIHRoZSBjb250YWluaW5nIHNwYW4KICBjb250YWluZXIudWlfc3BhbiA9IHVpX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmNvbmZpZ19zcGFuID0gY29uZmlnX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmtleSA9IGtleTsKICBjb25maWdfc3BhbnNba2V5XSA9IGNvbnRhaW5lcjsKICBpZiAoZmlyc3RSdW4pIHsKICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA9CiAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICAgIC8vIFdlIGRvIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdmFsdWUgc3BhbgogICAgaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHVpX3ZhbHVlX3NwYW4sIGtleSwgdmFsdWUpOwogICAgLy8gVGhlbiB3ZSBpbml0aWFsaXplIHRoZSBjb25maWcgdmFsdWUKICAgIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oY29uZmlnX3ZhbHVlX3NwYW4sIGtleSk7CiAgICAvLyBXZSBwdXQgc29tZSBjb252ZW5pZW5jZSBnZXR0ZXJzL3NldHRlcnMKICAgIC8vIHVpX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJ1aV92YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiB1aV92YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICB1aV92YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgICAvLyBjb25maWdfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgImNvbmZpZ192YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICB9Cn0KCi8vIFRoZXNlIG9iamVjdHMgd2lsbCBjb250YWluIHRoZSBkZWZhdWx0IHZhbHVlCgovLyBUaGlzIGNvZGUgdXBkYXRlcyB0aGUgaW1hZ2Ugb3B0aW9ucyBpbiB0aGUgUExPVCBjb25maWcgd2l0aCB0aGUgcHJvdmlkZWQgb25lcwpmdW5jdGlvbiBzZXRJbWFnZU9wdGlvbnMobykgewogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gb1trZXldOwogIH0KfQpmdW5jdGlvbiB1bnNldEltYWdlT3B0aW9ucygpIHsKICBzZXRJbWFnZU9wdGlvbnMoe30pOwp9Cgpjb25zdCBzZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4uc2V0Iik7CmNvbnN0IHVuc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnVuc2V0Iik7CmlmIChmaXJzdFJ1bikgewogIHNldF9idXR0b24ub25jbGljayA9IChlKSA9PiB7CiAgICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0KICB9OwogIHVuc2V0X2J1dHRvbi5vbmNsaWNrID0gdW5zZXRJbWFnZU9wdGlvbnM7Cn0KCi8vIFdlIGFkZCBhIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBjbGlwYm9hcmQgaXMgcG9wcGVkIG91dApDT05UQUlORVIuaXNQb3BwZWRPdXQgPSAoKSA9PiB7CiAgcmV0dXJuIENPTlRBSU5FUi5jbGFzc0xpc3QuY29udGFpbnMoInBvcHBlZC1vdXQiKTsKfTsKCkNMSVBCT0FSRF9IRUFERVIub25tb3VzZWRvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHsKICBpZiAoZXZlbnQudGFyZ2V0Lm1hdGNoZXMoInNwYW4uY2xpcGJvYXJkLXZhbHVlIikpIHsKICAgIGNvbnNvbGUubG9nKCJXZSBkb24ndCBtb3ZlISIpOwogICAgcmV0dXJuOwogIH0KICBjb25zdCBzdGFydCA9IHsKICAgIGxlZnQ6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLmxlZnQpLAogICAgdG9wOiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS50b3ApLAogICAgWDogZXZlbnQucGFnZVgsCiAgICBZOiBldmVudC5wYWdlWSwKICB9OwogIGZ1bmN0aW9uIG1vdmVBdChldmVudCwgc3RhcnQpIHsKICAgIGNvbnN0IHRvcCA9IGV2ZW50LnBhZ2VZIC0gc3RhcnQuWSArIHN0YXJ0LnRvcCArICJweCI7CiAgICBjb25zdCBsZWZ0ID0gZXZlbnQucGFnZVggLSBzdGFydC5YICsgc3RhcnQubGVmdCArICJweCI7CiAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9IHRvcDsKICB9CgogIC8vIG1vdmUgb3VyIGFic29sdXRlbHkgcG9zaXRpb25lZCBiYWxsIHVuZGVyIHRoZSBwb2ludGVyCiAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQpIHsKICAgIG1vdmVBdChldmVudCwgc3RhcnQpOwogIH0KCiAgLy8gV2UgdXNlIHRoaXMgdG8gcmVtb3ZlIHRoZSBtb3VzZW1vdmUgd2hlbiBjbGlja2luZyBvdXRzaWRlIG9mIHRoZSBjb250YWluZXIKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICAvLyBtb3ZlIHRoZSBjb250YWluZXIgb24gbW91c2Vtb3ZlCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgb25Nb3VzZU1vdmUsIHsKICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsCiAgfSk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgY2xlYW5VcCgpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7CgogIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICBjb25zb2xlLmxvZygiY2xlYW5pbmcgdXAgdGhlIHBsb3QgbW92ZSBsaXN0ZW5lciIpOwogICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBudWxsOwogIH0KCiAgLy8gKDMpIGRyb3AgdGhlIGJhbGwsIHJlbW92ZSB1bm5lZWRlZCBoYW5kbGVycwogIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gY2xlYW5VcDsKfTsKCmZ1bmN0aW9uIHNlbmRUb0NsaXBib2FyZChibG9iKSB7CiAgaWYgKCFuYXZpZ2F0b3IuY2xpcGJvYXJkKSB7CiAgICBhbGVydCgKICAgICAgIlRoZSBDbGlwYm9hcmQgQVBJIGRvZXMgbm90IHNlZW0gdG8gYmUgYXZhaWxhYmxlLCBtYWtlIHN1cmUgdGhlIFBsdXRvIG5vdGVib29rIGlzIGJlaW5nIHVzZWQgZnJvbSBlaXRoZXIgbG9jYWxob3N0IG9yIGFuIGh0dHBzIHNvdXJjZS4iCiAgICApOwogIH0KICBuYXZpZ2F0b3IuY2xpcGJvYXJkCiAgICAud3JpdGUoWwogICAgICBuZXcgQ2xpcGJvYXJkSXRlbSh7CiAgICAgICAgLy8gVGhlIGtleSBpcyBkZXRlcm1pbmVkIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBibG9iJ3MgdHlwZS4KICAgICAgICBbYmxvYi50eXBlXTogYmxvYiwKICAgICAgfSksCiAgICBdKQogICAgLnRoZW4oCiAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICBjb25zb2xlLmxvZygiQXN5bmM6IENvcHlpbmcgdG8gY2xpcGJvYXJkIHdhcyBzdWNjZXNzZnVsISIpOwogICAgICB9LAogICAgICBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiQXN5bmM6IENvdWxkIG5vdCBjb3B5IHRleHQ6ICIsIGVycik7CiAgICAgIH0KICAgICk7Cn0KCmZ1bmN0aW9uIGNvcHlJbWFnZVRvQ2xpcGJvYXJkKCkgewogIC8vIFdlIGV4dHJhY3QgdGhlIGltYWdlIG9wdGlvbnMgZnJvbSB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycyAoaWYgdGhleSBleGlzdCkKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LiBXZSBhbHNvIGlnbm9yZSBmb3JtYXQgYmVjYXVzZSB0aGUgY2xpcGJvYXJkIG9ubHkgc3VwcG9ydHMgcG5nLgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gImZvcm1hdCIpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LnRvSW1hZ2UoUExPVCwgY29uZmlnKS50aGVuKGZ1bmN0aW9uIChkYXRhVXJsKSB7CiAgICBmZXRjaChkYXRhVXJsKQogICAgICAudGhlbigocmVzKSA9PiByZXMuYmxvYigpKQogICAgICAudGhlbigoYmxvYikgPT4gewogICAgICAgIGNvbnN0IHBhc3RlX3JlY2VpdmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigncGFzdGUtcmVjZWl2ZXIucGx1dG9wbG90bHknKQogICAgICAgIGlmIChwYXN0ZV9yZWNlaXZlcikgewogICAgICAgICAgcGFzdGVfcmVjZWl2ZXIuYXR0YWNoSW1hZ2UoZGF0YVVybCwgQ09OVEFJTkVSKQogICAgICAgIH0KICAgICAgICBzZW5kVG9DbGlwYm9hcmQoYmxvYikKICAgICAgfSk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHNhdmVJbWFnZVRvRmlsZSgpIHsKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS5kb3dubG9hZEltYWdlKFBMT1QsIGNvbmZpZyk7Cn0KCmxldCBjb250YWluZXJfcmVjdCA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCwgdG9wOiAwLCBsZWZ0OiAwIH07CmZ1bmN0aW9uIHVucG9wX2NvbnRhaW5lcihjbCkgewogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgZmFsc2UpOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBmYWxzZSk7CiAgLy8gV2UgZml4IHRoZSBoZWlnaHQgYmFjayB0byB0aGUgdmFsdWUgaXQgaGFkIGJlZm9yZSBwb3BvdXQsIGFsc28gc2V0dGluZyB0aGUgZmxhZyB0byBzaWduYWwgdGhhdCB1cG9uIGZpcnN0IHJlc2l6ZSB3ZSByZW1vdmUgdGhlIGZpeGVkIGlubGluZS1zdHlsZQogIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQgKyAicHgiOwogIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IHRydWU7CiAgLy8gV2Ugc2V0IHRoZSBvdGhlciBmaXhlZCBpbmxpbmUtc3R5bGVzIHRvIG51bGwKICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICBDT05UQUlORVIuc3R5bGUudG9wID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBXZSBhbHNvIHJlbW92ZSB0aGUgQ0xJUEJPQVJEX0hFQURFUgogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSAiIjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBGaW5hbGx5IHdlIHJlbW92ZSB0aGUgaGlkZGVuIGNsYXNzIHRvIHRoZSBoZWFkZXIKICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIHRydWUpOwogIHJldHVybjsKfQpmdW5jdGlvbiBwb3BvdXRfY29udGFpbmVyKG9wdHMpIHsKICBjb25zdCBjbCA9IG9wdHM/LmNsOwogIGNvbnN0IHRhcmdldF9jb250YWluZXJfc2l6ZSA9IG9wdHM/LnRhcmdldF9jb250YWluZXJfc2l6ZSA/PyB7fTsKICBjb25zdCB0YXJnZXRfcGxvdF9zaXplID0gb3B0cz8udGFyZ2V0X3Bsb3Rfc2l6ZSA/PyB7fTsKICBpZiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIHJldHVybiB1bnBvcF9jb250YWluZXIoY2wpOwogIH0KICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgY2wgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdHJ1ZSk7CiAgLy8gV2UgZXh0cmFjdCB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjb250YWluZXIsIHNhdmUgdGhlbSBhbmQgZml4IHRoZW0KICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9ID0gQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogIGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfTsKICAvLyBXZSBzYXZlIHRoZSBjdXJyZW50IHBsb3Qgc2l6ZSBiZWZvcmUgd2UgcG9wIGFzIGl0IHdpbGwgZmlsbCB0aGUgc2NyZWVuCiAgY29uc3QgY3VycmVudF9wbG90X3NpemUgPSB7CiAgICB3aWR0aDogUExPVC5fZnVsbExheW91dC53aWR0aCwKICAgIGhlaWdodDogUExPVC5fZnVsbExheW91dC5oZWlnaHQsCiAgfTsKICAvLyBXZSBoYXZlIHRvIHNhdmUgdGhlIHBhZCBkYXRhIGJlZm9yZSBwb3BwaW5nIHNvIHdlIGNhbiByZXNpemUgcHJlY2lzZWx5CiAgY29uc3QgcGFkID0ge307CiAgcGFkLnVucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgdHJ1ZSk7CiAgcGFkLnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICAvLyBXZSBkbyB0b3AgYW5kIGxlZnQgYmFzZWQgb24gdGhlIGN1cnJlbnQgcmVjdAogIGZvciAoY29uc3Qga2V5IG9mIFsidG9wIiwgImxlZnQiXSkgewogICAgY29uc3Qgc3RhcnRfdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY29udGFpbmVyX3JlY3Rba2V5XTsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgZm9yIChjb25zdCBraW5kIG9mIFsicGFkZGluZyIsICJib3JkZXIiXSkgewogICAgICBvZmZzZXQgKz0gcGFkLnBvcHBlZFtraW5kXVtrZXldIC0gcGFkLnVucG9wcGVkW2tpbmRdW2tleV07CiAgICB9CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHN0YXJ0X3ZhbCAtIG9mZnNldCArICJweCI7CiAgICBpZiAoa2V5ID09PSAibGVmdCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIC8vIFdlIGNvbXB1dGUgdGhlIHdpZHRoIGFuZCBoZWlnaHQgZGVwZW5kaW5nIG9uIGV2ZW50dWFsIGNvbmZpZyBkYXRhCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoewogICAgd2lkdGg6CiAgICAgIHRhcmdldF9wbG90X3NpemUud2lkdGggPz8KICAgICAgY29uZmlnX3NwYW5zLndpZHRoLmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS5oZWlnaHQgPz8KICAgICAgY29uZmlnX3NwYW5zLmhlaWdodC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUuaGVpZ2h0LAogIH0pOwogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIGNvbnN0IHZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNzeltrZXldOwogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSB2YWwgKyAicHgiOwogICAgaWYgKGtleSA9PT0gIndpZHRoIikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCBmYWxzZSk7CiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgdW5wb3BfY29udGFpbmVyKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKfQoKQ09OVEFJTkVSLnBvcE91dCA9IHBvcG91dF9jb250YWluZXI7CgpmdW5jdGlvbiBEdWFsQ2xpY2soc2luZ2xlX2Z1bmMsIGRibF9mdW5jKSB7CiAgbGV0IG5jbGlja3MgPSAwOwogIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykgewogICAgbmNsaWNrcyArPSAxOwogICAgaWYgKG5jbGlja3MgPiAxKSB7CiAgICAgIGRibF9mdW5jKC4uLmFyZ3MpOwogICAgICBuY2xpY2tzID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIGRlbGF5KDMwMCkudGhlbigoKSA9PiB7CiAgICAgICAgaWYgKG5jbGlja3MgPT0gMSkgewogICAgICAgICAgc2luZ2xlX2Z1bmMoLi4uYXJncyk7CiAgICAgICAgfQogICAgICAgIG5jbGlja3MgPSAwOwogICAgICB9KTsKICAgIH0KICB9Owp9CgovLyBXZSByZW1vdmUgdGhlIGRlZmF1bHQgZG93bmxvYWQgaW1hZ2UgYnV0dG9uCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSwKICBbInRvSW1hZ2UiXQopOwovLyBXZSBhZGQgdGhlIGN1c3RvbSBidXR0b24gdG8gdGhlIG1vZGViYXIKcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkLAogIFsKICAgIHsKICAgICAgbmFtZTogIkNvcHkgUE5HIHRvIENsaXBib2FyZCIsCiAgICAgIGljb246IHsKICAgICAgICBoZWlnaHQ6IDUyMCwKICAgICAgICB3aWR0aDogNTIwLAogICAgICAgIHBhdGg6ICJNMjgwIDY0aDQwYzM1LjMgMCA2NCAyOC43IDY0IDY0VjQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEg2NGMtMzUuMyAwLTY0LTI4LjctNjQtNjRWMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0aDQwIDkuNkMxMjEgMjcuNSAxNTMuMyAwIDE5MiAwczcxIDI3LjUgNzguNCA2NEgyODB6TTY0IDExMmMtOC44IDAtMTYgNy4yLTE2IDE2VjQ0OGMwIDguOCA3LjIgMTYgMTYgMTZIMzIwYzguOCAwIDE2LTcuMiAxNi0xNlYxMjhjMC04LjgtNy4yLTE2LTE2LTE2SDMwNHYyNGMwIDEzLjMtMTAuNyAyNC0yNCAyNEgxOTIgMTA0Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNFYxMTJINjR6bTEyOC04YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHoiLAogICAgICB9LAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soY29weUltYWdlVG9DbGlwYm9hcmQsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKCk7CiAgICAgIH0pLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIkRvd25sb2FkIEltYWdlIiwKICAgICAgaWNvbjogUGxvdGx5Lkljb25zLmNhbWVyYSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKHNhdmVJbWFnZVRvRmlsZSwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoeyBjbDogImZpbGVzYXZlIiB9KTsKICAgICAgfSksCiAgICB9LAogIF0KKTsKCmZ1bmN0aW9uIGdldE9mZnNldERhdGEoZWwpIHsKICBsZXQgY3MgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgbnVsbCk7CiAgY29uc3Qgb2RhdGEgPSB7CiAgICBwYWRkaW5nOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgfSwKICAgIGJvcmRlcjogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgfQogIH07CiAgaWYgKGVsID09PSBQTE9UKSB7CiAgICAvLyBGb3IgdGhlIFBMT1Qgd2UgYWxzbyB3YW50IHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBvZmZzZXQKICAgIG9kYXRhLm9mZnNldCA9IHsKICAgICAgdG9wOiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldFRvcCA6IDAsCiAgICAgIGxlZnQ6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0TGVmdCA6IDAsCiAgICB9CiAgfQogIHJldHVybiBvZGF0YTsKfQpmdW5jdGlvbiBnZXRTaXplRGF0YSgpIHsKICBjb25zdCBkYXRhID0gewogICAgcGxvdF9wYWQ6IGdldE9mZnNldERhdGEoUExPVCksCiAgICBwbG90X3JlY3Q6IFBMT1QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgICBjb250YWluZXJfcGFkOiBnZXRPZmZzZXREYXRhKENPTlRBSU5FUiksCiAgICBjb250YWluZXJfcmVjdDogQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogIH07CiAgcmV0dXJuIGRhdGE7Cn0KZnVuY3Rpb24gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGNvbnN0IGNvbXB1dGVkX3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIGNvbnN0IG9mZnNldHMgPSBjb21wdXRlZF9zaXplLm9mZnNldHM7CgogIGNvbnN0IHBsb3RfZGF0YSA9IHsKICAgIHdpZHRoOiB3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiBoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfTsKCiAgcmV0dXJuIHsKICAgIHdpZHRoOiAod2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCkgKyBvZmZzZXRzLndpZHRoLAogICAgaGVpZ2h0OiAoaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0KSArIG9mZnNldHMuaGVpZ2h0LAogICAgbm9DaGFuZ2U6IHdpZHRoID09IGNvbXB1dGVkX3NpemUud2lkdGggJiYgaGVpZ2h0ID09IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH0KfQoKLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGNoYW5nZSB0aGUgY29udGFpbmVyIHNpemUgc28gdGhhdCB0aGUgcmVzdWx0aW5nIHBsb3Qgd2lsbCBiZSBtYXRjaGluZyB0aGUgcHJvdmlkZWQgc3BlY3MKZnVuY3Rpb24gY2hhbmdlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgaWYgKCFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgY29uc29sZS5sb2coIlRyaWVkIHRvIGNoYW5nZSBjb250YWluZXIgc2l6ZSB3aGVuIG5vdCBwb3BwZWQsIGlnbm9yaW5nIik7CiAgICByZXR1cm47CiAgfQoKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEpOwoKICBpZiAoY3N6Lm5vQ2hhbmdlKSB7CiAgICBjb25zb2xlLmxvZygiU2l6ZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50LCBpZ25vcmluZyIpOwogICAgcmV0dXJuCiAgfQogIC8vIFdlIGFyZSBub3cgZ29pbmcgdG8gc2V0IGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGNvbnRhaW5lcgogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gY3N6W2tleV0gKyAicHgiOwogIH0KfQovLyBXZSBub3cgY3JlYXRlIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgdXBkYXRlIHRoZSBwbG90IGJhc2VkIG9uIHRoZSB2YWx1ZXMgc3BlY2lmaWVkCmZ1bmN0aW9uIHVwZGF0ZUZyb21IZWFkZXIoKSB7CiAgY29uc3QgaGVhZGVyX2RhdGEgPSB7CiAgICBoZWlnaHQ6IGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUsCiAgICB3aWR0aDogY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlLAogIH07CiAgY2hhbmdlQ29udGFpbmVyU2l6ZShoZWFkZXJfZGF0YSk7Cn0KLy8gV2UgYXNzaWduIHRoaXMgZnVuY3Rpb24gdG8gdGhlIG9uYmx1ciBldmVudCBvZiB3aWR0aCBhbmQgaGVpZ2h0CmlmIChmaXJzdFJ1bikgewogIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLnVpX3NwYW4ub25ibHVyID0gKGUpID0+IHsKICAgICAgY29udGFpbmVyLnVpX3ZhbHVlID0gY29udGFpbmVyLnVpX3NwYW4udGV4dENvbnRlbnQ7CiAgICAgIHVwZGF0ZUZyb21IZWFkZXIoKTsKICAgIH07CiAgfQp9Ci8vIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIHBsb3Qgc2l6ZSB0byB1c2UgZm9yIHJlbGF5b3V0IGFzIGEgZnVuY3Rpb24gb2YgdGhlIGNvbnRhaW5lciBzaXplCmZ1bmN0aW9uIGNvbXB1dGVQbG90U2l6ZShkYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIC8vIFJlbW92ZSBQYWRkaW5nCiAgY29uc3QgeyBjb250YWluZXJfcGFkLCBwbG90X3BhZCwgY29udGFpbmVyX3JlY3QgfSA9IGRhdGE7CiAgY29uc3Qgb2Zmc2V0cyA9IHsKICAgIHdpZHRoOgogICAgICBwbG90X3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLndpZHRoICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LmxlZnQgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci53aWR0aCwKICAgIGhlaWdodDoKICAgICAgcGxvdF9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBwbG90X3BhZC5ib3JkZXIuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LnRvcCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci5oZWlnaHQsCiAgfTsKICBjb25zdCBzeiA9IHsKICAgIHdpZHRoOiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LndpZHRoIC0gb2Zmc2V0cy53aWR0aCksCiAgICBoZWlnaHQ6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3QuaGVpZ2h0IC0gb2Zmc2V0cy5oZWlnaHQpLAogICAgb2Zmc2V0cywKICB9OwogIHJldHVybiBzejsKfQoKLy8gQ3JlYXRlIHRoZSByZXNpemVPYnNlcnZlciB0byBtYWtlIHRoZSBwbG90IGV2ZW4gbW9yZSByZXNwb25zaXZlISA6bWFnaWM6CmNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7CiAgY29uc3Qgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpOwogIGNvbnN0IHtjb250YWluZXJfcmVjdCwgY29udGFpbmVyX3BhZH0gPSBzaXplRGF0YTsKICBsZXQgcGxvdF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICAvLyBXZSBzYXZlIHRoZSBoZWlnaHQgaW4gdGhlIFBMT1Qgb2JqZWN0CiAgUExPVC5jb250YWluZXJfaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0OwogIC8vIFdlIGRlYWwgd2l0aCBzb21lIHN0dWZmIGlmIHRoZSBjb250YWluZXIgaXMgcG9wcHBlZAogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSBjb250YWluZXJfcmVjdC53aWR0aCArICJweCI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gY29udGFpbmVyX3JlY3QubGVmdCArICJweCI7CiAgY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS5oZWlnaHQ7CiAgY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlID0gcGxvdF9zaXplLndpZHRoOwogIC8qIAoJCVRoZSBhZGRpdGlvbiBvZiB0aGUgaW52YWxpZCBhcmd1bWVudCBgcGx1dG9yZXNpemVgIHNlZW1zIHRvIGZpeCB0aGUgcHJvYmxlbSB3aXRoIGNhbGxpbmcgYHJlbGF5b3V0YCBzaW1wbHkgd2l0aCBge2F1dG9zaXplOiB0cnVlfWAgYXMgdXBkYXRlIGJyZWFraW5nIG1vdXNlIHJlbGF5b3V0IGV2ZW50cyB0cmFja2luZy4gCgkJU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wbG90bHkvcGxvdGx5LmpzL2lzc3Vlcy82MTU2IGZvciBkZXRhaWxzCgkJKi8KICBsZXQgY29uZmlnID0gewogICAgLy8gSWYgdGhpcyBpcyBwb3BwZWQgb3V0LCB3ZSBpZ25vcmUgdGhlIG9yaWdpbmFsIHdpZHRoL2hlaWdodAogICAgd2lkdGg6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX3dpZHRoKSA/PyBwbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX2hlaWdodCkgPz8gcGxvdF9zaXplLmhlaWdodCwKICAgIHBsdXRvcmVzaXplOiB0cnVlLAogIH07CiAgUGxvdGx5LnJlbGF5b3V0KFBMT1QsIGNvbmZpZykudGhlbigoKSA9PiB7CiAgICBpZiAocmVtb3ZlX2NvbnRhaW5lcl9zaXplICYmICFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBhdm9pZCB0aGUgZmlyc3QgcmVzaXplIHVwb24gcGxvdCBjcmVhdGlvbiB0byBhbHJlYWR5IGJlIHdpdGhvdXQgYSBmaXhlZCBoZWlnaHQKICAgICAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9ICIiOwogICAgICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICAgICAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmFsc2U7CiAgICB9CiAgfSk7Cn0pOwoKcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShDT05UQUlORVIpOwoKClBsb3RseS5yZWFjdChQTE9ULCBwbG90X29iaikudGhlbigoKSA9PiB7CgkvLyBBc3NpZ24gdGhlIFBsb3RseSBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhwbG90bHlfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1Qub24oa2V5LCBsaXN0ZW5lcikKCQl9Cgl9CgkvLyBBc3NpZ24gdGhlIEpTIGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKGpzX2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULmFkZEV2ZW50TGlzdGVuZXIoa2V5LCBsaXN0ZW5lciwgewoJCQkJc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbAoJCQl9KQoJCX0KCX0KfQopCgoKaW52YWxpZGF0aW9uLnRoZW4oKCkgPT4gewoJLy8gUmVtb3ZlIGFsbCBwbG90bHkgbGlzdGVuZXJzCglQTE9ULnJlbW92ZUFsbExpc3RlbmVycygpCgkvLyBSZW1vdmUgYWxsIEpTIGxpc3RlbmVycwoJY29udHJvbGxlci5hYm9ydCgpCgkvLyBSZW1vdmUgdGhlIHJlc2l6ZU9ic2VydmVyCglyZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCkKfSkKCgoKCQlyZXR1cm4gQ09OVEFJTkVSCgk8L3NjcmlwdD4KpG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv8hOOPetsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQ5YTg4YTU0Yi1iY2M3LTQxYWQtOGU2MC1mNGQ0NTBkY2NiMmS5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4iEk2VtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5HZNTdiY2MwNWIwLTgxZGEtMTFlZi0yMDQwLTM1ODVjOWI0OTU0Zi84N2FjYzllNDgwYzViMWJhuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJGM0N2E1MGI4LWM5MzAtNGM5Ni05YjM0LTI3NzIxODY2MzRkOYqmcXVldWVkwqRsb2dzk4ikbGluZf+jbXNnktmSVGhlIEdQVSBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQgYnV0IHRoZSBHUFUgaXMgbm90IGFjY2Vzc2libGUuCkRlZmF1bHRpbmcgYmFjayB0byB0aGUgQ1BVLiAoTm8gYWN0aW9uIGlzIHJlcXVpcmVkIGlmIHlvdSB3YW50IHRvIHJ1biBvbiB0aGUgQ1BVKS6qdGV4dC9wbGFpbqdjZWxsX2lk2SRjNDdhNTBiOC1jOTMwLTRjOTYtOWIzNC0yNzcyMTg2NjM0ZDmma3dhcmdzkKJpZLRLb21hTVJJQ29yZV9mNzNjNzBhZaRmaWxl2U0vaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL0tvbWFNUklDb3JlL3dQZ3M3L3NyYy9zaW11bGF0aW9uL0dQVUZ1bmN0aW9ucy5qbKVncm91cKxHUFVGdW5jdGlvbnOlbGV2ZWykSW5mb4ikbGluZf+jbXNnktkuUnVubmluZyBzaW11bGF0aW9uIGluIHRoZSBDUFUgd2l0aCAyIHRocmVhZChzKap0ZXh0L3BsYWlup2NlbGxfaWTZJGM0N2E1MGI4LWM5MzAtNGM5Ni05YjM0LTI3NzIxODY2MzRkOaZrd2FyZ3OVkqxrb21hX3ZlcnNpb26SqHYiMC44LjMiqnRleHQvcGxhaW6SqnNpbV9tZXRob2SShaZwcmVmaXixS29tYU1SSUNvcmUuQmxvY2ioZWxlbWVudHOQpHR5cGWmc3RydWN0rHByZWZpeF9zaG9ydKVCbG9jaKhvYmplY3RpZLBmZmZmZmZmZjJhZjZkOGRh2SFhcHBsaWNhdGlvbi92bmQucGx1dG8udHJlZStvYmplY3SSpXNwaW5zkqIyMKp0ZXh0L3BsYWlukqt0aW1lX3BvaW50c5KjMTE2qnRleHQvcGxhaW6SqmFkY19wb2ludHOSozEwMKp0ZXh0L3BsYWluomlktEtvbWFNUklDb3JlXzZiZmQ4OWVhpGZpbGXZTi9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvS29tYU1SSUNvcmUvd1Bnczcvc3JjL3NpbXVsYXRpb24vU2ltdWxhdG9yQ29yZS5qbKVncm91cK1TaW11bGF0b3JDb3JlpWxldmVspEluZm+IpGxpbmX/o21zZ5LaAmkNG1szMm1Qcm9ncmVzczogICA5JXzilojilojilojiloogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgRVRBOiAwOjAxOjIwG1szOW0bW0sNChtbMzRtICBzaW11bGF0ZWRfYmxvY2tzOiAgMhtbMzltG1tLDQobWzM0bSAgcmZfYmxvY2tzOiAgICAgICAgIDEbWzM5bRtbSw0KG1szNG0gIGFjcV9zYW1wbGVzOiAgICAgICAwG1szOW0bW0sNG1tBDRtbQQ0bW0EKCgoNG1tLG1tBDRtbSxtbQQ0bW0sbW0ENG1szMm1Qcm9ncmVzczogMTAwJXzilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojilojiloh8IFRpbWU6IDA6MDA6MDkbWzM5bRtbSw0KG1szNG0gIHNpbXVsYXRlZF9ibG9ja3M6ICAyMhtbMzltG1tLDQobWzM0bSAgcmZfYmxvY2tzOiAgICAgICAgIDMbWzM5bRtbSw0KG1szNG0gIGFjcV9zYW1wbGVzOiAgICAgICAxMDAbWzM5bRtbSwogMTAuNDE0NzU2IHNlY29uZHMgKDEyLjAyIE0gYWxsb2NhdGlvbnM6IDc5NS4zNzkgTWlCLCAxLjc1JSBnYyB0aW1lLCAxNzIuMjclIGNvbXBpbGF0aW9uIHRpbWUpCqp0ZXh0L3BsYWlup2NlbGxfaWTZJGM0N2E1MGI4LWM5MzAtNGM5Ni05YjM0LTI3NzIxODY2MzRkOaZrd2FyZ3OQomlktFBsdXRvUnVubmVyX2QxYWNiODFlpGZpbGXZUi9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUGx1dG8vUnZlR0gvc3JjL3J1bm5lci9QbHV0b1J1bm5lci9zcmMvUGx1dG9SdW5uZXIuamylZ3JvdXCrUGx1dG9SdW5uZXKlbGV2ZWyuTG9nTGV2ZWwoLTU1NSmncnVubmluZ8Kmb3V0cHV0hqRib2R52TxSYXdBY3F1aXNpdGlvbkRhdGFbU2VxTmFtZTogTm9OYW1lIHwgMSBQcm9maWxlKHMpIG9mIDEwMMOXMV2kbWltZap0ZXh0L3BsYWlurHJvb3Rhc3NpZ25lZaNyYXeybGFzdF9ydW5fdGltZXN0YW1wy0HZv8hMq0fLsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SRjNDdhNTBiOC1jOTMwLTRjOTYtOWIzNC0yNzcyMTg2NjM0ZDm5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc8AAAAEl1/N4bVwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDQxZDE0ZGVjLWI4NTItNDMxNi1hZWZiLWMzZDA4ZmE0MzIxNoqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnaaokJPHNjcmlwdCBpZD0ncGxvdF8xJz4KCQkvLyBXZSBzdGFydCBieSBwdXR0aW5nIGFsbCB0aGUgdmFyaWFibGUgaW50ZXJwb2xhdGlvbiBoZXJlIGF0IHRoZSBiZWdpbm5pbmcKCQkvLyBXZSBoYXZlIHRvIGNvbnZlcnQgYWxsIHR5cGVkYXJyYXlzIGluIHRoZSBsYXlvdXQgdG8gbm9ybWFsIGFycmF5cy4gU2VlIElzc3VlICMyNQoJCS8vIFdlIHVzZSBsb2Rhc2ggZm9yIHRoaXMgZm9yIGNvbXBhY3RuZXNzCgkJZnVuY3Rpb24gcmVtb3ZlVHlwZWRBcnJheShvKSB7CgkJCXJldHVybiBfLmlzVHlwZWRBcnJheShvKSA/IEFycmF5LmZyb20obykgOgoJCQlfLmlzUGxhaW5PYmplY3QobykgPyBfLm1hcFZhbHVlcyhvLCByZW1vdmVUeXBlZEFycmF5KSA6IAoJCQlvCgkJfQoKCQkvLyBQdWJsaXNoIHRoZSBwbG90IG9iamVjdCB0byBKUwoJCWxldCBwbG90X29iaiA9IF8udXBkYXRlKC8qIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgQWJzdHJhY3RQbHV0b0RpbmdldGplcy5EaXNwbGF5LnB1Ymxpc2hlZF90b19qcyAqLyBnZXRQdWJsaXNoZWRPYmplY3QoIjdiY2MwNWIwLTgxZGEtMTFlZi0yMDQwLTM1ODVjOWI0OTU0Zi85ZGYzNmM1MTczODdlNzllIiksICJsYXlvdXQiLCByZW1vdmVUeXBlZEFycmF5KQoJCS8vIEdldCB0aGUgcGxvdGx5IGxpc3RlbmVycwoJCWNvbnN0IHBsb3RseV9saXN0ZW5lcnMgPSB7fQoJCS8vIEdldCB0aGUgSlMgbGlzdGVuZXJzCgkJY29uc3QganNfbGlzdGVuZXJzID0ge30KCQkvLyBEZWFsIHdpdGggZXZlbnR1YWwgY3VzdG9tIGNsYXNzZXMKCQlsZXQgY3VzdG9tX2NsYXNzbGlzdCA9IFtdCgoKCQkvLyBMb2FkIHRoZSBwbG90bHkgbGlicmFyeQoJCWxldCBQbG90bHkgPSB1bmRlZmluZWQKCQl0cnkgewoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiLi9wbG90bHlqcy9wbG90bHlqcy0yLjI2LjIubWluLmpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfSBjYXRjaCAoZSkgewoJCQljb25zb2xlLmxvZygiTG9jYWwgbG9hZCBmYWlsZWQsIHRyeWluZyB3aXRoIHRoZSB3ZWIgZXNtLnNoIHZlcnNpb24iKQoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiaHR0cHM6Ly9lc20uc2gvdjEzNS9wbG90bHkuanMtZGlzdC1taW5AMi4yNi4yL2VzbmV4dC9wbG90bHkuanMtZGlzdC1taW4ubWpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfQoKCQkvLyBDaGVjayBpZiB3ZSBoYXZlIHRvIGZvcmNlIGxvY2FsIG1hdGhqYXggZm9udCBjYWNoZQoJCWlmIChmYWxzZSAmJiB3aW5kb3c/Lk1hdGhKYXg/LmNvbmZpZz8uc3ZnPy5mb250Q2FjaGUgPT09ICdnbG9iYWwnKSB7CgkJCXdpbmRvdy5NYXRoSmF4LmNvbmZpZy5zdmcuZm9udENhY2hlID0gJ2xvY2FsJwoJCX0KCgkJLy8gRmxhZyB0byBjaGVjayBpZiB0aGlzIGNlbGwgd2FzICBtYW51YWxseSByYW4gb3IgcmVhY3RpdmVseSByYW4KY29uc3QgZmlyc3RSdW4gPSB0aGlzID8gZmFsc2UgOiB0cnVlCmNvbnN0IENPTlRBSU5FUiA9IHRoaXMgPz8gaHRtbGA8ZGl2IGNsYXNzPSdwbHV0b3Bsb3RseS1jb250YWluZXInPmAKY29uc3QgUExPVCA9IENPTlRBSU5FUi5xdWVyeVNlbGVjdG9yKCcuanMtcGxvdGx5LXBsb3QnKSA/PyBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2PmApCmNvbnN0IHBhcmVudCA9IENPTlRBSU5FUi5wYXJlbnRFbGVtZW50Ci8vIFdlIHVzZSBhIGNvbnRyb2xsZXIgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVycyB1cG9uIGludmFsaWRhdGlvbgpjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpCi8vIFdlIGhhdmUgdG8gYWRkIHRoaXMgdG8ga2VlcCBzdXBwb3J0aW5nIEBiaW5kIHdpdGggdGhlIG9sZCBBUEkgdXNpbmcgUExPVApQTE9ULmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGUpID0+IHsKCUNPTlRBSU5FUi52YWx1ZSA9IFBMT1QudmFsdWUKCWlmIChlLmJ1YmJsZXMpIHsKCQlyZXR1cm4KCX0KCUNPTlRBSU5FUi5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnaW5wdXQnKSkKfSwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pCgoJLy8gVGhpcyBjcmVhdGUgdGhlIHN0eWxlIHN1YmRpdiBvbiBmaXJzdCBydW4KCWZpcnN0UnVuICYmIENPTlRBSU5FUi5hcHBlbmRDaGlsZChodG1sYAoJPHN0eWxlPgoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciB7CgkJd2lkdGg6IDEwMCU7CgkJaGVpZ2h0OiAxMDAlOwoJCW1pbi1oZWlnaHQ6IDA7CgkJbWluLXdpZHRoOiAwOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciAuanMtcGxvdGx5LXBsb3QgLnBsb3RseSBkaXYgewoJCW1hcmdpbjogMCBhdXRvOyAvLyBUaGlzIGNlbnRlcnMgdGhlIHBsb3QKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIucG9wcGVkLW91dCB7CgkJb3ZlcmZsb3c6IGF1dG87CgkJei1pbmRleDogMTAwMDsKCQlwb3NpdGlvbjogZml4ZWQ7CgkJcmVzaXplOiBib3RoOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMHB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwcHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciB7CgkJZGlzcGxheTogZmxleDsKCQlmbGV4LWZsb3c6IHJvdyB3cmFwOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDEycHg7CgkJcG9zaXRpb246IGZpeGVkOwoJCXotaW5kZXg6IDEwMDE7CgkJY3Vyc29yOiBtb3ZlOwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgLTEwMCUpOwoJCXBhZGRpbmc6IDVweDsKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIHNwYW4gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQlmbGV4OiAxCgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlci5oaWRkZW4gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuY2xpcGJvYXJkLXNwYW4gewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCX0KCS5jbGlwYm9hcmQtdmFsdWUgewoJCXBhZGRpbmctcmlnaHQ6IDVweDsKCQlwYWRkaW5nLWxlZnQ6IDJweDsKCQljdXJzb3I6IHRleHQ7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlmbGV4OiAwIDAgMTAwJTsKCQl0ZXh0LWFsaWduOiBjZW50ZXI7CgkJYm9yZGVyLXRvcDogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCW1hcmdpbi10b3A6IDVweDsKCQlkaXNwbGF5OiBub25lOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5maWxlc2F2ZSAuY2xpcGJvYXJkLXNwYW4uZmlsZW5hbWUgewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5jbGlwYm9hcmQtdmFsdWUuZmlsZW5hbWUgewoJCW1hcmdpbi1sZWZ0OiAzcHg7CgkJdGV4dC1hbGlnbjogbGVmdDsKCQltaW4td2lkdGg6IG1pbig2MCUsIG1pbi1jb250ZW50KTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogaW5saW5lLWZsZXg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IC5sYWJlbCB7CgkJZmxleDogMCAwIDA7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZvcm1hdCB7CgkJcG9zaXRpb246IHJlbGF0aXZlOwoJCWZsZXg6IDEgMCBhdXRvOwoJCW1pbi13aWR0aDogMzBweDsKCQltYXJnaW4tcmlnaHQ6IDEwcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJCWZsZXgtZmxvdzogY29sdW1uOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXBhZGRpbmctbGVmdDogM3B4OwoJCXotaW5kZXg6IDIwMDA7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgewoJCWN1cnNvcjogcG9pbnRlcjsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlwYWRkaW5nOiAzcHg7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTNweCwgLTZweCk7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5mb3JtYXQtb3B0aW9uOm5vdCguc2VsZWN0ZWQpIHsKCQltYXJnaW4tdG9wOiAzcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24uc2VsZWN0ZWQgewoJCW9yZGVyOiAtMTsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpob3ZlciB7CgkJYmFja2dyb3VuZC1jb2xvcjogdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7Cgl9CglzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZm9udC13ZWlnaHQ6IG5vcm1hbDsKCQljb2xvcjogdmFyKC0tcGx1dG8tb3V0cHV0LWNvbG9yKTsKCQlkaXNwbGF5OiBub25lOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgY2FsYygtMTAwJSAtIDEwcHgpKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkubGFiZWwgewoJCXVzZXItc2VsZWN0OiBub25lOwoJfQoJLmxhYmVsOmhvdmVyIHNwYW4uY29uZmlnLXZhbHVlIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJbWluLXdpZHRoOiAxNTBweDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5tYXRjaGluZy1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tbWFjcm8tY29sb3IpOwoJCWZvbnQtd2VpZ2h0OiBib2xkOwoJfQoJLmNsaXBib2FyZC1zcGFuLmRpZmZlcmVudC1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tdGFnLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KPC9zdHlsZT4KYCkKCmxldCBvcmlnaW5hbF9oZWlnaHQgPSBwbG90X29iai5sYXlvdXQuaGVpZ2h0CmxldCBvcmlnaW5hbF93aWR0aCA9IHBsb3Rfb2JqLmxheW91dC53aWR0aAovLyBGb3IgdGhlIGhlaWdodCB3ZSBoYXZlIHRvIGFsc28gcHV0IGEgZml4ZWQgdmFsdWUgaW4gY2FzZSB0aGUgcGxvdCBpcyBwdXQgb24gYSBub24tZml4ZWQtc2l6ZSBjb250YWluZXIgKGxpa2UgdGhlIGRlZmF1bHQgd3JhcHBlcikKLy8gV2UgZGVmaW5lIGEgdmFyaWFibGUgdG8gY2hlY2sgd2hldGhlciB3ZSBzdGlsbCBoYXZlIHRvIHJlbW92ZSB0aGUgZml4ZWQgaGVpZ2h0CmxldCByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmaXJzdFJ1bgpsZXQgY29udGFpbmVyX2hlaWdodCA9IG9yaWdpbmFsX2hlaWdodCA/PyBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPz8gNDAwCkNPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfaGVpZ2h0ICsgJ3B4JwoKLy8gV2UgY3JlYXRlIGEgUHJvbWlzZSB2ZXJzaW9uIG9mIHNldFRpbWVvdXQKZnVuY3Rpb24gZGVsYXkobXMpIHsKICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTsKfQoKLy8gV2UgaW1wb3J0IGludGVyYWN0IGZvciBkcmFnZ2luZy9yZXNpemluZwpjb25zdCB7IGRlZmF1bHQ6IGludGVyYWN0IH0gPSBhd2FpdCBpbXBvcnQoJ2h0dHBzOi8vZXNtLnNoL2ludGVyYWN0anNAMS4xMC4xOScpCgoKZnVuY3Rpb24gZ2V0SW1hZ2VPcHRpb25zKCkgewogIGNvbnN0IG8gPSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPz8ge307CiAgcmV0dXJuIHsKICAgIGZvcm1hdDogby5mb3JtYXQgPz8gInBuZyIsCiAgICB3aWR0aDogby53aWR0aCA/PyBvcmlnaW5hbF93aWR0aCwKICAgIGhlaWdodDogby5oZWlnaHQgPz8gb3JpZ2luYWxfaGVpZ2h0LAogICAgc2NhbGU6IG8uc2NhbGUgPz8gMSwKICAgIGZpbGVuYW1lOiBvLmZpbGVuYW1lID8/ICJuZXdwbG90IiwKICB9Owp9Cgpjb25zdCBDTElQQk9BUkRfSEVBREVSID0KICBDT05UQUlORVIucXVlcnlTZWxlY3RvcigiLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIiKSA/PwogIENPTlRBSU5FUi5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAiYWZ0ZXJiZWdpbiIsCiAgICBodG1sYDxkaXYgY2xhc3M9InBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgaGlkZGVuIj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZvcm1hdCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5Gb3JtYXQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZm9ybWF0Ij48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHdpZHRoIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPldpZHRoOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIHdpZHRoIj48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gaGVpZ2h0IgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkhlaWdodDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBoZWlnaHQiPjwvc3Bhbj5weDwvc3BhbgogICAgICA+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzY2FsZSIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5TY2FsZTo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBzY2FsZSI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHNldCI+U2V0PC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHVuc2V0Ij5VbnNldDwvYnV0dG9uPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gZmlsZW5hbWUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+RmlsZW5hbWU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZmlsZW5hbWUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgPC9kaXY+YAogICk7CgpmdW5jdGlvbiBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKSB7CiAgY29uc3QgdmFsaWRfY2xhc3NlcyA9IFsKICAgICJtaXNzaW5nLWNvbmZpZyIsCiAgICAibWF0Y2hpbmctY29uZmlnIiwKICAgICJkaWZmZXJlbnQtY29uZmlnIiwKICBdOwogIGZ1bmN0aW9uIHNldENsYXNzKGNsKSB7CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgdmFsaWRfY2xhc3NlcykgewogICAgICBjb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZShuYW1lLCBuYW1lID09IGNsKTsKICAgIH0KICB9CiAgLy8gV2UgdXNlIHRoZSBjdXN0b20gZ2V0dGVycyB3ZSdsbCBzZXQgdXAgaW4gdGhlIGNvbnRhaW5lcgogIGNvbnN0IHsgdWlfdmFsdWUsIGNvbmZpZ192YWx1ZSwgY29uZmlnX3NwYW4sIGtleSB9ID0gY29udGFpbmVyOwogIGlmIChjb25maWdfdmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgc2V0Q2xhc3MoIm1pc3NpbmctY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGlzIG5vdCBwcmVzZW50IGluIHRoZSBjb25maWcuYDsKICB9IGVsc2UgaWYgKHVpX3ZhbHVlID09IGNvbmZpZ192YWx1ZSkgewogICAgc2V0Q2xhc3MoIm1hdGNoaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgdGhlIHNhbWUgdmFsdWUgaW4gdGhlIGNvbmZpZyBhbmQgaW4gdGhlIGhlYWRlci5gOwogIH0gZWxzZSB7CiAgICBzZXRDbGFzcygiZGlmZmVyZW50LWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgYSBkaWZmZXJlbnQgdmFsdWUgKDxlbT4ke2NvbmZpZ192YWx1ZX08L2VtPikgaW4gdGhlIGNvbmZpZy5gOwogIH0KICAvLyBBZGQgaW5mbyBhYm91dCBzZXR0aW5nIGFuZCB1bnNldHRpbmcKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgb24gdGhlIGxhYmVsIDxlbT48Yj5vbmNlPC9iPjwvZW0+IHRvIHNldCB0aGUgY3VycmVudCBVSSB2YWx1ZSBpbiB0aGUgY29uZmlnLmAKICApOwogIGNvbmZpZ19zcGFuLmluc2VydEFkamFjZW50SFRNTCgKICAgICJiZWZvcmVlbmQiLAogICAgYDxicj5DbGljayA8ZW0+PGI+dHdpY2U8L2I+PC9lbT4gdG8gcmVtb3ZlIHRoaXMga2V5IGZyb20gdGhlIGNvbmZpZy5gCiAgKTsKfQoKY29uc3QgdmFsaWRfZm9ybWF0cyA9IFsicG5nIiwgInN2ZyIsICJ3ZWJwIiwgImpwZWciLCAiZnVsbC1qc29uIl07CmZ1bmN0aW9uIGluaXRpYWxpemVVSVZhbHVlU3BhbihzcGFuLCBrZXksIHZhbHVlKSB7CiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9IGtleSA9PT0gImZvcm1hdCIgPyAiZmFsc2UiIDogInRydWUiOwogIGxldCBwYXJzZSA9ICh4KSA9PiB4OwogIGxldCB1cGRhdGUgPSAoeCkgPT4gKHNwYW4udGV4dENvbnRlbnQgPSB4KTsKICBpZiAoa2V5ID09PSAid2lkdGgiIHx8IGtleSA9PT0gImhlaWdodCIpIHsKICAgIHBhcnNlID0gKHgpID0+IE1hdGgucm91bmQocGFyc2VGbG9hdCh4KSk7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJzY2FsZSIpIHsKICAgIHBhcnNlID0gcGFyc2VGbG9hdDsKICB9IGVsc2UgaWYgKGtleSA9PT0gImZvcm1hdCIpIHsKICAgIC8vIFdlIHJlbW92ZSBjb250ZW50RWRpdGFibGUKICAgIHNwYW4uY29udGVudEVkaXRhYmxlID0gImZhbHNlIjsKICAgIC8vIEhlcmUgd2UgZmlyc3QgYWRkIHRoZSBzdWJzcGFucyBmb3IgZWFjaCBvcHRpb24KICAgIGNvbnN0IG9wdHNfZGl2ID0gc3Bhbi5hcHBlbmRDaGlsZChodG1sYDxkaXYgY2xhc3M9ImZvcm1hdC1vcHRpb25zIj48L2Rpdj5gKTsKICAgIGZvciAoY29uc3QgZm10IG9mIHZhbGlkX2Zvcm1hdHMpIHsKICAgICAgY29uc3Qgb3B0ID0gb3B0c19kaXYuYXBwZW5kQ2hpbGQoCiAgICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iZm9ybWF0LW9wdGlvbiAke2ZtdH0iPiR7Zm10fTwvc3Bhbj5gCiAgICAgICk7CiAgICAgIG9wdC5vbmNsaWNrID0gKGUpID0+IHsKICAgICAgICBzcGFuLnZhbHVlID0gb3B0LnRleHRDb250ZW50OwogICAgICB9OwogICAgfQogICAgcGFyc2UgPSAoeCkgPT4gewogICAgICByZXR1cm4gdmFsaWRfZm9ybWF0cy5pbmNsdWRlcyh4KSA/IHggOiBsb2NhbFZhbHVlOwogICAgfTsKICAgIHVwZGF0ZSA9ICh4KSA9PiB7CiAgICAgIGZvciAoY29uc3Qgb3B0IG9mIG9wdHNfZGl2LmNoaWxkcmVuKSB7CiAgICAgICAgb3B0LmNsYXNzTGlzdC50b2dnbGUoInNlbGVjdGVkIiwgb3B0LnRleHRDb250ZW50ID09PSB4KTsKICAgICAgfQogICAgfTsKICB9IGVsc2UgewogICAgLy8gV2Ugb25seSBoYXZlIGZpbGVuYW1lIGhlcmUKICB9CiAgbGV0IGxvY2FsVmFsdWU7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwYW4sICJ2YWx1ZSIsIHsKICAgIGdldDogKCkgPT4gewogICAgICByZXR1cm4gbG9jYWxWYWx1ZTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgaWYgKHZhbCAhPT0gIiIpIHsKICAgICAgICBsb2NhbFZhbHVlID0gcGFyc2UodmFsKTsKICAgICAgfQogICAgICB1cGRhdGUobG9jYWxWYWx1ZSk7CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKICAvLyBXZSBhbHNvIGFzc2lnbiBhIGxpc3RlbmVyIHNvIHRoYXQgdGhlIGVkaXRhYmxlIGlzIGJsdXJyZWQgd2hlbiBlbnRlciBpcyBwcmVzc2VkCiAgc3Bhbi5vbmtleWRvd24gPSAoZSkgPT4gewogICAgaWYgKGUua2V5Q29kZSA9PT0gMTMpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBzcGFuLmJsdXIoKTsKICAgIH0KICB9OwogIHNwYW4udmFsdWUgPSB2YWx1ZTsKfQoKZnVuY3Rpb24gaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3BhbihzcGFuLCBrZXkpIHsKICAvLyBIZXJlIHdlIG1vc3RseSB3YW50IHRvIGRlZmluZSB0aGUgc2V0dGVyIGFuZCBnZXR0ZXIKICBjb25zdCBjb250YWluZXIgPSBzcGFuLmNsb3Nlc3QoIi5jbGlwYm9hcmQtc3BhbiIpOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgfSwKICAgIHNldDogKHZhbCkgPT4gewogICAgICAvLyBpZiB1bmRlZmluZWQgaXMgcGFzc2VkLCB3ZSByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIG9wdGlvbnMKICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZGVsZXRlIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgICB9IGVsc2UgewogICAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldID0gdmFsOwogICAgICB9CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKfQoKY29uc3QgY29uZmlnX3NwYW5zID0ge307CmZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGdldEltYWdlT3B0aW9ucygpKSkgewogIGNvbnN0IGNvbnRhaW5lciA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcihgLmNsaXBib2FyZC1zcGFuLiR7a2V5fWApOwogIGNvbnN0IGxhYmVsID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5sYWJlbCIpOwogIC8vIFdlIGdpdmUgdGhlIGxhYmVsIGEgZnVuY3Rpb24gdGhhdCBvbiBzaW5nbGUgY2xpY2sgd2lsbCBzZXQgdGhlIGN1cnJlbnQgdmFsdWUgYW5kIHdpdGggZG91YmxlIGNsaWNrIHdpbGwgdW5zZXQgaXQKICBsYWJlbC5vbmNsaWNrID0gRHVhbENsaWNrKAogICAgKCkgPT4gewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfSwKICAgIChlKSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJlIiwgZSk7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IHVuZGVmaW5lZDsKICAgIH0KICApOwogIGNvbnN0IHVpX3ZhbHVlX3NwYW4gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC12YWx1ZSIpOwogIGNvbnN0IGNvbmZpZ192YWx1ZV9zcGFuID0KICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuY29uZmlnLXZhbHVlIikgPz8KICAgIGxhYmVsLmluc2VydEFkamFjZW50RWxlbWVudCgKICAgICAgImFmdGVyYmVnaW4iLAogICAgICBodG1sYDxzcGFuIGNsYXNzPSJjb25maWctdmFsdWUiPjwvc3Bhbj5gCiAgICApOwogIC8vIEFzc2luZyB0aGUgdHdvIHNwYW5zIGFzIHByb3BlcnRpZXMgb2YgdGhlIGNvbnRhaW5pbmcgc3BhbgogIGNvbnRhaW5lci51aV9zcGFuID0gdWlfdmFsdWVfc3BhbjsKICBjb250YWluZXIuY29uZmlnX3NwYW4gPSBjb25maWdfdmFsdWVfc3BhbjsKICBjb250YWluZXIua2V5ID0ga2V5OwogIGNvbmZpZ19zcGFuc1trZXldID0gY29udGFpbmVyOwogIGlmIChmaXJzdFJ1bikgewogICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID0KICAgICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogICAgLy8gV2UgZG8gdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSB2YWx1ZSBzcGFuCiAgICBpbml0aWFsaXplVUlWYWx1ZVNwYW4odWlfdmFsdWVfc3Bhbiwga2V5LCB2YWx1ZSk7CiAgICAvLyBUaGVuIHdlIGluaXRpYWxpemUgdGhlIGNvbmZpZyB2YWx1ZQogICAgaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3Bhbihjb25maWdfdmFsdWVfc3Bhbiwga2V5KTsKICAgIC8vIFdlIHB1dCBzb21lIGNvbnZlbmllbmNlIGdldHRlcnMvc2V0dGVycwogICAgLy8gdWlfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgInVpX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IHVpX3ZhbHVlX3NwYW4udmFsdWUsCiAgICAgIHNldDogKHZhbCkgPT4gewogICAgICAgIHVpX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICAgIC8vIGNvbmZpZ192YWx1ZSBmb3J3YXJkCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAiY29uZmlnX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IGNvbmZpZ192YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSA9IHZhbDsKICAgICAgfSwKICAgIH0pOwogIH0KfQoKLy8gVGhlc2Ugb2JqZWN0cyB3aWxsIGNvbnRhaW4gdGhlIGRlZmF1bHQgdmFsdWUKCi8vIFRoaXMgY29kZSB1cGRhdGVzIHRoZSBpbWFnZSBvcHRpb25zIGluIHRoZSBQTE9UIGNvbmZpZyB3aXRoIHRoZSBwcm92aWRlZCBvbmVzCmZ1bmN0aW9uIHNldEltYWdlT3B0aW9ucyhvKSB7CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBvW2tleV07CiAgfQp9CmZ1bmN0aW9uIHVuc2V0SW1hZ2VPcHRpb25zKCkgewogIHNldEltYWdlT3B0aW9ucyh7fSk7Cn0KCmNvbnN0IHNldF9idXR0b24gPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtc3Bhbi5zZXQiKTsKY29uc3QgdW5zZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4udW5zZXQiKTsKaWYgKGZpcnN0UnVuKSB7CiAgc2V0X2J1dHRvbi5vbmNsaWNrID0gKGUpID0+IHsKICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfQogIH07CiAgdW5zZXRfYnV0dG9uLm9uY2xpY2sgPSB1bnNldEltYWdlT3B0aW9uczsKfQoKLy8gV2UgYWRkIGEgZnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIGNsaXBib2FyZCBpcyBwb3BwZWQgb3V0CkNPTlRBSU5FUi5pc1BvcHBlZE91dCA9ICgpID0+IHsKICByZXR1cm4gQ09OVEFJTkVSLmNsYXNzTGlzdC5jb250YWlucygicG9wcGVkLW91dCIpOwp9OwoKQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNlZG93biA9IGZ1bmN0aW9uIChldmVudCkgewogIGlmIChldmVudC50YXJnZXQubWF0Y2hlcygic3Bhbi5jbGlwYm9hcmQtdmFsdWUiKSkgewogICAgY29uc29sZS5sb2coIldlIGRvbid0IG1vdmUhIik7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IHN0YXJ0ID0gewogICAgbGVmdDogcGFyc2VGbG9hdChDT05UQUlORVIuc3R5bGUubGVmdCksCiAgICB0b3A6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLnRvcCksCiAgICBYOiBldmVudC5wYWdlWCwKICAgIFk6IGV2ZW50LnBhZ2VZLAogIH07CiAgZnVuY3Rpb24gbW92ZUF0KGV2ZW50LCBzdGFydCkgewogICAgY29uc3QgdG9wID0gZXZlbnQucGFnZVkgLSBzdGFydC5ZICsgc3RhcnQudG9wICsgInB4IjsKICAgIGNvbnN0IGxlZnQgPSBldmVudC5wYWdlWCAtIHN0YXJ0LlggKyBzdGFydC5sZWZ0ICsgInB4IjsKICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUudG9wID0gdG9wOwogIH0KCiAgLy8gbW92ZSBvdXIgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGJhbGwgdW5kZXIgdGhlIHBvaW50ZXIKICBtb3ZlQXQoZXZlbnQsIHN0YXJ0KTsKICBmdW5jdGlvbiBvbk1vdXNlTW92ZShldmVudCkgewogICAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgfQoKICAvLyBXZSB1c2UgdGhpcyB0byByZW1vdmUgdGhlIG1vdXNlbW92ZSB3aGVuIGNsaWNraW5nIG91dHNpZGUgb2YgdGhlIGNvbnRhaW5lcgogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CgogIC8vIG1vdmUgdGhlIGNvbnRhaW5lciBvbiBtb3VzZW1vdmUKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCBvbk1vdXNlTW92ZSwgewogICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCwKICB9KTsKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICBjbGVhblVwKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKCiAgZnVuY3Rpb24gY2xlYW5VcCgpIHsKICAgIGNvbnNvbGUubG9nKCJjbGVhbmluZyB1cCB0aGUgcGxvdCBtb3ZlIGxpc3RlbmVyIik7CiAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICBDTElQQk9BUkRfSEVBREVSLm9ubW91c2V1cCA9IG51bGw7CiAgfQoKICAvLyAoMykgZHJvcCB0aGUgYmFsbCwgcmVtb3ZlIHVubmVlZGVkIGhhbmRsZXJzCiAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBjbGVhblVwOwp9OwoKZnVuY3Rpb24gc2VuZFRvQ2xpcGJvYXJkKGJsb2IpIHsKICBpZiAoIW5hdmlnYXRvci5jbGlwYm9hcmQpIHsKICAgIGFsZXJ0KAogICAgICAiVGhlIENsaXBib2FyZCBBUEkgZG9lcyBub3Qgc2VlbSB0byBiZSBhdmFpbGFibGUsIG1ha2Ugc3VyZSB0aGUgUGx1dG8gbm90ZWJvb2sgaXMgYmVpbmcgdXNlZCBmcm9tIGVpdGhlciBsb2NhbGhvc3Qgb3IgYW4gaHR0cHMgc291cmNlLiIKICAgICk7CiAgfQogIG5hdmlnYXRvci5jbGlwYm9hcmQKICAgIC53cml0ZShbCiAgICAgIG5ldyBDbGlwYm9hcmRJdGVtKHsKICAgICAgICAvLyBUaGUga2V5IGlzIGRldGVybWluZWQgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIGJsb2IncyB0eXBlLgogICAgICAgIFtibG9iLnR5cGVdOiBibG9iLAogICAgICB9KSwKICAgIF0pCiAgICAudGhlbigKICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgIGNvbnNvbGUubG9nKCJBc3luYzogQ29weWluZyB0byBjbGlwYm9hcmQgd2FzIHN1Y2Nlc3NmdWwhIik7CiAgICAgIH0sCiAgICAgIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJBc3luYzogQ291bGQgbm90IGNvcHkgdGV4dDogIiwgZXJyKTsKICAgICAgfQogICAgKTsKfQoKZnVuY3Rpb24gY29weUltYWdlVG9DbGlwYm9hcmQoKSB7CiAgLy8gV2UgZXh0cmFjdCB0aGUgaW1hZ2Ugb3B0aW9ucyBmcm9tIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzIChpZiB0aGV5IGV4aXN0KQogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuIFdlIGFsc28gaWdub3JlIGZvcm1hdCBiZWNhdXNlIHRoZSBjbGlwYm9hcmQgb25seSBzdXBwb3J0cyBwbmcuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwga2V5ID09PSAiZm9ybWF0IikgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbmZpZ1trZXldID0gdmFsOwogIH0KICBQbG90bHkudG9JbWFnZShQTE9ULCBjb25maWcpLnRoZW4oZnVuY3Rpb24gKGRhdGFVcmwpIHsKICAgIGZldGNoKGRhdGFVcmwpCiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5ibG9iKCkpCiAgICAgIC50aGVuKChibG9iKSA9PiB7CiAgICAgICAgY29uc3QgcGFzdGVfcmVjZWl2ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdwYXN0ZS1yZWNlaXZlci5wbHV0b3Bsb3RseScpCiAgICAgICAgaWYgKHBhc3RlX3JlY2VpdmVyKSB7CiAgICAgICAgICBwYXN0ZV9yZWNlaXZlci5hdHRhY2hJbWFnZShkYXRhVXJsLCBDT05UQUlORVIpCiAgICAgICAgfQogICAgICAgIHNlbmRUb0NsaXBib2FyZChibG9iKQogICAgICB9KTsKICB9KTsKfQoKZnVuY3Rpb24gc2F2ZUltYWdlVG9GaWxlKCkgewogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LmRvd25sb2FkSW1hZ2UoUExPVCwgY29uZmlnKTsKfQoKbGV0IGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwLCB0b3A6IDAsIGxlZnQ6IDAgfTsKZnVuY3Rpb24gdW5wb3BfY29udGFpbmVyKGNsKSB7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCBmYWxzZSk7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoY2wsIGZhbHNlKTsKICAvLyBXZSBmaXggdGhlIGhlaWdodCBiYWNrIHRvIHRoZSB2YWx1ZSBpdCBoYWQgYmVmb3JlIHBvcG91dCwgYWxzbyBzZXR0aW5nIHRoZSBmbGFnIHRvIHNpZ25hbCB0aGF0IHVwb24gZmlyc3QgcmVzaXplIHdlIHJlbW92ZSB0aGUgZml4ZWQgaW5saW5lLXN0eWxlCiAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9IGNvbnRhaW5lcl9yZWN0LmhlaWdodCArICJweCI7CiAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gdHJ1ZTsKICAvLyBXZSBzZXQgdGhlIG90aGVyIGZpeGVkIGlubGluZS1zdHlsZXMgdG8gbnVsbAogIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogIENPTlRBSU5FUi5zdHlsZS50b3AgPSAiIjsKICBDT05UQUlORVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIFdlIGFsc28gcmVtb3ZlIHRoZSBDTElQQk9BUkRfSEVBREVSCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9ICIiOwogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIEZpbmFsbHkgd2UgcmVtb3ZlIHRoZSBoaWRkZW4gY2xhc3MgdG8gdGhlIGhlYWRlcgogIENMSVBCT0FSRF9IRUFERVIuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgdHJ1ZSk7CiAgcmV0dXJuOwp9CmZ1bmN0aW9uIHBvcG91dF9jb250YWluZXIob3B0cykgewogIGNvbnN0IGNsID0gb3B0cz8uY2w7CiAgY29uc3QgdGFyZ2V0X2NvbnRhaW5lcl9zaXplID0gb3B0cz8udGFyZ2V0X2NvbnRhaW5lcl9zaXplID8/IHt9OwogIGNvbnN0IHRhcmdldF9wbG90X3NpemUgPSBvcHRzPy50YXJnZXRfcGxvdF9zaXplID8/IHt9OwogIGlmIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgcmV0dXJuIHVucG9wX2NvbnRhaW5lcihjbCk7CiAgfQogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBjbCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0cnVlKTsKICAvLyBXZSBleHRyYWN0IHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNvbnRhaW5lciwgc2F2ZSB0aGVtIGFuZCBmaXggdGhlbQogIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH0gPSBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgY29udGFpbmVyX3JlY3QgPSB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9OwogIC8vIFdlIHNhdmUgdGhlIGN1cnJlbnQgcGxvdCBzaXplIGJlZm9yZSB3ZSBwb3AgYXMgaXQgd2lsbCBmaWxsIHRoZSBzY3JlZW4KICBjb25zdCBjdXJyZW50X3Bsb3Rfc2l6ZSA9IHsKICAgIHdpZHRoOiBQTE9ULl9mdWxsTGF5b3V0LndpZHRoLAogICAgaGVpZ2h0OiBQTE9ULl9mdWxsTGF5b3V0LmhlaWdodCwKICB9OwogIC8vIFdlIGhhdmUgdG8gc2F2ZSB0aGUgcGFkIGRhdGEgYmVmb3JlIHBvcHBpbmcgc28gd2UgY2FuIHJlc2l6ZSBwcmVjaXNlbHkKICBjb25zdCBwYWQgPSB7fTsKICBwYWQudW5wb3BwZWQgPSBnZXRTaXplRGF0YSgpLmNvbnRhaW5lcl9wYWQ7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCB0cnVlKTsKICBwYWQucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIC8vIFdlIGRvIHRvcCBhbmQgbGVmdCBiYXNlZCBvbiB0aGUgY3VycmVudCByZWN0CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ0b3AiLCAibGVmdCJdKSB7CiAgICBjb25zdCBzdGFydF92YWwgPSB0YXJnZXRfY29udGFpbmVyX3NpemVba2V5XSA/PyBjb250YWluZXJfcmVjdFtrZXldOwogICAgbGV0IG9mZnNldCA9IDA7CiAgICBmb3IgKGNvbnN0IGtpbmQgb2YgWyJwYWRkaW5nIiwgImJvcmRlciJdKSB7CiAgICAgIG9mZnNldCArPSBwYWQucG9wcGVkW2tpbmRdW2tleV0gLSBwYWQudW5wb3BwZWRba2luZF1ba2V5XTsKICAgIH0KICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gc3RhcnRfdmFsIC0gb2Zmc2V0ICsgInB4IjsKICAgIGlmIChrZXkgPT09ICJsZWZ0IikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgLy8gV2UgY29tcHV0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBkZXBlbmRpbmcgb24gZXZlbnR1YWwgY29uZmlnIGRhdGEKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7CiAgICB3aWR0aDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS53aWR0aCA/PwogICAgICBjb25maWdfc3BhbnMud2lkdGguY29uZmlnX3ZhbHVlID8/CiAgICAgIGN1cnJlbnRfcGxvdF9zaXplLndpZHRoLAogICAgaGVpZ2h0OgogICAgICB0YXJnZXRfcGxvdF9zaXplLmhlaWdodCA/PwogICAgICBjb25maWdfc3BhbnMuaGVpZ2h0LmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS5oZWlnaHQsCiAgfSk7CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgY29uc3QgdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY3N6W2tleV07CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHZhbCArICJweCI7CiAgICBpZiAoa2V5ID09PSAid2lkdGgiKSB7CiAgICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGVba2V5XSA9IENPTlRBSU5FUi5zdHlsZVtrZXldOwogICAgfQogIH0KICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIGZhbHNlKTsKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICB1bnBvcF9jb250YWluZXIoKTsKICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9LAogICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0KICApOwp9CgpDT05UQUlORVIucG9wT3V0ID0gcG9wb3V0X2NvbnRhaW5lcjsKCmZ1bmN0aW9uIER1YWxDbGljayhzaW5nbGVfZnVuYywgZGJsX2Z1bmMpIHsKICBsZXQgbmNsaWNrcyA9IDA7CiAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7CiAgICBuY2xpY2tzICs9IDE7CiAgICBpZiAobmNsaWNrcyA+IDEpIHsKICAgICAgZGJsX2Z1bmMoLi4uYXJncyk7CiAgICAgIG5jbGlja3MgPSAwOwogICAgfSBlbHNlIHsKICAgICAgZGVsYXkoMzAwKS50aGVuKCgpID0+IHsKICAgICAgICBpZiAobmNsaWNrcyA9PSAxKSB7CiAgICAgICAgICBzaW5nbGVfZnVuYyguLi5hcmdzKTsKICAgICAgICB9CiAgICAgICAgbmNsaWNrcyA9IDA7CiAgICAgIH0pOwogICAgfQogIH07Cn0KCi8vIFdlIHJlbW92ZSB0aGUgZGVmYXVsdCBkb3dubG9hZCBpbWFnZSBidXR0b24KcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9SZW1vdmUgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlLAogIFsidG9JbWFnZSJdCik7Ci8vIFdlIGFkZCB0aGUgY3VzdG9tIGJ1dHRvbiB0byB0aGUgbW9kZWJhcgpwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb0FkZCA9IF8udW5pb24oCiAgcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQsCiAgWwogICAgewogICAgICBuYW1lOiAiQ29weSBQTkcgdG8gQ2xpcGJvYXJkIiwKICAgICAgaWNvbjogewogICAgICAgIGhlaWdodDogNTIwLAogICAgICAgIHdpZHRoOiA1MjAsCiAgICAgICAgcGF0aDogIk0yODAgNjRoNDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRWNDQ4YzAgMzUuMy0yOC43IDY0LTY0IDY0SDY0Yy0zNS4zIDAtNjQtMjguNy02NC02NFYxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRoNDAgOS42QzEyMSAyNy41IDE1My4zIDAgMTkyIDBzNzEgMjcuNSA3OC40IDY0SDI4MHpNNjQgMTEyYy04LjggMC0xNiA3LjItMTYgMTZWNDQ4YzAgOC44IDcuMiAxNiAxNiAxNkgzMjBjOC44IDAgMTYtNy4yIDE2LTE2VjEyOGMwLTguOC03LjItMTYtMTYtMTZIMzA0djI0YzAgMTMuMy0xMC43IDI0LTI0IDI0SDE5MiAxMDRjLTEzLjMgMC0yNC0xMC43LTI0LTI0VjExMkg2NHptMTI4LThhMjQgMjQgMCAxIDAgMC00OCAyNCAyNCAwIDEgMCAwIDQ4eiIsCiAgICAgIH0sCiAgICAgIGRpcmVjdGlvbjogInVwIiwKICAgICAgY2xpY2s6IER1YWxDbGljayhjb3B5SW1hZ2VUb0NsaXBib2FyZCwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoKTsKICAgICAgfSksCiAgICB9LAogICAgewogICAgICBuYW1lOiAiRG93bmxvYWQgSW1hZ2UiLAogICAgICBpY29uOiBQbG90bHkuSWNvbnMuY2FtZXJhLAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soc2F2ZUltYWdlVG9GaWxlLCAoKSA9PiB7CiAgICAgICAgcG9wb3V0X2NvbnRhaW5lcih7IGNsOiAiZmlsZXNhdmUiIH0pOwogICAgICB9KSwKICAgIH0sCiAgXQopOwoKZnVuY3Rpb24gZ2V0T2Zmc2V0RGF0YShlbCkgewogIGxldCBjcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsLCBudWxsKTsKICBjb25zdCBvZGF0YSA9IHsKICAgIHBhZGRpbmc6IHsKICAgICAgbGVmdDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSwKICAgICAgYm90dG9tOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSArIHBhcnNlRmxvYXQoY3MucGFkZGluZ0JvdHRvbSksCiAgICB9LAogICAgYm9yZGVyOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyTGVmdFdpZHRoKSwKICAgICAgcmlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyUmlnaHRXaWR0aCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5ib3JkZXJUb3BXaWR0aCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCkgKyBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICB9CiAgfTsKICBpZiAoZWwgPT09IFBMT1QpIHsKICAgIC8vIEZvciB0aGUgUExPVCB3ZSBhbHNvIHdhbnQgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIG9mZnNldAogICAgb2RhdGEub2Zmc2V0ID0gewogICAgICB0b3A6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0VG9wIDogMCwKICAgICAgbGVmdDogUExPVC5vZmZzZXRQYXJlbnQgPT0gQ09OVEFJTkVSID8gUExPVC5vZmZzZXRMZWZ0IDogMCwKICAgIH0KICB9CiAgcmV0dXJuIG9kYXRhOwp9CmZ1bmN0aW9uIGdldFNpemVEYXRhKCkgewogIGNvbnN0IGRhdGEgPSB7CiAgICBwbG90X3BhZDogZ2V0T2Zmc2V0RGF0YShQTE9UKSwKICAgIHBsb3RfcmVjdDogUExPVC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICAgIGNvbnRhaW5lcl9wYWQ6IGdldE9mZnNldERhdGEoQ09OVEFJTkVSKSwKICAgIGNvbnRhaW5lcl9yZWN0OiBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgfTsKICByZXR1cm4gZGF0YTsKfQpmdW5jdGlvbiBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgY29uc3QgY29tcHV0ZWRfc2l6ZSA9IGNvbXB1dGVQbG90U2l6ZShzaXplRGF0YSk7CiAgY29uc3Qgb2Zmc2V0cyA9IGNvbXB1dGVkX3NpemUub2Zmc2V0czsKCiAgY29uc3QgcGxvdF9kYXRhID0gewogICAgd2lkdGg6IHdpZHRoID8/IGNvbXB1dGVkX3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IGhlaWdodCA/PyBjb21wdXRlZF9zaXplLmhlaWdodCwKICB9OwoKICByZXR1cm4gewogICAgd2lkdGg6ICh3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoKSArIG9mZnNldHMud2lkdGgsCiAgICBoZWlnaHQ6IChoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQpICsgb2Zmc2V0cy5oZWlnaHQsCiAgICBub0NoYW5nZTogd2lkdGggPT0gY29tcHV0ZWRfc2l6ZS53aWR0aCAmJiBoZWlnaHQgPT0gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfQp9CgovLyBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hhbmdlIHRoZSBjb250YWluZXIgc2l6ZSBzbyB0aGF0IHRoZSByZXN1bHRpbmcgcGxvdCB3aWxsIGJlIG1hdGNoaW5nIHRoZSBwcm92aWRlZCBzcGVjcwpmdW5jdGlvbiBjaGFuZ2VDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICBpZiAoIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICBjb25zb2xlLmxvZygiVHJpZWQgdG8gY2hhbmdlIGNvbnRhaW5lciBzaXplIHdoZW4gbm90IHBvcHBlZCwgaWdub3JpbmciKTsKICAgIHJldHVybjsKICB9CgogIGNvbnN0IGNzeiA9IGNvbXB1dGVDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSk7CgogIGlmIChjc3oubm9DaGFuZ2UpIHsKICAgIGNvbnNvbGUubG9nKCJTaXplIGlzIHRoZSBzYW1lIGFzIGN1cnJlbnQsIGlnbm9yaW5nIik7CiAgICByZXR1cm4KICB9CiAgLy8gV2UgYXJlIG5vdyBnb2luZyB0byBzZXQgaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgY29udGFpbmVyCiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSBjc3pba2V5XSArICJweCI7CiAgfQp9Ci8vIFdlIG5vdyBjcmVhdGUgdGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCB1cGRhdGUgdGhlIHBsb3QgYmFzZWQgb24gdGhlIHZhbHVlcyBzcGVjaWZpZWQKZnVuY3Rpb24gdXBkYXRlRnJvbUhlYWRlcigpIHsKICBjb25zdCBoZWFkZXJfZGF0YSA9IHsKICAgIGhlaWdodDogY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSwKICAgIHdpZHRoOiBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUsCiAgfTsKICBjaGFuZ2VDb250YWluZXJTaXplKGhlYWRlcl9kYXRhKTsKfQovLyBXZSBhc3NpZ24gdGhpcyBmdW5jdGlvbiB0byB0aGUgb25ibHVyIGV2ZW50IG9mIHdpZHRoIGFuZCBoZWlnaHQKaWYgKGZpcnN0UnVuKSB7CiAgZm9yIChjb25zdCBjb250YWluZXIgb2YgT2JqZWN0LnZhbHVlcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIudWlfc3Bhbi5vbmJsdXIgPSAoZSkgPT4gewogICAgICBjb250YWluZXIudWlfdmFsdWUgPSBjb250YWluZXIudWlfc3Bhbi50ZXh0Q29udGVudDsKICAgICAgdXBkYXRlRnJvbUhlYWRlcigpOwogICAgfTsKICB9Cn0KLy8gVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgcGxvdCBzaXplIHRvIHVzZSBmb3IgcmVsYXlvdXQgYXMgYSBmdW5jdGlvbiBvZiB0aGUgY29udGFpbmVyIHNpemUKZnVuY3Rpb24gY29tcHV0ZVBsb3RTaXplKGRhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgLy8gUmVtb3ZlIFBhZGRpbmcKICBjb25zdCB7IGNvbnRhaW5lcl9wYWQsIHBsb3RfcGFkLCBjb250YWluZXJfcmVjdCB9ID0gZGF0YTsKICBjb25zdCBvZmZzZXRzID0gewogICAgd2lkdGg6CiAgICAgIHBsb3RfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBwbG90X3BhZC5ib3JkZXIud2lkdGggKwogICAgICBwbG90X3BhZC5vZmZzZXQubGVmdCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy53aWR0aCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLndpZHRoLAogICAgaGVpZ2h0OgogICAgICBwbG90X3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIHBsb3RfcGFkLmJvcmRlci5oZWlnaHQgKwogICAgICBwbG90X3BhZC5vZmZzZXQudG9wICsKICAgICAgY29udGFpbmVyX3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLmhlaWdodCwKICB9OwogIGNvbnN0IHN6ID0gewogICAgd2lkdGg6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3Qud2lkdGggLSBvZmZzZXRzLndpZHRoKSwKICAgIGhlaWdodDogTWF0aC5yb3VuZChjb250YWluZXJfcmVjdC5oZWlnaHQgLSBvZmZzZXRzLmhlaWdodCksCiAgICBvZmZzZXRzLAogIH07CiAgcmV0dXJuIHN6Owp9CgovLyBDcmVhdGUgdGhlIHJlc2l6ZU9ic2VydmVyIHRvIG1ha2UgdGhlIHBsb3QgZXZlbiBtb3JlIHJlc3BvbnNpdmUhIDptYWdpYzoKY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHsKICBjb25zdCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCk7CiAgY29uc3Qge2NvbnRhaW5lcl9yZWN0LCBjb250YWluZXJfcGFkfSA9IHNpemVEYXRhOwogIGxldCBwbG90X3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIC8vIFdlIHNhdmUgdGhlIGhlaWdodCBpbiB0aGUgUExPVCBvYmplY3QKICBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQ7CiAgLy8gV2UgZGVhbCB3aXRoIHNvbWUgc3R1ZmYgaWYgdGhlIGNvbnRhaW5lciBpcyBwb3BwcGVkCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9IGNvbnRhaW5lcl9yZWN0LndpZHRoICsgInB4IjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBjb250YWluZXJfcmVjdC5sZWZ0ICsgInB4IjsKICBjb25maWdfc3BhbnMuaGVpZ2h0LnVpX3ZhbHVlID0gcGxvdF9zaXplLmhlaWdodDsKICBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUgPSBwbG90X3NpemUud2lkdGg7CiAgLyogCgkJVGhlIGFkZGl0aW9uIG9mIHRoZSBpbnZhbGlkIGFyZ3VtZW50IGBwbHV0b3Jlc2l6ZWAgc2VlbXMgdG8gZml4IHRoZSBwcm9ibGVtIHdpdGggY2FsbGluZyBgcmVsYXlvdXRgIHNpbXBseSB3aXRoIGB7YXV0b3NpemU6IHRydWV9YCBhcyB1cGRhdGUgYnJlYWtpbmcgbW91c2UgcmVsYXlvdXQgZXZlbnRzIHRyYWNraW5nLiAKCQlTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Bsb3RseS9wbG90bHkuanMvaXNzdWVzLzYxNTYgZm9yIGRldGFpbHMKCQkqLwogIGxldCBjb25maWcgPSB7CiAgICAvLyBJZiB0aGlzIGlzIHBvcHBlZCBvdXQsIHdlIGlnbm9yZSB0aGUgb3JpZ2luYWwgd2lkdGgvaGVpZ2h0CiAgICB3aWR0aDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfd2lkdGgpID8/IHBsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfaGVpZ2h0KSA/PyBwbG90X3NpemUuaGVpZ2h0LAogICAgcGx1dG9yZXNpemU6IHRydWUsCiAgfTsKICBQbG90bHkucmVsYXlvdXQoUExPVCwgY29uZmlnKS50aGVuKCgpID0+IHsKICAgIGlmIChyZW1vdmVfY29udGFpbmVyX3NpemUgJiYgIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIHRoZSBmaXJzdCByZXNpemUgdXBvbiBwbG90IGNyZWF0aW9uIHRvIGFscmVhZHkgYmUgd2l0aG91dCBhIGZpeGVkIGhlaWdodAogICAgICBDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gIiI7CiAgICAgIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogICAgICByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmYWxzZTsKICAgIH0KICB9KTsKfSk7CgpyZXNpemVPYnNlcnZlci5vYnNlcnZlKENPTlRBSU5FUik7CgoKUGxvdGx5LnJlYWN0KFBMT1QsIHBsb3Rfb2JqKS50aGVuKCgpID0+IHsKCS8vIEFzc2lnbiB0aGUgUGxvdGx5IGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKHBsb3RseV9saXN0ZW5lcnMpKSB7CgkJZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcl92ZWMpIHsKCQkJUExPVC5vbihrZXksIGxpc3RlbmVyKQoJCX0KCX0KCS8vIEFzc2lnbiB0aGUgSlMgZXZlbnQgbGlzdGVuZXJzCglmb3IgKGNvbnN0IFtrZXksIGxpc3RlbmVyX3ZlY10gb2YgT2JqZWN0LmVudHJpZXMoanNfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1QuYWRkRXZlbnRMaXN0ZW5lcihrZXksIGxpc3RlbmVyLCB7CgkJCQlzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsCgkJCX0pCgkJfQoJfQp9CikKCgppbnZhbGlkYXRpb24udGhlbigoKSA9PiB7CgkvLyBSZW1vdmUgYWxsIHBsb3RseSBsaXN0ZW5lcnMKCVBMT1QucmVtb3ZlQWxsTGlzdGVuZXJzKCkKCS8vIFJlbW92ZSBhbGwgSlMgbGlzdGVuZXJzCgljb250cm9sbGVyLmFib3J0KCkKCS8vIFJlbW92ZSB0aGUgcmVzaXplT2JzZXJ2ZXIKCXJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKQp9KQoKCgoJCXJldHVybiBDT05UQUlORVIKCTwvc2NyaXB0PgqkbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/yE5F3nqwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJDQxZDE0ZGVjLWI4NTItNDMxNi1hZWZiLWMzZDA4ZmE0MzIxNrlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgdPGq+1cHVibGlzaGVkX29iamVjdF9rZXlzkdk1N2JjYzA1YjAtODFkYS0xMWVmLTIwNDAtMzU4NWM5YjQ5NTRmLzlkZjM2YzUxNzM4N2U3OWW4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkZWU3ZTgxZTctNDg0Yy00NGE4LWExOTEtZjczZTI0NzA3Y2U5iqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kebEiVDIgc3RhciBwaGFudG9tIqRtaW1lqnRleHQvcGxhaW6scm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/yE5dy7ywcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJGVlN2U4MWU3LTQ4NGMtNDRhOC1hMTkxLWY3M2UyNDcwN2NlOblkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgq+C8O1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQzNDgyNGRiNy0xM2M0LTQ1ZTItYmVmYS1mMDI3YjliNTg1YzCKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52mqJCTxzY3JpcHQgaWQ9J3Bsb3RfMSc+CgkJLy8gV2Ugc3RhcnQgYnkgcHV0dGluZyBhbGwgdGhlIHZhcmlhYmxlIGludGVycG9sYXRpb24gaGVyZSBhdCB0aGUgYmVnaW5uaW5nCgkJLy8gV2UgaGF2ZSB0byBjb252ZXJ0IGFsbCB0eXBlZGFycmF5cyBpbiB0aGUgbGF5b3V0IHRvIG5vcm1hbCBhcnJheXMuIFNlZSBJc3N1ZSAjMjUKCQkvLyBXZSB1c2UgbG9kYXNoIGZvciB0aGlzIGZvciBjb21wYWN0bmVzcwoJCWZ1bmN0aW9uIHJlbW92ZVR5cGVkQXJyYXkobykgewoJCQlyZXR1cm4gXy5pc1R5cGVkQXJyYXkobykgPyBBcnJheS5mcm9tKG8pIDoKCQkJXy5pc1BsYWluT2JqZWN0KG8pID8gXy5tYXBWYWx1ZXMobywgcmVtb3ZlVHlwZWRBcnJheSkgOiAKCQkJbwoJCX0KCgkJLy8gUHVibGlzaCB0aGUgcGxvdCBvYmplY3QgdG8gSlMKCQlsZXQgcGxvdF9vYmogPSBfLnVwZGF0ZSgvKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIEFic3RyYWN0UGx1dG9EaW5nZXRqZXMuRGlzcGxheS5wdWJsaXNoZWRfdG9fanMgKi8gZ2V0UHVibGlzaGVkT2JqZWN0KCI3YmNjMDViMC04MWRhLTExZWYtMjA0MC0zNTg1YzliNDk1NGYvNDg0NjJhYzhhMDM0NWJiYiIpLCAibGF5b3V0IiwgcmVtb3ZlVHlwZWRBcnJheSkKCQkvLyBHZXQgdGhlIHBsb3RseSBsaXN0ZW5lcnMKCQljb25zdCBwbG90bHlfbGlzdGVuZXJzID0ge30KCQkvLyBHZXQgdGhlIEpTIGxpc3RlbmVycwoJCWNvbnN0IGpzX2xpc3RlbmVycyA9IHt9CgkJLy8gRGVhbCB3aXRoIGV2ZW50dWFsIGN1c3RvbSBjbGFzc2VzCgkJbGV0IGN1c3RvbV9jbGFzc2xpc3QgPSBbXQoKCgkJLy8gTG9hZCB0aGUgcGxvdGx5IGxpYnJhcnkKCQlsZXQgUGxvdGx5ID0gdW5kZWZpbmVkCgkJdHJ5IHsKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoIi4vcGxvdGx5anMvcGxvdGx5anMtMi4yNi4yLm1pbi5qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0gY2F0Y2ggKGUpIHsKCQkJY29uc29sZS5sb2coIkxvY2FsIGxvYWQgZmFpbGVkLCB0cnlpbmcgd2l0aCB0aGUgd2ViIGVzbS5zaCB2ZXJzaW9uIikKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoImh0dHBzOi8vZXNtLnNoL3YxMzUvcGxvdGx5LmpzLWRpc3QtbWluQDIuMjYuMi9lc25leHQvcGxvdGx5LmpzLWRpc3QtbWluLm1qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0KCgkJLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0byBmb3JjZSBsb2NhbCBtYXRoamF4IGZvbnQgY2FjaGUKCQlpZiAoZmFsc2UgJiYgd2luZG93Py5NYXRoSmF4Py5jb25maWc/LnN2Zz8uZm9udENhY2hlID09PSAnZ2xvYmFsJykgewoJCQl3aW5kb3cuTWF0aEpheC5jb25maWcuc3ZnLmZvbnRDYWNoZSA9ICdsb2NhbCcKCQl9CgoJCS8vIEZsYWcgdG8gY2hlY2sgaWYgdGhpcyBjZWxsIHdhcyAgbWFudWFsbHkgcmFuIG9yIHJlYWN0aXZlbHkgcmFuCmNvbnN0IGZpcnN0UnVuID0gdGhpcyA/IGZhbHNlIDogdHJ1ZQpjb25zdCBDT05UQUlORVIgPSB0aGlzID8/IGh0bWxgPGRpdiBjbGFzcz0ncGx1dG9wbG90bHktY29udGFpbmVyJz5gCmNvbnN0IFBMT1QgPSBDT05UQUlORVIucXVlcnlTZWxlY3RvcignLmpzLXBsb3RseS1wbG90JykgPz8gQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgPGRpdj5gKQpjb25zdCBwYXJlbnQgPSBDT05UQUlORVIucGFyZW50RWxlbWVudAovLyBXZSB1c2UgYSBjb250cm9sbGVyIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lcnMgdXBvbiBpbnZhbGlkYXRpb24KY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKQovLyBXZSBoYXZlIHRvIGFkZCB0aGlzIHRvIGtlZXAgc3VwcG9ydGluZyBAYmluZCB3aXRoIHRoZSBvbGQgQVBJIHVzaW5nIFBMT1QKUExPVC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChlKSA9PiB7CglDT05UQUlORVIudmFsdWUgPSBQTE9ULnZhbHVlCglpZiAoZS5idWJibGVzKSB7CgkJcmV0dXJuCgl9CglDT05UQUlORVIuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2lucHV0JykpCn0sIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KQoKCS8vIFRoaXMgY3JlYXRlIHRoZSBzdHlsZSBzdWJkaXYgb24gZmlyc3QgcnVuCglmaXJzdFJ1biAmJiBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGAKCTxzdHlsZT4KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgewoJCXdpZHRoOiAxMDAlOwoJCWhlaWdodDogMTAwJTsKCQltaW4taGVpZ2h0OiAwOwoJCW1pbi13aWR0aDogMDsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgLmpzLXBsb3RseS1wbG90IC5wbG90bHkgZGl2IHsKCQltYXJnaW46IDAgYXV0bzsgLy8gVGhpcyBjZW50ZXJzIHRoZSBwbG90Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLnBvcHBlZC1vdXQgewoJCW92ZXJmbG93OiBhdXRvOwoJCXotaW5kZXg6IDEwMDA7CgkJcG9zaXRpb246IGZpeGVkOwoJCXJlc2l6ZTogYm90aDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDBweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMHB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgewoJCWRpc3BsYXk6IGZsZXg7CgkJZmxleC1mbG93OiByb3cgd3JhcDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAxMnB4OwoJCXBvc2l0aW9uOiBmaXhlZDsKCQl6LWluZGV4OiAxMDAxOwoJCWN1cnNvcjogbW92ZTsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIC0xMDAlKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBzcGFuIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJZmxleDogMQoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIuaGlkZGVuIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuIHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlIHsKCQlwYWRkaW5nLXJpZ2h0OiA1cHg7CgkJcGFkZGluZy1sZWZ0OiAycHg7CgkJY3Vyc29yOiB0ZXh0OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZmxleDogMCAwIDEwMCU7CgkJdGV4dC1hbGlnbjogY2VudGVyOwoJCWJvcmRlci10b3A6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQltYXJnaW4tdG9wOiA1cHg7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZpbGVuYW1lIHsKCQltYXJnaW4tbGVmdDogM3B4OwoJCXRleHQtYWxpZ246IGxlZnQ7CgkJbWluLXdpZHRoOiBtaW4oNjAlLCBtaW4tY29udGVudCk7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCAubGFiZWwgewoJCWZsZXg6IDAgMCAwOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5mb3JtYXQgewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCQlmbGV4OiAxIDAgYXV0bzsKCQltaW4td2lkdGg6IDMwcHg7CgkJbWFyZ2luLXJpZ2h0OiAxMHB4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCQlmbGV4LWZsb3c6IGNvbHVtbjsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlwYWRkaW5nLWxlZnQ6IDNweDsKCQl6LWluZGV4OiAyMDAwOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIHsKCQljdXJzb3I6IHBvaW50ZXI7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJcGFkZGluZzogM3B4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKC0zcHgsIC02cHgpOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpub3QoLnNlbGVjdGVkKSB7CgkJbWFyZ2luLXRvcDogM3B4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uLnNlbGVjdGVkIHsKCQlvcmRlcjogLTE7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246aG92ZXIgewoJCWJhY2tncm91bmQtY29sb3I6IHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJfQoJc3Bhbi5jb25maWctdmFsdWUgewoJCWZvbnQtd2VpZ2h0OiBub3JtYWw7CgkJY29sb3I6IHZhcigtLXBsdXRvLW91dHB1dC1jb2xvcik7CgkJZGlzcGxheTogbm9uZTsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIGNhbGMoLTEwMCUgLSAxMHB4KSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLmxhYmVsIHsKCQl1c2VyLXNlbGVjdDogbm9uZTsKCX0KCS5sYWJlbDpob3ZlciBzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCW1pbi13aWR0aDogMTUwcHg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4ubWF0Y2hpbmctY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLW1hY3JvLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5kaWZmZXJlbnQtY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLXRhZy1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9Cjwvc3R5bGU+CmApCgpsZXQgb3JpZ2luYWxfaGVpZ2h0ID0gcGxvdF9vYmoubGF5b3V0LmhlaWdodApsZXQgb3JpZ2luYWxfd2lkdGggPSBwbG90X29iai5sYXlvdXQud2lkdGgKLy8gRm9yIHRoZSBoZWlnaHQgd2UgaGF2ZSB0byBhbHNvIHB1dCBhIGZpeGVkIHZhbHVlIGluIGNhc2UgdGhlIHBsb3QgaXMgcHV0IG9uIGEgbm9uLWZpeGVkLXNpemUgY29udGFpbmVyIChsaWtlIHRoZSBkZWZhdWx0IHdyYXBwZXIpCi8vIFdlIGRlZmluZSBhIHZhcmlhYmxlIHRvIGNoZWNrIHdoZXRoZXIgd2Ugc3RpbGwgaGF2ZSB0byByZW1vdmUgdGhlIGZpeGVkIGhlaWdodApsZXQgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmlyc3RSdW4KbGV0IGNvbnRhaW5lcl9oZWlnaHQgPSBvcmlnaW5hbF9oZWlnaHQgPz8gUExPVC5jb250YWluZXJfaGVpZ2h0ID8/IDQwMApDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX2hlaWdodCArICdweCcKCi8vIFdlIGNyZWF0ZSBhIFByb21pc2UgdmVyc2lvbiBvZiBzZXRUaW1lb3V0CmZ1bmN0aW9uIGRlbGF5KG1zKSB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7Cn0KCi8vIFdlIGltcG9ydCBpbnRlcmFjdCBmb3IgZHJhZ2dpbmcvcmVzaXppbmcKY29uc3QgeyBkZWZhdWx0OiBpbnRlcmFjdCB9ID0gYXdhaXQgaW1wb3J0KCdodHRwczovL2VzbS5zaC9pbnRlcmFjdGpzQDEuMTAuMTknKQoKCmZ1bmN0aW9uIGdldEltYWdlT3B0aW9ucygpIHsKICBjb25zdCBvID0gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogIHJldHVybiB7CiAgICBmb3JtYXQ6IG8uZm9ybWF0ID8/ICJwbmciLAogICAgd2lkdGg6IG8ud2lkdGggPz8gb3JpZ2luYWxfd2lkdGgsCiAgICBoZWlnaHQ6IG8uaGVpZ2h0ID8/IG9yaWdpbmFsX2hlaWdodCwKICAgIHNjYWxlOiBvLnNjYWxlID8/IDEsCiAgICBmaWxlbmFtZTogby5maWxlbmFtZSA/PyAibmV3cGxvdCIsCiAgfTsKfQoKY29uc3QgQ0xJUEJPQVJEX0hFQURFUiA9CiAgQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoIi5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIikgPz8KICBDT05UQUlORVIuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgImFmdGVyYmVnaW4iLAogICAgaHRtbGA8ZGl2IGNsYXNzPSJwbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIGhpZGRlbiI+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmb3JtYXQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+Rm9ybWF0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZvcm1hdCI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB3aWR0aCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5XaWR0aDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSB3aWR0aCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGhlaWdodCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5IZWlnaHQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgaGVpZ2h0Ij48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2NhbGUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+U2NhbGU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgc2NhbGUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzZXQiPlNldDwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB1bnNldCI+VW5zZXQ8L2J1dHRvbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZpbGVuYW1lIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZpbGVuYW1lOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZpbGVuYW1lIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgIDwvZGl2PmAKICApOwoKZnVuY3Rpb24gY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcikgewogIGNvbnN0IHZhbGlkX2NsYXNzZXMgPSBbCiAgICAibWlzc2luZy1jb25maWciLAogICAgIm1hdGNoaW5nLWNvbmZpZyIsCiAgICAiZGlmZmVyZW50LWNvbmZpZyIsCiAgXTsKICBmdW5jdGlvbiBzZXRDbGFzcyhjbCkgewogICAgZm9yIChjb25zdCBuYW1lIG9mIHZhbGlkX2NsYXNzZXMpIHsKICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUobmFtZSwgbmFtZSA9PSBjbCk7CiAgICB9CiAgfQogIC8vIFdlIHVzZSB0aGUgY3VzdG9tIGdldHRlcnMgd2UnbGwgc2V0IHVwIGluIHRoZSBjb250YWluZXIKICBjb25zdCB7IHVpX3ZhbHVlLCBjb25maWdfdmFsdWUsIGNvbmZpZ19zcGFuLCBrZXkgfSA9IGNvbnRhaW5lcjsKICBpZiAoY29uZmlnX3ZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgIHNldENsYXNzKCJtaXNzaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBpcyBub3QgcHJlc2VudCBpbiB0aGUgY29uZmlnLmA7CiAgfSBlbHNlIGlmICh1aV92YWx1ZSA9PSBjb25maWdfdmFsdWUpIHsKICAgIHNldENsYXNzKCJtYXRjaGluZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIHRoZSBzYW1lIHZhbHVlIGluIHRoZSBjb25maWcgYW5kIGluIHRoZSBoZWFkZXIuYDsKICB9IGVsc2UgewogICAgc2V0Q2xhc3MoImRpZmZlcmVudC1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIGEgZGlmZmVyZW50IHZhbHVlICg8ZW0+JHtjb25maWdfdmFsdWV9PC9lbT4pIGluIHRoZSBjb25maWcuYDsKICB9CiAgLy8gQWRkIGluZm8gYWJvdXQgc2V0dGluZyBhbmQgdW5zZXR0aW5nCiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIG9uIHRoZSBsYWJlbCA8ZW0+PGI+b25jZTwvYj48L2VtPiB0byBzZXQgdGhlIGN1cnJlbnQgVUkgdmFsdWUgaW4gdGhlIGNvbmZpZy5gCiAgKTsKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgPGVtPjxiPnR3aWNlPC9iPjwvZW0+IHRvIHJlbW92ZSB0aGlzIGtleSBmcm9tIHRoZSBjb25maWcuYAogICk7Cn0KCmNvbnN0IHZhbGlkX2Zvcm1hdHMgPSBbInBuZyIsICJzdmciLCAid2VicCIsICJqcGVnIiwgImZ1bGwtanNvbiJdOwpmdW5jdGlvbiBpbml0aWFsaXplVUlWYWx1ZVNwYW4oc3Bhbiwga2V5LCB2YWx1ZSkgewogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSBrZXkgPT09ICJmb3JtYXQiID8gImZhbHNlIiA6ICJ0cnVlIjsKICBsZXQgcGFyc2UgPSAoeCkgPT4geDsKICBsZXQgdXBkYXRlID0gKHgpID0+IChzcGFuLnRleHRDb250ZW50ID0geCk7CiAgaWYgKGtleSA9PT0gIndpZHRoIiB8fCBrZXkgPT09ICJoZWlnaHQiKSB7CiAgICBwYXJzZSA9ICh4KSA9PiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoeCkpOwogIH0gZWxzZSBpZiAoa2V5ID09PSAic2NhbGUiKSB7CiAgICBwYXJzZSA9IHBhcnNlRmxvYXQ7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAvLyBXZSByZW1vdmUgY29udGVudEVkaXRhYmxlCiAgICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9ICJmYWxzZSI7CiAgICAvLyBIZXJlIHdlIGZpcnN0IGFkZCB0aGUgc3Vic3BhbnMgZm9yIGVhY2ggb3B0aW9uCiAgICBjb25zdCBvcHRzX2RpdiA9IHNwYW4uYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2IGNsYXNzPSJmb3JtYXQtb3B0aW9ucyI+PC9kaXY+YCk7CiAgICBmb3IgKGNvbnN0IGZtdCBvZiB2YWxpZF9mb3JtYXRzKSB7CiAgICAgIGNvbnN0IG9wdCA9IG9wdHNfZGl2LmFwcGVuZENoaWxkKAogICAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImZvcm1hdC1vcHRpb24gJHtmbXR9Ij4ke2ZtdH08L3NwYW4+YAogICAgICApOwogICAgICBvcHQub25jbGljayA9IChlKSA9PiB7CiAgICAgICAgc3Bhbi52YWx1ZSA9IG9wdC50ZXh0Q29udGVudDsKICAgICAgfTsKICAgIH0KICAgIHBhcnNlID0gKHgpID0+IHsKICAgICAgcmV0dXJuIHZhbGlkX2Zvcm1hdHMuaW5jbHVkZXMoeCkgPyB4IDogbG9jYWxWYWx1ZTsKICAgIH07CiAgICB1cGRhdGUgPSAoeCkgPT4gewogICAgICBmb3IgKGNvbnN0IG9wdCBvZiBvcHRzX2Rpdi5jaGlsZHJlbikgewogICAgICAgIG9wdC5jbGFzc0xpc3QudG9nZ2xlKCJzZWxlY3RlZCIsIG9wdC50ZXh0Q29udGVudCA9PT0geCk7CiAgICAgIH0KICAgIH07CiAgfSBlbHNlIHsKICAgIC8vIFdlIG9ubHkgaGF2ZSBmaWxlbmFtZSBoZXJlCiAgfQogIGxldCBsb2NhbFZhbHVlOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIGxvY2FsVmFsdWU7CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIGlmICh2YWwgIT09ICIiKSB7CiAgICAgICAgbG9jYWxWYWx1ZSA9IHBhcnNlKHZhbCk7CiAgICAgIH0KICAgICAgdXBkYXRlKGxvY2FsVmFsdWUpOwogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7CiAgLy8gV2UgYWxzbyBhc3NpZ24gYSBsaXN0ZW5lciBzbyB0aGF0IHRoZSBlZGl0YWJsZSBpcyBibHVycmVkIHdoZW4gZW50ZXIgaXMgcHJlc3NlZAogIHNwYW4ub25rZXlkb3duID0gKGUpID0+IHsKICAgIGlmIChlLmtleUNvZGUgPT09IDEzKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgc3Bhbi5ibHVyKCk7CiAgICB9CiAgfTsKICBzcGFuLnZhbHVlID0gdmFsdWU7Cn0KCmZ1bmN0aW9uIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oc3Bhbiwga2V5KSB7CiAgLy8gSGVyZSB3ZSBtb3N0bHkgd2FudCB0byBkZWZpbmUgdGhlIHNldHRlciBhbmQgZ2V0dGVyCiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgLy8gaWYgdW5kZWZpbmVkIGlzIHBhc3NlZCwgd2UgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBvcHRpb25zCiAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGRlbGV0ZSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XSA9IHZhbDsKICAgICAgfQogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7Cn0KCmNvbnN0IGNvbmZpZ19zcGFucyA9IHt9Owpmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhnZXRJbWFnZU9wdGlvbnMoKSkpIHsKICBjb25zdCBjb250YWluZXIgPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoYC5jbGlwYm9hcmQtc3Bhbi4ke2tleX1gKTsKICBjb25zdCBsYWJlbCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIubGFiZWwiKTsKICAvLyBXZSBnaXZlIHRoZSBsYWJlbCBhIGZ1bmN0aW9uIHRoYXQgb24gc2luZ2xlIGNsaWNrIHdpbGwgc2V0IHRoZSBjdXJyZW50IHZhbHVlIGFuZCB3aXRoIGRvdWJsZSBjbGljayB3aWxsIHVuc2V0IGl0CiAgbGFiZWwub25jbGljayA9IER1YWxDbGljaygKICAgICgpID0+IHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0sCiAgICAoZSkgPT4gewogICAgICBjb25zb2xlLmxvZygiZSIsIGUpOwogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSB1bmRlZmluZWQ7CiAgICB9CiAgKTsKICBjb25zdCB1aV92YWx1ZV9zcGFuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtdmFsdWUiKTsKICBjb25zdCBjb25maWdfdmFsdWVfc3BhbiA9CiAgICBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNvbmZpZy12YWx1ZSIpID8/CiAgICBsYWJlbC5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAgICJhZnRlcmJlZ2luIiwKICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iY29uZmlnLXZhbHVlIj48L3NwYW4+YAogICAgKTsKICAvLyBBc3NpbmcgdGhlIHR3byBzcGFucyBhcyBwcm9wZXJ0aWVzIG9mIHRoZSBjb250YWluaW5nIHNwYW4KICBjb250YWluZXIudWlfc3BhbiA9IHVpX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmNvbmZpZ19zcGFuID0gY29uZmlnX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmtleSA9IGtleTsKICBjb25maWdfc3BhbnNba2V5XSA9IGNvbnRhaW5lcjsKICBpZiAoZmlyc3RSdW4pIHsKICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA9CiAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICAgIC8vIFdlIGRvIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdmFsdWUgc3BhbgogICAgaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHVpX3ZhbHVlX3NwYW4sIGtleSwgdmFsdWUpOwogICAgLy8gVGhlbiB3ZSBpbml0aWFsaXplIHRoZSBjb25maWcgdmFsdWUKICAgIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oY29uZmlnX3ZhbHVlX3NwYW4sIGtleSk7CiAgICAvLyBXZSBwdXQgc29tZSBjb252ZW5pZW5jZSBnZXR0ZXJzL3NldHRlcnMKICAgIC8vIHVpX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJ1aV92YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiB1aV92YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICB1aV92YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgICAvLyBjb25maWdfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgImNvbmZpZ192YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICB9Cn0KCi8vIFRoZXNlIG9iamVjdHMgd2lsbCBjb250YWluIHRoZSBkZWZhdWx0IHZhbHVlCgovLyBUaGlzIGNvZGUgdXBkYXRlcyB0aGUgaW1hZ2Ugb3B0aW9ucyBpbiB0aGUgUExPVCBjb25maWcgd2l0aCB0aGUgcHJvdmlkZWQgb25lcwpmdW5jdGlvbiBzZXRJbWFnZU9wdGlvbnMobykgewogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gb1trZXldOwogIH0KfQpmdW5jdGlvbiB1bnNldEltYWdlT3B0aW9ucygpIHsKICBzZXRJbWFnZU9wdGlvbnMoe30pOwp9Cgpjb25zdCBzZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4uc2V0Iik7CmNvbnN0IHVuc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnVuc2V0Iik7CmlmIChmaXJzdFJ1bikgewogIHNldF9idXR0b24ub25jbGljayA9IChlKSA9PiB7CiAgICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0KICB9OwogIHVuc2V0X2J1dHRvbi5vbmNsaWNrID0gdW5zZXRJbWFnZU9wdGlvbnM7Cn0KCi8vIFdlIGFkZCBhIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBjbGlwYm9hcmQgaXMgcG9wcGVkIG91dApDT05UQUlORVIuaXNQb3BwZWRPdXQgPSAoKSA9PiB7CiAgcmV0dXJuIENPTlRBSU5FUi5jbGFzc0xpc3QuY29udGFpbnMoInBvcHBlZC1vdXQiKTsKfTsKCkNMSVBCT0FSRF9IRUFERVIub25tb3VzZWRvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHsKICBpZiAoZXZlbnQudGFyZ2V0Lm1hdGNoZXMoInNwYW4uY2xpcGJvYXJkLXZhbHVlIikpIHsKICAgIGNvbnNvbGUubG9nKCJXZSBkb24ndCBtb3ZlISIpOwogICAgcmV0dXJuOwogIH0KICBjb25zdCBzdGFydCA9IHsKICAgIGxlZnQ6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLmxlZnQpLAogICAgdG9wOiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS50b3ApLAogICAgWDogZXZlbnQucGFnZVgsCiAgICBZOiBldmVudC5wYWdlWSwKICB9OwogIGZ1bmN0aW9uIG1vdmVBdChldmVudCwgc3RhcnQpIHsKICAgIGNvbnN0IHRvcCA9IGV2ZW50LnBhZ2VZIC0gc3RhcnQuWSArIHN0YXJ0LnRvcCArICJweCI7CiAgICBjb25zdCBsZWZ0ID0gZXZlbnQucGFnZVggLSBzdGFydC5YICsgc3RhcnQubGVmdCArICJweCI7CiAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9IHRvcDsKICB9CgogIC8vIG1vdmUgb3VyIGFic29sdXRlbHkgcG9zaXRpb25lZCBiYWxsIHVuZGVyIHRoZSBwb2ludGVyCiAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQpIHsKICAgIG1vdmVBdChldmVudCwgc3RhcnQpOwogIH0KCiAgLy8gV2UgdXNlIHRoaXMgdG8gcmVtb3ZlIHRoZSBtb3VzZW1vdmUgd2hlbiBjbGlja2luZyBvdXRzaWRlIG9mIHRoZSBjb250YWluZXIKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICAvLyBtb3ZlIHRoZSBjb250YWluZXIgb24gbW91c2Vtb3ZlCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgb25Nb3VzZU1vdmUsIHsKICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsCiAgfSk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgY2xlYW5VcCgpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7CgogIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICBjb25zb2xlLmxvZygiY2xlYW5pbmcgdXAgdGhlIHBsb3QgbW92ZSBsaXN0ZW5lciIpOwogICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBudWxsOwogIH0KCiAgLy8gKDMpIGRyb3AgdGhlIGJhbGwsIHJlbW92ZSB1bm5lZWRlZCBoYW5kbGVycwogIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gY2xlYW5VcDsKfTsKCmZ1bmN0aW9uIHNlbmRUb0NsaXBib2FyZChibG9iKSB7CiAgaWYgKCFuYXZpZ2F0b3IuY2xpcGJvYXJkKSB7CiAgICBhbGVydCgKICAgICAgIlRoZSBDbGlwYm9hcmQgQVBJIGRvZXMgbm90IHNlZW0gdG8gYmUgYXZhaWxhYmxlLCBtYWtlIHN1cmUgdGhlIFBsdXRvIG5vdGVib29rIGlzIGJlaW5nIHVzZWQgZnJvbSBlaXRoZXIgbG9jYWxob3N0IG9yIGFuIGh0dHBzIHNvdXJjZS4iCiAgICApOwogIH0KICBuYXZpZ2F0b3IuY2xpcGJvYXJkCiAgICAud3JpdGUoWwogICAgICBuZXcgQ2xpcGJvYXJkSXRlbSh7CiAgICAgICAgLy8gVGhlIGtleSBpcyBkZXRlcm1pbmVkIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBibG9iJ3MgdHlwZS4KICAgICAgICBbYmxvYi50eXBlXTogYmxvYiwKICAgICAgfSksCiAgICBdKQogICAgLnRoZW4oCiAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICBjb25zb2xlLmxvZygiQXN5bmM6IENvcHlpbmcgdG8gY2xpcGJvYXJkIHdhcyBzdWNjZXNzZnVsISIpOwogICAgICB9LAogICAgICBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiQXN5bmM6IENvdWxkIG5vdCBjb3B5IHRleHQ6ICIsIGVycik7CiAgICAgIH0KICAgICk7Cn0KCmZ1bmN0aW9uIGNvcHlJbWFnZVRvQ2xpcGJvYXJkKCkgewogIC8vIFdlIGV4dHJhY3QgdGhlIGltYWdlIG9wdGlvbnMgZnJvbSB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycyAoaWYgdGhleSBleGlzdCkKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LiBXZSBhbHNvIGlnbm9yZSBmb3JtYXQgYmVjYXVzZSB0aGUgY2xpcGJvYXJkIG9ubHkgc3VwcG9ydHMgcG5nLgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gImZvcm1hdCIpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LnRvSW1hZ2UoUExPVCwgY29uZmlnKS50aGVuKGZ1bmN0aW9uIChkYXRhVXJsKSB7CiAgICBmZXRjaChkYXRhVXJsKQogICAgICAudGhlbigocmVzKSA9PiByZXMuYmxvYigpKQogICAgICAudGhlbigoYmxvYikgPT4gewogICAgICAgIGNvbnN0IHBhc3RlX3JlY2VpdmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigncGFzdGUtcmVjZWl2ZXIucGx1dG9wbG90bHknKQogICAgICAgIGlmIChwYXN0ZV9yZWNlaXZlcikgewogICAgICAgICAgcGFzdGVfcmVjZWl2ZXIuYXR0YWNoSW1hZ2UoZGF0YVVybCwgQ09OVEFJTkVSKQogICAgICAgIH0KICAgICAgICBzZW5kVG9DbGlwYm9hcmQoYmxvYikKICAgICAgfSk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHNhdmVJbWFnZVRvRmlsZSgpIHsKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS5kb3dubG9hZEltYWdlKFBMT1QsIGNvbmZpZyk7Cn0KCmxldCBjb250YWluZXJfcmVjdCA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCwgdG9wOiAwLCBsZWZ0OiAwIH07CmZ1bmN0aW9uIHVucG9wX2NvbnRhaW5lcihjbCkgewogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgZmFsc2UpOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBmYWxzZSk7CiAgLy8gV2UgZml4IHRoZSBoZWlnaHQgYmFjayB0byB0aGUgdmFsdWUgaXQgaGFkIGJlZm9yZSBwb3BvdXQsIGFsc28gc2V0dGluZyB0aGUgZmxhZyB0byBzaWduYWwgdGhhdCB1cG9uIGZpcnN0IHJlc2l6ZSB3ZSByZW1vdmUgdGhlIGZpeGVkIGlubGluZS1zdHlsZQogIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQgKyAicHgiOwogIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IHRydWU7CiAgLy8gV2Ugc2V0IHRoZSBvdGhlciBmaXhlZCBpbmxpbmUtc3R5bGVzIHRvIG51bGwKICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICBDT05UQUlORVIuc3R5bGUudG9wID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBXZSBhbHNvIHJlbW92ZSB0aGUgQ0xJUEJPQVJEX0hFQURFUgogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSAiIjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBGaW5hbGx5IHdlIHJlbW92ZSB0aGUgaGlkZGVuIGNsYXNzIHRvIHRoZSBoZWFkZXIKICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIHRydWUpOwogIHJldHVybjsKfQpmdW5jdGlvbiBwb3BvdXRfY29udGFpbmVyKG9wdHMpIHsKICBjb25zdCBjbCA9IG9wdHM/LmNsOwogIGNvbnN0IHRhcmdldF9jb250YWluZXJfc2l6ZSA9IG9wdHM/LnRhcmdldF9jb250YWluZXJfc2l6ZSA/PyB7fTsKICBjb25zdCB0YXJnZXRfcGxvdF9zaXplID0gb3B0cz8udGFyZ2V0X3Bsb3Rfc2l6ZSA/PyB7fTsKICBpZiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIHJldHVybiB1bnBvcF9jb250YWluZXIoY2wpOwogIH0KICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgY2wgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdHJ1ZSk7CiAgLy8gV2UgZXh0cmFjdCB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjb250YWluZXIsIHNhdmUgdGhlbSBhbmQgZml4IHRoZW0KICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9ID0gQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogIGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfTsKICAvLyBXZSBzYXZlIHRoZSBjdXJyZW50IHBsb3Qgc2l6ZSBiZWZvcmUgd2UgcG9wIGFzIGl0IHdpbGwgZmlsbCB0aGUgc2NyZWVuCiAgY29uc3QgY3VycmVudF9wbG90X3NpemUgPSB7CiAgICB3aWR0aDogUExPVC5fZnVsbExheW91dC53aWR0aCwKICAgIGhlaWdodDogUExPVC5fZnVsbExheW91dC5oZWlnaHQsCiAgfTsKICAvLyBXZSBoYXZlIHRvIHNhdmUgdGhlIHBhZCBkYXRhIGJlZm9yZSBwb3BwaW5nIHNvIHdlIGNhbiByZXNpemUgcHJlY2lzZWx5CiAgY29uc3QgcGFkID0ge307CiAgcGFkLnVucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgdHJ1ZSk7CiAgcGFkLnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICAvLyBXZSBkbyB0b3AgYW5kIGxlZnQgYmFzZWQgb24gdGhlIGN1cnJlbnQgcmVjdAogIGZvciAoY29uc3Qga2V5IG9mIFsidG9wIiwgImxlZnQiXSkgewogICAgY29uc3Qgc3RhcnRfdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY29udGFpbmVyX3JlY3Rba2V5XTsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgZm9yIChjb25zdCBraW5kIG9mIFsicGFkZGluZyIsICJib3JkZXIiXSkgewogICAgICBvZmZzZXQgKz0gcGFkLnBvcHBlZFtraW5kXVtrZXldIC0gcGFkLnVucG9wcGVkW2tpbmRdW2tleV07CiAgICB9CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHN0YXJ0X3ZhbCAtIG9mZnNldCArICJweCI7CiAgICBpZiAoa2V5ID09PSAibGVmdCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIC8vIFdlIGNvbXB1dGUgdGhlIHdpZHRoIGFuZCBoZWlnaHQgZGVwZW5kaW5nIG9uIGV2ZW50dWFsIGNvbmZpZyBkYXRhCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoewogICAgd2lkdGg6CiAgICAgIHRhcmdldF9wbG90X3NpemUud2lkdGggPz8KICAgICAgY29uZmlnX3NwYW5zLndpZHRoLmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS5oZWlnaHQgPz8KICAgICAgY29uZmlnX3NwYW5zLmhlaWdodC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUuaGVpZ2h0LAogIH0pOwogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIGNvbnN0IHZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNzeltrZXldOwogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSB2YWwgKyAicHgiOwogICAgaWYgKGtleSA9PT0gIndpZHRoIikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCBmYWxzZSk7CiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgdW5wb3BfY29udGFpbmVyKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKfQoKQ09OVEFJTkVSLnBvcE91dCA9IHBvcG91dF9jb250YWluZXI7CgpmdW5jdGlvbiBEdWFsQ2xpY2soc2luZ2xlX2Z1bmMsIGRibF9mdW5jKSB7CiAgbGV0IG5jbGlja3MgPSAwOwogIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykgewogICAgbmNsaWNrcyArPSAxOwogICAgaWYgKG5jbGlja3MgPiAxKSB7CiAgICAgIGRibF9mdW5jKC4uLmFyZ3MpOwogICAgICBuY2xpY2tzID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIGRlbGF5KDMwMCkudGhlbigoKSA9PiB7CiAgICAgICAgaWYgKG5jbGlja3MgPT0gMSkgewogICAgICAgICAgc2luZ2xlX2Z1bmMoLi4uYXJncyk7CiAgICAgICAgfQogICAgICAgIG5jbGlja3MgPSAwOwogICAgICB9KTsKICAgIH0KICB9Owp9CgovLyBXZSByZW1vdmUgdGhlIGRlZmF1bHQgZG93bmxvYWQgaW1hZ2UgYnV0dG9uCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSwKICBbInRvSW1hZ2UiXQopOwovLyBXZSBhZGQgdGhlIGN1c3RvbSBidXR0b24gdG8gdGhlIG1vZGViYXIKcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkLAogIFsKICAgIHsKICAgICAgbmFtZTogIkNvcHkgUE5HIHRvIENsaXBib2FyZCIsCiAgICAgIGljb246IHsKICAgICAgICBoZWlnaHQ6IDUyMCwKICAgICAgICB3aWR0aDogNTIwLAogICAgICAgIHBhdGg6ICJNMjgwIDY0aDQwYzM1LjMgMCA2NCAyOC43IDY0IDY0VjQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEg2NGMtMzUuMyAwLTY0LTI4LjctNjQtNjRWMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0aDQwIDkuNkMxMjEgMjcuNSAxNTMuMyAwIDE5MiAwczcxIDI3LjUgNzguNCA2NEgyODB6TTY0IDExMmMtOC44IDAtMTYgNy4yLTE2IDE2VjQ0OGMwIDguOCA3LjIgMTYgMTYgMTZIMzIwYzguOCAwIDE2LTcuMiAxNi0xNlYxMjhjMC04LjgtNy4yLTE2LTE2LTE2SDMwNHYyNGMwIDEzLjMtMTAuNyAyNC0yNCAyNEgxOTIgMTA0Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNFYxMTJINjR6bTEyOC04YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHoiLAogICAgICB9LAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soY29weUltYWdlVG9DbGlwYm9hcmQsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKCk7CiAgICAgIH0pLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIkRvd25sb2FkIEltYWdlIiwKICAgICAgaWNvbjogUGxvdGx5Lkljb25zLmNhbWVyYSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKHNhdmVJbWFnZVRvRmlsZSwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoeyBjbDogImZpbGVzYXZlIiB9KTsKICAgICAgfSksCiAgICB9LAogIF0KKTsKCmZ1bmN0aW9uIGdldE9mZnNldERhdGEoZWwpIHsKICBsZXQgY3MgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgbnVsbCk7CiAgY29uc3Qgb2RhdGEgPSB7CiAgICBwYWRkaW5nOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgfSwKICAgIGJvcmRlcjogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgfQogIH07CiAgaWYgKGVsID09PSBQTE9UKSB7CiAgICAvLyBGb3IgdGhlIFBMT1Qgd2UgYWxzbyB3YW50IHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBvZmZzZXQKICAgIG9kYXRhLm9mZnNldCA9IHsKICAgICAgdG9wOiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldFRvcCA6IDAsCiAgICAgIGxlZnQ6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0TGVmdCA6IDAsCiAgICB9CiAgfQogIHJldHVybiBvZGF0YTsKfQpmdW5jdGlvbiBnZXRTaXplRGF0YSgpIHsKICBjb25zdCBkYXRhID0gewogICAgcGxvdF9wYWQ6IGdldE9mZnNldERhdGEoUExPVCksCiAgICBwbG90X3JlY3Q6IFBMT1QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgICBjb250YWluZXJfcGFkOiBnZXRPZmZzZXREYXRhKENPTlRBSU5FUiksCiAgICBjb250YWluZXJfcmVjdDogQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogIH07CiAgcmV0dXJuIGRhdGE7Cn0KZnVuY3Rpb24gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGNvbnN0IGNvbXB1dGVkX3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIGNvbnN0IG9mZnNldHMgPSBjb21wdXRlZF9zaXplLm9mZnNldHM7CgogIGNvbnN0IHBsb3RfZGF0YSA9IHsKICAgIHdpZHRoOiB3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiBoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfTsKCiAgcmV0dXJuIHsKICAgIHdpZHRoOiAod2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCkgKyBvZmZzZXRzLndpZHRoLAogICAgaGVpZ2h0OiAoaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0KSArIG9mZnNldHMuaGVpZ2h0LAogICAgbm9DaGFuZ2U6IHdpZHRoID09IGNvbXB1dGVkX3NpemUud2lkdGggJiYgaGVpZ2h0ID09IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH0KfQoKLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGNoYW5nZSB0aGUgY29udGFpbmVyIHNpemUgc28gdGhhdCB0aGUgcmVzdWx0aW5nIHBsb3Qgd2lsbCBiZSBtYXRjaGluZyB0aGUgcHJvdmlkZWQgc3BlY3MKZnVuY3Rpb24gY2hhbmdlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgaWYgKCFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgY29uc29sZS5sb2coIlRyaWVkIHRvIGNoYW5nZSBjb250YWluZXIgc2l6ZSB3aGVuIG5vdCBwb3BwZWQsIGlnbm9yaW5nIik7CiAgICByZXR1cm47CiAgfQoKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEpOwoKICBpZiAoY3N6Lm5vQ2hhbmdlKSB7CiAgICBjb25zb2xlLmxvZygiU2l6ZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50LCBpZ25vcmluZyIpOwogICAgcmV0dXJuCiAgfQogIC8vIFdlIGFyZSBub3cgZ29pbmcgdG8gc2V0IGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGNvbnRhaW5lcgogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gY3N6W2tleV0gKyAicHgiOwogIH0KfQovLyBXZSBub3cgY3JlYXRlIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgdXBkYXRlIHRoZSBwbG90IGJhc2VkIG9uIHRoZSB2YWx1ZXMgc3BlY2lmaWVkCmZ1bmN0aW9uIHVwZGF0ZUZyb21IZWFkZXIoKSB7CiAgY29uc3QgaGVhZGVyX2RhdGEgPSB7CiAgICBoZWlnaHQ6IGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUsCiAgICB3aWR0aDogY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlLAogIH07CiAgY2hhbmdlQ29udGFpbmVyU2l6ZShoZWFkZXJfZGF0YSk7Cn0KLy8gV2UgYXNzaWduIHRoaXMgZnVuY3Rpb24gdG8gdGhlIG9uYmx1ciBldmVudCBvZiB3aWR0aCBhbmQgaGVpZ2h0CmlmIChmaXJzdFJ1bikgewogIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLnVpX3NwYW4ub25ibHVyID0gKGUpID0+IHsKICAgICAgY29udGFpbmVyLnVpX3ZhbHVlID0gY29udGFpbmVyLnVpX3NwYW4udGV4dENvbnRlbnQ7CiAgICAgIHVwZGF0ZUZyb21IZWFkZXIoKTsKICAgIH07CiAgfQp9Ci8vIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIHBsb3Qgc2l6ZSB0byB1c2UgZm9yIHJlbGF5b3V0IGFzIGEgZnVuY3Rpb24gb2YgdGhlIGNvbnRhaW5lciBzaXplCmZ1bmN0aW9uIGNvbXB1dGVQbG90U2l6ZShkYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIC8vIFJlbW92ZSBQYWRkaW5nCiAgY29uc3QgeyBjb250YWluZXJfcGFkLCBwbG90X3BhZCwgY29udGFpbmVyX3JlY3QgfSA9IGRhdGE7CiAgY29uc3Qgb2Zmc2V0cyA9IHsKICAgIHdpZHRoOgogICAgICBwbG90X3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLndpZHRoICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LmxlZnQgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci53aWR0aCwKICAgIGhlaWdodDoKICAgICAgcGxvdF9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBwbG90X3BhZC5ib3JkZXIuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LnRvcCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci5oZWlnaHQsCiAgfTsKICBjb25zdCBzeiA9IHsKICAgIHdpZHRoOiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LndpZHRoIC0gb2Zmc2V0cy53aWR0aCksCiAgICBoZWlnaHQ6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3QuaGVpZ2h0IC0gb2Zmc2V0cy5oZWlnaHQpLAogICAgb2Zmc2V0cywKICB9OwogIHJldHVybiBzejsKfQoKLy8gQ3JlYXRlIHRoZSByZXNpemVPYnNlcnZlciB0byBtYWtlIHRoZSBwbG90IGV2ZW4gbW9yZSByZXNwb25zaXZlISA6bWFnaWM6CmNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7CiAgY29uc3Qgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpOwogIGNvbnN0IHtjb250YWluZXJfcmVjdCwgY29udGFpbmVyX3BhZH0gPSBzaXplRGF0YTsKICBsZXQgcGxvdF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICAvLyBXZSBzYXZlIHRoZSBoZWlnaHQgaW4gdGhlIFBMT1Qgb2JqZWN0CiAgUExPVC5jb250YWluZXJfaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0OwogIC8vIFdlIGRlYWwgd2l0aCBzb21lIHN0dWZmIGlmIHRoZSBjb250YWluZXIgaXMgcG9wcHBlZAogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSBjb250YWluZXJfcmVjdC53aWR0aCArICJweCI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gY29udGFpbmVyX3JlY3QubGVmdCArICJweCI7CiAgY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS5oZWlnaHQ7CiAgY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlID0gcGxvdF9zaXplLndpZHRoOwogIC8qIAoJCVRoZSBhZGRpdGlvbiBvZiB0aGUgaW52YWxpZCBhcmd1bWVudCBgcGx1dG9yZXNpemVgIHNlZW1zIHRvIGZpeCB0aGUgcHJvYmxlbSB3aXRoIGNhbGxpbmcgYHJlbGF5b3V0YCBzaW1wbHkgd2l0aCBge2F1dG9zaXplOiB0cnVlfWAgYXMgdXBkYXRlIGJyZWFraW5nIG1vdXNlIHJlbGF5b3V0IGV2ZW50cyB0cmFja2luZy4gCgkJU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wbG90bHkvcGxvdGx5LmpzL2lzc3Vlcy82MTU2IGZvciBkZXRhaWxzCgkJKi8KICBsZXQgY29uZmlnID0gewogICAgLy8gSWYgdGhpcyBpcyBwb3BwZWQgb3V0LCB3ZSBpZ25vcmUgdGhlIG9yaWdpbmFsIHdpZHRoL2hlaWdodAogICAgd2lkdGg6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX3dpZHRoKSA/PyBwbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX2hlaWdodCkgPz8gcGxvdF9zaXplLmhlaWdodCwKICAgIHBsdXRvcmVzaXplOiB0cnVlLAogIH07CiAgUGxvdGx5LnJlbGF5b3V0KFBMT1QsIGNvbmZpZykudGhlbigoKSA9PiB7CiAgICBpZiAocmVtb3ZlX2NvbnRhaW5lcl9zaXplICYmICFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBhdm9pZCB0aGUgZmlyc3QgcmVzaXplIHVwb24gcGxvdCBjcmVhdGlvbiB0byBhbHJlYWR5IGJlIHdpdGhvdXQgYSBmaXhlZCBoZWlnaHQKICAgICAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9ICIiOwogICAgICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICAgICAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmFsc2U7CiAgICB9CiAgfSk7Cn0pOwoKcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShDT05UQUlORVIpOwoKClBsb3RseS5yZWFjdChQTE9ULCBwbG90X29iaikudGhlbigoKSA9PiB7CgkvLyBBc3NpZ24gdGhlIFBsb3RseSBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhwbG90bHlfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1Qub24oa2V5LCBsaXN0ZW5lcikKCQl9Cgl9CgkvLyBBc3NpZ24gdGhlIEpTIGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKGpzX2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULmFkZEV2ZW50TGlzdGVuZXIoa2V5LCBsaXN0ZW5lciwgewoJCQkJc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbAoJCQl9KQoJCX0KCX0KfQopCgoKaW52YWxpZGF0aW9uLnRoZW4oKCkgPT4gewoJLy8gUmVtb3ZlIGFsbCBwbG90bHkgbGlzdGVuZXJzCglQTE9ULnJlbW92ZUFsbExpc3RlbmVycygpCgkvLyBSZW1vdmUgYWxsIEpTIGxpc3RlbmVycwoJY29udHJvbGxlci5hYm9ydCgpCgkvLyBSZW1vdmUgdGhlIHJlc2l6ZU9ic2VydmVyCglyZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCkKfSkKCgoKCQlyZXR1cm4gQ09OVEFJTkVSCgk8L3NjcmlwdD4KpG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv8hOzSS8sHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQzNDgyNGRiNy0xM2M0LTQ1ZTItYmVmYS1mMDI3YjliNTg1YzC5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4DJIW0tXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5HZNTdiY2MwNWIwLTgxZGEtMTFlZi0yMDQwLTM1ODVjOWI0OTU0Zi80ODQ2MmFjOGEwMzQ1YmJiuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJGYxZjNiNzAwLTU5MTYtNDk2Zi1iOTM4LTQ2ZjdmMDhiNGViNoqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnaaokJPHNjcmlwdCBpZD0ncGxvdF8xJz4KCQkvLyBXZSBzdGFydCBieSBwdXR0aW5nIGFsbCB0aGUgdmFyaWFibGUgaW50ZXJwb2xhdGlvbiBoZXJlIGF0IHRoZSBiZWdpbm5pbmcKCQkvLyBXZSBoYXZlIHRvIGNvbnZlcnQgYWxsIHR5cGVkYXJyYXlzIGluIHRoZSBsYXlvdXQgdG8gbm9ybWFsIGFycmF5cy4gU2VlIElzc3VlICMyNQoJCS8vIFdlIHVzZSBsb2Rhc2ggZm9yIHRoaXMgZm9yIGNvbXBhY3RuZXNzCgkJZnVuY3Rpb24gcmVtb3ZlVHlwZWRBcnJheShvKSB7CgkJCXJldHVybiBfLmlzVHlwZWRBcnJheShvKSA/IEFycmF5LmZyb20obykgOgoJCQlfLmlzUGxhaW5PYmplY3QobykgPyBfLm1hcFZhbHVlcyhvLCByZW1vdmVUeXBlZEFycmF5KSA6IAoJCQlvCgkJfQoKCQkvLyBQdWJsaXNoIHRoZSBwbG90IG9iamVjdCB0byBKUwoJCWxldCBwbG90X29iaiA9IF8udXBkYXRlKC8qIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgQWJzdHJhY3RQbHV0b0RpbmdldGplcy5EaXNwbGF5LnB1Ymxpc2hlZF90b19qcyAqLyBnZXRQdWJsaXNoZWRPYmplY3QoIjdiY2MwNWIwLTgxZGEtMTFlZi0yMDQwLTM1ODVjOWI0OTU0Zi80NTZkZTEzYWIzYjZlOTAyIiksICJsYXlvdXQiLCByZW1vdmVUeXBlZEFycmF5KQoJCS8vIEdldCB0aGUgcGxvdGx5IGxpc3RlbmVycwoJCWNvbnN0IHBsb3RseV9saXN0ZW5lcnMgPSB7fQoJCS8vIEdldCB0aGUgSlMgbGlzdGVuZXJzCgkJY29uc3QganNfbGlzdGVuZXJzID0ge30KCQkvLyBEZWFsIHdpdGggZXZlbnR1YWwgY3VzdG9tIGNsYXNzZXMKCQlsZXQgY3VzdG9tX2NsYXNzbGlzdCA9IFtdCgoKCQkvLyBMb2FkIHRoZSBwbG90bHkgbGlicmFyeQoJCWxldCBQbG90bHkgPSB1bmRlZmluZWQKCQl0cnkgewoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiLi9wbG90bHlqcy9wbG90bHlqcy0yLjI2LjIubWluLmpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfSBjYXRjaCAoZSkgewoJCQljb25zb2xlLmxvZygiTG9jYWwgbG9hZCBmYWlsZWQsIHRyeWluZyB3aXRoIHRoZSB3ZWIgZXNtLnNoIHZlcnNpb24iKQoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiaHR0cHM6Ly9lc20uc2gvdjEzNS9wbG90bHkuanMtZGlzdC1taW5AMi4yNi4yL2VzbmV4dC9wbG90bHkuanMtZGlzdC1taW4ubWpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfQoKCQkvLyBDaGVjayBpZiB3ZSBoYXZlIHRvIGZvcmNlIGxvY2FsIG1hdGhqYXggZm9udCBjYWNoZQoJCWlmIChmYWxzZSAmJiB3aW5kb3c/Lk1hdGhKYXg/LmNvbmZpZz8uc3ZnPy5mb250Q2FjaGUgPT09ICdnbG9iYWwnKSB7CgkJCXdpbmRvdy5NYXRoSmF4LmNvbmZpZy5zdmcuZm9udENhY2hlID0gJ2xvY2FsJwoJCX0KCgkJLy8gRmxhZyB0byBjaGVjayBpZiB0aGlzIGNlbGwgd2FzICBtYW51YWxseSByYW4gb3IgcmVhY3RpdmVseSByYW4KY29uc3QgZmlyc3RSdW4gPSB0aGlzID8gZmFsc2UgOiB0cnVlCmNvbnN0IENPTlRBSU5FUiA9IHRoaXMgPz8gaHRtbGA8ZGl2IGNsYXNzPSdwbHV0b3Bsb3RseS1jb250YWluZXInPmAKY29uc3QgUExPVCA9IENPTlRBSU5FUi5xdWVyeVNlbGVjdG9yKCcuanMtcGxvdGx5LXBsb3QnKSA/PyBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2PmApCmNvbnN0IHBhcmVudCA9IENPTlRBSU5FUi5wYXJlbnRFbGVtZW50Ci8vIFdlIHVzZSBhIGNvbnRyb2xsZXIgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVycyB1cG9uIGludmFsaWRhdGlvbgpjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpCi8vIFdlIGhhdmUgdG8gYWRkIHRoaXMgdG8ga2VlcCBzdXBwb3J0aW5nIEBiaW5kIHdpdGggdGhlIG9sZCBBUEkgdXNpbmcgUExPVApQTE9ULmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGUpID0+IHsKCUNPTlRBSU5FUi52YWx1ZSA9IFBMT1QudmFsdWUKCWlmIChlLmJ1YmJsZXMpIHsKCQlyZXR1cm4KCX0KCUNPTlRBSU5FUi5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnaW5wdXQnKSkKfSwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pCgoJLy8gVGhpcyBjcmVhdGUgdGhlIHN0eWxlIHN1YmRpdiBvbiBmaXJzdCBydW4KCWZpcnN0UnVuICYmIENPTlRBSU5FUi5hcHBlbmRDaGlsZChodG1sYAoJPHN0eWxlPgoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciB7CgkJd2lkdGg6IDEwMCU7CgkJaGVpZ2h0OiAxMDAlOwoJCW1pbi1oZWlnaHQ6IDA7CgkJbWluLXdpZHRoOiAwOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciAuanMtcGxvdGx5LXBsb3QgLnBsb3RseSBkaXYgewoJCW1hcmdpbjogMCBhdXRvOyAvLyBUaGlzIGNlbnRlcnMgdGhlIHBsb3QKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIucG9wcGVkLW91dCB7CgkJb3ZlcmZsb3c6IGF1dG87CgkJei1pbmRleDogMTAwMDsKCQlwb3NpdGlvbjogZml4ZWQ7CgkJcmVzaXplOiBib3RoOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMHB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwcHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciB7CgkJZGlzcGxheTogZmxleDsKCQlmbGV4LWZsb3c6IHJvdyB3cmFwOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDEycHg7CgkJcG9zaXRpb246IGZpeGVkOwoJCXotaW5kZXg6IDEwMDE7CgkJY3Vyc29yOiBtb3ZlOwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgLTEwMCUpOwoJCXBhZGRpbmc6IDVweDsKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIHNwYW4gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQlmbGV4OiAxCgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlci5oaWRkZW4gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuY2xpcGJvYXJkLXNwYW4gewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCX0KCS5jbGlwYm9hcmQtdmFsdWUgewoJCXBhZGRpbmctcmlnaHQ6IDVweDsKCQlwYWRkaW5nLWxlZnQ6IDJweDsKCQljdXJzb3I6IHRleHQ7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlmbGV4OiAwIDAgMTAwJTsKCQl0ZXh0LWFsaWduOiBjZW50ZXI7CgkJYm9yZGVyLXRvcDogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCW1hcmdpbi10b3A6IDVweDsKCQlkaXNwbGF5OiBub25lOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5maWxlc2F2ZSAuY2xpcGJvYXJkLXNwYW4uZmlsZW5hbWUgewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5jbGlwYm9hcmQtdmFsdWUuZmlsZW5hbWUgewoJCW1hcmdpbi1sZWZ0OiAzcHg7CgkJdGV4dC1hbGlnbjogbGVmdDsKCQltaW4td2lkdGg6IG1pbig2MCUsIG1pbi1jb250ZW50KTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogaW5saW5lLWZsZXg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IC5sYWJlbCB7CgkJZmxleDogMCAwIDA7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZvcm1hdCB7CgkJcG9zaXRpb246IHJlbGF0aXZlOwoJCWZsZXg6IDEgMCBhdXRvOwoJCW1pbi13aWR0aDogMzBweDsKCQltYXJnaW4tcmlnaHQ6IDEwcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJCWZsZXgtZmxvdzogY29sdW1uOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXBhZGRpbmctbGVmdDogM3B4OwoJCXotaW5kZXg6IDIwMDA7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgewoJCWN1cnNvcjogcG9pbnRlcjsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlwYWRkaW5nOiAzcHg7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTNweCwgLTZweCk7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5mb3JtYXQtb3B0aW9uOm5vdCguc2VsZWN0ZWQpIHsKCQltYXJnaW4tdG9wOiAzcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24uc2VsZWN0ZWQgewoJCW9yZGVyOiAtMTsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpob3ZlciB7CgkJYmFja2dyb3VuZC1jb2xvcjogdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7Cgl9CglzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZm9udC13ZWlnaHQ6IG5vcm1hbDsKCQljb2xvcjogdmFyKC0tcGx1dG8tb3V0cHV0LWNvbG9yKTsKCQlkaXNwbGF5OiBub25lOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgY2FsYygtMTAwJSAtIDEwcHgpKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkubGFiZWwgewoJCXVzZXItc2VsZWN0OiBub25lOwoJfQoJLmxhYmVsOmhvdmVyIHNwYW4uY29uZmlnLXZhbHVlIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJbWluLXdpZHRoOiAxNTBweDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5tYXRjaGluZy1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tbWFjcm8tY29sb3IpOwoJCWZvbnQtd2VpZ2h0OiBib2xkOwoJfQoJLmNsaXBib2FyZC1zcGFuLmRpZmZlcmVudC1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tdGFnLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KPC9zdHlsZT4KYCkKCmxldCBvcmlnaW5hbF9oZWlnaHQgPSBwbG90X29iai5sYXlvdXQuaGVpZ2h0CmxldCBvcmlnaW5hbF93aWR0aCA9IHBsb3Rfb2JqLmxheW91dC53aWR0aAovLyBGb3IgdGhlIGhlaWdodCB3ZSBoYXZlIHRvIGFsc28gcHV0IGEgZml4ZWQgdmFsdWUgaW4gY2FzZSB0aGUgcGxvdCBpcyBwdXQgb24gYSBub24tZml4ZWQtc2l6ZSBjb250YWluZXIgKGxpa2UgdGhlIGRlZmF1bHQgd3JhcHBlcikKLy8gV2UgZGVmaW5lIGEgdmFyaWFibGUgdG8gY2hlY2sgd2hldGhlciB3ZSBzdGlsbCBoYXZlIHRvIHJlbW92ZSB0aGUgZml4ZWQgaGVpZ2h0CmxldCByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmaXJzdFJ1bgpsZXQgY29udGFpbmVyX2hlaWdodCA9IG9yaWdpbmFsX2hlaWdodCA/PyBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPz8gNDAwCkNPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfaGVpZ2h0ICsgJ3B4JwoKLy8gV2UgY3JlYXRlIGEgUHJvbWlzZSB2ZXJzaW9uIG9mIHNldFRpbWVvdXQKZnVuY3Rpb24gZGVsYXkobXMpIHsKICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTsKfQoKLy8gV2UgaW1wb3J0IGludGVyYWN0IGZvciBkcmFnZ2luZy9yZXNpemluZwpjb25zdCB7IGRlZmF1bHQ6IGludGVyYWN0IH0gPSBhd2FpdCBpbXBvcnQoJ2h0dHBzOi8vZXNtLnNoL2ludGVyYWN0anNAMS4xMC4xOScpCgoKZnVuY3Rpb24gZ2V0SW1hZ2VPcHRpb25zKCkgewogIGNvbnN0IG8gPSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPz8ge307CiAgcmV0dXJuIHsKICAgIGZvcm1hdDogby5mb3JtYXQgPz8gInBuZyIsCiAgICB3aWR0aDogby53aWR0aCA/PyBvcmlnaW5hbF93aWR0aCwKICAgIGhlaWdodDogby5oZWlnaHQgPz8gb3JpZ2luYWxfaGVpZ2h0LAogICAgc2NhbGU6IG8uc2NhbGUgPz8gMSwKICAgIGZpbGVuYW1lOiBvLmZpbGVuYW1lID8/ICJuZXdwbG90IiwKICB9Owp9Cgpjb25zdCBDTElQQk9BUkRfSEVBREVSID0KICBDT05UQUlORVIucXVlcnlTZWxlY3RvcigiLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIiKSA/PwogIENPTlRBSU5FUi5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAiYWZ0ZXJiZWdpbiIsCiAgICBodG1sYDxkaXYgY2xhc3M9InBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgaGlkZGVuIj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZvcm1hdCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5Gb3JtYXQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZm9ybWF0Ij48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHdpZHRoIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPldpZHRoOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIHdpZHRoIj48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gaGVpZ2h0IgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkhlaWdodDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBoZWlnaHQiPjwvc3Bhbj5weDwvc3BhbgogICAgICA+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzY2FsZSIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5TY2FsZTo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBzY2FsZSI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHNldCI+U2V0PC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHVuc2V0Ij5VbnNldDwvYnV0dG9uPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gZmlsZW5hbWUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+RmlsZW5hbWU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZmlsZW5hbWUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgPC9kaXY+YAogICk7CgpmdW5jdGlvbiBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKSB7CiAgY29uc3QgdmFsaWRfY2xhc3NlcyA9IFsKICAgICJtaXNzaW5nLWNvbmZpZyIsCiAgICAibWF0Y2hpbmctY29uZmlnIiwKICAgICJkaWZmZXJlbnQtY29uZmlnIiwKICBdOwogIGZ1bmN0aW9uIHNldENsYXNzKGNsKSB7CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgdmFsaWRfY2xhc3NlcykgewogICAgICBjb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZShuYW1lLCBuYW1lID09IGNsKTsKICAgIH0KICB9CiAgLy8gV2UgdXNlIHRoZSBjdXN0b20gZ2V0dGVycyB3ZSdsbCBzZXQgdXAgaW4gdGhlIGNvbnRhaW5lcgogIGNvbnN0IHsgdWlfdmFsdWUsIGNvbmZpZ192YWx1ZSwgY29uZmlnX3NwYW4sIGtleSB9ID0gY29udGFpbmVyOwogIGlmIChjb25maWdfdmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgc2V0Q2xhc3MoIm1pc3NpbmctY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGlzIG5vdCBwcmVzZW50IGluIHRoZSBjb25maWcuYDsKICB9IGVsc2UgaWYgKHVpX3ZhbHVlID09IGNvbmZpZ192YWx1ZSkgewogICAgc2V0Q2xhc3MoIm1hdGNoaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgdGhlIHNhbWUgdmFsdWUgaW4gdGhlIGNvbmZpZyBhbmQgaW4gdGhlIGhlYWRlci5gOwogIH0gZWxzZSB7CiAgICBzZXRDbGFzcygiZGlmZmVyZW50LWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgYSBkaWZmZXJlbnQgdmFsdWUgKDxlbT4ke2NvbmZpZ192YWx1ZX08L2VtPikgaW4gdGhlIGNvbmZpZy5gOwogIH0KICAvLyBBZGQgaW5mbyBhYm91dCBzZXR0aW5nIGFuZCB1bnNldHRpbmcKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgb24gdGhlIGxhYmVsIDxlbT48Yj5vbmNlPC9iPjwvZW0+IHRvIHNldCB0aGUgY3VycmVudCBVSSB2YWx1ZSBpbiB0aGUgY29uZmlnLmAKICApOwogIGNvbmZpZ19zcGFuLmluc2VydEFkamFjZW50SFRNTCgKICAgICJiZWZvcmVlbmQiLAogICAgYDxicj5DbGljayA8ZW0+PGI+dHdpY2U8L2I+PC9lbT4gdG8gcmVtb3ZlIHRoaXMga2V5IGZyb20gdGhlIGNvbmZpZy5gCiAgKTsKfQoKY29uc3QgdmFsaWRfZm9ybWF0cyA9IFsicG5nIiwgInN2ZyIsICJ3ZWJwIiwgImpwZWciLCAiZnVsbC1qc29uIl07CmZ1bmN0aW9uIGluaXRpYWxpemVVSVZhbHVlU3BhbihzcGFuLCBrZXksIHZhbHVlKSB7CiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9IGtleSA9PT0gImZvcm1hdCIgPyAiZmFsc2UiIDogInRydWUiOwogIGxldCBwYXJzZSA9ICh4KSA9PiB4OwogIGxldCB1cGRhdGUgPSAoeCkgPT4gKHNwYW4udGV4dENvbnRlbnQgPSB4KTsKICBpZiAoa2V5ID09PSAid2lkdGgiIHx8IGtleSA9PT0gImhlaWdodCIpIHsKICAgIHBhcnNlID0gKHgpID0+IE1hdGgucm91bmQocGFyc2VGbG9hdCh4KSk7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJzY2FsZSIpIHsKICAgIHBhcnNlID0gcGFyc2VGbG9hdDsKICB9IGVsc2UgaWYgKGtleSA9PT0gImZvcm1hdCIpIHsKICAgIC8vIFdlIHJlbW92ZSBjb250ZW50RWRpdGFibGUKICAgIHNwYW4uY29udGVudEVkaXRhYmxlID0gImZhbHNlIjsKICAgIC8vIEhlcmUgd2UgZmlyc3QgYWRkIHRoZSBzdWJzcGFucyBmb3IgZWFjaCBvcHRpb24KICAgIGNvbnN0IG9wdHNfZGl2ID0gc3Bhbi5hcHBlbmRDaGlsZChodG1sYDxkaXYgY2xhc3M9ImZvcm1hdC1vcHRpb25zIj48L2Rpdj5gKTsKICAgIGZvciAoY29uc3QgZm10IG9mIHZhbGlkX2Zvcm1hdHMpIHsKICAgICAgY29uc3Qgb3B0ID0gb3B0c19kaXYuYXBwZW5kQ2hpbGQoCiAgICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iZm9ybWF0LW9wdGlvbiAke2ZtdH0iPiR7Zm10fTwvc3Bhbj5gCiAgICAgICk7CiAgICAgIG9wdC5vbmNsaWNrID0gKGUpID0+IHsKICAgICAgICBzcGFuLnZhbHVlID0gb3B0LnRleHRDb250ZW50OwogICAgICB9OwogICAgfQogICAgcGFyc2UgPSAoeCkgPT4gewogICAgICByZXR1cm4gdmFsaWRfZm9ybWF0cy5pbmNsdWRlcyh4KSA/IHggOiBsb2NhbFZhbHVlOwogICAgfTsKICAgIHVwZGF0ZSA9ICh4KSA9PiB7CiAgICAgIGZvciAoY29uc3Qgb3B0IG9mIG9wdHNfZGl2LmNoaWxkcmVuKSB7CiAgICAgICAgb3B0LmNsYXNzTGlzdC50b2dnbGUoInNlbGVjdGVkIiwgb3B0LnRleHRDb250ZW50ID09PSB4KTsKICAgICAgfQogICAgfTsKICB9IGVsc2UgewogICAgLy8gV2Ugb25seSBoYXZlIGZpbGVuYW1lIGhlcmUKICB9CiAgbGV0IGxvY2FsVmFsdWU7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwYW4sICJ2YWx1ZSIsIHsKICAgIGdldDogKCkgPT4gewogICAgICByZXR1cm4gbG9jYWxWYWx1ZTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgaWYgKHZhbCAhPT0gIiIpIHsKICAgICAgICBsb2NhbFZhbHVlID0gcGFyc2UodmFsKTsKICAgICAgfQogICAgICB1cGRhdGUobG9jYWxWYWx1ZSk7CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKICAvLyBXZSBhbHNvIGFzc2lnbiBhIGxpc3RlbmVyIHNvIHRoYXQgdGhlIGVkaXRhYmxlIGlzIGJsdXJyZWQgd2hlbiBlbnRlciBpcyBwcmVzc2VkCiAgc3Bhbi5vbmtleWRvd24gPSAoZSkgPT4gewogICAgaWYgKGUua2V5Q29kZSA9PT0gMTMpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBzcGFuLmJsdXIoKTsKICAgIH0KICB9OwogIHNwYW4udmFsdWUgPSB2YWx1ZTsKfQoKZnVuY3Rpb24gaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3BhbihzcGFuLCBrZXkpIHsKICAvLyBIZXJlIHdlIG1vc3RseSB3YW50IHRvIGRlZmluZSB0aGUgc2V0dGVyIGFuZCBnZXR0ZXIKICBjb25zdCBjb250YWluZXIgPSBzcGFuLmNsb3Nlc3QoIi5jbGlwYm9hcmQtc3BhbiIpOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgfSwKICAgIHNldDogKHZhbCkgPT4gewogICAgICAvLyBpZiB1bmRlZmluZWQgaXMgcGFzc2VkLCB3ZSByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIG9wdGlvbnMKICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZGVsZXRlIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgICB9IGVsc2UgewogICAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldID0gdmFsOwogICAgICB9CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKfQoKY29uc3QgY29uZmlnX3NwYW5zID0ge307CmZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGdldEltYWdlT3B0aW9ucygpKSkgewogIGNvbnN0IGNvbnRhaW5lciA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcihgLmNsaXBib2FyZC1zcGFuLiR7a2V5fWApOwogIGNvbnN0IGxhYmVsID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5sYWJlbCIpOwogIC8vIFdlIGdpdmUgdGhlIGxhYmVsIGEgZnVuY3Rpb24gdGhhdCBvbiBzaW5nbGUgY2xpY2sgd2lsbCBzZXQgdGhlIGN1cnJlbnQgdmFsdWUgYW5kIHdpdGggZG91YmxlIGNsaWNrIHdpbGwgdW5zZXQgaXQKICBsYWJlbC5vbmNsaWNrID0gRHVhbENsaWNrKAogICAgKCkgPT4gewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfSwKICAgIChlKSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJlIiwgZSk7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IHVuZGVmaW5lZDsKICAgIH0KICApOwogIGNvbnN0IHVpX3ZhbHVlX3NwYW4gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC12YWx1ZSIpOwogIGNvbnN0IGNvbmZpZ192YWx1ZV9zcGFuID0KICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuY29uZmlnLXZhbHVlIikgPz8KICAgIGxhYmVsLmluc2VydEFkamFjZW50RWxlbWVudCgKICAgICAgImFmdGVyYmVnaW4iLAogICAgICBodG1sYDxzcGFuIGNsYXNzPSJjb25maWctdmFsdWUiPjwvc3Bhbj5gCiAgICApOwogIC8vIEFzc2luZyB0aGUgdHdvIHNwYW5zIGFzIHByb3BlcnRpZXMgb2YgdGhlIGNvbnRhaW5pbmcgc3BhbgogIGNvbnRhaW5lci51aV9zcGFuID0gdWlfdmFsdWVfc3BhbjsKICBjb250YWluZXIuY29uZmlnX3NwYW4gPSBjb25maWdfdmFsdWVfc3BhbjsKICBjb250YWluZXIua2V5ID0ga2V5OwogIGNvbmZpZ19zcGFuc1trZXldID0gY29udGFpbmVyOwogIGlmIChmaXJzdFJ1bikgewogICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID0KICAgICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogICAgLy8gV2UgZG8gdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSB2YWx1ZSBzcGFuCiAgICBpbml0aWFsaXplVUlWYWx1ZVNwYW4odWlfdmFsdWVfc3Bhbiwga2V5LCB2YWx1ZSk7CiAgICAvLyBUaGVuIHdlIGluaXRpYWxpemUgdGhlIGNvbmZpZyB2YWx1ZQogICAgaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3Bhbihjb25maWdfdmFsdWVfc3Bhbiwga2V5KTsKICAgIC8vIFdlIHB1dCBzb21lIGNvbnZlbmllbmNlIGdldHRlcnMvc2V0dGVycwogICAgLy8gdWlfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgInVpX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IHVpX3ZhbHVlX3NwYW4udmFsdWUsCiAgICAgIHNldDogKHZhbCkgPT4gewogICAgICAgIHVpX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICAgIC8vIGNvbmZpZ192YWx1ZSBmb3J3YXJkCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAiY29uZmlnX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IGNvbmZpZ192YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSA9IHZhbDsKICAgICAgfSwKICAgIH0pOwogIH0KfQoKLy8gVGhlc2Ugb2JqZWN0cyB3aWxsIGNvbnRhaW4gdGhlIGRlZmF1bHQgdmFsdWUKCi8vIFRoaXMgY29kZSB1cGRhdGVzIHRoZSBpbWFnZSBvcHRpb25zIGluIHRoZSBQTE9UIGNvbmZpZyB3aXRoIHRoZSBwcm92aWRlZCBvbmVzCmZ1bmN0aW9uIHNldEltYWdlT3B0aW9ucyhvKSB7CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBvW2tleV07CiAgfQp9CmZ1bmN0aW9uIHVuc2V0SW1hZ2VPcHRpb25zKCkgewogIHNldEltYWdlT3B0aW9ucyh7fSk7Cn0KCmNvbnN0IHNldF9idXR0b24gPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtc3Bhbi5zZXQiKTsKY29uc3QgdW5zZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4udW5zZXQiKTsKaWYgKGZpcnN0UnVuKSB7CiAgc2V0X2J1dHRvbi5vbmNsaWNrID0gKGUpID0+IHsKICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfQogIH07CiAgdW5zZXRfYnV0dG9uLm9uY2xpY2sgPSB1bnNldEltYWdlT3B0aW9uczsKfQoKLy8gV2UgYWRkIGEgZnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIGNsaXBib2FyZCBpcyBwb3BwZWQgb3V0CkNPTlRBSU5FUi5pc1BvcHBlZE91dCA9ICgpID0+IHsKICByZXR1cm4gQ09OVEFJTkVSLmNsYXNzTGlzdC5jb250YWlucygicG9wcGVkLW91dCIpOwp9OwoKQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNlZG93biA9IGZ1bmN0aW9uIChldmVudCkgewogIGlmIChldmVudC50YXJnZXQubWF0Y2hlcygic3Bhbi5jbGlwYm9hcmQtdmFsdWUiKSkgewogICAgY29uc29sZS5sb2coIldlIGRvbid0IG1vdmUhIik7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IHN0YXJ0ID0gewogICAgbGVmdDogcGFyc2VGbG9hdChDT05UQUlORVIuc3R5bGUubGVmdCksCiAgICB0b3A6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLnRvcCksCiAgICBYOiBldmVudC5wYWdlWCwKICAgIFk6IGV2ZW50LnBhZ2VZLAogIH07CiAgZnVuY3Rpb24gbW92ZUF0KGV2ZW50LCBzdGFydCkgewogICAgY29uc3QgdG9wID0gZXZlbnQucGFnZVkgLSBzdGFydC5ZICsgc3RhcnQudG9wICsgInB4IjsKICAgIGNvbnN0IGxlZnQgPSBldmVudC5wYWdlWCAtIHN0YXJ0LlggKyBzdGFydC5sZWZ0ICsgInB4IjsKICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUudG9wID0gdG9wOwogIH0KCiAgLy8gbW92ZSBvdXIgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGJhbGwgdW5kZXIgdGhlIHBvaW50ZXIKICBtb3ZlQXQoZXZlbnQsIHN0YXJ0KTsKICBmdW5jdGlvbiBvbk1vdXNlTW92ZShldmVudCkgewogICAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgfQoKICAvLyBXZSB1c2UgdGhpcyB0byByZW1vdmUgdGhlIG1vdXNlbW92ZSB3aGVuIGNsaWNraW5nIG91dHNpZGUgb2YgdGhlIGNvbnRhaW5lcgogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CgogIC8vIG1vdmUgdGhlIGNvbnRhaW5lciBvbiBtb3VzZW1vdmUKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCBvbk1vdXNlTW92ZSwgewogICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCwKICB9KTsKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICBjbGVhblVwKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKCiAgZnVuY3Rpb24gY2xlYW5VcCgpIHsKICAgIGNvbnNvbGUubG9nKCJjbGVhbmluZyB1cCB0aGUgcGxvdCBtb3ZlIGxpc3RlbmVyIik7CiAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICBDTElQQk9BUkRfSEVBREVSLm9ubW91c2V1cCA9IG51bGw7CiAgfQoKICAvLyAoMykgZHJvcCB0aGUgYmFsbCwgcmVtb3ZlIHVubmVlZGVkIGhhbmRsZXJzCiAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBjbGVhblVwOwp9OwoKZnVuY3Rpb24gc2VuZFRvQ2xpcGJvYXJkKGJsb2IpIHsKICBpZiAoIW5hdmlnYXRvci5jbGlwYm9hcmQpIHsKICAgIGFsZXJ0KAogICAgICAiVGhlIENsaXBib2FyZCBBUEkgZG9lcyBub3Qgc2VlbSB0byBiZSBhdmFpbGFibGUsIG1ha2Ugc3VyZSB0aGUgUGx1dG8gbm90ZWJvb2sgaXMgYmVpbmcgdXNlZCBmcm9tIGVpdGhlciBsb2NhbGhvc3Qgb3IgYW4gaHR0cHMgc291cmNlLiIKICAgICk7CiAgfQogIG5hdmlnYXRvci5jbGlwYm9hcmQKICAgIC53cml0ZShbCiAgICAgIG5ldyBDbGlwYm9hcmRJdGVtKHsKICAgICAgICAvLyBUaGUga2V5IGlzIGRldGVybWluZWQgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIGJsb2IncyB0eXBlLgogICAgICAgIFtibG9iLnR5cGVdOiBibG9iLAogICAgICB9KSwKICAgIF0pCiAgICAudGhlbigKICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgIGNvbnNvbGUubG9nKCJBc3luYzogQ29weWluZyB0byBjbGlwYm9hcmQgd2FzIHN1Y2Nlc3NmdWwhIik7CiAgICAgIH0sCiAgICAgIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJBc3luYzogQ291bGQgbm90IGNvcHkgdGV4dDogIiwgZXJyKTsKICAgICAgfQogICAgKTsKfQoKZnVuY3Rpb24gY29weUltYWdlVG9DbGlwYm9hcmQoKSB7CiAgLy8gV2UgZXh0cmFjdCB0aGUgaW1hZ2Ugb3B0aW9ucyBmcm9tIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzIChpZiB0aGV5IGV4aXN0KQogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuIFdlIGFsc28gaWdub3JlIGZvcm1hdCBiZWNhdXNlIHRoZSBjbGlwYm9hcmQgb25seSBzdXBwb3J0cyBwbmcuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwga2V5ID09PSAiZm9ybWF0IikgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbmZpZ1trZXldID0gdmFsOwogIH0KICBQbG90bHkudG9JbWFnZShQTE9ULCBjb25maWcpLnRoZW4oZnVuY3Rpb24gKGRhdGFVcmwpIHsKICAgIGZldGNoKGRhdGFVcmwpCiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5ibG9iKCkpCiAgICAgIC50aGVuKChibG9iKSA9PiB7CiAgICAgICAgY29uc3QgcGFzdGVfcmVjZWl2ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdwYXN0ZS1yZWNlaXZlci5wbHV0b3Bsb3RseScpCiAgICAgICAgaWYgKHBhc3RlX3JlY2VpdmVyKSB7CiAgICAgICAgICBwYXN0ZV9yZWNlaXZlci5hdHRhY2hJbWFnZShkYXRhVXJsLCBDT05UQUlORVIpCiAgICAgICAgfQogICAgICAgIHNlbmRUb0NsaXBib2FyZChibG9iKQogICAgICB9KTsKICB9KTsKfQoKZnVuY3Rpb24gc2F2ZUltYWdlVG9GaWxlKCkgewogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LmRvd25sb2FkSW1hZ2UoUExPVCwgY29uZmlnKTsKfQoKbGV0IGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwLCB0b3A6IDAsIGxlZnQ6IDAgfTsKZnVuY3Rpb24gdW5wb3BfY29udGFpbmVyKGNsKSB7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCBmYWxzZSk7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoY2wsIGZhbHNlKTsKICAvLyBXZSBmaXggdGhlIGhlaWdodCBiYWNrIHRvIHRoZSB2YWx1ZSBpdCBoYWQgYmVmb3JlIHBvcG91dCwgYWxzbyBzZXR0aW5nIHRoZSBmbGFnIHRvIHNpZ25hbCB0aGF0IHVwb24gZmlyc3QgcmVzaXplIHdlIHJlbW92ZSB0aGUgZml4ZWQgaW5saW5lLXN0eWxlCiAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9IGNvbnRhaW5lcl9yZWN0LmhlaWdodCArICJweCI7CiAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gdHJ1ZTsKICAvLyBXZSBzZXQgdGhlIG90aGVyIGZpeGVkIGlubGluZS1zdHlsZXMgdG8gbnVsbAogIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogIENPTlRBSU5FUi5zdHlsZS50b3AgPSAiIjsKICBDT05UQUlORVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIFdlIGFsc28gcmVtb3ZlIHRoZSBDTElQQk9BUkRfSEVBREVSCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9ICIiOwogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIEZpbmFsbHkgd2UgcmVtb3ZlIHRoZSBoaWRkZW4gY2xhc3MgdG8gdGhlIGhlYWRlcgogIENMSVBCT0FSRF9IRUFERVIuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgdHJ1ZSk7CiAgcmV0dXJuOwp9CmZ1bmN0aW9uIHBvcG91dF9jb250YWluZXIob3B0cykgewogIGNvbnN0IGNsID0gb3B0cz8uY2w7CiAgY29uc3QgdGFyZ2V0X2NvbnRhaW5lcl9zaXplID0gb3B0cz8udGFyZ2V0X2NvbnRhaW5lcl9zaXplID8/IHt9OwogIGNvbnN0IHRhcmdldF9wbG90X3NpemUgPSBvcHRzPy50YXJnZXRfcGxvdF9zaXplID8/IHt9OwogIGlmIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgcmV0dXJuIHVucG9wX2NvbnRhaW5lcihjbCk7CiAgfQogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBjbCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0cnVlKTsKICAvLyBXZSBleHRyYWN0IHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNvbnRhaW5lciwgc2F2ZSB0aGVtIGFuZCBmaXggdGhlbQogIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH0gPSBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgY29udGFpbmVyX3JlY3QgPSB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9OwogIC8vIFdlIHNhdmUgdGhlIGN1cnJlbnQgcGxvdCBzaXplIGJlZm9yZSB3ZSBwb3AgYXMgaXQgd2lsbCBmaWxsIHRoZSBzY3JlZW4KICBjb25zdCBjdXJyZW50X3Bsb3Rfc2l6ZSA9IHsKICAgIHdpZHRoOiBQTE9ULl9mdWxsTGF5b3V0LndpZHRoLAogICAgaGVpZ2h0OiBQTE9ULl9mdWxsTGF5b3V0LmhlaWdodCwKICB9OwogIC8vIFdlIGhhdmUgdG8gc2F2ZSB0aGUgcGFkIGRhdGEgYmVmb3JlIHBvcHBpbmcgc28gd2UgY2FuIHJlc2l6ZSBwcmVjaXNlbHkKICBjb25zdCBwYWQgPSB7fTsKICBwYWQudW5wb3BwZWQgPSBnZXRTaXplRGF0YSgpLmNvbnRhaW5lcl9wYWQ7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCB0cnVlKTsKICBwYWQucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIC8vIFdlIGRvIHRvcCBhbmQgbGVmdCBiYXNlZCBvbiB0aGUgY3VycmVudCByZWN0CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ0b3AiLCAibGVmdCJdKSB7CiAgICBjb25zdCBzdGFydF92YWwgPSB0YXJnZXRfY29udGFpbmVyX3NpemVba2V5XSA/PyBjb250YWluZXJfcmVjdFtrZXldOwogICAgbGV0IG9mZnNldCA9IDA7CiAgICBmb3IgKGNvbnN0IGtpbmQgb2YgWyJwYWRkaW5nIiwgImJvcmRlciJdKSB7CiAgICAgIG9mZnNldCArPSBwYWQucG9wcGVkW2tpbmRdW2tleV0gLSBwYWQudW5wb3BwZWRba2luZF1ba2V5XTsKICAgIH0KICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gc3RhcnRfdmFsIC0gb2Zmc2V0ICsgInB4IjsKICAgIGlmIChrZXkgPT09ICJsZWZ0IikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgLy8gV2UgY29tcHV0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBkZXBlbmRpbmcgb24gZXZlbnR1YWwgY29uZmlnIGRhdGEKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7CiAgICB3aWR0aDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS53aWR0aCA/PwogICAgICBjb25maWdfc3BhbnMud2lkdGguY29uZmlnX3ZhbHVlID8/CiAgICAgIGN1cnJlbnRfcGxvdF9zaXplLndpZHRoLAogICAgaGVpZ2h0OgogICAgICB0YXJnZXRfcGxvdF9zaXplLmhlaWdodCA/PwogICAgICBjb25maWdfc3BhbnMuaGVpZ2h0LmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS5oZWlnaHQsCiAgfSk7CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgY29uc3QgdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY3N6W2tleV07CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHZhbCArICJweCI7CiAgICBpZiAoa2V5ID09PSAid2lkdGgiKSB7CiAgICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGVba2V5XSA9IENPTlRBSU5FUi5zdHlsZVtrZXldOwogICAgfQogIH0KICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIGZhbHNlKTsKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICB1bnBvcF9jb250YWluZXIoKTsKICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9LAogICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0KICApOwp9CgpDT05UQUlORVIucG9wT3V0ID0gcG9wb3V0X2NvbnRhaW5lcjsKCmZ1bmN0aW9uIER1YWxDbGljayhzaW5nbGVfZnVuYywgZGJsX2Z1bmMpIHsKICBsZXQgbmNsaWNrcyA9IDA7CiAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7CiAgICBuY2xpY2tzICs9IDE7CiAgICBpZiAobmNsaWNrcyA+IDEpIHsKICAgICAgZGJsX2Z1bmMoLi4uYXJncyk7CiAgICAgIG5jbGlja3MgPSAwOwogICAgfSBlbHNlIHsKICAgICAgZGVsYXkoMzAwKS50aGVuKCgpID0+IHsKICAgICAgICBpZiAobmNsaWNrcyA9PSAxKSB7CiAgICAgICAgICBzaW5nbGVfZnVuYyguLi5hcmdzKTsKICAgICAgICB9CiAgICAgICAgbmNsaWNrcyA9IDA7CiAgICAgIH0pOwogICAgfQogIH07Cn0KCi8vIFdlIHJlbW92ZSB0aGUgZGVmYXVsdCBkb3dubG9hZCBpbWFnZSBidXR0b24KcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9SZW1vdmUgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlLAogIFsidG9JbWFnZSJdCik7Ci8vIFdlIGFkZCB0aGUgY3VzdG9tIGJ1dHRvbiB0byB0aGUgbW9kZWJhcgpwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb0FkZCA9IF8udW5pb24oCiAgcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQsCiAgWwogICAgewogICAgICBuYW1lOiAiQ29weSBQTkcgdG8gQ2xpcGJvYXJkIiwKICAgICAgaWNvbjogewogICAgICAgIGhlaWdodDogNTIwLAogICAgICAgIHdpZHRoOiA1MjAsCiAgICAgICAgcGF0aDogIk0yODAgNjRoNDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRWNDQ4YzAgMzUuMy0yOC43IDY0LTY0IDY0SDY0Yy0zNS4zIDAtNjQtMjguNy02NC02NFYxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRoNDAgOS42QzEyMSAyNy41IDE1My4zIDAgMTkyIDBzNzEgMjcuNSA3OC40IDY0SDI4MHpNNjQgMTEyYy04LjggMC0xNiA3LjItMTYgMTZWNDQ4YzAgOC44IDcuMiAxNiAxNiAxNkgzMjBjOC44IDAgMTYtNy4yIDE2LTE2VjEyOGMwLTguOC03LjItMTYtMTYtMTZIMzA0djI0YzAgMTMuMy0xMC43IDI0LTI0IDI0SDE5MiAxMDRjLTEzLjMgMC0yNC0xMC43LTI0LTI0VjExMkg2NHptMTI4LThhMjQgMjQgMCAxIDAgMC00OCAyNCAyNCAwIDEgMCAwIDQ4eiIsCiAgICAgIH0sCiAgICAgIGRpcmVjdGlvbjogInVwIiwKICAgICAgY2xpY2s6IER1YWxDbGljayhjb3B5SW1hZ2VUb0NsaXBib2FyZCwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoKTsKICAgICAgfSksCiAgICB9LAogICAgewogICAgICBuYW1lOiAiRG93bmxvYWQgSW1hZ2UiLAogICAgICBpY29uOiBQbG90bHkuSWNvbnMuY2FtZXJhLAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soc2F2ZUltYWdlVG9GaWxlLCAoKSA9PiB7CiAgICAgICAgcG9wb3V0X2NvbnRhaW5lcih7IGNsOiAiZmlsZXNhdmUiIH0pOwogICAgICB9KSwKICAgIH0sCiAgXQopOwoKZnVuY3Rpb24gZ2V0T2Zmc2V0RGF0YShlbCkgewogIGxldCBjcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsLCBudWxsKTsKICBjb25zdCBvZGF0YSA9IHsKICAgIHBhZGRpbmc6IHsKICAgICAgbGVmdDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSwKICAgICAgYm90dG9tOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSArIHBhcnNlRmxvYXQoY3MucGFkZGluZ0JvdHRvbSksCiAgICB9LAogICAgYm9yZGVyOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyTGVmdFdpZHRoKSwKICAgICAgcmlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyUmlnaHRXaWR0aCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5ib3JkZXJUb3BXaWR0aCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCkgKyBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICB9CiAgfTsKICBpZiAoZWwgPT09IFBMT1QpIHsKICAgIC8vIEZvciB0aGUgUExPVCB3ZSBhbHNvIHdhbnQgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIG9mZnNldAogICAgb2RhdGEub2Zmc2V0ID0gewogICAgICB0b3A6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0VG9wIDogMCwKICAgICAgbGVmdDogUExPVC5vZmZzZXRQYXJlbnQgPT0gQ09OVEFJTkVSID8gUExPVC5vZmZzZXRMZWZ0IDogMCwKICAgIH0KICB9CiAgcmV0dXJuIG9kYXRhOwp9CmZ1bmN0aW9uIGdldFNpemVEYXRhKCkgewogIGNvbnN0IGRhdGEgPSB7CiAgICBwbG90X3BhZDogZ2V0T2Zmc2V0RGF0YShQTE9UKSwKICAgIHBsb3RfcmVjdDogUExPVC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICAgIGNvbnRhaW5lcl9wYWQ6IGdldE9mZnNldERhdGEoQ09OVEFJTkVSKSwKICAgIGNvbnRhaW5lcl9yZWN0OiBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgfTsKICByZXR1cm4gZGF0YTsKfQpmdW5jdGlvbiBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgY29uc3QgY29tcHV0ZWRfc2l6ZSA9IGNvbXB1dGVQbG90U2l6ZShzaXplRGF0YSk7CiAgY29uc3Qgb2Zmc2V0cyA9IGNvbXB1dGVkX3NpemUub2Zmc2V0czsKCiAgY29uc3QgcGxvdF9kYXRhID0gewogICAgd2lkdGg6IHdpZHRoID8/IGNvbXB1dGVkX3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IGhlaWdodCA/PyBjb21wdXRlZF9zaXplLmhlaWdodCwKICB9OwoKICByZXR1cm4gewogICAgd2lkdGg6ICh3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoKSArIG9mZnNldHMud2lkdGgsCiAgICBoZWlnaHQ6IChoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQpICsgb2Zmc2V0cy5oZWlnaHQsCiAgICBub0NoYW5nZTogd2lkdGggPT0gY29tcHV0ZWRfc2l6ZS53aWR0aCAmJiBoZWlnaHQgPT0gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfQp9CgovLyBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hhbmdlIHRoZSBjb250YWluZXIgc2l6ZSBzbyB0aGF0IHRoZSByZXN1bHRpbmcgcGxvdCB3aWxsIGJlIG1hdGNoaW5nIHRoZSBwcm92aWRlZCBzcGVjcwpmdW5jdGlvbiBjaGFuZ2VDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICBpZiAoIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICBjb25zb2xlLmxvZygiVHJpZWQgdG8gY2hhbmdlIGNvbnRhaW5lciBzaXplIHdoZW4gbm90IHBvcHBlZCwgaWdub3JpbmciKTsKICAgIHJldHVybjsKICB9CgogIGNvbnN0IGNzeiA9IGNvbXB1dGVDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSk7CgogIGlmIChjc3oubm9DaGFuZ2UpIHsKICAgIGNvbnNvbGUubG9nKCJTaXplIGlzIHRoZSBzYW1lIGFzIGN1cnJlbnQsIGlnbm9yaW5nIik7CiAgICByZXR1cm4KICB9CiAgLy8gV2UgYXJlIG5vdyBnb2luZyB0byBzZXQgaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgY29udGFpbmVyCiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSBjc3pba2V5XSArICJweCI7CiAgfQp9Ci8vIFdlIG5vdyBjcmVhdGUgdGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCB1cGRhdGUgdGhlIHBsb3QgYmFzZWQgb24gdGhlIHZhbHVlcyBzcGVjaWZpZWQKZnVuY3Rpb24gdXBkYXRlRnJvbUhlYWRlcigpIHsKICBjb25zdCBoZWFkZXJfZGF0YSA9IHsKICAgIGhlaWdodDogY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSwKICAgIHdpZHRoOiBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUsCiAgfTsKICBjaGFuZ2VDb250YWluZXJTaXplKGhlYWRlcl9kYXRhKTsKfQovLyBXZSBhc3NpZ24gdGhpcyBmdW5jdGlvbiB0byB0aGUgb25ibHVyIGV2ZW50IG9mIHdpZHRoIGFuZCBoZWlnaHQKaWYgKGZpcnN0UnVuKSB7CiAgZm9yIChjb25zdCBjb250YWluZXIgb2YgT2JqZWN0LnZhbHVlcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIudWlfc3Bhbi5vbmJsdXIgPSAoZSkgPT4gewogICAgICBjb250YWluZXIudWlfdmFsdWUgPSBjb250YWluZXIudWlfc3Bhbi50ZXh0Q29udGVudDsKICAgICAgdXBkYXRlRnJvbUhlYWRlcigpOwogICAgfTsKICB9Cn0KLy8gVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgcGxvdCBzaXplIHRvIHVzZSBmb3IgcmVsYXlvdXQgYXMgYSBmdW5jdGlvbiBvZiB0aGUgY29udGFpbmVyIHNpemUKZnVuY3Rpb24gY29tcHV0ZVBsb3RTaXplKGRhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgLy8gUmVtb3ZlIFBhZGRpbmcKICBjb25zdCB7IGNvbnRhaW5lcl9wYWQsIHBsb3RfcGFkLCBjb250YWluZXJfcmVjdCB9ID0gZGF0YTsKICBjb25zdCBvZmZzZXRzID0gewogICAgd2lkdGg6CiAgICAgIHBsb3RfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBwbG90X3BhZC5ib3JkZXIud2lkdGggKwogICAgICBwbG90X3BhZC5vZmZzZXQubGVmdCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy53aWR0aCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLndpZHRoLAogICAgaGVpZ2h0OgogICAgICBwbG90X3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIHBsb3RfcGFkLmJvcmRlci5oZWlnaHQgKwogICAgICBwbG90X3BhZC5vZmZzZXQudG9wICsKICAgICAgY29udGFpbmVyX3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLmhlaWdodCwKICB9OwogIGNvbnN0IHN6ID0gewogICAgd2lkdGg6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3Qud2lkdGggLSBvZmZzZXRzLndpZHRoKSwKICAgIGhlaWdodDogTWF0aC5yb3VuZChjb250YWluZXJfcmVjdC5oZWlnaHQgLSBvZmZzZXRzLmhlaWdodCksCiAgICBvZmZzZXRzLAogIH07CiAgcmV0dXJuIHN6Owp9CgovLyBDcmVhdGUgdGhlIHJlc2l6ZU9ic2VydmVyIHRvIG1ha2UgdGhlIHBsb3QgZXZlbiBtb3JlIHJlc3BvbnNpdmUhIDptYWdpYzoKY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHsKICBjb25zdCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCk7CiAgY29uc3Qge2NvbnRhaW5lcl9yZWN0LCBjb250YWluZXJfcGFkfSA9IHNpemVEYXRhOwogIGxldCBwbG90X3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIC8vIFdlIHNhdmUgdGhlIGhlaWdodCBpbiB0aGUgUExPVCBvYmplY3QKICBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQ7CiAgLy8gV2UgZGVhbCB3aXRoIHNvbWUgc3R1ZmYgaWYgdGhlIGNvbnRhaW5lciBpcyBwb3BwcGVkCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9IGNvbnRhaW5lcl9yZWN0LndpZHRoICsgInB4IjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBjb250YWluZXJfcmVjdC5sZWZ0ICsgInB4IjsKICBjb25maWdfc3BhbnMuaGVpZ2h0LnVpX3ZhbHVlID0gcGxvdF9zaXplLmhlaWdodDsKICBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUgPSBwbG90X3NpemUud2lkdGg7CiAgLyogCgkJVGhlIGFkZGl0aW9uIG9mIHRoZSBpbnZhbGlkIGFyZ3VtZW50IGBwbHV0b3Jlc2l6ZWAgc2VlbXMgdG8gZml4IHRoZSBwcm9ibGVtIHdpdGggY2FsbGluZyBgcmVsYXlvdXRgIHNpbXBseSB3aXRoIGB7YXV0b3NpemU6IHRydWV9YCBhcyB1cGRhdGUgYnJlYWtpbmcgbW91c2UgcmVsYXlvdXQgZXZlbnRzIHRyYWNraW5nLiAKCQlTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Bsb3RseS9wbG90bHkuanMvaXNzdWVzLzYxNTYgZm9yIGRldGFpbHMKCQkqLwogIGxldCBjb25maWcgPSB7CiAgICAvLyBJZiB0aGlzIGlzIHBvcHBlZCBvdXQsIHdlIGlnbm9yZSB0aGUgb3JpZ2luYWwgd2lkdGgvaGVpZ2h0CiAgICB3aWR0aDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfd2lkdGgpID8/IHBsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfaGVpZ2h0KSA/PyBwbG90X3NpemUuaGVpZ2h0LAogICAgcGx1dG9yZXNpemU6IHRydWUsCiAgfTsKICBQbG90bHkucmVsYXlvdXQoUExPVCwgY29uZmlnKS50aGVuKCgpID0+IHsKICAgIGlmIChyZW1vdmVfY29udGFpbmVyX3NpemUgJiYgIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIHRoZSBmaXJzdCByZXNpemUgdXBvbiBwbG90IGNyZWF0aW9uIHRvIGFscmVhZHkgYmUgd2l0aG91dCBhIGZpeGVkIGhlaWdodAogICAgICBDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gIiI7CiAgICAgIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogICAgICByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmYWxzZTsKICAgIH0KICB9KTsKfSk7CgpyZXNpemVPYnNlcnZlci5vYnNlcnZlKENPTlRBSU5FUik7CgoKUGxvdGx5LnJlYWN0KFBMT1QsIHBsb3Rfb2JqKS50aGVuKCgpID0+IHsKCS8vIEFzc2lnbiB0aGUgUGxvdGx5IGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKHBsb3RseV9saXN0ZW5lcnMpKSB7CgkJZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcl92ZWMpIHsKCQkJUExPVC5vbihrZXksIGxpc3RlbmVyKQoJCX0KCX0KCS8vIEFzc2lnbiB0aGUgSlMgZXZlbnQgbGlzdGVuZXJzCglmb3IgKGNvbnN0IFtrZXksIGxpc3RlbmVyX3ZlY10gb2YgT2JqZWN0LmVudHJpZXMoanNfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1QuYWRkRXZlbnRMaXN0ZW5lcihrZXksIGxpc3RlbmVyLCB7CgkJCQlzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsCgkJCX0pCgkJfQoJfQp9CikKCgppbnZhbGlkYXRpb24udGhlbigoKSA9PiB7CgkvLyBSZW1vdmUgYWxsIHBsb3RseSBsaXN0ZW5lcnMKCVBMT1QucmVtb3ZlQWxsTGlzdGVuZXJzKCkKCS8vIFJlbW92ZSBhbGwgSlMgbGlzdGVuZXJzCgljb250cm9sbGVyLmFib3J0KCkKCS8vIFJlbW92ZSB0aGUgcmVzaXplT2JzZXJ2ZXIKCXJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKQp9KQoKCgoJCXJldHVybiBDT05UQUlORVIKCTwvc2NyaXB0PgqkbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/yE6rkI6wcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJGYxZjNiNzAwLTU5MTYtNDk2Zi1iOTM4LTQ2ZjdmMDhiNGViNrlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgGLiPu1cHVibGlzaGVkX29iamVjdF9rZXlzkdk1N2JjYzA1YjAtODFkYS0xMWVmLTIwNDAtMzU4NWM5YjQ5NTRmLzQ1NmRlMTNhYjNiNmU5MDK4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkOTE3OWFhNDAtYmI0MC00YTM2LWFlMWUtMDBhZTQyOTM1YTVmiqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedlIU2VxdWVuY2VbIM+EID0gMzAuNTg3IG1zIHwgYmxvY2tzOiAzIHwgQURDOiAxIHwgR1I6IDIgfCBSRjogMSB8IERFRjogMCBdpG1pbWWqdGV4dC9wbGFpbqxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b/ITVOECrBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkOTE3OWFhNDAtYmI0MC00YTM2LWFlMWUtMDBhZTQyOTM1YTVmuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOC/uXeLVwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJGFkYTYwMmQyLTRmNGItNGZiNC1hNzYzLThhNjM5ZTA1ZmYzOIqmcXVldWVkwqRsb2dzkoikbGluZf+jbXNnktkuUnVubmluZyBzaW11bGF0aW9uIGluIHRoZSBDUFUgd2l0aCAyIHRocmVhZChzKap0ZXh0L3BsYWlup2NlbGxfaWTZJGFkYTYwMmQyLTRmNGItNGZiNC1hNzYzLThhNjM5ZTA1ZmYzOKZrd2FyZ3OVkqxrb21hX3ZlcnNpb26SqHYiMC44LjMiqnRleHQvcGxhaW6SqnNpbV9tZXRob2SShaZwcmVmaXixS29tYU1SSUNvcmUuQmxvY2ioZWxlbWVudHOQpHR5cGWmc3RydWN0rHByZWZpeF9zaG9ydKVCbG9jaKhvYmplY3RpZLBmZmZmZmZmZjJhZjZkOGRh2SFhcHBsaWNhdGlvbi92bmQucGx1dG8udHJlZStvYmplY3SSpXNwaW5zkqIyMKp0ZXh0L3BsYWlukqt0aW1lX3BvaW50c5KjMTQ5qnRleHQvcGxhaW6SqmFkY19wb2ludHOSozEwMKp0ZXh0L3BsYWluomlktEtvbWFNUklDb3JlXzZiZmQ4OWVhpGZpbGXZTi9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvS29tYU1SSUNvcmUvd1Bnczcvc3JjL3NpbXVsYXRpb24vU2ltdWxhdG9yQ29yZS5qbKVncm91cK1TaW11bGF0b3JDb3JlpWxldmVspEluZm+IpGxpbmX/o21zZ5LZNiAgMC4wMDE2Nzcgc2Vjb25kcyAoMTAuODUgayBhbGxvY2F0aW9uczogNzQ1LjcyNyBLaUIpCqp0ZXh0L3BsYWlup2NlbGxfaWTZJGFkYTYwMmQyLTRmNGItNGZiNC1hNzYzLThhNjM5ZTA1ZmYzOKZrd2FyZ3OQomlktFBsdXRvUnVubmVyX2QxYWNiODFlpGZpbGXZUi9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUGx1dG8vUnZlR0gvc3JjL3J1bm5lci9QbHV0b1J1bm5lci9zcmMvUGx1dG9SdW5uZXIuamylZ3JvdXCrUGx1dG9SdW5uZXKlbGV2ZWyuTG9nTGV2ZWwoLTU1NSmncnVubmluZ8Kmb3V0cHV0hqRib2R52TxSYXdBY3F1aXNpdGlvbkRhdGFbU2VxTmFtZTogTm9OYW1lIHwgMSBQcm9maWxlKHMpIG9mIDEwMMOXMV2kbWltZap0ZXh0L3BsYWlurHJvb3Rhc3NpZ25lZadyYXdfZ3Jlsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b/ITgUUpbBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkYWRhNjAyZDItNGY0Yi00ZmI0LWE3NjMtOGE2MzllMDVmZjM4uWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOC25R2rVwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDk3NDc5NDM3LTljZTMtNGIzMy05MTM0LTBmMmFmODliY2NiNYqmcXVldWVkwqRsb2dzkoikbGluZf+jbXNnktkuUnVubmluZyBzaW11bGF0aW9uIGluIHRoZSBDUFUgd2l0aCAyIHRocmVhZChzKap0ZXh0L3BsYWlup2NlbGxfaWTZJDk3NDc5NDM3LTljZTMtNGIzMy05MTM0LTBmMmFmODliY2NiNaZrd2FyZ3OVkqxrb21hX3ZlcnNpb26SqHYiMC44LjMiqnRleHQvcGxhaW6SqnNpbV9tZXRob2SShaZwcmVmaXixS29tYU1SSUNvcmUuQmxvY2ioZWxlbWVudHOQpHR5cGWmc3RydWN0rHByZWZpeF9zaG9ydKVCbG9jaKhvYmplY3RpZLBmZmZmZmZmZjJhZjZkOGRh2SFhcHBsaWNhdGlvbi92bmQucGx1dG8udHJlZStvYmplY3SSpXNwaW5zkqM0MDCqdGV4dC9wbGFpbpKrdGltZV9wb2ludHOSozE2NKp0ZXh0L3BsYWlukqphZGNfcG9pbnRzkqMxMDCqdGV4dC9wbGFpbqJpZLRLb21hTVJJQ29yZV82YmZkODllYaRmaWxl2U4vaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL0tvbWFNUklDb3JlL3dQZ3M3L3NyYy9zaW11bGF0aW9uL1NpbXVsYXRvckNvcmUuamylZ3JvdXCtU2ltdWxhdG9yQ29yZaVsZXZlbKRJbmZviKRsaW5l/6Ntc2eS2TQgIDAuMDAyOTg2IHNlY29uZHMgKDE1LjU5IGsgYWxsb2NhdGlvbnM6IDQuNzc3IE1pQikKqnRleHQvcGxhaW6nY2VsbF9pZNkkOTc0Nzk0MzctOWNlMy00YjMzLTkxMzQtMGYyYWY4OWJjY2I1pmt3YXJnc5CiaWS0UGx1dG9SdW5uZXJfZDFhY2I4MWWkZmlsZdlSL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9QbHV0by9SdmVHSC9zcmMvcnVubmVyL1BsdXRvUnVubmVyL3NyYy9QbHV0b1J1bm5lci5qbKVncm91cKtQbHV0b1J1bm5lcqVsZXZlbK5Mb2dMZXZlbCgtNTU1KadydW5uaW5nwqZvdXRwdXSGpGJvZHnZPFJhd0FjcXVpc2l0aW9uRGF0YVtTZXFOYW1lOiBOb05hbWUgfCAxIFByb2ZpbGUocykgb2YgMTAww5cxXaRtaW1lqnRleHQvcGxhaW6scm9vdGFzc2lnbmVlrnJhd190Ml9zdGFyX3Nlsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b/ITrNudrBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkOTc0Nzk0MzctOWNlMy00YjMzLTkxMzQtMGYyYWY4OWJjY2I1uWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAEVzHrVwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDJlNjVhZTMxLWY1MGEtNDYyYi05NzQ0LTgwYmY2Y2RiMzg4ZYqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnaaokJPHNjcmlwdCBpZD0ncGxvdF8xJz4KCQkvLyBXZSBzdGFydCBieSBwdXR0aW5nIGFsbCB0aGUgdmFyaWFibGUgaW50ZXJwb2xhdGlvbiBoZXJlIGF0IHRoZSBiZWdpbm5pbmcKCQkvLyBXZSBoYXZlIHRvIGNvbnZlcnQgYWxsIHR5cGVkYXJyYXlzIGluIHRoZSBsYXlvdXQgdG8gbm9ybWFsIGFycmF5cy4gU2VlIElzc3VlICMyNQoJCS8vIFdlIHVzZSBsb2Rhc2ggZm9yIHRoaXMgZm9yIGNvbXBhY3RuZXNzCgkJZnVuY3Rpb24gcmVtb3ZlVHlwZWRBcnJheShvKSB7CgkJCXJldHVybiBfLmlzVHlwZWRBcnJheShvKSA/IEFycmF5LmZyb20obykgOgoJCQlfLmlzUGxhaW5PYmplY3QobykgPyBfLm1hcFZhbHVlcyhvLCByZW1vdmVUeXBlZEFycmF5KSA6IAoJCQlvCgkJfQoKCQkvLyBQdWJsaXNoIHRoZSBwbG90IG9iamVjdCB0byBKUwoJCWxldCBwbG90X29iaiA9IF8udXBkYXRlKC8qIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgQWJzdHJhY3RQbHV0b0RpbmdldGplcy5EaXNwbGF5LnB1Ymxpc2hlZF90b19qcyAqLyBnZXRQdWJsaXNoZWRPYmplY3QoIjdiY2MwNWIwLTgxZGEtMTFlZi0yMDQwLTM1ODVjOWI0OTU0Zi9hY2FkN2JiYjIzNTI5ZjMwIiksICJsYXlvdXQiLCByZW1vdmVUeXBlZEFycmF5KQoJCS8vIEdldCB0aGUgcGxvdGx5IGxpc3RlbmVycwoJCWNvbnN0IHBsb3RseV9saXN0ZW5lcnMgPSB7fQoJCS8vIEdldCB0aGUgSlMgbGlzdGVuZXJzCgkJY29uc3QganNfbGlzdGVuZXJzID0ge30KCQkvLyBEZWFsIHdpdGggZXZlbnR1YWwgY3VzdG9tIGNsYXNzZXMKCQlsZXQgY3VzdG9tX2NsYXNzbGlzdCA9IFtdCgoKCQkvLyBMb2FkIHRoZSBwbG90bHkgbGlicmFyeQoJCWxldCBQbG90bHkgPSB1bmRlZmluZWQKCQl0cnkgewoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiLi9wbG90bHlqcy9wbG90bHlqcy0yLjI2LjIubWluLmpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfSBjYXRjaCAoZSkgewoJCQljb25zb2xlLmxvZygiTG9jYWwgbG9hZCBmYWlsZWQsIHRyeWluZyB3aXRoIHRoZSB3ZWIgZXNtLnNoIHZlcnNpb24iKQoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiaHR0cHM6Ly9lc20uc2gvdjEzNS9wbG90bHkuanMtZGlzdC1taW5AMi4yNi4yL2VzbmV4dC9wbG90bHkuanMtZGlzdC1taW4ubWpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfQoKCQkvLyBDaGVjayBpZiB3ZSBoYXZlIHRvIGZvcmNlIGxvY2FsIG1hdGhqYXggZm9udCBjYWNoZQoJCWlmIChmYWxzZSAmJiB3aW5kb3c/Lk1hdGhKYXg/LmNvbmZpZz8uc3ZnPy5mb250Q2FjaGUgPT09ICdnbG9iYWwnKSB7CgkJCXdpbmRvdy5NYXRoSmF4LmNvbmZpZy5zdmcuZm9udENhY2hlID0gJ2xvY2FsJwoJCX0KCgkJLy8gRmxhZyB0byBjaGVjayBpZiB0aGlzIGNlbGwgd2FzICBtYW51YWxseSByYW4gb3IgcmVhY3RpdmVseSByYW4KY29uc3QgZmlyc3RSdW4gPSB0aGlzID8gZmFsc2UgOiB0cnVlCmNvbnN0IENPTlRBSU5FUiA9IHRoaXMgPz8gaHRtbGA8ZGl2IGNsYXNzPSdwbHV0b3Bsb3RseS1jb250YWluZXInPmAKY29uc3QgUExPVCA9IENPTlRBSU5FUi5xdWVyeVNlbGVjdG9yKCcuanMtcGxvdGx5LXBsb3QnKSA/PyBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2PmApCmNvbnN0IHBhcmVudCA9IENPTlRBSU5FUi5wYXJlbnRFbGVtZW50Ci8vIFdlIHVzZSBhIGNvbnRyb2xsZXIgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVycyB1cG9uIGludmFsaWRhdGlvbgpjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpCi8vIFdlIGhhdmUgdG8gYWRkIHRoaXMgdG8ga2VlcCBzdXBwb3J0aW5nIEBiaW5kIHdpdGggdGhlIG9sZCBBUEkgdXNpbmcgUExPVApQTE9ULmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGUpID0+IHsKCUNPTlRBSU5FUi52YWx1ZSA9IFBMT1QudmFsdWUKCWlmIChlLmJ1YmJsZXMpIHsKCQlyZXR1cm4KCX0KCUNPTlRBSU5FUi5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnaW5wdXQnKSkKfSwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pCgoJLy8gVGhpcyBjcmVhdGUgdGhlIHN0eWxlIHN1YmRpdiBvbiBmaXJzdCBydW4KCWZpcnN0UnVuICYmIENPTlRBSU5FUi5hcHBlbmRDaGlsZChodG1sYAoJPHN0eWxlPgoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciB7CgkJd2lkdGg6IDEwMCU7CgkJaGVpZ2h0OiAxMDAlOwoJCW1pbi1oZWlnaHQ6IDA7CgkJbWluLXdpZHRoOiAwOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciAuanMtcGxvdGx5LXBsb3QgLnBsb3RseSBkaXYgewoJCW1hcmdpbjogMCBhdXRvOyAvLyBUaGlzIGNlbnRlcnMgdGhlIHBsb3QKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIucG9wcGVkLW91dCB7CgkJb3ZlcmZsb3c6IGF1dG87CgkJei1pbmRleDogMTAwMDsKCQlwb3NpdGlvbjogZml4ZWQ7CgkJcmVzaXplOiBib3RoOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMHB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwcHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciB7CgkJZGlzcGxheTogZmxleDsKCQlmbGV4LWZsb3c6IHJvdyB3cmFwOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDEycHg7CgkJcG9zaXRpb246IGZpeGVkOwoJCXotaW5kZXg6IDEwMDE7CgkJY3Vyc29yOiBtb3ZlOwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgLTEwMCUpOwoJCXBhZGRpbmc6IDVweDsKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIHNwYW4gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQlmbGV4OiAxCgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlci5oaWRkZW4gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuY2xpcGJvYXJkLXNwYW4gewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCX0KCS5jbGlwYm9hcmQtdmFsdWUgewoJCXBhZGRpbmctcmlnaHQ6IDVweDsKCQlwYWRkaW5nLWxlZnQ6IDJweDsKCQljdXJzb3I6IHRleHQ7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlmbGV4OiAwIDAgMTAwJTsKCQl0ZXh0LWFsaWduOiBjZW50ZXI7CgkJYm9yZGVyLXRvcDogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCW1hcmdpbi10b3A6IDVweDsKCQlkaXNwbGF5OiBub25lOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5maWxlc2F2ZSAuY2xpcGJvYXJkLXNwYW4uZmlsZW5hbWUgewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5jbGlwYm9hcmQtdmFsdWUuZmlsZW5hbWUgewoJCW1hcmdpbi1sZWZ0OiAzcHg7CgkJdGV4dC1hbGlnbjogbGVmdDsKCQltaW4td2lkdGg6IG1pbig2MCUsIG1pbi1jb250ZW50KTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogaW5saW5lLWZsZXg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IC5sYWJlbCB7CgkJZmxleDogMCAwIDA7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZvcm1hdCB7CgkJcG9zaXRpb246IHJlbGF0aXZlOwoJCWZsZXg6IDEgMCBhdXRvOwoJCW1pbi13aWR0aDogMzBweDsKCQltYXJnaW4tcmlnaHQ6IDEwcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJCWZsZXgtZmxvdzogY29sdW1uOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXBhZGRpbmctbGVmdDogM3B4OwoJCXotaW5kZXg6IDIwMDA7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgewoJCWN1cnNvcjogcG9pbnRlcjsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlwYWRkaW5nOiAzcHg7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTNweCwgLTZweCk7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5mb3JtYXQtb3B0aW9uOm5vdCguc2VsZWN0ZWQpIHsKCQltYXJnaW4tdG9wOiAzcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24uc2VsZWN0ZWQgewoJCW9yZGVyOiAtMTsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpob3ZlciB7CgkJYmFja2dyb3VuZC1jb2xvcjogdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7Cgl9CglzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZm9udC13ZWlnaHQ6IG5vcm1hbDsKCQljb2xvcjogdmFyKC0tcGx1dG8tb3V0cHV0LWNvbG9yKTsKCQlkaXNwbGF5OiBub25lOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgY2FsYygtMTAwJSAtIDEwcHgpKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkubGFiZWwgewoJCXVzZXItc2VsZWN0OiBub25lOwoJfQoJLmxhYmVsOmhvdmVyIHNwYW4uY29uZmlnLXZhbHVlIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJbWluLXdpZHRoOiAxNTBweDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5tYXRjaGluZy1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tbWFjcm8tY29sb3IpOwoJCWZvbnQtd2VpZ2h0OiBib2xkOwoJfQoJLmNsaXBib2FyZC1zcGFuLmRpZmZlcmVudC1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tdGFnLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KPC9zdHlsZT4KYCkKCmxldCBvcmlnaW5hbF9oZWlnaHQgPSBwbG90X29iai5sYXlvdXQuaGVpZ2h0CmxldCBvcmlnaW5hbF93aWR0aCA9IHBsb3Rfb2JqLmxheW91dC53aWR0aAovLyBGb3IgdGhlIGhlaWdodCB3ZSBoYXZlIHRvIGFsc28gcHV0IGEgZml4ZWQgdmFsdWUgaW4gY2FzZSB0aGUgcGxvdCBpcyBwdXQgb24gYSBub24tZml4ZWQtc2l6ZSBjb250YWluZXIgKGxpa2UgdGhlIGRlZmF1bHQgd3JhcHBlcikKLy8gV2UgZGVmaW5lIGEgdmFyaWFibGUgdG8gY2hlY2sgd2hldGhlciB3ZSBzdGlsbCBoYXZlIHRvIHJlbW92ZSB0aGUgZml4ZWQgaGVpZ2h0CmxldCByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmaXJzdFJ1bgpsZXQgY29udGFpbmVyX2hlaWdodCA9IG9yaWdpbmFsX2hlaWdodCA/PyBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPz8gNDAwCkNPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfaGVpZ2h0ICsgJ3B4JwoKLy8gV2UgY3JlYXRlIGEgUHJvbWlzZSB2ZXJzaW9uIG9mIHNldFRpbWVvdXQKZnVuY3Rpb24gZGVsYXkobXMpIHsKICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTsKfQoKLy8gV2UgaW1wb3J0IGludGVyYWN0IGZvciBkcmFnZ2luZy9yZXNpemluZwpjb25zdCB7IGRlZmF1bHQ6IGludGVyYWN0IH0gPSBhd2FpdCBpbXBvcnQoJ2h0dHBzOi8vZXNtLnNoL2ludGVyYWN0anNAMS4xMC4xOScpCgoKZnVuY3Rpb24gZ2V0SW1hZ2VPcHRpb25zKCkgewogIGNvbnN0IG8gPSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPz8ge307CiAgcmV0dXJuIHsKICAgIGZvcm1hdDogby5mb3JtYXQgPz8gInBuZyIsCiAgICB3aWR0aDogby53aWR0aCA/PyBvcmlnaW5hbF93aWR0aCwKICAgIGhlaWdodDogby5oZWlnaHQgPz8gb3JpZ2luYWxfaGVpZ2h0LAogICAgc2NhbGU6IG8uc2NhbGUgPz8gMSwKICAgIGZpbGVuYW1lOiBvLmZpbGVuYW1lID8/ICJuZXdwbG90IiwKICB9Owp9Cgpjb25zdCBDTElQQk9BUkRfSEVBREVSID0KICBDT05UQUlORVIucXVlcnlTZWxlY3RvcigiLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIiKSA/PwogIENPTlRBSU5FUi5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAiYWZ0ZXJiZWdpbiIsCiAgICBodG1sYDxkaXYgY2xhc3M9InBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgaGlkZGVuIj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZvcm1hdCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5Gb3JtYXQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZm9ybWF0Ij48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHdpZHRoIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPldpZHRoOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIHdpZHRoIj48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gaGVpZ2h0IgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkhlaWdodDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBoZWlnaHQiPjwvc3Bhbj5weDwvc3BhbgogICAgICA+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzY2FsZSIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5TY2FsZTo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBzY2FsZSI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHNldCI+U2V0PC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHVuc2V0Ij5VbnNldDwvYnV0dG9uPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gZmlsZW5hbWUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+RmlsZW5hbWU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZmlsZW5hbWUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgPC9kaXY+YAogICk7CgpmdW5jdGlvbiBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKSB7CiAgY29uc3QgdmFsaWRfY2xhc3NlcyA9IFsKICAgICJtaXNzaW5nLWNvbmZpZyIsCiAgICAibWF0Y2hpbmctY29uZmlnIiwKICAgICJkaWZmZXJlbnQtY29uZmlnIiwKICBdOwogIGZ1bmN0aW9uIHNldENsYXNzKGNsKSB7CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgdmFsaWRfY2xhc3NlcykgewogICAgICBjb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZShuYW1lLCBuYW1lID09IGNsKTsKICAgIH0KICB9CiAgLy8gV2UgdXNlIHRoZSBjdXN0b20gZ2V0dGVycyB3ZSdsbCBzZXQgdXAgaW4gdGhlIGNvbnRhaW5lcgogIGNvbnN0IHsgdWlfdmFsdWUsIGNvbmZpZ192YWx1ZSwgY29uZmlnX3NwYW4sIGtleSB9ID0gY29udGFpbmVyOwogIGlmIChjb25maWdfdmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgc2V0Q2xhc3MoIm1pc3NpbmctY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGlzIG5vdCBwcmVzZW50IGluIHRoZSBjb25maWcuYDsKICB9IGVsc2UgaWYgKHVpX3ZhbHVlID09IGNvbmZpZ192YWx1ZSkgewogICAgc2V0Q2xhc3MoIm1hdGNoaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgdGhlIHNhbWUgdmFsdWUgaW4gdGhlIGNvbmZpZyBhbmQgaW4gdGhlIGhlYWRlci5gOwogIH0gZWxzZSB7CiAgICBzZXRDbGFzcygiZGlmZmVyZW50LWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgYSBkaWZmZXJlbnQgdmFsdWUgKDxlbT4ke2NvbmZpZ192YWx1ZX08L2VtPikgaW4gdGhlIGNvbmZpZy5gOwogIH0KICAvLyBBZGQgaW5mbyBhYm91dCBzZXR0aW5nIGFuZCB1bnNldHRpbmcKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgb24gdGhlIGxhYmVsIDxlbT48Yj5vbmNlPC9iPjwvZW0+IHRvIHNldCB0aGUgY3VycmVudCBVSSB2YWx1ZSBpbiB0aGUgY29uZmlnLmAKICApOwogIGNvbmZpZ19zcGFuLmluc2VydEFkamFjZW50SFRNTCgKICAgICJiZWZvcmVlbmQiLAogICAgYDxicj5DbGljayA8ZW0+PGI+dHdpY2U8L2I+PC9lbT4gdG8gcmVtb3ZlIHRoaXMga2V5IGZyb20gdGhlIGNvbmZpZy5gCiAgKTsKfQoKY29uc3QgdmFsaWRfZm9ybWF0cyA9IFsicG5nIiwgInN2ZyIsICJ3ZWJwIiwgImpwZWciLCAiZnVsbC1qc29uIl07CmZ1bmN0aW9uIGluaXRpYWxpemVVSVZhbHVlU3BhbihzcGFuLCBrZXksIHZhbHVlKSB7CiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9IGtleSA9PT0gImZvcm1hdCIgPyAiZmFsc2UiIDogInRydWUiOwogIGxldCBwYXJzZSA9ICh4KSA9PiB4OwogIGxldCB1cGRhdGUgPSAoeCkgPT4gKHNwYW4udGV4dENvbnRlbnQgPSB4KTsKICBpZiAoa2V5ID09PSAid2lkdGgiIHx8IGtleSA9PT0gImhlaWdodCIpIHsKICAgIHBhcnNlID0gKHgpID0+IE1hdGgucm91bmQocGFyc2VGbG9hdCh4KSk7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJzY2FsZSIpIHsKICAgIHBhcnNlID0gcGFyc2VGbG9hdDsKICB9IGVsc2UgaWYgKGtleSA9PT0gImZvcm1hdCIpIHsKICAgIC8vIFdlIHJlbW92ZSBjb250ZW50RWRpdGFibGUKICAgIHNwYW4uY29udGVudEVkaXRhYmxlID0gImZhbHNlIjsKICAgIC8vIEhlcmUgd2UgZmlyc3QgYWRkIHRoZSBzdWJzcGFucyBmb3IgZWFjaCBvcHRpb24KICAgIGNvbnN0IG9wdHNfZGl2ID0gc3Bhbi5hcHBlbmRDaGlsZChodG1sYDxkaXYgY2xhc3M9ImZvcm1hdC1vcHRpb25zIj48L2Rpdj5gKTsKICAgIGZvciAoY29uc3QgZm10IG9mIHZhbGlkX2Zvcm1hdHMpIHsKICAgICAgY29uc3Qgb3B0ID0gb3B0c19kaXYuYXBwZW5kQ2hpbGQoCiAgICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iZm9ybWF0LW9wdGlvbiAke2ZtdH0iPiR7Zm10fTwvc3Bhbj5gCiAgICAgICk7CiAgICAgIG9wdC5vbmNsaWNrID0gKGUpID0+IHsKICAgICAgICBzcGFuLnZhbHVlID0gb3B0LnRleHRDb250ZW50OwogICAgICB9OwogICAgfQogICAgcGFyc2UgPSAoeCkgPT4gewogICAgICByZXR1cm4gdmFsaWRfZm9ybWF0cy5pbmNsdWRlcyh4KSA/IHggOiBsb2NhbFZhbHVlOwogICAgfTsKICAgIHVwZGF0ZSA9ICh4KSA9PiB7CiAgICAgIGZvciAoY29uc3Qgb3B0IG9mIG9wdHNfZGl2LmNoaWxkcmVuKSB7CiAgICAgICAgb3B0LmNsYXNzTGlzdC50b2dnbGUoInNlbGVjdGVkIiwgb3B0LnRleHRDb250ZW50ID09PSB4KTsKICAgICAgfQogICAgfTsKICB9IGVsc2UgewogICAgLy8gV2Ugb25seSBoYXZlIGZpbGVuYW1lIGhlcmUKICB9CiAgbGV0IGxvY2FsVmFsdWU7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwYW4sICJ2YWx1ZSIsIHsKICAgIGdldDogKCkgPT4gewogICAgICByZXR1cm4gbG9jYWxWYWx1ZTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgaWYgKHZhbCAhPT0gIiIpIHsKICAgICAgICBsb2NhbFZhbHVlID0gcGFyc2UodmFsKTsKICAgICAgfQogICAgICB1cGRhdGUobG9jYWxWYWx1ZSk7CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKICAvLyBXZSBhbHNvIGFzc2lnbiBhIGxpc3RlbmVyIHNvIHRoYXQgdGhlIGVkaXRhYmxlIGlzIGJsdXJyZWQgd2hlbiBlbnRlciBpcyBwcmVzc2VkCiAgc3Bhbi5vbmtleWRvd24gPSAoZSkgPT4gewogICAgaWYgKGUua2V5Q29kZSA9PT0gMTMpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBzcGFuLmJsdXIoKTsKICAgIH0KICB9OwogIHNwYW4udmFsdWUgPSB2YWx1ZTsKfQoKZnVuY3Rpb24gaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3BhbihzcGFuLCBrZXkpIHsKICAvLyBIZXJlIHdlIG1vc3RseSB3YW50IHRvIGRlZmluZSB0aGUgc2V0dGVyIGFuZCBnZXR0ZXIKICBjb25zdCBjb250YWluZXIgPSBzcGFuLmNsb3Nlc3QoIi5jbGlwYm9hcmQtc3BhbiIpOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgfSwKICAgIHNldDogKHZhbCkgPT4gewogICAgICAvLyBpZiB1bmRlZmluZWQgaXMgcGFzc2VkLCB3ZSByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIG9wdGlvbnMKICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZGVsZXRlIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgICB9IGVsc2UgewogICAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldID0gdmFsOwogICAgICB9CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKfQoKY29uc3QgY29uZmlnX3NwYW5zID0ge307CmZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGdldEltYWdlT3B0aW9ucygpKSkgewogIGNvbnN0IGNvbnRhaW5lciA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcihgLmNsaXBib2FyZC1zcGFuLiR7a2V5fWApOwogIGNvbnN0IGxhYmVsID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5sYWJlbCIpOwogIC8vIFdlIGdpdmUgdGhlIGxhYmVsIGEgZnVuY3Rpb24gdGhhdCBvbiBzaW5nbGUgY2xpY2sgd2lsbCBzZXQgdGhlIGN1cnJlbnQgdmFsdWUgYW5kIHdpdGggZG91YmxlIGNsaWNrIHdpbGwgdW5zZXQgaXQKICBsYWJlbC5vbmNsaWNrID0gRHVhbENsaWNrKAogICAgKCkgPT4gewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfSwKICAgIChlKSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJlIiwgZSk7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IHVuZGVmaW5lZDsKICAgIH0KICApOwogIGNvbnN0IHVpX3ZhbHVlX3NwYW4gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC12YWx1ZSIpOwogIGNvbnN0IGNvbmZpZ192YWx1ZV9zcGFuID0KICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuY29uZmlnLXZhbHVlIikgPz8KICAgIGxhYmVsLmluc2VydEFkamFjZW50RWxlbWVudCgKICAgICAgImFmdGVyYmVnaW4iLAogICAgICBodG1sYDxzcGFuIGNsYXNzPSJjb25maWctdmFsdWUiPjwvc3Bhbj5gCiAgICApOwogIC8vIEFzc2luZyB0aGUgdHdvIHNwYW5zIGFzIHByb3BlcnRpZXMgb2YgdGhlIGNvbnRhaW5pbmcgc3BhbgogIGNvbnRhaW5lci51aV9zcGFuID0gdWlfdmFsdWVfc3BhbjsKICBjb250YWluZXIuY29uZmlnX3NwYW4gPSBjb25maWdfdmFsdWVfc3BhbjsKICBjb250YWluZXIua2V5ID0ga2V5OwogIGNvbmZpZ19zcGFuc1trZXldID0gY29udGFpbmVyOwogIGlmIChmaXJzdFJ1bikgewogICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID0KICAgICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogICAgLy8gV2UgZG8gdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSB2YWx1ZSBzcGFuCiAgICBpbml0aWFsaXplVUlWYWx1ZVNwYW4odWlfdmFsdWVfc3Bhbiwga2V5LCB2YWx1ZSk7CiAgICAvLyBUaGVuIHdlIGluaXRpYWxpemUgdGhlIGNvbmZpZyB2YWx1ZQogICAgaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3Bhbihjb25maWdfdmFsdWVfc3Bhbiwga2V5KTsKICAgIC8vIFdlIHB1dCBzb21lIGNvbnZlbmllbmNlIGdldHRlcnMvc2V0dGVycwogICAgLy8gdWlfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgInVpX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IHVpX3ZhbHVlX3NwYW4udmFsdWUsCiAgICAgIHNldDogKHZhbCkgPT4gewogICAgICAgIHVpX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICAgIC8vIGNvbmZpZ192YWx1ZSBmb3J3YXJkCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAiY29uZmlnX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IGNvbmZpZ192YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSA9IHZhbDsKICAgICAgfSwKICAgIH0pOwogIH0KfQoKLy8gVGhlc2Ugb2JqZWN0cyB3aWxsIGNvbnRhaW4gdGhlIGRlZmF1bHQgdmFsdWUKCi8vIFRoaXMgY29kZSB1cGRhdGVzIHRoZSBpbWFnZSBvcHRpb25zIGluIHRoZSBQTE9UIGNvbmZpZyB3aXRoIHRoZSBwcm92aWRlZCBvbmVzCmZ1bmN0aW9uIHNldEltYWdlT3B0aW9ucyhvKSB7CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBvW2tleV07CiAgfQp9CmZ1bmN0aW9uIHVuc2V0SW1hZ2VPcHRpb25zKCkgewogIHNldEltYWdlT3B0aW9ucyh7fSk7Cn0KCmNvbnN0IHNldF9idXR0b24gPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtc3Bhbi5zZXQiKTsKY29uc3QgdW5zZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4udW5zZXQiKTsKaWYgKGZpcnN0UnVuKSB7CiAgc2V0X2J1dHRvbi5vbmNsaWNrID0gKGUpID0+IHsKICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfQogIH07CiAgdW5zZXRfYnV0dG9uLm9uY2xpY2sgPSB1bnNldEltYWdlT3B0aW9uczsKfQoKLy8gV2UgYWRkIGEgZnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIGNsaXBib2FyZCBpcyBwb3BwZWQgb3V0CkNPTlRBSU5FUi5pc1BvcHBlZE91dCA9ICgpID0+IHsKICByZXR1cm4gQ09OVEFJTkVSLmNsYXNzTGlzdC5jb250YWlucygicG9wcGVkLW91dCIpOwp9OwoKQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNlZG93biA9IGZ1bmN0aW9uIChldmVudCkgewogIGlmIChldmVudC50YXJnZXQubWF0Y2hlcygic3Bhbi5jbGlwYm9hcmQtdmFsdWUiKSkgewogICAgY29uc29sZS5sb2coIldlIGRvbid0IG1vdmUhIik7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IHN0YXJ0ID0gewogICAgbGVmdDogcGFyc2VGbG9hdChDT05UQUlORVIuc3R5bGUubGVmdCksCiAgICB0b3A6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLnRvcCksCiAgICBYOiBldmVudC5wYWdlWCwKICAgIFk6IGV2ZW50LnBhZ2VZLAogIH07CiAgZnVuY3Rpb24gbW92ZUF0KGV2ZW50LCBzdGFydCkgewogICAgY29uc3QgdG9wID0gZXZlbnQucGFnZVkgLSBzdGFydC5ZICsgc3RhcnQudG9wICsgInB4IjsKICAgIGNvbnN0IGxlZnQgPSBldmVudC5wYWdlWCAtIHN0YXJ0LlggKyBzdGFydC5sZWZ0ICsgInB4IjsKICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUudG9wID0gdG9wOwogIH0KCiAgLy8gbW92ZSBvdXIgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGJhbGwgdW5kZXIgdGhlIHBvaW50ZXIKICBtb3ZlQXQoZXZlbnQsIHN0YXJ0KTsKICBmdW5jdGlvbiBvbk1vdXNlTW92ZShldmVudCkgewogICAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgfQoKICAvLyBXZSB1c2UgdGhpcyB0byByZW1vdmUgdGhlIG1vdXNlbW92ZSB3aGVuIGNsaWNraW5nIG91dHNpZGUgb2YgdGhlIGNvbnRhaW5lcgogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CgogIC8vIG1vdmUgdGhlIGNvbnRhaW5lciBvbiBtb3VzZW1vdmUKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCBvbk1vdXNlTW92ZSwgewogICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCwKICB9KTsKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICBjbGVhblVwKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKCiAgZnVuY3Rpb24gY2xlYW5VcCgpIHsKICAgIGNvbnNvbGUubG9nKCJjbGVhbmluZyB1cCB0aGUgcGxvdCBtb3ZlIGxpc3RlbmVyIik7CiAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICBDTElQQk9BUkRfSEVBREVSLm9ubW91c2V1cCA9IG51bGw7CiAgfQoKICAvLyAoMykgZHJvcCB0aGUgYmFsbCwgcmVtb3ZlIHVubmVlZGVkIGhhbmRsZXJzCiAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBjbGVhblVwOwp9OwoKZnVuY3Rpb24gc2VuZFRvQ2xpcGJvYXJkKGJsb2IpIHsKICBpZiAoIW5hdmlnYXRvci5jbGlwYm9hcmQpIHsKICAgIGFsZXJ0KAogICAgICAiVGhlIENsaXBib2FyZCBBUEkgZG9lcyBub3Qgc2VlbSB0byBiZSBhdmFpbGFibGUsIG1ha2Ugc3VyZSB0aGUgUGx1dG8gbm90ZWJvb2sgaXMgYmVpbmcgdXNlZCBmcm9tIGVpdGhlciBsb2NhbGhvc3Qgb3IgYW4gaHR0cHMgc291cmNlLiIKICAgICk7CiAgfQogIG5hdmlnYXRvci5jbGlwYm9hcmQKICAgIC53cml0ZShbCiAgICAgIG5ldyBDbGlwYm9hcmRJdGVtKHsKICAgICAgICAvLyBUaGUga2V5IGlzIGRldGVybWluZWQgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIGJsb2IncyB0eXBlLgogICAgICAgIFtibG9iLnR5cGVdOiBibG9iLAogICAgICB9KSwKICAgIF0pCiAgICAudGhlbigKICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgIGNvbnNvbGUubG9nKCJBc3luYzogQ29weWluZyB0byBjbGlwYm9hcmQgd2FzIHN1Y2Nlc3NmdWwhIik7CiAgICAgIH0sCiAgICAgIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJBc3luYzogQ291bGQgbm90IGNvcHkgdGV4dDogIiwgZXJyKTsKICAgICAgfQogICAgKTsKfQoKZnVuY3Rpb24gY29weUltYWdlVG9DbGlwYm9hcmQoKSB7CiAgLy8gV2UgZXh0cmFjdCB0aGUgaW1hZ2Ugb3B0aW9ucyBmcm9tIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzIChpZiB0aGV5IGV4aXN0KQogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuIFdlIGFsc28gaWdub3JlIGZvcm1hdCBiZWNhdXNlIHRoZSBjbGlwYm9hcmQgb25seSBzdXBwb3J0cyBwbmcuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwga2V5ID09PSAiZm9ybWF0IikgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbmZpZ1trZXldID0gdmFsOwogIH0KICBQbG90bHkudG9JbWFnZShQTE9ULCBjb25maWcpLnRoZW4oZnVuY3Rpb24gKGRhdGFVcmwpIHsKICAgIGZldGNoKGRhdGFVcmwpCiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5ibG9iKCkpCiAgICAgIC50aGVuKChibG9iKSA9PiB7CiAgICAgICAgY29uc3QgcGFzdGVfcmVjZWl2ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdwYXN0ZS1yZWNlaXZlci5wbHV0b3Bsb3RseScpCiAgICAgICAgaWYgKHBhc3RlX3JlY2VpdmVyKSB7CiAgICAgICAgICBwYXN0ZV9yZWNlaXZlci5hdHRhY2hJbWFnZShkYXRhVXJsLCBDT05UQUlORVIpCiAgICAgICAgfQogICAgICAgIHNlbmRUb0NsaXBib2FyZChibG9iKQogICAgICB9KTsKICB9KTsKfQoKZnVuY3Rpb24gc2F2ZUltYWdlVG9GaWxlKCkgewogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LmRvd25sb2FkSW1hZ2UoUExPVCwgY29uZmlnKTsKfQoKbGV0IGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwLCB0b3A6IDAsIGxlZnQ6IDAgfTsKZnVuY3Rpb24gdW5wb3BfY29udGFpbmVyKGNsKSB7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCBmYWxzZSk7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoY2wsIGZhbHNlKTsKICAvLyBXZSBmaXggdGhlIGhlaWdodCBiYWNrIHRvIHRoZSB2YWx1ZSBpdCBoYWQgYmVmb3JlIHBvcG91dCwgYWxzbyBzZXR0aW5nIHRoZSBmbGFnIHRvIHNpZ25hbCB0aGF0IHVwb24gZmlyc3QgcmVzaXplIHdlIHJlbW92ZSB0aGUgZml4ZWQgaW5saW5lLXN0eWxlCiAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9IGNvbnRhaW5lcl9yZWN0LmhlaWdodCArICJweCI7CiAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gdHJ1ZTsKICAvLyBXZSBzZXQgdGhlIG90aGVyIGZpeGVkIGlubGluZS1zdHlsZXMgdG8gbnVsbAogIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogIENPTlRBSU5FUi5zdHlsZS50b3AgPSAiIjsKICBDT05UQUlORVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIFdlIGFsc28gcmVtb3ZlIHRoZSBDTElQQk9BUkRfSEVBREVSCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9ICIiOwogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIEZpbmFsbHkgd2UgcmVtb3ZlIHRoZSBoaWRkZW4gY2xhc3MgdG8gdGhlIGhlYWRlcgogIENMSVBCT0FSRF9IRUFERVIuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgdHJ1ZSk7CiAgcmV0dXJuOwp9CmZ1bmN0aW9uIHBvcG91dF9jb250YWluZXIob3B0cykgewogIGNvbnN0IGNsID0gb3B0cz8uY2w7CiAgY29uc3QgdGFyZ2V0X2NvbnRhaW5lcl9zaXplID0gb3B0cz8udGFyZ2V0X2NvbnRhaW5lcl9zaXplID8/IHt9OwogIGNvbnN0IHRhcmdldF9wbG90X3NpemUgPSBvcHRzPy50YXJnZXRfcGxvdF9zaXplID8/IHt9OwogIGlmIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgcmV0dXJuIHVucG9wX2NvbnRhaW5lcihjbCk7CiAgfQogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBjbCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0cnVlKTsKICAvLyBXZSBleHRyYWN0IHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNvbnRhaW5lciwgc2F2ZSB0aGVtIGFuZCBmaXggdGhlbQogIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH0gPSBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgY29udGFpbmVyX3JlY3QgPSB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9OwogIC8vIFdlIHNhdmUgdGhlIGN1cnJlbnQgcGxvdCBzaXplIGJlZm9yZSB3ZSBwb3AgYXMgaXQgd2lsbCBmaWxsIHRoZSBzY3JlZW4KICBjb25zdCBjdXJyZW50X3Bsb3Rfc2l6ZSA9IHsKICAgIHdpZHRoOiBQTE9ULl9mdWxsTGF5b3V0LndpZHRoLAogICAgaGVpZ2h0OiBQTE9ULl9mdWxsTGF5b3V0LmhlaWdodCwKICB9OwogIC8vIFdlIGhhdmUgdG8gc2F2ZSB0aGUgcGFkIGRhdGEgYmVmb3JlIHBvcHBpbmcgc28gd2UgY2FuIHJlc2l6ZSBwcmVjaXNlbHkKICBjb25zdCBwYWQgPSB7fTsKICBwYWQudW5wb3BwZWQgPSBnZXRTaXplRGF0YSgpLmNvbnRhaW5lcl9wYWQ7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCB0cnVlKTsKICBwYWQucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIC8vIFdlIGRvIHRvcCBhbmQgbGVmdCBiYXNlZCBvbiB0aGUgY3VycmVudCByZWN0CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ0b3AiLCAibGVmdCJdKSB7CiAgICBjb25zdCBzdGFydF92YWwgPSB0YXJnZXRfY29udGFpbmVyX3NpemVba2V5XSA/PyBjb250YWluZXJfcmVjdFtrZXldOwogICAgbGV0IG9mZnNldCA9IDA7CiAgICBmb3IgKGNvbnN0IGtpbmQgb2YgWyJwYWRkaW5nIiwgImJvcmRlciJdKSB7CiAgICAgIG9mZnNldCArPSBwYWQucG9wcGVkW2tpbmRdW2tleV0gLSBwYWQudW5wb3BwZWRba2luZF1ba2V5XTsKICAgIH0KICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gc3RhcnRfdmFsIC0gb2Zmc2V0ICsgInB4IjsKICAgIGlmIChrZXkgPT09ICJsZWZ0IikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgLy8gV2UgY29tcHV0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBkZXBlbmRpbmcgb24gZXZlbnR1YWwgY29uZmlnIGRhdGEKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7CiAgICB3aWR0aDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS53aWR0aCA/PwogICAgICBjb25maWdfc3BhbnMud2lkdGguY29uZmlnX3ZhbHVlID8/CiAgICAgIGN1cnJlbnRfcGxvdF9zaXplLndpZHRoLAogICAgaGVpZ2h0OgogICAgICB0YXJnZXRfcGxvdF9zaXplLmhlaWdodCA/PwogICAgICBjb25maWdfc3BhbnMuaGVpZ2h0LmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS5oZWlnaHQsCiAgfSk7CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgY29uc3QgdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY3N6W2tleV07CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHZhbCArICJweCI7CiAgICBpZiAoa2V5ID09PSAid2lkdGgiKSB7CiAgICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGVba2V5XSA9IENPTlRBSU5FUi5zdHlsZVtrZXldOwogICAgfQogIH0KICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIGZhbHNlKTsKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICB1bnBvcF9jb250YWluZXIoKTsKICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9LAogICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0KICApOwp9CgpDT05UQUlORVIucG9wT3V0ID0gcG9wb3V0X2NvbnRhaW5lcjsKCmZ1bmN0aW9uIER1YWxDbGljayhzaW5nbGVfZnVuYywgZGJsX2Z1bmMpIHsKICBsZXQgbmNsaWNrcyA9IDA7CiAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7CiAgICBuY2xpY2tzICs9IDE7CiAgICBpZiAobmNsaWNrcyA+IDEpIHsKICAgICAgZGJsX2Z1bmMoLi4uYXJncyk7CiAgICAgIG5jbGlja3MgPSAwOwogICAgfSBlbHNlIHsKICAgICAgZGVsYXkoMzAwKS50aGVuKCgpID0+IHsKICAgICAgICBpZiAobmNsaWNrcyA9PSAxKSB7CiAgICAgICAgICBzaW5nbGVfZnVuYyguLi5hcmdzKTsKICAgICAgICB9CiAgICAgICAgbmNsaWNrcyA9IDA7CiAgICAgIH0pOwogICAgfQogIH07Cn0KCi8vIFdlIHJlbW92ZSB0aGUgZGVmYXVsdCBkb3dubG9hZCBpbWFnZSBidXR0b24KcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9SZW1vdmUgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlLAogIFsidG9JbWFnZSJdCik7Ci8vIFdlIGFkZCB0aGUgY3VzdG9tIGJ1dHRvbiB0byB0aGUgbW9kZWJhcgpwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb0FkZCA9IF8udW5pb24oCiAgcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQsCiAgWwogICAgewogICAgICBuYW1lOiAiQ29weSBQTkcgdG8gQ2xpcGJvYXJkIiwKICAgICAgaWNvbjogewogICAgICAgIGhlaWdodDogNTIwLAogICAgICAgIHdpZHRoOiA1MjAsCiAgICAgICAgcGF0aDogIk0yODAgNjRoNDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRWNDQ4YzAgMzUuMy0yOC43IDY0LTY0IDY0SDY0Yy0zNS4zIDAtNjQtMjguNy02NC02NFYxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRoNDAgOS42QzEyMSAyNy41IDE1My4zIDAgMTkyIDBzNzEgMjcuNSA3OC40IDY0SDI4MHpNNjQgMTEyYy04LjggMC0xNiA3LjItMTYgMTZWNDQ4YzAgOC44IDcuMiAxNiAxNiAxNkgzMjBjOC44IDAgMTYtNy4yIDE2LTE2VjEyOGMwLTguOC03LjItMTYtMTYtMTZIMzA0djI0YzAgMTMuMy0xMC43IDI0LTI0IDI0SDE5MiAxMDRjLTEzLjMgMC0yNC0xMC43LTI0LTI0VjExMkg2NHptMTI4LThhMjQgMjQgMCAxIDAgMC00OCAyNCAyNCAwIDEgMCAwIDQ4eiIsCiAgICAgIH0sCiAgICAgIGRpcmVjdGlvbjogInVwIiwKICAgICAgY2xpY2s6IER1YWxDbGljayhjb3B5SW1hZ2VUb0NsaXBib2FyZCwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoKTsKICAgICAgfSksCiAgICB9LAogICAgewogICAgICBuYW1lOiAiRG93bmxvYWQgSW1hZ2UiLAogICAgICBpY29uOiBQbG90bHkuSWNvbnMuY2FtZXJhLAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soc2F2ZUltYWdlVG9GaWxlLCAoKSA9PiB7CiAgICAgICAgcG9wb3V0X2NvbnRhaW5lcih7IGNsOiAiZmlsZXNhdmUiIH0pOwogICAgICB9KSwKICAgIH0sCiAgXQopOwoKZnVuY3Rpb24gZ2V0T2Zmc2V0RGF0YShlbCkgewogIGxldCBjcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsLCBudWxsKTsKICBjb25zdCBvZGF0YSA9IHsKICAgIHBhZGRpbmc6IHsKICAgICAgbGVmdDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSwKICAgICAgYm90dG9tOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSArIHBhcnNlRmxvYXQoY3MucGFkZGluZ0JvdHRvbSksCiAgICB9LAogICAgYm9yZGVyOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyTGVmdFdpZHRoKSwKICAgICAgcmlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyUmlnaHRXaWR0aCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5ib3JkZXJUb3BXaWR0aCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCkgKyBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICB9CiAgfTsKICBpZiAoZWwgPT09IFBMT1QpIHsKICAgIC8vIEZvciB0aGUgUExPVCB3ZSBhbHNvIHdhbnQgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIG9mZnNldAogICAgb2RhdGEub2Zmc2V0ID0gewogICAgICB0b3A6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0VG9wIDogMCwKICAgICAgbGVmdDogUExPVC5vZmZzZXRQYXJlbnQgPT0gQ09OVEFJTkVSID8gUExPVC5vZmZzZXRMZWZ0IDogMCwKICAgIH0KICB9CiAgcmV0dXJuIG9kYXRhOwp9CmZ1bmN0aW9uIGdldFNpemVEYXRhKCkgewogIGNvbnN0IGRhdGEgPSB7CiAgICBwbG90X3BhZDogZ2V0T2Zmc2V0RGF0YShQTE9UKSwKICAgIHBsb3RfcmVjdDogUExPVC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICAgIGNvbnRhaW5lcl9wYWQ6IGdldE9mZnNldERhdGEoQ09OVEFJTkVSKSwKICAgIGNvbnRhaW5lcl9yZWN0OiBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgfTsKICByZXR1cm4gZGF0YTsKfQpmdW5jdGlvbiBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgY29uc3QgY29tcHV0ZWRfc2l6ZSA9IGNvbXB1dGVQbG90U2l6ZShzaXplRGF0YSk7CiAgY29uc3Qgb2Zmc2V0cyA9IGNvbXB1dGVkX3NpemUub2Zmc2V0czsKCiAgY29uc3QgcGxvdF9kYXRhID0gewogICAgd2lkdGg6IHdpZHRoID8/IGNvbXB1dGVkX3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IGhlaWdodCA/PyBjb21wdXRlZF9zaXplLmhlaWdodCwKICB9OwoKICByZXR1cm4gewogICAgd2lkdGg6ICh3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoKSArIG9mZnNldHMud2lkdGgsCiAgICBoZWlnaHQ6IChoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQpICsgb2Zmc2V0cy5oZWlnaHQsCiAgICBub0NoYW5nZTogd2lkdGggPT0gY29tcHV0ZWRfc2l6ZS53aWR0aCAmJiBoZWlnaHQgPT0gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfQp9CgovLyBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hhbmdlIHRoZSBjb250YWluZXIgc2l6ZSBzbyB0aGF0IHRoZSByZXN1bHRpbmcgcGxvdCB3aWxsIGJlIG1hdGNoaW5nIHRoZSBwcm92aWRlZCBzcGVjcwpmdW5jdGlvbiBjaGFuZ2VDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICBpZiAoIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICBjb25zb2xlLmxvZygiVHJpZWQgdG8gY2hhbmdlIGNvbnRhaW5lciBzaXplIHdoZW4gbm90IHBvcHBlZCwgaWdub3JpbmciKTsKICAgIHJldHVybjsKICB9CgogIGNvbnN0IGNzeiA9IGNvbXB1dGVDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSk7CgogIGlmIChjc3oubm9DaGFuZ2UpIHsKICAgIGNvbnNvbGUubG9nKCJTaXplIGlzIHRoZSBzYW1lIGFzIGN1cnJlbnQsIGlnbm9yaW5nIik7CiAgICByZXR1cm4KICB9CiAgLy8gV2UgYXJlIG5vdyBnb2luZyB0byBzZXQgaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgY29udGFpbmVyCiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSBjc3pba2V5XSArICJweCI7CiAgfQp9Ci8vIFdlIG5vdyBjcmVhdGUgdGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCB1cGRhdGUgdGhlIHBsb3QgYmFzZWQgb24gdGhlIHZhbHVlcyBzcGVjaWZpZWQKZnVuY3Rpb24gdXBkYXRlRnJvbUhlYWRlcigpIHsKICBjb25zdCBoZWFkZXJfZGF0YSA9IHsKICAgIGhlaWdodDogY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSwKICAgIHdpZHRoOiBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUsCiAgfTsKICBjaGFuZ2VDb250YWluZXJTaXplKGhlYWRlcl9kYXRhKTsKfQovLyBXZSBhc3NpZ24gdGhpcyBmdW5jdGlvbiB0byB0aGUgb25ibHVyIGV2ZW50IG9mIHdpZHRoIGFuZCBoZWlnaHQKaWYgKGZpcnN0UnVuKSB7CiAgZm9yIChjb25zdCBjb250YWluZXIgb2YgT2JqZWN0LnZhbHVlcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIudWlfc3Bhbi5vbmJsdXIgPSAoZSkgPT4gewogICAgICBjb250YWluZXIudWlfdmFsdWUgPSBjb250YWluZXIudWlfc3Bhbi50ZXh0Q29udGVudDsKICAgICAgdXBkYXRlRnJvbUhlYWRlcigpOwogICAgfTsKICB9Cn0KLy8gVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgcGxvdCBzaXplIHRvIHVzZSBmb3IgcmVsYXlvdXQgYXMgYSBmdW5jdGlvbiBvZiB0aGUgY29udGFpbmVyIHNpemUKZnVuY3Rpb24gY29tcHV0ZVBsb3RTaXplKGRhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgLy8gUmVtb3ZlIFBhZGRpbmcKICBjb25zdCB7IGNvbnRhaW5lcl9wYWQsIHBsb3RfcGFkLCBjb250YWluZXJfcmVjdCB9ID0gZGF0YTsKICBjb25zdCBvZmZzZXRzID0gewogICAgd2lkdGg6CiAgICAgIHBsb3RfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBwbG90X3BhZC5ib3JkZXIud2lkdGggKwogICAgICBwbG90X3BhZC5vZmZzZXQubGVmdCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy53aWR0aCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLndpZHRoLAogICAgaGVpZ2h0OgogICAgICBwbG90X3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIHBsb3RfcGFkLmJvcmRlci5oZWlnaHQgKwogICAgICBwbG90X3BhZC5vZmZzZXQudG9wICsKICAgICAgY29udGFpbmVyX3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLmhlaWdodCwKICB9OwogIGNvbnN0IHN6ID0gewogICAgd2lkdGg6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3Qud2lkdGggLSBvZmZzZXRzLndpZHRoKSwKICAgIGhlaWdodDogTWF0aC5yb3VuZChjb250YWluZXJfcmVjdC5oZWlnaHQgLSBvZmZzZXRzLmhlaWdodCksCiAgICBvZmZzZXRzLAogIH07CiAgcmV0dXJuIHN6Owp9CgovLyBDcmVhdGUgdGhlIHJlc2l6ZU9ic2VydmVyIHRvIG1ha2UgdGhlIHBsb3QgZXZlbiBtb3JlIHJlc3BvbnNpdmUhIDptYWdpYzoKY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHsKICBjb25zdCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCk7CiAgY29uc3Qge2NvbnRhaW5lcl9yZWN0LCBjb250YWluZXJfcGFkfSA9IHNpemVEYXRhOwogIGxldCBwbG90X3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIC8vIFdlIHNhdmUgdGhlIGhlaWdodCBpbiB0aGUgUExPVCBvYmplY3QKICBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQ7CiAgLy8gV2UgZGVhbCB3aXRoIHNvbWUgc3R1ZmYgaWYgdGhlIGNvbnRhaW5lciBpcyBwb3BwcGVkCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9IGNvbnRhaW5lcl9yZWN0LndpZHRoICsgInB4IjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBjb250YWluZXJfcmVjdC5sZWZ0ICsgInB4IjsKICBjb25maWdfc3BhbnMuaGVpZ2h0LnVpX3ZhbHVlID0gcGxvdF9zaXplLmhlaWdodDsKICBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUgPSBwbG90X3NpemUud2lkdGg7CiAgLyogCgkJVGhlIGFkZGl0aW9uIG9mIHRoZSBpbnZhbGlkIGFyZ3VtZW50IGBwbHV0b3Jlc2l6ZWAgc2VlbXMgdG8gZml4IHRoZSBwcm9ibGVtIHdpdGggY2FsbGluZyBgcmVsYXlvdXRgIHNpbXBseSB3aXRoIGB7YXV0b3NpemU6IHRydWV9YCBhcyB1cGRhdGUgYnJlYWtpbmcgbW91c2UgcmVsYXlvdXQgZXZlbnRzIHRyYWNraW5nLiAKCQlTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Bsb3RseS9wbG90bHkuanMvaXNzdWVzLzYxNTYgZm9yIGRldGFpbHMKCQkqLwogIGxldCBjb25maWcgPSB7CiAgICAvLyBJZiB0aGlzIGlzIHBvcHBlZCBvdXQsIHdlIGlnbm9yZSB0aGUgb3JpZ2luYWwgd2lkdGgvaGVpZ2h0CiAgICB3aWR0aDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfd2lkdGgpID8/IHBsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfaGVpZ2h0KSA/PyBwbG90X3NpemUuaGVpZ2h0LAogICAgcGx1dG9yZXNpemU6IHRydWUsCiAgfTsKICBQbG90bHkucmVsYXlvdXQoUExPVCwgY29uZmlnKS50aGVuKCgpID0+IHsKICAgIGlmIChyZW1vdmVfY29udGFpbmVyX3NpemUgJiYgIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIHRoZSBmaXJzdCByZXNpemUgdXBvbiBwbG90IGNyZWF0aW9uIHRvIGFscmVhZHkgYmUgd2l0aG91dCBhIGZpeGVkIGhlaWdodAogICAgICBDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gIiI7CiAgICAgIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogICAgICByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmYWxzZTsKICAgIH0KICB9KTsKfSk7CgpyZXNpemVPYnNlcnZlci5vYnNlcnZlKENPTlRBSU5FUik7CgoKUGxvdGx5LnJlYWN0KFBMT1QsIHBsb3Rfb2JqKS50aGVuKCgpID0+IHsKCS8vIEFzc2lnbiB0aGUgUGxvdGx5IGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKHBsb3RseV9saXN0ZW5lcnMpKSB7CgkJZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcl92ZWMpIHsKCQkJUExPVC5vbihrZXksIGxpc3RlbmVyKQoJCX0KCX0KCS8vIEFzc2lnbiB0aGUgSlMgZXZlbnQgbGlzdGVuZXJzCglmb3IgKGNvbnN0IFtrZXksIGxpc3RlbmVyX3ZlY10gb2YgT2JqZWN0LmVudHJpZXMoanNfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1QuYWRkRXZlbnRMaXN0ZW5lcihrZXksIGxpc3RlbmVyLCB7CgkJCQlzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsCgkJCX0pCgkJfQoJfQp9CikKCgppbnZhbGlkYXRpb24udGhlbigoKSA9PiB7CgkvLyBSZW1vdmUgYWxsIHBsb3RseSBsaXN0ZW5lcnMKCVBMT1QucmVtb3ZlQWxsTGlzdGVuZXJzKCkKCS8vIFJlbW92ZSBhbGwgSlMgbGlzdGVuZXJzCgljb250cm9sbGVyLmFib3J0KCkKCS8vIFJlbW92ZSB0aGUgcmVzaXplT2JzZXJ2ZXIKCXJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKQp9KQoKCgoJCXJldHVybiBDT05UQUlORVIKCTwvc2NyaXB0PgqkbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlsHJlY29uX3QyX3N0YXJfc2WybGFzdF9ydW5fdGltZXN0YW1wy0HZv8hOyQe8sHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQyZTY1YWUzMS1mNTBhLTQ2MmItOTc0NC04MGJmNmNkYjM4OGW5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4AAidhtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5HZNTdiY2MwNWIwLTgxZGEtMTFlZi0yMDQwLTM1ODVjOWI0OTU0Zi9hY2FkN2JiYjIzNTI5ZjMwuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDg1MjlmMzZkLTJkMzktNGI0NS1hODIxLTAxYzgzNDY1MzlmZIqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnaTOA8c2NyaXB0PgoJCi8vIExvYWQgdGhlIGxpYnJhcnkgZm9yIGNvbnNpc3RlbnQgc21vb3RoIHNjcm9sbGluZwpjb25zdCB7ZGVmYXVsdDogc2Nyb2xsSW50b1ZpZXd9ID0gYXdhaXQgaW1wb3J0KCJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsZG1GeUlGRTlaVDArSW05aWFtVmpkQ0k5UFhSNWNHVnZaaUJsSmladWRXeHNJVDFsSmlZeFBUMDlaUzV1YjJSbFZIbHdaU3hWUFNobExIUXBQVDRvSVhSOGZDSm9hV1JrWlc0aUlUMDlaU2ttSmlKMmFYTnBZbXhsSWlFOVBXVW1KaUpqYkdsd0lpRTlQV1VzUVQwb1pTeDBLVDArZTJsbUtHVXVZMnhwWlc1MFNHVnBaMmgwUEdVdWMyTnliMnhzU0dWcFoyaDBmSHhsTG1Oc2FXVnVkRmRwWkhSb1BHVXVjMk55YjJ4c1YybGtkR2dwZTJ4bGRDQnNQV2RsZEVOdmJYQjFkR1ZrVTNSNWJHVW9aU3h1ZFd4c0tUdHlaWFIxY200Z1ZTaHNMbTkyWlhKbWJHOTNXU3gwS1h4OFZTaHNMbTkyWlhKbWJHOTNXQ3gwS1h4OEtHVTlQbnRzWlhRZ2REMG9aVDArZTJsbUtDRmxMbTkzYm1WeVJHOWpkVzFsYm5SOGZDRmxMbTkzYm1WeVJHOWpkVzFsYm5RdVpHVm1ZWFZzZEZacFpYY3BjbVYwZFhKdUlHNTFiR3c3ZEhKNWUzSmxkSFZ5YmlCbExtOTNibVZ5Ukc5amRXMWxiblF1WkdWbVlYVnNkRlpwWlhjdVpuSmhiV1ZGYkdWdFpXNTBmV05oZEdOb2UzSmxkSFZ5YmlCdWRXeHNmWDBwS0dVcE8zSmxkSFZ5YmlFaGRDWW1LSFF1WTJ4cFpXNTBTR1ZwWjJoMFBHVXVjMk55YjJ4c1NHVnBaMmgwZkh4MExtTnNhV1Z1ZEZkcFpIUm9QR1V1YzJOeWIyeHNWMmxrZEdncGZTa29aU2w5Y21WMGRYSnVJVEY5TEZnOUtHVXNkQ3hzTEc4c2JpeHlMR2tzY3lrOVBuSThaU1ltYVQ1MGZIeHlQbVVtSm1rOGREOHdPbkk4UFdVbUpuTThQV3g4ZkdrK1BYUW1Kbk0rUFd3L2NpMWxMVzg2YVQ1MEppWnpQR3g4ZkhJOFpTWW1jejVzUDJrdGRDdHVPakFzSkQxbFBUNWxMbkJoY21WdWRFVnNaVzFsYm5RL1B5aGxMbWRsZEZKdmIzUk9iMlJsS0NrdWFHOXpkSHg4Ym5Wc2JDa3NkSFE5S0dVc2RDazlQbnQyWVhJZ2JDeHZMRzRzY2p0cFppaDBlWEJsYjJZZ1pHOWpkVzFsYm5RK0luVWlLWEpsZEhWeWJsdGRPMnhsZEh0elkzSnZiR3hOYjJSbE9ta3NZbXh2WTJzNmN5eHBibXhwYm1VNllTeGliM1Z1WkdGeWVUcG9MSE5yYVhCUGRtVnlabXh2ZDBocFpHUmxia1ZzWlcxbGJuUnpPblY5UFhRc1p6MGlablZ1WTNScGIyNGlQVDEwZVhCbGIyWWdhRDlvT21VOVBtVWhQVDFvTzJsbUtDRlJLR1VwS1hSb2NtOTNJRlI1Y0dWRmNuSnZjaWdpU1c1MllXeHBaQ0IwWVhKblpYUWlLVHRzWlhRZ2RqMWtiMk4xYldWdWRDNXpZM0p2Ykd4cGJtZEZiR1Z0Wlc1MGZIeGtiMk4xYldWdWRDNWtiMk4xYldWdWRFVnNaVzFsYm5Rc2JUMWJYU3gzUFdVN1ptOXlLRHRSS0hjcEppWm5LSGNwT3lsN2FXWW9LSGM5SkNoM0tTazlQVDEyS1h0dExuQjFjMmdvZHlrN1luSmxZV3Q5Ym5Wc2JDRTlkeVltZHowOVBXUnZZM1Z0Wlc1MExtSnZaSGttSmtFb2R5a21KaUZCS0dSdlkzVnRaVzUwTG1SdlkzVnRaVzUwUld4bGJXVnVkQ2w4Zkc1MWJHd2hQWGNtSmtFb2R5eDFLU1ltYlM1d2RYTm9LSGNwZld4bGRDQlhQVzUxYkd3aFBTaHZQVzUxYkd3OVBTaHNQWGRwYm1SdmR5NTJhWE4xWVd4V2FXVjNjRzl5ZENrL2RtOXBaQ0F3T213dWQybGtkR2dwUDI4NmFXNXVaWEpYYVdSMGFDeElQVzUxYkd3aFBTaHlQVzUxYkd3OVBTaHVQWGRwYm1SdmR5NTJhWE4xWVd4V2FXVjNjRzl5ZENrL2RtOXBaQ0F3T200dWFHVnBaMmgwS1Q5eU9tbHVibVZ5U0dWcFoyaDBMSHR6WTNKdmJHeFlPbDhzYzJOeWIyeHNXVHA0ZlQxM2FXNWtiM2NzZTJobGFXZG9kRHBGTEhkcFpIUm9PbFFzZEc5d09rNHNjbWxuYUhRNlRDeGliM1IwYjIwNldTeHNaV1owT2tOOVBXVXVaMlYwUW05MWJtUnBibWREYkdsbGJuUlNaV04wS0Nrc1VqMGljM1JoY25RaVBUMDljM3g4SW01bFlYSmxjM1FpUFQwOWN6OU9PaUpsYm1RaVBUMDljejlaT2s0clJTOHlMRlk5SW1ObGJuUmxjaUk5UFQxaFAwTXJWQzh5T2lKbGJtUWlQVDA5WVQ5TU9rTXNRajFiWFR0bWIzSW9iR1YwSUVROU1EdEVQRzB1YkdWdVozUm9PMFFyS3lsN2JHVjBJRTg5YlZ0RVhTeDdhR1ZwWjJoME9tb3NkMmxrZEdnNlNTeDBiM0E2VXl4eWFXZG9kRHB4TEdKdmRIUnZiVHA2TEd4bFpuUTZSbjA5VHk1blpYUkNiM1Z1WkdsdVowTnNhV1Z1ZEZKbFkzUW9LVHRwWmlnaWFXWXRibVZsWkdWa0lqMDlQV2ttSms0K1BUQW1Ka00rUFRBbUpsazhQVWdtSmt3OFBWY21KazQrUFZNbUpsazhQWG9tSmtNK1BVWW1Ka3c4UFhFcFluSmxZV3M3YkdWMElFYzlaMlYwUTI5dGNIVjBaV1JUZEhsc1pTaFBLU3hLUFhCaGNuTmxTVzUwS0VjdVltOXlaR1Z5VEdWbWRGZHBaSFJvTERFd0tTeExQWEJoY25ObFNXNTBLRWN1WW05eVpHVnlWRzl3VjJsa2RHZ3NNVEFwTEZBOWNHRnljMlZKYm5Rb1J5NWliM0prWlhKU2FXZG9kRmRwWkhSb0xERXdLU3hhUFhCaGNuTmxTVzUwS0VjdVltOXlaR1Z5UW05MGRHOXRWMmxrZEdnc01UQXBMR1ZsUFRBc1pYUTlNQ3hsYkQwaWIyWm1jMlYwVjJsa2RHZ2lhVzRnVHo5UExtOW1abk5sZEZkcFpIUm9MVTh1WTJ4cFpXNTBWMmxrZEdndFNpMVFPakFzWlc4OUltOW1abk5sZEVobGFXZG9kQ0pwYmlCUFAwOHViMlptYzJWMFNHVnBaMmgwTFU4dVkyeHBaVzUwU0dWcFoyaDBMVXN0V2pvd0xHVnVQU0p2Wm1aelpYUlhhV1IwYUNKcGJpQlBQekE5UFQxUExtOW1abk5sZEZkcFpIUm9QekE2U1M5UExtOW1abk5sZEZkcFpIUm9PakFzWlhJOUltOW1abk5sZEVobGFXZG9kQ0pwYmlCUFB6QTlQVDFQTG05bVpuTmxkRWhsYVdkb2REOHdPbW92VHk1dlptWnpaWFJJWldsbmFIUTZNRHRwWmloMlBUMDlUeWxsWlQwaWMzUmhjblFpUFQwOWN6OVNPaUpsYm1RaVBUMDljejlTTFVnNkltNWxZWEpsYzNRaVBUMDljejlZS0hnc2VDdElMRWdzU3l4YUxIZ3JVaXg0SzFJclJTeEZLVHBTTFVndk1peGxkRDBpYzNSaGNuUWlQVDA5WVQ5V09pSmpaVzUwWlhJaVBUMDlZVDlXTFZjdk1qb2laVzVrSWowOVBXRS9WaTFYT2xnb1h5eGZLMWNzVnl4S0xGQXNYeXRXTEY4clZpdFVMRlFwTEdWbFBVMWhkR2d1YldGNEtEQXNaV1VyZUNrc1pYUTlUV0YwYUM1dFlYZ29NQ3hsZEN0ZktUdGxiSE5sZTJWbFBTSnpkR0Z5ZENJOVBUMXpQMUl0VXkxTE9pSmxibVFpUFQwOWN6OVNMWG9yV2l0bGJ6b2libVZoY21WemRDSTlQVDF6UDFnb1V5eDZMR29zU3l4YUsyVnZMRklzVWl0RkxFVXBPbEl0S0ZNcmFpOHlLU3RsYnk4eUxHVjBQU0p6ZEdGeWRDSTlQVDFoUDFZdFJpMUtPaUpqWlc1MFpYSWlQVDA5WVQ5V0xTaEdLMGt2TWlrclpXd3ZNam9pWlc1a0lqMDlQV0UvVmkxeEsxQXJaV3c2V0NoR0xIRXNTU3hLTEZBclpXd3NWaXhXSzFRc1ZDazdiR1YwZTNOamNtOXNiRXhsWm5RNlpXa3NjMk55YjJ4c1ZHOXdPbVZrZlQxUE8yVmxQVTFoZEdndWJXRjRLREFzVFdGMGFDNXRhVzRvWldRclpXVXZaWElzVHk1elkzSnZiR3hJWldsbmFIUXRhaTlsY2l0bGJ5a3BMR1YwUFUxaGRHZ3ViV0Y0S0RBc1RXRjBhQzV0YVc0b1pXa3JaWFF2Wlc0c1R5NXpZM0p2Ykd4WGFXUjBhQzFKTDJWdUsyVnNLU2tzVWlzOVpXUXRaV1VzVmlzOVpXa3RaWFI5UWk1d2RYTm9LSHRsYkRwUExIUnZjRHBsWlN4c1pXWjBPbVYwZlNsOWNtVjBkWEp1SUVKOUxHWTlaVDArZTNaaGNpQjBPM0psZEhWeWJpRXhQVDA5WlQ5N1lteHZZMnM2SW1WdVpDSXNhVzVzYVc1bE9pSnVaV0Z5WlhOMEluMDZLSFE5WlNrOVBUMVBZbXBsWTNRb2RDa21KakFoUFQxUFltcGxZM1F1YTJWNWN5aDBLUzVzWlc1bmRHZy9aVHA3WW14dlkyczZJbk4wWVhKMElpeHBibXhwYm1VNkltNWxZWEpsYzNRaWZYMDdablZ1WTNScGIyNGdZeWhsTEhRcGUzWmhjaUJzTzJsbUtDRmxMbWx6UTI5dWJtVmpkR1ZrZkh3aEtHVTlQbnRzWlhRZ2REMWxPMlp2Y2lnN2RDWW1kQzV3WVhKbGJuUk9iMlJsT3lsN2FXWW9kQzV3WVhKbGJuUk9iMlJsUFQwOVpHOWpkVzFsYm5RcGNtVjBkWEp1SVRBN2REMTBMbkJoY21WdWRFNXZaR1VnYVc1emRHRnVZMlZ2WmlCVGFHRmtiM2RTYjI5MFAzUXVjR0Z5Wlc1MFRtOWtaUzVvYjNOME9uUXVjR0Z5Wlc1MFRtOWtaWDF5WlhSMWNtNGhNWDBwS0dVcEtYSmxkSFZ5Ymp0cFppZ2liMkpxWldOMElqMDlkSGx3Wlc5bUtHdzlkQ2ttSmlKbWRXNWpkR2x2YmlJOVBYUjVjR1Z2WmlCc0xtSmxhR0YyYVc5eUtYSmxkSFZ5YmlCMExtSmxhR0YyYVc5eUtIUjBLR1VzZENrcE8yeGxkQ0J2UFNKaWIyOXNaV0Z1SWowOWRIbHdaVzltSUhSOGZHNTFiR3c5UFhRL2RtOXBaQ0F3T25RdVltVm9ZWFpwYjNJN1ptOXlLR3hsZEh0bGJEcHVMSFJ2Y0RweUxHeGxablE2YVgxdlppQjBkQ2hsTEdZb2RDa3BLVzR1YzJOeWIyeHNLSHQwYjNBNmNpeHNaV1owT21rc1ltVm9ZWFpwYjNJNmIzMHBmWFpoY2lCa0xIQTlLQ2s5UGloa2ZId29aRDBpY0dWeVptOXliV0Z1WTJVaWFXNGdkMmx1Wkc5M1AzQmxjbVp2Y20xaGJtTmxMbTV2ZHk1aWFXNWtLSEJsY21admNtMWhibU5sS1RwRVlYUmxMbTV2ZHlrc1pDZ3BLVHRtZFc1amRHbHZiaUJpS0dVcGUyeGxkQ0IwUFUxaGRHZ3ViV2x1S0Nod0tDa3RaUzV6ZEdGeWRGUnBiV1VwTDJVdVpIVnlZWFJwYjI0c01Ta3NiRDFsTG1WaGMyVW9kQ2tzYnoxbExuTjBZWEowV0Nzb1pTNTRMV1V1YzNSaGNuUllLU3BzTEc0OVpTNXpkR0Z5ZEZrcktHVXVlUzFsTG5OMFlYSjBXU2txYkR0bExtMWxkR2h2WkNodkxHNHNkQ3hzS1N4dklUMDlaUzU0Zkh4dUlUMDlaUzU1UDNKbGNYVmxjM1JCYm1sdFlYUnBiMjVHY21GdFpTZ29LVDArWWlobEtTazZaUzVqWWlncGZXWjFibU4wYVc5dUlIa29aU3gwTEd3cGUyeGxkQ0J2UFdGeVozVnRaVzUwY3k1c1pXNW5kR2crTXlZbWRtOXBaQ0F3SVQwOVlYSm5kVzFsYm5Seld6TmRQMkZ5WjNWdFpXNTBjMXN6WFRvMk1EQXNiajFoY21kMWJXVnVkSE11YkdWdVozUm9QalFtSm5admFXUWdNQ0U5UFdGeVozVnRaVzUwYzFzMFhUOWhjbWQxYldWdWRITmJORjA2WlQwK01Tc3RMV1VxWlNwbEttVXFaU3h5UFdGeVozVnRaVzUwY3k1c1pXNW5kR2crTlQ5aGNtZDFiV1Z1ZEhOYk5WMDZkbTlwWkNBd0xHazlZWEpuZFcxbGJuUnpMbXhsYm1kMGFENDJQMkZ5WjNWdFpXNTBjMXMyWFRwMmIybGtJREFzY3oxbExuTmpjbTlzYkV4bFpuUXNZVDFsTG5OamNtOXNiRlJ2Y0R0aUtIdHpZM0p2Ykd4aFlteGxPbVVzYldWMGFHOWtLSFFzYkN4dkxHNHBlMnhsZENCeVBVMWhkR2d1WTJWcGJDaDBLU3h6UFUxaGRHZ3VZMlZwYkNoc0tUdGxMbk5qY205c2JFeGxablE5Y2l4bExuTmpjbTlzYkZSdmNEMXpMR2svTGloN2RHRnlaMlYwT21Vc1pXeGhjSE5sWkRwdkxIWmhiSFZsT200c2JHVm1kRHB5TEhSdmNEcHpmU2w5TEhOMFlYSjBWR2x0WlRwd0tDa3NjM1JoY25SWU9uTXNjM1JoY25SWk9tRXNlRHAwTEhrNmJDeGtkWEpoZEdsdmJqcHZMR1ZoYzJVNmJpeGpZanB5ZlNsOWRtRnlJRTA5WlQwK1pTWW1JV1V1WW1Wb1lYWnBiM0o4ZkNKemJXOXZkR2dpUFQwOVpTNWlaV2hoZG1sdmNpeHJQV1oxYm1OMGFXOXVLR1VzZENsN2JHVjBJR3c5ZEh4OGUzMDdjbVYwZFhKdUlFMG9iQ2svWXlobExIdGliRzlqYXpwc0xtSnNiMk5yTEdsdWJHbHVaVHBzTG1sdWJHbHVaU3h6WTNKdmJHeE5iMlJsT213dWMyTnliMnhzVFc5a1pTeGliM1Z1WkdGeWVUcHNMbUp2ZFc1a1lYSjVMSE5yYVhCUGRtVnlabXh2ZDBocFpHUmxia1ZzWlcxbGJuUnpPbXd1YzJ0cGNFOTJaWEptYkc5M1NHbGtaR1Z1Uld4bGJXVnVkSE1zWW1Wb1lYWnBiM0k2WlQwK1VISnZiV2x6WlM1aGJHd29aUzV5WldSMVkyVW9LR1VzZENrOVBudHNaWFI3Wld3NmJ5eHNaV1owT200c2RHOXdPbko5UFhRc2FUMXZMbk5qY205c2JFeGxablFzY3oxdkxuTmpjbTlzYkZSdmNEdHlaWFIxY200Z2FUMDlQVzRtSm5NOVBUMXlQMlU2V3k0dUxtVXNibVYzSUZCeWIyMXBjMlVvWlQwK2VTaHZMRzRzY2l4c0xtUjFjbUYwYVc5dUxHd3VaV0Z6WlN3b0tUMCtaU2g3Wld3NmJ5eHNaV1owT2x0cExHNWRMSFJ2Y0RwYmN5eHlYWDBwTEd3dWIyNVRZM0p2Ykd4RGFHRnVaMlVwS1YxOUxGdGRLU2w5S1RwUWNtOXRhWE5sTG5KbGMyOXNkbVVvWXlobExIUXBLWDA3Wlhod2IzSjBlMnNnWVhNZ1pHVm1ZWFZzZEgwNyIpCgpjb25zdCBpbmRlbnQgPSB0cnVlCmNvbnN0IGFzaWRlID0gdHJ1ZQpjb25zdCB0aXRsZV90ZXh0ID0gIlRhYmxlIG9mIENvbnRlbnRzIgpjb25zdCBpbmNsdWRlX2RlZmluaXRpb25zID0gZmFsc2UKCgpjb25zdCB0b2NOb2RlID0gaHRtbGA8bmF2IGNsYXNzPSJwbHV0b3VpLXRvYyI+Cgk8aGVhZGVyPgoJIDxzcGFuIGNsYXNzPSJ0b2MtdG9nZ2xlIG9wZW4tdG9jIj48L3NwYW4+CgkgPHNwYW4gY2xhc3M9InRvYy10b2dnbGUgY2xvc2VkLXRvYyI+PC9zcGFuPgoJICR7dGl0bGVfdGV4dH0KCTwvaGVhZGVyPgoJPHNlY3Rpb24+PC9zZWN0aW9uPgo8L25hdj5gCgp0b2NOb2RlLmNsYXNzTGlzdC50b2dnbGUoImFzaWRlIiwgYXNpZGUpCnRvY05vZGUuY2xhc3NMaXN0LnRvZ2dsZSgiaW5kZW50IiwgaW5kZW50KQoKCmNvbnN0IGdldFBhcmVudENlbGwgPSBlbCA9PiBlbC5jbG9zZXN0KCJwbHV0by1jZWxsIikKCmNvbnN0IGdldEhlYWRlcnMgPSAoKSA9PiB7Cgljb25zdCBkZXB0aCA9IE1hdGgubWF4KDEsIE1hdGgubWluKDYsIDMpKSAvLyBzaG91bGQgYmUgaW4gcmFuZ2UgMTo2Cgljb25zdCByYW5nZSA9IEFycmF5LmZyb20oe2xlbmd0aDogZGVwdGh9LCAoeCwgaSkgPT4gaSsxKSAvLyBbMSwgLi4uLCBkZXB0aF0KCQoJY29uc3Qgc2VsZWN0b3IgPSBbCgkJLi4uKGluY2x1ZGVfZGVmaW5pdGlvbnMgPyBbCgkJCWBwbHV0by1ub3RlYm9vayBwbHV0by1jZWxsIC5wbHV0by1kb2NzLWJpbmRpbmdgLCAKCQkJYHBsdXRvLW5vdGVib29rIHBsdXRvLWNlbGwgYXNzaWduZWU6bm90KDplbXB0eSlgLCAKCQldIDogW10pLAoJCS4uLnJhbmdlLm1hcChpID0+IGBwbHV0by1ub3RlYm9vayBwbHV0by1jZWxsIGgke2l9YCkKCV0uam9pbigiLCIpCglyZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSkuZmlsdGVyKGVsID0+IAoJCS8vIGV4Y2x1ZGUgaGVhZGVycyBpbnNpZGUgb2YgYSBwbHV0by1kb2NzLWJpbmRpbmcgYmxvY2sKCQkhKGVsLm5vZGVOYW1lLnN0YXJ0c1dpdGgoIkgiKSAmJiBlbC5jbG9zZXN0KCIucGx1dG8tZG9jcy1iaW5kaW5nIikpCgkpCn0KCgpjb25zdCBkb2N1bWVudF9jbGlja19oYW5kbGVyID0gKGV2ZW50KSA9PiB7Cgljb25zdCBwYXRoID0gKGV2ZW50LnBhdGggfHwgZXZlbnQuY29tcG9zZWRQYXRoKCkpCgljb25zdCB0b2MgPSBwYXRoLmZpbmQoZWxlbSA9PiBlbGVtPy5jbGFzc0xpc3Q/LmNvbnRhaW5zPy4oInRvYy10b2dnbGUiKSkKCWlmICh0b2MpIHsKCQlldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKQoJCXRvYy5jbG9zZXN0KCIucGx1dG91aS10b2MiKS5jbGFzc0xpc3QudG9nZ2xlKCJoaWRlIikKCX0KfQoKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBkb2N1bWVudF9jbGlja19oYW5kbGVyKQoKCmNvbnN0IGhlYWRlcl90b19pbmRleF9lbnRyeV9tYXAgPSBuZXcgTWFwKCkKY29uc3QgY3VycmVudGx5X2hpZ2hsaWdodGVkX3NldCA9IG5ldyBTZXQoKQoKY29uc3QgbGFzdF90b2NfZWxlbWVudF9jbGlja190aW1lID0geyBjdXJyZW50OiAwIH0KCmNvbnN0IGludGVyc2VjdGlvbl9jYWxsYmFjayA9IChpeHMpID0+IHsKCWxldCBvbl90b3AgPSBpeHMuZmlsdGVyKGl4ID0+IGl4LmludGVyc2VjdGlvblJhdGlvID4gMCAmJiBpeC5pbnRlcnNlY3Rpb25SZWN0LnkgPCBpeC5yb290Qm91bmRzLmhlaWdodCAvIDIpCglpZihvbl90b3AubGVuZ3RoID4gMCl7CgkJY3VycmVudGx5X2hpZ2hsaWdodGVkX3NldC5mb3JFYWNoKGEgPT4gYS5jbGFzc0xpc3QucmVtb3ZlKCJpbi12aWV3IikpCgkJY3VycmVudGx5X2hpZ2hsaWdodGVkX3NldC5jbGVhcigpCgkJb25fdG9wLnNsaWNlKDAsMSkuZm9yRWFjaChpID0+IHsKCQkJbGV0IGRpdiA9IGhlYWRlcl90b19pbmRleF9lbnRyeV9tYXAuZ2V0KGkudGFyZ2V0KQoJCQlkaXYuY2xhc3NMaXN0LmFkZCgiaW4tdmlldyIpCgkJCWN1cnJlbnRseV9oaWdobGlnaHRlZF9zZXQuYWRkKGRpdikKCQkJCgkJCS8vLyBzY3JvbGwgaW50byB2aWV3CgkJCS8qCgkJCWNvbnN0IHRvY19oZWlnaHQgPSB0b2NOb2RlLm9mZnNldEhlaWdodAoJCQljb25zdCBkaXZfcG9zID0gZGl2Lm9mZnNldFRvcAoJCQljb25zdCBkaXZfaGVpZ2h0ID0gZGl2Lm9mZnNldEhlaWdodAoJCQljb25zdCBjdXJyZW50X3Njcm9sbCA9IHRvY05vZGUuc2Nyb2xsVG9wCgkJCWNvbnN0IGhlYWRlcl9oZWlnaHQgPSB0b2NOb2RlLnF1ZXJ5U2VsZWN0b3IoImhlYWRlciIpLm9mZnNldEhlaWdodAoJCQkKCQkJY29uc3Qgc2Nyb2xsX3RvX3RvcCA9IGRpdl9wb3MgLSBoZWFkZXJfaGVpZ2h0CgkJCWNvbnN0IHNjcm9sbF90b19ib3R0b20gPSBkaXZfcG9zICsgZGl2X2hlaWdodCAtIHRvY19oZWlnaHQKCQkJCgkJCS8vIGlmIHdlIHNldCBhIHNjcm9sbFRvcCwgdGhlbiB0aGUgYnJvd3NlciB3aWxsIHN0b3AgYW55IGN1cnJlbnRseSBvbmdvaW5nIHNtb290aHNjcm9sbCBhbmltYXRpb24uIFNvIGxldCdzIG9ubHkgZG8gdGhpcyBpZiB5b3UgYXJlIG5vdCBjdXJyZW50bHkgaW4gYSBzbW9vdGhzY3JvbGwuCgkJCWlmKERhdGUubm93KCkgLSBsYXN0X3RvY19lbGVtZW50X2NsaWNrX3RpbWUuY3VycmVudCA+PSAyMDAwKQoJCQkJaWYoY3VycmVudF9zY3JvbGwgPCBzY3JvbGxfdG9fYm90dG9tKXsKCQkJCQl0b2NOb2RlLnNjcm9sbFRvcCA9IHNjcm9sbF90b19ib3R0b20KCQkJCX0gZWxzZSBpZihjdXJyZW50X3Njcm9sbCA+IHNjcm9sbF90b190b3ApewoJCQkJCXRvY05vZGUuc2Nyb2xsVG9wID0gc2Nyb2xsX3RvX3RvcAoJCQkJfQoJCQkqLwoJCX0pCgl9Cn0KbGV0IGludGVyc2VjdGlvbl9vYnNlcnZlcl8xID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGludGVyc2VjdGlvbl9jYWxsYmFjaywgewoJcm9vdDogbnVsbCwgLy8gaS5lLiB0aGUgdmlld3BvcnQKICAJdGhyZXNob2xkOiAxLAoJcm9vdE1hcmdpbjogIi0xNXB4IiwgLy8gc2xpZ2h0bHkgc21hbGxlciB0aGFuIHRoZSB2aWV3cG9ydAoJLy8gZGVsYXk6IDEwMCwKfSkKbGV0IGludGVyc2VjdGlvbl9vYnNlcnZlcl8yID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGludGVyc2VjdGlvbl9jYWxsYmFjaywgewoJcm9vdDogbnVsbCwgLy8gaS5lLiB0aGUgdmlld3BvcnQKICAJdGhyZXNob2xkOiAxLAoJcm9vdE1hcmdpbjogIjE1cHgiLCAvLyBzbGlnaHRseSBsYXJnZXIgdGhhbiB0aGUgdmlld3BvcnQKCS8vIGRlbGF5OiAxMDAsCn0pCgpjb25zdCByZW5kZXIgPSAoZWxlbWVudHMpID0+IHsKCWhlYWRlcl90b19pbmRleF9lbnRyeV9tYXAuY2xlYXIoKQoJY3VycmVudGx5X2hpZ2hsaWdodGVkX3NldC5jbGVhcigpCglpbnRlcnNlY3Rpb25fb2JzZXJ2ZXJfMS5kaXNjb25uZWN0KCkKCWludGVyc2VjdGlvbl9vYnNlcnZlcl8yLmRpc2Nvbm5lY3QoKQoKCQlsZXQgbGFzdF9sZXZlbCA9IGBIMWAKCXJldHVybiBodG1sYCR7ZWxlbWVudHMubWFwKGggPT4gewoJY29uc3QgcGFyZW50X2NlbGwgPSBnZXRQYXJlbnRDZWxsKGgpCgoJCWxldCBbY2xhc3NOYW1lLCB0aXRsZV9lbF0gPSBoLm1hdGNoZXMoYC5wbHV0by1kb2NzLWJpbmRpbmdgKSA/IFsicGx1dG8tZG9jcy1iaW5kaW5nLWVsIiwgaC5maXJzdEVsZW1lbnRDaGlsZF0gOiBbaC5ub2RlTmFtZSwgaF0KCgljb25zdCBhID0gaHRtbGA8YSAKCQljbGFzcz0iJHtjbGFzc05hbWV9IiAKCQl0aXRsZT0iJHt0aXRsZV9lbC5pbm5lclRleHR9IgoJCWhyZWY9IiMke3BhcmVudF9jZWxsLmlkfSIKCT4ke3RpdGxlX2VsLmlubmVySFRNTH08L2E+YAoJLyogYS5vbm1vdXNlb3Zlcj0oKT0+ewoJCXBhcmVudF9jZWxsLmZpcnN0RWxlbWVudENoaWxkLmNsYXNzTGlzdC5hZGQoCgkJCSdoaWdobGlnaHQtcGx1dG8tY2VsbC1zaG91bGRlcicKCQkpCgl9CglhLm9ubW91c2VvdXQ9KCkgPT4gewoJCXBhcmVudF9jZWxsLmZpcnN0RWxlbWVudENoaWxkLmNsYXNzTGlzdC5yZW1vdmUoCgkJCSdoaWdobGlnaHQtcGx1dG8tY2VsbC1zaG91bGRlcicKCQkpCgl9ICovCgkJCgkJCglhLm9uY2xpY2s9KGUpID0+IHsKCQllLnByZXZlbnREZWZhdWx0KCk7CgkJbGFzdF90b2NfZWxlbWVudF9jbGlja190aW1lLmN1cnJlbnQgPSBEYXRlLm5vdygpCgkJc2Nyb2xsSW50b1ZpZXcoaCwgewoJCQliZWhhdmlvcjogJ3Ntb290aCcsIAoJCQlibG9jazogJ3N0YXJ0JywKCQl9KS50aGVuKCgpID0+IAoJCQkvLyBzb21ldGltZXMgaXQgZG9lc24ndCBzY3JvbGwgdG8gdGhlIHJpZ2h0IHBsYWNlCgkJCS8vIHNvbHV0aW9uOiB0cnkgYSBzZWNvbmQgdGltZSEKCQkJc2Nyb2xsSW50b1ZpZXcoaCwgewoJCQkJYmVoYXZpb3I6ICdzbW9vdGgnLCAKCQkJCWJsb2NrOiAnc3RhcnQnLAoJCQl9KQoJICAgKQoJfQoKCWNvbnN0IHJvdyA9ICBodG1sYDxkaXYgY2xhc3M9InRvYy1yb3cgJHtjbGFzc05hbWV9IGFmdGVyLSR7bGFzdF9sZXZlbH0iPiR7YX08L2Rpdj5gCgkJaW50ZXJzZWN0aW9uX29ic2VydmVyXzEub2JzZXJ2ZSh0aXRsZV9lbCkKCQlpbnRlcnNlY3Rpb25fb2JzZXJ2ZXJfMi5vYnNlcnZlKHRpdGxlX2VsKQoJCWhlYWRlcl90b19pbmRleF9lbnRyeV9tYXAuc2V0KHRpdGxlX2VsLCByb3cpCgoJaWYoY2xhc3NOYW1lLnN0YXJ0c1dpdGgoIkgiKSkKCQlsYXN0X2xldmVsID0gY2xhc3NOYW1lCgkJCglyZXR1cm4gcm93Cn0pfWAKfQoKY29uc3QgaW52YWxpZGF0ZWQgPSB7IGN1cnJlbnQ6IGZhbHNlIH0KCmNvbnN0IHVwZGF0ZUNhbGxiYWNrID0gKCkgPT4gewoJaWYgKCFpbnZhbGlkYXRlZC5jdXJyZW50KSB7CgkJdG9jTm9kZS5xdWVyeVNlbGVjdG9yKCJzZWN0aW9uIikucmVwbGFjZVdpdGgoCgkJCWh0bWxgPHNlY3Rpb24+JHtyZW5kZXIoZ2V0SGVhZGVycygpKX08L3NlY3Rpb24+YAoJCSkKCX0KfQp1cGRhdGVDYWxsYmFjaygpCnNldFRpbWVvdXQodXBkYXRlQ2FsbGJhY2ssIDEwMCkKc2V0VGltZW91dCh1cGRhdGVDYWxsYmFjaywgMTAwMCkKc2V0VGltZW91dCh1cGRhdGVDYWxsYmFjaywgNTAwMCkKCmNvbnN0IG5vdGVib29rID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigicGx1dG8tbm90ZWJvb2siKQoKCi8vIFdlIGhhdmUgYSBtdXRhdGlvbm9ic2VydmVyIGZvciBlYWNoIGNlbGw6CmNvbnN0IG11dF9vYnNlcnZlcnMgPSB7CgljdXJyZW50OiBbXSwKfQoKY29uc3QgY3JlYXRlQ2VsbE9ic2VydmVycyA9ICgpID0+IHsKCW11dF9vYnNlcnZlcnMuY3VycmVudC5mb3JFYWNoKChvKSA9PiBvLmRpc2Nvbm5lY3QoKSkKCW11dF9vYnNlcnZlcnMuY3VycmVudCA9IEFycmF5LmZyb20obm90ZWJvb2sucXVlcnlTZWxlY3RvckFsbCgicGx1dG8tY2VsbCIpKS5tYXAoZWwgPT4gewoJCWNvbnN0IG8gPSBuZXcgTXV0YXRpb25PYnNlcnZlcih1cGRhdGVDYWxsYmFjaykKCQlvLm9ic2VydmUoZWwsIHthdHRyaWJ1dGVGaWx0ZXI6IFsiY2xhc3MiXX0pCgkJcmV0dXJuIG8KCX0pCn0KY3JlYXRlQ2VsbE9ic2VydmVycygpCgovLyBBbmQgb25lIGZvciB0aGUgbm90ZWJvb2sncyBjaGlsZCBsaXN0LCB3aGljaCB1cGRhdGVzIG91ciBjZWxsIG9ic2VydmVyczoKY29uc3Qgbm90ZWJvb2tPYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsKCXVwZGF0ZUNhbGxiYWNrKCkKCWNyZWF0ZUNlbGxPYnNlcnZlcnMoKQp9KQpub3RlYm9va09ic2VydmVyLm9ic2VydmUobm90ZWJvb2ssIHtjaGlsZExpc3Q6IHRydWV9KQoKLy8gQW5kIGZpbmFsbHksIGFuIG9ic2VydmVyIGZvciB0aGUgZG9jdW1lbnQuYm9keSBjbGFzc0xpc3QsIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0b2MgYWxzbyB3b3JrcyB3aGVuIGl0IGlzIGxvYWRlZCBkdXJpbmcgbm90ZWJvb2sgaW5pdGlhbGl6YXRpb24KY29uc3QgYm9keUNsYXNzT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcih1cGRhdGVDYWxsYmFjaykKYm9keUNsYXNzT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7YXR0cmlidXRlRmlsdGVyOiBbImNsYXNzIl19KQoKLy8gSGlkZS9zaG93IHRoZSBUb0Mgd2hlbiB0aGUgc2NyZWVuIGdldHMgc21hbGwKbGV0IG0gPSBtYXRjaE1lZGlhKCIobWF4LXdpZHRoOiAxMDAwcHgpIikKbGV0IG1hdGNoX2xpc3RlbmVyID0gKCkgPT4gCgl0b2NOb2RlLmNsYXNzTGlzdC50b2dnbGUoImhpZGUiLCBtLm1hdGNoZXMpCm1hdGNoX2xpc3RlbmVyKCkKbS5hZGRMaXN0ZW5lcihtYXRjaF9saXN0ZW5lcikKCmludmFsaWRhdGlvbi50aGVuKCgpID0+IHsKCWludmFsaWRhdGVkLmN1cnJlbnQgPSB0cnVlCglpbnRlcnNlY3Rpb25fb2JzZXJ2ZXJfMS5kaXNjb25uZWN0KCkKCWludGVyc2VjdGlvbl9vYnNlcnZlcl8yLmRpc2Nvbm5lY3QoKQoJbm90ZWJvb2tPYnNlcnZlci5kaXNjb25uZWN0KCkKCWJvZHlDbGFzc09ic2VydmVyLmRpc2Nvbm5lY3QoKQoJbXV0X29ic2VydmVycy5jdXJyZW50LmZvckVhY2goKG8pID0+IG8uZGlzY29ubmVjdCgpKQoJZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBkb2N1bWVudF9jbGlja19oYW5kbGVyKQoJbS5yZW1vdmVMaXN0ZW5lcihtYXRjaF9saXN0ZW5lcikKfSkKCnJldHVybiB0b2NOb2RlCjwvc2NyaXB0Pgo8c3R5bGU+CkBtZWRpYSBub3QgcHJpbnQgewoKLnBsdXRvdWktdG9jIHsKCWZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICJTZWdvZSBVSSIsIFJvYm90bywgT3h5Z2VuLVNhbnMsIENhbnRhcmVsbCwgIkFwcGxlIENvbG9yIEVtb2ppIiwKCQkiU2Vnb2UgVUkgRW1vamkiLCAiU2Vnb2UgVUkgU3ltYm9sIiwgc3lzdGVtLXVpLCBzYW5zLXNlcmlmOwoJLS1tYWluLWJnLWNvbG9yOiAjZmFmYWZhOwoJLS1wbHV0by1vdXRwdXQtY29sb3I6IGhzbCgwLCAwJSwgMzYlKTsKCS0tcGx1dG8tb3V0cHV0LWgtY29sb3I6IGhzbCgwLCAwJSwgMjElKTsKCS0tc2lkZWJhci1saS1hY3RpdmUtYmc6IHJnYigyMzUsIDIzNSwgMjM1KTsKCS0taWNvbi1maWx0ZXI6IHVuc2V0Owp9CgpAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CgkucGx1dG91aS10b2MgewoJCS0tbWFpbi1iZy1jb2xvcjogIzMwMzAzMDsKCQktLXBsdXRvLW91dHB1dC1jb2xvcjogaHNsKDAsIDAlLCA5MCUpOwoJCS0tcGx1dG8tb3V0cHV0LWgtY29sb3I6IGhzbCgwLCAwJSwgOTclKTsKCQktLXNpZGViYXItbGktYWN0aXZlLWJnOiByZ2IoODIsIDgyLCA4Mik7CgkJLS1pY29uLWZpbHRlcjogaW52ZXJ0KDEpOwoJfQp9CgoucGx1dG91aS10b2MuYXNpZGUgewoJY29sb3I6IHZhcigtLXBsdXRvLW91dHB1dC1jb2xvcik7Cglwb3NpdGlvbjogZml4ZWQ7CglyaWdodDogMXJlbTsKCXRvcDogNXJlbTsKCXdpZHRoOiBtaW4oODB2dywgMzAwcHgpOwoJcGFkZGluZzogMC41cmVtOwoJcGFkZGluZy10b3A6IDBlbTsKCS8qIGJvcmRlcjogM3B4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xNSk7ICovCglib3JkZXItcmFkaXVzOiAxMHB4OwoJLyogYm94LXNoYWRvdzogMCAwIDExcHggMHB4ICMwMDAwMDAxMDsgKi8KCW1heC1oZWlnaHQ6IGNhbGMoMTAwdmggLSA1cmVtIC0gOTBweCk7CglvdmVyZmxvdzogYXV0bzsKCXotaW5kZXg6IDQwOwoJYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbWFpbi1iZy1jb2xvcik7Cgl0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMzAwbXMgY3ViaWMtYmV6aWVyKDAuMTgsIDAuODksIDAuNDUsIDEuMTIpOwp9CgoucGx1dG91aS10b2MuYXNpZGUuaGlkZSB7Cgl0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygxMDAlIC0gMjhweCkpOwp9Ci5wbHV0b3VpLXRvYy5hc2lkZS5oaWRlIHNlY3Rpb24gewoJZGlzcGxheTogbm9uZTsKfQoucGx1dG91aS10b2MuYXNpZGUuaGlkZSBoZWFkZXIgewoJbWFyZ2luLWJvdHRvbTogMGVtOwoJcGFkZGluZy1ib3R0b206IDBlbTsKCWJvcmRlci1ib3R0b206IG5vbmU7Cn0KfSAgLyogRW5kIG9mIE1lZGlhIHByaW50IHF1ZXJ5ICovCi5wbHV0b3VpLXRvYy5hc2lkZS5oaWRlIC5vcGVuLXRvYywKLnBsdXRvdWktdG9jLmFzaWRlOm5vdCguaGlkZSkgLmNsb3NlZC10b2MsCi5wbHV0b3VpLXRvYzpub3QoLmFzaWRlKSAuY2xvc2VkLXRvYyB7CglkaXNwbGF5OiBub25lOwp9CgpAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb24pIHsKICAucGx1dG91aS10b2MuYXNpZGUgewoJdHJhbnNpdGlvbi1kdXJhdGlvbjogMHM7CiAgfQp9CgoudG9jLXRvZ2dsZSB7CgljdXJzb3I6IHBvaW50ZXI7CiAgICBwYWRkaW5nOiAxZW07CiAgICBtYXJnaW46IC0xZW07CiAgICBtYXJnaW4tcmlnaHQ6IC0wLjdlbTsKICAgIGxpbmUtaGVpZ2h0OiAxZW07CiAgICBkaXNwbGF5OiBmbGV4Owp9CgoudG9jLXRvZ2dsZTo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgaGVpZ2h0OiAxZW07CiAgICB3aWR0aDogMWVtOwogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvZ2gvaW9uaWMtdGVhbS9pb25pY29uc0A1LjUuMS9zcmMvc3ZnL2xpc3Qtb3V0bGluZS5zdmciKTsKCS8qIGdlbmVyYXRlZCB1c2luZyBodHRwczovL2RvcGlhemEub3JnL3Rvb2xzL2RhdGF1cmkvaW5kZXgucGhwICovCiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIZHBaSFJvUFNJMU1USWlJR2hsYVdkb2REMGlOVEV5SWlCMmFXVjNRbTk0UFNJd0lEQWdOVEV5SURVeE1pSStQSFJwZEd4bFBtbHZibWxqYjI1ekxYWTFMVzg4TDNScGRHeGxQanhzYVc1bElIZ3hQU0l4TmpBaUlIa3hQU0l4TkRRaUlIZ3lQU0kwTkRnaUlIa3lQU0l4TkRRaUlITjBlV3hsUFNKbWFXeHNPbTV2Ym1VN2MzUnliMnRsT2lNd01EQTdjM1J5YjJ0bExXeHBibVZqWVhBNmNtOTFibVE3YzNSeWIydGxMV3hwYm1WcWIybHVPbkp2ZFc1a08zTjBjbTlyWlMxM2FXUjBhRG96TW5CNElpOCtQR3hwYm1VZ2VERTlJakUyTUNJZ2VURTlJakkxTmlJZ2VESTlJalEwT0NJZ2VUSTlJakkxTmlJZ2MzUjViR1U5SW1acGJHdzZibTl1WlR0emRISnZhMlU2SXpBd01EdHpkSEp2YTJVdGJHbHVaV05oY0RweWIzVnVaRHR6ZEhKdmEyVXRiR2x1WldwdmFXNDZjbTkxYm1RN2MzUnliMnRsTFhkcFpIUm9Pak15Y0hnaUx6NDhiR2x1WlNCNE1UMGlNVFl3SWlCNU1UMGlNelk0SWlCNE1qMGlORFE0SWlCNU1qMGlNelk0SWlCemRIbHNaVDBpWm1sc2JEcHViMjVsTzNOMGNtOXJaVG9qTURBd08zTjBjbTlyWlMxc2FXNWxZMkZ3T25KdmRXNWtPM04wY205clpTMXNhVzVsYW05cGJqcHliM1Z1WkR0emRISnZhMlV0ZDJsa2RHZzZNekp3ZUNJdlBqeGphWEpqYkdVZ1kzZzlJamd3SWlCamVUMGlNVFEwSWlCeVBTSXhOaUlnYzNSNWJHVTlJbVpwYkd3NmJtOXVaVHR6ZEhKdmEyVTZJekF3TUR0emRISnZhMlV0YkdsdVpXTmhjRHB5YjNWdVpEdHpkSEp2YTJVdGJHbHVaV3B2YVc0NmNtOTFibVE3YzNSeWIydGxMWGRwWkhSb09qTXljSGdpTHo0OFkybHlZMnhsSUdONFBTSTRNQ0lnWTNrOUlqSTFOaUlnY2owaU1UWWlJSE4wZVd4bFBTSm1hV3hzT201dmJtVTdjM1J5YjJ0bE9pTXdNREE3YzNSeWIydGxMV3hwYm1WallYQTZjbTkxYm1RN2MzUnliMnRsTFd4cGJtVnFiMmx1T25KdmRXNWtPM04wY205clpTMTNhV1IwYURvek1uQjRJaTgrUEdOcGNtTnNaU0JqZUQwaU9EQWlJR041UFNJek5qZ2lJSEk5SWpFMklpQnpkSGxzWlQwaVptbHNiRHB1YjI1bE8zTjBjbTlyWlRvak1EQXdPM04wY205clpTMXNhVzVsWTJGd09uSnZkVzVrTzNOMGNtOXJaUzFzYVc1bGFtOXBianB5YjNWdVpEdHpkSEp2YTJVdGQybGtkR2c2TXpKd2VDSXZQand2YzNablBnPT0iKTsKICAgIGJhY2tncm91bmQtc2l6ZTogMWVtOwoJZmlsdGVyOiB2YXIoLS1pY29uLWZpbHRlcik7Cn0KCi5hc2lkZSAudG9jLXRvZ2dsZS5vcGVuLXRvYzpob3Zlcjo6YmVmb3JlIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL2lvbmljLXRlYW0vaW9uaWNvbnNANS41LjEvc3JjL3N2Zy9hcnJvdy1mb3J3YXJkLW91dGxpbmUuc3ZnIik7CgkvKiBnZW5lcmF0ZWQgdXNpbmcgaHR0cHM6Ly9kb3BpYXphLm9yZy90b29scy9kYXRhdXJpL2luZGV4LnBocCAqLwogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTFNVElpSUdobGFXZG9kRDBpTlRFeUlpQjJhV1YzUW05NFBTSXdJREFnTlRFeUlEVXhNaUkrUEhScGRHeGxQbWx2Ym1samIyNXpMWFkxTFdFOEwzUnBkR3hsUGp4d2IyeDViR2x1WlNCd2IybHVkSE05SWpJMk9DQXhNVElnTkRFeUlESTFOaUF5TmpnZ05EQXdJaUJ6ZEhsc1pUMGlabWxzYkRwdWIyNWxPM04wY205clpUb2pNREF3TzNOMGNtOXJaUzFzYVc1bFkyRndPbkp2ZFc1a08zTjBjbTlyWlMxc2FXNWxhbTlwYmpweWIzVnVaRHR6ZEhKdmEyVXRkMmxrZEdnNk5EaHdlQ0l2UGp4c2FXNWxJSGd4UFNJek9USWlJSGt4UFNJeU5UWWlJSGd5UFNJeE1EQWlJSGt5UFNJeU5UWWlJSE4wZVd4bFBTSm1hV3hzT201dmJtVTdjM1J5YjJ0bE9pTXdNREE3YzNSeWIydGxMV3hwYm1WallYQTZjbTkxYm1RN2MzUnliMnRsTFd4cGJtVnFiMmx1T25KdmRXNWtPM04wY205clpTMTNhV1IwYURvME9IQjRJaTgrUEM5emRtYysiKTsKfQouYXNpZGUgLnRvYy10b2dnbGUuY2xvc2VkLXRvYzpob3Zlcjo6YmVmb3JlIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL2lvbmljLXRlYW0vaW9uaWNvbnNANS41LjEvc3JjL3N2Zy9hcnJvdy1iYWNrLW91dGxpbmUuc3ZnIik7CgkvKiBnZW5lcmF0ZWQgdXNpbmcgaHR0cHM6Ly9kb3BpYXphLm9yZy90b29scy9kYXRhdXJpL2luZGV4LnBocCAqLwogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTFNVElpSUdobGFXZG9kRDBpTlRFeUlpQjJhV1YzUW05NFBTSXdJREFnTlRFeUlEVXhNaUkrUEhScGRHeGxQbWx2Ym1samIyNXpMWFkxTFdFOEwzUnBkR3hsUGp4d2IyeDViR2x1WlNCd2IybHVkSE05SWpJME5DQTBNREFnTVRBd0lESTFOaUF5TkRRZ01URXlJaUJ6ZEhsc1pUMGlabWxzYkRwdWIyNWxPM04wY205clpUb2pNREF3TzNOMGNtOXJaUzFzYVc1bFkyRndPbkp2ZFc1a08zTjBjbTlyWlMxc2FXNWxhbTlwYmpweWIzVnVaRHR6ZEhKdmEyVXRkMmxrZEdnNk5EaHdlQ0l2UGp4c2FXNWxJSGd4UFNJeE1qQWlJSGt4UFNJeU5UWWlJSGd5UFNJME1USWlJSGt5UFNJeU5UWWlJSE4wZVd4bFBTSm1hV3hzT201dmJtVTdjM1J5YjJ0bE9pTXdNREE3YzNSeWIydGxMV3hwYm1WallYQTZjbTkxYm1RN2MzUnliMnRsTFd4cGJtVnFiMmx1T25KdmRXNWtPM04wY205clpTMTNhV1IwYURvME9IQjRJaTgrUEM5emRtYysiKTsKfQoKCgoucGx1dG91aS10b2MgaGVhZGVyIHsKCWRpc3BsYXk6IGZsZXg7CglhbGlnbi1pdGVtczogY2VudGVyOwoJZ2FwOiAuM2VtOwoJZm9udC1zaXplOiAxLjVlbTsKCS8qIG1hcmdpbi10b3A6IC0wLjFlbTsgKi8KCW1hcmdpbi1ib3R0b206IDAuNGVtOwoJcGFkZGluZzogMC41cmVtOwoJbWFyZ2luLWxlZnQ6IDA7CgltYXJnaW4tcmlnaHQ6IDA7Cglmb250LXdlaWdodDogYm9sZDsKCS8qIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTUpOyAqLwoJcG9zaXRpb246IHN0aWNreTsKCXRvcDogMHB4OwoJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7Cgl6LWluZGV4OiA0MTsKfQoucGx1dG91aS10b2MuYXNpZGUgaGVhZGVyIHsKCXBhZGRpbmctbGVmdDogMDsKCXBhZGRpbmctcmlnaHQ6IDA7Cn0KCi5wbHV0b3VpLXRvYyBzZWN0aW9uIC50b2Mtcm93IHsKCXdoaXRlLXNwYWNlOiBub3dyYXA7CglvdmVyZmxvdzogaGlkZGVuOwoJdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CglwYWRkaW5nOiAuMWVtOwoJYm9yZGVyLXJhZGl1czogLjJlbTsKfQoKLnBsdXRvdWktdG9jIHNlY3Rpb24gLnRvYy1yb3cuSDEgewoJbWFyZ2luLXRvcDogMWVtOwp9CgoKLnBsdXRvdWktdG9jLmFzaWRlIHNlY3Rpb24gLnRvYy1yb3cuaW4tdmlldyB7CgliYWNrZ3JvdW5kOiB2YXIoLS1zaWRlYmFyLWxpLWFjdGl2ZS1iZyk7Cn0KCgoJCi5oaWdobGlnaHQtcGx1dG8tY2VsbC1zaG91bGRlciB7CgliYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDUpOwoJYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDsKfQoKLnBsdXRvdWktdG9jIHNlY3Rpb24gYSB7Cgl0ZXh0LWRlY29yYXRpb246IG5vbmU7Cglmb250LXdlaWdodDogbm9ybWFsOwoJY29sb3I6IHZhcigtLXBsdXRvLW91dHB1dC1jb2xvcik7Cn0KLnBsdXRvdWktdG9jIHNlY3Rpb24gYTpob3ZlciB7Cgljb2xvcjogdmFyKC0tcGx1dG8tb3V0cHV0LWgtY29sb3IpOwp9CgoucGx1dG91aS10b2MuaW5kZW50IHNlY3Rpb24gYS5IMSB7Cglmb250LXdlaWdodDogNzAwOwoJbGluZS1oZWlnaHQ6IDFlbTsKfQoKLnBsdXRvdWktdG9jLmluZGVudCBzZWN0aW9uIC5hZnRlci1IMiBhIHsgcGFkZGluZy1sZWZ0OiAxMHB4OyB9Ci5wbHV0b3VpLXRvYy5pbmRlbnQgc2VjdGlvbiAuYWZ0ZXItSDMgYSB7IHBhZGRpbmctbGVmdDogMjBweDsgfQoucGx1dG91aS10b2MuaW5kZW50IHNlY3Rpb24gLmFmdGVyLUg0IGEgeyBwYWRkaW5nLWxlZnQ6IDMwcHg7IH0KLnBsdXRvdWktdG9jLmluZGVudCBzZWN0aW9uIC5hZnRlci1INSBhIHsgcGFkZGluZy1sZWZ0OiA0MHB4OyB9Ci5wbHV0b3VpLXRvYy5pbmRlbnQgc2VjdGlvbiAuYWZ0ZXItSDYgYSB7IHBhZGRpbmctbGVmdDogNTBweDsgfQoKLnBsdXRvdWktdG9jLmluZGVudCBzZWN0aW9uIGEuSDEgeyBwYWRkaW5nLWxlZnQ6IDBweDsgfQoucGx1dG91aS10b2MuaW5kZW50IHNlY3Rpb24gYS5IMiB7IHBhZGRpbmctbGVmdDogMTBweDsgfQoucGx1dG91aS10b2MuaW5kZW50IHNlY3Rpb24gYS5IMyB7IHBhZGRpbmctbGVmdDogMjBweDsgfQoucGx1dG91aS10b2MuaW5kZW50IHNlY3Rpb24gYS5INCB7IHBhZGRpbmctbGVmdDogMzBweDsgfQoucGx1dG91aS10b2MuaW5kZW50IHNlY3Rpb24gYS5INSB7IHBhZGRpbmctbGVmdDogNDBweDsgfQoucGx1dG91aS10b2MuaW5kZW50IHNlY3Rpb24gYS5INiB7IHBhZGRpbmctbGVmdDogNTBweDsgfQoKCi5wbHV0b3VpLXRvYy5pbmRlbnQgc2VjdGlvbiBhLnBsdXRvLWRvY3MtYmluZGluZy1lbCwKLnBsdXRvdWktdG9jLmluZGVudCBzZWN0aW9uIGEuQVNTSUdORUUKCXsKCWZvbnQtZmFtaWx5OiBKdWxpYU1vbm8sIG1vbm9zcGFjZTsKCWZvbnQtc2l6ZTogLjhlbTsKCS8qIGJhY2tncm91bmQ6IGJsYWNrOyAqLwoJZm9udC13ZWlnaHQ6IDcwMDsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKCWNvbG9yOiB2YXIoLS1jbS12YXItY29sb3IpOyAvKiB0aGlzIGlzIHN0ZWFsaW5nIGEgdmFyaWFibGUgZnJvbSBQbHV0bywgYnV0IGl0J3MgZmluZSBpZiB0aGF0IGRvZXNudCB3b3JrICovCn0KLnBsdXRvdWktdG9jLmluZGVudCBzZWN0aW9uIGEucGx1dG8tZG9jcy1iaW5kaW5nLWVsOjpiZWZvcmUsCi5wbHV0b3VpLXRvYy5pbmRlbnQgc2VjdGlvbiBhLkFTU0lHTkVFOjpiZWZvcmUKCXsKCWNvbnRlbnQ6ICI+ICI7CglvcGFjaXR5OiAuMzsKfQo8L3N0eWxlPgqkbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/yEIhiUywcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJDg1MjlmMzZkLTJkMzktNGI0NS1hODIxLTAxYzgzNDY1MzlmZLlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzWoOtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkNDU5NTI1MTItYWFmMS00M2Q4LWE5NWUtYzMyYmIyNjMzZjQyiqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedoBJzxkaXYgY2xhc3M9Im1hcmtkb3duIj48dWw+CjxsaT48cD4mIzQwOzQuNyYjNDE7IFNpbXVsYXRlIHVzaW5nIDxjb2RlPnNlcV9zZTwvY29kZT4gYW5kIDxjb2RlPm9ial90MnN0YXI8L2NvZGU+PC9wPgo8L2xpPgo8bGk+PHA+JiM0MDs0LjgmIzQxOyBDb21wYXJlIHRoZSBzaWduYWwgb2J0YWluZWQgaW4gJiM0MDs0LjYmIzQxOyB3aXRoIHRoZSBvbmUgYXQgJiM0MDszLjUmIzQxOzwvcD4KPC9saT4KPGxpPjxwPiYjNDA7NC45JiM0MTsgUmVjb25zdHJ1Y3QgdGhlIDFEIGltYWdlPC9wPgo8L2xpPgo8L3VsPgo8L2Rpdj6kbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/yC1SuCiwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJDQ1OTUyNTEyLWFhZjEtNDNkOC1hOTVlLWMzMmJiMjYzM2Y0MrlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgAF4te1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQ5NjQ0MDRmNi03ZjQ2LTRkZjktYWQ5OC05MjE5NDhjM2JlNjmKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52mqJCTxzY3JpcHQgaWQ9J3Bsb3RfMSc+CgkJLy8gV2Ugc3RhcnQgYnkgcHV0dGluZyBhbGwgdGhlIHZhcmlhYmxlIGludGVycG9sYXRpb24gaGVyZSBhdCB0aGUgYmVnaW5uaW5nCgkJLy8gV2UgaGF2ZSB0byBjb252ZXJ0IGFsbCB0eXBlZGFycmF5cyBpbiB0aGUgbGF5b3V0IHRvIG5vcm1hbCBhcnJheXMuIFNlZSBJc3N1ZSAjMjUKCQkvLyBXZSB1c2UgbG9kYXNoIGZvciB0aGlzIGZvciBjb21wYWN0bmVzcwoJCWZ1bmN0aW9uIHJlbW92ZVR5cGVkQXJyYXkobykgewoJCQlyZXR1cm4gXy5pc1R5cGVkQXJyYXkobykgPyBBcnJheS5mcm9tKG8pIDoKCQkJXy5pc1BsYWluT2JqZWN0KG8pID8gXy5tYXBWYWx1ZXMobywgcmVtb3ZlVHlwZWRBcnJheSkgOiAKCQkJbwoJCX0KCgkJLy8gUHVibGlzaCB0aGUgcGxvdCBvYmplY3QgdG8gSlMKCQlsZXQgcGxvdF9vYmogPSBfLnVwZGF0ZSgvKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIEFic3RyYWN0UGx1dG9EaW5nZXRqZXMuRGlzcGxheS5wdWJsaXNoZWRfdG9fanMgKi8gZ2V0UHVibGlzaGVkT2JqZWN0KCI3YmNjMDViMC04MWRhLTExZWYtMjA0MC0zNTg1YzliNDk1NGYvOWNhMzIxNWM2ODgzMDJmOCIpLCAibGF5b3V0IiwgcmVtb3ZlVHlwZWRBcnJheSkKCQkvLyBHZXQgdGhlIHBsb3RseSBsaXN0ZW5lcnMKCQljb25zdCBwbG90bHlfbGlzdGVuZXJzID0ge30KCQkvLyBHZXQgdGhlIEpTIGxpc3RlbmVycwoJCWNvbnN0IGpzX2xpc3RlbmVycyA9IHt9CgkJLy8gRGVhbCB3aXRoIGV2ZW50dWFsIGN1c3RvbSBjbGFzc2VzCgkJbGV0IGN1c3RvbV9jbGFzc2xpc3QgPSBbXQoKCgkJLy8gTG9hZCB0aGUgcGxvdGx5IGxpYnJhcnkKCQlsZXQgUGxvdGx5ID0gdW5kZWZpbmVkCgkJdHJ5IHsKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoIi4vcGxvdGx5anMvcGxvdGx5anMtMi4yNi4yLm1pbi5qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0gY2F0Y2ggKGUpIHsKCQkJY29uc29sZS5sb2coIkxvY2FsIGxvYWQgZmFpbGVkLCB0cnlpbmcgd2l0aCB0aGUgd2ViIGVzbS5zaCB2ZXJzaW9uIikKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoImh0dHBzOi8vZXNtLnNoL3YxMzUvcGxvdGx5LmpzLWRpc3QtbWluQDIuMjYuMi9lc25leHQvcGxvdGx5LmpzLWRpc3QtbWluLm1qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0KCgkJLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0byBmb3JjZSBsb2NhbCBtYXRoamF4IGZvbnQgY2FjaGUKCQlpZiAoZmFsc2UgJiYgd2luZG93Py5NYXRoSmF4Py5jb25maWc/LnN2Zz8uZm9udENhY2hlID09PSAnZ2xvYmFsJykgewoJCQl3aW5kb3cuTWF0aEpheC5jb25maWcuc3ZnLmZvbnRDYWNoZSA9ICdsb2NhbCcKCQl9CgoJCS8vIEZsYWcgdG8gY2hlY2sgaWYgdGhpcyBjZWxsIHdhcyAgbWFudWFsbHkgcmFuIG9yIHJlYWN0aXZlbHkgcmFuCmNvbnN0IGZpcnN0UnVuID0gdGhpcyA/IGZhbHNlIDogdHJ1ZQpjb25zdCBDT05UQUlORVIgPSB0aGlzID8/IGh0bWxgPGRpdiBjbGFzcz0ncGx1dG9wbG90bHktY29udGFpbmVyJz5gCmNvbnN0IFBMT1QgPSBDT05UQUlORVIucXVlcnlTZWxlY3RvcignLmpzLXBsb3RseS1wbG90JykgPz8gQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgPGRpdj5gKQpjb25zdCBwYXJlbnQgPSBDT05UQUlORVIucGFyZW50RWxlbWVudAovLyBXZSB1c2UgYSBjb250cm9sbGVyIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lcnMgdXBvbiBpbnZhbGlkYXRpb24KY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKQovLyBXZSBoYXZlIHRvIGFkZCB0aGlzIHRvIGtlZXAgc3VwcG9ydGluZyBAYmluZCB3aXRoIHRoZSBvbGQgQVBJIHVzaW5nIFBMT1QKUExPVC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChlKSA9PiB7CglDT05UQUlORVIudmFsdWUgPSBQTE9ULnZhbHVlCglpZiAoZS5idWJibGVzKSB7CgkJcmV0dXJuCgl9CglDT05UQUlORVIuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2lucHV0JykpCn0sIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KQoKCS8vIFRoaXMgY3JlYXRlIHRoZSBzdHlsZSBzdWJkaXYgb24gZmlyc3QgcnVuCglmaXJzdFJ1biAmJiBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGAKCTxzdHlsZT4KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgewoJCXdpZHRoOiAxMDAlOwoJCWhlaWdodDogMTAwJTsKCQltaW4taGVpZ2h0OiAwOwoJCW1pbi13aWR0aDogMDsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgLmpzLXBsb3RseS1wbG90IC5wbG90bHkgZGl2IHsKCQltYXJnaW46IDAgYXV0bzsgLy8gVGhpcyBjZW50ZXJzIHRoZSBwbG90Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLnBvcHBlZC1vdXQgewoJCW92ZXJmbG93OiBhdXRvOwoJCXotaW5kZXg6IDEwMDA7CgkJcG9zaXRpb246IGZpeGVkOwoJCXJlc2l6ZTogYm90aDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDBweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMHB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgewoJCWRpc3BsYXk6IGZsZXg7CgkJZmxleC1mbG93OiByb3cgd3JhcDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAxMnB4OwoJCXBvc2l0aW9uOiBmaXhlZDsKCQl6LWluZGV4OiAxMDAxOwoJCWN1cnNvcjogbW92ZTsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIC0xMDAlKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBzcGFuIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJZmxleDogMQoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIuaGlkZGVuIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuIHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlIHsKCQlwYWRkaW5nLXJpZ2h0OiA1cHg7CgkJcGFkZGluZy1sZWZ0OiAycHg7CgkJY3Vyc29yOiB0ZXh0OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZmxleDogMCAwIDEwMCU7CgkJdGV4dC1hbGlnbjogY2VudGVyOwoJCWJvcmRlci10b3A6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQltYXJnaW4tdG9wOiA1cHg7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZpbGVuYW1lIHsKCQltYXJnaW4tbGVmdDogM3B4OwoJCXRleHQtYWxpZ246IGxlZnQ7CgkJbWluLXdpZHRoOiBtaW4oNjAlLCBtaW4tY29udGVudCk7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCAubGFiZWwgewoJCWZsZXg6IDAgMCAwOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5mb3JtYXQgewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCQlmbGV4OiAxIDAgYXV0bzsKCQltaW4td2lkdGg6IDMwcHg7CgkJbWFyZ2luLXJpZ2h0OiAxMHB4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCQlmbGV4LWZsb3c6IGNvbHVtbjsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlwYWRkaW5nLWxlZnQ6IDNweDsKCQl6LWluZGV4OiAyMDAwOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIHsKCQljdXJzb3I6IHBvaW50ZXI7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJcGFkZGluZzogM3B4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKC0zcHgsIC02cHgpOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpub3QoLnNlbGVjdGVkKSB7CgkJbWFyZ2luLXRvcDogM3B4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uLnNlbGVjdGVkIHsKCQlvcmRlcjogLTE7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246aG92ZXIgewoJCWJhY2tncm91bmQtY29sb3I6IHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJfQoJc3Bhbi5jb25maWctdmFsdWUgewoJCWZvbnQtd2VpZ2h0OiBub3JtYWw7CgkJY29sb3I6IHZhcigtLXBsdXRvLW91dHB1dC1jb2xvcik7CgkJZGlzcGxheTogbm9uZTsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIGNhbGMoLTEwMCUgLSAxMHB4KSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLmxhYmVsIHsKCQl1c2VyLXNlbGVjdDogbm9uZTsKCX0KCS5sYWJlbDpob3ZlciBzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCW1pbi13aWR0aDogMTUwcHg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4ubWF0Y2hpbmctY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLW1hY3JvLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5kaWZmZXJlbnQtY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLXRhZy1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9Cjwvc3R5bGU+CmApCgpsZXQgb3JpZ2luYWxfaGVpZ2h0ID0gcGxvdF9vYmoubGF5b3V0LmhlaWdodApsZXQgb3JpZ2luYWxfd2lkdGggPSBwbG90X29iai5sYXlvdXQud2lkdGgKLy8gRm9yIHRoZSBoZWlnaHQgd2UgaGF2ZSB0byBhbHNvIHB1dCBhIGZpeGVkIHZhbHVlIGluIGNhc2UgdGhlIHBsb3QgaXMgcHV0IG9uIGEgbm9uLWZpeGVkLXNpemUgY29udGFpbmVyIChsaWtlIHRoZSBkZWZhdWx0IHdyYXBwZXIpCi8vIFdlIGRlZmluZSBhIHZhcmlhYmxlIHRvIGNoZWNrIHdoZXRoZXIgd2Ugc3RpbGwgaGF2ZSB0byByZW1vdmUgdGhlIGZpeGVkIGhlaWdodApsZXQgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmlyc3RSdW4KbGV0IGNvbnRhaW5lcl9oZWlnaHQgPSBvcmlnaW5hbF9oZWlnaHQgPz8gUExPVC5jb250YWluZXJfaGVpZ2h0ID8/IDQwMApDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX2hlaWdodCArICdweCcKCi8vIFdlIGNyZWF0ZSBhIFByb21pc2UgdmVyc2lvbiBvZiBzZXRUaW1lb3V0CmZ1bmN0aW9uIGRlbGF5KG1zKSB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7Cn0KCi8vIFdlIGltcG9ydCBpbnRlcmFjdCBmb3IgZHJhZ2dpbmcvcmVzaXppbmcKY29uc3QgeyBkZWZhdWx0OiBpbnRlcmFjdCB9ID0gYXdhaXQgaW1wb3J0KCdodHRwczovL2VzbS5zaC9pbnRlcmFjdGpzQDEuMTAuMTknKQoKCmZ1bmN0aW9uIGdldEltYWdlT3B0aW9ucygpIHsKICBjb25zdCBvID0gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogIHJldHVybiB7CiAgICBmb3JtYXQ6IG8uZm9ybWF0ID8/ICJwbmciLAogICAgd2lkdGg6IG8ud2lkdGggPz8gb3JpZ2luYWxfd2lkdGgsCiAgICBoZWlnaHQ6IG8uaGVpZ2h0ID8/IG9yaWdpbmFsX2hlaWdodCwKICAgIHNjYWxlOiBvLnNjYWxlID8/IDEsCiAgICBmaWxlbmFtZTogby5maWxlbmFtZSA/PyAibmV3cGxvdCIsCiAgfTsKfQoKY29uc3QgQ0xJUEJPQVJEX0hFQURFUiA9CiAgQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoIi5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIikgPz8KICBDT05UQUlORVIuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgImFmdGVyYmVnaW4iLAogICAgaHRtbGA8ZGl2IGNsYXNzPSJwbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIGhpZGRlbiI+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmb3JtYXQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+Rm9ybWF0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZvcm1hdCI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB3aWR0aCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5XaWR0aDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSB3aWR0aCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGhlaWdodCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5IZWlnaHQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgaGVpZ2h0Ij48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2NhbGUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+U2NhbGU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgc2NhbGUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzZXQiPlNldDwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB1bnNldCI+VW5zZXQ8L2J1dHRvbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZpbGVuYW1lIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZpbGVuYW1lOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZpbGVuYW1lIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgIDwvZGl2PmAKICApOwoKZnVuY3Rpb24gY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcikgewogIGNvbnN0IHZhbGlkX2NsYXNzZXMgPSBbCiAgICAibWlzc2luZy1jb25maWciLAogICAgIm1hdGNoaW5nLWNvbmZpZyIsCiAgICAiZGlmZmVyZW50LWNvbmZpZyIsCiAgXTsKICBmdW5jdGlvbiBzZXRDbGFzcyhjbCkgewogICAgZm9yIChjb25zdCBuYW1lIG9mIHZhbGlkX2NsYXNzZXMpIHsKICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUobmFtZSwgbmFtZSA9PSBjbCk7CiAgICB9CiAgfQogIC8vIFdlIHVzZSB0aGUgY3VzdG9tIGdldHRlcnMgd2UnbGwgc2V0IHVwIGluIHRoZSBjb250YWluZXIKICBjb25zdCB7IHVpX3ZhbHVlLCBjb25maWdfdmFsdWUsIGNvbmZpZ19zcGFuLCBrZXkgfSA9IGNvbnRhaW5lcjsKICBpZiAoY29uZmlnX3ZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgIHNldENsYXNzKCJtaXNzaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBpcyBub3QgcHJlc2VudCBpbiB0aGUgY29uZmlnLmA7CiAgfSBlbHNlIGlmICh1aV92YWx1ZSA9PSBjb25maWdfdmFsdWUpIHsKICAgIHNldENsYXNzKCJtYXRjaGluZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIHRoZSBzYW1lIHZhbHVlIGluIHRoZSBjb25maWcgYW5kIGluIHRoZSBoZWFkZXIuYDsKICB9IGVsc2UgewogICAgc2V0Q2xhc3MoImRpZmZlcmVudC1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIGEgZGlmZmVyZW50IHZhbHVlICg8ZW0+JHtjb25maWdfdmFsdWV9PC9lbT4pIGluIHRoZSBjb25maWcuYDsKICB9CiAgLy8gQWRkIGluZm8gYWJvdXQgc2V0dGluZyBhbmQgdW5zZXR0aW5nCiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIG9uIHRoZSBsYWJlbCA8ZW0+PGI+b25jZTwvYj48L2VtPiB0byBzZXQgdGhlIGN1cnJlbnQgVUkgdmFsdWUgaW4gdGhlIGNvbmZpZy5gCiAgKTsKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgPGVtPjxiPnR3aWNlPC9iPjwvZW0+IHRvIHJlbW92ZSB0aGlzIGtleSBmcm9tIHRoZSBjb25maWcuYAogICk7Cn0KCmNvbnN0IHZhbGlkX2Zvcm1hdHMgPSBbInBuZyIsICJzdmciLCAid2VicCIsICJqcGVnIiwgImZ1bGwtanNvbiJdOwpmdW5jdGlvbiBpbml0aWFsaXplVUlWYWx1ZVNwYW4oc3Bhbiwga2V5LCB2YWx1ZSkgewogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSBrZXkgPT09ICJmb3JtYXQiID8gImZhbHNlIiA6ICJ0cnVlIjsKICBsZXQgcGFyc2UgPSAoeCkgPT4geDsKICBsZXQgdXBkYXRlID0gKHgpID0+IChzcGFuLnRleHRDb250ZW50ID0geCk7CiAgaWYgKGtleSA9PT0gIndpZHRoIiB8fCBrZXkgPT09ICJoZWlnaHQiKSB7CiAgICBwYXJzZSA9ICh4KSA9PiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoeCkpOwogIH0gZWxzZSBpZiAoa2V5ID09PSAic2NhbGUiKSB7CiAgICBwYXJzZSA9IHBhcnNlRmxvYXQ7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAvLyBXZSByZW1vdmUgY29udGVudEVkaXRhYmxlCiAgICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9ICJmYWxzZSI7CiAgICAvLyBIZXJlIHdlIGZpcnN0IGFkZCB0aGUgc3Vic3BhbnMgZm9yIGVhY2ggb3B0aW9uCiAgICBjb25zdCBvcHRzX2RpdiA9IHNwYW4uYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2IGNsYXNzPSJmb3JtYXQtb3B0aW9ucyI+PC9kaXY+YCk7CiAgICBmb3IgKGNvbnN0IGZtdCBvZiB2YWxpZF9mb3JtYXRzKSB7CiAgICAgIGNvbnN0IG9wdCA9IG9wdHNfZGl2LmFwcGVuZENoaWxkKAogICAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImZvcm1hdC1vcHRpb24gJHtmbXR9Ij4ke2ZtdH08L3NwYW4+YAogICAgICApOwogICAgICBvcHQub25jbGljayA9IChlKSA9PiB7CiAgICAgICAgc3Bhbi52YWx1ZSA9IG9wdC50ZXh0Q29udGVudDsKICAgICAgfTsKICAgIH0KICAgIHBhcnNlID0gKHgpID0+IHsKICAgICAgcmV0dXJuIHZhbGlkX2Zvcm1hdHMuaW5jbHVkZXMoeCkgPyB4IDogbG9jYWxWYWx1ZTsKICAgIH07CiAgICB1cGRhdGUgPSAoeCkgPT4gewogICAgICBmb3IgKGNvbnN0IG9wdCBvZiBvcHRzX2Rpdi5jaGlsZHJlbikgewogICAgICAgIG9wdC5jbGFzc0xpc3QudG9nZ2xlKCJzZWxlY3RlZCIsIG9wdC50ZXh0Q29udGVudCA9PT0geCk7CiAgICAgIH0KICAgIH07CiAgfSBlbHNlIHsKICAgIC8vIFdlIG9ubHkgaGF2ZSBmaWxlbmFtZSBoZXJlCiAgfQogIGxldCBsb2NhbFZhbHVlOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIGxvY2FsVmFsdWU7CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIGlmICh2YWwgIT09ICIiKSB7CiAgICAgICAgbG9jYWxWYWx1ZSA9IHBhcnNlKHZhbCk7CiAgICAgIH0KICAgICAgdXBkYXRlKGxvY2FsVmFsdWUpOwogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7CiAgLy8gV2UgYWxzbyBhc3NpZ24gYSBsaXN0ZW5lciBzbyB0aGF0IHRoZSBlZGl0YWJsZSBpcyBibHVycmVkIHdoZW4gZW50ZXIgaXMgcHJlc3NlZAogIHNwYW4ub25rZXlkb3duID0gKGUpID0+IHsKICAgIGlmIChlLmtleUNvZGUgPT09IDEzKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgc3Bhbi5ibHVyKCk7CiAgICB9CiAgfTsKICBzcGFuLnZhbHVlID0gdmFsdWU7Cn0KCmZ1bmN0aW9uIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oc3Bhbiwga2V5KSB7CiAgLy8gSGVyZSB3ZSBtb3N0bHkgd2FudCB0byBkZWZpbmUgdGhlIHNldHRlciBhbmQgZ2V0dGVyCiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgLy8gaWYgdW5kZWZpbmVkIGlzIHBhc3NlZCwgd2UgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBvcHRpb25zCiAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGRlbGV0ZSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XSA9IHZhbDsKICAgICAgfQogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7Cn0KCmNvbnN0IGNvbmZpZ19zcGFucyA9IHt9Owpmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhnZXRJbWFnZU9wdGlvbnMoKSkpIHsKICBjb25zdCBjb250YWluZXIgPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoYC5jbGlwYm9hcmQtc3Bhbi4ke2tleX1gKTsKICBjb25zdCBsYWJlbCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIubGFiZWwiKTsKICAvLyBXZSBnaXZlIHRoZSBsYWJlbCBhIGZ1bmN0aW9uIHRoYXQgb24gc2luZ2xlIGNsaWNrIHdpbGwgc2V0IHRoZSBjdXJyZW50IHZhbHVlIGFuZCB3aXRoIGRvdWJsZSBjbGljayB3aWxsIHVuc2V0IGl0CiAgbGFiZWwub25jbGljayA9IER1YWxDbGljaygKICAgICgpID0+IHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0sCiAgICAoZSkgPT4gewogICAgICBjb25zb2xlLmxvZygiZSIsIGUpOwogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSB1bmRlZmluZWQ7CiAgICB9CiAgKTsKICBjb25zdCB1aV92YWx1ZV9zcGFuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtdmFsdWUiKTsKICBjb25zdCBjb25maWdfdmFsdWVfc3BhbiA9CiAgICBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNvbmZpZy12YWx1ZSIpID8/CiAgICBsYWJlbC5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAgICJhZnRlcmJlZ2luIiwKICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iY29uZmlnLXZhbHVlIj48L3NwYW4+YAogICAgKTsKICAvLyBBc3NpbmcgdGhlIHR3byBzcGFucyBhcyBwcm9wZXJ0aWVzIG9mIHRoZSBjb250YWluaW5nIHNwYW4KICBjb250YWluZXIudWlfc3BhbiA9IHVpX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmNvbmZpZ19zcGFuID0gY29uZmlnX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmtleSA9IGtleTsKICBjb25maWdfc3BhbnNba2V5XSA9IGNvbnRhaW5lcjsKICBpZiAoZmlyc3RSdW4pIHsKICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA9CiAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICAgIC8vIFdlIGRvIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdmFsdWUgc3BhbgogICAgaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHVpX3ZhbHVlX3NwYW4sIGtleSwgdmFsdWUpOwogICAgLy8gVGhlbiB3ZSBpbml0aWFsaXplIHRoZSBjb25maWcgdmFsdWUKICAgIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oY29uZmlnX3ZhbHVlX3NwYW4sIGtleSk7CiAgICAvLyBXZSBwdXQgc29tZSBjb252ZW5pZW5jZSBnZXR0ZXJzL3NldHRlcnMKICAgIC8vIHVpX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJ1aV92YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiB1aV92YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICB1aV92YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgICAvLyBjb25maWdfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgImNvbmZpZ192YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICB9Cn0KCi8vIFRoZXNlIG9iamVjdHMgd2lsbCBjb250YWluIHRoZSBkZWZhdWx0IHZhbHVlCgovLyBUaGlzIGNvZGUgdXBkYXRlcyB0aGUgaW1hZ2Ugb3B0aW9ucyBpbiB0aGUgUExPVCBjb25maWcgd2l0aCB0aGUgcHJvdmlkZWQgb25lcwpmdW5jdGlvbiBzZXRJbWFnZU9wdGlvbnMobykgewogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gb1trZXldOwogIH0KfQpmdW5jdGlvbiB1bnNldEltYWdlT3B0aW9ucygpIHsKICBzZXRJbWFnZU9wdGlvbnMoe30pOwp9Cgpjb25zdCBzZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4uc2V0Iik7CmNvbnN0IHVuc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnVuc2V0Iik7CmlmIChmaXJzdFJ1bikgewogIHNldF9idXR0b24ub25jbGljayA9IChlKSA9PiB7CiAgICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0KICB9OwogIHVuc2V0X2J1dHRvbi5vbmNsaWNrID0gdW5zZXRJbWFnZU9wdGlvbnM7Cn0KCi8vIFdlIGFkZCBhIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBjbGlwYm9hcmQgaXMgcG9wcGVkIG91dApDT05UQUlORVIuaXNQb3BwZWRPdXQgPSAoKSA9PiB7CiAgcmV0dXJuIENPTlRBSU5FUi5jbGFzc0xpc3QuY29udGFpbnMoInBvcHBlZC1vdXQiKTsKfTsKCkNMSVBCT0FSRF9IRUFERVIub25tb3VzZWRvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHsKICBpZiAoZXZlbnQudGFyZ2V0Lm1hdGNoZXMoInNwYW4uY2xpcGJvYXJkLXZhbHVlIikpIHsKICAgIGNvbnNvbGUubG9nKCJXZSBkb24ndCBtb3ZlISIpOwogICAgcmV0dXJuOwogIH0KICBjb25zdCBzdGFydCA9IHsKICAgIGxlZnQ6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLmxlZnQpLAogICAgdG9wOiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS50b3ApLAogICAgWDogZXZlbnQucGFnZVgsCiAgICBZOiBldmVudC5wYWdlWSwKICB9OwogIGZ1bmN0aW9uIG1vdmVBdChldmVudCwgc3RhcnQpIHsKICAgIGNvbnN0IHRvcCA9IGV2ZW50LnBhZ2VZIC0gc3RhcnQuWSArIHN0YXJ0LnRvcCArICJweCI7CiAgICBjb25zdCBsZWZ0ID0gZXZlbnQucGFnZVggLSBzdGFydC5YICsgc3RhcnQubGVmdCArICJweCI7CiAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9IHRvcDsKICB9CgogIC8vIG1vdmUgb3VyIGFic29sdXRlbHkgcG9zaXRpb25lZCBiYWxsIHVuZGVyIHRoZSBwb2ludGVyCiAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQpIHsKICAgIG1vdmVBdChldmVudCwgc3RhcnQpOwogIH0KCiAgLy8gV2UgdXNlIHRoaXMgdG8gcmVtb3ZlIHRoZSBtb3VzZW1vdmUgd2hlbiBjbGlja2luZyBvdXRzaWRlIG9mIHRoZSBjb250YWluZXIKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICAvLyBtb3ZlIHRoZSBjb250YWluZXIgb24gbW91c2Vtb3ZlCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgb25Nb3VzZU1vdmUsIHsKICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsCiAgfSk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgY2xlYW5VcCgpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7CgogIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICBjb25zb2xlLmxvZygiY2xlYW5pbmcgdXAgdGhlIHBsb3QgbW92ZSBsaXN0ZW5lciIpOwogICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBudWxsOwogIH0KCiAgLy8gKDMpIGRyb3AgdGhlIGJhbGwsIHJlbW92ZSB1bm5lZWRlZCBoYW5kbGVycwogIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gY2xlYW5VcDsKfTsKCmZ1bmN0aW9uIHNlbmRUb0NsaXBib2FyZChibG9iKSB7CiAgaWYgKCFuYXZpZ2F0b3IuY2xpcGJvYXJkKSB7CiAgICBhbGVydCgKICAgICAgIlRoZSBDbGlwYm9hcmQgQVBJIGRvZXMgbm90IHNlZW0gdG8gYmUgYXZhaWxhYmxlLCBtYWtlIHN1cmUgdGhlIFBsdXRvIG5vdGVib29rIGlzIGJlaW5nIHVzZWQgZnJvbSBlaXRoZXIgbG9jYWxob3N0IG9yIGFuIGh0dHBzIHNvdXJjZS4iCiAgICApOwogIH0KICBuYXZpZ2F0b3IuY2xpcGJvYXJkCiAgICAud3JpdGUoWwogICAgICBuZXcgQ2xpcGJvYXJkSXRlbSh7CiAgICAgICAgLy8gVGhlIGtleSBpcyBkZXRlcm1pbmVkIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBibG9iJ3MgdHlwZS4KICAgICAgICBbYmxvYi50eXBlXTogYmxvYiwKICAgICAgfSksCiAgICBdKQogICAgLnRoZW4oCiAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICBjb25zb2xlLmxvZygiQXN5bmM6IENvcHlpbmcgdG8gY2xpcGJvYXJkIHdhcyBzdWNjZXNzZnVsISIpOwogICAgICB9LAogICAgICBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiQXN5bmM6IENvdWxkIG5vdCBjb3B5IHRleHQ6ICIsIGVycik7CiAgICAgIH0KICAgICk7Cn0KCmZ1bmN0aW9uIGNvcHlJbWFnZVRvQ2xpcGJvYXJkKCkgewogIC8vIFdlIGV4dHJhY3QgdGhlIGltYWdlIG9wdGlvbnMgZnJvbSB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycyAoaWYgdGhleSBleGlzdCkKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LiBXZSBhbHNvIGlnbm9yZSBmb3JtYXQgYmVjYXVzZSB0aGUgY2xpcGJvYXJkIG9ubHkgc3VwcG9ydHMgcG5nLgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gImZvcm1hdCIpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LnRvSW1hZ2UoUExPVCwgY29uZmlnKS50aGVuKGZ1bmN0aW9uIChkYXRhVXJsKSB7CiAgICBmZXRjaChkYXRhVXJsKQogICAgICAudGhlbigocmVzKSA9PiByZXMuYmxvYigpKQogICAgICAudGhlbigoYmxvYikgPT4gewogICAgICAgIGNvbnN0IHBhc3RlX3JlY2VpdmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigncGFzdGUtcmVjZWl2ZXIucGx1dG9wbG90bHknKQogICAgICAgIGlmIChwYXN0ZV9yZWNlaXZlcikgewogICAgICAgICAgcGFzdGVfcmVjZWl2ZXIuYXR0YWNoSW1hZ2UoZGF0YVVybCwgQ09OVEFJTkVSKQogICAgICAgIH0KICAgICAgICBzZW5kVG9DbGlwYm9hcmQoYmxvYikKICAgICAgfSk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHNhdmVJbWFnZVRvRmlsZSgpIHsKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS5kb3dubG9hZEltYWdlKFBMT1QsIGNvbmZpZyk7Cn0KCmxldCBjb250YWluZXJfcmVjdCA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCwgdG9wOiAwLCBsZWZ0OiAwIH07CmZ1bmN0aW9uIHVucG9wX2NvbnRhaW5lcihjbCkgewogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgZmFsc2UpOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBmYWxzZSk7CiAgLy8gV2UgZml4IHRoZSBoZWlnaHQgYmFjayB0byB0aGUgdmFsdWUgaXQgaGFkIGJlZm9yZSBwb3BvdXQsIGFsc28gc2V0dGluZyB0aGUgZmxhZyB0byBzaWduYWwgdGhhdCB1cG9uIGZpcnN0IHJlc2l6ZSB3ZSByZW1vdmUgdGhlIGZpeGVkIGlubGluZS1zdHlsZQogIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQgKyAicHgiOwogIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IHRydWU7CiAgLy8gV2Ugc2V0IHRoZSBvdGhlciBmaXhlZCBpbmxpbmUtc3R5bGVzIHRvIG51bGwKICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICBDT05UQUlORVIuc3R5bGUudG9wID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBXZSBhbHNvIHJlbW92ZSB0aGUgQ0xJUEJPQVJEX0hFQURFUgogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSAiIjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBGaW5hbGx5IHdlIHJlbW92ZSB0aGUgaGlkZGVuIGNsYXNzIHRvIHRoZSBoZWFkZXIKICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIHRydWUpOwogIHJldHVybjsKfQpmdW5jdGlvbiBwb3BvdXRfY29udGFpbmVyKG9wdHMpIHsKICBjb25zdCBjbCA9IG9wdHM/LmNsOwogIGNvbnN0IHRhcmdldF9jb250YWluZXJfc2l6ZSA9IG9wdHM/LnRhcmdldF9jb250YWluZXJfc2l6ZSA/PyB7fTsKICBjb25zdCB0YXJnZXRfcGxvdF9zaXplID0gb3B0cz8udGFyZ2V0X3Bsb3Rfc2l6ZSA/PyB7fTsKICBpZiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIHJldHVybiB1bnBvcF9jb250YWluZXIoY2wpOwogIH0KICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgY2wgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdHJ1ZSk7CiAgLy8gV2UgZXh0cmFjdCB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjb250YWluZXIsIHNhdmUgdGhlbSBhbmQgZml4IHRoZW0KICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9ID0gQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogIGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfTsKICAvLyBXZSBzYXZlIHRoZSBjdXJyZW50IHBsb3Qgc2l6ZSBiZWZvcmUgd2UgcG9wIGFzIGl0IHdpbGwgZmlsbCB0aGUgc2NyZWVuCiAgY29uc3QgY3VycmVudF9wbG90X3NpemUgPSB7CiAgICB3aWR0aDogUExPVC5fZnVsbExheW91dC53aWR0aCwKICAgIGhlaWdodDogUExPVC5fZnVsbExheW91dC5oZWlnaHQsCiAgfTsKICAvLyBXZSBoYXZlIHRvIHNhdmUgdGhlIHBhZCBkYXRhIGJlZm9yZSBwb3BwaW5nIHNvIHdlIGNhbiByZXNpemUgcHJlY2lzZWx5CiAgY29uc3QgcGFkID0ge307CiAgcGFkLnVucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgdHJ1ZSk7CiAgcGFkLnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICAvLyBXZSBkbyB0b3AgYW5kIGxlZnQgYmFzZWQgb24gdGhlIGN1cnJlbnQgcmVjdAogIGZvciAoY29uc3Qga2V5IG9mIFsidG9wIiwgImxlZnQiXSkgewogICAgY29uc3Qgc3RhcnRfdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY29udGFpbmVyX3JlY3Rba2V5XTsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgZm9yIChjb25zdCBraW5kIG9mIFsicGFkZGluZyIsICJib3JkZXIiXSkgewogICAgICBvZmZzZXQgKz0gcGFkLnBvcHBlZFtraW5kXVtrZXldIC0gcGFkLnVucG9wcGVkW2tpbmRdW2tleV07CiAgICB9CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHN0YXJ0X3ZhbCAtIG9mZnNldCArICJweCI7CiAgICBpZiAoa2V5ID09PSAibGVmdCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIC8vIFdlIGNvbXB1dGUgdGhlIHdpZHRoIGFuZCBoZWlnaHQgZGVwZW5kaW5nIG9uIGV2ZW50dWFsIGNvbmZpZyBkYXRhCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoewogICAgd2lkdGg6CiAgICAgIHRhcmdldF9wbG90X3NpemUud2lkdGggPz8KICAgICAgY29uZmlnX3NwYW5zLndpZHRoLmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS5oZWlnaHQgPz8KICAgICAgY29uZmlnX3NwYW5zLmhlaWdodC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUuaGVpZ2h0LAogIH0pOwogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIGNvbnN0IHZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNzeltrZXldOwogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSB2YWwgKyAicHgiOwogICAgaWYgKGtleSA9PT0gIndpZHRoIikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCBmYWxzZSk7CiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgdW5wb3BfY29udGFpbmVyKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKfQoKQ09OVEFJTkVSLnBvcE91dCA9IHBvcG91dF9jb250YWluZXI7CgpmdW5jdGlvbiBEdWFsQ2xpY2soc2luZ2xlX2Z1bmMsIGRibF9mdW5jKSB7CiAgbGV0IG5jbGlja3MgPSAwOwogIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykgewogICAgbmNsaWNrcyArPSAxOwogICAgaWYgKG5jbGlja3MgPiAxKSB7CiAgICAgIGRibF9mdW5jKC4uLmFyZ3MpOwogICAgICBuY2xpY2tzID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIGRlbGF5KDMwMCkudGhlbigoKSA9PiB7CiAgICAgICAgaWYgKG5jbGlja3MgPT0gMSkgewogICAgICAgICAgc2luZ2xlX2Z1bmMoLi4uYXJncyk7CiAgICAgICAgfQogICAgICAgIG5jbGlja3MgPSAwOwogICAgICB9KTsKICAgIH0KICB9Owp9CgovLyBXZSByZW1vdmUgdGhlIGRlZmF1bHQgZG93bmxvYWQgaW1hZ2UgYnV0dG9uCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSwKICBbInRvSW1hZ2UiXQopOwovLyBXZSBhZGQgdGhlIGN1c3RvbSBidXR0b24gdG8gdGhlIG1vZGViYXIKcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkLAogIFsKICAgIHsKICAgICAgbmFtZTogIkNvcHkgUE5HIHRvIENsaXBib2FyZCIsCiAgICAgIGljb246IHsKICAgICAgICBoZWlnaHQ6IDUyMCwKICAgICAgICB3aWR0aDogNTIwLAogICAgICAgIHBhdGg6ICJNMjgwIDY0aDQwYzM1LjMgMCA2NCAyOC43IDY0IDY0VjQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEg2NGMtMzUuMyAwLTY0LTI4LjctNjQtNjRWMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0aDQwIDkuNkMxMjEgMjcuNSAxNTMuMyAwIDE5MiAwczcxIDI3LjUgNzguNCA2NEgyODB6TTY0IDExMmMtOC44IDAtMTYgNy4yLTE2IDE2VjQ0OGMwIDguOCA3LjIgMTYgMTYgMTZIMzIwYzguOCAwIDE2LTcuMiAxNi0xNlYxMjhjMC04LjgtNy4yLTE2LTE2LTE2SDMwNHYyNGMwIDEzLjMtMTAuNyAyNC0yNCAyNEgxOTIgMTA0Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNFYxMTJINjR6bTEyOC04YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHoiLAogICAgICB9LAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soY29weUltYWdlVG9DbGlwYm9hcmQsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKCk7CiAgICAgIH0pLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIkRvd25sb2FkIEltYWdlIiwKICAgICAgaWNvbjogUGxvdGx5Lkljb25zLmNhbWVyYSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKHNhdmVJbWFnZVRvRmlsZSwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoeyBjbDogImZpbGVzYXZlIiB9KTsKICAgICAgfSksCiAgICB9LAogIF0KKTsKCmZ1bmN0aW9uIGdldE9mZnNldERhdGEoZWwpIHsKICBsZXQgY3MgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgbnVsbCk7CiAgY29uc3Qgb2RhdGEgPSB7CiAgICBwYWRkaW5nOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgfSwKICAgIGJvcmRlcjogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgfQogIH07CiAgaWYgKGVsID09PSBQTE9UKSB7CiAgICAvLyBGb3IgdGhlIFBMT1Qgd2UgYWxzbyB3YW50IHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBvZmZzZXQKICAgIG9kYXRhLm9mZnNldCA9IHsKICAgICAgdG9wOiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldFRvcCA6IDAsCiAgICAgIGxlZnQ6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0TGVmdCA6IDAsCiAgICB9CiAgfQogIHJldHVybiBvZGF0YTsKfQpmdW5jdGlvbiBnZXRTaXplRGF0YSgpIHsKICBjb25zdCBkYXRhID0gewogICAgcGxvdF9wYWQ6IGdldE9mZnNldERhdGEoUExPVCksCiAgICBwbG90X3JlY3Q6IFBMT1QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgICBjb250YWluZXJfcGFkOiBnZXRPZmZzZXREYXRhKENPTlRBSU5FUiksCiAgICBjb250YWluZXJfcmVjdDogQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogIH07CiAgcmV0dXJuIGRhdGE7Cn0KZnVuY3Rpb24gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGNvbnN0IGNvbXB1dGVkX3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIGNvbnN0IG9mZnNldHMgPSBjb21wdXRlZF9zaXplLm9mZnNldHM7CgogIGNvbnN0IHBsb3RfZGF0YSA9IHsKICAgIHdpZHRoOiB3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiBoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfTsKCiAgcmV0dXJuIHsKICAgIHdpZHRoOiAod2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCkgKyBvZmZzZXRzLndpZHRoLAogICAgaGVpZ2h0OiAoaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0KSArIG9mZnNldHMuaGVpZ2h0LAogICAgbm9DaGFuZ2U6IHdpZHRoID09IGNvbXB1dGVkX3NpemUud2lkdGggJiYgaGVpZ2h0ID09IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH0KfQoKLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGNoYW5nZSB0aGUgY29udGFpbmVyIHNpemUgc28gdGhhdCB0aGUgcmVzdWx0aW5nIHBsb3Qgd2lsbCBiZSBtYXRjaGluZyB0aGUgcHJvdmlkZWQgc3BlY3MKZnVuY3Rpb24gY2hhbmdlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgaWYgKCFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgY29uc29sZS5sb2coIlRyaWVkIHRvIGNoYW5nZSBjb250YWluZXIgc2l6ZSB3aGVuIG5vdCBwb3BwZWQsIGlnbm9yaW5nIik7CiAgICByZXR1cm47CiAgfQoKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEpOwoKICBpZiAoY3N6Lm5vQ2hhbmdlKSB7CiAgICBjb25zb2xlLmxvZygiU2l6ZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50LCBpZ25vcmluZyIpOwogICAgcmV0dXJuCiAgfQogIC8vIFdlIGFyZSBub3cgZ29pbmcgdG8gc2V0IGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGNvbnRhaW5lcgogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gY3N6W2tleV0gKyAicHgiOwogIH0KfQovLyBXZSBub3cgY3JlYXRlIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgdXBkYXRlIHRoZSBwbG90IGJhc2VkIG9uIHRoZSB2YWx1ZXMgc3BlY2lmaWVkCmZ1bmN0aW9uIHVwZGF0ZUZyb21IZWFkZXIoKSB7CiAgY29uc3QgaGVhZGVyX2RhdGEgPSB7CiAgICBoZWlnaHQ6IGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUsCiAgICB3aWR0aDogY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlLAogIH07CiAgY2hhbmdlQ29udGFpbmVyU2l6ZShoZWFkZXJfZGF0YSk7Cn0KLy8gV2UgYXNzaWduIHRoaXMgZnVuY3Rpb24gdG8gdGhlIG9uYmx1ciBldmVudCBvZiB3aWR0aCBhbmQgaGVpZ2h0CmlmIChmaXJzdFJ1bikgewogIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLnVpX3NwYW4ub25ibHVyID0gKGUpID0+IHsKICAgICAgY29udGFpbmVyLnVpX3ZhbHVlID0gY29udGFpbmVyLnVpX3NwYW4udGV4dENvbnRlbnQ7CiAgICAgIHVwZGF0ZUZyb21IZWFkZXIoKTsKICAgIH07CiAgfQp9Ci8vIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIHBsb3Qgc2l6ZSB0byB1c2UgZm9yIHJlbGF5b3V0IGFzIGEgZnVuY3Rpb24gb2YgdGhlIGNvbnRhaW5lciBzaXplCmZ1bmN0aW9uIGNvbXB1dGVQbG90U2l6ZShkYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIC8vIFJlbW92ZSBQYWRkaW5nCiAgY29uc3QgeyBjb250YWluZXJfcGFkLCBwbG90X3BhZCwgY29udGFpbmVyX3JlY3QgfSA9IGRhdGE7CiAgY29uc3Qgb2Zmc2V0cyA9IHsKICAgIHdpZHRoOgogICAgICBwbG90X3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLndpZHRoICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LmxlZnQgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci53aWR0aCwKICAgIGhlaWdodDoKICAgICAgcGxvdF9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBwbG90X3BhZC5ib3JkZXIuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LnRvcCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci5oZWlnaHQsCiAgfTsKICBjb25zdCBzeiA9IHsKICAgIHdpZHRoOiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LndpZHRoIC0gb2Zmc2V0cy53aWR0aCksCiAgICBoZWlnaHQ6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3QuaGVpZ2h0IC0gb2Zmc2V0cy5oZWlnaHQpLAogICAgb2Zmc2V0cywKICB9OwogIHJldHVybiBzejsKfQoKLy8gQ3JlYXRlIHRoZSByZXNpemVPYnNlcnZlciB0byBtYWtlIHRoZSBwbG90IGV2ZW4gbW9yZSByZXNwb25zaXZlISA6bWFnaWM6CmNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7CiAgY29uc3Qgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpOwogIGNvbnN0IHtjb250YWluZXJfcmVjdCwgY29udGFpbmVyX3BhZH0gPSBzaXplRGF0YTsKICBsZXQgcGxvdF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICAvLyBXZSBzYXZlIHRoZSBoZWlnaHQgaW4gdGhlIFBMT1Qgb2JqZWN0CiAgUExPVC5jb250YWluZXJfaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0OwogIC8vIFdlIGRlYWwgd2l0aCBzb21lIHN0dWZmIGlmIHRoZSBjb250YWluZXIgaXMgcG9wcHBlZAogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSBjb250YWluZXJfcmVjdC53aWR0aCArICJweCI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gY29udGFpbmVyX3JlY3QubGVmdCArICJweCI7CiAgY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS5oZWlnaHQ7CiAgY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlID0gcGxvdF9zaXplLndpZHRoOwogIC8qIAoJCVRoZSBhZGRpdGlvbiBvZiB0aGUgaW52YWxpZCBhcmd1bWVudCBgcGx1dG9yZXNpemVgIHNlZW1zIHRvIGZpeCB0aGUgcHJvYmxlbSB3aXRoIGNhbGxpbmcgYHJlbGF5b3V0YCBzaW1wbHkgd2l0aCBge2F1dG9zaXplOiB0cnVlfWAgYXMgdXBkYXRlIGJyZWFraW5nIG1vdXNlIHJlbGF5b3V0IGV2ZW50cyB0cmFja2luZy4gCgkJU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wbG90bHkvcGxvdGx5LmpzL2lzc3Vlcy82MTU2IGZvciBkZXRhaWxzCgkJKi8KICBsZXQgY29uZmlnID0gewogICAgLy8gSWYgdGhpcyBpcyBwb3BwZWQgb3V0LCB3ZSBpZ25vcmUgdGhlIG9yaWdpbmFsIHdpZHRoL2hlaWdodAogICAgd2lkdGg6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX3dpZHRoKSA/PyBwbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX2hlaWdodCkgPz8gcGxvdF9zaXplLmhlaWdodCwKICAgIHBsdXRvcmVzaXplOiB0cnVlLAogIH07CiAgUGxvdGx5LnJlbGF5b3V0KFBMT1QsIGNvbmZpZykudGhlbigoKSA9PiB7CiAgICBpZiAocmVtb3ZlX2NvbnRhaW5lcl9zaXplICYmICFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBhdm9pZCB0aGUgZmlyc3QgcmVzaXplIHVwb24gcGxvdCBjcmVhdGlvbiB0byBhbHJlYWR5IGJlIHdpdGhvdXQgYSBmaXhlZCBoZWlnaHQKICAgICAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9ICIiOwogICAgICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICAgICAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmFsc2U7CiAgICB9CiAgfSk7Cn0pOwoKcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShDT05UQUlORVIpOwoKClBsb3RseS5yZWFjdChQTE9ULCBwbG90X29iaikudGhlbigoKSA9PiB7CgkvLyBBc3NpZ24gdGhlIFBsb3RseSBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhwbG90bHlfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1Qub24oa2V5LCBsaXN0ZW5lcikKCQl9Cgl9CgkvLyBBc3NpZ24gdGhlIEpTIGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKGpzX2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULmFkZEV2ZW50TGlzdGVuZXIoa2V5LCBsaXN0ZW5lciwgewoJCQkJc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbAoJCQl9KQoJCX0KCX0KfQopCgoKaW52YWxpZGF0aW9uLnRoZW4oKCkgPT4gewoJLy8gUmVtb3ZlIGFsbCBwbG90bHkgbGlzdGVuZXJzCglQTE9ULnJlbW92ZUFsbExpc3RlbmVycygpCgkvLyBSZW1vdmUgYWxsIEpTIGxpc3RlbmVycwoJY29udHJvbGxlci5hYm9ydCgpCgkvLyBSZW1vdmUgdGhlIHJlc2l6ZU9ic2VydmVyCglyZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCkKfSkKCgoKCQlyZXR1cm4gQ09OVEFJTkVSCgk8L3NjcmlwdD4KpG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv8hOouR1sHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQ5NjQ0MDRmNi03ZjQ2LTRkZjktYWQ5OC05MjE5NDhjM2JlNjm5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4FUv/vtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5HZNTdiY2MwNWIwLTgxZGEtMTFlZi0yMDQwLTM1ODVjOWI0OTU0Zi85Y2EzMjE1YzY4ODMwMmY4uGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJGQxNmVmYTYyLWRjZTctNGVjMy05ZTNjLWI1ZTE2NzczNzdmY4qmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHmgpG1pbWWqdGV4dC9wbGFpbqxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b/IRhKpP7BwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkZDE2ZWZhNjItZGNlNy00ZWMzLTllM2MtYjVlMTY3NzM3N2ZjuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAVxoarVwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJGMwMmYzODk4LTEwY2ItNGYxZS1iNWVmLWViNDJiODAzYmFlZIqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnaaokJPHNjcmlwdCBpZD0ncGxvdF8xJz4KCQkvLyBXZSBzdGFydCBieSBwdXR0aW5nIGFsbCB0aGUgdmFyaWFibGUgaW50ZXJwb2xhdGlvbiBoZXJlIGF0IHRoZSBiZWdpbm5pbmcKCQkvLyBXZSBoYXZlIHRvIGNvbnZlcnQgYWxsIHR5cGVkYXJyYXlzIGluIHRoZSBsYXlvdXQgdG8gbm9ybWFsIGFycmF5cy4gU2VlIElzc3VlICMyNQoJCS8vIFdlIHVzZSBsb2Rhc2ggZm9yIHRoaXMgZm9yIGNvbXBhY3RuZXNzCgkJZnVuY3Rpb24gcmVtb3ZlVHlwZWRBcnJheShvKSB7CgkJCXJldHVybiBfLmlzVHlwZWRBcnJheShvKSA/IEFycmF5LmZyb20obykgOgoJCQlfLmlzUGxhaW5PYmplY3QobykgPyBfLm1hcFZhbHVlcyhvLCByZW1vdmVUeXBlZEFycmF5KSA6IAoJCQlvCgkJfQoKCQkvLyBQdWJsaXNoIHRoZSBwbG90IG9iamVjdCB0byBKUwoJCWxldCBwbG90X29iaiA9IF8udXBkYXRlKC8qIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgQWJzdHJhY3RQbHV0b0RpbmdldGplcy5EaXNwbGF5LnB1Ymxpc2hlZF90b19qcyAqLyBnZXRQdWJsaXNoZWRPYmplY3QoIjdiY2MwNWIwLTgxZGEtMTFlZi0yMDQwLTM1ODVjOWI0OTU0Zi85YjY0NzUxZDNhZmEyNmZmIiksICJsYXlvdXQiLCByZW1vdmVUeXBlZEFycmF5KQoJCS8vIEdldCB0aGUgcGxvdGx5IGxpc3RlbmVycwoJCWNvbnN0IHBsb3RseV9saXN0ZW5lcnMgPSB7fQoJCS8vIEdldCB0aGUgSlMgbGlzdGVuZXJzCgkJY29uc3QganNfbGlzdGVuZXJzID0ge30KCQkvLyBEZWFsIHdpdGggZXZlbnR1YWwgY3VzdG9tIGNsYXNzZXMKCQlsZXQgY3VzdG9tX2NsYXNzbGlzdCA9IFtdCgoKCQkvLyBMb2FkIHRoZSBwbG90bHkgbGlicmFyeQoJCWxldCBQbG90bHkgPSB1bmRlZmluZWQKCQl0cnkgewoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiLi9wbG90bHlqcy9wbG90bHlqcy0yLjI2LjIubWluLmpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfSBjYXRjaCAoZSkgewoJCQljb25zb2xlLmxvZygiTG9jYWwgbG9hZCBmYWlsZWQsIHRyeWluZyB3aXRoIHRoZSB3ZWIgZXNtLnNoIHZlcnNpb24iKQoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiaHR0cHM6Ly9lc20uc2gvdjEzNS9wbG90bHkuanMtZGlzdC1taW5AMi4yNi4yL2VzbmV4dC9wbG90bHkuanMtZGlzdC1taW4ubWpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfQoKCQkvLyBDaGVjayBpZiB3ZSBoYXZlIHRvIGZvcmNlIGxvY2FsIG1hdGhqYXggZm9udCBjYWNoZQoJCWlmIChmYWxzZSAmJiB3aW5kb3c/Lk1hdGhKYXg/LmNvbmZpZz8uc3ZnPy5mb250Q2FjaGUgPT09ICdnbG9iYWwnKSB7CgkJCXdpbmRvdy5NYXRoSmF4LmNvbmZpZy5zdmcuZm9udENhY2hlID0gJ2xvY2FsJwoJCX0KCgkJLy8gRmxhZyB0byBjaGVjayBpZiB0aGlzIGNlbGwgd2FzICBtYW51YWxseSByYW4gb3IgcmVhY3RpdmVseSByYW4KY29uc3QgZmlyc3RSdW4gPSB0aGlzID8gZmFsc2UgOiB0cnVlCmNvbnN0IENPTlRBSU5FUiA9IHRoaXMgPz8gaHRtbGA8ZGl2IGNsYXNzPSdwbHV0b3Bsb3RseS1jb250YWluZXInPmAKY29uc3QgUExPVCA9IENPTlRBSU5FUi5xdWVyeVNlbGVjdG9yKCcuanMtcGxvdGx5LXBsb3QnKSA/PyBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2PmApCmNvbnN0IHBhcmVudCA9IENPTlRBSU5FUi5wYXJlbnRFbGVtZW50Ci8vIFdlIHVzZSBhIGNvbnRyb2xsZXIgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVycyB1cG9uIGludmFsaWRhdGlvbgpjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpCi8vIFdlIGhhdmUgdG8gYWRkIHRoaXMgdG8ga2VlcCBzdXBwb3J0aW5nIEBiaW5kIHdpdGggdGhlIG9sZCBBUEkgdXNpbmcgUExPVApQTE9ULmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGUpID0+IHsKCUNPTlRBSU5FUi52YWx1ZSA9IFBMT1QudmFsdWUKCWlmIChlLmJ1YmJsZXMpIHsKCQlyZXR1cm4KCX0KCUNPTlRBSU5FUi5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnaW5wdXQnKSkKfSwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pCgoJLy8gVGhpcyBjcmVhdGUgdGhlIHN0eWxlIHN1YmRpdiBvbiBmaXJzdCBydW4KCWZpcnN0UnVuICYmIENPTlRBSU5FUi5hcHBlbmRDaGlsZChodG1sYAoJPHN0eWxlPgoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciB7CgkJd2lkdGg6IDEwMCU7CgkJaGVpZ2h0OiAxMDAlOwoJCW1pbi1oZWlnaHQ6IDA7CgkJbWluLXdpZHRoOiAwOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciAuanMtcGxvdGx5LXBsb3QgLnBsb3RseSBkaXYgewoJCW1hcmdpbjogMCBhdXRvOyAvLyBUaGlzIGNlbnRlcnMgdGhlIHBsb3QKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIucG9wcGVkLW91dCB7CgkJb3ZlcmZsb3c6IGF1dG87CgkJei1pbmRleDogMTAwMDsKCQlwb3NpdGlvbjogZml4ZWQ7CgkJcmVzaXplOiBib3RoOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMHB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwcHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciB7CgkJZGlzcGxheTogZmxleDsKCQlmbGV4LWZsb3c6IHJvdyB3cmFwOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDEycHg7CgkJcG9zaXRpb246IGZpeGVkOwoJCXotaW5kZXg6IDEwMDE7CgkJY3Vyc29yOiBtb3ZlOwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgLTEwMCUpOwoJCXBhZGRpbmc6IDVweDsKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIHNwYW4gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQlmbGV4OiAxCgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlci5oaWRkZW4gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuY2xpcGJvYXJkLXNwYW4gewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCX0KCS5jbGlwYm9hcmQtdmFsdWUgewoJCXBhZGRpbmctcmlnaHQ6IDVweDsKCQlwYWRkaW5nLWxlZnQ6IDJweDsKCQljdXJzb3I6IHRleHQ7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlmbGV4OiAwIDAgMTAwJTsKCQl0ZXh0LWFsaWduOiBjZW50ZXI7CgkJYm9yZGVyLXRvcDogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCW1hcmdpbi10b3A6IDVweDsKCQlkaXNwbGF5OiBub25lOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5maWxlc2F2ZSAuY2xpcGJvYXJkLXNwYW4uZmlsZW5hbWUgewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5jbGlwYm9hcmQtdmFsdWUuZmlsZW5hbWUgewoJCW1hcmdpbi1sZWZ0OiAzcHg7CgkJdGV4dC1hbGlnbjogbGVmdDsKCQltaW4td2lkdGg6IG1pbig2MCUsIG1pbi1jb250ZW50KTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogaW5saW5lLWZsZXg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IC5sYWJlbCB7CgkJZmxleDogMCAwIDA7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZvcm1hdCB7CgkJcG9zaXRpb246IHJlbGF0aXZlOwoJCWZsZXg6IDEgMCBhdXRvOwoJCW1pbi13aWR0aDogMzBweDsKCQltYXJnaW4tcmlnaHQ6IDEwcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJCWZsZXgtZmxvdzogY29sdW1uOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXBhZGRpbmctbGVmdDogM3B4OwoJCXotaW5kZXg6IDIwMDA7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgewoJCWN1cnNvcjogcG9pbnRlcjsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlwYWRkaW5nOiAzcHg7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTNweCwgLTZweCk7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5mb3JtYXQtb3B0aW9uOm5vdCguc2VsZWN0ZWQpIHsKCQltYXJnaW4tdG9wOiAzcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24uc2VsZWN0ZWQgewoJCW9yZGVyOiAtMTsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpob3ZlciB7CgkJYmFja2dyb3VuZC1jb2xvcjogdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7Cgl9CglzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZm9udC13ZWlnaHQ6IG5vcm1hbDsKCQljb2xvcjogdmFyKC0tcGx1dG8tb3V0cHV0LWNvbG9yKTsKCQlkaXNwbGF5OiBub25lOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgY2FsYygtMTAwJSAtIDEwcHgpKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkubGFiZWwgewoJCXVzZXItc2VsZWN0OiBub25lOwoJfQoJLmxhYmVsOmhvdmVyIHNwYW4uY29uZmlnLXZhbHVlIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJbWluLXdpZHRoOiAxNTBweDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5tYXRjaGluZy1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tbWFjcm8tY29sb3IpOwoJCWZvbnQtd2VpZ2h0OiBib2xkOwoJfQoJLmNsaXBib2FyZC1zcGFuLmRpZmZlcmVudC1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tdGFnLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KPC9zdHlsZT4KYCkKCmxldCBvcmlnaW5hbF9oZWlnaHQgPSBwbG90X29iai5sYXlvdXQuaGVpZ2h0CmxldCBvcmlnaW5hbF93aWR0aCA9IHBsb3Rfb2JqLmxheW91dC53aWR0aAovLyBGb3IgdGhlIGhlaWdodCB3ZSBoYXZlIHRvIGFsc28gcHV0IGEgZml4ZWQgdmFsdWUgaW4gY2FzZSB0aGUgcGxvdCBpcyBwdXQgb24gYSBub24tZml4ZWQtc2l6ZSBjb250YWluZXIgKGxpa2UgdGhlIGRlZmF1bHQgd3JhcHBlcikKLy8gV2UgZGVmaW5lIGEgdmFyaWFibGUgdG8gY2hlY2sgd2hldGhlciB3ZSBzdGlsbCBoYXZlIHRvIHJlbW92ZSB0aGUgZml4ZWQgaGVpZ2h0CmxldCByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmaXJzdFJ1bgpsZXQgY29udGFpbmVyX2hlaWdodCA9IG9yaWdpbmFsX2hlaWdodCA/PyBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPz8gNDAwCkNPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfaGVpZ2h0ICsgJ3B4JwoKLy8gV2UgY3JlYXRlIGEgUHJvbWlzZSB2ZXJzaW9uIG9mIHNldFRpbWVvdXQKZnVuY3Rpb24gZGVsYXkobXMpIHsKICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTsKfQoKLy8gV2UgaW1wb3J0IGludGVyYWN0IGZvciBkcmFnZ2luZy9yZXNpemluZwpjb25zdCB7IGRlZmF1bHQ6IGludGVyYWN0IH0gPSBhd2FpdCBpbXBvcnQoJ2h0dHBzOi8vZXNtLnNoL2ludGVyYWN0anNAMS4xMC4xOScpCgoKZnVuY3Rpb24gZ2V0SW1hZ2VPcHRpb25zKCkgewogIGNvbnN0IG8gPSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPz8ge307CiAgcmV0dXJuIHsKICAgIGZvcm1hdDogby5mb3JtYXQgPz8gInBuZyIsCiAgICB3aWR0aDogby53aWR0aCA/PyBvcmlnaW5hbF93aWR0aCwKICAgIGhlaWdodDogby5oZWlnaHQgPz8gb3JpZ2luYWxfaGVpZ2h0LAogICAgc2NhbGU6IG8uc2NhbGUgPz8gMSwKICAgIGZpbGVuYW1lOiBvLmZpbGVuYW1lID8/ICJuZXdwbG90IiwKICB9Owp9Cgpjb25zdCBDTElQQk9BUkRfSEVBREVSID0KICBDT05UQUlORVIucXVlcnlTZWxlY3RvcigiLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIiKSA/PwogIENPTlRBSU5FUi5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAiYWZ0ZXJiZWdpbiIsCiAgICBodG1sYDxkaXYgY2xhc3M9InBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgaGlkZGVuIj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZvcm1hdCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5Gb3JtYXQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZm9ybWF0Ij48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHdpZHRoIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPldpZHRoOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIHdpZHRoIj48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gaGVpZ2h0IgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkhlaWdodDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBoZWlnaHQiPjwvc3Bhbj5weDwvc3BhbgogICAgICA+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzY2FsZSIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5TY2FsZTo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBzY2FsZSI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHNldCI+U2V0PC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHVuc2V0Ij5VbnNldDwvYnV0dG9uPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gZmlsZW5hbWUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+RmlsZW5hbWU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZmlsZW5hbWUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgPC9kaXY+YAogICk7CgpmdW5jdGlvbiBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKSB7CiAgY29uc3QgdmFsaWRfY2xhc3NlcyA9IFsKICAgICJtaXNzaW5nLWNvbmZpZyIsCiAgICAibWF0Y2hpbmctY29uZmlnIiwKICAgICJkaWZmZXJlbnQtY29uZmlnIiwKICBdOwogIGZ1bmN0aW9uIHNldENsYXNzKGNsKSB7CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgdmFsaWRfY2xhc3NlcykgewogICAgICBjb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZShuYW1lLCBuYW1lID09IGNsKTsKICAgIH0KICB9CiAgLy8gV2UgdXNlIHRoZSBjdXN0b20gZ2V0dGVycyB3ZSdsbCBzZXQgdXAgaW4gdGhlIGNvbnRhaW5lcgogIGNvbnN0IHsgdWlfdmFsdWUsIGNvbmZpZ192YWx1ZSwgY29uZmlnX3NwYW4sIGtleSB9ID0gY29udGFpbmVyOwogIGlmIChjb25maWdfdmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgc2V0Q2xhc3MoIm1pc3NpbmctY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGlzIG5vdCBwcmVzZW50IGluIHRoZSBjb25maWcuYDsKICB9IGVsc2UgaWYgKHVpX3ZhbHVlID09IGNvbmZpZ192YWx1ZSkgewogICAgc2V0Q2xhc3MoIm1hdGNoaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgdGhlIHNhbWUgdmFsdWUgaW4gdGhlIGNvbmZpZyBhbmQgaW4gdGhlIGhlYWRlci5gOwogIH0gZWxzZSB7CiAgICBzZXRDbGFzcygiZGlmZmVyZW50LWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgYSBkaWZmZXJlbnQgdmFsdWUgKDxlbT4ke2NvbmZpZ192YWx1ZX08L2VtPikgaW4gdGhlIGNvbmZpZy5gOwogIH0KICAvLyBBZGQgaW5mbyBhYm91dCBzZXR0aW5nIGFuZCB1bnNldHRpbmcKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgb24gdGhlIGxhYmVsIDxlbT48Yj5vbmNlPC9iPjwvZW0+IHRvIHNldCB0aGUgY3VycmVudCBVSSB2YWx1ZSBpbiB0aGUgY29uZmlnLmAKICApOwogIGNvbmZpZ19zcGFuLmluc2VydEFkamFjZW50SFRNTCgKICAgICJiZWZvcmVlbmQiLAogICAgYDxicj5DbGljayA8ZW0+PGI+dHdpY2U8L2I+PC9lbT4gdG8gcmVtb3ZlIHRoaXMga2V5IGZyb20gdGhlIGNvbmZpZy5gCiAgKTsKfQoKY29uc3QgdmFsaWRfZm9ybWF0cyA9IFsicG5nIiwgInN2ZyIsICJ3ZWJwIiwgImpwZWciLCAiZnVsbC1qc29uIl07CmZ1bmN0aW9uIGluaXRpYWxpemVVSVZhbHVlU3BhbihzcGFuLCBrZXksIHZhbHVlKSB7CiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9IGtleSA9PT0gImZvcm1hdCIgPyAiZmFsc2UiIDogInRydWUiOwogIGxldCBwYXJzZSA9ICh4KSA9PiB4OwogIGxldCB1cGRhdGUgPSAoeCkgPT4gKHNwYW4udGV4dENvbnRlbnQgPSB4KTsKICBpZiAoa2V5ID09PSAid2lkdGgiIHx8IGtleSA9PT0gImhlaWdodCIpIHsKICAgIHBhcnNlID0gKHgpID0+IE1hdGgucm91bmQocGFyc2VGbG9hdCh4KSk7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJzY2FsZSIpIHsKICAgIHBhcnNlID0gcGFyc2VGbG9hdDsKICB9IGVsc2UgaWYgKGtleSA9PT0gImZvcm1hdCIpIHsKICAgIC8vIFdlIHJlbW92ZSBjb250ZW50RWRpdGFibGUKICAgIHNwYW4uY29udGVudEVkaXRhYmxlID0gImZhbHNlIjsKICAgIC8vIEhlcmUgd2UgZmlyc3QgYWRkIHRoZSBzdWJzcGFucyBmb3IgZWFjaCBvcHRpb24KICAgIGNvbnN0IG9wdHNfZGl2ID0gc3Bhbi5hcHBlbmRDaGlsZChodG1sYDxkaXYgY2xhc3M9ImZvcm1hdC1vcHRpb25zIj48L2Rpdj5gKTsKICAgIGZvciAoY29uc3QgZm10IG9mIHZhbGlkX2Zvcm1hdHMpIHsKICAgICAgY29uc3Qgb3B0ID0gb3B0c19kaXYuYXBwZW5kQ2hpbGQoCiAgICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iZm9ybWF0LW9wdGlvbiAke2ZtdH0iPiR7Zm10fTwvc3Bhbj5gCiAgICAgICk7CiAgICAgIG9wdC5vbmNsaWNrID0gKGUpID0+IHsKICAgICAgICBzcGFuLnZhbHVlID0gb3B0LnRleHRDb250ZW50OwogICAgICB9OwogICAgfQogICAgcGFyc2UgPSAoeCkgPT4gewogICAgICByZXR1cm4gdmFsaWRfZm9ybWF0cy5pbmNsdWRlcyh4KSA/IHggOiBsb2NhbFZhbHVlOwogICAgfTsKICAgIHVwZGF0ZSA9ICh4KSA9PiB7CiAgICAgIGZvciAoY29uc3Qgb3B0IG9mIG9wdHNfZGl2LmNoaWxkcmVuKSB7CiAgICAgICAgb3B0LmNsYXNzTGlzdC50b2dnbGUoInNlbGVjdGVkIiwgb3B0LnRleHRDb250ZW50ID09PSB4KTsKICAgICAgfQogICAgfTsKICB9IGVsc2UgewogICAgLy8gV2Ugb25seSBoYXZlIGZpbGVuYW1lIGhlcmUKICB9CiAgbGV0IGxvY2FsVmFsdWU7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwYW4sICJ2YWx1ZSIsIHsKICAgIGdldDogKCkgPT4gewogICAgICByZXR1cm4gbG9jYWxWYWx1ZTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgaWYgKHZhbCAhPT0gIiIpIHsKICAgICAgICBsb2NhbFZhbHVlID0gcGFyc2UodmFsKTsKICAgICAgfQogICAgICB1cGRhdGUobG9jYWxWYWx1ZSk7CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKICAvLyBXZSBhbHNvIGFzc2lnbiBhIGxpc3RlbmVyIHNvIHRoYXQgdGhlIGVkaXRhYmxlIGlzIGJsdXJyZWQgd2hlbiBlbnRlciBpcyBwcmVzc2VkCiAgc3Bhbi5vbmtleWRvd24gPSAoZSkgPT4gewogICAgaWYgKGUua2V5Q29kZSA9PT0gMTMpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBzcGFuLmJsdXIoKTsKICAgIH0KICB9OwogIHNwYW4udmFsdWUgPSB2YWx1ZTsKfQoKZnVuY3Rpb24gaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3BhbihzcGFuLCBrZXkpIHsKICAvLyBIZXJlIHdlIG1vc3RseSB3YW50IHRvIGRlZmluZSB0aGUgc2V0dGVyIGFuZCBnZXR0ZXIKICBjb25zdCBjb250YWluZXIgPSBzcGFuLmNsb3Nlc3QoIi5jbGlwYm9hcmQtc3BhbiIpOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgfSwKICAgIHNldDogKHZhbCkgPT4gewogICAgICAvLyBpZiB1bmRlZmluZWQgaXMgcGFzc2VkLCB3ZSByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIG9wdGlvbnMKICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZGVsZXRlIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgICB9IGVsc2UgewogICAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldID0gdmFsOwogICAgICB9CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKfQoKY29uc3QgY29uZmlnX3NwYW5zID0ge307CmZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGdldEltYWdlT3B0aW9ucygpKSkgewogIGNvbnN0IGNvbnRhaW5lciA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcihgLmNsaXBib2FyZC1zcGFuLiR7a2V5fWApOwogIGNvbnN0IGxhYmVsID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5sYWJlbCIpOwogIC8vIFdlIGdpdmUgdGhlIGxhYmVsIGEgZnVuY3Rpb24gdGhhdCBvbiBzaW5nbGUgY2xpY2sgd2lsbCBzZXQgdGhlIGN1cnJlbnQgdmFsdWUgYW5kIHdpdGggZG91YmxlIGNsaWNrIHdpbGwgdW5zZXQgaXQKICBsYWJlbC5vbmNsaWNrID0gRHVhbENsaWNrKAogICAgKCkgPT4gewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfSwKICAgIChlKSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJlIiwgZSk7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IHVuZGVmaW5lZDsKICAgIH0KICApOwogIGNvbnN0IHVpX3ZhbHVlX3NwYW4gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC12YWx1ZSIpOwogIGNvbnN0IGNvbmZpZ192YWx1ZV9zcGFuID0KICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuY29uZmlnLXZhbHVlIikgPz8KICAgIGxhYmVsLmluc2VydEFkamFjZW50RWxlbWVudCgKICAgICAgImFmdGVyYmVnaW4iLAogICAgICBodG1sYDxzcGFuIGNsYXNzPSJjb25maWctdmFsdWUiPjwvc3Bhbj5gCiAgICApOwogIC8vIEFzc2luZyB0aGUgdHdvIHNwYW5zIGFzIHByb3BlcnRpZXMgb2YgdGhlIGNvbnRhaW5pbmcgc3BhbgogIGNvbnRhaW5lci51aV9zcGFuID0gdWlfdmFsdWVfc3BhbjsKICBjb250YWluZXIuY29uZmlnX3NwYW4gPSBjb25maWdfdmFsdWVfc3BhbjsKICBjb250YWluZXIua2V5ID0ga2V5OwogIGNvbmZpZ19zcGFuc1trZXldID0gY29udGFpbmVyOwogIGlmIChmaXJzdFJ1bikgewogICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID0KICAgICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogICAgLy8gV2UgZG8gdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSB2YWx1ZSBzcGFuCiAgICBpbml0aWFsaXplVUlWYWx1ZVNwYW4odWlfdmFsdWVfc3Bhbiwga2V5LCB2YWx1ZSk7CiAgICAvLyBUaGVuIHdlIGluaXRpYWxpemUgdGhlIGNvbmZpZyB2YWx1ZQogICAgaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3Bhbihjb25maWdfdmFsdWVfc3Bhbiwga2V5KTsKICAgIC8vIFdlIHB1dCBzb21lIGNvbnZlbmllbmNlIGdldHRlcnMvc2V0dGVycwogICAgLy8gdWlfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgInVpX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IHVpX3ZhbHVlX3NwYW4udmFsdWUsCiAgICAgIHNldDogKHZhbCkgPT4gewogICAgICAgIHVpX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICAgIC8vIGNvbmZpZ192YWx1ZSBmb3J3YXJkCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAiY29uZmlnX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IGNvbmZpZ192YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSA9IHZhbDsKICAgICAgfSwKICAgIH0pOwogIH0KfQoKLy8gVGhlc2Ugb2JqZWN0cyB3aWxsIGNvbnRhaW4gdGhlIGRlZmF1bHQgdmFsdWUKCi8vIFRoaXMgY29kZSB1cGRhdGVzIHRoZSBpbWFnZSBvcHRpb25zIGluIHRoZSBQTE9UIGNvbmZpZyB3aXRoIHRoZSBwcm92aWRlZCBvbmVzCmZ1bmN0aW9uIHNldEltYWdlT3B0aW9ucyhvKSB7CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBvW2tleV07CiAgfQp9CmZ1bmN0aW9uIHVuc2V0SW1hZ2VPcHRpb25zKCkgewogIHNldEltYWdlT3B0aW9ucyh7fSk7Cn0KCmNvbnN0IHNldF9idXR0b24gPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtc3Bhbi5zZXQiKTsKY29uc3QgdW5zZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4udW5zZXQiKTsKaWYgKGZpcnN0UnVuKSB7CiAgc2V0X2J1dHRvbi5vbmNsaWNrID0gKGUpID0+IHsKICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfQogIH07CiAgdW5zZXRfYnV0dG9uLm9uY2xpY2sgPSB1bnNldEltYWdlT3B0aW9uczsKfQoKLy8gV2UgYWRkIGEgZnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIGNsaXBib2FyZCBpcyBwb3BwZWQgb3V0CkNPTlRBSU5FUi5pc1BvcHBlZE91dCA9ICgpID0+IHsKICByZXR1cm4gQ09OVEFJTkVSLmNsYXNzTGlzdC5jb250YWlucygicG9wcGVkLW91dCIpOwp9OwoKQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNlZG93biA9IGZ1bmN0aW9uIChldmVudCkgewogIGlmIChldmVudC50YXJnZXQubWF0Y2hlcygic3Bhbi5jbGlwYm9hcmQtdmFsdWUiKSkgewogICAgY29uc29sZS5sb2coIldlIGRvbid0IG1vdmUhIik7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IHN0YXJ0ID0gewogICAgbGVmdDogcGFyc2VGbG9hdChDT05UQUlORVIuc3R5bGUubGVmdCksCiAgICB0b3A6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLnRvcCksCiAgICBYOiBldmVudC5wYWdlWCwKICAgIFk6IGV2ZW50LnBhZ2VZLAogIH07CiAgZnVuY3Rpb24gbW92ZUF0KGV2ZW50LCBzdGFydCkgewogICAgY29uc3QgdG9wID0gZXZlbnQucGFnZVkgLSBzdGFydC5ZICsgc3RhcnQudG9wICsgInB4IjsKICAgIGNvbnN0IGxlZnQgPSBldmVudC5wYWdlWCAtIHN0YXJ0LlggKyBzdGFydC5sZWZ0ICsgInB4IjsKICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUudG9wID0gdG9wOwogIH0KCiAgLy8gbW92ZSBvdXIgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGJhbGwgdW5kZXIgdGhlIHBvaW50ZXIKICBtb3ZlQXQoZXZlbnQsIHN0YXJ0KTsKICBmdW5jdGlvbiBvbk1vdXNlTW92ZShldmVudCkgewogICAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgfQoKICAvLyBXZSB1c2UgdGhpcyB0byByZW1vdmUgdGhlIG1vdXNlbW92ZSB3aGVuIGNsaWNraW5nIG91dHNpZGUgb2YgdGhlIGNvbnRhaW5lcgogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CgogIC8vIG1vdmUgdGhlIGNvbnRhaW5lciBvbiBtb3VzZW1vdmUKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCBvbk1vdXNlTW92ZSwgewogICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCwKICB9KTsKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICBjbGVhblVwKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKCiAgZnVuY3Rpb24gY2xlYW5VcCgpIHsKICAgIGNvbnNvbGUubG9nKCJjbGVhbmluZyB1cCB0aGUgcGxvdCBtb3ZlIGxpc3RlbmVyIik7CiAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICBDTElQQk9BUkRfSEVBREVSLm9ubW91c2V1cCA9IG51bGw7CiAgfQoKICAvLyAoMykgZHJvcCB0aGUgYmFsbCwgcmVtb3ZlIHVubmVlZGVkIGhhbmRsZXJzCiAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBjbGVhblVwOwp9OwoKZnVuY3Rpb24gc2VuZFRvQ2xpcGJvYXJkKGJsb2IpIHsKICBpZiAoIW5hdmlnYXRvci5jbGlwYm9hcmQpIHsKICAgIGFsZXJ0KAogICAgICAiVGhlIENsaXBib2FyZCBBUEkgZG9lcyBub3Qgc2VlbSB0byBiZSBhdmFpbGFibGUsIG1ha2Ugc3VyZSB0aGUgUGx1dG8gbm90ZWJvb2sgaXMgYmVpbmcgdXNlZCBmcm9tIGVpdGhlciBsb2NhbGhvc3Qgb3IgYW4gaHR0cHMgc291cmNlLiIKICAgICk7CiAgfQogIG5hdmlnYXRvci5jbGlwYm9hcmQKICAgIC53cml0ZShbCiAgICAgIG5ldyBDbGlwYm9hcmRJdGVtKHsKICAgICAgICAvLyBUaGUga2V5IGlzIGRldGVybWluZWQgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIGJsb2IncyB0eXBlLgogICAgICAgIFtibG9iLnR5cGVdOiBibG9iLAogICAgICB9KSwKICAgIF0pCiAgICAudGhlbigKICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgIGNvbnNvbGUubG9nKCJBc3luYzogQ29weWluZyB0byBjbGlwYm9hcmQgd2FzIHN1Y2Nlc3NmdWwhIik7CiAgICAgIH0sCiAgICAgIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJBc3luYzogQ291bGQgbm90IGNvcHkgdGV4dDogIiwgZXJyKTsKICAgICAgfQogICAgKTsKfQoKZnVuY3Rpb24gY29weUltYWdlVG9DbGlwYm9hcmQoKSB7CiAgLy8gV2UgZXh0cmFjdCB0aGUgaW1hZ2Ugb3B0aW9ucyBmcm9tIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzIChpZiB0aGV5IGV4aXN0KQogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuIFdlIGFsc28gaWdub3JlIGZvcm1hdCBiZWNhdXNlIHRoZSBjbGlwYm9hcmQgb25seSBzdXBwb3J0cyBwbmcuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwga2V5ID09PSAiZm9ybWF0IikgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbmZpZ1trZXldID0gdmFsOwogIH0KICBQbG90bHkudG9JbWFnZShQTE9ULCBjb25maWcpLnRoZW4oZnVuY3Rpb24gKGRhdGFVcmwpIHsKICAgIGZldGNoKGRhdGFVcmwpCiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5ibG9iKCkpCiAgICAgIC50aGVuKChibG9iKSA9PiB7CiAgICAgICAgY29uc3QgcGFzdGVfcmVjZWl2ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdwYXN0ZS1yZWNlaXZlci5wbHV0b3Bsb3RseScpCiAgICAgICAgaWYgKHBhc3RlX3JlY2VpdmVyKSB7CiAgICAgICAgICBwYXN0ZV9yZWNlaXZlci5hdHRhY2hJbWFnZShkYXRhVXJsLCBDT05UQUlORVIpCiAgICAgICAgfQogICAgICAgIHNlbmRUb0NsaXBib2FyZChibG9iKQogICAgICB9KTsKICB9KTsKfQoKZnVuY3Rpb24gc2F2ZUltYWdlVG9GaWxlKCkgewogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LmRvd25sb2FkSW1hZ2UoUExPVCwgY29uZmlnKTsKfQoKbGV0IGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwLCB0b3A6IDAsIGxlZnQ6IDAgfTsKZnVuY3Rpb24gdW5wb3BfY29udGFpbmVyKGNsKSB7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCBmYWxzZSk7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoY2wsIGZhbHNlKTsKICAvLyBXZSBmaXggdGhlIGhlaWdodCBiYWNrIHRvIHRoZSB2YWx1ZSBpdCBoYWQgYmVmb3JlIHBvcG91dCwgYWxzbyBzZXR0aW5nIHRoZSBmbGFnIHRvIHNpZ25hbCB0aGF0IHVwb24gZmlyc3QgcmVzaXplIHdlIHJlbW92ZSB0aGUgZml4ZWQgaW5saW5lLXN0eWxlCiAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9IGNvbnRhaW5lcl9yZWN0LmhlaWdodCArICJweCI7CiAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gdHJ1ZTsKICAvLyBXZSBzZXQgdGhlIG90aGVyIGZpeGVkIGlubGluZS1zdHlsZXMgdG8gbnVsbAogIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogIENPTlRBSU5FUi5zdHlsZS50b3AgPSAiIjsKICBDT05UQUlORVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIFdlIGFsc28gcmVtb3ZlIHRoZSBDTElQQk9BUkRfSEVBREVSCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9ICIiOwogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIEZpbmFsbHkgd2UgcmVtb3ZlIHRoZSBoaWRkZW4gY2xhc3MgdG8gdGhlIGhlYWRlcgogIENMSVBCT0FSRF9IRUFERVIuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgdHJ1ZSk7CiAgcmV0dXJuOwp9CmZ1bmN0aW9uIHBvcG91dF9jb250YWluZXIob3B0cykgewogIGNvbnN0IGNsID0gb3B0cz8uY2w7CiAgY29uc3QgdGFyZ2V0X2NvbnRhaW5lcl9zaXplID0gb3B0cz8udGFyZ2V0X2NvbnRhaW5lcl9zaXplID8/IHt9OwogIGNvbnN0IHRhcmdldF9wbG90X3NpemUgPSBvcHRzPy50YXJnZXRfcGxvdF9zaXplID8/IHt9OwogIGlmIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgcmV0dXJuIHVucG9wX2NvbnRhaW5lcihjbCk7CiAgfQogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBjbCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0cnVlKTsKICAvLyBXZSBleHRyYWN0IHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNvbnRhaW5lciwgc2F2ZSB0aGVtIGFuZCBmaXggdGhlbQogIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH0gPSBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgY29udGFpbmVyX3JlY3QgPSB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9OwogIC8vIFdlIHNhdmUgdGhlIGN1cnJlbnQgcGxvdCBzaXplIGJlZm9yZSB3ZSBwb3AgYXMgaXQgd2lsbCBmaWxsIHRoZSBzY3JlZW4KICBjb25zdCBjdXJyZW50X3Bsb3Rfc2l6ZSA9IHsKICAgIHdpZHRoOiBQTE9ULl9mdWxsTGF5b3V0LndpZHRoLAogICAgaGVpZ2h0OiBQTE9ULl9mdWxsTGF5b3V0LmhlaWdodCwKICB9OwogIC8vIFdlIGhhdmUgdG8gc2F2ZSB0aGUgcGFkIGRhdGEgYmVmb3JlIHBvcHBpbmcgc28gd2UgY2FuIHJlc2l6ZSBwcmVjaXNlbHkKICBjb25zdCBwYWQgPSB7fTsKICBwYWQudW5wb3BwZWQgPSBnZXRTaXplRGF0YSgpLmNvbnRhaW5lcl9wYWQ7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCB0cnVlKTsKICBwYWQucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIC8vIFdlIGRvIHRvcCBhbmQgbGVmdCBiYXNlZCBvbiB0aGUgY3VycmVudCByZWN0CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ0b3AiLCAibGVmdCJdKSB7CiAgICBjb25zdCBzdGFydF92YWwgPSB0YXJnZXRfY29udGFpbmVyX3NpemVba2V5XSA/PyBjb250YWluZXJfcmVjdFtrZXldOwogICAgbGV0IG9mZnNldCA9IDA7CiAgICBmb3IgKGNvbnN0IGtpbmQgb2YgWyJwYWRkaW5nIiwgImJvcmRlciJdKSB7CiAgICAgIG9mZnNldCArPSBwYWQucG9wcGVkW2tpbmRdW2tleV0gLSBwYWQudW5wb3BwZWRba2luZF1ba2V5XTsKICAgIH0KICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gc3RhcnRfdmFsIC0gb2Zmc2V0ICsgInB4IjsKICAgIGlmIChrZXkgPT09ICJsZWZ0IikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgLy8gV2UgY29tcHV0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBkZXBlbmRpbmcgb24gZXZlbnR1YWwgY29uZmlnIGRhdGEKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7CiAgICB3aWR0aDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS53aWR0aCA/PwogICAgICBjb25maWdfc3BhbnMud2lkdGguY29uZmlnX3ZhbHVlID8/CiAgICAgIGN1cnJlbnRfcGxvdF9zaXplLndpZHRoLAogICAgaGVpZ2h0OgogICAgICB0YXJnZXRfcGxvdF9zaXplLmhlaWdodCA/PwogICAgICBjb25maWdfc3BhbnMuaGVpZ2h0LmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS5oZWlnaHQsCiAgfSk7CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgY29uc3QgdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY3N6W2tleV07CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHZhbCArICJweCI7CiAgICBpZiAoa2V5ID09PSAid2lkdGgiKSB7CiAgICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGVba2V5XSA9IENPTlRBSU5FUi5zdHlsZVtrZXldOwogICAgfQogIH0KICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIGZhbHNlKTsKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICB1bnBvcF9jb250YWluZXIoKTsKICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9LAogICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0KICApOwp9CgpDT05UQUlORVIucG9wT3V0ID0gcG9wb3V0X2NvbnRhaW5lcjsKCmZ1bmN0aW9uIER1YWxDbGljayhzaW5nbGVfZnVuYywgZGJsX2Z1bmMpIHsKICBsZXQgbmNsaWNrcyA9IDA7CiAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7CiAgICBuY2xpY2tzICs9IDE7CiAgICBpZiAobmNsaWNrcyA+IDEpIHsKICAgICAgZGJsX2Z1bmMoLi4uYXJncyk7CiAgICAgIG5jbGlja3MgPSAwOwogICAgfSBlbHNlIHsKICAgICAgZGVsYXkoMzAwKS50aGVuKCgpID0+IHsKICAgICAgICBpZiAobmNsaWNrcyA9PSAxKSB7CiAgICAgICAgICBzaW5nbGVfZnVuYyguLi5hcmdzKTsKICAgICAgICB9CiAgICAgICAgbmNsaWNrcyA9IDA7CiAgICAgIH0pOwogICAgfQogIH07Cn0KCi8vIFdlIHJlbW92ZSB0aGUgZGVmYXVsdCBkb3dubG9hZCBpbWFnZSBidXR0b24KcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9SZW1vdmUgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlLAogIFsidG9JbWFnZSJdCik7Ci8vIFdlIGFkZCB0aGUgY3VzdG9tIGJ1dHRvbiB0byB0aGUgbW9kZWJhcgpwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb0FkZCA9IF8udW5pb24oCiAgcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQsCiAgWwogICAgewogICAgICBuYW1lOiAiQ29weSBQTkcgdG8gQ2xpcGJvYXJkIiwKICAgICAgaWNvbjogewogICAgICAgIGhlaWdodDogNTIwLAogICAgICAgIHdpZHRoOiA1MjAsCiAgICAgICAgcGF0aDogIk0yODAgNjRoNDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRWNDQ4YzAgMzUuMy0yOC43IDY0LTY0IDY0SDY0Yy0zNS4zIDAtNjQtMjguNy02NC02NFYxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRoNDAgOS42QzEyMSAyNy41IDE1My4zIDAgMTkyIDBzNzEgMjcuNSA3OC40IDY0SDI4MHpNNjQgMTEyYy04LjggMC0xNiA3LjItMTYgMTZWNDQ4YzAgOC44IDcuMiAxNiAxNiAxNkgzMjBjOC44IDAgMTYtNy4yIDE2LTE2VjEyOGMwLTguOC03LjItMTYtMTYtMTZIMzA0djI0YzAgMTMuMy0xMC43IDI0LTI0IDI0SDE5MiAxMDRjLTEzLjMgMC0yNC0xMC43LTI0LTI0VjExMkg2NHptMTI4LThhMjQgMjQgMCAxIDAgMC00OCAyNCAyNCAwIDEgMCAwIDQ4eiIsCiAgICAgIH0sCiAgICAgIGRpcmVjdGlvbjogInVwIiwKICAgICAgY2xpY2s6IER1YWxDbGljayhjb3B5SW1hZ2VUb0NsaXBib2FyZCwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoKTsKICAgICAgfSksCiAgICB9LAogICAgewogICAgICBuYW1lOiAiRG93bmxvYWQgSW1hZ2UiLAogICAgICBpY29uOiBQbG90bHkuSWNvbnMuY2FtZXJhLAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soc2F2ZUltYWdlVG9GaWxlLCAoKSA9PiB7CiAgICAgICAgcG9wb3V0X2NvbnRhaW5lcih7IGNsOiAiZmlsZXNhdmUiIH0pOwogICAgICB9KSwKICAgIH0sCiAgXQopOwoKZnVuY3Rpb24gZ2V0T2Zmc2V0RGF0YShlbCkgewogIGxldCBjcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsLCBudWxsKTsKICBjb25zdCBvZGF0YSA9IHsKICAgIHBhZGRpbmc6IHsKICAgICAgbGVmdDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSwKICAgICAgYm90dG9tOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSArIHBhcnNlRmxvYXQoY3MucGFkZGluZ0JvdHRvbSksCiAgICB9LAogICAgYm9yZGVyOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyTGVmdFdpZHRoKSwKICAgICAgcmlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyUmlnaHRXaWR0aCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5ib3JkZXJUb3BXaWR0aCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCkgKyBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICB9CiAgfTsKICBpZiAoZWwgPT09IFBMT1QpIHsKICAgIC8vIEZvciB0aGUgUExPVCB3ZSBhbHNvIHdhbnQgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIG9mZnNldAogICAgb2RhdGEub2Zmc2V0ID0gewogICAgICB0b3A6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0VG9wIDogMCwKICAgICAgbGVmdDogUExPVC5vZmZzZXRQYXJlbnQgPT0gQ09OVEFJTkVSID8gUExPVC5vZmZzZXRMZWZ0IDogMCwKICAgIH0KICB9CiAgcmV0dXJuIG9kYXRhOwp9CmZ1bmN0aW9uIGdldFNpemVEYXRhKCkgewogIGNvbnN0IGRhdGEgPSB7CiAgICBwbG90X3BhZDogZ2V0T2Zmc2V0RGF0YShQTE9UKSwKICAgIHBsb3RfcmVjdDogUExPVC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICAgIGNvbnRhaW5lcl9wYWQ6IGdldE9mZnNldERhdGEoQ09OVEFJTkVSKSwKICAgIGNvbnRhaW5lcl9yZWN0OiBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgfTsKICByZXR1cm4gZGF0YTsKfQpmdW5jdGlvbiBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgY29uc3QgY29tcHV0ZWRfc2l6ZSA9IGNvbXB1dGVQbG90U2l6ZShzaXplRGF0YSk7CiAgY29uc3Qgb2Zmc2V0cyA9IGNvbXB1dGVkX3NpemUub2Zmc2V0czsKCiAgY29uc3QgcGxvdF9kYXRhID0gewogICAgd2lkdGg6IHdpZHRoID8/IGNvbXB1dGVkX3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IGhlaWdodCA/PyBjb21wdXRlZF9zaXplLmhlaWdodCwKICB9OwoKICByZXR1cm4gewogICAgd2lkdGg6ICh3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoKSArIG9mZnNldHMud2lkdGgsCiAgICBoZWlnaHQ6IChoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQpICsgb2Zmc2V0cy5oZWlnaHQsCiAgICBub0NoYW5nZTogd2lkdGggPT0gY29tcHV0ZWRfc2l6ZS53aWR0aCAmJiBoZWlnaHQgPT0gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfQp9CgovLyBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hhbmdlIHRoZSBjb250YWluZXIgc2l6ZSBzbyB0aGF0IHRoZSByZXN1bHRpbmcgcGxvdCB3aWxsIGJlIG1hdGNoaW5nIHRoZSBwcm92aWRlZCBzcGVjcwpmdW5jdGlvbiBjaGFuZ2VDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICBpZiAoIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICBjb25zb2xlLmxvZygiVHJpZWQgdG8gY2hhbmdlIGNvbnRhaW5lciBzaXplIHdoZW4gbm90IHBvcHBlZCwgaWdub3JpbmciKTsKICAgIHJldHVybjsKICB9CgogIGNvbnN0IGNzeiA9IGNvbXB1dGVDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSk7CgogIGlmIChjc3oubm9DaGFuZ2UpIHsKICAgIGNvbnNvbGUubG9nKCJTaXplIGlzIHRoZSBzYW1lIGFzIGN1cnJlbnQsIGlnbm9yaW5nIik7CiAgICByZXR1cm4KICB9CiAgLy8gV2UgYXJlIG5vdyBnb2luZyB0byBzZXQgaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgY29udGFpbmVyCiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSBjc3pba2V5XSArICJweCI7CiAgfQp9Ci8vIFdlIG5vdyBjcmVhdGUgdGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCB1cGRhdGUgdGhlIHBsb3QgYmFzZWQgb24gdGhlIHZhbHVlcyBzcGVjaWZpZWQKZnVuY3Rpb24gdXBkYXRlRnJvbUhlYWRlcigpIHsKICBjb25zdCBoZWFkZXJfZGF0YSA9IHsKICAgIGhlaWdodDogY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSwKICAgIHdpZHRoOiBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUsCiAgfTsKICBjaGFuZ2VDb250YWluZXJTaXplKGhlYWRlcl9kYXRhKTsKfQovLyBXZSBhc3NpZ24gdGhpcyBmdW5jdGlvbiB0byB0aGUgb25ibHVyIGV2ZW50IG9mIHdpZHRoIGFuZCBoZWlnaHQKaWYgKGZpcnN0UnVuKSB7CiAgZm9yIChjb25zdCBjb250YWluZXIgb2YgT2JqZWN0LnZhbHVlcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIudWlfc3Bhbi5vbmJsdXIgPSAoZSkgPT4gewogICAgICBjb250YWluZXIudWlfdmFsdWUgPSBjb250YWluZXIudWlfc3Bhbi50ZXh0Q29udGVudDsKICAgICAgdXBkYXRlRnJvbUhlYWRlcigpOwogICAgfTsKICB9Cn0KLy8gVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgcGxvdCBzaXplIHRvIHVzZSBmb3IgcmVsYXlvdXQgYXMgYSBmdW5jdGlvbiBvZiB0aGUgY29udGFpbmVyIHNpemUKZnVuY3Rpb24gY29tcHV0ZVBsb3RTaXplKGRhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgLy8gUmVtb3ZlIFBhZGRpbmcKICBjb25zdCB7IGNvbnRhaW5lcl9wYWQsIHBsb3RfcGFkLCBjb250YWluZXJfcmVjdCB9ID0gZGF0YTsKICBjb25zdCBvZmZzZXRzID0gewogICAgd2lkdGg6CiAgICAgIHBsb3RfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBwbG90X3BhZC5ib3JkZXIud2lkdGggKwogICAgICBwbG90X3BhZC5vZmZzZXQubGVmdCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy53aWR0aCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLndpZHRoLAogICAgaGVpZ2h0OgogICAgICBwbG90X3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIHBsb3RfcGFkLmJvcmRlci5oZWlnaHQgKwogICAgICBwbG90X3BhZC5vZmZzZXQudG9wICsKICAgICAgY29udGFpbmVyX3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLmhlaWdodCwKICB9OwogIGNvbnN0IHN6ID0gewogICAgd2lkdGg6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3Qud2lkdGggLSBvZmZzZXRzLndpZHRoKSwKICAgIGhlaWdodDogTWF0aC5yb3VuZChjb250YWluZXJfcmVjdC5oZWlnaHQgLSBvZmZzZXRzLmhlaWdodCksCiAgICBvZmZzZXRzLAogIH07CiAgcmV0dXJuIHN6Owp9CgovLyBDcmVhdGUgdGhlIHJlc2l6ZU9ic2VydmVyIHRvIG1ha2UgdGhlIHBsb3QgZXZlbiBtb3JlIHJlc3BvbnNpdmUhIDptYWdpYzoKY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHsKICBjb25zdCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCk7CiAgY29uc3Qge2NvbnRhaW5lcl9yZWN0LCBjb250YWluZXJfcGFkfSA9IHNpemVEYXRhOwogIGxldCBwbG90X3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIC8vIFdlIHNhdmUgdGhlIGhlaWdodCBpbiB0aGUgUExPVCBvYmplY3QKICBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQ7CiAgLy8gV2UgZGVhbCB3aXRoIHNvbWUgc3R1ZmYgaWYgdGhlIGNvbnRhaW5lciBpcyBwb3BwcGVkCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9IGNvbnRhaW5lcl9yZWN0LndpZHRoICsgInB4IjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBjb250YWluZXJfcmVjdC5sZWZ0ICsgInB4IjsKICBjb25maWdfc3BhbnMuaGVpZ2h0LnVpX3ZhbHVlID0gcGxvdF9zaXplLmhlaWdodDsKICBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUgPSBwbG90X3NpemUud2lkdGg7CiAgLyogCgkJVGhlIGFkZGl0aW9uIG9mIHRoZSBpbnZhbGlkIGFyZ3VtZW50IGBwbHV0b3Jlc2l6ZWAgc2VlbXMgdG8gZml4IHRoZSBwcm9ibGVtIHdpdGggY2FsbGluZyBgcmVsYXlvdXRgIHNpbXBseSB3aXRoIGB7YXV0b3NpemU6IHRydWV9YCBhcyB1cGRhdGUgYnJlYWtpbmcgbW91c2UgcmVsYXlvdXQgZXZlbnRzIHRyYWNraW5nLiAKCQlTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Bsb3RseS9wbG90bHkuanMvaXNzdWVzLzYxNTYgZm9yIGRldGFpbHMKCQkqLwogIGxldCBjb25maWcgPSB7CiAgICAvLyBJZiB0aGlzIGlzIHBvcHBlZCBvdXQsIHdlIGlnbm9yZSB0aGUgb3JpZ2luYWwgd2lkdGgvaGVpZ2h0CiAgICB3aWR0aDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfd2lkdGgpID8/IHBsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfaGVpZ2h0KSA/PyBwbG90X3NpemUuaGVpZ2h0LAogICAgcGx1dG9yZXNpemU6IHRydWUsCiAgfTsKICBQbG90bHkucmVsYXlvdXQoUExPVCwgY29uZmlnKS50aGVuKCgpID0+IHsKICAgIGlmIChyZW1vdmVfY29udGFpbmVyX3NpemUgJiYgIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIHRoZSBmaXJzdCByZXNpemUgdXBvbiBwbG90IGNyZWF0aW9uIHRvIGFscmVhZHkgYmUgd2l0aG91dCBhIGZpeGVkIGhlaWdodAogICAgICBDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gIiI7CiAgICAgIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogICAgICByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmYWxzZTsKICAgIH0KICB9KTsKfSk7CgpyZXNpemVPYnNlcnZlci5vYnNlcnZlKENPTlRBSU5FUik7CgoKUGxvdGx5LnJlYWN0KFBMT1QsIHBsb3Rfb2JqKS50aGVuKCgpID0+IHsKCS8vIEFzc2lnbiB0aGUgUGxvdGx5IGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKHBsb3RseV9saXN0ZW5lcnMpKSB7CgkJZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcl92ZWMpIHsKCQkJUExPVC5vbihrZXksIGxpc3RlbmVyKQoJCX0KCX0KCS8vIEFzc2lnbiB0aGUgSlMgZXZlbnQgbGlzdGVuZXJzCglmb3IgKGNvbnN0IFtrZXksIGxpc3RlbmVyX3ZlY10gb2YgT2JqZWN0LmVudHJpZXMoanNfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1QuYWRkRXZlbnRMaXN0ZW5lcihrZXksIGxpc3RlbmVyLCB7CgkJCQlzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsCgkJCX0pCgkJfQoJfQp9CikKCgppbnZhbGlkYXRpb24udGhlbigoKSA9PiB7CgkvLyBSZW1vdmUgYWxsIHBsb3RseSBsaXN0ZW5lcnMKCVBMT1QucmVtb3ZlQWxsTGlzdGVuZXJzKCkKCS8vIFJlbW92ZSBhbGwgSlMgbGlzdGVuZXJzCgljb250cm9sbGVyLmFib3J0KCkKCS8vIFJlbW92ZSB0aGUgcmVzaXplT2JzZXJ2ZXIKCXJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKQp9KQoKCgoJCXJldHVybiBDT05UQUlORVIKCTwvc2NyaXB0PgqkbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/yE6yuEqwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJGMwMmYzODk4LTEwY2ItNGYxZS1iNWVmLWViNDJiODAzYmFlZLlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgIJAtu1cHVibGlzaGVkX29iamVjdF9rZXlzkdk1N2JjYzA1YjAtODFkYS0xMWVmLTIwNDAtMzU4NWM5YjQ5NTRmLzliNjQ3NTFkM2FmYTI2Zma4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkMmVlN2JhNDctMDJlNS00YjAyLWExNjItZGRiZDVlZDQ3YzdiiqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedpqiQk8c2NyaXB0IGlkPSdwbG90XzEnPgoJCS8vIFdlIHN0YXJ0IGJ5IHB1dHRpbmcgYWxsIHRoZSB2YXJpYWJsZSBpbnRlcnBvbGF0aW9uIGhlcmUgYXQgdGhlIGJlZ2lubmluZwoJCS8vIFdlIGhhdmUgdG8gY29udmVydCBhbGwgdHlwZWRhcnJheXMgaW4gdGhlIGxheW91dCB0byBub3JtYWwgYXJyYXlzLiBTZWUgSXNzdWUgIzI1CgkJLy8gV2UgdXNlIGxvZGFzaCBmb3IgdGhpcyBmb3IgY29tcGFjdG5lc3MKCQlmdW5jdGlvbiByZW1vdmVUeXBlZEFycmF5KG8pIHsKCQkJcmV0dXJuIF8uaXNUeXBlZEFycmF5KG8pID8gQXJyYXkuZnJvbShvKSA6CgkJCV8uaXNQbGFpbk9iamVjdChvKSA/IF8ubWFwVmFsdWVzKG8sIHJlbW92ZVR5cGVkQXJyYXkpIDogCgkJCW8KCQl9CgoJCS8vIFB1Ymxpc2ggdGhlIHBsb3Qgb2JqZWN0IHRvIEpTCgkJbGV0IHBsb3Rfb2JqID0gXy51cGRhdGUoLyogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBBYnN0cmFjdFBsdXRvRGluZ2V0amVzLkRpc3BsYXkucHVibGlzaGVkX3RvX2pzICovIGdldFB1Ymxpc2hlZE9iamVjdCgiN2JjYzA1YjAtODFkYS0xMWVmLTIwNDAtMzU4NWM5YjQ5NTRmLzZjNTljNTYyNWFkODRjZmEiKSwgImxheW91dCIsIHJlbW92ZVR5cGVkQXJyYXkpCgkJLy8gR2V0IHRoZSBwbG90bHkgbGlzdGVuZXJzCgkJY29uc3QgcGxvdGx5X2xpc3RlbmVycyA9IHt9CgkJLy8gR2V0IHRoZSBKUyBsaXN0ZW5lcnMKCQljb25zdCBqc19saXN0ZW5lcnMgPSB7fQoJCS8vIERlYWwgd2l0aCBldmVudHVhbCBjdXN0b20gY2xhc3NlcwoJCWxldCBjdXN0b21fY2xhc3NsaXN0ID0gW10KCgoJCS8vIExvYWQgdGhlIHBsb3RseSBsaWJyYXJ5CgkJbGV0IFBsb3RseSA9IHVuZGVmaW5lZAoJCXRyeSB7CgkJCWxldCBfbW9kID0gYXdhaXQgaW1wb3J0KCIuL3Bsb3RseWpzL3Bsb3RseWpzLTIuMjYuMi5taW4uanMiKQoJCQlQbG90bHkgPSBfbW9kLmRlZmF1bHQKCQl9IGNhdGNoIChlKSB7CgkJCWNvbnNvbGUubG9nKCJMb2NhbCBsb2FkIGZhaWxlZCwgdHJ5aW5nIHdpdGggdGhlIHdlYiBlc20uc2ggdmVyc2lvbiIpCgkJCWxldCBfbW9kID0gYXdhaXQgaW1wb3J0KCJodHRwczovL2VzbS5zaC92MTM1L3Bsb3RseS5qcy1kaXN0LW1pbkAyLjI2LjIvZXNuZXh0L3Bsb3RseS5qcy1kaXN0LW1pbi5tanMiKQoJCQlQbG90bHkgPSBfbW9kLmRlZmF1bHQKCQl9CgoJCS8vIENoZWNrIGlmIHdlIGhhdmUgdG8gZm9yY2UgbG9jYWwgbWF0aGpheCBmb250IGNhY2hlCgkJaWYgKGZhbHNlICYmIHdpbmRvdz8uTWF0aEpheD8uY29uZmlnPy5zdmc/LmZvbnRDYWNoZSA9PT0gJ2dsb2JhbCcpIHsKCQkJd2luZG93Lk1hdGhKYXguY29uZmlnLnN2Zy5mb250Q2FjaGUgPSAnbG9jYWwnCgkJfQoKCQkvLyBGbGFnIHRvIGNoZWNrIGlmIHRoaXMgY2VsbCB3YXMgIG1hbnVhbGx5IHJhbiBvciByZWFjdGl2ZWx5IHJhbgpjb25zdCBmaXJzdFJ1biA9IHRoaXMgPyBmYWxzZSA6IHRydWUKY29uc3QgQ09OVEFJTkVSID0gdGhpcyA/PyBodG1sYDxkaXYgY2xhc3M9J3BsdXRvcGxvdGx5LWNvbnRhaW5lcic+YApjb25zdCBQTE9UID0gQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoJy5qcy1wbG90bHktcGxvdCcpID8/IENPTlRBSU5FUi5hcHBlbmRDaGlsZChodG1sYDxkaXY+YCkKY29uc3QgcGFyZW50ID0gQ09OVEFJTkVSLnBhcmVudEVsZW1lbnQKLy8gV2UgdXNlIGEgY29udHJvbGxlciB0byByZW1vdmUgZXZlbnQgbGlzdGVuZXJzIHVwb24gaW52YWxpZGF0aW9uCmNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCkKLy8gV2UgaGF2ZSB0byBhZGQgdGhpcyB0byBrZWVwIHN1cHBvcnRpbmcgQGJpbmQgd2l0aCB0aGUgb2xkIEFQSSB1c2luZyBQTE9UClBMT1QuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoZSkgPT4gewoJQ09OVEFJTkVSLnZhbHVlID0gUExPVC52YWx1ZQoJaWYgKGUuYnViYmxlcykgewoJCXJldHVybgoJfQoJQ09OVEFJTkVSLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdpbnB1dCcpKQp9LCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSkKCgkvLyBUaGlzIGNyZWF0ZSB0aGUgc3R5bGUgc3ViZGl2IG9uIGZpcnN0IHJ1bgoJZmlyc3RSdW4gJiYgQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgCgk8c3R5bGU+CgkucGx1dG9wbG90bHktY29udGFpbmVyIHsKCQl3aWR0aDogMTAwJTsKCQloZWlnaHQ6IDEwMCU7CgkJbWluLWhlaWdodDogMDsKCQltaW4td2lkdGg6IDA7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyIC5qcy1wbG90bHktcGxvdCAucGxvdGx5IGRpdiB7CgkJbWFyZ2luOiAwIGF1dG87IC8vIFRoaXMgY2VudGVycyB0aGUgcGxvdAoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5wb3BwZWQtb3V0IHsKCQlvdmVyZmxvdzogYXV0bzsKCQl6LWluZGV4OiAxMDAwOwoJCXBvc2l0aW9uOiBmaXhlZDsKCQlyZXNpemU6IGJvdGg7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwcHg7CgkJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDBweDsKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIHsKCQlkaXNwbGF5OiBmbGV4OwoJCWZsZXgtZmxvdzogcm93IHdyYXA7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMTJweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMTJweDsKCQlwb3NpdGlvbjogZml4ZWQ7CgkJei1pbmRleDogMTAwMTsKCQljdXJzb3I6IG1vdmU7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCAtMTAwJSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgc3BhbiB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCWZsZXg6IDEKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyLmhpZGRlbiB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3BhbiB7CgkJcG9zaXRpb246IHJlbGF0aXZlOwoJfQoJLmNsaXBib2FyZC12YWx1ZSB7CgkJcGFkZGluZy1yaWdodDogNXB4OwoJCXBhZGRpbmctbGVmdDogMnB4OwoJCWN1cnNvcjogdGV4dDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZmlsZW5hbWUgewoJCWZsZXg6IDAgMCAxMDAlOwoJCXRleHQtYWxpZ246IGNlbnRlcjsKCQlib3JkZXItdG9wOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJbWFyZ2luLXRvcDogNXB4OwoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5maWxlbmFtZSB7CgkJbWFyZ2luLWxlZnQ6IDNweDsKCQl0ZXh0LWFsaWduOiBsZWZ0OwoJCW1pbi13aWR0aDogbWluKDYwJSwgbWluLWNvbnRlbnQpOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5maWxlc2F2ZSAuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgLmxhYmVsIHsKCQlmbGV4OiAwIDAgMDsKCX0KCS5jbGlwYm9hcmQtdmFsdWUuZm9ybWF0IHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7CgkJZmxleDogMSAwIGF1dG87CgkJbWluLXdpZHRoOiAzMHB4OwoJCW1hcmdpbi1yaWdodDogMTBweDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyB7CgkJZGlzcGxheTogaW5saW5lLWZsZXg7CgkJZmxleC1mbG93OiBjb2x1bW47CgkJcG9zaXRpb246IGFic29sdXRlOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJcGFkZGluZy1sZWZ0OiAzcHg7CgkJei1pbmRleDogMjAwMDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9uczpob3ZlciB7CgkJY3Vyc29yOiBwb2ludGVyOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCXBhZGRpbmc6IDNweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtM3B4LCAtNnB4KTsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyAuZm9ybWF0LW9wdGlvbiB7CgkJZGlzcGxheTogbm9uZTsKCX0KCWRpdi5mb3JtYXQtb3B0aW9uczpob3ZlciAuZm9ybWF0LW9wdGlvbiB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246bm90KC5zZWxlY3RlZCkgewoJCW1hcmdpbi10b3A6IDNweDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyAuZm9ybWF0LW9wdGlvbi5zZWxlY3RlZCB7CgkJb3JkZXI6IC0xOwoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5mb3JtYXQtb3B0aW9uOmhvdmVyIHsKCQliYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCX0KCXNwYW4uY29uZmlnLXZhbHVlIHsKCQlmb250LXdlaWdodDogbm9ybWFsOwoJCWNvbG9yOiB2YXIoLS1wbHV0by1vdXRwdXQtY29sb3IpOwoJCWRpc3BsYXk6IG5vbmU7CgkJcG9zaXRpb246IGFic29sdXRlOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCBjYWxjKC0xMDAlIC0gMTBweCkpOwoJCXBhZGRpbmc6IDVweDsKCX0KCS5sYWJlbCB7CgkJdXNlci1zZWxlY3Q6IG5vbmU7Cgl9CgkubGFiZWw6aG92ZXIgc3Bhbi5jb25maWctdmFsdWUgewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQltaW4td2lkdGg6IDE1MHB4OwoJfQoJLmNsaXBib2FyZC1zcGFuLm1hdGNoaW5nLWNvbmZpZyAubGFiZWwgewoJCWNvbG9yOiB2YXIoLS1jbS1tYWNyby1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZGlmZmVyZW50LWNvbmZpZyAubGFiZWwgewoJCWNvbG9yOiB2YXIoLS1jbS10YWctY29sb3IpOwoJCWZvbnQtd2VpZ2h0OiBib2xkOwoJfQo8L3N0eWxlPgpgKQoKbGV0IG9yaWdpbmFsX2hlaWdodCA9IHBsb3Rfb2JqLmxheW91dC5oZWlnaHQKbGV0IG9yaWdpbmFsX3dpZHRoID0gcGxvdF9vYmoubGF5b3V0LndpZHRoCi8vIEZvciB0aGUgaGVpZ2h0IHdlIGhhdmUgdG8gYWxzbyBwdXQgYSBmaXhlZCB2YWx1ZSBpbiBjYXNlIHRoZSBwbG90IGlzIHB1dCBvbiBhIG5vbi1maXhlZC1zaXplIGNvbnRhaW5lciAobGlrZSB0aGUgZGVmYXVsdCB3cmFwcGVyKQovLyBXZSBkZWZpbmUgYSB2YXJpYWJsZSB0byBjaGVjayB3aGV0aGVyIHdlIHN0aWxsIGhhdmUgdG8gcmVtb3ZlIHRoZSBmaXhlZCBoZWlnaHQKbGV0IHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IGZpcnN0UnVuCmxldCBjb250YWluZXJfaGVpZ2h0ID0gb3JpZ2luYWxfaGVpZ2h0ID8/IFBMT1QuY29udGFpbmVyX2hlaWdodCA/PyA0MDAKQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9IGNvbnRhaW5lcl9oZWlnaHQgKyAncHgnCgovLyBXZSBjcmVhdGUgYSBQcm9taXNlIHZlcnNpb24gb2Ygc2V0VGltZW91dApmdW5jdGlvbiBkZWxheShtcykgewogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpOwp9CgovLyBXZSBpbXBvcnQgaW50ZXJhY3QgZm9yIGRyYWdnaW5nL3Jlc2l6aW5nCmNvbnN0IHsgZGVmYXVsdDogaW50ZXJhY3QgfSA9IGF3YWl0IGltcG9ydCgnaHR0cHM6Ly9lc20uc2gvaW50ZXJhY3Rqc0AxLjEwLjE5JykKCgpmdW5jdGlvbiBnZXRJbWFnZU9wdGlvbnMoKSB7CiAgY29uc3QgbyA9IHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICByZXR1cm4gewogICAgZm9ybWF0OiBvLmZvcm1hdCA/PyAicG5nIiwKICAgIHdpZHRoOiBvLndpZHRoID8/IG9yaWdpbmFsX3dpZHRoLAogICAgaGVpZ2h0OiBvLmhlaWdodCA/PyBvcmlnaW5hbF9oZWlnaHQsCiAgICBzY2FsZTogby5zY2FsZSA/PyAxLAogICAgZmlsZW5hbWU6IG8uZmlsZW5hbWUgPz8gIm5ld3Bsb3QiLAogIH07Cn0KCmNvbnN0IENMSVBCT0FSRF9IRUFERVIgPQogIENPTlRBSU5FUi5xdWVyeVNlbGVjdG9yKCIucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciIpID8/CiAgQ09OVEFJTkVSLmluc2VydEFkamFjZW50RWxlbWVudCgKICAgICJhZnRlcmJlZ2luIiwKICAgIGh0bWxgPGRpdiBjbGFzcz0icGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBoaWRkZW4iPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gZm9ybWF0IgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZvcm1hdDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBmb3JtYXQiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gd2lkdGgiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+V2lkdGg6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgd2lkdGgiPjwvc3Bhbj5weDwvc3BhbgogICAgICA+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBoZWlnaHQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+SGVpZ2h0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGhlaWdodCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHNjYWxlIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPlNjYWxlOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIHNjYWxlIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2V0Ij5TZXQ8L2J1dHRvbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gdW5zZXQiPlVuc2V0PC9idXR0b24+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmaWxlbmFtZSIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5GaWxlbmFtZTo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBmaWxlbmFtZSI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICA8L2Rpdj5gCiAgKTsKCmZ1bmN0aW9uIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpIHsKICBjb25zdCB2YWxpZF9jbGFzc2VzID0gWwogICAgIm1pc3NpbmctY29uZmlnIiwKICAgICJtYXRjaGluZy1jb25maWciLAogICAgImRpZmZlcmVudC1jb25maWciLAogIF07CiAgZnVuY3Rpb24gc2V0Q2xhc3MoY2wpIHsKICAgIGZvciAoY29uc3QgbmFtZSBvZiB2YWxpZF9jbGFzc2VzKSB7CiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKG5hbWUsIG5hbWUgPT0gY2wpOwogICAgfQogIH0KICAvLyBXZSB1c2UgdGhlIGN1c3RvbSBnZXR0ZXJzIHdlJ2xsIHNldCB1cCBpbiB0aGUgY29udGFpbmVyCiAgY29uc3QgeyB1aV92YWx1ZSwgY29uZmlnX3ZhbHVlLCBjb25maWdfc3Bhbiwga2V5IH0gPSBjb250YWluZXI7CiAgaWYgKGNvbmZpZ192YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICBzZXRDbGFzcygibWlzc2luZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaXMgbm90IHByZXNlbnQgaW4gdGhlIGNvbmZpZy5gOwogIH0gZWxzZSBpZiAodWlfdmFsdWUgPT0gY29uZmlnX3ZhbHVlKSB7CiAgICBzZXRDbGFzcygibWF0Y2hpbmctY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGhhcyB0aGUgc2FtZSB2YWx1ZSBpbiB0aGUgY29uZmlnIGFuZCBpbiB0aGUgaGVhZGVyLmA7CiAgfSBlbHNlIHsKICAgIHNldENsYXNzKCJkaWZmZXJlbnQtY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGhhcyBhIGRpZmZlcmVudCB2YWx1ZSAoPGVtPiR7Y29uZmlnX3ZhbHVlfTwvZW0+KSBpbiB0aGUgY29uZmlnLmA7CiAgfQogIC8vIEFkZCBpbmZvIGFib3V0IHNldHRpbmcgYW5kIHVuc2V0dGluZwogIGNvbmZpZ19zcGFuLmluc2VydEFkamFjZW50SFRNTCgKICAgICJiZWZvcmVlbmQiLAogICAgYDxicj5DbGljayBvbiB0aGUgbGFiZWwgPGVtPjxiPm9uY2U8L2I+PC9lbT4gdG8gc2V0IHRoZSBjdXJyZW50IFVJIHZhbHVlIGluIHRoZSBjb25maWcuYAogICk7CiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIDxlbT48Yj50d2ljZTwvYj48L2VtPiB0byByZW1vdmUgdGhpcyBrZXkgZnJvbSB0aGUgY29uZmlnLmAKICApOwp9Cgpjb25zdCB2YWxpZF9mb3JtYXRzID0gWyJwbmciLCAic3ZnIiwgIndlYnAiLCAianBlZyIsICJmdWxsLWpzb24iXTsKZnVuY3Rpb24gaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHNwYW4sIGtleSwgdmFsdWUpIHsKICBjb25zdCBjb250YWluZXIgPSBzcGFuLmNsb3Nlc3QoIi5jbGlwYm9hcmQtc3BhbiIpOwogIHNwYW4uY29udGVudEVkaXRhYmxlID0ga2V5ID09PSAiZm9ybWF0IiA/ICJmYWxzZSIgOiAidHJ1ZSI7CiAgbGV0IHBhcnNlID0gKHgpID0+IHg7CiAgbGV0IHVwZGF0ZSA9ICh4KSA9PiAoc3Bhbi50ZXh0Q29udGVudCA9IHgpOwogIGlmIChrZXkgPT09ICJ3aWR0aCIgfHwga2V5ID09PSAiaGVpZ2h0IikgewogICAgcGFyc2UgPSAoeCkgPT4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KHgpKTsKICB9IGVsc2UgaWYgKGtleSA9PT0gInNjYWxlIikgewogICAgcGFyc2UgPSBwYXJzZUZsb2F0OwogIH0gZWxzZSBpZiAoa2V5ID09PSAiZm9ybWF0IikgewogICAgLy8gV2UgcmVtb3ZlIGNvbnRlbnRFZGl0YWJsZQogICAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSAiZmFsc2UiOwogICAgLy8gSGVyZSB3ZSBmaXJzdCBhZGQgdGhlIHN1YnNwYW5zIGZvciBlYWNoIG9wdGlvbgogICAgY29uc3Qgb3B0c19kaXYgPSBzcGFuLmFwcGVuZENoaWxkKGh0bWxgPGRpdiBjbGFzcz0iZm9ybWF0LW9wdGlvbnMiPjwvZGl2PmApOwogICAgZm9yIChjb25zdCBmbXQgb2YgdmFsaWRfZm9ybWF0cykgewogICAgICBjb25zdCBvcHQgPSBvcHRzX2Rpdi5hcHBlbmRDaGlsZCgKICAgICAgICBodG1sYDxzcGFuIGNsYXNzPSJmb3JtYXQtb3B0aW9uICR7Zm10fSI+JHtmbXR9PC9zcGFuPmAKICAgICAgKTsKICAgICAgb3B0Lm9uY2xpY2sgPSAoZSkgPT4gewogICAgICAgIHNwYW4udmFsdWUgPSBvcHQudGV4dENvbnRlbnQ7CiAgICAgIH07CiAgICB9CiAgICBwYXJzZSA9ICh4KSA9PiB7CiAgICAgIHJldHVybiB2YWxpZF9mb3JtYXRzLmluY2x1ZGVzKHgpID8geCA6IGxvY2FsVmFsdWU7CiAgICB9OwogICAgdXBkYXRlID0gKHgpID0+IHsKICAgICAgZm9yIChjb25zdCBvcHQgb2Ygb3B0c19kaXYuY2hpbGRyZW4pIHsKICAgICAgICBvcHQuY2xhc3NMaXN0LnRvZ2dsZSgic2VsZWN0ZWQiLCBvcHQudGV4dENvbnRlbnQgPT09IHgpOwogICAgICB9CiAgICB9OwogIH0gZWxzZSB7CiAgICAvLyBXZSBvbmx5IGhhdmUgZmlsZW5hbWUgaGVyZQogIH0KICBsZXQgbG9jYWxWYWx1ZTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBsb2NhbFZhbHVlOwogICAgfSwKICAgIHNldDogKHZhbCkgPT4gewogICAgICBpZiAodmFsICE9PSAiIikgewogICAgICAgIGxvY2FsVmFsdWUgPSBwYXJzZSh2YWwpOwogICAgICB9CiAgICAgIHVwZGF0ZShsb2NhbFZhbHVlKTsKICAgICAgY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcik7CiAgICB9LAogIH0pOwogIC8vIFdlIGFsc28gYXNzaWduIGEgbGlzdGVuZXIgc28gdGhhdCB0aGUgZWRpdGFibGUgaXMgYmx1cnJlZCB3aGVuIGVudGVyIGlzIHByZXNzZWQKICBzcGFuLm9ua2V5ZG93biA9IChlKSA9PiB7CiAgICBpZiAoZS5rZXlDb2RlID09PSAxMykgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHNwYW4uYmx1cigpOwogICAgfQogIH07CiAgc3Bhbi52YWx1ZSA9IHZhbHVlOwp9CgpmdW5jdGlvbiBpbml0aWFsaXplQ29uZmlnVmFsdWVTcGFuKHNwYW4sIGtleSkgewogIC8vIEhlcmUgd2UgbW9zdGx5IHdhbnQgdG8gZGVmaW5lIHRoZSBzZXR0ZXIgYW5kIGdldHRlcgogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwYW4sICJ2YWx1ZSIsIHsKICAgIGdldDogKCkgPT4gewogICAgICByZXR1cm4gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV07CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIC8vIGlmIHVuZGVmaW5lZCBpcyBwYXNzZWQsIHdlIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgb3B0aW9ucwogICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsKICAgICAgICBkZWxldGUgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV0gPSB2YWw7CiAgICAgIH0KICAgICAgY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcik7CiAgICB9LAogIH0pOwp9Cgpjb25zdCBjb25maWdfc3BhbnMgPSB7fTsKZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZ2V0SW1hZ2VPcHRpb25zKCkpKSB7CiAgY29uc3QgY29udGFpbmVyID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKGAuY2xpcGJvYXJkLXNwYW4uJHtrZXl9YCk7CiAgY29uc3QgbGFiZWwgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmxhYmVsIik7CiAgLy8gV2UgZ2l2ZSB0aGUgbGFiZWwgYSBmdW5jdGlvbiB0aGF0IG9uIHNpbmdsZSBjbGljayB3aWxsIHNldCB0aGUgY3VycmVudCB2YWx1ZSBhbmQgd2l0aCBkb3VibGUgY2xpY2sgd2lsbCB1bnNldCBpdAogIGxhYmVsLm9uY2xpY2sgPSBEdWFsQ2xpY2soCiAgICAoKSA9PiB7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBjb250YWluZXIudWlfdmFsdWU7CiAgICB9LAogICAgKGUpID0+IHsKICAgICAgY29uc29sZS5sb2coImUiLCBlKTsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gdW5kZWZpbmVkOwogICAgfQogICk7CiAgY29uc3QgdWlfdmFsdWVfc3BhbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXZhbHVlIik7CiAgY29uc3QgY29uZmlnX3ZhbHVlX3NwYW4gPQogICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jb25maWctdmFsdWUiKSA/PwogICAgbGFiZWwuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgICAiYWZ0ZXJiZWdpbiIsCiAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImNvbmZpZy12YWx1ZSI+PC9zcGFuPmAKICAgICk7CiAgLy8gQXNzaW5nIHRoZSB0d28gc3BhbnMgYXMgcHJvcGVydGllcyBvZiB0aGUgY29udGFpbmluZyBzcGFuCiAgY29udGFpbmVyLnVpX3NwYW4gPSB1aV92YWx1ZV9zcGFuOwogIGNvbnRhaW5lci5jb25maWdfc3BhbiA9IGNvbmZpZ192YWx1ZV9zcGFuOwogIGNvbnRhaW5lci5rZXkgPSBrZXk7CiAgY29uZmlnX3NwYW5zW2tleV0gPSBjb250YWluZXI7CiAgaWYgKGZpcnN0UnVuKSB7CiAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPQogICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPz8ge307CiAgICAvLyBXZSBkbyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHZhbHVlIHNwYW4KICAgIGluaXRpYWxpemVVSVZhbHVlU3Bhbih1aV92YWx1ZV9zcGFuLCBrZXksIHZhbHVlKTsKICAgIC8vIFRoZW4gd2UgaW5pdGlhbGl6ZSB0aGUgY29uZmlnIHZhbHVlCiAgICBpbml0aWFsaXplQ29uZmlnVmFsdWVTcGFuKGNvbmZpZ192YWx1ZV9zcGFuLCBrZXkpOwogICAgLy8gV2UgcHV0IHNvbWUgY29udmVuaWVuY2UgZ2V0dGVycy9zZXR0ZXJzCiAgICAvLyB1aV92YWx1ZSBmb3J3YXJkCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAidWlfdmFsdWUiLCB7CiAgICAgIGdldDogKCkgPT4gdWlfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgdWlfdmFsdWVfc3Bhbi52YWx1ZSA9IHZhbDsKICAgICAgfSwKICAgIH0pOwogICAgLy8gY29uZmlnX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJjb25maWdfdmFsdWUiLCB7CiAgICAgIGdldDogKCkgPT4gY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUsCiAgICAgIHNldDogKHZhbCkgPT4gewogICAgICAgIGNvbmZpZ192YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgfQp9CgovLyBUaGVzZSBvYmplY3RzIHdpbGwgY29udGFpbiB0aGUgZGVmYXVsdCB2YWx1ZQoKLy8gVGhpcyBjb2RlIHVwZGF0ZXMgdGhlIGltYWdlIG9wdGlvbnMgaW4gdGhlIFBMT1QgY29uZmlnIHdpdGggdGhlIHByb3ZpZGVkIG9uZXMKZnVuY3Rpb24gc2V0SW1hZ2VPcHRpb25zKG8pIHsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IG9ba2V5XTsKICB9Cn0KZnVuY3Rpb24gdW5zZXRJbWFnZU9wdGlvbnMoKSB7CiAgc2V0SW1hZ2VPcHRpb25zKHt9KTsKfQoKY29uc3Qgc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnNldCIpOwpjb25zdCB1bnNldF9idXR0b24gPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtc3Bhbi51bnNldCIpOwppZiAoZmlyc3RSdW4pIHsKICBzZXRfYnV0dG9uLm9uY2xpY2sgPSAoZSkgPT4gewogICAgZm9yIChjb25zdCBjb250YWluZXIgb2YgT2JqZWN0LnZhbHVlcyhjb25maWdfc3BhbnMpKSB7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBjb250YWluZXIudWlfdmFsdWU7CiAgICB9CiAgfTsKICB1bnNldF9idXR0b24ub25jbGljayA9IHVuc2V0SW1hZ2VPcHRpb25zOwp9CgovLyBXZSBhZGQgYSBmdW5jdGlvbiB0byBjaGVjayBpZiB0aGUgY2xpcGJvYXJkIGlzIHBvcHBlZCBvdXQKQ09OVEFJTkVSLmlzUG9wcGVkT3V0ID0gKCkgPT4gewogIHJldHVybiBDT05UQUlORVIuY2xhc3NMaXN0LmNvbnRhaW5zKCJwb3BwZWQtb3V0Iik7Cn07CgpDTElQQk9BUkRfSEVBREVSLm9ubW91c2Vkb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgaWYgKGV2ZW50LnRhcmdldC5tYXRjaGVzKCJzcGFuLmNsaXBib2FyZC12YWx1ZSIpKSB7CiAgICBjb25zb2xlLmxvZygiV2UgZG9uJ3QgbW92ZSEiKTsKICAgIHJldHVybjsKICB9CiAgY29uc3Qgc3RhcnQgPSB7CiAgICBsZWZ0OiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS5sZWZ0KSwKICAgIHRvcDogcGFyc2VGbG9hdChDT05UQUlORVIuc3R5bGUudG9wKSwKICAgIFg6IGV2ZW50LnBhZ2VYLAogICAgWTogZXZlbnQucGFnZVksCiAgfTsKICBmdW5jdGlvbiBtb3ZlQXQoZXZlbnQsIHN0YXJ0KSB7CiAgICBjb25zdCB0b3AgPSBldmVudC5wYWdlWSAtIHN0YXJ0LlkgKyBzdGFydC50b3AgKyAicHgiOwogICAgY29uc3QgbGVmdCA9IGV2ZW50LnBhZ2VYIC0gc3RhcnQuWCArIHN0YXJ0LmxlZnQgKyAicHgiOwogICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gbGVmdDsKICAgIENPTlRBSU5FUi5zdHlsZS5sZWZ0ID0gbGVmdDsKICAgIENPTlRBSU5FUi5zdHlsZS50b3AgPSB0b3A7CiAgfQoKICAvLyBtb3ZlIG91ciBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYmFsbCB1bmRlciB0aGUgcG9pbnRlcgogIG1vdmVBdChldmVudCwgc3RhcnQpOwogIGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGV2ZW50KSB7CiAgICBtb3ZlQXQoZXZlbnQsIHN0YXJ0KTsKICB9CgogIC8vIFdlIHVzZSB0aGlzIHRvIHJlbW92ZSB0aGUgbW91c2Vtb3ZlIHdoZW4gY2xpY2tpbmcgb3V0c2lkZSBvZiB0aGUgY29udGFpbmVyCiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgLy8gbW92ZSB0aGUgY29udGFpbmVyIG9uIG1vdXNlbW92ZQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIG9uTW91c2VNb3ZlLCB7CiAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLAogIH0pOwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAibW91c2Vkb3duIiwKICAgIChlKSA9PiB7CiAgICAgIGlmIChlLnRhcmdldC5jbG9zZXN0KCIucGx1dG9wbG90bHktY29udGFpbmVyIikgIT09IENPTlRBSU5FUikgewogICAgICAgIGNsZWFuVXAoKTsKICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9LAogICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0KICApOwoKICBmdW5jdGlvbiBjbGVhblVwKCkgewogICAgY29uc29sZS5sb2coImNsZWFuaW5nIHVwIHRoZSBwbG90IG1vdmUgbGlzdGVuZXIiKTsKICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gbnVsbDsKICB9CgogIC8vICgzKSBkcm9wIHRoZSBiYWxsLCByZW1vdmUgdW5uZWVkZWQgaGFuZGxlcnMKICBDTElQQk9BUkRfSEVBREVSLm9ubW91c2V1cCA9IGNsZWFuVXA7Cn07CgpmdW5jdGlvbiBzZW5kVG9DbGlwYm9hcmQoYmxvYikgewogIGlmICghbmF2aWdhdG9yLmNsaXBib2FyZCkgewogICAgYWxlcnQoCiAgICAgICJUaGUgQ2xpcGJvYXJkIEFQSSBkb2VzIG5vdCBzZWVtIHRvIGJlIGF2YWlsYWJsZSwgbWFrZSBzdXJlIHRoZSBQbHV0byBub3RlYm9vayBpcyBiZWluZyB1c2VkIGZyb20gZWl0aGVyIGxvY2FsaG9zdCBvciBhbiBodHRwcyBzb3VyY2UuIgogICAgKTsKICB9CiAgbmF2aWdhdG9yLmNsaXBib2FyZAogICAgLndyaXRlKFsKICAgICAgbmV3IENsaXBib2FyZEl0ZW0oewogICAgICAgIC8vIFRoZSBrZXkgaXMgZGV0ZXJtaW5lZCBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgYmxvYidzIHR5cGUuCiAgICAgICAgW2Jsb2IudHlwZV06IGJsb2IsCiAgICAgIH0pLAogICAgXSkKICAgIC50aGVuKAogICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgY29uc29sZS5sb2coIkFzeW5jOiBDb3B5aW5nIHRvIGNsaXBib2FyZCB3YXMgc3VjY2Vzc2Z1bCEiKTsKICAgICAgfSwKICAgICAgZnVuY3Rpb24gKGVycikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkFzeW5jOiBDb3VsZCBub3QgY29weSB0ZXh0OiAiLCBlcnIpOwogICAgICB9CiAgICApOwp9CgpmdW5jdGlvbiBjb3B5SW1hZ2VUb0NsaXBib2FyZCgpIHsKICAvLyBXZSBleHRyYWN0IHRoZSBpbWFnZSBvcHRpb25zIGZyb20gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMgKGlmIHRoZXkgZXhpc3QpCiAgY29uc3QgY29uZmlnID0ge307CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGxldCB2YWwgPQogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID8/CiAgICAgIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IGNvbnRhaW5lci51aV92YWx1ZSA6IHVuZGVmaW5lZCk7CiAgICAvLyBJZiB3ZSBoYXZlIHVuZGVmaW5lZCB3ZSBkb24ndCBjcmVhdGUgdGhlIGtleS4gV2UgYWxzbyBpZ25vcmUgZm9ybWF0IGJlY2F1c2UgdGhlIGNsaXBib2FyZCBvbmx5IHN1cHBvcnRzIHBuZy4KICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS50b0ltYWdlKFBMT1QsIGNvbmZpZykudGhlbihmdW5jdGlvbiAoZGF0YVVybCkgewogICAgZmV0Y2goZGF0YVVybCkKICAgICAgLnRoZW4oKHJlcykgPT4gcmVzLmJsb2IoKSkKICAgICAgLnRoZW4oKGJsb2IpID0+IHsKICAgICAgICBjb25zdCBwYXN0ZV9yZWNlaXZlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3Bhc3RlLXJlY2VpdmVyLnBsdXRvcGxvdGx5JykKICAgICAgICBpZiAocGFzdGVfcmVjZWl2ZXIpIHsKICAgICAgICAgIHBhc3RlX3JlY2VpdmVyLmF0dGFjaEltYWdlKGRhdGFVcmwsIENPTlRBSU5FUikKICAgICAgICB9CiAgICAgICAgc2VuZFRvQ2xpcGJvYXJkKGJsb2IpCiAgICAgIH0pOwogIH0pOwp9CgpmdW5jdGlvbiBzYXZlSW1hZ2VUb0ZpbGUoKSB7CiAgY29uc3QgY29uZmlnID0ge307CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGxldCB2YWwgPQogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID8/CiAgICAgIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IGNvbnRhaW5lci51aV92YWx1ZSA6IHVuZGVmaW5lZCk7CiAgICAvLyBJZiB3ZSBoYXZlIHVuZGVmaW5lZCB3ZSBkb24ndCBjcmVhdGUgdGhlIGtleS4KICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbmZpZ1trZXldID0gdmFsOwogIH0KICBQbG90bHkuZG93bmxvYWRJbWFnZShQTE9ULCBjb25maWcpOwp9CgpsZXQgY29udGFpbmVyX3JlY3QgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAsIHRvcDogMCwgbGVmdDogMCB9OwpmdW5jdGlvbiB1bnBvcF9jb250YWluZXIoY2wpIHsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZSgicG9wcGVkLW91dCIsIGZhbHNlKTsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgZmFsc2UpOwogIC8vIFdlIGZpeCB0aGUgaGVpZ2h0IGJhY2sgdG8gdGhlIHZhbHVlIGl0IGhhZCBiZWZvcmUgcG9wb3V0LCBhbHNvIHNldHRpbmcgdGhlIGZsYWcgdG8gc2lnbmFsIHRoYXQgdXBvbiBmaXJzdCByZXNpemUgd2UgcmVtb3ZlIHRoZSBmaXhlZCBpbmxpbmUtc3R5bGUKICBDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0ICsgInB4IjsKICByZW1vdmVfY29udGFpbmVyX3NpemUgPSB0cnVlOwogIC8vIFdlIHNldCB0aGUgb3RoZXIgZml4ZWQgaW5saW5lLXN0eWxlcyB0byBudWxsCiAgQ09OVEFJTkVSLnN0eWxlLndpZHRoID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9ICIiOwogIENPTlRBSU5FUi5zdHlsZS5sZWZ0ID0gIiI7CiAgLy8gV2UgYWxzbyByZW1vdmUgdGhlIENMSVBCT0FSRF9IRUFERVIKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLndpZHRoID0gIiI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gIiI7CiAgLy8gRmluYWxseSB3ZSByZW1vdmUgdGhlIGhpZGRlbiBjbGFzcyB0byB0aGUgaGVhZGVyCiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCB0cnVlKTsKICByZXR1cm47Cn0KZnVuY3Rpb24gcG9wb3V0X2NvbnRhaW5lcihvcHRzKSB7CiAgY29uc3QgY2wgPSBvcHRzPy5jbDsKICBjb25zdCB0YXJnZXRfY29udGFpbmVyX3NpemUgPSBvcHRzPy50YXJnZXRfY29udGFpbmVyX3NpemUgPz8ge307CiAgY29uc3QgdGFyZ2V0X3Bsb3Rfc2l6ZSA9IG9wdHM/LnRhcmdldF9wbG90X3NpemUgPz8ge307CiAgaWYgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICByZXR1cm4gdW5wb3BfY29udGFpbmVyKGNsKTsKICB9CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoY2wsIGNsID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IHRydWUpOwogIC8vIFdlIGV4dHJhY3QgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgY29udGFpbmVyLCBzYXZlIHRoZW0gYW5kIGZpeCB0aGVtCiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfSA9IENPTlRBSU5FUi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICBjb250YWluZXJfcmVjdCA9IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH07CiAgLy8gV2Ugc2F2ZSB0aGUgY3VycmVudCBwbG90IHNpemUgYmVmb3JlIHdlIHBvcCBhcyBpdCB3aWxsIGZpbGwgdGhlIHNjcmVlbgogIGNvbnN0IGN1cnJlbnRfcGxvdF9zaXplID0gewogICAgd2lkdGg6IFBMT1QuX2Z1bGxMYXlvdXQud2lkdGgsCiAgICBoZWlnaHQ6IFBMT1QuX2Z1bGxMYXlvdXQuaGVpZ2h0LAogIH07CiAgLy8gV2UgaGF2ZSB0byBzYXZlIHRoZSBwYWQgZGF0YSBiZWZvcmUgcG9wcGluZyBzbyB3ZSBjYW4gcmVzaXplIHByZWNpc2VseQogIGNvbnN0IHBhZCA9IHt9OwogIHBhZC51bnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZSgicG9wcGVkLW91dCIsIHRydWUpOwogIHBhZC5wb3BwZWQgPSBnZXRTaXplRGF0YSgpLmNvbnRhaW5lcl9wYWQ7CiAgLy8gV2UgZG8gdG9wIGFuZCBsZWZ0IGJhc2VkIG9uIHRoZSBjdXJyZW50IHJlY3QKICBmb3IgKGNvbnN0IGtleSBvZiBbInRvcCIsICJsZWZ0Il0pIHsKICAgIGNvbnN0IHN0YXJ0X3ZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNvbnRhaW5lcl9yZWN0W2tleV07CiAgICBsZXQgb2Zmc2V0ID0gMDsKICAgIGZvciAoY29uc3Qga2luZCBvZiBbInBhZGRpbmciLCAiYm9yZGVyIl0pIHsKICAgICAgb2Zmc2V0ICs9IHBhZC5wb3BwZWRba2luZF1ba2V5XSAtIHBhZC51bnBvcHBlZFtraW5kXVtrZXldOwogICAgfQogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSBzdGFydF92YWwgLSBvZmZzZXQgKyAicHgiOwogICAgaWYgKGtleSA9PT0gImxlZnQiKSB7CiAgICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGVba2V5XSA9IENPTlRBSU5FUi5zdHlsZVtrZXldOwogICAgfQogIH0KICAvLyBXZSBjb21wdXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGRlcGVuZGluZyBvbiBldmVudHVhbCBjb25maWcgZGF0YQogIGNvbnN0IGNzeiA9IGNvbXB1dGVDb250YWluZXJTaXplKHsKICAgIHdpZHRoOgogICAgICB0YXJnZXRfcGxvdF9zaXplLndpZHRoID8/CiAgICAgIGNvbmZpZ19zcGFucy53aWR0aC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6CiAgICAgIHRhcmdldF9wbG90X3NpemUuaGVpZ2h0ID8/CiAgICAgIGNvbmZpZ19zcGFucy5oZWlnaHQuY29uZmlnX3ZhbHVlID8/CiAgICAgIGN1cnJlbnRfcGxvdF9zaXplLmhlaWdodCwKICB9KTsKICBmb3IgKGNvbnN0IGtleSBvZiBbIndpZHRoIiwgImhlaWdodCJdKSB7CiAgICBjb25zdCB2YWwgPSB0YXJnZXRfY29udGFpbmVyX3NpemVba2V5XSA/PyBjc3pba2V5XTsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gdmFsICsgInB4IjsKICAgIGlmIChrZXkgPT09ICJ3aWR0aCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIENMSVBCT0FSRF9IRUFERVIuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgZmFsc2UpOwogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CgogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAibW91c2Vkb3duIiwKICAgIChlKSA9PiB7CiAgICAgIGlmIChlLnRhcmdldC5jbG9zZXN0KCIucGx1dG9wbG90bHktY29udGFpbmVyIikgIT09IENPTlRBSU5FUikgewogICAgICAgIHVucG9wX2NvbnRhaW5lcigpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7Cn0KCkNPTlRBSU5FUi5wb3BPdXQgPSBwb3BvdXRfY29udGFpbmVyOwoKZnVuY3Rpb24gRHVhbENsaWNrKHNpbmdsZV9mdW5jLCBkYmxfZnVuYykgewogIGxldCBuY2xpY2tzID0gMDsKICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHsKICAgIG5jbGlja3MgKz0gMTsKICAgIGlmIChuY2xpY2tzID4gMSkgewogICAgICBkYmxfZnVuYyguLi5hcmdzKTsKICAgICAgbmNsaWNrcyA9IDA7CiAgICB9IGVsc2UgewogICAgICBkZWxheSgzMDApLnRoZW4oKCkgPT4gewogICAgICAgIGlmIChuY2xpY2tzID09IDEpIHsKICAgICAgICAgIHNpbmdsZV9mdW5jKC4uLmFyZ3MpOwogICAgICAgIH0KICAgICAgICBuY2xpY2tzID0gMDsKICAgICAgfSk7CiAgICB9CiAgfTsKfQoKLy8gV2UgcmVtb3ZlIHRoZSBkZWZhdWx0IGRvd25sb2FkIGltYWdlIGJ1dHRvbgpwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSA9IF8udW5pb24oCiAgcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9SZW1vdmUsCiAgWyJ0b0ltYWdlIl0KKTsKLy8gV2UgYWRkIHRoZSBjdXN0b20gYnV0dG9uIHRvIHRoZSBtb2RlYmFyCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb0FkZCwKICBbCiAgICB7CiAgICAgIG5hbWU6ICJDb3B5IFBORyB0byBDbGlwYm9hcmQiLAogICAgICBpY29uOiB7CiAgICAgICAgaGVpZ2h0OiA1MjAsCiAgICAgICAgd2lkdGg6IDUyMCwKICAgICAgICBwYXRoOiAiTTI4MCA2NGg0MGMzNS4zIDAgNjQgMjguNyA2NCA2NFY0NDhjMCAzNS4zLTI4LjcgNjQtNjQgNjRINjRjLTM1LjMgMC02NC0yOC43LTY0LTY0VjEyOEMwIDkyLjcgMjguNyA2NCA2NCA2NGg0MCA5LjZDMTIxIDI3LjUgMTUzLjMgMCAxOTIgMHM3MSAyNy41IDc4LjQgNjRIMjgwek02NCAxMTJjLTguOCAwLTE2IDcuMi0xNiAxNlY0NDhjMCA4LjggNy4yIDE2IDE2IDE2SDMyMGM4LjggMCAxNi03LjIgMTYtMTZWMTI4YzAtOC44LTcuMi0xNi0xNi0xNkgzMDR2MjRjMCAxMy4zLTEwLjcgMjQtMjQgMjRIMTkyIDEwNGMtMTMuMyAwLTI0LTEwLjctMjQtMjRWMTEySDY0em0xMjgtOGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6IiwKICAgICAgfSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKGNvcHlJbWFnZVRvQ2xpcGJvYXJkLCAoKSA9PiB7CiAgICAgICAgcG9wb3V0X2NvbnRhaW5lcigpOwogICAgICB9KSwKICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICJEb3dubG9hZCBJbWFnZSIsCiAgICAgIGljb246IFBsb3RseS5JY29ucy5jYW1lcmEsCiAgICAgIGRpcmVjdGlvbjogInVwIiwKICAgICAgY2xpY2s6IER1YWxDbGljayhzYXZlSW1hZ2VUb0ZpbGUsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKHsgY2w6ICJmaWxlc2F2ZSIgfSk7CiAgICAgIH0pLAogICAgfSwKICBdCik7CgpmdW5jdGlvbiBnZXRPZmZzZXREYXRhKGVsKSB7CiAgbGV0IGNzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwsIG51bGwpOwogIGNvbnN0IG9kYXRhID0gewogICAgcGFkZGluZzogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdMZWZ0KSwKICAgICAgcmlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1JpZ2h0KSwKICAgICAgdG9wOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdUb3ApLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MucGFkZGluZ0JvdHRvbSksCiAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdMZWZ0KSArIHBhcnNlRmxvYXQoY3MucGFkZGluZ1JpZ2h0KSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdUb3ApICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgIH0sCiAgICBib3JkZXI6IHsKICAgICAgbGVmdDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgdG9wOiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSwKICAgICAgYm90dG9tOiBwYXJzZUZsb2F0KGNzLmJvcmRlckJvdHRvbVdpZHRoKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MuYm9yZGVyTGVmdFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyUmlnaHRXaWR0aCksCiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChjcy5ib3JkZXJUb3BXaWR0aCkgKyBwYXJzZUZsb2F0KGNzLmJvcmRlckJvdHRvbVdpZHRoKSwKICAgIH0KICB9OwogIGlmIChlbCA9PT0gUExPVCkgewogICAgLy8gRm9yIHRoZSBQTE9UIHdlIGFsc28gd2FudCB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgb2Zmc2V0CiAgICBvZGF0YS5vZmZzZXQgPSB7CiAgICAgIHRvcDogUExPVC5vZmZzZXRQYXJlbnQgPT0gQ09OVEFJTkVSID8gUExPVC5vZmZzZXRUb3AgOiAwLAogICAgICBsZWZ0OiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldExlZnQgOiAwLAogICAgfQogIH0KICByZXR1cm4gb2RhdGE7Cn0KZnVuY3Rpb24gZ2V0U2l6ZURhdGEoKSB7CiAgY29uc3QgZGF0YSA9IHsKICAgIHBsb3RfcGFkOiBnZXRPZmZzZXREYXRhKFBMT1QpLAogICAgcGxvdF9yZWN0OiBQTE9ULmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogICAgY29udGFpbmVyX3BhZDogZ2V0T2Zmc2V0RGF0YShDT05UQUlORVIpLAogICAgY29udGFpbmVyX3JlY3Q6IENPTlRBSU5FUi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICB9OwogIHJldHVybiBkYXRhOwp9CmZ1bmN0aW9uIGNvbXB1dGVDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICBjb25zdCBjb21wdXRlZF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICBjb25zdCBvZmZzZXRzID0gY29tcHV0ZWRfc2l6ZS5vZmZzZXRzOwoKICBjb25zdCBwbG90X2RhdGEgPSB7CiAgICB3aWR0aDogd2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCwKICAgIGhlaWdodDogaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH07CgogIHJldHVybiB7CiAgICB3aWR0aDogKHdpZHRoID8/IGNvbXB1dGVkX3NpemUud2lkdGgpICsgb2Zmc2V0cy53aWR0aCwKICAgIGhlaWdodDogKGhlaWdodCA/PyBjb21wdXRlZF9zaXplLmhlaWdodCkgKyBvZmZzZXRzLmhlaWdodCwKICAgIG5vQ2hhbmdlOiB3aWR0aCA9PSBjb21wdXRlZF9zaXplLndpZHRoICYmIGhlaWdodCA9PSBjb21wdXRlZF9zaXplLmhlaWdodCwKICB9Cn0KCi8vIFRoaXMgZnVuY3Rpb24gd2lsbCBjaGFuZ2UgdGhlIGNvbnRhaW5lciBzaXplIHNvIHRoYXQgdGhlIHJlc3VsdGluZyBwbG90IHdpbGwgYmUgbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIHNwZWNzCmZ1bmN0aW9uIGNoYW5nZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGlmICghQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIGNvbnNvbGUubG9nKCJUcmllZCB0byBjaGFuZ2UgY29udGFpbmVyIHNpemUgd2hlbiBub3QgcG9wcGVkLCBpZ25vcmluZyIpOwogICAgcmV0dXJuOwogIH0KCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhKTsKCiAgaWYgKGNzei5ub0NoYW5nZSkgewogICAgY29uc29sZS5sb2coIlNpemUgaXMgdGhlIHNhbWUgYXMgY3VycmVudCwgaWdub3JpbmciKTsKICAgIHJldHVybgogIH0KICAvLyBXZSBhcmUgbm93IGdvaW5nIHRvIHNldCBoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBjb250YWluZXIKICBmb3IgKGNvbnN0IGtleSBvZiBbIndpZHRoIiwgImhlaWdodCJdKSB7CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IGNzeltrZXldICsgInB4IjsKICB9Cn0KLy8gV2Ugbm93IGNyZWF0ZSB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIHVwZGF0ZSB0aGUgcGxvdCBiYXNlZCBvbiB0aGUgdmFsdWVzIHNwZWNpZmllZApmdW5jdGlvbiB1cGRhdGVGcm9tSGVhZGVyKCkgewogIGNvbnN0IGhlYWRlcl9kYXRhID0gewogICAgaGVpZ2h0OiBjb25maWdfc3BhbnMuaGVpZ2h0LnVpX3ZhbHVlLAogICAgd2lkdGg6IGNvbmZpZ19zcGFucy53aWR0aC51aV92YWx1ZSwKICB9OwogIGNoYW5nZUNvbnRhaW5lclNpemUoaGVhZGVyX2RhdGEpOwp9Ci8vIFdlIGFzc2lnbiB0aGlzIGZ1bmN0aW9uIHRvIHRoZSBvbmJsdXIgZXZlbnQgb2Ygd2lkdGggYW5kIGhlaWdodAppZiAoZmlyc3RSdW4pIHsKICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGNvbnRhaW5lci51aV9zcGFuLm9uYmx1ciA9IChlKSA9PiB7CiAgICAgIGNvbnRhaW5lci51aV92YWx1ZSA9IGNvbnRhaW5lci51aV9zcGFuLnRleHRDb250ZW50OwogICAgICB1cGRhdGVGcm9tSGVhZGVyKCk7CiAgICB9OwogIH0KfQovLyBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBwbG90IHNpemUgdG8gdXNlIGZvciByZWxheW91dCBhcyBhIGZ1bmN0aW9uIG9mIHRoZSBjb250YWluZXIgc2l6ZQpmdW5jdGlvbiBjb21wdXRlUGxvdFNpemUoZGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICAvLyBSZW1vdmUgUGFkZGluZwogIGNvbnN0IHsgY29udGFpbmVyX3BhZCwgcGxvdF9wYWQsIGNvbnRhaW5lcl9yZWN0IH0gPSBkYXRhOwogIGNvbnN0IG9mZnNldHMgPSB7CiAgICB3aWR0aDoKICAgICAgcGxvdF9wYWQucGFkZGluZy53aWR0aCArCiAgICAgIHBsb3RfcGFkLmJvcmRlci53aWR0aCArCiAgICAgIHBsb3RfcGFkLm9mZnNldC5sZWZ0ICsKICAgICAgY29udGFpbmVyX3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgY29udGFpbmVyX3BhZC5ib3JkZXIud2lkdGgsCiAgICBoZWlnaHQ6CiAgICAgIHBsb3RfcGFkLnBhZGRpbmcuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLmhlaWdodCArCiAgICAgIHBsb3RfcGFkLm9mZnNldC50b3AgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcuaGVpZ2h0ICsKICAgICAgY29udGFpbmVyX3BhZC5ib3JkZXIuaGVpZ2h0LAogIH07CiAgY29uc3Qgc3ogPSB7CiAgICB3aWR0aDogTWF0aC5yb3VuZChjb250YWluZXJfcmVjdC53aWR0aCAtIG9mZnNldHMud2lkdGgpLAogICAgaGVpZ2h0OiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LmhlaWdodCAtIG9mZnNldHMuaGVpZ2h0KSwKICAgIG9mZnNldHMsCiAgfTsKICByZXR1cm4gc3o7Cn0KCi8vIENyZWF0ZSB0aGUgcmVzaXplT2JzZXJ2ZXIgdG8gbWFrZSB0aGUgcGxvdCBldmVuIG1vcmUgcmVzcG9uc2l2ZSEgOm1hZ2ljOgpjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4gewogIGNvbnN0IHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKTsKICBjb25zdCB7Y29udGFpbmVyX3JlY3QsIGNvbnRhaW5lcl9wYWR9ID0gc2l6ZURhdGE7CiAgbGV0IHBsb3Rfc2l6ZSA9IGNvbXB1dGVQbG90U2l6ZShzaXplRGF0YSk7CiAgLy8gV2Ugc2F2ZSB0aGUgaGVpZ2h0IGluIHRoZSBQTE9UIG9iamVjdAogIFBMT1QuY29udGFpbmVyX2hlaWdodCA9IGNvbnRhaW5lcl9yZWN0LmhlaWdodDsKICAvLyBXZSBkZWFsIHdpdGggc29tZSBzdHVmZiBpZiB0aGUgY29udGFpbmVyIGlzIHBvcHBwZWQKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLndpZHRoID0gY29udGFpbmVyX3JlY3Qud2lkdGggKyAicHgiOwogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9IGNvbnRhaW5lcl9yZWN0LmxlZnQgKyAicHgiOwogIGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUgPSBwbG90X3NpemUuaGVpZ2h0OwogIGNvbmZpZ19zcGFucy53aWR0aC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS53aWR0aDsKICAvKiAKCQlUaGUgYWRkaXRpb24gb2YgdGhlIGludmFsaWQgYXJndW1lbnQgYHBsdXRvcmVzaXplYCBzZWVtcyB0byBmaXggdGhlIHByb2JsZW0gd2l0aCBjYWxsaW5nIGByZWxheW91dGAgc2ltcGx5IHdpdGggYHthdXRvc2l6ZTogdHJ1ZX1gIGFzIHVwZGF0ZSBicmVha2luZyBtb3VzZSByZWxheW91dCBldmVudHMgdHJhY2tpbmcuIAoJCVNlZSBodHRwczovL2dpdGh1Yi5jb20vcGxvdGx5L3Bsb3RseS5qcy9pc3N1ZXMvNjE1NiBmb3IgZGV0YWlscwoJCSovCiAgbGV0IGNvbmZpZyA9IHsKICAgIC8vIElmIHRoaXMgaXMgcG9wcGVkIG91dCwgd2UgaWdub3JlIHRoZSBvcmlnaW5hbCB3aWR0aC9oZWlnaHQKICAgIHdpZHRoOiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyB1bmRlZmluZWQgOiBvcmlnaW5hbF93aWR0aCkgPz8gcGxvdF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyB1bmRlZmluZWQgOiBvcmlnaW5hbF9oZWlnaHQpID8/IHBsb3Rfc2l6ZS5oZWlnaHQsCiAgICBwbHV0b3Jlc2l6ZTogdHJ1ZSwKICB9OwogIFBsb3RseS5yZWxheW91dChQTE9ULCBjb25maWcpLnRoZW4oKCkgPT4gewogICAgaWYgKHJlbW92ZV9jb250YWluZXJfc2l6ZSAmJiAhQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgdGhlIGZpcnN0IHJlc2l6ZSB1cG9uIHBsb3QgY3JlYXRpb24gdG8gYWxyZWFkeSBiZSB3aXRob3V0IGEgZml4ZWQgaGVpZ2h0CiAgICAgIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSAiIjsKICAgICAgQ09OVEFJTkVSLnN0eWxlLndpZHRoID0gIiI7CiAgICAgIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IGZhbHNlOwogICAgfQogIH0pOwp9KTsKCnJlc2l6ZU9ic2VydmVyLm9ic2VydmUoQ09OVEFJTkVSKTsKCgpQbG90bHkucmVhY3QoUExPVCwgcGxvdF9vYmopLnRoZW4oKCkgPT4gewoJLy8gQXNzaWduIHRoZSBQbG90bHkgZXZlbnQgbGlzdGVuZXJzCglmb3IgKGNvbnN0IFtrZXksIGxpc3RlbmVyX3ZlY10gb2YgT2JqZWN0LmVudHJpZXMocGxvdGx5X2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULm9uKGtleSwgbGlzdGVuZXIpCgkJfQoJfQoJLy8gQXNzaWduIHRoZSBKUyBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhqc19saXN0ZW5lcnMpKSB7CgkJZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcl92ZWMpIHsKCQkJUExPVC5hZGRFdmVudExpc3RlbmVyKGtleSwgbGlzdGVuZXIsIHsKCQkJCXNpZ25hbDogY29udHJvbGxlci5zaWduYWwKCQkJfSkKCQl9Cgl9Cn0KKQoKCmludmFsaWRhdGlvbi50aGVuKCgpID0+IHsKCS8vIFJlbW92ZSBhbGwgcGxvdGx5IGxpc3RlbmVycwoJUExPVC5yZW1vdmVBbGxMaXN0ZW5lcnMoKQoJLy8gUmVtb3ZlIGFsbCBKUyBsaXN0ZW5lcnMKCWNvbnRyb2xsZXIuYWJvcnQoKQoJLy8gUmVtb3ZlIHRoZSByZXNpemVPYnNlcnZlcgoJcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpCn0pCgoKCgkJcmV0dXJuIENPTlRBSU5FUgoJPC9zY3JpcHQ+CqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b/ITmAH/7BwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkMmVlN2JhNDctMDJlNS00YjAyLWExNjItZGRiZDVlZDQ3YzdiuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAY2gobVwdWJsaXNoZWRfb2JqZWN0X2tleXOR2TU3YmNjMDViMC04MWRhLTExZWYtMjA0MC0zNTg1YzliNDk1NGYvNmM1OWM1NjI1YWQ4NGNmYbhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQ3NDY2NmMxYS0yNjczLTQ5MzYtOTgyYi02MjI5YmY5MmFmNjaKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52gGFPGRpdiBjbGFzcz0ibWFya2Rvd24iPjx1bD4KPGxpPjxwPiYjNDA7Mi41JiM0MTsgU2ltdWxhdGUgdGhlIDxjb2RlPnNlcV9ncmU8L2NvZGU+IHNlcXVlbmNlPC9wPgo8L2xpPgo8bGk+PHA+JiM0MDsyLjYmIzQxOyBQbG90IHRoZSBzaW11bGF0ZWQgc2lnbmFsPC9wPgo8L2xpPgo8bGk+PHA+JiM0MDsyLjcmIzQxOyBSZWNvbnN0cnVjdCB0aGUgMUQgaW1hZ2U8L3A+CjwvbGk+CjxsaT48cD4mIzQwOzIuOCYjNDE7IERvIHlvdSBub3RpY2UgYW55dGhpbmcgd2VpcmQ/IElmIHRoZSBhbnN3ZXIgaXMgeWVzLCB0cnkgYWRqdXN0aW5nIDxjb2RlPkF4PC9jb2RlPiB0byBjaGFuZ2UgdGhlIDxjb2RlPkZPVjwvY29kZT4gb2YgdGhlIGFjcXVpc2l0aW9uPC9wPgo8L2xpPgo8L3VsPgo8L2Rpdj6kbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/yC1SfEawcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJDc0NjY2YzFhLTI2NzMtNDkzNi05ODJiLTYyMjliZjkyYWY2NrlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgAHWr21cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SRlYTU0MjI3MS0wMWMyLTQ5NjItYTcwOC04MDRiMjNhODYxYjmKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52gGoPGRpdiBjbGFzcz0ibWFya2Rvd24iPjx1bD4KPGxpPjxwPiYjNDA7MS42JiM0MTsgRmluYWxseSwgdXNlIHRoZSBnZW5lcmF0ZWQgPGNvZGU+c2VxPC9jb2RlPiwgPGNvZGU+b2JqPC9jb2RlPiwgYW5kIDxjb2RlPnN5czwvY29kZT4gdG8gc2ltdWxhdGUgdGhlIEZJRCAmIzQwO2NoZWNrIDxjb2RlPnNpbXVsYXRlPC9jb2RlPiYjMzk7cyBkb2NzJiM0MTs8L3A+CjwvbGk+CjxsaT48cD4mIzQwOzEuNyYjNDE7IFBsb3QgdGhlIHJlc3VsdGluZyByYXcgZGF0YSB3aXRoIDxjb2RlPnBsb3Rfc2lnbmFsPC9jb2RlPi48L3A+CjwvbGk+CjxsaT48cD4mIzQwOzEuOCYjNDE7IElzIHRoZSBzaWduYWwgdGhlIHNhbWUgYXMgPGNvZGU+cGxvdCYjNDA7dCwgZXhwLiYjNDA7LXQgLi8gVDImIzQxOyYjNDE7PC9jb2RlPj88L3A+CjwvbGk+CjwvdWw+CjwvZGl2PqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b/ILVJcs7BwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkZWE1NDIyNzEtMDFjMi00OTYyLWE3MDgtODA0YjIzYTg2MWI5uWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAAbbALVwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJGM2ZTMzY2I4LWY0MmMtNDY0My05MjU3LTEyNGQyODA0ZDNkYYqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnZR1NlcXVlbmNlWyDPhCA9IDAuNTg3IG1zIHwgYmxvY2tzOiAxIHwgQURDOiAwIHwgR1I6IDAgfCBSRjogMSB8IERFRjogMCBdpG1pbWWqdGV4dC9wbGFpbqxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b/IQzdOJ7BwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkYzZlMzNjYjgtZjQyYy00NjQzLTkyNTctMTI0ZDI4MDRkM2RhuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOO1pTzrVwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDI3Njg2MjYyLTFhMWUtNDVmYS1iNGVlLTkwYWUxZDllZTM0ZYqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnaATY8ZGl2IGNsYXNzPSJtYXJrZG93biI+PHVsPgo8bGk+PHA+JiM0MDszLjMmIzQxOyBTaW11bGF0ZSB0aGUgPGNvZGU+c2VxX2dyZTwvY29kZT4gc2VxdWVuY2U8L3A+CjwvbGk+CjxsaT48cD4mIzQwOzMuNCYjNDE7IFBsb3QgdGhlIHNpbXVsYXRlZCBzaWduYWw8L3A+CjwvbGk+CjxsaT48cD4mIzQwOzMuNSYjNDE7IENvbXBhcmUgdGhlIHBsb3QgaW4gJiM0MDszLjUmIzQxOyB3aXRoICYjNDA7Mi42JiM0MTs8L3A+CjwvbGk+CjxsaT48cD4mIzQwOzMuNiYjNDE7IFJlY29uc3RydWN0IHRoZSAxRCBpbWFnZTwvcD4KPC9saT4KPC91bD4KPC9kaXY+pG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv8gtUprysHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQyNzY4NjI2Mi0xYTFlLTQ1ZmEtYjRlZS05MGFlMWQ5ZWUzNGW5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4ABxvjtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkNmRmZTMzOGQtZGU4NS00YWRiLWIwMzAtMDk0NTVmYWU3OGEwiqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kednzPGRpdiBjbGFzcz0ibWFya2Rvd24iPjxwPldlbGNvbWUgdG8gdGhlIGhhbmRzLW9uIHNlc3Npb24gb24gTVJJIHNpbXVsYXRpb24uIExldCYjMzk7cyBoYXZlIHNvbWUgZnVuJiMzMzs8L3A+CjxwPklmIHlvdSBoYXZlIGFueSBkb3VidHMgYWJvdXQgaG93IHRvIHVzZSBhIGZ1bmN0aW9uLCBwbGVhc2Ugc2VhcmNoIGluIHRoZSA8c3Ryb25nPkxpdmUgRG9jczwvc3Ryb25nPiBhdCB0aGUgYm90dG9tIHJpZ2h0LjwvcD4KPC9kaXY+pG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv8gtUhZmsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQ2ZGZlMzM4ZC1kZTg1LTRhZGItYjAzMC0wOTQ1NWZhZTc4YTC5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4ABKAitXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkOGU0NzRhZGQtODY1MS00MzFiLWI0ODEtN2ExMzkwMzdkYmQyiqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedoD+zxkaXYgY2xhc3M9Im1hcmtkb3duIj48aDE+MS4gRnJlZSBJbmR1Y3Rpb24gRGVjYXkgJiM0MDtGSUQmIzQxOzwvaDE+CjxwPlRoZSBmcmVlIGluZHVjdGlvbiBkZWNheSBpcyB0aGUgc2ltcGxlc3Qgb2JzZXJ2YWJsZSBOTVIgc2lnbmFsLiBUaGlzIHNpZ25hbCBpcyB0aGUgb25lIHRoYXQgZm9sbG93cyBhIHNpbmdsZSB0aXBwaW5nIFJGIHB1bHNlLjwvcD4KPGltZyBjb250cm9scz0nJyBzcmM9J2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9MSUJSRWh1Yi9NUkktcHJvY2Vzc2luZy0yMDIzL21haW4vMDItc2ltdWxhdGlvbi9GaWd1cmVzL0ZJRC5wbmcnIHR5cGU9J2ltYWdlL3BuZycgd2lkdGg9JzMwMHB4Jz48L2ltZz4KPHA+VG8gcmVjcmVhdGUgdGhpcyBleHBlcmltZW50LCB3ZSB3aWxsIG5lZWQgdG8gZGVmaW5lIGEgPGNvZGU+U2VxdWVuY2U8L2NvZGU+OjwvcD4KPHVsPgo8bGk+PHA+JiM0MDsxLjEmIzQxOyBBIDkwLWRlZyBibG9jayBSRiBwdWxzZSwgcHV0IGl0IGluIGEgdmFyaWFibGUgPGNvZGU+c2VxPC9jb2RlPiAmIzQwO2NoZWNrIDxjb2RlPlB1bHNlRGVzaWduZXIuUkZfaGFyZDwvY29kZT4mIzM5O3MgZG9jcyB1c2luZyB0aGUgTGl2ZSBEb2NzJiM0MTs8L3A+CjwvbGk+CjxsaT48cD4mIzQwOzEuMiYjNDE7IEFuIEFEQyB0byBjYXB0dXJlIHRoZSBzaWduYWwgaW4gYSB2YXJpYWJsZSA8Y29kZT5hZGM8L2NvZGU+LCBjb25jYXRlbmF0ZSB3aXRoICYjNDA7MS4xJiM0MTsgdXNpbmcgPGNvZGU+c2VxICYjNDM7JiM2MTsgYWRjPC9jb2RlPjwvcD4KPC9saT4KPGxpPjxwPiYjNDA7MS4zJiM0MTsgUGxvdCB0aGUgZ2VuZXJhdGVkIDxjb2RlPlNlcXVlbmNlPC9jb2RlPiAmIzQwO2NoZWNrIDxjb2RlPnBsb3Rfc2VxPC9jb2RlPiYjMzk7cyBkb2NzJiM0MTs8L3A+CjwvbGk+CjwvdWw+CjxwPkZvciB0aGUgaGFyZHdhcmUgbGltaXRzIHVzZSB0aGUgZGVmYXVsdCBzY2FubmVyIDxjb2RlPnN5cyAmIzYxOyBTY2FubmVyJiM0MDsmIzQxOzwvY29kZT4uIDwvcD4KPC9kaXY+pG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv8hCjnlbsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQ4ZTQ3NGFkZC04NjUxLTQzMWItYjQ4MS03YTEzOTAzN2RiZDK5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4IjgEAtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkZmU4YmJjZDItZThmNS00MjI1LTgwYzMtNDdlNzMxNzZmYjNkiqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedlvPGRpdiBjbGFzcz0ibWFya2Rvd24iPjxwPkNvbmdyYXR1bGF0aW9ucyYjMzM7IHlvdSBmaW5pc2hlZCB0aGUgc2ltdWxhdGlvbiBoYW5kcy1vbiBzZXNzaW9uIPCfpbMmIzMzOzwvcD4KPC9kaXY+pG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv8gtUs2FsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SRmZThiYmNkMi1lOGY1LTQyMjUtODBjMy00N2U3MzE3NmZiM2S5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4AAvcJtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkMWE4M2Q4OTctNzA1Yi00NDNkLTg5YTQtZWE1ZTNlNmEzYzA3iqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedpqiQk8c2NyaXB0IGlkPSdwbG90XzEnPgoJCS8vIFdlIHN0YXJ0IGJ5IHB1dHRpbmcgYWxsIHRoZSB2YXJpYWJsZSBpbnRlcnBvbGF0aW9uIGhlcmUgYXQgdGhlIGJlZ2lubmluZwoJCS8vIFdlIGhhdmUgdG8gY29udmVydCBhbGwgdHlwZWRhcnJheXMgaW4gdGhlIGxheW91dCB0byBub3JtYWwgYXJyYXlzLiBTZWUgSXNzdWUgIzI1CgkJLy8gV2UgdXNlIGxvZGFzaCBmb3IgdGhpcyBmb3IgY29tcGFjdG5lc3MKCQlmdW5jdGlvbiByZW1vdmVUeXBlZEFycmF5KG8pIHsKCQkJcmV0dXJuIF8uaXNUeXBlZEFycmF5KG8pID8gQXJyYXkuZnJvbShvKSA6CgkJCV8uaXNQbGFpbk9iamVjdChvKSA/IF8ubWFwVmFsdWVzKG8sIHJlbW92ZVR5cGVkQXJyYXkpIDogCgkJCW8KCQl9CgoJCS8vIFB1Ymxpc2ggdGhlIHBsb3Qgb2JqZWN0IHRvIEpTCgkJbGV0IHBsb3Rfb2JqID0gXy51cGRhdGUoLyogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBBYnN0cmFjdFBsdXRvRGluZ2V0amVzLkRpc3BsYXkucHVibGlzaGVkX3RvX2pzICovIGdldFB1Ymxpc2hlZE9iamVjdCgiN2JjYzA1YjAtODFkYS0xMWVmLTIwNDAtMzU4NWM5YjQ5NTRmLzIwNWY5OTg3ZGE4YzYzMWEiKSwgImxheW91dCIsIHJlbW92ZVR5cGVkQXJyYXkpCgkJLy8gR2V0IHRoZSBwbG90bHkgbGlzdGVuZXJzCgkJY29uc3QgcGxvdGx5X2xpc3RlbmVycyA9IHt9CgkJLy8gR2V0IHRoZSBKUyBsaXN0ZW5lcnMKCQljb25zdCBqc19saXN0ZW5lcnMgPSB7fQoJCS8vIERlYWwgd2l0aCBldmVudHVhbCBjdXN0b20gY2xhc3NlcwoJCWxldCBjdXN0b21fY2xhc3NsaXN0ID0gW10KCgoJCS8vIExvYWQgdGhlIHBsb3RseSBsaWJyYXJ5CgkJbGV0IFBsb3RseSA9IHVuZGVmaW5lZAoJCXRyeSB7CgkJCWxldCBfbW9kID0gYXdhaXQgaW1wb3J0KCIuL3Bsb3RseWpzL3Bsb3RseWpzLTIuMjYuMi5taW4uanMiKQoJCQlQbG90bHkgPSBfbW9kLmRlZmF1bHQKCQl9IGNhdGNoIChlKSB7CgkJCWNvbnNvbGUubG9nKCJMb2NhbCBsb2FkIGZhaWxlZCwgdHJ5aW5nIHdpdGggdGhlIHdlYiBlc20uc2ggdmVyc2lvbiIpCgkJCWxldCBfbW9kID0gYXdhaXQgaW1wb3J0KCJodHRwczovL2VzbS5zaC92MTM1L3Bsb3RseS5qcy1kaXN0LW1pbkAyLjI2LjIvZXNuZXh0L3Bsb3RseS5qcy1kaXN0LW1pbi5tanMiKQoJCQlQbG90bHkgPSBfbW9kLmRlZmF1bHQKCQl9CgoJCS8vIENoZWNrIGlmIHdlIGhhdmUgdG8gZm9yY2UgbG9jYWwgbWF0aGpheCBmb250IGNhY2hlCgkJaWYgKGZhbHNlICYmIHdpbmRvdz8uTWF0aEpheD8uY29uZmlnPy5zdmc/LmZvbnRDYWNoZSA9PT0gJ2dsb2JhbCcpIHsKCQkJd2luZG93Lk1hdGhKYXguY29uZmlnLnN2Zy5mb250Q2FjaGUgPSAnbG9jYWwnCgkJfQoKCQkvLyBGbGFnIHRvIGNoZWNrIGlmIHRoaXMgY2VsbCB3YXMgIG1hbnVhbGx5IHJhbiBvciByZWFjdGl2ZWx5IHJhbgpjb25zdCBmaXJzdFJ1biA9IHRoaXMgPyBmYWxzZSA6IHRydWUKY29uc3QgQ09OVEFJTkVSID0gdGhpcyA/PyBodG1sYDxkaXYgY2xhc3M9J3BsdXRvcGxvdGx5LWNvbnRhaW5lcic+YApjb25zdCBQTE9UID0gQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoJy5qcy1wbG90bHktcGxvdCcpID8/IENPTlRBSU5FUi5hcHBlbmRDaGlsZChodG1sYDxkaXY+YCkKY29uc3QgcGFyZW50ID0gQ09OVEFJTkVSLnBhcmVudEVsZW1lbnQKLy8gV2UgdXNlIGEgY29udHJvbGxlciB0byByZW1vdmUgZXZlbnQgbGlzdGVuZXJzIHVwb24gaW52YWxpZGF0aW9uCmNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCkKLy8gV2UgaGF2ZSB0byBhZGQgdGhpcyB0byBrZWVwIHN1cHBvcnRpbmcgQGJpbmQgd2l0aCB0aGUgb2xkIEFQSSB1c2luZyBQTE9UClBMT1QuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoZSkgPT4gewoJQ09OVEFJTkVSLnZhbHVlID0gUExPVC52YWx1ZQoJaWYgKGUuYnViYmxlcykgewoJCXJldHVybgoJfQoJQ09OVEFJTkVSLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdpbnB1dCcpKQp9LCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSkKCgkvLyBUaGlzIGNyZWF0ZSB0aGUgc3R5bGUgc3ViZGl2IG9uIGZpcnN0IHJ1bgoJZmlyc3RSdW4gJiYgQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgCgk8c3R5bGU+CgkucGx1dG9wbG90bHktY29udGFpbmVyIHsKCQl3aWR0aDogMTAwJTsKCQloZWlnaHQ6IDEwMCU7CgkJbWluLWhlaWdodDogMDsKCQltaW4td2lkdGg6IDA7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyIC5qcy1wbG90bHktcGxvdCAucGxvdGx5IGRpdiB7CgkJbWFyZ2luOiAwIGF1dG87IC8vIFRoaXMgY2VudGVycyB0aGUgcGxvdAoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5wb3BwZWQtb3V0IHsKCQlvdmVyZmxvdzogYXV0bzsKCQl6LWluZGV4OiAxMDAwOwoJCXBvc2l0aW9uOiBmaXhlZDsKCQlyZXNpemU6IGJvdGg7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwcHg7CgkJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDBweDsKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIHsKCQlkaXNwbGF5OiBmbGV4OwoJCWZsZXgtZmxvdzogcm93IHdyYXA7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMTJweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMTJweDsKCQlwb3NpdGlvbjogZml4ZWQ7CgkJei1pbmRleDogMTAwMTsKCQljdXJzb3I6IG1vdmU7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCAtMTAwJSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgc3BhbiB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCWZsZXg6IDEKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyLmhpZGRlbiB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3BhbiB7CgkJcG9zaXRpb246IHJlbGF0aXZlOwoJfQoJLmNsaXBib2FyZC12YWx1ZSB7CgkJcGFkZGluZy1yaWdodDogNXB4OwoJCXBhZGRpbmctbGVmdDogMnB4OwoJCWN1cnNvcjogdGV4dDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZmlsZW5hbWUgewoJCWZsZXg6IDAgMCAxMDAlOwoJCXRleHQtYWxpZ246IGNlbnRlcjsKCQlib3JkZXItdG9wOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJbWFyZ2luLXRvcDogNXB4OwoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5maWxlbmFtZSB7CgkJbWFyZ2luLWxlZnQ6IDNweDsKCQl0ZXh0LWFsaWduOiBsZWZ0OwoJCW1pbi13aWR0aDogbWluKDYwJSwgbWluLWNvbnRlbnQpOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5maWxlc2F2ZSAuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgLmxhYmVsIHsKCQlmbGV4OiAwIDAgMDsKCX0KCS5jbGlwYm9hcmQtdmFsdWUuZm9ybWF0IHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7CgkJZmxleDogMSAwIGF1dG87CgkJbWluLXdpZHRoOiAzMHB4OwoJCW1hcmdpbi1yaWdodDogMTBweDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyB7CgkJZGlzcGxheTogaW5saW5lLWZsZXg7CgkJZmxleC1mbG93OiBjb2x1bW47CgkJcG9zaXRpb246IGFic29sdXRlOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJcGFkZGluZy1sZWZ0OiAzcHg7CgkJei1pbmRleDogMjAwMDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9uczpob3ZlciB7CgkJY3Vyc29yOiBwb2ludGVyOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCXBhZGRpbmc6IDNweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtM3B4LCAtNnB4KTsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyAuZm9ybWF0LW9wdGlvbiB7CgkJZGlzcGxheTogbm9uZTsKCX0KCWRpdi5mb3JtYXQtb3B0aW9uczpob3ZlciAuZm9ybWF0LW9wdGlvbiB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246bm90KC5zZWxlY3RlZCkgewoJCW1hcmdpbi10b3A6IDNweDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyAuZm9ybWF0LW9wdGlvbi5zZWxlY3RlZCB7CgkJb3JkZXI6IC0xOwoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5mb3JtYXQtb3B0aW9uOmhvdmVyIHsKCQliYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCX0KCXNwYW4uY29uZmlnLXZhbHVlIHsKCQlmb250LXdlaWdodDogbm9ybWFsOwoJCWNvbG9yOiB2YXIoLS1wbHV0by1vdXRwdXQtY29sb3IpOwoJCWRpc3BsYXk6IG5vbmU7CgkJcG9zaXRpb246IGFic29sdXRlOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCBjYWxjKC0xMDAlIC0gMTBweCkpOwoJCXBhZGRpbmc6IDVweDsKCX0KCS5sYWJlbCB7CgkJdXNlci1zZWxlY3Q6IG5vbmU7Cgl9CgkubGFiZWw6aG92ZXIgc3Bhbi5jb25maWctdmFsdWUgewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQltaW4td2lkdGg6IDE1MHB4OwoJfQoJLmNsaXBib2FyZC1zcGFuLm1hdGNoaW5nLWNvbmZpZyAubGFiZWwgewoJCWNvbG9yOiB2YXIoLS1jbS1tYWNyby1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZGlmZmVyZW50LWNvbmZpZyAubGFiZWwgewoJCWNvbG9yOiB2YXIoLS1jbS10YWctY29sb3IpOwoJCWZvbnQtd2VpZ2h0OiBib2xkOwoJfQo8L3N0eWxlPgpgKQoKbGV0IG9yaWdpbmFsX2hlaWdodCA9IHBsb3Rfb2JqLmxheW91dC5oZWlnaHQKbGV0IG9yaWdpbmFsX3dpZHRoID0gcGxvdF9vYmoubGF5b3V0LndpZHRoCi8vIEZvciB0aGUgaGVpZ2h0IHdlIGhhdmUgdG8gYWxzbyBwdXQgYSBmaXhlZCB2YWx1ZSBpbiBjYXNlIHRoZSBwbG90IGlzIHB1dCBvbiBhIG5vbi1maXhlZC1zaXplIGNvbnRhaW5lciAobGlrZSB0aGUgZGVmYXVsdCB3cmFwcGVyKQovLyBXZSBkZWZpbmUgYSB2YXJpYWJsZSB0byBjaGVjayB3aGV0aGVyIHdlIHN0aWxsIGhhdmUgdG8gcmVtb3ZlIHRoZSBmaXhlZCBoZWlnaHQKbGV0IHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IGZpcnN0UnVuCmxldCBjb250YWluZXJfaGVpZ2h0ID0gb3JpZ2luYWxfaGVpZ2h0ID8/IFBMT1QuY29udGFpbmVyX2hlaWdodCA/PyA0MDAKQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9IGNvbnRhaW5lcl9oZWlnaHQgKyAncHgnCgovLyBXZSBjcmVhdGUgYSBQcm9taXNlIHZlcnNpb24gb2Ygc2V0VGltZW91dApmdW5jdGlvbiBkZWxheShtcykgewogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpOwp9CgovLyBXZSBpbXBvcnQgaW50ZXJhY3QgZm9yIGRyYWdnaW5nL3Jlc2l6aW5nCmNvbnN0IHsgZGVmYXVsdDogaW50ZXJhY3QgfSA9IGF3YWl0IGltcG9ydCgnaHR0cHM6Ly9lc20uc2gvaW50ZXJhY3Rqc0AxLjEwLjE5JykKCgpmdW5jdGlvbiBnZXRJbWFnZU9wdGlvbnMoKSB7CiAgY29uc3QgbyA9IHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICByZXR1cm4gewogICAgZm9ybWF0OiBvLmZvcm1hdCA/PyAicG5nIiwKICAgIHdpZHRoOiBvLndpZHRoID8/IG9yaWdpbmFsX3dpZHRoLAogICAgaGVpZ2h0OiBvLmhlaWdodCA/PyBvcmlnaW5hbF9oZWlnaHQsCiAgICBzY2FsZTogby5zY2FsZSA/PyAxLAogICAgZmlsZW5hbWU6IG8uZmlsZW5hbWUgPz8gIm5ld3Bsb3QiLAogIH07Cn0KCmNvbnN0IENMSVBCT0FSRF9IRUFERVIgPQogIENPTlRBSU5FUi5xdWVyeVNlbGVjdG9yKCIucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciIpID8/CiAgQ09OVEFJTkVSLmluc2VydEFkamFjZW50RWxlbWVudCgKICAgICJhZnRlcmJlZ2luIiwKICAgIGh0bWxgPGRpdiBjbGFzcz0icGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBoaWRkZW4iPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gZm9ybWF0IgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZvcm1hdDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBmb3JtYXQiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gd2lkdGgiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+V2lkdGg6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgd2lkdGgiPjwvc3Bhbj5weDwvc3BhbgogICAgICA+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBoZWlnaHQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+SGVpZ2h0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGhlaWdodCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHNjYWxlIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPlNjYWxlOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIHNjYWxlIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2V0Ij5TZXQ8L2J1dHRvbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gdW5zZXQiPlVuc2V0PC9idXR0b24+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmaWxlbmFtZSIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5GaWxlbmFtZTo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBmaWxlbmFtZSI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICA8L2Rpdj5gCiAgKTsKCmZ1bmN0aW9uIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpIHsKICBjb25zdCB2YWxpZF9jbGFzc2VzID0gWwogICAgIm1pc3NpbmctY29uZmlnIiwKICAgICJtYXRjaGluZy1jb25maWciLAogICAgImRpZmZlcmVudC1jb25maWciLAogIF07CiAgZnVuY3Rpb24gc2V0Q2xhc3MoY2wpIHsKICAgIGZvciAoY29uc3QgbmFtZSBvZiB2YWxpZF9jbGFzc2VzKSB7CiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKG5hbWUsIG5hbWUgPT0gY2wpOwogICAgfQogIH0KICAvLyBXZSB1c2UgdGhlIGN1c3RvbSBnZXR0ZXJzIHdlJ2xsIHNldCB1cCBpbiB0aGUgY29udGFpbmVyCiAgY29uc3QgeyB1aV92YWx1ZSwgY29uZmlnX3ZhbHVlLCBjb25maWdfc3Bhbiwga2V5IH0gPSBjb250YWluZXI7CiAgaWYgKGNvbmZpZ192YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICBzZXRDbGFzcygibWlzc2luZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaXMgbm90IHByZXNlbnQgaW4gdGhlIGNvbmZpZy5gOwogIH0gZWxzZSBpZiAodWlfdmFsdWUgPT0gY29uZmlnX3ZhbHVlKSB7CiAgICBzZXRDbGFzcygibWF0Y2hpbmctY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGhhcyB0aGUgc2FtZSB2YWx1ZSBpbiB0aGUgY29uZmlnIGFuZCBpbiB0aGUgaGVhZGVyLmA7CiAgfSBlbHNlIHsKICAgIHNldENsYXNzKCJkaWZmZXJlbnQtY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGhhcyBhIGRpZmZlcmVudCB2YWx1ZSAoPGVtPiR7Y29uZmlnX3ZhbHVlfTwvZW0+KSBpbiB0aGUgY29uZmlnLmA7CiAgfQogIC8vIEFkZCBpbmZvIGFib3V0IHNldHRpbmcgYW5kIHVuc2V0dGluZwogIGNvbmZpZ19zcGFuLmluc2VydEFkamFjZW50SFRNTCgKICAgICJiZWZvcmVlbmQiLAogICAgYDxicj5DbGljayBvbiB0aGUgbGFiZWwgPGVtPjxiPm9uY2U8L2I+PC9lbT4gdG8gc2V0IHRoZSBjdXJyZW50IFVJIHZhbHVlIGluIHRoZSBjb25maWcuYAogICk7CiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIDxlbT48Yj50d2ljZTwvYj48L2VtPiB0byByZW1vdmUgdGhpcyBrZXkgZnJvbSB0aGUgY29uZmlnLmAKICApOwp9Cgpjb25zdCB2YWxpZF9mb3JtYXRzID0gWyJwbmciLCAic3ZnIiwgIndlYnAiLCAianBlZyIsICJmdWxsLWpzb24iXTsKZnVuY3Rpb24gaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHNwYW4sIGtleSwgdmFsdWUpIHsKICBjb25zdCBjb250YWluZXIgPSBzcGFuLmNsb3Nlc3QoIi5jbGlwYm9hcmQtc3BhbiIpOwogIHNwYW4uY29udGVudEVkaXRhYmxlID0ga2V5ID09PSAiZm9ybWF0IiA/ICJmYWxzZSIgOiAidHJ1ZSI7CiAgbGV0IHBhcnNlID0gKHgpID0+IHg7CiAgbGV0IHVwZGF0ZSA9ICh4KSA9PiAoc3Bhbi50ZXh0Q29udGVudCA9IHgpOwogIGlmIChrZXkgPT09ICJ3aWR0aCIgfHwga2V5ID09PSAiaGVpZ2h0IikgewogICAgcGFyc2UgPSAoeCkgPT4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KHgpKTsKICB9IGVsc2UgaWYgKGtleSA9PT0gInNjYWxlIikgewogICAgcGFyc2UgPSBwYXJzZUZsb2F0OwogIH0gZWxzZSBpZiAoa2V5ID09PSAiZm9ybWF0IikgewogICAgLy8gV2UgcmVtb3ZlIGNvbnRlbnRFZGl0YWJsZQogICAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSAiZmFsc2UiOwogICAgLy8gSGVyZSB3ZSBmaXJzdCBhZGQgdGhlIHN1YnNwYW5zIGZvciBlYWNoIG9wdGlvbgogICAgY29uc3Qgb3B0c19kaXYgPSBzcGFuLmFwcGVuZENoaWxkKGh0bWxgPGRpdiBjbGFzcz0iZm9ybWF0LW9wdGlvbnMiPjwvZGl2PmApOwogICAgZm9yIChjb25zdCBmbXQgb2YgdmFsaWRfZm9ybWF0cykgewogICAgICBjb25zdCBvcHQgPSBvcHRzX2Rpdi5hcHBlbmRDaGlsZCgKICAgICAgICBodG1sYDxzcGFuIGNsYXNzPSJmb3JtYXQtb3B0aW9uICR7Zm10fSI+JHtmbXR9PC9zcGFuPmAKICAgICAgKTsKICAgICAgb3B0Lm9uY2xpY2sgPSAoZSkgPT4gewogICAgICAgIHNwYW4udmFsdWUgPSBvcHQudGV4dENvbnRlbnQ7CiAgICAgIH07CiAgICB9CiAgICBwYXJzZSA9ICh4KSA9PiB7CiAgICAgIHJldHVybiB2YWxpZF9mb3JtYXRzLmluY2x1ZGVzKHgpID8geCA6IGxvY2FsVmFsdWU7CiAgICB9OwogICAgdXBkYXRlID0gKHgpID0+IHsKICAgICAgZm9yIChjb25zdCBvcHQgb2Ygb3B0c19kaXYuY2hpbGRyZW4pIHsKICAgICAgICBvcHQuY2xhc3NMaXN0LnRvZ2dsZSgic2VsZWN0ZWQiLCBvcHQudGV4dENvbnRlbnQgPT09IHgpOwogICAgICB9CiAgICB9OwogIH0gZWxzZSB7CiAgICAvLyBXZSBvbmx5IGhhdmUgZmlsZW5hbWUgaGVyZQogIH0KICBsZXQgbG9jYWxWYWx1ZTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBsb2NhbFZhbHVlOwogICAgfSwKICAgIHNldDogKHZhbCkgPT4gewogICAgICBpZiAodmFsICE9PSAiIikgewogICAgICAgIGxvY2FsVmFsdWUgPSBwYXJzZSh2YWwpOwogICAgICB9CiAgICAgIHVwZGF0ZShsb2NhbFZhbHVlKTsKICAgICAgY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcik7CiAgICB9LAogIH0pOwogIC8vIFdlIGFsc28gYXNzaWduIGEgbGlzdGVuZXIgc28gdGhhdCB0aGUgZWRpdGFibGUgaXMgYmx1cnJlZCB3aGVuIGVudGVyIGlzIHByZXNzZWQKICBzcGFuLm9ua2V5ZG93biA9IChlKSA9PiB7CiAgICBpZiAoZS5rZXlDb2RlID09PSAxMykgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHNwYW4uYmx1cigpOwogICAgfQogIH07CiAgc3Bhbi52YWx1ZSA9IHZhbHVlOwp9CgpmdW5jdGlvbiBpbml0aWFsaXplQ29uZmlnVmFsdWVTcGFuKHNwYW4sIGtleSkgewogIC8vIEhlcmUgd2UgbW9zdGx5IHdhbnQgdG8gZGVmaW5lIHRoZSBzZXR0ZXIgYW5kIGdldHRlcgogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwYW4sICJ2YWx1ZSIsIHsKICAgIGdldDogKCkgPT4gewogICAgICByZXR1cm4gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV07CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIC8vIGlmIHVuZGVmaW5lZCBpcyBwYXNzZWQsIHdlIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgb3B0aW9ucwogICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsKICAgICAgICBkZWxldGUgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV0gPSB2YWw7CiAgICAgIH0KICAgICAgY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcik7CiAgICB9LAogIH0pOwp9Cgpjb25zdCBjb25maWdfc3BhbnMgPSB7fTsKZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZ2V0SW1hZ2VPcHRpb25zKCkpKSB7CiAgY29uc3QgY29udGFpbmVyID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKGAuY2xpcGJvYXJkLXNwYW4uJHtrZXl9YCk7CiAgY29uc3QgbGFiZWwgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmxhYmVsIik7CiAgLy8gV2UgZ2l2ZSB0aGUgbGFiZWwgYSBmdW5jdGlvbiB0aGF0IG9uIHNpbmdsZSBjbGljayB3aWxsIHNldCB0aGUgY3VycmVudCB2YWx1ZSBhbmQgd2l0aCBkb3VibGUgY2xpY2sgd2lsbCB1bnNldCBpdAogIGxhYmVsLm9uY2xpY2sgPSBEdWFsQ2xpY2soCiAgICAoKSA9PiB7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBjb250YWluZXIudWlfdmFsdWU7CiAgICB9LAogICAgKGUpID0+IHsKICAgICAgY29uc29sZS5sb2coImUiLCBlKTsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gdW5kZWZpbmVkOwogICAgfQogICk7CiAgY29uc3QgdWlfdmFsdWVfc3BhbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXZhbHVlIik7CiAgY29uc3QgY29uZmlnX3ZhbHVlX3NwYW4gPQogICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jb25maWctdmFsdWUiKSA/PwogICAgbGFiZWwuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgICAiYWZ0ZXJiZWdpbiIsCiAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImNvbmZpZy12YWx1ZSI+PC9zcGFuPmAKICAgICk7CiAgLy8gQXNzaW5nIHRoZSB0d28gc3BhbnMgYXMgcHJvcGVydGllcyBvZiB0aGUgY29udGFpbmluZyBzcGFuCiAgY29udGFpbmVyLnVpX3NwYW4gPSB1aV92YWx1ZV9zcGFuOwogIGNvbnRhaW5lci5jb25maWdfc3BhbiA9IGNvbmZpZ192YWx1ZV9zcGFuOwogIGNvbnRhaW5lci5rZXkgPSBrZXk7CiAgY29uZmlnX3NwYW5zW2tleV0gPSBjb250YWluZXI7CiAgaWYgKGZpcnN0UnVuKSB7CiAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPQogICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPz8ge307CiAgICAvLyBXZSBkbyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHZhbHVlIHNwYW4KICAgIGluaXRpYWxpemVVSVZhbHVlU3Bhbih1aV92YWx1ZV9zcGFuLCBrZXksIHZhbHVlKTsKICAgIC8vIFRoZW4gd2UgaW5pdGlhbGl6ZSB0aGUgY29uZmlnIHZhbHVlCiAgICBpbml0aWFsaXplQ29uZmlnVmFsdWVTcGFuKGNvbmZpZ192YWx1ZV9zcGFuLCBrZXkpOwogICAgLy8gV2UgcHV0IHNvbWUgY29udmVuaWVuY2UgZ2V0dGVycy9zZXR0ZXJzCiAgICAvLyB1aV92YWx1ZSBmb3J3YXJkCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAidWlfdmFsdWUiLCB7CiAgICAgIGdldDogKCkgPT4gdWlfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgdWlfdmFsdWVfc3Bhbi52YWx1ZSA9IHZhbDsKICAgICAgfSwKICAgIH0pOwogICAgLy8gY29uZmlnX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJjb25maWdfdmFsdWUiLCB7CiAgICAgIGdldDogKCkgPT4gY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUsCiAgICAgIHNldDogKHZhbCkgPT4gewogICAgICAgIGNvbmZpZ192YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgfQp9CgovLyBUaGVzZSBvYmplY3RzIHdpbGwgY29udGFpbiB0aGUgZGVmYXVsdCB2YWx1ZQoKLy8gVGhpcyBjb2RlIHVwZGF0ZXMgdGhlIGltYWdlIG9wdGlvbnMgaW4gdGhlIFBMT1QgY29uZmlnIHdpdGggdGhlIHByb3ZpZGVkIG9uZXMKZnVuY3Rpb24gc2V0SW1hZ2VPcHRpb25zKG8pIHsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IG9ba2V5XTsKICB9Cn0KZnVuY3Rpb24gdW5zZXRJbWFnZU9wdGlvbnMoKSB7CiAgc2V0SW1hZ2VPcHRpb25zKHt9KTsKfQoKY29uc3Qgc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnNldCIpOwpjb25zdCB1bnNldF9idXR0b24gPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtc3Bhbi51bnNldCIpOwppZiAoZmlyc3RSdW4pIHsKICBzZXRfYnV0dG9uLm9uY2xpY2sgPSAoZSkgPT4gewogICAgZm9yIChjb25zdCBjb250YWluZXIgb2YgT2JqZWN0LnZhbHVlcyhjb25maWdfc3BhbnMpKSB7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBjb250YWluZXIudWlfdmFsdWU7CiAgICB9CiAgfTsKICB1bnNldF9idXR0b24ub25jbGljayA9IHVuc2V0SW1hZ2VPcHRpb25zOwp9CgovLyBXZSBhZGQgYSBmdW5jdGlvbiB0byBjaGVjayBpZiB0aGUgY2xpcGJvYXJkIGlzIHBvcHBlZCBvdXQKQ09OVEFJTkVSLmlzUG9wcGVkT3V0ID0gKCkgPT4gewogIHJldHVybiBDT05UQUlORVIuY2xhc3NMaXN0LmNvbnRhaW5zKCJwb3BwZWQtb3V0Iik7Cn07CgpDTElQQk9BUkRfSEVBREVSLm9ubW91c2Vkb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgaWYgKGV2ZW50LnRhcmdldC5tYXRjaGVzKCJzcGFuLmNsaXBib2FyZC12YWx1ZSIpKSB7CiAgICBjb25zb2xlLmxvZygiV2UgZG9uJ3QgbW92ZSEiKTsKICAgIHJldHVybjsKICB9CiAgY29uc3Qgc3RhcnQgPSB7CiAgICBsZWZ0OiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS5sZWZ0KSwKICAgIHRvcDogcGFyc2VGbG9hdChDT05UQUlORVIuc3R5bGUudG9wKSwKICAgIFg6IGV2ZW50LnBhZ2VYLAogICAgWTogZXZlbnQucGFnZVksCiAgfTsKICBmdW5jdGlvbiBtb3ZlQXQoZXZlbnQsIHN0YXJ0KSB7CiAgICBjb25zdCB0b3AgPSBldmVudC5wYWdlWSAtIHN0YXJ0LlkgKyBzdGFydC50b3AgKyAicHgiOwogICAgY29uc3QgbGVmdCA9IGV2ZW50LnBhZ2VYIC0gc3RhcnQuWCArIHN0YXJ0LmxlZnQgKyAicHgiOwogICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gbGVmdDsKICAgIENPTlRBSU5FUi5zdHlsZS5sZWZ0ID0gbGVmdDsKICAgIENPTlRBSU5FUi5zdHlsZS50b3AgPSB0b3A7CiAgfQoKICAvLyBtb3ZlIG91ciBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYmFsbCB1bmRlciB0aGUgcG9pbnRlcgogIG1vdmVBdChldmVudCwgc3RhcnQpOwogIGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGV2ZW50KSB7CiAgICBtb3ZlQXQoZXZlbnQsIHN0YXJ0KTsKICB9CgogIC8vIFdlIHVzZSB0aGlzIHRvIHJlbW92ZSB0aGUgbW91c2Vtb3ZlIHdoZW4gY2xpY2tpbmcgb3V0c2lkZSBvZiB0aGUgY29udGFpbmVyCiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgLy8gbW92ZSB0aGUgY29udGFpbmVyIG9uIG1vdXNlbW92ZQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIG9uTW91c2VNb3ZlLCB7CiAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLAogIH0pOwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAibW91c2Vkb3duIiwKICAgIChlKSA9PiB7CiAgICAgIGlmIChlLnRhcmdldC5jbG9zZXN0KCIucGx1dG9wbG90bHktY29udGFpbmVyIikgIT09IENPTlRBSU5FUikgewogICAgICAgIGNsZWFuVXAoKTsKICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9LAogICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0KICApOwoKICBmdW5jdGlvbiBjbGVhblVwKCkgewogICAgY29uc29sZS5sb2coImNsZWFuaW5nIHVwIHRoZSBwbG90IG1vdmUgbGlzdGVuZXIiKTsKICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gbnVsbDsKICB9CgogIC8vICgzKSBkcm9wIHRoZSBiYWxsLCByZW1vdmUgdW5uZWVkZWQgaGFuZGxlcnMKICBDTElQQk9BUkRfSEVBREVSLm9ubW91c2V1cCA9IGNsZWFuVXA7Cn07CgpmdW5jdGlvbiBzZW5kVG9DbGlwYm9hcmQoYmxvYikgewogIGlmICghbmF2aWdhdG9yLmNsaXBib2FyZCkgewogICAgYWxlcnQoCiAgICAgICJUaGUgQ2xpcGJvYXJkIEFQSSBkb2VzIG5vdCBzZWVtIHRvIGJlIGF2YWlsYWJsZSwgbWFrZSBzdXJlIHRoZSBQbHV0byBub3RlYm9vayBpcyBiZWluZyB1c2VkIGZyb20gZWl0aGVyIGxvY2FsaG9zdCBvciBhbiBodHRwcyBzb3VyY2UuIgogICAgKTsKICB9CiAgbmF2aWdhdG9yLmNsaXBib2FyZAogICAgLndyaXRlKFsKICAgICAgbmV3IENsaXBib2FyZEl0ZW0oewogICAgICAgIC8vIFRoZSBrZXkgaXMgZGV0ZXJtaW5lZCBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgYmxvYidzIHR5cGUuCiAgICAgICAgW2Jsb2IudHlwZV06IGJsb2IsCiAgICAgIH0pLAogICAgXSkKICAgIC50aGVuKAogICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgY29uc29sZS5sb2coIkFzeW5jOiBDb3B5aW5nIHRvIGNsaXBib2FyZCB3YXMgc3VjY2Vzc2Z1bCEiKTsKICAgICAgfSwKICAgICAgZnVuY3Rpb24gKGVycikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkFzeW5jOiBDb3VsZCBub3QgY29weSB0ZXh0OiAiLCBlcnIpOwogICAgICB9CiAgICApOwp9CgpmdW5jdGlvbiBjb3B5SW1hZ2VUb0NsaXBib2FyZCgpIHsKICAvLyBXZSBleHRyYWN0IHRoZSBpbWFnZSBvcHRpb25zIGZyb20gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMgKGlmIHRoZXkgZXhpc3QpCiAgY29uc3QgY29uZmlnID0ge307CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGxldCB2YWwgPQogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID8/CiAgICAgIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IGNvbnRhaW5lci51aV92YWx1ZSA6IHVuZGVmaW5lZCk7CiAgICAvLyBJZiB3ZSBoYXZlIHVuZGVmaW5lZCB3ZSBkb24ndCBjcmVhdGUgdGhlIGtleS4gV2UgYWxzbyBpZ25vcmUgZm9ybWF0IGJlY2F1c2UgdGhlIGNsaXBib2FyZCBvbmx5IHN1cHBvcnRzIHBuZy4KICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS50b0ltYWdlKFBMT1QsIGNvbmZpZykudGhlbihmdW5jdGlvbiAoZGF0YVVybCkgewogICAgZmV0Y2goZGF0YVVybCkKICAgICAgLnRoZW4oKHJlcykgPT4gcmVzLmJsb2IoKSkKICAgICAgLnRoZW4oKGJsb2IpID0+IHsKICAgICAgICBjb25zdCBwYXN0ZV9yZWNlaXZlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3Bhc3RlLXJlY2VpdmVyLnBsdXRvcGxvdGx5JykKICAgICAgICBpZiAocGFzdGVfcmVjZWl2ZXIpIHsKICAgICAgICAgIHBhc3RlX3JlY2VpdmVyLmF0dGFjaEltYWdlKGRhdGFVcmwsIENPTlRBSU5FUikKICAgICAgICB9CiAgICAgICAgc2VuZFRvQ2xpcGJvYXJkKGJsb2IpCiAgICAgIH0pOwogIH0pOwp9CgpmdW5jdGlvbiBzYXZlSW1hZ2VUb0ZpbGUoKSB7CiAgY29uc3QgY29uZmlnID0ge307CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGxldCB2YWwgPQogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID8/CiAgICAgIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IGNvbnRhaW5lci51aV92YWx1ZSA6IHVuZGVmaW5lZCk7CiAgICAvLyBJZiB3ZSBoYXZlIHVuZGVmaW5lZCB3ZSBkb24ndCBjcmVhdGUgdGhlIGtleS4KICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbmZpZ1trZXldID0gdmFsOwogIH0KICBQbG90bHkuZG93bmxvYWRJbWFnZShQTE9ULCBjb25maWcpOwp9CgpsZXQgY29udGFpbmVyX3JlY3QgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAsIHRvcDogMCwgbGVmdDogMCB9OwpmdW5jdGlvbiB1bnBvcF9jb250YWluZXIoY2wpIHsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZSgicG9wcGVkLW91dCIsIGZhbHNlKTsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgZmFsc2UpOwogIC8vIFdlIGZpeCB0aGUgaGVpZ2h0IGJhY2sgdG8gdGhlIHZhbHVlIGl0IGhhZCBiZWZvcmUgcG9wb3V0LCBhbHNvIHNldHRpbmcgdGhlIGZsYWcgdG8gc2lnbmFsIHRoYXQgdXBvbiBmaXJzdCByZXNpemUgd2UgcmVtb3ZlIHRoZSBmaXhlZCBpbmxpbmUtc3R5bGUKICBDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0ICsgInB4IjsKICByZW1vdmVfY29udGFpbmVyX3NpemUgPSB0cnVlOwogIC8vIFdlIHNldCB0aGUgb3RoZXIgZml4ZWQgaW5saW5lLXN0eWxlcyB0byBudWxsCiAgQ09OVEFJTkVSLnN0eWxlLndpZHRoID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9ICIiOwogIENPTlRBSU5FUi5zdHlsZS5sZWZ0ID0gIiI7CiAgLy8gV2UgYWxzbyByZW1vdmUgdGhlIENMSVBCT0FSRF9IRUFERVIKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLndpZHRoID0gIiI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gIiI7CiAgLy8gRmluYWxseSB3ZSByZW1vdmUgdGhlIGhpZGRlbiBjbGFzcyB0byB0aGUgaGVhZGVyCiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCB0cnVlKTsKICByZXR1cm47Cn0KZnVuY3Rpb24gcG9wb3V0X2NvbnRhaW5lcihvcHRzKSB7CiAgY29uc3QgY2wgPSBvcHRzPy5jbDsKICBjb25zdCB0YXJnZXRfY29udGFpbmVyX3NpemUgPSBvcHRzPy50YXJnZXRfY29udGFpbmVyX3NpemUgPz8ge307CiAgY29uc3QgdGFyZ2V0X3Bsb3Rfc2l6ZSA9IG9wdHM/LnRhcmdldF9wbG90X3NpemUgPz8ge307CiAgaWYgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICByZXR1cm4gdW5wb3BfY29udGFpbmVyKGNsKTsKICB9CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoY2wsIGNsID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IHRydWUpOwogIC8vIFdlIGV4dHJhY3QgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgY29udGFpbmVyLCBzYXZlIHRoZW0gYW5kIGZpeCB0aGVtCiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfSA9IENPTlRBSU5FUi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICBjb250YWluZXJfcmVjdCA9IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH07CiAgLy8gV2Ugc2F2ZSB0aGUgY3VycmVudCBwbG90IHNpemUgYmVmb3JlIHdlIHBvcCBhcyBpdCB3aWxsIGZpbGwgdGhlIHNjcmVlbgogIGNvbnN0IGN1cnJlbnRfcGxvdF9zaXplID0gewogICAgd2lkdGg6IFBMT1QuX2Z1bGxMYXlvdXQud2lkdGgsCiAgICBoZWlnaHQ6IFBMT1QuX2Z1bGxMYXlvdXQuaGVpZ2h0LAogIH07CiAgLy8gV2UgaGF2ZSB0byBzYXZlIHRoZSBwYWQgZGF0YSBiZWZvcmUgcG9wcGluZyBzbyB3ZSBjYW4gcmVzaXplIHByZWNpc2VseQogIGNvbnN0IHBhZCA9IHt9OwogIHBhZC51bnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZSgicG9wcGVkLW91dCIsIHRydWUpOwogIHBhZC5wb3BwZWQgPSBnZXRTaXplRGF0YSgpLmNvbnRhaW5lcl9wYWQ7CiAgLy8gV2UgZG8gdG9wIGFuZCBsZWZ0IGJhc2VkIG9uIHRoZSBjdXJyZW50IHJlY3QKICBmb3IgKGNvbnN0IGtleSBvZiBbInRvcCIsICJsZWZ0Il0pIHsKICAgIGNvbnN0IHN0YXJ0X3ZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNvbnRhaW5lcl9yZWN0W2tleV07CiAgICBsZXQgb2Zmc2V0ID0gMDsKICAgIGZvciAoY29uc3Qga2luZCBvZiBbInBhZGRpbmciLCAiYm9yZGVyIl0pIHsKICAgICAgb2Zmc2V0ICs9IHBhZC5wb3BwZWRba2luZF1ba2V5XSAtIHBhZC51bnBvcHBlZFtraW5kXVtrZXldOwogICAgfQogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSBzdGFydF92YWwgLSBvZmZzZXQgKyAicHgiOwogICAgaWYgKGtleSA9PT0gImxlZnQiKSB7CiAgICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGVba2V5XSA9IENPTlRBSU5FUi5zdHlsZVtrZXldOwogICAgfQogIH0KICAvLyBXZSBjb21wdXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGRlcGVuZGluZyBvbiBldmVudHVhbCBjb25maWcgZGF0YQogIGNvbnN0IGNzeiA9IGNvbXB1dGVDb250YWluZXJTaXplKHsKICAgIHdpZHRoOgogICAgICB0YXJnZXRfcGxvdF9zaXplLndpZHRoID8/CiAgICAgIGNvbmZpZ19zcGFucy53aWR0aC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6CiAgICAgIHRhcmdldF9wbG90X3NpemUuaGVpZ2h0ID8/CiAgICAgIGNvbmZpZ19zcGFucy5oZWlnaHQuY29uZmlnX3ZhbHVlID8/CiAgICAgIGN1cnJlbnRfcGxvdF9zaXplLmhlaWdodCwKICB9KTsKICBmb3IgKGNvbnN0IGtleSBvZiBbIndpZHRoIiwgImhlaWdodCJdKSB7CiAgICBjb25zdCB2YWwgPSB0YXJnZXRfY29udGFpbmVyX3NpemVba2V5XSA/PyBjc3pba2V5XTsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gdmFsICsgInB4IjsKICAgIGlmIChrZXkgPT09ICJ3aWR0aCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIENMSVBCT0FSRF9IRUFERVIuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgZmFsc2UpOwogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CgogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAibW91c2Vkb3duIiwKICAgIChlKSA9PiB7CiAgICAgIGlmIChlLnRhcmdldC5jbG9zZXN0KCIucGx1dG9wbG90bHktY29udGFpbmVyIikgIT09IENPTlRBSU5FUikgewogICAgICAgIHVucG9wX2NvbnRhaW5lcigpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7Cn0KCkNPTlRBSU5FUi5wb3BPdXQgPSBwb3BvdXRfY29udGFpbmVyOwoKZnVuY3Rpb24gRHVhbENsaWNrKHNpbmdsZV9mdW5jLCBkYmxfZnVuYykgewogIGxldCBuY2xpY2tzID0gMDsKICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHsKICAgIG5jbGlja3MgKz0gMTsKICAgIGlmIChuY2xpY2tzID4gMSkgewogICAgICBkYmxfZnVuYyguLi5hcmdzKTsKICAgICAgbmNsaWNrcyA9IDA7CiAgICB9IGVsc2UgewogICAgICBkZWxheSgzMDApLnRoZW4oKCkgPT4gewogICAgICAgIGlmIChuY2xpY2tzID09IDEpIHsKICAgICAgICAgIHNpbmdsZV9mdW5jKC4uLmFyZ3MpOwogICAgICAgIH0KICAgICAgICBuY2xpY2tzID0gMDsKICAgICAgfSk7CiAgICB9CiAgfTsKfQoKLy8gV2UgcmVtb3ZlIHRoZSBkZWZhdWx0IGRvd25sb2FkIGltYWdlIGJ1dHRvbgpwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSA9IF8udW5pb24oCiAgcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9SZW1vdmUsCiAgWyJ0b0ltYWdlIl0KKTsKLy8gV2UgYWRkIHRoZSBjdXN0b20gYnV0dG9uIHRvIHRoZSBtb2RlYmFyCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb0FkZCwKICBbCiAgICB7CiAgICAgIG5hbWU6ICJDb3B5IFBORyB0byBDbGlwYm9hcmQiLAogICAgICBpY29uOiB7CiAgICAgICAgaGVpZ2h0OiA1MjAsCiAgICAgICAgd2lkdGg6IDUyMCwKICAgICAgICBwYXRoOiAiTTI4MCA2NGg0MGMzNS4zIDAgNjQgMjguNyA2NCA2NFY0NDhjMCAzNS4zLTI4LjcgNjQtNjQgNjRINjRjLTM1LjMgMC02NC0yOC43LTY0LTY0VjEyOEMwIDkyLjcgMjguNyA2NCA2NCA2NGg0MCA5LjZDMTIxIDI3LjUgMTUzLjMgMCAxOTIgMHM3MSAyNy41IDc4LjQgNjRIMjgwek02NCAxMTJjLTguOCAwLTE2IDcuMi0xNiAxNlY0NDhjMCA4LjggNy4yIDE2IDE2IDE2SDMyMGM4LjggMCAxNi03LjIgMTYtMTZWMTI4YzAtOC44LTcuMi0xNi0xNi0xNkgzMDR2MjRjMCAxMy4zLTEwLjcgMjQtMjQgMjRIMTkyIDEwNGMtMTMuMyAwLTI0LTEwLjctMjQtMjRWMTEySDY0em0xMjgtOGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6IiwKICAgICAgfSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKGNvcHlJbWFnZVRvQ2xpcGJvYXJkLCAoKSA9PiB7CiAgICAgICAgcG9wb3V0X2NvbnRhaW5lcigpOwogICAgICB9KSwKICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICJEb3dubG9hZCBJbWFnZSIsCiAgICAgIGljb246IFBsb3RseS5JY29ucy5jYW1lcmEsCiAgICAgIGRpcmVjdGlvbjogInVwIiwKICAgICAgY2xpY2s6IER1YWxDbGljayhzYXZlSW1hZ2VUb0ZpbGUsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKHsgY2w6ICJmaWxlc2F2ZSIgfSk7CiAgICAgIH0pLAogICAgfSwKICBdCik7CgpmdW5jdGlvbiBnZXRPZmZzZXREYXRhKGVsKSB7CiAgbGV0IGNzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwsIG51bGwpOwogIGNvbnN0IG9kYXRhID0gewogICAgcGFkZGluZzogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdMZWZ0KSwKICAgICAgcmlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1JpZ2h0KSwKICAgICAgdG9wOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdUb3ApLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MucGFkZGluZ0JvdHRvbSksCiAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdMZWZ0KSArIHBhcnNlRmxvYXQoY3MucGFkZGluZ1JpZ2h0KSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdUb3ApICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgIH0sCiAgICBib3JkZXI6IHsKICAgICAgbGVmdDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgdG9wOiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSwKICAgICAgYm90dG9tOiBwYXJzZUZsb2F0KGNzLmJvcmRlckJvdHRvbVdpZHRoKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MuYm9yZGVyTGVmdFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyUmlnaHRXaWR0aCksCiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChjcy5ib3JkZXJUb3BXaWR0aCkgKyBwYXJzZUZsb2F0KGNzLmJvcmRlckJvdHRvbVdpZHRoKSwKICAgIH0KICB9OwogIGlmIChlbCA9PT0gUExPVCkgewogICAgLy8gRm9yIHRoZSBQTE9UIHdlIGFsc28gd2FudCB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgb2Zmc2V0CiAgICBvZGF0YS5vZmZzZXQgPSB7CiAgICAgIHRvcDogUExPVC5vZmZzZXRQYXJlbnQgPT0gQ09OVEFJTkVSID8gUExPVC5vZmZzZXRUb3AgOiAwLAogICAgICBsZWZ0OiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldExlZnQgOiAwLAogICAgfQogIH0KICByZXR1cm4gb2RhdGE7Cn0KZnVuY3Rpb24gZ2V0U2l6ZURhdGEoKSB7CiAgY29uc3QgZGF0YSA9IHsKICAgIHBsb3RfcGFkOiBnZXRPZmZzZXREYXRhKFBMT1QpLAogICAgcGxvdF9yZWN0OiBQTE9ULmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogICAgY29udGFpbmVyX3BhZDogZ2V0T2Zmc2V0RGF0YShDT05UQUlORVIpLAogICAgY29udGFpbmVyX3JlY3Q6IENPTlRBSU5FUi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICB9OwogIHJldHVybiBkYXRhOwp9CmZ1bmN0aW9uIGNvbXB1dGVDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICBjb25zdCBjb21wdXRlZF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICBjb25zdCBvZmZzZXRzID0gY29tcHV0ZWRfc2l6ZS5vZmZzZXRzOwoKICBjb25zdCBwbG90X2RhdGEgPSB7CiAgICB3aWR0aDogd2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCwKICAgIGhlaWdodDogaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH07CgogIHJldHVybiB7CiAgICB3aWR0aDogKHdpZHRoID8/IGNvbXB1dGVkX3NpemUud2lkdGgpICsgb2Zmc2V0cy53aWR0aCwKICAgIGhlaWdodDogKGhlaWdodCA/PyBjb21wdXRlZF9zaXplLmhlaWdodCkgKyBvZmZzZXRzLmhlaWdodCwKICAgIG5vQ2hhbmdlOiB3aWR0aCA9PSBjb21wdXRlZF9zaXplLndpZHRoICYmIGhlaWdodCA9PSBjb21wdXRlZF9zaXplLmhlaWdodCwKICB9Cn0KCi8vIFRoaXMgZnVuY3Rpb24gd2lsbCBjaGFuZ2UgdGhlIGNvbnRhaW5lciBzaXplIHNvIHRoYXQgdGhlIHJlc3VsdGluZyBwbG90IHdpbGwgYmUgbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIHNwZWNzCmZ1bmN0aW9uIGNoYW5nZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGlmICghQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIGNvbnNvbGUubG9nKCJUcmllZCB0byBjaGFuZ2UgY29udGFpbmVyIHNpemUgd2hlbiBub3QgcG9wcGVkLCBpZ25vcmluZyIpOwogICAgcmV0dXJuOwogIH0KCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhKTsKCiAgaWYgKGNzei5ub0NoYW5nZSkgewogICAgY29uc29sZS5sb2coIlNpemUgaXMgdGhlIHNhbWUgYXMgY3VycmVudCwgaWdub3JpbmciKTsKICAgIHJldHVybgogIH0KICAvLyBXZSBhcmUgbm93IGdvaW5nIHRvIHNldCBoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBjb250YWluZXIKICBmb3IgKGNvbnN0IGtleSBvZiBbIndpZHRoIiwgImhlaWdodCJdKSB7CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IGNzeltrZXldICsgInB4IjsKICB9Cn0KLy8gV2Ugbm93IGNyZWF0ZSB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIHVwZGF0ZSB0aGUgcGxvdCBiYXNlZCBvbiB0aGUgdmFsdWVzIHNwZWNpZmllZApmdW5jdGlvbiB1cGRhdGVGcm9tSGVhZGVyKCkgewogIGNvbnN0IGhlYWRlcl9kYXRhID0gewogICAgaGVpZ2h0OiBjb25maWdfc3BhbnMuaGVpZ2h0LnVpX3ZhbHVlLAogICAgd2lkdGg6IGNvbmZpZ19zcGFucy53aWR0aC51aV92YWx1ZSwKICB9OwogIGNoYW5nZUNvbnRhaW5lclNpemUoaGVhZGVyX2RhdGEpOwp9Ci8vIFdlIGFzc2lnbiB0aGlzIGZ1bmN0aW9uIHRvIHRoZSBvbmJsdXIgZXZlbnQgb2Ygd2lkdGggYW5kIGhlaWdodAppZiAoZmlyc3RSdW4pIHsKICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGNvbnRhaW5lci51aV9zcGFuLm9uYmx1ciA9IChlKSA9PiB7CiAgICAgIGNvbnRhaW5lci51aV92YWx1ZSA9IGNvbnRhaW5lci51aV9zcGFuLnRleHRDb250ZW50OwogICAgICB1cGRhdGVGcm9tSGVhZGVyKCk7CiAgICB9OwogIH0KfQovLyBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBwbG90IHNpemUgdG8gdXNlIGZvciByZWxheW91dCBhcyBhIGZ1bmN0aW9uIG9mIHRoZSBjb250YWluZXIgc2l6ZQpmdW5jdGlvbiBjb21wdXRlUGxvdFNpemUoZGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICAvLyBSZW1vdmUgUGFkZGluZwogIGNvbnN0IHsgY29udGFpbmVyX3BhZCwgcGxvdF9wYWQsIGNvbnRhaW5lcl9yZWN0IH0gPSBkYXRhOwogIGNvbnN0IG9mZnNldHMgPSB7CiAgICB3aWR0aDoKICAgICAgcGxvdF9wYWQucGFkZGluZy53aWR0aCArCiAgICAgIHBsb3RfcGFkLmJvcmRlci53aWR0aCArCiAgICAgIHBsb3RfcGFkLm9mZnNldC5sZWZ0ICsKICAgICAgY29udGFpbmVyX3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgY29udGFpbmVyX3BhZC5ib3JkZXIud2lkdGgsCiAgICBoZWlnaHQ6CiAgICAgIHBsb3RfcGFkLnBhZGRpbmcuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLmhlaWdodCArCiAgICAgIHBsb3RfcGFkLm9mZnNldC50b3AgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcuaGVpZ2h0ICsKICAgICAgY29udGFpbmVyX3BhZC5ib3JkZXIuaGVpZ2h0LAogIH07CiAgY29uc3Qgc3ogPSB7CiAgICB3aWR0aDogTWF0aC5yb3VuZChjb250YWluZXJfcmVjdC53aWR0aCAtIG9mZnNldHMud2lkdGgpLAogICAgaGVpZ2h0OiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LmhlaWdodCAtIG9mZnNldHMuaGVpZ2h0KSwKICAgIG9mZnNldHMsCiAgfTsKICByZXR1cm4gc3o7Cn0KCi8vIENyZWF0ZSB0aGUgcmVzaXplT2JzZXJ2ZXIgdG8gbWFrZSB0aGUgcGxvdCBldmVuIG1vcmUgcmVzcG9uc2l2ZSEgOm1hZ2ljOgpjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4gewogIGNvbnN0IHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKTsKICBjb25zdCB7Y29udGFpbmVyX3JlY3QsIGNvbnRhaW5lcl9wYWR9ID0gc2l6ZURhdGE7CiAgbGV0IHBsb3Rfc2l6ZSA9IGNvbXB1dGVQbG90U2l6ZShzaXplRGF0YSk7CiAgLy8gV2Ugc2F2ZSB0aGUgaGVpZ2h0IGluIHRoZSBQTE9UIG9iamVjdAogIFBMT1QuY29udGFpbmVyX2hlaWdodCA9IGNvbnRhaW5lcl9yZWN0LmhlaWdodDsKICAvLyBXZSBkZWFsIHdpdGggc29tZSBzdHVmZiBpZiB0aGUgY29udGFpbmVyIGlzIHBvcHBwZWQKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLndpZHRoID0gY29udGFpbmVyX3JlY3Qud2lkdGggKyAicHgiOwogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9IGNvbnRhaW5lcl9yZWN0LmxlZnQgKyAicHgiOwogIGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUgPSBwbG90X3NpemUuaGVpZ2h0OwogIGNvbmZpZ19zcGFucy53aWR0aC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS53aWR0aDsKICAvKiAKCQlUaGUgYWRkaXRpb24gb2YgdGhlIGludmFsaWQgYXJndW1lbnQgYHBsdXRvcmVzaXplYCBzZWVtcyB0byBmaXggdGhlIHByb2JsZW0gd2l0aCBjYWxsaW5nIGByZWxheW91dGAgc2ltcGx5IHdpdGggYHthdXRvc2l6ZTogdHJ1ZX1gIGFzIHVwZGF0ZSBicmVha2luZyBtb3VzZSByZWxheW91dCBldmVudHMgdHJhY2tpbmcuIAoJCVNlZSBodHRwczovL2dpdGh1Yi5jb20vcGxvdGx5L3Bsb3RseS5qcy9pc3N1ZXMvNjE1NiBmb3IgZGV0YWlscwoJCSovCiAgbGV0IGNvbmZpZyA9IHsKICAgIC8vIElmIHRoaXMgaXMgcG9wcGVkIG91dCwgd2UgaWdub3JlIHRoZSBvcmlnaW5hbCB3aWR0aC9oZWlnaHQKICAgIHdpZHRoOiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyB1bmRlZmluZWQgOiBvcmlnaW5hbF93aWR0aCkgPz8gcGxvdF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyB1bmRlZmluZWQgOiBvcmlnaW5hbF9oZWlnaHQpID8/IHBsb3Rfc2l6ZS5oZWlnaHQsCiAgICBwbHV0b3Jlc2l6ZTogdHJ1ZSwKICB9OwogIFBsb3RseS5yZWxheW91dChQTE9ULCBjb25maWcpLnRoZW4oKCkgPT4gewogICAgaWYgKHJlbW92ZV9jb250YWluZXJfc2l6ZSAmJiAhQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgdGhlIGZpcnN0IHJlc2l6ZSB1cG9uIHBsb3QgY3JlYXRpb24gdG8gYWxyZWFkeSBiZSB3aXRob3V0IGEgZml4ZWQgaGVpZ2h0CiAgICAgIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSAiIjsKICAgICAgQ09OVEFJTkVSLnN0eWxlLndpZHRoID0gIiI7CiAgICAgIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IGZhbHNlOwogICAgfQogIH0pOwp9KTsKCnJlc2l6ZU9ic2VydmVyLm9ic2VydmUoQ09OVEFJTkVSKTsKCgpQbG90bHkucmVhY3QoUExPVCwgcGxvdF9vYmopLnRoZW4oKCkgPT4gewoJLy8gQXNzaWduIHRoZSBQbG90bHkgZXZlbnQgbGlzdGVuZXJzCglmb3IgKGNvbnN0IFtrZXksIGxpc3RlbmVyX3ZlY10gb2YgT2JqZWN0LmVudHJpZXMocGxvdGx5X2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULm9uKGtleSwgbGlzdGVuZXIpCgkJfQoJfQoJLy8gQXNzaWduIHRoZSBKUyBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhqc19saXN0ZW5lcnMpKSB7CgkJZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcl92ZWMpIHsKCQkJUExPVC5hZGRFdmVudExpc3RlbmVyKGtleSwgbGlzdGVuZXIsIHsKCQkJCXNpZ25hbDogY29udHJvbGxlci5zaWduYWwKCQkJfSkKCQl9Cgl9Cn0KKQoKCmludmFsaWRhdGlvbi50aGVuKCgpID0+IHsKCS8vIFJlbW92ZSBhbGwgcGxvdGx5IGxpc3RlbmVycwoJUExPVC5yZW1vdmVBbGxMaXN0ZW5lcnMoKQoJLy8gUmVtb3ZlIGFsbCBKUyBsaXN0ZW5lcnMKCWNvbnRyb2xsZXIuYWJvcnQoKQoJLy8gUmVtb3ZlIHRoZSByZXNpemVPYnNlcnZlcgoJcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpCn0pCgoKCgkJcmV0dXJuIENPTlRBSU5FUgoJPC9zY3JpcHQ+CqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b/ITmTpOrBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkMWE4M2Q4OTctNzA1Yi00NDNkLTg5YTQtZWE1ZTNlNmEzYzA3uWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAARQ/7VwdWJsaXNoZWRfb2JqZWN0X2tleXOR2TU3YmNjMDViMC04MWRhLTExZWYtMjA0MC0zNTg1YzliNDk1NGYvMjA1Zjk5ODdkYThjNjMxYbhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQ0ZTE0MzRlMS02NzNmLTQyMDYtYTI3MS05ZWRlYzEwZWJkNmGKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52mqJCTxzY3JpcHQgaWQ9J3Bsb3RfMSc+CgkJLy8gV2Ugc3RhcnQgYnkgcHV0dGluZyBhbGwgdGhlIHZhcmlhYmxlIGludGVycG9sYXRpb24gaGVyZSBhdCB0aGUgYmVnaW5uaW5nCgkJLy8gV2UgaGF2ZSB0byBjb252ZXJ0IGFsbCB0eXBlZGFycmF5cyBpbiB0aGUgbGF5b3V0IHRvIG5vcm1hbCBhcnJheXMuIFNlZSBJc3N1ZSAjMjUKCQkvLyBXZSB1c2UgbG9kYXNoIGZvciB0aGlzIGZvciBjb21wYWN0bmVzcwoJCWZ1bmN0aW9uIHJlbW92ZVR5cGVkQXJyYXkobykgewoJCQlyZXR1cm4gXy5pc1R5cGVkQXJyYXkobykgPyBBcnJheS5mcm9tKG8pIDoKCQkJXy5pc1BsYWluT2JqZWN0KG8pID8gXy5tYXBWYWx1ZXMobywgcmVtb3ZlVHlwZWRBcnJheSkgOiAKCQkJbwoJCX0KCgkJLy8gUHVibGlzaCB0aGUgcGxvdCBvYmplY3QgdG8gSlMKCQlsZXQgcGxvdF9vYmogPSBfLnVwZGF0ZSgvKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIEFic3RyYWN0UGx1dG9EaW5nZXRqZXMuRGlzcGxheS5wdWJsaXNoZWRfdG9fanMgKi8gZ2V0UHVibGlzaGVkT2JqZWN0KCI3YmNjMDViMC04MWRhLTExZWYtMjA0MC0zNTg1YzliNDk1NGYvYjAxZTNhNjI4NjYzY2I2YyIpLCAibGF5b3V0IiwgcmVtb3ZlVHlwZWRBcnJheSkKCQkvLyBHZXQgdGhlIHBsb3RseSBsaXN0ZW5lcnMKCQljb25zdCBwbG90bHlfbGlzdGVuZXJzID0ge30KCQkvLyBHZXQgdGhlIEpTIGxpc3RlbmVycwoJCWNvbnN0IGpzX2xpc3RlbmVycyA9IHt9CgkJLy8gRGVhbCB3aXRoIGV2ZW50dWFsIGN1c3RvbSBjbGFzc2VzCgkJbGV0IGN1c3RvbV9jbGFzc2xpc3QgPSBbXQoKCgkJLy8gTG9hZCB0aGUgcGxvdGx5IGxpYnJhcnkKCQlsZXQgUGxvdGx5ID0gdW5kZWZpbmVkCgkJdHJ5IHsKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoIi4vcGxvdGx5anMvcGxvdGx5anMtMi4yNi4yLm1pbi5qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0gY2F0Y2ggKGUpIHsKCQkJY29uc29sZS5sb2coIkxvY2FsIGxvYWQgZmFpbGVkLCB0cnlpbmcgd2l0aCB0aGUgd2ViIGVzbS5zaCB2ZXJzaW9uIikKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoImh0dHBzOi8vZXNtLnNoL3YxMzUvcGxvdGx5LmpzLWRpc3QtbWluQDIuMjYuMi9lc25leHQvcGxvdGx5LmpzLWRpc3QtbWluLm1qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0KCgkJLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0byBmb3JjZSBsb2NhbCBtYXRoamF4IGZvbnQgY2FjaGUKCQlpZiAoZmFsc2UgJiYgd2luZG93Py5NYXRoSmF4Py5jb25maWc/LnN2Zz8uZm9udENhY2hlID09PSAnZ2xvYmFsJykgewoJCQl3aW5kb3cuTWF0aEpheC5jb25maWcuc3ZnLmZvbnRDYWNoZSA9ICdsb2NhbCcKCQl9CgoJCS8vIEZsYWcgdG8gY2hlY2sgaWYgdGhpcyBjZWxsIHdhcyAgbWFudWFsbHkgcmFuIG9yIHJlYWN0aXZlbHkgcmFuCmNvbnN0IGZpcnN0UnVuID0gdGhpcyA/IGZhbHNlIDogdHJ1ZQpjb25zdCBDT05UQUlORVIgPSB0aGlzID8/IGh0bWxgPGRpdiBjbGFzcz0ncGx1dG9wbG90bHktY29udGFpbmVyJz5gCmNvbnN0IFBMT1QgPSBDT05UQUlORVIucXVlcnlTZWxlY3RvcignLmpzLXBsb3RseS1wbG90JykgPz8gQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgPGRpdj5gKQpjb25zdCBwYXJlbnQgPSBDT05UQUlORVIucGFyZW50RWxlbWVudAovLyBXZSB1c2UgYSBjb250cm9sbGVyIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lcnMgdXBvbiBpbnZhbGlkYXRpb24KY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKQovLyBXZSBoYXZlIHRvIGFkZCB0aGlzIHRvIGtlZXAgc3VwcG9ydGluZyBAYmluZCB3aXRoIHRoZSBvbGQgQVBJIHVzaW5nIFBMT1QKUExPVC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChlKSA9PiB7CglDT05UQUlORVIudmFsdWUgPSBQTE9ULnZhbHVlCglpZiAoZS5idWJibGVzKSB7CgkJcmV0dXJuCgl9CglDT05UQUlORVIuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2lucHV0JykpCn0sIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KQoKCS8vIFRoaXMgY3JlYXRlIHRoZSBzdHlsZSBzdWJkaXYgb24gZmlyc3QgcnVuCglmaXJzdFJ1biAmJiBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGAKCTxzdHlsZT4KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgewoJCXdpZHRoOiAxMDAlOwoJCWhlaWdodDogMTAwJTsKCQltaW4taGVpZ2h0OiAwOwoJCW1pbi13aWR0aDogMDsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgLmpzLXBsb3RseS1wbG90IC5wbG90bHkgZGl2IHsKCQltYXJnaW46IDAgYXV0bzsgLy8gVGhpcyBjZW50ZXJzIHRoZSBwbG90Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLnBvcHBlZC1vdXQgewoJCW92ZXJmbG93OiBhdXRvOwoJCXotaW5kZXg6IDEwMDA7CgkJcG9zaXRpb246IGZpeGVkOwoJCXJlc2l6ZTogYm90aDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDBweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMHB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgewoJCWRpc3BsYXk6IGZsZXg7CgkJZmxleC1mbG93OiByb3cgd3JhcDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAxMnB4OwoJCXBvc2l0aW9uOiBmaXhlZDsKCQl6LWluZGV4OiAxMDAxOwoJCWN1cnNvcjogbW92ZTsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIC0xMDAlKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBzcGFuIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJZmxleDogMQoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIuaGlkZGVuIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuIHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlIHsKCQlwYWRkaW5nLXJpZ2h0OiA1cHg7CgkJcGFkZGluZy1sZWZ0OiAycHg7CgkJY3Vyc29yOiB0ZXh0OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZmxleDogMCAwIDEwMCU7CgkJdGV4dC1hbGlnbjogY2VudGVyOwoJCWJvcmRlci10b3A6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQltYXJnaW4tdG9wOiA1cHg7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZpbGVuYW1lIHsKCQltYXJnaW4tbGVmdDogM3B4OwoJCXRleHQtYWxpZ246IGxlZnQ7CgkJbWluLXdpZHRoOiBtaW4oNjAlLCBtaW4tY29udGVudCk7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCAubGFiZWwgewoJCWZsZXg6IDAgMCAwOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5mb3JtYXQgewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCQlmbGV4OiAxIDAgYXV0bzsKCQltaW4td2lkdGg6IDMwcHg7CgkJbWFyZ2luLXJpZ2h0OiAxMHB4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCQlmbGV4LWZsb3c6IGNvbHVtbjsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlwYWRkaW5nLWxlZnQ6IDNweDsKCQl6LWluZGV4OiAyMDAwOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIHsKCQljdXJzb3I6IHBvaW50ZXI7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJcGFkZGluZzogM3B4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKC0zcHgsIC02cHgpOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpub3QoLnNlbGVjdGVkKSB7CgkJbWFyZ2luLXRvcDogM3B4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uLnNlbGVjdGVkIHsKCQlvcmRlcjogLTE7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246aG92ZXIgewoJCWJhY2tncm91bmQtY29sb3I6IHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJfQoJc3Bhbi5jb25maWctdmFsdWUgewoJCWZvbnQtd2VpZ2h0OiBub3JtYWw7CgkJY29sb3I6IHZhcigtLXBsdXRvLW91dHB1dC1jb2xvcik7CgkJZGlzcGxheTogbm9uZTsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIGNhbGMoLTEwMCUgLSAxMHB4KSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLmxhYmVsIHsKCQl1c2VyLXNlbGVjdDogbm9uZTsKCX0KCS5sYWJlbDpob3ZlciBzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCW1pbi13aWR0aDogMTUwcHg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4ubWF0Y2hpbmctY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLW1hY3JvLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5kaWZmZXJlbnQtY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLXRhZy1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9Cjwvc3R5bGU+CmApCgpsZXQgb3JpZ2luYWxfaGVpZ2h0ID0gcGxvdF9vYmoubGF5b3V0LmhlaWdodApsZXQgb3JpZ2luYWxfd2lkdGggPSBwbG90X29iai5sYXlvdXQud2lkdGgKLy8gRm9yIHRoZSBoZWlnaHQgd2UgaGF2ZSB0byBhbHNvIHB1dCBhIGZpeGVkIHZhbHVlIGluIGNhc2UgdGhlIHBsb3QgaXMgcHV0IG9uIGEgbm9uLWZpeGVkLXNpemUgY29udGFpbmVyIChsaWtlIHRoZSBkZWZhdWx0IHdyYXBwZXIpCi8vIFdlIGRlZmluZSBhIHZhcmlhYmxlIHRvIGNoZWNrIHdoZXRoZXIgd2Ugc3RpbGwgaGF2ZSB0byByZW1vdmUgdGhlIGZpeGVkIGhlaWdodApsZXQgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmlyc3RSdW4KbGV0IGNvbnRhaW5lcl9oZWlnaHQgPSBvcmlnaW5hbF9oZWlnaHQgPz8gUExPVC5jb250YWluZXJfaGVpZ2h0ID8/IDQwMApDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX2hlaWdodCArICdweCcKCi8vIFdlIGNyZWF0ZSBhIFByb21pc2UgdmVyc2lvbiBvZiBzZXRUaW1lb3V0CmZ1bmN0aW9uIGRlbGF5KG1zKSB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7Cn0KCi8vIFdlIGltcG9ydCBpbnRlcmFjdCBmb3IgZHJhZ2dpbmcvcmVzaXppbmcKY29uc3QgeyBkZWZhdWx0OiBpbnRlcmFjdCB9ID0gYXdhaXQgaW1wb3J0KCdodHRwczovL2VzbS5zaC9pbnRlcmFjdGpzQDEuMTAuMTknKQoKCmZ1bmN0aW9uIGdldEltYWdlT3B0aW9ucygpIHsKICBjb25zdCBvID0gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogIHJldHVybiB7CiAgICBmb3JtYXQ6IG8uZm9ybWF0ID8/ICJwbmciLAogICAgd2lkdGg6IG8ud2lkdGggPz8gb3JpZ2luYWxfd2lkdGgsCiAgICBoZWlnaHQ6IG8uaGVpZ2h0ID8/IG9yaWdpbmFsX2hlaWdodCwKICAgIHNjYWxlOiBvLnNjYWxlID8/IDEsCiAgICBmaWxlbmFtZTogby5maWxlbmFtZSA/PyAibmV3cGxvdCIsCiAgfTsKfQoKY29uc3QgQ0xJUEJPQVJEX0hFQURFUiA9CiAgQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoIi5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIikgPz8KICBDT05UQUlORVIuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgImFmdGVyYmVnaW4iLAogICAgaHRtbGA8ZGl2IGNsYXNzPSJwbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIGhpZGRlbiI+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmb3JtYXQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+Rm9ybWF0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZvcm1hdCI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB3aWR0aCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5XaWR0aDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSB3aWR0aCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGhlaWdodCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5IZWlnaHQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgaGVpZ2h0Ij48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2NhbGUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+U2NhbGU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgc2NhbGUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzZXQiPlNldDwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB1bnNldCI+VW5zZXQ8L2J1dHRvbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZpbGVuYW1lIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZpbGVuYW1lOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZpbGVuYW1lIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgIDwvZGl2PmAKICApOwoKZnVuY3Rpb24gY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcikgewogIGNvbnN0IHZhbGlkX2NsYXNzZXMgPSBbCiAgICAibWlzc2luZy1jb25maWciLAogICAgIm1hdGNoaW5nLWNvbmZpZyIsCiAgICAiZGlmZmVyZW50LWNvbmZpZyIsCiAgXTsKICBmdW5jdGlvbiBzZXRDbGFzcyhjbCkgewogICAgZm9yIChjb25zdCBuYW1lIG9mIHZhbGlkX2NsYXNzZXMpIHsKICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUobmFtZSwgbmFtZSA9PSBjbCk7CiAgICB9CiAgfQogIC8vIFdlIHVzZSB0aGUgY3VzdG9tIGdldHRlcnMgd2UnbGwgc2V0IHVwIGluIHRoZSBjb250YWluZXIKICBjb25zdCB7IHVpX3ZhbHVlLCBjb25maWdfdmFsdWUsIGNvbmZpZ19zcGFuLCBrZXkgfSA9IGNvbnRhaW5lcjsKICBpZiAoY29uZmlnX3ZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgIHNldENsYXNzKCJtaXNzaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBpcyBub3QgcHJlc2VudCBpbiB0aGUgY29uZmlnLmA7CiAgfSBlbHNlIGlmICh1aV92YWx1ZSA9PSBjb25maWdfdmFsdWUpIHsKICAgIHNldENsYXNzKCJtYXRjaGluZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIHRoZSBzYW1lIHZhbHVlIGluIHRoZSBjb25maWcgYW5kIGluIHRoZSBoZWFkZXIuYDsKICB9IGVsc2UgewogICAgc2V0Q2xhc3MoImRpZmZlcmVudC1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIGEgZGlmZmVyZW50IHZhbHVlICg8ZW0+JHtjb25maWdfdmFsdWV9PC9lbT4pIGluIHRoZSBjb25maWcuYDsKICB9CiAgLy8gQWRkIGluZm8gYWJvdXQgc2V0dGluZyBhbmQgdW5zZXR0aW5nCiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIG9uIHRoZSBsYWJlbCA8ZW0+PGI+b25jZTwvYj48L2VtPiB0byBzZXQgdGhlIGN1cnJlbnQgVUkgdmFsdWUgaW4gdGhlIGNvbmZpZy5gCiAgKTsKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgPGVtPjxiPnR3aWNlPC9iPjwvZW0+IHRvIHJlbW92ZSB0aGlzIGtleSBmcm9tIHRoZSBjb25maWcuYAogICk7Cn0KCmNvbnN0IHZhbGlkX2Zvcm1hdHMgPSBbInBuZyIsICJzdmciLCAid2VicCIsICJqcGVnIiwgImZ1bGwtanNvbiJdOwpmdW5jdGlvbiBpbml0aWFsaXplVUlWYWx1ZVNwYW4oc3Bhbiwga2V5LCB2YWx1ZSkgewogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSBrZXkgPT09ICJmb3JtYXQiID8gImZhbHNlIiA6ICJ0cnVlIjsKICBsZXQgcGFyc2UgPSAoeCkgPT4geDsKICBsZXQgdXBkYXRlID0gKHgpID0+IChzcGFuLnRleHRDb250ZW50ID0geCk7CiAgaWYgKGtleSA9PT0gIndpZHRoIiB8fCBrZXkgPT09ICJoZWlnaHQiKSB7CiAgICBwYXJzZSA9ICh4KSA9PiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoeCkpOwogIH0gZWxzZSBpZiAoa2V5ID09PSAic2NhbGUiKSB7CiAgICBwYXJzZSA9IHBhcnNlRmxvYXQ7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAvLyBXZSByZW1vdmUgY29udGVudEVkaXRhYmxlCiAgICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9ICJmYWxzZSI7CiAgICAvLyBIZXJlIHdlIGZpcnN0IGFkZCB0aGUgc3Vic3BhbnMgZm9yIGVhY2ggb3B0aW9uCiAgICBjb25zdCBvcHRzX2RpdiA9IHNwYW4uYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2IGNsYXNzPSJmb3JtYXQtb3B0aW9ucyI+PC9kaXY+YCk7CiAgICBmb3IgKGNvbnN0IGZtdCBvZiB2YWxpZF9mb3JtYXRzKSB7CiAgICAgIGNvbnN0IG9wdCA9IG9wdHNfZGl2LmFwcGVuZENoaWxkKAogICAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImZvcm1hdC1vcHRpb24gJHtmbXR9Ij4ke2ZtdH08L3NwYW4+YAogICAgICApOwogICAgICBvcHQub25jbGljayA9IChlKSA9PiB7CiAgICAgICAgc3Bhbi52YWx1ZSA9IG9wdC50ZXh0Q29udGVudDsKICAgICAgfTsKICAgIH0KICAgIHBhcnNlID0gKHgpID0+IHsKICAgICAgcmV0dXJuIHZhbGlkX2Zvcm1hdHMuaW5jbHVkZXMoeCkgPyB4IDogbG9jYWxWYWx1ZTsKICAgIH07CiAgICB1cGRhdGUgPSAoeCkgPT4gewogICAgICBmb3IgKGNvbnN0IG9wdCBvZiBvcHRzX2Rpdi5jaGlsZHJlbikgewogICAgICAgIG9wdC5jbGFzc0xpc3QudG9nZ2xlKCJzZWxlY3RlZCIsIG9wdC50ZXh0Q29udGVudCA9PT0geCk7CiAgICAgIH0KICAgIH07CiAgfSBlbHNlIHsKICAgIC8vIFdlIG9ubHkgaGF2ZSBmaWxlbmFtZSBoZXJlCiAgfQogIGxldCBsb2NhbFZhbHVlOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIGxvY2FsVmFsdWU7CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIGlmICh2YWwgIT09ICIiKSB7CiAgICAgICAgbG9jYWxWYWx1ZSA9IHBhcnNlKHZhbCk7CiAgICAgIH0KICAgICAgdXBkYXRlKGxvY2FsVmFsdWUpOwogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7CiAgLy8gV2UgYWxzbyBhc3NpZ24gYSBsaXN0ZW5lciBzbyB0aGF0IHRoZSBlZGl0YWJsZSBpcyBibHVycmVkIHdoZW4gZW50ZXIgaXMgcHJlc3NlZAogIHNwYW4ub25rZXlkb3duID0gKGUpID0+IHsKICAgIGlmIChlLmtleUNvZGUgPT09IDEzKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgc3Bhbi5ibHVyKCk7CiAgICB9CiAgfTsKICBzcGFuLnZhbHVlID0gdmFsdWU7Cn0KCmZ1bmN0aW9uIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oc3Bhbiwga2V5KSB7CiAgLy8gSGVyZSB3ZSBtb3N0bHkgd2FudCB0byBkZWZpbmUgdGhlIHNldHRlciBhbmQgZ2V0dGVyCiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgLy8gaWYgdW5kZWZpbmVkIGlzIHBhc3NlZCwgd2UgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBvcHRpb25zCiAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGRlbGV0ZSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XSA9IHZhbDsKICAgICAgfQogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7Cn0KCmNvbnN0IGNvbmZpZ19zcGFucyA9IHt9Owpmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhnZXRJbWFnZU9wdGlvbnMoKSkpIHsKICBjb25zdCBjb250YWluZXIgPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoYC5jbGlwYm9hcmQtc3Bhbi4ke2tleX1gKTsKICBjb25zdCBsYWJlbCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIubGFiZWwiKTsKICAvLyBXZSBnaXZlIHRoZSBsYWJlbCBhIGZ1bmN0aW9uIHRoYXQgb24gc2luZ2xlIGNsaWNrIHdpbGwgc2V0IHRoZSBjdXJyZW50IHZhbHVlIGFuZCB3aXRoIGRvdWJsZSBjbGljayB3aWxsIHVuc2V0IGl0CiAgbGFiZWwub25jbGljayA9IER1YWxDbGljaygKICAgICgpID0+IHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0sCiAgICAoZSkgPT4gewogICAgICBjb25zb2xlLmxvZygiZSIsIGUpOwogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSB1bmRlZmluZWQ7CiAgICB9CiAgKTsKICBjb25zdCB1aV92YWx1ZV9zcGFuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtdmFsdWUiKTsKICBjb25zdCBjb25maWdfdmFsdWVfc3BhbiA9CiAgICBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNvbmZpZy12YWx1ZSIpID8/CiAgICBsYWJlbC5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAgICJhZnRlcmJlZ2luIiwKICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iY29uZmlnLXZhbHVlIj48L3NwYW4+YAogICAgKTsKICAvLyBBc3NpbmcgdGhlIHR3byBzcGFucyBhcyBwcm9wZXJ0aWVzIG9mIHRoZSBjb250YWluaW5nIHNwYW4KICBjb250YWluZXIudWlfc3BhbiA9IHVpX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmNvbmZpZ19zcGFuID0gY29uZmlnX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmtleSA9IGtleTsKICBjb25maWdfc3BhbnNba2V5XSA9IGNvbnRhaW5lcjsKICBpZiAoZmlyc3RSdW4pIHsKICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA9CiAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICAgIC8vIFdlIGRvIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdmFsdWUgc3BhbgogICAgaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHVpX3ZhbHVlX3NwYW4sIGtleSwgdmFsdWUpOwogICAgLy8gVGhlbiB3ZSBpbml0aWFsaXplIHRoZSBjb25maWcgdmFsdWUKICAgIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oY29uZmlnX3ZhbHVlX3NwYW4sIGtleSk7CiAgICAvLyBXZSBwdXQgc29tZSBjb252ZW5pZW5jZSBnZXR0ZXJzL3NldHRlcnMKICAgIC8vIHVpX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJ1aV92YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiB1aV92YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICB1aV92YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgICAvLyBjb25maWdfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgImNvbmZpZ192YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICB9Cn0KCi8vIFRoZXNlIG9iamVjdHMgd2lsbCBjb250YWluIHRoZSBkZWZhdWx0IHZhbHVlCgovLyBUaGlzIGNvZGUgdXBkYXRlcyB0aGUgaW1hZ2Ugb3B0aW9ucyBpbiB0aGUgUExPVCBjb25maWcgd2l0aCB0aGUgcHJvdmlkZWQgb25lcwpmdW5jdGlvbiBzZXRJbWFnZU9wdGlvbnMobykgewogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gb1trZXldOwogIH0KfQpmdW5jdGlvbiB1bnNldEltYWdlT3B0aW9ucygpIHsKICBzZXRJbWFnZU9wdGlvbnMoe30pOwp9Cgpjb25zdCBzZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4uc2V0Iik7CmNvbnN0IHVuc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnVuc2V0Iik7CmlmIChmaXJzdFJ1bikgewogIHNldF9idXR0b24ub25jbGljayA9IChlKSA9PiB7CiAgICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0KICB9OwogIHVuc2V0X2J1dHRvbi5vbmNsaWNrID0gdW5zZXRJbWFnZU9wdGlvbnM7Cn0KCi8vIFdlIGFkZCBhIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBjbGlwYm9hcmQgaXMgcG9wcGVkIG91dApDT05UQUlORVIuaXNQb3BwZWRPdXQgPSAoKSA9PiB7CiAgcmV0dXJuIENPTlRBSU5FUi5jbGFzc0xpc3QuY29udGFpbnMoInBvcHBlZC1vdXQiKTsKfTsKCkNMSVBCT0FSRF9IRUFERVIub25tb3VzZWRvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHsKICBpZiAoZXZlbnQudGFyZ2V0Lm1hdGNoZXMoInNwYW4uY2xpcGJvYXJkLXZhbHVlIikpIHsKICAgIGNvbnNvbGUubG9nKCJXZSBkb24ndCBtb3ZlISIpOwogICAgcmV0dXJuOwogIH0KICBjb25zdCBzdGFydCA9IHsKICAgIGxlZnQ6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLmxlZnQpLAogICAgdG9wOiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS50b3ApLAogICAgWDogZXZlbnQucGFnZVgsCiAgICBZOiBldmVudC5wYWdlWSwKICB9OwogIGZ1bmN0aW9uIG1vdmVBdChldmVudCwgc3RhcnQpIHsKICAgIGNvbnN0IHRvcCA9IGV2ZW50LnBhZ2VZIC0gc3RhcnQuWSArIHN0YXJ0LnRvcCArICJweCI7CiAgICBjb25zdCBsZWZ0ID0gZXZlbnQucGFnZVggLSBzdGFydC5YICsgc3RhcnQubGVmdCArICJweCI7CiAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9IHRvcDsKICB9CgogIC8vIG1vdmUgb3VyIGFic29sdXRlbHkgcG9zaXRpb25lZCBiYWxsIHVuZGVyIHRoZSBwb2ludGVyCiAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQpIHsKICAgIG1vdmVBdChldmVudCwgc3RhcnQpOwogIH0KCiAgLy8gV2UgdXNlIHRoaXMgdG8gcmVtb3ZlIHRoZSBtb3VzZW1vdmUgd2hlbiBjbGlja2luZyBvdXRzaWRlIG9mIHRoZSBjb250YWluZXIKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICAvLyBtb3ZlIHRoZSBjb250YWluZXIgb24gbW91c2Vtb3ZlCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgb25Nb3VzZU1vdmUsIHsKICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsCiAgfSk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgY2xlYW5VcCgpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7CgogIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICBjb25zb2xlLmxvZygiY2xlYW5pbmcgdXAgdGhlIHBsb3QgbW92ZSBsaXN0ZW5lciIpOwogICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBudWxsOwogIH0KCiAgLy8gKDMpIGRyb3AgdGhlIGJhbGwsIHJlbW92ZSB1bm5lZWRlZCBoYW5kbGVycwogIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gY2xlYW5VcDsKfTsKCmZ1bmN0aW9uIHNlbmRUb0NsaXBib2FyZChibG9iKSB7CiAgaWYgKCFuYXZpZ2F0b3IuY2xpcGJvYXJkKSB7CiAgICBhbGVydCgKICAgICAgIlRoZSBDbGlwYm9hcmQgQVBJIGRvZXMgbm90IHNlZW0gdG8gYmUgYXZhaWxhYmxlLCBtYWtlIHN1cmUgdGhlIFBsdXRvIG5vdGVib29rIGlzIGJlaW5nIHVzZWQgZnJvbSBlaXRoZXIgbG9jYWxob3N0IG9yIGFuIGh0dHBzIHNvdXJjZS4iCiAgICApOwogIH0KICBuYXZpZ2F0b3IuY2xpcGJvYXJkCiAgICAud3JpdGUoWwogICAgICBuZXcgQ2xpcGJvYXJkSXRlbSh7CiAgICAgICAgLy8gVGhlIGtleSBpcyBkZXRlcm1pbmVkIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBibG9iJ3MgdHlwZS4KICAgICAgICBbYmxvYi50eXBlXTogYmxvYiwKICAgICAgfSksCiAgICBdKQogICAgLnRoZW4oCiAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICBjb25zb2xlLmxvZygiQXN5bmM6IENvcHlpbmcgdG8gY2xpcGJvYXJkIHdhcyBzdWNjZXNzZnVsISIpOwogICAgICB9LAogICAgICBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiQXN5bmM6IENvdWxkIG5vdCBjb3B5IHRleHQ6ICIsIGVycik7CiAgICAgIH0KICAgICk7Cn0KCmZ1bmN0aW9uIGNvcHlJbWFnZVRvQ2xpcGJvYXJkKCkgewogIC8vIFdlIGV4dHJhY3QgdGhlIGltYWdlIG9wdGlvbnMgZnJvbSB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycyAoaWYgdGhleSBleGlzdCkKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LiBXZSBhbHNvIGlnbm9yZSBmb3JtYXQgYmVjYXVzZSB0aGUgY2xpcGJvYXJkIG9ubHkgc3VwcG9ydHMgcG5nLgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gImZvcm1hdCIpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LnRvSW1hZ2UoUExPVCwgY29uZmlnKS50aGVuKGZ1bmN0aW9uIChkYXRhVXJsKSB7CiAgICBmZXRjaChkYXRhVXJsKQogICAgICAudGhlbigocmVzKSA9PiByZXMuYmxvYigpKQogICAgICAudGhlbigoYmxvYikgPT4gewogICAgICAgIGNvbnN0IHBhc3RlX3JlY2VpdmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigncGFzdGUtcmVjZWl2ZXIucGx1dG9wbG90bHknKQogICAgICAgIGlmIChwYXN0ZV9yZWNlaXZlcikgewogICAgICAgICAgcGFzdGVfcmVjZWl2ZXIuYXR0YWNoSW1hZ2UoZGF0YVVybCwgQ09OVEFJTkVSKQogICAgICAgIH0KICAgICAgICBzZW5kVG9DbGlwYm9hcmQoYmxvYikKICAgICAgfSk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHNhdmVJbWFnZVRvRmlsZSgpIHsKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS5kb3dubG9hZEltYWdlKFBMT1QsIGNvbmZpZyk7Cn0KCmxldCBjb250YWluZXJfcmVjdCA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCwgdG9wOiAwLCBsZWZ0OiAwIH07CmZ1bmN0aW9uIHVucG9wX2NvbnRhaW5lcihjbCkgewogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgZmFsc2UpOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBmYWxzZSk7CiAgLy8gV2UgZml4IHRoZSBoZWlnaHQgYmFjayB0byB0aGUgdmFsdWUgaXQgaGFkIGJlZm9yZSBwb3BvdXQsIGFsc28gc2V0dGluZyB0aGUgZmxhZyB0byBzaWduYWwgdGhhdCB1cG9uIGZpcnN0IHJlc2l6ZSB3ZSByZW1vdmUgdGhlIGZpeGVkIGlubGluZS1zdHlsZQogIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQgKyAicHgiOwogIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IHRydWU7CiAgLy8gV2Ugc2V0IHRoZSBvdGhlciBmaXhlZCBpbmxpbmUtc3R5bGVzIHRvIG51bGwKICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICBDT05UQUlORVIuc3R5bGUudG9wID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBXZSBhbHNvIHJlbW92ZSB0aGUgQ0xJUEJPQVJEX0hFQURFUgogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSAiIjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBGaW5hbGx5IHdlIHJlbW92ZSB0aGUgaGlkZGVuIGNsYXNzIHRvIHRoZSBoZWFkZXIKICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIHRydWUpOwogIHJldHVybjsKfQpmdW5jdGlvbiBwb3BvdXRfY29udGFpbmVyKG9wdHMpIHsKICBjb25zdCBjbCA9IG9wdHM/LmNsOwogIGNvbnN0IHRhcmdldF9jb250YWluZXJfc2l6ZSA9IG9wdHM/LnRhcmdldF9jb250YWluZXJfc2l6ZSA/PyB7fTsKICBjb25zdCB0YXJnZXRfcGxvdF9zaXplID0gb3B0cz8udGFyZ2V0X3Bsb3Rfc2l6ZSA/PyB7fTsKICBpZiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIHJldHVybiB1bnBvcF9jb250YWluZXIoY2wpOwogIH0KICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgY2wgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdHJ1ZSk7CiAgLy8gV2UgZXh0cmFjdCB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjb250YWluZXIsIHNhdmUgdGhlbSBhbmQgZml4IHRoZW0KICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9ID0gQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogIGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfTsKICAvLyBXZSBzYXZlIHRoZSBjdXJyZW50IHBsb3Qgc2l6ZSBiZWZvcmUgd2UgcG9wIGFzIGl0IHdpbGwgZmlsbCB0aGUgc2NyZWVuCiAgY29uc3QgY3VycmVudF9wbG90X3NpemUgPSB7CiAgICB3aWR0aDogUExPVC5fZnVsbExheW91dC53aWR0aCwKICAgIGhlaWdodDogUExPVC5fZnVsbExheW91dC5oZWlnaHQsCiAgfTsKICAvLyBXZSBoYXZlIHRvIHNhdmUgdGhlIHBhZCBkYXRhIGJlZm9yZSBwb3BwaW5nIHNvIHdlIGNhbiByZXNpemUgcHJlY2lzZWx5CiAgY29uc3QgcGFkID0ge307CiAgcGFkLnVucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgdHJ1ZSk7CiAgcGFkLnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICAvLyBXZSBkbyB0b3AgYW5kIGxlZnQgYmFzZWQgb24gdGhlIGN1cnJlbnQgcmVjdAogIGZvciAoY29uc3Qga2V5IG9mIFsidG9wIiwgImxlZnQiXSkgewogICAgY29uc3Qgc3RhcnRfdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY29udGFpbmVyX3JlY3Rba2V5XTsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgZm9yIChjb25zdCBraW5kIG9mIFsicGFkZGluZyIsICJib3JkZXIiXSkgewogICAgICBvZmZzZXQgKz0gcGFkLnBvcHBlZFtraW5kXVtrZXldIC0gcGFkLnVucG9wcGVkW2tpbmRdW2tleV07CiAgICB9CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHN0YXJ0X3ZhbCAtIG9mZnNldCArICJweCI7CiAgICBpZiAoa2V5ID09PSAibGVmdCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIC8vIFdlIGNvbXB1dGUgdGhlIHdpZHRoIGFuZCBoZWlnaHQgZGVwZW5kaW5nIG9uIGV2ZW50dWFsIGNvbmZpZyBkYXRhCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoewogICAgd2lkdGg6CiAgICAgIHRhcmdldF9wbG90X3NpemUud2lkdGggPz8KICAgICAgY29uZmlnX3NwYW5zLndpZHRoLmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS5oZWlnaHQgPz8KICAgICAgY29uZmlnX3NwYW5zLmhlaWdodC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUuaGVpZ2h0LAogIH0pOwogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIGNvbnN0IHZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNzeltrZXldOwogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSB2YWwgKyAicHgiOwogICAgaWYgKGtleSA9PT0gIndpZHRoIikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCBmYWxzZSk7CiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgdW5wb3BfY29udGFpbmVyKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKfQoKQ09OVEFJTkVSLnBvcE91dCA9IHBvcG91dF9jb250YWluZXI7CgpmdW5jdGlvbiBEdWFsQ2xpY2soc2luZ2xlX2Z1bmMsIGRibF9mdW5jKSB7CiAgbGV0IG5jbGlja3MgPSAwOwogIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykgewogICAgbmNsaWNrcyArPSAxOwogICAgaWYgKG5jbGlja3MgPiAxKSB7CiAgICAgIGRibF9mdW5jKC4uLmFyZ3MpOwogICAgICBuY2xpY2tzID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIGRlbGF5KDMwMCkudGhlbigoKSA9PiB7CiAgICAgICAgaWYgKG5jbGlja3MgPT0gMSkgewogICAgICAgICAgc2luZ2xlX2Z1bmMoLi4uYXJncyk7CiAgICAgICAgfQogICAgICAgIG5jbGlja3MgPSAwOwogICAgICB9KTsKICAgIH0KICB9Owp9CgovLyBXZSByZW1vdmUgdGhlIGRlZmF1bHQgZG93bmxvYWQgaW1hZ2UgYnV0dG9uCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSwKICBbInRvSW1hZ2UiXQopOwovLyBXZSBhZGQgdGhlIGN1c3RvbSBidXR0b24gdG8gdGhlIG1vZGViYXIKcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkLAogIFsKICAgIHsKICAgICAgbmFtZTogIkNvcHkgUE5HIHRvIENsaXBib2FyZCIsCiAgICAgIGljb246IHsKICAgICAgICBoZWlnaHQ6IDUyMCwKICAgICAgICB3aWR0aDogNTIwLAogICAgICAgIHBhdGg6ICJNMjgwIDY0aDQwYzM1LjMgMCA2NCAyOC43IDY0IDY0VjQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEg2NGMtMzUuMyAwLTY0LTI4LjctNjQtNjRWMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0aDQwIDkuNkMxMjEgMjcuNSAxNTMuMyAwIDE5MiAwczcxIDI3LjUgNzguNCA2NEgyODB6TTY0IDExMmMtOC44IDAtMTYgNy4yLTE2IDE2VjQ0OGMwIDguOCA3LjIgMTYgMTYgMTZIMzIwYzguOCAwIDE2LTcuMiAxNi0xNlYxMjhjMC04LjgtNy4yLTE2LTE2LTE2SDMwNHYyNGMwIDEzLjMtMTAuNyAyNC0yNCAyNEgxOTIgMTA0Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNFYxMTJINjR6bTEyOC04YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHoiLAogICAgICB9LAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soY29weUltYWdlVG9DbGlwYm9hcmQsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKCk7CiAgICAgIH0pLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIkRvd25sb2FkIEltYWdlIiwKICAgICAgaWNvbjogUGxvdGx5Lkljb25zLmNhbWVyYSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKHNhdmVJbWFnZVRvRmlsZSwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoeyBjbDogImZpbGVzYXZlIiB9KTsKICAgICAgfSksCiAgICB9LAogIF0KKTsKCmZ1bmN0aW9uIGdldE9mZnNldERhdGEoZWwpIHsKICBsZXQgY3MgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgbnVsbCk7CiAgY29uc3Qgb2RhdGEgPSB7CiAgICBwYWRkaW5nOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgfSwKICAgIGJvcmRlcjogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgfQogIH07CiAgaWYgKGVsID09PSBQTE9UKSB7CiAgICAvLyBGb3IgdGhlIFBMT1Qgd2UgYWxzbyB3YW50IHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBvZmZzZXQKICAgIG9kYXRhLm9mZnNldCA9IHsKICAgICAgdG9wOiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldFRvcCA6IDAsCiAgICAgIGxlZnQ6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0TGVmdCA6IDAsCiAgICB9CiAgfQogIHJldHVybiBvZGF0YTsKfQpmdW5jdGlvbiBnZXRTaXplRGF0YSgpIHsKICBjb25zdCBkYXRhID0gewogICAgcGxvdF9wYWQ6IGdldE9mZnNldERhdGEoUExPVCksCiAgICBwbG90X3JlY3Q6IFBMT1QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgICBjb250YWluZXJfcGFkOiBnZXRPZmZzZXREYXRhKENPTlRBSU5FUiksCiAgICBjb250YWluZXJfcmVjdDogQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogIH07CiAgcmV0dXJuIGRhdGE7Cn0KZnVuY3Rpb24gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGNvbnN0IGNvbXB1dGVkX3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIGNvbnN0IG9mZnNldHMgPSBjb21wdXRlZF9zaXplLm9mZnNldHM7CgogIGNvbnN0IHBsb3RfZGF0YSA9IHsKICAgIHdpZHRoOiB3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiBoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfTsKCiAgcmV0dXJuIHsKICAgIHdpZHRoOiAod2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCkgKyBvZmZzZXRzLndpZHRoLAogICAgaGVpZ2h0OiAoaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0KSArIG9mZnNldHMuaGVpZ2h0LAogICAgbm9DaGFuZ2U6IHdpZHRoID09IGNvbXB1dGVkX3NpemUud2lkdGggJiYgaGVpZ2h0ID09IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH0KfQoKLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGNoYW5nZSB0aGUgY29udGFpbmVyIHNpemUgc28gdGhhdCB0aGUgcmVzdWx0aW5nIHBsb3Qgd2lsbCBiZSBtYXRjaGluZyB0aGUgcHJvdmlkZWQgc3BlY3MKZnVuY3Rpb24gY2hhbmdlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgaWYgKCFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgY29uc29sZS5sb2coIlRyaWVkIHRvIGNoYW5nZSBjb250YWluZXIgc2l6ZSB3aGVuIG5vdCBwb3BwZWQsIGlnbm9yaW5nIik7CiAgICByZXR1cm47CiAgfQoKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEpOwoKICBpZiAoY3N6Lm5vQ2hhbmdlKSB7CiAgICBjb25zb2xlLmxvZygiU2l6ZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50LCBpZ25vcmluZyIpOwogICAgcmV0dXJuCiAgfQogIC8vIFdlIGFyZSBub3cgZ29pbmcgdG8gc2V0IGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGNvbnRhaW5lcgogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gY3N6W2tleV0gKyAicHgiOwogIH0KfQovLyBXZSBub3cgY3JlYXRlIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgdXBkYXRlIHRoZSBwbG90IGJhc2VkIG9uIHRoZSB2YWx1ZXMgc3BlY2lmaWVkCmZ1bmN0aW9uIHVwZGF0ZUZyb21IZWFkZXIoKSB7CiAgY29uc3QgaGVhZGVyX2RhdGEgPSB7CiAgICBoZWlnaHQ6IGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUsCiAgICB3aWR0aDogY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlLAogIH07CiAgY2hhbmdlQ29udGFpbmVyU2l6ZShoZWFkZXJfZGF0YSk7Cn0KLy8gV2UgYXNzaWduIHRoaXMgZnVuY3Rpb24gdG8gdGhlIG9uYmx1ciBldmVudCBvZiB3aWR0aCBhbmQgaGVpZ2h0CmlmIChmaXJzdFJ1bikgewogIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLnVpX3NwYW4ub25ibHVyID0gKGUpID0+IHsKICAgICAgY29udGFpbmVyLnVpX3ZhbHVlID0gY29udGFpbmVyLnVpX3NwYW4udGV4dENvbnRlbnQ7CiAgICAgIHVwZGF0ZUZyb21IZWFkZXIoKTsKICAgIH07CiAgfQp9Ci8vIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIHBsb3Qgc2l6ZSB0byB1c2UgZm9yIHJlbGF5b3V0IGFzIGEgZnVuY3Rpb24gb2YgdGhlIGNvbnRhaW5lciBzaXplCmZ1bmN0aW9uIGNvbXB1dGVQbG90U2l6ZShkYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIC8vIFJlbW92ZSBQYWRkaW5nCiAgY29uc3QgeyBjb250YWluZXJfcGFkLCBwbG90X3BhZCwgY29udGFpbmVyX3JlY3QgfSA9IGRhdGE7CiAgY29uc3Qgb2Zmc2V0cyA9IHsKICAgIHdpZHRoOgogICAgICBwbG90X3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLndpZHRoICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LmxlZnQgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci53aWR0aCwKICAgIGhlaWdodDoKICAgICAgcGxvdF9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBwbG90X3BhZC5ib3JkZXIuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LnRvcCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci5oZWlnaHQsCiAgfTsKICBjb25zdCBzeiA9IHsKICAgIHdpZHRoOiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LndpZHRoIC0gb2Zmc2V0cy53aWR0aCksCiAgICBoZWlnaHQ6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3QuaGVpZ2h0IC0gb2Zmc2V0cy5oZWlnaHQpLAogICAgb2Zmc2V0cywKICB9OwogIHJldHVybiBzejsKfQoKLy8gQ3JlYXRlIHRoZSByZXNpemVPYnNlcnZlciB0byBtYWtlIHRoZSBwbG90IGV2ZW4gbW9yZSByZXNwb25zaXZlISA6bWFnaWM6CmNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7CiAgY29uc3Qgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpOwogIGNvbnN0IHtjb250YWluZXJfcmVjdCwgY29udGFpbmVyX3BhZH0gPSBzaXplRGF0YTsKICBsZXQgcGxvdF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICAvLyBXZSBzYXZlIHRoZSBoZWlnaHQgaW4gdGhlIFBMT1Qgb2JqZWN0CiAgUExPVC5jb250YWluZXJfaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0OwogIC8vIFdlIGRlYWwgd2l0aCBzb21lIHN0dWZmIGlmIHRoZSBjb250YWluZXIgaXMgcG9wcHBlZAogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSBjb250YWluZXJfcmVjdC53aWR0aCArICJweCI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gY29udGFpbmVyX3JlY3QubGVmdCArICJweCI7CiAgY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS5oZWlnaHQ7CiAgY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlID0gcGxvdF9zaXplLndpZHRoOwogIC8qIAoJCVRoZSBhZGRpdGlvbiBvZiB0aGUgaW52YWxpZCBhcmd1bWVudCBgcGx1dG9yZXNpemVgIHNlZW1zIHRvIGZpeCB0aGUgcHJvYmxlbSB3aXRoIGNhbGxpbmcgYHJlbGF5b3V0YCBzaW1wbHkgd2l0aCBge2F1dG9zaXplOiB0cnVlfWAgYXMgdXBkYXRlIGJyZWFraW5nIG1vdXNlIHJlbGF5b3V0IGV2ZW50cyB0cmFja2luZy4gCgkJU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wbG90bHkvcGxvdGx5LmpzL2lzc3Vlcy82MTU2IGZvciBkZXRhaWxzCgkJKi8KICBsZXQgY29uZmlnID0gewogICAgLy8gSWYgdGhpcyBpcyBwb3BwZWQgb3V0LCB3ZSBpZ25vcmUgdGhlIG9yaWdpbmFsIHdpZHRoL2hlaWdodAogICAgd2lkdGg6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX3dpZHRoKSA/PyBwbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX2hlaWdodCkgPz8gcGxvdF9zaXplLmhlaWdodCwKICAgIHBsdXRvcmVzaXplOiB0cnVlLAogIH07CiAgUGxvdGx5LnJlbGF5b3V0KFBMT1QsIGNvbmZpZykudGhlbigoKSA9PiB7CiAgICBpZiAocmVtb3ZlX2NvbnRhaW5lcl9zaXplICYmICFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBhdm9pZCB0aGUgZmlyc3QgcmVzaXplIHVwb24gcGxvdCBjcmVhdGlvbiB0byBhbHJlYWR5IGJlIHdpdGhvdXQgYSBmaXhlZCBoZWlnaHQKICAgICAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9ICIiOwogICAgICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICAgICAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmFsc2U7CiAgICB9CiAgfSk7Cn0pOwoKcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShDT05UQUlORVIpOwoKClBsb3RseS5yZWFjdChQTE9ULCBwbG90X29iaikudGhlbigoKSA9PiB7CgkvLyBBc3NpZ24gdGhlIFBsb3RseSBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhwbG90bHlfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1Qub24oa2V5LCBsaXN0ZW5lcikKCQl9Cgl9CgkvLyBBc3NpZ24gdGhlIEpTIGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKGpzX2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULmFkZEV2ZW50TGlzdGVuZXIoa2V5LCBsaXN0ZW5lciwgewoJCQkJc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbAoJCQl9KQoJCX0KCX0KfQopCgoKaW52YWxpZGF0aW9uLnRoZW4oKCkgPT4gewoJLy8gUmVtb3ZlIGFsbCBwbG90bHkgbGlzdGVuZXJzCglQTE9ULnJlbW92ZUFsbExpc3RlbmVycygpCgkvLyBSZW1vdmUgYWxsIEpTIGxpc3RlbmVycwoJY29udHJvbGxlci5hYm9ydCgpCgkvLyBSZW1vdmUgdGhlIHJlc2l6ZU9ic2VydmVyCglyZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCkKfSkKCgoKCQlyZXR1cm4gQ09OVEFJTkVSCgk8L3NjcmlwdD4KpG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZalrc3BhY2Vfc2WybGFzdF9ydW5fdGltZXN0YW1wy0HZv8hOr3KksHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQ0ZTE0MzRlMS02NzNmLTQyMDYtYTI3MS05ZWRlYzEwZWJkNmG5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4DIJ/wtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5HZNTdiY2MwNWIwLTgxZGEtMTFlZi0yMDQwLTM1ODVjOWI0OTU0Zi9iMDFlM2E2Mjg2NjNjYjZjuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDMzNTdhMjgzLWEyMzQtNGQxNS04ZmRmLTdmYmVjNThiMzNhN4qmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnaBTA8ZGl2IGNsYXNzPSJtYXJrZG93biI+PGgxPjQuIFNwaW4gRWNobzwvaDE+CjxpbWcgY29udHJvbHM9Jycgc3JjPSdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vTElCUkVodWIvTVJJLXByb2Nlc3NpbmctMjAyMy9tYWluLzAyLXNpbXVsYXRpb24vRmlndXJlcy9TRS5naWYnIHR5cGU9J2ltYWdlL2dpZicgd2lkdGg9JzQwMHB4Jz48L2ltZz4KPHA+VGhlIHNwaW4gZWNobyBleHBlcmltZW50IGhhcyB0aGUgYWR2YW50YWdlIHRoYXQgdGhlIGVjaG8gc2lnbmFsIGFtcGxpdHVkIGl0IGlzIG1vZHVsYXRlZCBieSA8c3BhbiBjbGFzcz0idGV4Ij4kXGV4cCYjNDA7LXQvVF8yJiM0MTskPC9zcGFuPiBhbmQgbm90IDxzcGFuIGNsYXNzPSJ0ZXgiPiRcZXhwJiM0MDstdC9UXzJeJiMxMjM7KiYjMTI1OyYjNDE7JDwvc3Bhbj4uPC9wPgo8cD5Gb3IgdGhpcyBzZWN0aW9uIHdlIHdpbGwgdXNlIHRoZSBwaGFudG9tIDxjb2RlPm9ial90MnN0YXI8L2NvZGU+IGFuZCBhIG5ldyBzZXF1ZW5jZSA8Y29kZT5zZXFfc2U8L2NvZGU+LjwvcD4KPHA+Rm9yIHRoaXMgc2VxdWVuY2Ugd2Ugd2lsbCBuZWVkOjwvcD4KPHVsPgo8bGk+PHA+JiM0MDs0LjEmIzQxOyBBIDkwZGVnIGhhcmQgUkYgcHVsc2U8L3A+CjwvbGk+CjxsaT48cD4mIzQwOzQuMiYjNDE7IEEgPGNvZGU+RGVsYXk8L2NvZGU+IG9mIDxzcGFuIGNsYXNzPSJ0ZXgiPiRcbWF0aHJtJiMxMjM7VEUmIzEyNTsvMiQ8L3NwYW4+IHdpdGggYSBwb3NpdGl2ZSBncmFkaWVudCAmIzQwO2FyZWEgPGNvZGU+QXg8L2NvZGU+JiM0MTs8L3A+CjwvbGk+CjxsaT48cD4mIzQwOzQuMyYjNDE7IEEgMTgwZGVnIGhhcmQgUkYgcHVsc2U8L3A+CjwvbGk+CjxsaT48cD4mIzQwOzQuNCYjNDE7IEEgcmVhZG91dCBncmFkaWVudCBvZiBhcmVhIDxjb2RlPjJBeDwvY29kZT4gd2l0aCBhbiBBREMgJiM0MDtzaW1pbGFyIHRvICYjNDA7Mi4yJiM0MTsmIzQxOywgc3VjaCB0aGF0IHRoZSBtaWRkbGUgb2YgdGhlIGdyYWRpZW50IGFuZCBBREMgYXJlIGluIDxzcGFuIGNsYXNzPSJ0ZXgiPiRcbWF0aHJtJiMxMjM7VEUmIzEyNTskPC9zcGFuPjwvcD4KPC9saT4KPGxpPjxwPiYjNDA7NC41JiM0MTsgQ3JlYXRlIGNvbmNhdGVuYXRpbmcgdGhlc2UgYmxvY2tzIGludG8gYSBzZXF1ZW5jZSBjYWxsZWQgPGNvZGU+c2VxX3NlPC9jb2RlPjwvcD4KPC9saT4KPGxpPjxwPiYjNDA7NC42JiM0MTsgUGxvdCA8Y29kZT5zZXFfc2U8L2NvZGU+IGFuZCBpdHMgay1zcGFjZS4gSXMgdGhlIGstc3BhY2UgdGhlIHNhbWUgYXMgPGNvZGU+c2VxX2dyZTwvY29kZT4gaW4gJiM0MDsyLjMmIzQxOz88L3A+CjwvbGk+CjwvdWw+CjwvZGl2PqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b/ITqMtPLBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkMzM1N2EyODMtYTIzNC00ZDE1LThmZGYtN2ZiZWM1OGIzM2E3uWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAA9Y9LVwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDNhYmNhNDA2LTJlNmItNGIzNy04ODM1LTY1Y2ZhZDlkMGNhYYqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnaaokJPHNjcmlwdCBpZD0ncGxvdF8xJz4KCQkvLyBXZSBzdGFydCBieSBwdXR0aW5nIGFsbCB0aGUgdmFyaWFibGUgaW50ZXJwb2xhdGlvbiBoZXJlIGF0IHRoZSBiZWdpbm5pbmcKCQkvLyBXZSBoYXZlIHRvIGNvbnZlcnQgYWxsIHR5cGVkYXJyYXlzIGluIHRoZSBsYXlvdXQgdG8gbm9ybWFsIGFycmF5cy4gU2VlIElzc3VlICMyNQoJCS8vIFdlIHVzZSBsb2Rhc2ggZm9yIHRoaXMgZm9yIGNvbXBhY3RuZXNzCgkJZnVuY3Rpb24gcmVtb3ZlVHlwZWRBcnJheShvKSB7CgkJCXJldHVybiBfLmlzVHlwZWRBcnJheShvKSA/IEFycmF5LmZyb20obykgOgoJCQlfLmlzUGxhaW5PYmplY3QobykgPyBfLm1hcFZhbHVlcyhvLCByZW1vdmVUeXBlZEFycmF5KSA6IAoJCQlvCgkJfQoKCQkvLyBQdWJsaXNoIHRoZSBwbG90IG9iamVjdCB0byBKUwoJCWxldCBwbG90X29iaiA9IF8udXBkYXRlKC8qIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgQWJzdHJhY3RQbHV0b0RpbmdldGplcy5EaXNwbGF5LnB1Ymxpc2hlZF90b19qcyAqLyBnZXRQdWJsaXNoZWRPYmplY3QoIjdiY2MwNWIwLTgxZGEtMTFlZi0yMDQwLTM1ODVjOWI0OTU0Zi83NjRmMTVhZjk1MDMyNWVmIiksICJsYXlvdXQiLCByZW1vdmVUeXBlZEFycmF5KQoJCS8vIEdldCB0aGUgcGxvdGx5IGxpc3RlbmVycwoJCWNvbnN0IHBsb3RseV9saXN0ZW5lcnMgPSB7fQoJCS8vIEdldCB0aGUgSlMgbGlzdGVuZXJzCgkJY29uc3QganNfbGlzdGVuZXJzID0ge30KCQkvLyBEZWFsIHdpdGggZXZlbnR1YWwgY3VzdG9tIGNsYXNzZXMKCQlsZXQgY3VzdG9tX2NsYXNzbGlzdCA9IFtdCgoKCQkvLyBMb2FkIHRoZSBwbG90bHkgbGlicmFyeQoJCWxldCBQbG90bHkgPSB1bmRlZmluZWQKCQl0cnkgewoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiLi9wbG90bHlqcy9wbG90bHlqcy0yLjI2LjIubWluLmpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfSBjYXRjaCAoZSkgewoJCQljb25zb2xlLmxvZygiTG9jYWwgbG9hZCBmYWlsZWQsIHRyeWluZyB3aXRoIHRoZSB3ZWIgZXNtLnNoIHZlcnNpb24iKQoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiaHR0cHM6Ly9lc20uc2gvdjEzNS9wbG90bHkuanMtZGlzdC1taW5AMi4yNi4yL2VzbmV4dC9wbG90bHkuanMtZGlzdC1taW4ubWpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfQoKCQkvLyBDaGVjayBpZiB3ZSBoYXZlIHRvIGZvcmNlIGxvY2FsIG1hdGhqYXggZm9udCBjYWNoZQoJCWlmIChmYWxzZSAmJiB3aW5kb3c/Lk1hdGhKYXg/LmNvbmZpZz8uc3ZnPy5mb250Q2FjaGUgPT09ICdnbG9iYWwnKSB7CgkJCXdpbmRvdy5NYXRoSmF4LmNvbmZpZy5zdmcuZm9udENhY2hlID0gJ2xvY2FsJwoJCX0KCgkJLy8gRmxhZyB0byBjaGVjayBpZiB0aGlzIGNlbGwgd2FzICBtYW51YWxseSByYW4gb3IgcmVhY3RpdmVseSByYW4KY29uc3QgZmlyc3RSdW4gPSB0aGlzID8gZmFsc2UgOiB0cnVlCmNvbnN0IENPTlRBSU5FUiA9IHRoaXMgPz8gaHRtbGA8ZGl2IGNsYXNzPSdwbHV0b3Bsb3RseS1jb250YWluZXInPmAKY29uc3QgUExPVCA9IENPTlRBSU5FUi5xdWVyeVNlbGVjdG9yKCcuanMtcGxvdGx5LXBsb3QnKSA/PyBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2PmApCmNvbnN0IHBhcmVudCA9IENPTlRBSU5FUi5wYXJlbnRFbGVtZW50Ci8vIFdlIHVzZSBhIGNvbnRyb2xsZXIgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVycyB1cG9uIGludmFsaWRhdGlvbgpjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpCi8vIFdlIGhhdmUgdG8gYWRkIHRoaXMgdG8ga2VlcCBzdXBwb3J0aW5nIEBiaW5kIHdpdGggdGhlIG9sZCBBUEkgdXNpbmcgUExPVApQTE9ULmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGUpID0+IHsKCUNPTlRBSU5FUi52YWx1ZSA9IFBMT1QudmFsdWUKCWlmIChlLmJ1YmJsZXMpIHsKCQlyZXR1cm4KCX0KCUNPTlRBSU5FUi5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnaW5wdXQnKSkKfSwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pCgoJLy8gVGhpcyBjcmVhdGUgdGhlIHN0eWxlIHN1YmRpdiBvbiBmaXJzdCBydW4KCWZpcnN0UnVuICYmIENPTlRBSU5FUi5hcHBlbmRDaGlsZChodG1sYAoJPHN0eWxlPgoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciB7CgkJd2lkdGg6IDEwMCU7CgkJaGVpZ2h0OiAxMDAlOwoJCW1pbi1oZWlnaHQ6IDA7CgkJbWluLXdpZHRoOiAwOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciAuanMtcGxvdGx5LXBsb3QgLnBsb3RseSBkaXYgewoJCW1hcmdpbjogMCBhdXRvOyAvLyBUaGlzIGNlbnRlcnMgdGhlIHBsb3QKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIucG9wcGVkLW91dCB7CgkJb3ZlcmZsb3c6IGF1dG87CgkJei1pbmRleDogMTAwMDsKCQlwb3NpdGlvbjogZml4ZWQ7CgkJcmVzaXplOiBib3RoOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMHB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwcHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciB7CgkJZGlzcGxheTogZmxleDsKCQlmbGV4LWZsb3c6IHJvdyB3cmFwOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDEycHg7CgkJcG9zaXRpb246IGZpeGVkOwoJCXotaW5kZXg6IDEwMDE7CgkJY3Vyc29yOiBtb3ZlOwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgLTEwMCUpOwoJCXBhZGRpbmc6IDVweDsKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIHNwYW4gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQlmbGV4OiAxCgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlci5oaWRkZW4gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuY2xpcGJvYXJkLXNwYW4gewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCX0KCS5jbGlwYm9hcmQtdmFsdWUgewoJCXBhZGRpbmctcmlnaHQ6IDVweDsKCQlwYWRkaW5nLWxlZnQ6IDJweDsKCQljdXJzb3I6IHRleHQ7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlmbGV4OiAwIDAgMTAwJTsKCQl0ZXh0LWFsaWduOiBjZW50ZXI7CgkJYm9yZGVyLXRvcDogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCW1hcmdpbi10b3A6IDVweDsKCQlkaXNwbGF5OiBub25lOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5maWxlc2F2ZSAuY2xpcGJvYXJkLXNwYW4uZmlsZW5hbWUgewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5jbGlwYm9hcmQtdmFsdWUuZmlsZW5hbWUgewoJCW1hcmdpbi1sZWZ0OiAzcHg7CgkJdGV4dC1hbGlnbjogbGVmdDsKCQltaW4td2lkdGg6IG1pbig2MCUsIG1pbi1jb250ZW50KTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogaW5saW5lLWZsZXg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IC5sYWJlbCB7CgkJZmxleDogMCAwIDA7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZvcm1hdCB7CgkJcG9zaXRpb246IHJlbGF0aXZlOwoJCWZsZXg6IDEgMCBhdXRvOwoJCW1pbi13aWR0aDogMzBweDsKCQltYXJnaW4tcmlnaHQ6IDEwcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJCWZsZXgtZmxvdzogY29sdW1uOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXBhZGRpbmctbGVmdDogM3B4OwoJCXotaW5kZXg6IDIwMDA7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgewoJCWN1cnNvcjogcG9pbnRlcjsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlwYWRkaW5nOiAzcHg7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTNweCwgLTZweCk7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5mb3JtYXQtb3B0aW9uOm5vdCguc2VsZWN0ZWQpIHsKCQltYXJnaW4tdG9wOiAzcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24uc2VsZWN0ZWQgewoJCW9yZGVyOiAtMTsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpob3ZlciB7CgkJYmFja2dyb3VuZC1jb2xvcjogdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7Cgl9CglzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZm9udC13ZWlnaHQ6IG5vcm1hbDsKCQljb2xvcjogdmFyKC0tcGx1dG8tb3V0cHV0LWNvbG9yKTsKCQlkaXNwbGF5OiBub25lOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgY2FsYygtMTAwJSAtIDEwcHgpKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkubGFiZWwgewoJCXVzZXItc2VsZWN0OiBub25lOwoJfQoJLmxhYmVsOmhvdmVyIHNwYW4uY29uZmlnLXZhbHVlIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJbWluLXdpZHRoOiAxNTBweDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5tYXRjaGluZy1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tbWFjcm8tY29sb3IpOwoJCWZvbnQtd2VpZ2h0OiBib2xkOwoJfQoJLmNsaXBib2FyZC1zcGFuLmRpZmZlcmVudC1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tdGFnLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KPC9zdHlsZT4KYCkKCmxldCBvcmlnaW5hbF9oZWlnaHQgPSBwbG90X29iai5sYXlvdXQuaGVpZ2h0CmxldCBvcmlnaW5hbF93aWR0aCA9IHBsb3Rfb2JqLmxheW91dC53aWR0aAovLyBGb3IgdGhlIGhlaWdodCB3ZSBoYXZlIHRvIGFsc28gcHV0IGEgZml4ZWQgdmFsdWUgaW4gY2FzZSB0aGUgcGxvdCBpcyBwdXQgb24gYSBub24tZml4ZWQtc2l6ZSBjb250YWluZXIgKGxpa2UgdGhlIGRlZmF1bHQgd3JhcHBlcikKLy8gV2UgZGVmaW5lIGEgdmFyaWFibGUgdG8gY2hlY2sgd2hldGhlciB3ZSBzdGlsbCBoYXZlIHRvIHJlbW92ZSB0aGUgZml4ZWQgaGVpZ2h0CmxldCByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmaXJzdFJ1bgpsZXQgY29udGFpbmVyX2hlaWdodCA9IG9yaWdpbmFsX2hlaWdodCA/PyBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPz8gNDAwCkNPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfaGVpZ2h0ICsgJ3B4JwoKLy8gV2UgY3JlYXRlIGEgUHJvbWlzZSB2ZXJzaW9uIG9mIHNldFRpbWVvdXQKZnVuY3Rpb24gZGVsYXkobXMpIHsKICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTsKfQoKLy8gV2UgaW1wb3J0IGludGVyYWN0IGZvciBkcmFnZ2luZy9yZXNpemluZwpjb25zdCB7IGRlZmF1bHQ6IGludGVyYWN0IH0gPSBhd2FpdCBpbXBvcnQoJ2h0dHBzOi8vZXNtLnNoL2ludGVyYWN0anNAMS4xMC4xOScpCgoKZnVuY3Rpb24gZ2V0SW1hZ2VPcHRpb25zKCkgewogIGNvbnN0IG8gPSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPz8ge307CiAgcmV0dXJuIHsKICAgIGZvcm1hdDogby5mb3JtYXQgPz8gInBuZyIsCiAgICB3aWR0aDogby53aWR0aCA/PyBvcmlnaW5hbF93aWR0aCwKICAgIGhlaWdodDogby5oZWlnaHQgPz8gb3JpZ2luYWxfaGVpZ2h0LAogICAgc2NhbGU6IG8uc2NhbGUgPz8gMSwKICAgIGZpbGVuYW1lOiBvLmZpbGVuYW1lID8/ICJuZXdwbG90IiwKICB9Owp9Cgpjb25zdCBDTElQQk9BUkRfSEVBREVSID0KICBDT05UQUlORVIucXVlcnlTZWxlY3RvcigiLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIiKSA/PwogIENPTlRBSU5FUi5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAiYWZ0ZXJiZWdpbiIsCiAgICBodG1sYDxkaXYgY2xhc3M9InBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgaGlkZGVuIj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZvcm1hdCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5Gb3JtYXQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZm9ybWF0Ij48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHdpZHRoIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPldpZHRoOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIHdpZHRoIj48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gaGVpZ2h0IgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkhlaWdodDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBoZWlnaHQiPjwvc3Bhbj5weDwvc3BhbgogICAgICA+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzY2FsZSIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5TY2FsZTo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBzY2FsZSI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHNldCI+U2V0PC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHVuc2V0Ij5VbnNldDwvYnV0dG9uPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gZmlsZW5hbWUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+RmlsZW5hbWU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZmlsZW5hbWUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgPC9kaXY+YAogICk7CgpmdW5jdGlvbiBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKSB7CiAgY29uc3QgdmFsaWRfY2xhc3NlcyA9IFsKICAgICJtaXNzaW5nLWNvbmZpZyIsCiAgICAibWF0Y2hpbmctY29uZmlnIiwKICAgICJkaWZmZXJlbnQtY29uZmlnIiwKICBdOwogIGZ1bmN0aW9uIHNldENsYXNzKGNsKSB7CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgdmFsaWRfY2xhc3NlcykgewogICAgICBjb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZShuYW1lLCBuYW1lID09IGNsKTsKICAgIH0KICB9CiAgLy8gV2UgdXNlIHRoZSBjdXN0b20gZ2V0dGVycyB3ZSdsbCBzZXQgdXAgaW4gdGhlIGNvbnRhaW5lcgogIGNvbnN0IHsgdWlfdmFsdWUsIGNvbmZpZ192YWx1ZSwgY29uZmlnX3NwYW4sIGtleSB9ID0gY29udGFpbmVyOwogIGlmIChjb25maWdfdmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgc2V0Q2xhc3MoIm1pc3NpbmctY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGlzIG5vdCBwcmVzZW50IGluIHRoZSBjb25maWcuYDsKICB9IGVsc2UgaWYgKHVpX3ZhbHVlID09IGNvbmZpZ192YWx1ZSkgewogICAgc2V0Q2xhc3MoIm1hdGNoaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgdGhlIHNhbWUgdmFsdWUgaW4gdGhlIGNvbmZpZyBhbmQgaW4gdGhlIGhlYWRlci5gOwogIH0gZWxzZSB7CiAgICBzZXRDbGFzcygiZGlmZmVyZW50LWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgYSBkaWZmZXJlbnQgdmFsdWUgKDxlbT4ke2NvbmZpZ192YWx1ZX08L2VtPikgaW4gdGhlIGNvbmZpZy5gOwogIH0KICAvLyBBZGQgaW5mbyBhYm91dCBzZXR0aW5nIGFuZCB1bnNldHRpbmcKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgb24gdGhlIGxhYmVsIDxlbT48Yj5vbmNlPC9iPjwvZW0+IHRvIHNldCB0aGUgY3VycmVudCBVSSB2YWx1ZSBpbiB0aGUgY29uZmlnLmAKICApOwogIGNvbmZpZ19zcGFuLmluc2VydEFkamFjZW50SFRNTCgKICAgICJiZWZvcmVlbmQiLAogICAgYDxicj5DbGljayA8ZW0+PGI+dHdpY2U8L2I+PC9lbT4gdG8gcmVtb3ZlIHRoaXMga2V5IGZyb20gdGhlIGNvbmZpZy5gCiAgKTsKfQoKY29uc3QgdmFsaWRfZm9ybWF0cyA9IFsicG5nIiwgInN2ZyIsICJ3ZWJwIiwgImpwZWciLCAiZnVsbC1qc29uIl07CmZ1bmN0aW9uIGluaXRpYWxpemVVSVZhbHVlU3BhbihzcGFuLCBrZXksIHZhbHVlKSB7CiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9IGtleSA9PT0gImZvcm1hdCIgPyAiZmFsc2UiIDogInRydWUiOwogIGxldCBwYXJzZSA9ICh4KSA9PiB4OwogIGxldCB1cGRhdGUgPSAoeCkgPT4gKHNwYW4udGV4dENvbnRlbnQgPSB4KTsKICBpZiAoa2V5ID09PSAid2lkdGgiIHx8IGtleSA9PT0gImhlaWdodCIpIHsKICAgIHBhcnNlID0gKHgpID0+IE1hdGgucm91bmQocGFyc2VGbG9hdCh4KSk7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJzY2FsZSIpIHsKICAgIHBhcnNlID0gcGFyc2VGbG9hdDsKICB9IGVsc2UgaWYgKGtleSA9PT0gImZvcm1hdCIpIHsKICAgIC8vIFdlIHJlbW92ZSBjb250ZW50RWRpdGFibGUKICAgIHNwYW4uY29udGVudEVkaXRhYmxlID0gImZhbHNlIjsKICAgIC8vIEhlcmUgd2UgZmlyc3QgYWRkIHRoZSBzdWJzcGFucyBmb3IgZWFjaCBvcHRpb24KICAgIGNvbnN0IG9wdHNfZGl2ID0gc3Bhbi5hcHBlbmRDaGlsZChodG1sYDxkaXYgY2xhc3M9ImZvcm1hdC1vcHRpb25zIj48L2Rpdj5gKTsKICAgIGZvciAoY29uc3QgZm10IG9mIHZhbGlkX2Zvcm1hdHMpIHsKICAgICAgY29uc3Qgb3B0ID0gb3B0c19kaXYuYXBwZW5kQ2hpbGQoCiAgICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iZm9ybWF0LW9wdGlvbiAke2ZtdH0iPiR7Zm10fTwvc3Bhbj5gCiAgICAgICk7CiAgICAgIG9wdC5vbmNsaWNrID0gKGUpID0+IHsKICAgICAgICBzcGFuLnZhbHVlID0gb3B0LnRleHRDb250ZW50OwogICAgICB9OwogICAgfQogICAgcGFyc2UgPSAoeCkgPT4gewogICAgICByZXR1cm4gdmFsaWRfZm9ybWF0cy5pbmNsdWRlcyh4KSA/IHggOiBsb2NhbFZhbHVlOwogICAgfTsKICAgIHVwZGF0ZSA9ICh4KSA9PiB7CiAgICAgIGZvciAoY29uc3Qgb3B0IG9mIG9wdHNfZGl2LmNoaWxkcmVuKSB7CiAgICAgICAgb3B0LmNsYXNzTGlzdC50b2dnbGUoInNlbGVjdGVkIiwgb3B0LnRleHRDb250ZW50ID09PSB4KTsKICAgICAgfQogICAgfTsKICB9IGVsc2UgewogICAgLy8gV2Ugb25seSBoYXZlIGZpbGVuYW1lIGhlcmUKICB9CiAgbGV0IGxvY2FsVmFsdWU7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwYW4sICJ2YWx1ZSIsIHsKICAgIGdldDogKCkgPT4gewogICAgICByZXR1cm4gbG9jYWxWYWx1ZTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgaWYgKHZhbCAhPT0gIiIpIHsKICAgICAgICBsb2NhbFZhbHVlID0gcGFyc2UodmFsKTsKICAgICAgfQogICAgICB1cGRhdGUobG9jYWxWYWx1ZSk7CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKICAvLyBXZSBhbHNvIGFzc2lnbiBhIGxpc3RlbmVyIHNvIHRoYXQgdGhlIGVkaXRhYmxlIGlzIGJsdXJyZWQgd2hlbiBlbnRlciBpcyBwcmVzc2VkCiAgc3Bhbi5vbmtleWRvd24gPSAoZSkgPT4gewogICAgaWYgKGUua2V5Q29kZSA9PT0gMTMpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBzcGFuLmJsdXIoKTsKICAgIH0KICB9OwogIHNwYW4udmFsdWUgPSB2YWx1ZTsKfQoKZnVuY3Rpb24gaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3BhbihzcGFuLCBrZXkpIHsKICAvLyBIZXJlIHdlIG1vc3RseSB3YW50IHRvIGRlZmluZSB0aGUgc2V0dGVyIGFuZCBnZXR0ZXIKICBjb25zdCBjb250YWluZXIgPSBzcGFuLmNsb3Nlc3QoIi5jbGlwYm9hcmQtc3BhbiIpOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgfSwKICAgIHNldDogKHZhbCkgPT4gewogICAgICAvLyBpZiB1bmRlZmluZWQgaXMgcGFzc2VkLCB3ZSByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIG9wdGlvbnMKICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZGVsZXRlIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgICB9IGVsc2UgewogICAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldID0gdmFsOwogICAgICB9CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKfQoKY29uc3QgY29uZmlnX3NwYW5zID0ge307CmZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGdldEltYWdlT3B0aW9ucygpKSkgewogIGNvbnN0IGNvbnRhaW5lciA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcihgLmNsaXBib2FyZC1zcGFuLiR7a2V5fWApOwogIGNvbnN0IGxhYmVsID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5sYWJlbCIpOwogIC8vIFdlIGdpdmUgdGhlIGxhYmVsIGEgZnVuY3Rpb24gdGhhdCBvbiBzaW5nbGUgY2xpY2sgd2lsbCBzZXQgdGhlIGN1cnJlbnQgdmFsdWUgYW5kIHdpdGggZG91YmxlIGNsaWNrIHdpbGwgdW5zZXQgaXQKICBsYWJlbC5vbmNsaWNrID0gRHVhbENsaWNrKAogICAgKCkgPT4gewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfSwKICAgIChlKSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJlIiwgZSk7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IHVuZGVmaW5lZDsKICAgIH0KICApOwogIGNvbnN0IHVpX3ZhbHVlX3NwYW4gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC12YWx1ZSIpOwogIGNvbnN0IGNvbmZpZ192YWx1ZV9zcGFuID0KICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuY29uZmlnLXZhbHVlIikgPz8KICAgIGxhYmVsLmluc2VydEFkamFjZW50RWxlbWVudCgKICAgICAgImFmdGVyYmVnaW4iLAogICAgICBodG1sYDxzcGFuIGNsYXNzPSJjb25maWctdmFsdWUiPjwvc3Bhbj5gCiAgICApOwogIC8vIEFzc2luZyB0aGUgdHdvIHNwYW5zIGFzIHByb3BlcnRpZXMgb2YgdGhlIGNvbnRhaW5pbmcgc3BhbgogIGNvbnRhaW5lci51aV9zcGFuID0gdWlfdmFsdWVfc3BhbjsKICBjb250YWluZXIuY29uZmlnX3NwYW4gPSBjb25maWdfdmFsdWVfc3BhbjsKICBjb250YWluZXIua2V5ID0ga2V5OwogIGNvbmZpZ19zcGFuc1trZXldID0gY29udGFpbmVyOwogIGlmIChmaXJzdFJ1bikgewogICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID0KICAgICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogICAgLy8gV2UgZG8gdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSB2YWx1ZSBzcGFuCiAgICBpbml0aWFsaXplVUlWYWx1ZVNwYW4odWlfdmFsdWVfc3Bhbiwga2V5LCB2YWx1ZSk7CiAgICAvLyBUaGVuIHdlIGluaXRpYWxpemUgdGhlIGNvbmZpZyB2YWx1ZQogICAgaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3Bhbihjb25maWdfdmFsdWVfc3Bhbiwga2V5KTsKICAgIC8vIFdlIHB1dCBzb21lIGNvbnZlbmllbmNlIGdldHRlcnMvc2V0dGVycwogICAgLy8gdWlfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgInVpX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IHVpX3ZhbHVlX3NwYW4udmFsdWUsCiAgICAgIHNldDogKHZhbCkgPT4gewogICAgICAgIHVpX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICAgIC8vIGNvbmZpZ192YWx1ZSBmb3J3YXJkCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAiY29uZmlnX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IGNvbmZpZ192YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSA9IHZhbDsKICAgICAgfSwKICAgIH0pOwogIH0KfQoKLy8gVGhlc2Ugb2JqZWN0cyB3aWxsIGNvbnRhaW4gdGhlIGRlZmF1bHQgdmFsdWUKCi8vIFRoaXMgY29kZSB1cGRhdGVzIHRoZSBpbWFnZSBvcHRpb25zIGluIHRoZSBQTE9UIGNvbmZpZyB3aXRoIHRoZSBwcm92aWRlZCBvbmVzCmZ1bmN0aW9uIHNldEltYWdlT3B0aW9ucyhvKSB7CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBvW2tleV07CiAgfQp9CmZ1bmN0aW9uIHVuc2V0SW1hZ2VPcHRpb25zKCkgewogIHNldEltYWdlT3B0aW9ucyh7fSk7Cn0KCmNvbnN0IHNldF9idXR0b24gPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtc3Bhbi5zZXQiKTsKY29uc3QgdW5zZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4udW5zZXQiKTsKaWYgKGZpcnN0UnVuKSB7CiAgc2V0X2J1dHRvbi5vbmNsaWNrID0gKGUpID0+IHsKICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfQogIH07CiAgdW5zZXRfYnV0dG9uLm9uY2xpY2sgPSB1bnNldEltYWdlT3B0aW9uczsKfQoKLy8gV2UgYWRkIGEgZnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIGNsaXBib2FyZCBpcyBwb3BwZWQgb3V0CkNPTlRBSU5FUi5pc1BvcHBlZE91dCA9ICgpID0+IHsKICByZXR1cm4gQ09OVEFJTkVSLmNsYXNzTGlzdC5jb250YWlucygicG9wcGVkLW91dCIpOwp9OwoKQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNlZG93biA9IGZ1bmN0aW9uIChldmVudCkgewogIGlmIChldmVudC50YXJnZXQubWF0Y2hlcygic3Bhbi5jbGlwYm9hcmQtdmFsdWUiKSkgewogICAgY29uc29sZS5sb2coIldlIGRvbid0IG1vdmUhIik7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IHN0YXJ0ID0gewogICAgbGVmdDogcGFyc2VGbG9hdChDT05UQUlORVIuc3R5bGUubGVmdCksCiAgICB0b3A6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLnRvcCksCiAgICBYOiBldmVudC5wYWdlWCwKICAgIFk6IGV2ZW50LnBhZ2VZLAogIH07CiAgZnVuY3Rpb24gbW92ZUF0KGV2ZW50LCBzdGFydCkgewogICAgY29uc3QgdG9wID0gZXZlbnQucGFnZVkgLSBzdGFydC5ZICsgc3RhcnQudG9wICsgInB4IjsKICAgIGNvbnN0IGxlZnQgPSBldmVudC5wYWdlWCAtIHN0YXJ0LlggKyBzdGFydC5sZWZ0ICsgInB4IjsKICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUudG9wID0gdG9wOwogIH0KCiAgLy8gbW92ZSBvdXIgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGJhbGwgdW5kZXIgdGhlIHBvaW50ZXIKICBtb3ZlQXQoZXZlbnQsIHN0YXJ0KTsKICBmdW5jdGlvbiBvbk1vdXNlTW92ZShldmVudCkgewogICAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgfQoKICAvLyBXZSB1c2UgdGhpcyB0byByZW1vdmUgdGhlIG1vdXNlbW92ZSB3aGVuIGNsaWNraW5nIG91dHNpZGUgb2YgdGhlIGNvbnRhaW5lcgogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CgogIC8vIG1vdmUgdGhlIGNvbnRhaW5lciBvbiBtb3VzZW1vdmUKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCBvbk1vdXNlTW92ZSwgewogICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCwKICB9KTsKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICBjbGVhblVwKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKCiAgZnVuY3Rpb24gY2xlYW5VcCgpIHsKICAgIGNvbnNvbGUubG9nKCJjbGVhbmluZyB1cCB0aGUgcGxvdCBtb3ZlIGxpc3RlbmVyIik7CiAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICBDTElQQk9BUkRfSEVBREVSLm9ubW91c2V1cCA9IG51bGw7CiAgfQoKICAvLyAoMykgZHJvcCB0aGUgYmFsbCwgcmVtb3ZlIHVubmVlZGVkIGhhbmRsZXJzCiAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBjbGVhblVwOwp9OwoKZnVuY3Rpb24gc2VuZFRvQ2xpcGJvYXJkKGJsb2IpIHsKICBpZiAoIW5hdmlnYXRvci5jbGlwYm9hcmQpIHsKICAgIGFsZXJ0KAogICAgICAiVGhlIENsaXBib2FyZCBBUEkgZG9lcyBub3Qgc2VlbSB0byBiZSBhdmFpbGFibGUsIG1ha2Ugc3VyZSB0aGUgUGx1dG8gbm90ZWJvb2sgaXMgYmVpbmcgdXNlZCBmcm9tIGVpdGhlciBsb2NhbGhvc3Qgb3IgYW4gaHR0cHMgc291cmNlLiIKICAgICk7CiAgfQogIG5hdmlnYXRvci5jbGlwYm9hcmQKICAgIC53cml0ZShbCiAgICAgIG5ldyBDbGlwYm9hcmRJdGVtKHsKICAgICAgICAvLyBUaGUga2V5IGlzIGRldGVybWluZWQgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIGJsb2IncyB0eXBlLgogICAgICAgIFtibG9iLnR5cGVdOiBibG9iLAogICAgICB9KSwKICAgIF0pCiAgICAudGhlbigKICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgIGNvbnNvbGUubG9nKCJBc3luYzogQ29weWluZyB0byBjbGlwYm9hcmQgd2FzIHN1Y2Nlc3NmdWwhIik7CiAgICAgIH0sCiAgICAgIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJBc3luYzogQ291bGQgbm90IGNvcHkgdGV4dDogIiwgZXJyKTsKICAgICAgfQogICAgKTsKfQoKZnVuY3Rpb24gY29weUltYWdlVG9DbGlwYm9hcmQoKSB7CiAgLy8gV2UgZXh0cmFjdCB0aGUgaW1hZ2Ugb3B0aW9ucyBmcm9tIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzIChpZiB0aGV5IGV4aXN0KQogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuIFdlIGFsc28gaWdub3JlIGZvcm1hdCBiZWNhdXNlIHRoZSBjbGlwYm9hcmQgb25seSBzdXBwb3J0cyBwbmcuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwga2V5ID09PSAiZm9ybWF0IikgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbmZpZ1trZXldID0gdmFsOwogIH0KICBQbG90bHkudG9JbWFnZShQTE9ULCBjb25maWcpLnRoZW4oZnVuY3Rpb24gKGRhdGFVcmwpIHsKICAgIGZldGNoKGRhdGFVcmwpCiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5ibG9iKCkpCiAgICAgIC50aGVuKChibG9iKSA9PiB7CiAgICAgICAgY29uc3QgcGFzdGVfcmVjZWl2ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdwYXN0ZS1yZWNlaXZlci5wbHV0b3Bsb3RseScpCiAgICAgICAgaWYgKHBhc3RlX3JlY2VpdmVyKSB7CiAgICAgICAgICBwYXN0ZV9yZWNlaXZlci5hdHRhY2hJbWFnZShkYXRhVXJsLCBDT05UQUlORVIpCiAgICAgICAgfQogICAgICAgIHNlbmRUb0NsaXBib2FyZChibG9iKQogICAgICB9KTsKICB9KTsKfQoKZnVuY3Rpb24gc2F2ZUltYWdlVG9GaWxlKCkgewogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LmRvd25sb2FkSW1hZ2UoUExPVCwgY29uZmlnKTsKfQoKbGV0IGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwLCB0b3A6IDAsIGxlZnQ6IDAgfTsKZnVuY3Rpb24gdW5wb3BfY29udGFpbmVyKGNsKSB7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCBmYWxzZSk7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoY2wsIGZhbHNlKTsKICAvLyBXZSBmaXggdGhlIGhlaWdodCBiYWNrIHRvIHRoZSB2YWx1ZSBpdCBoYWQgYmVmb3JlIHBvcG91dCwgYWxzbyBzZXR0aW5nIHRoZSBmbGFnIHRvIHNpZ25hbCB0aGF0IHVwb24gZmlyc3QgcmVzaXplIHdlIHJlbW92ZSB0aGUgZml4ZWQgaW5saW5lLXN0eWxlCiAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9IGNvbnRhaW5lcl9yZWN0LmhlaWdodCArICJweCI7CiAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gdHJ1ZTsKICAvLyBXZSBzZXQgdGhlIG90aGVyIGZpeGVkIGlubGluZS1zdHlsZXMgdG8gbnVsbAogIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogIENPTlRBSU5FUi5zdHlsZS50b3AgPSAiIjsKICBDT05UQUlORVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIFdlIGFsc28gcmVtb3ZlIHRoZSBDTElQQk9BUkRfSEVBREVSCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9ICIiOwogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIEZpbmFsbHkgd2UgcmVtb3ZlIHRoZSBoaWRkZW4gY2xhc3MgdG8gdGhlIGhlYWRlcgogIENMSVBCT0FSRF9IRUFERVIuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgdHJ1ZSk7CiAgcmV0dXJuOwp9CmZ1bmN0aW9uIHBvcG91dF9jb250YWluZXIob3B0cykgewogIGNvbnN0IGNsID0gb3B0cz8uY2w7CiAgY29uc3QgdGFyZ2V0X2NvbnRhaW5lcl9zaXplID0gb3B0cz8udGFyZ2V0X2NvbnRhaW5lcl9zaXplID8/IHt9OwogIGNvbnN0IHRhcmdldF9wbG90X3NpemUgPSBvcHRzPy50YXJnZXRfcGxvdF9zaXplID8/IHt9OwogIGlmIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgcmV0dXJuIHVucG9wX2NvbnRhaW5lcihjbCk7CiAgfQogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBjbCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0cnVlKTsKICAvLyBXZSBleHRyYWN0IHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNvbnRhaW5lciwgc2F2ZSB0aGVtIGFuZCBmaXggdGhlbQogIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH0gPSBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgY29udGFpbmVyX3JlY3QgPSB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9OwogIC8vIFdlIHNhdmUgdGhlIGN1cnJlbnQgcGxvdCBzaXplIGJlZm9yZSB3ZSBwb3AgYXMgaXQgd2lsbCBmaWxsIHRoZSBzY3JlZW4KICBjb25zdCBjdXJyZW50X3Bsb3Rfc2l6ZSA9IHsKICAgIHdpZHRoOiBQTE9ULl9mdWxsTGF5b3V0LndpZHRoLAogICAgaGVpZ2h0OiBQTE9ULl9mdWxsTGF5b3V0LmhlaWdodCwKICB9OwogIC8vIFdlIGhhdmUgdG8gc2F2ZSB0aGUgcGFkIGRhdGEgYmVmb3JlIHBvcHBpbmcgc28gd2UgY2FuIHJlc2l6ZSBwcmVjaXNlbHkKICBjb25zdCBwYWQgPSB7fTsKICBwYWQudW5wb3BwZWQgPSBnZXRTaXplRGF0YSgpLmNvbnRhaW5lcl9wYWQ7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCB0cnVlKTsKICBwYWQucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIC8vIFdlIGRvIHRvcCBhbmQgbGVmdCBiYXNlZCBvbiB0aGUgY3VycmVudCByZWN0CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ0b3AiLCAibGVmdCJdKSB7CiAgICBjb25zdCBzdGFydF92YWwgPSB0YXJnZXRfY29udGFpbmVyX3NpemVba2V5XSA/PyBjb250YWluZXJfcmVjdFtrZXldOwogICAgbGV0IG9mZnNldCA9IDA7CiAgICBmb3IgKGNvbnN0IGtpbmQgb2YgWyJwYWRkaW5nIiwgImJvcmRlciJdKSB7CiAgICAgIG9mZnNldCArPSBwYWQucG9wcGVkW2tpbmRdW2tleV0gLSBwYWQudW5wb3BwZWRba2luZF1ba2V5XTsKICAgIH0KICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gc3RhcnRfdmFsIC0gb2Zmc2V0ICsgInB4IjsKICAgIGlmIChrZXkgPT09ICJsZWZ0IikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgLy8gV2UgY29tcHV0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBkZXBlbmRpbmcgb24gZXZlbnR1YWwgY29uZmlnIGRhdGEKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7CiAgICB3aWR0aDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS53aWR0aCA/PwogICAgICBjb25maWdfc3BhbnMud2lkdGguY29uZmlnX3ZhbHVlID8/CiAgICAgIGN1cnJlbnRfcGxvdF9zaXplLndpZHRoLAogICAgaGVpZ2h0OgogICAgICB0YXJnZXRfcGxvdF9zaXplLmhlaWdodCA/PwogICAgICBjb25maWdfc3BhbnMuaGVpZ2h0LmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS5oZWlnaHQsCiAgfSk7CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgY29uc3QgdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY3N6W2tleV07CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHZhbCArICJweCI7CiAgICBpZiAoa2V5ID09PSAid2lkdGgiKSB7CiAgICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGVba2V5XSA9IENPTlRBSU5FUi5zdHlsZVtrZXldOwogICAgfQogIH0KICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIGZhbHNlKTsKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICB1bnBvcF9jb250YWluZXIoKTsKICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9LAogICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0KICApOwp9CgpDT05UQUlORVIucG9wT3V0ID0gcG9wb3V0X2NvbnRhaW5lcjsKCmZ1bmN0aW9uIER1YWxDbGljayhzaW5nbGVfZnVuYywgZGJsX2Z1bmMpIHsKICBsZXQgbmNsaWNrcyA9IDA7CiAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7CiAgICBuY2xpY2tzICs9IDE7CiAgICBpZiAobmNsaWNrcyA+IDEpIHsKICAgICAgZGJsX2Z1bmMoLi4uYXJncyk7CiAgICAgIG5jbGlja3MgPSAwOwogICAgfSBlbHNlIHsKICAgICAgZGVsYXkoMzAwKS50aGVuKCgpID0+IHsKICAgICAgICBpZiAobmNsaWNrcyA9PSAxKSB7CiAgICAgICAgICBzaW5nbGVfZnVuYyguLi5hcmdzKTsKICAgICAgICB9CiAgICAgICAgbmNsaWNrcyA9IDA7CiAgICAgIH0pOwogICAgfQogIH07Cn0KCi8vIFdlIHJlbW92ZSB0aGUgZGVmYXVsdCBkb3dubG9hZCBpbWFnZSBidXR0b24KcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9SZW1vdmUgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlLAogIFsidG9JbWFnZSJdCik7Ci8vIFdlIGFkZCB0aGUgY3VzdG9tIGJ1dHRvbiB0byB0aGUgbW9kZWJhcgpwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb0FkZCA9IF8udW5pb24oCiAgcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQsCiAgWwogICAgewogICAgICBuYW1lOiAiQ29weSBQTkcgdG8gQ2xpcGJvYXJkIiwKICAgICAgaWNvbjogewogICAgICAgIGhlaWdodDogNTIwLAogICAgICAgIHdpZHRoOiA1MjAsCiAgICAgICAgcGF0aDogIk0yODAgNjRoNDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRWNDQ4YzAgMzUuMy0yOC43IDY0LTY0IDY0SDY0Yy0zNS4zIDAtNjQtMjguNy02NC02NFYxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRoNDAgOS42QzEyMSAyNy41IDE1My4zIDAgMTkyIDBzNzEgMjcuNSA3OC40IDY0SDI4MHpNNjQgMTEyYy04LjggMC0xNiA3LjItMTYgMTZWNDQ4YzAgOC44IDcuMiAxNiAxNiAxNkgzMjBjOC44IDAgMTYtNy4yIDE2LTE2VjEyOGMwLTguOC03LjItMTYtMTYtMTZIMzA0djI0YzAgMTMuMy0xMC43IDI0LTI0IDI0SDE5MiAxMDRjLTEzLjMgMC0yNC0xMC43LTI0LTI0VjExMkg2NHptMTI4LThhMjQgMjQgMCAxIDAgMC00OCAyNCAyNCAwIDEgMCAwIDQ4eiIsCiAgICAgIH0sCiAgICAgIGRpcmVjdGlvbjogInVwIiwKICAgICAgY2xpY2s6IER1YWxDbGljayhjb3B5SW1hZ2VUb0NsaXBib2FyZCwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoKTsKICAgICAgfSksCiAgICB9LAogICAgewogICAgICBuYW1lOiAiRG93bmxvYWQgSW1hZ2UiLAogICAgICBpY29uOiBQbG90bHkuSWNvbnMuY2FtZXJhLAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soc2F2ZUltYWdlVG9GaWxlLCAoKSA9PiB7CiAgICAgICAgcG9wb3V0X2NvbnRhaW5lcih7IGNsOiAiZmlsZXNhdmUiIH0pOwogICAgICB9KSwKICAgIH0sCiAgXQopOwoKZnVuY3Rpb24gZ2V0T2Zmc2V0RGF0YShlbCkgewogIGxldCBjcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsLCBudWxsKTsKICBjb25zdCBvZGF0YSA9IHsKICAgIHBhZGRpbmc6IHsKICAgICAgbGVmdDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSwKICAgICAgYm90dG9tOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSArIHBhcnNlRmxvYXQoY3MucGFkZGluZ0JvdHRvbSksCiAgICB9LAogICAgYm9yZGVyOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyTGVmdFdpZHRoKSwKICAgICAgcmlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyUmlnaHRXaWR0aCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5ib3JkZXJUb3BXaWR0aCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCkgKyBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICB9CiAgfTsKICBpZiAoZWwgPT09IFBMT1QpIHsKICAgIC8vIEZvciB0aGUgUExPVCB3ZSBhbHNvIHdhbnQgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIG9mZnNldAogICAgb2RhdGEub2Zmc2V0ID0gewogICAgICB0b3A6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0VG9wIDogMCwKICAgICAgbGVmdDogUExPVC5vZmZzZXRQYXJlbnQgPT0gQ09OVEFJTkVSID8gUExPVC5vZmZzZXRMZWZ0IDogMCwKICAgIH0KICB9CiAgcmV0dXJuIG9kYXRhOwp9CmZ1bmN0aW9uIGdldFNpemVEYXRhKCkgewogIGNvbnN0IGRhdGEgPSB7CiAgICBwbG90X3BhZDogZ2V0T2Zmc2V0RGF0YShQTE9UKSwKICAgIHBsb3RfcmVjdDogUExPVC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICAgIGNvbnRhaW5lcl9wYWQ6IGdldE9mZnNldERhdGEoQ09OVEFJTkVSKSwKICAgIGNvbnRhaW5lcl9yZWN0OiBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgfTsKICByZXR1cm4gZGF0YTsKfQpmdW5jdGlvbiBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgY29uc3QgY29tcHV0ZWRfc2l6ZSA9IGNvbXB1dGVQbG90U2l6ZShzaXplRGF0YSk7CiAgY29uc3Qgb2Zmc2V0cyA9IGNvbXB1dGVkX3NpemUub2Zmc2V0czsKCiAgY29uc3QgcGxvdF9kYXRhID0gewogICAgd2lkdGg6IHdpZHRoID8/IGNvbXB1dGVkX3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IGhlaWdodCA/PyBjb21wdXRlZF9zaXplLmhlaWdodCwKICB9OwoKICByZXR1cm4gewogICAgd2lkdGg6ICh3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoKSArIG9mZnNldHMud2lkdGgsCiAgICBoZWlnaHQ6IChoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQpICsgb2Zmc2V0cy5oZWlnaHQsCiAgICBub0NoYW5nZTogd2lkdGggPT0gY29tcHV0ZWRfc2l6ZS53aWR0aCAmJiBoZWlnaHQgPT0gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfQp9CgovLyBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hhbmdlIHRoZSBjb250YWluZXIgc2l6ZSBzbyB0aGF0IHRoZSByZXN1bHRpbmcgcGxvdCB3aWxsIGJlIG1hdGNoaW5nIHRoZSBwcm92aWRlZCBzcGVjcwpmdW5jdGlvbiBjaGFuZ2VDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICBpZiAoIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICBjb25zb2xlLmxvZygiVHJpZWQgdG8gY2hhbmdlIGNvbnRhaW5lciBzaXplIHdoZW4gbm90IHBvcHBlZCwgaWdub3JpbmciKTsKICAgIHJldHVybjsKICB9CgogIGNvbnN0IGNzeiA9IGNvbXB1dGVDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSk7CgogIGlmIChjc3oubm9DaGFuZ2UpIHsKICAgIGNvbnNvbGUubG9nKCJTaXplIGlzIHRoZSBzYW1lIGFzIGN1cnJlbnQsIGlnbm9yaW5nIik7CiAgICByZXR1cm4KICB9CiAgLy8gV2UgYXJlIG5vdyBnb2luZyB0byBzZXQgaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgY29udGFpbmVyCiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSBjc3pba2V5XSArICJweCI7CiAgfQp9Ci8vIFdlIG5vdyBjcmVhdGUgdGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCB1cGRhdGUgdGhlIHBsb3QgYmFzZWQgb24gdGhlIHZhbHVlcyBzcGVjaWZpZWQKZnVuY3Rpb24gdXBkYXRlRnJvbUhlYWRlcigpIHsKICBjb25zdCBoZWFkZXJfZGF0YSA9IHsKICAgIGhlaWdodDogY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSwKICAgIHdpZHRoOiBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUsCiAgfTsKICBjaGFuZ2VDb250YWluZXJTaXplKGhlYWRlcl9kYXRhKTsKfQovLyBXZSBhc3NpZ24gdGhpcyBmdW5jdGlvbiB0byB0aGUgb25ibHVyIGV2ZW50IG9mIHdpZHRoIGFuZCBoZWlnaHQKaWYgKGZpcnN0UnVuKSB7CiAgZm9yIChjb25zdCBjb250YWluZXIgb2YgT2JqZWN0LnZhbHVlcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIudWlfc3Bhbi5vbmJsdXIgPSAoZSkgPT4gewogICAgICBjb250YWluZXIudWlfdmFsdWUgPSBjb250YWluZXIudWlfc3Bhbi50ZXh0Q29udGVudDsKICAgICAgdXBkYXRlRnJvbUhlYWRlcigpOwogICAgfTsKICB9Cn0KLy8gVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgcGxvdCBzaXplIHRvIHVzZSBmb3IgcmVsYXlvdXQgYXMgYSBmdW5jdGlvbiBvZiB0aGUgY29udGFpbmVyIHNpemUKZnVuY3Rpb24gY29tcHV0ZVBsb3RTaXplKGRhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgLy8gUmVtb3ZlIFBhZGRpbmcKICBjb25zdCB7IGNvbnRhaW5lcl9wYWQsIHBsb3RfcGFkLCBjb250YWluZXJfcmVjdCB9ID0gZGF0YTsKICBjb25zdCBvZmZzZXRzID0gewogICAgd2lkdGg6CiAgICAgIHBsb3RfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBwbG90X3BhZC5ib3JkZXIud2lkdGggKwogICAgICBwbG90X3BhZC5vZmZzZXQubGVmdCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy53aWR0aCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLndpZHRoLAogICAgaGVpZ2h0OgogICAgICBwbG90X3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIHBsb3RfcGFkLmJvcmRlci5oZWlnaHQgKwogICAgICBwbG90X3BhZC5vZmZzZXQudG9wICsKICAgICAgY29udGFpbmVyX3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLmhlaWdodCwKICB9OwogIGNvbnN0IHN6ID0gewogICAgd2lkdGg6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3Qud2lkdGggLSBvZmZzZXRzLndpZHRoKSwKICAgIGhlaWdodDogTWF0aC5yb3VuZChjb250YWluZXJfcmVjdC5oZWlnaHQgLSBvZmZzZXRzLmhlaWdodCksCiAgICBvZmZzZXRzLAogIH07CiAgcmV0dXJuIHN6Owp9CgovLyBDcmVhdGUgdGhlIHJlc2l6ZU9ic2VydmVyIHRvIG1ha2UgdGhlIHBsb3QgZXZlbiBtb3JlIHJlc3BvbnNpdmUhIDptYWdpYzoKY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHsKICBjb25zdCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCk7CiAgY29uc3Qge2NvbnRhaW5lcl9yZWN0LCBjb250YWluZXJfcGFkfSA9IHNpemVEYXRhOwogIGxldCBwbG90X3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIC8vIFdlIHNhdmUgdGhlIGhlaWdodCBpbiB0aGUgUExPVCBvYmplY3QKICBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQ7CiAgLy8gV2UgZGVhbCB3aXRoIHNvbWUgc3R1ZmYgaWYgdGhlIGNvbnRhaW5lciBpcyBwb3BwcGVkCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9IGNvbnRhaW5lcl9yZWN0LndpZHRoICsgInB4IjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBjb250YWluZXJfcmVjdC5sZWZ0ICsgInB4IjsKICBjb25maWdfc3BhbnMuaGVpZ2h0LnVpX3ZhbHVlID0gcGxvdF9zaXplLmhlaWdodDsKICBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUgPSBwbG90X3NpemUud2lkdGg7CiAgLyogCgkJVGhlIGFkZGl0aW9uIG9mIHRoZSBpbnZhbGlkIGFyZ3VtZW50IGBwbHV0b3Jlc2l6ZWAgc2VlbXMgdG8gZml4IHRoZSBwcm9ibGVtIHdpdGggY2FsbGluZyBgcmVsYXlvdXRgIHNpbXBseSB3aXRoIGB7YXV0b3NpemU6IHRydWV9YCBhcyB1cGRhdGUgYnJlYWtpbmcgbW91c2UgcmVsYXlvdXQgZXZlbnRzIHRyYWNraW5nLiAKCQlTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Bsb3RseS9wbG90bHkuanMvaXNzdWVzLzYxNTYgZm9yIGRldGFpbHMKCQkqLwogIGxldCBjb25maWcgPSB7CiAgICAvLyBJZiB0aGlzIGlzIHBvcHBlZCBvdXQsIHdlIGlnbm9yZSB0aGUgb3JpZ2luYWwgd2lkdGgvaGVpZ2h0CiAgICB3aWR0aDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfd2lkdGgpID8/IHBsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfaGVpZ2h0KSA/PyBwbG90X3NpemUuaGVpZ2h0LAogICAgcGx1dG9yZXNpemU6IHRydWUsCiAgfTsKICBQbG90bHkucmVsYXlvdXQoUExPVCwgY29uZmlnKS50aGVuKCgpID0+IHsKICAgIGlmIChyZW1vdmVfY29udGFpbmVyX3NpemUgJiYgIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIHRoZSBmaXJzdCByZXNpemUgdXBvbiBwbG90IGNyZWF0aW9uIHRvIGFscmVhZHkgYmUgd2l0aG91dCBhIGZpeGVkIGhlaWdodAogICAgICBDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gIiI7CiAgICAgIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogICAgICByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmYWxzZTsKICAgIH0KICB9KTsKfSk7CgpyZXNpemVPYnNlcnZlci5vYnNlcnZlKENPTlRBSU5FUik7CgoKUGxvdGx5LnJlYWN0KFBMT1QsIHBsb3Rfb2JqKS50aGVuKCgpID0+IHsKCS8vIEFzc2lnbiB0aGUgUGxvdGx5IGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKHBsb3RseV9saXN0ZW5lcnMpKSB7CgkJZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcl92ZWMpIHsKCQkJUExPVC5vbihrZXksIGxpc3RlbmVyKQoJCX0KCX0KCS8vIEFzc2lnbiB0aGUgSlMgZXZlbnQgbGlzdGVuZXJzCglmb3IgKGNvbnN0IFtrZXksIGxpc3RlbmVyX3ZlY10gb2YgT2JqZWN0LmVudHJpZXMoanNfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1QuYWRkRXZlbnRMaXN0ZW5lcihrZXksIGxpc3RlbmVyLCB7CgkJCQlzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsCgkJCX0pCgkJfQoJfQp9CikKCgppbnZhbGlkYXRpb24udGhlbigoKSA9PiB7CgkvLyBSZW1vdmUgYWxsIHBsb3RseSBsaXN0ZW5lcnMKCVBMT1QucmVtb3ZlQWxsTGlzdGVuZXJzKCkKCS8vIFJlbW92ZSBhbGwgSlMgbGlzdGVuZXJzCgljb250cm9sbGVyLmFib3J0KCkKCS8vIFJlbW92ZSB0aGUgcmVzaXplT2JzZXJ2ZXIKCXJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKQp9KQoKCgoJCXJldHVybiBDT05UQUlORVIKCTwvc2NyaXB0PgqkbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlqmtzcGFjZV9ncmWybGFzdF9ydW5fdGltZXN0YW1wy0HZv8hN+Eq6sHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQzYWJjYTQwNi0yZTZiLTRiMzctODgzNS02NWNmYWQ5ZDBjYWG5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc5h73ZktXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5HZNTdiY2MwNWIwLTgxZGEtMTFlZi0yMDQwLTM1ODVjOWI0OTU0Zi83NjRmMTVhZjk1MDMyNWVmuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDA5NzU1NDdkLTY3ZDktNGU2Yi04OGZmLWE5ZGQwNmE3ZjllZoqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnaaokJPHNjcmlwdCBpZD0ncGxvdF8xJz4KCQkvLyBXZSBzdGFydCBieSBwdXR0aW5nIGFsbCB0aGUgdmFyaWFibGUgaW50ZXJwb2xhdGlvbiBoZXJlIGF0IHRoZSBiZWdpbm5pbmcKCQkvLyBXZSBoYXZlIHRvIGNvbnZlcnQgYWxsIHR5cGVkYXJyYXlzIGluIHRoZSBsYXlvdXQgdG8gbm9ybWFsIGFycmF5cy4gU2VlIElzc3VlICMyNQoJCS8vIFdlIHVzZSBsb2Rhc2ggZm9yIHRoaXMgZm9yIGNvbXBhY3RuZXNzCgkJZnVuY3Rpb24gcmVtb3ZlVHlwZWRBcnJheShvKSB7CgkJCXJldHVybiBfLmlzVHlwZWRBcnJheShvKSA/IEFycmF5LmZyb20obykgOgoJCQlfLmlzUGxhaW5PYmplY3QobykgPyBfLm1hcFZhbHVlcyhvLCByZW1vdmVUeXBlZEFycmF5KSA6IAoJCQlvCgkJfQoKCQkvLyBQdWJsaXNoIHRoZSBwbG90IG9iamVjdCB0byBKUwoJCWxldCBwbG90X29iaiA9IF8udXBkYXRlKC8qIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgQWJzdHJhY3RQbHV0b0RpbmdldGplcy5EaXNwbGF5LnB1Ymxpc2hlZF90b19qcyAqLyBnZXRQdWJsaXNoZWRPYmplY3QoIjdiY2MwNWIwLTgxZGEtMTFlZi0yMDQwLTM1ODVjOWI0OTU0Zi85NTlhNmRiZTM3ZTZlOTA5IiksICJsYXlvdXQiLCByZW1vdmVUeXBlZEFycmF5KQoJCS8vIEdldCB0aGUgcGxvdGx5IGxpc3RlbmVycwoJCWNvbnN0IHBsb3RseV9saXN0ZW5lcnMgPSB7fQoJCS8vIEdldCB0aGUgSlMgbGlzdGVuZXJzCgkJY29uc3QganNfbGlzdGVuZXJzID0ge30KCQkvLyBEZWFsIHdpdGggZXZlbnR1YWwgY3VzdG9tIGNsYXNzZXMKCQlsZXQgY3VzdG9tX2NsYXNzbGlzdCA9IFtdCgoKCQkvLyBMb2FkIHRoZSBwbG90bHkgbGlicmFyeQoJCWxldCBQbG90bHkgPSB1bmRlZmluZWQKCQl0cnkgewoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiLi9wbG90bHlqcy9wbG90bHlqcy0yLjI2LjIubWluLmpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfSBjYXRjaCAoZSkgewoJCQljb25zb2xlLmxvZygiTG9jYWwgbG9hZCBmYWlsZWQsIHRyeWluZyB3aXRoIHRoZSB3ZWIgZXNtLnNoIHZlcnNpb24iKQoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiaHR0cHM6Ly9lc20uc2gvdjEzNS9wbG90bHkuanMtZGlzdC1taW5AMi4yNi4yL2VzbmV4dC9wbG90bHkuanMtZGlzdC1taW4ubWpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfQoKCQkvLyBDaGVjayBpZiB3ZSBoYXZlIHRvIGZvcmNlIGxvY2FsIG1hdGhqYXggZm9udCBjYWNoZQoJCWlmIChmYWxzZSAmJiB3aW5kb3c/Lk1hdGhKYXg/LmNvbmZpZz8uc3ZnPy5mb250Q2FjaGUgPT09ICdnbG9iYWwnKSB7CgkJCXdpbmRvdy5NYXRoSmF4LmNvbmZpZy5zdmcuZm9udENhY2hlID0gJ2xvY2FsJwoJCX0KCgkJLy8gRmxhZyB0byBjaGVjayBpZiB0aGlzIGNlbGwgd2FzICBtYW51YWxseSByYW4gb3IgcmVhY3RpdmVseSByYW4KY29uc3QgZmlyc3RSdW4gPSB0aGlzID8gZmFsc2UgOiB0cnVlCmNvbnN0IENPTlRBSU5FUiA9IHRoaXMgPz8gaHRtbGA8ZGl2IGNsYXNzPSdwbHV0b3Bsb3RseS1jb250YWluZXInPmAKY29uc3QgUExPVCA9IENPTlRBSU5FUi5xdWVyeVNlbGVjdG9yKCcuanMtcGxvdGx5LXBsb3QnKSA/PyBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2PmApCmNvbnN0IHBhcmVudCA9IENPTlRBSU5FUi5wYXJlbnRFbGVtZW50Ci8vIFdlIHVzZSBhIGNvbnRyb2xsZXIgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVycyB1cG9uIGludmFsaWRhdGlvbgpjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpCi8vIFdlIGhhdmUgdG8gYWRkIHRoaXMgdG8ga2VlcCBzdXBwb3J0aW5nIEBiaW5kIHdpdGggdGhlIG9sZCBBUEkgdXNpbmcgUExPVApQTE9ULmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGUpID0+IHsKCUNPTlRBSU5FUi52YWx1ZSA9IFBMT1QudmFsdWUKCWlmIChlLmJ1YmJsZXMpIHsKCQlyZXR1cm4KCX0KCUNPTlRBSU5FUi5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnaW5wdXQnKSkKfSwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pCgoJLy8gVGhpcyBjcmVhdGUgdGhlIHN0eWxlIHN1YmRpdiBvbiBmaXJzdCBydW4KCWZpcnN0UnVuICYmIENPTlRBSU5FUi5hcHBlbmRDaGlsZChodG1sYAoJPHN0eWxlPgoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciB7CgkJd2lkdGg6IDEwMCU7CgkJaGVpZ2h0OiAxMDAlOwoJCW1pbi1oZWlnaHQ6IDA7CgkJbWluLXdpZHRoOiAwOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciAuanMtcGxvdGx5LXBsb3QgLnBsb3RseSBkaXYgewoJCW1hcmdpbjogMCBhdXRvOyAvLyBUaGlzIGNlbnRlcnMgdGhlIHBsb3QKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIucG9wcGVkLW91dCB7CgkJb3ZlcmZsb3c6IGF1dG87CgkJei1pbmRleDogMTAwMDsKCQlwb3NpdGlvbjogZml4ZWQ7CgkJcmVzaXplOiBib3RoOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMHB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwcHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciB7CgkJZGlzcGxheTogZmxleDsKCQlmbGV4LWZsb3c6IHJvdyB3cmFwOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDEycHg7CgkJcG9zaXRpb246IGZpeGVkOwoJCXotaW5kZXg6IDEwMDE7CgkJY3Vyc29yOiBtb3ZlOwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgLTEwMCUpOwoJCXBhZGRpbmc6IDVweDsKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIHNwYW4gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQlmbGV4OiAxCgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlci5oaWRkZW4gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuY2xpcGJvYXJkLXNwYW4gewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCX0KCS5jbGlwYm9hcmQtdmFsdWUgewoJCXBhZGRpbmctcmlnaHQ6IDVweDsKCQlwYWRkaW5nLWxlZnQ6IDJweDsKCQljdXJzb3I6IHRleHQ7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlmbGV4OiAwIDAgMTAwJTsKCQl0ZXh0LWFsaWduOiBjZW50ZXI7CgkJYm9yZGVyLXRvcDogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCW1hcmdpbi10b3A6IDVweDsKCQlkaXNwbGF5OiBub25lOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5maWxlc2F2ZSAuY2xpcGJvYXJkLXNwYW4uZmlsZW5hbWUgewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5jbGlwYm9hcmQtdmFsdWUuZmlsZW5hbWUgewoJCW1hcmdpbi1sZWZ0OiAzcHg7CgkJdGV4dC1hbGlnbjogbGVmdDsKCQltaW4td2lkdGg6IG1pbig2MCUsIG1pbi1jb250ZW50KTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogaW5saW5lLWZsZXg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IC5sYWJlbCB7CgkJZmxleDogMCAwIDA7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZvcm1hdCB7CgkJcG9zaXRpb246IHJlbGF0aXZlOwoJCWZsZXg6IDEgMCBhdXRvOwoJCW1pbi13aWR0aDogMzBweDsKCQltYXJnaW4tcmlnaHQ6IDEwcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJCWZsZXgtZmxvdzogY29sdW1uOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXBhZGRpbmctbGVmdDogM3B4OwoJCXotaW5kZXg6IDIwMDA7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgewoJCWN1cnNvcjogcG9pbnRlcjsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlwYWRkaW5nOiAzcHg7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTNweCwgLTZweCk7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5mb3JtYXQtb3B0aW9uOm5vdCguc2VsZWN0ZWQpIHsKCQltYXJnaW4tdG9wOiAzcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24uc2VsZWN0ZWQgewoJCW9yZGVyOiAtMTsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpob3ZlciB7CgkJYmFja2dyb3VuZC1jb2xvcjogdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7Cgl9CglzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZm9udC13ZWlnaHQ6IG5vcm1hbDsKCQljb2xvcjogdmFyKC0tcGx1dG8tb3V0cHV0LWNvbG9yKTsKCQlkaXNwbGF5OiBub25lOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgY2FsYygtMTAwJSAtIDEwcHgpKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkubGFiZWwgewoJCXVzZXItc2VsZWN0OiBub25lOwoJfQoJLmxhYmVsOmhvdmVyIHNwYW4uY29uZmlnLXZhbHVlIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJbWluLXdpZHRoOiAxNTBweDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5tYXRjaGluZy1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tbWFjcm8tY29sb3IpOwoJCWZvbnQtd2VpZ2h0OiBib2xkOwoJfQoJLmNsaXBib2FyZC1zcGFuLmRpZmZlcmVudC1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tdGFnLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KPC9zdHlsZT4KYCkKCmxldCBvcmlnaW5hbF9oZWlnaHQgPSBwbG90X29iai5sYXlvdXQuaGVpZ2h0CmxldCBvcmlnaW5hbF93aWR0aCA9IHBsb3Rfb2JqLmxheW91dC53aWR0aAovLyBGb3IgdGhlIGhlaWdodCB3ZSBoYXZlIHRvIGFsc28gcHV0IGEgZml4ZWQgdmFsdWUgaW4gY2FzZSB0aGUgcGxvdCBpcyBwdXQgb24gYSBub24tZml4ZWQtc2l6ZSBjb250YWluZXIgKGxpa2UgdGhlIGRlZmF1bHQgd3JhcHBlcikKLy8gV2UgZGVmaW5lIGEgdmFyaWFibGUgdG8gY2hlY2sgd2hldGhlciB3ZSBzdGlsbCBoYXZlIHRvIHJlbW92ZSB0aGUgZml4ZWQgaGVpZ2h0CmxldCByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmaXJzdFJ1bgpsZXQgY29udGFpbmVyX2hlaWdodCA9IG9yaWdpbmFsX2hlaWdodCA/PyBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPz8gNDAwCkNPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfaGVpZ2h0ICsgJ3B4JwoKLy8gV2UgY3JlYXRlIGEgUHJvbWlzZSB2ZXJzaW9uIG9mIHNldFRpbWVvdXQKZnVuY3Rpb24gZGVsYXkobXMpIHsKICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTsKfQoKLy8gV2UgaW1wb3J0IGludGVyYWN0IGZvciBkcmFnZ2luZy9yZXNpemluZwpjb25zdCB7IGRlZmF1bHQ6IGludGVyYWN0IH0gPSBhd2FpdCBpbXBvcnQoJ2h0dHBzOi8vZXNtLnNoL2ludGVyYWN0anNAMS4xMC4xOScpCgoKZnVuY3Rpb24gZ2V0SW1hZ2VPcHRpb25zKCkgewogIGNvbnN0IG8gPSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPz8ge307CiAgcmV0dXJuIHsKICAgIGZvcm1hdDogby5mb3JtYXQgPz8gInBuZyIsCiAgICB3aWR0aDogby53aWR0aCA/PyBvcmlnaW5hbF93aWR0aCwKICAgIGhlaWdodDogby5oZWlnaHQgPz8gb3JpZ2luYWxfaGVpZ2h0LAogICAgc2NhbGU6IG8uc2NhbGUgPz8gMSwKICAgIGZpbGVuYW1lOiBvLmZpbGVuYW1lID8/ICJuZXdwbG90IiwKICB9Owp9Cgpjb25zdCBDTElQQk9BUkRfSEVBREVSID0KICBDT05UQUlORVIucXVlcnlTZWxlY3RvcigiLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIiKSA/PwogIENPTlRBSU5FUi5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAiYWZ0ZXJiZWdpbiIsCiAgICBodG1sYDxkaXYgY2xhc3M9InBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgaGlkZGVuIj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZvcm1hdCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5Gb3JtYXQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZm9ybWF0Ij48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHdpZHRoIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPldpZHRoOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIHdpZHRoIj48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gaGVpZ2h0IgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkhlaWdodDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBoZWlnaHQiPjwvc3Bhbj5weDwvc3BhbgogICAgICA+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzY2FsZSIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5TY2FsZTo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBzY2FsZSI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHNldCI+U2V0PC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHVuc2V0Ij5VbnNldDwvYnV0dG9uPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gZmlsZW5hbWUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+RmlsZW5hbWU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZmlsZW5hbWUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgPC9kaXY+YAogICk7CgpmdW5jdGlvbiBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKSB7CiAgY29uc3QgdmFsaWRfY2xhc3NlcyA9IFsKICAgICJtaXNzaW5nLWNvbmZpZyIsCiAgICAibWF0Y2hpbmctY29uZmlnIiwKICAgICJkaWZmZXJlbnQtY29uZmlnIiwKICBdOwogIGZ1bmN0aW9uIHNldENsYXNzKGNsKSB7CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgdmFsaWRfY2xhc3NlcykgewogICAgICBjb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZShuYW1lLCBuYW1lID09IGNsKTsKICAgIH0KICB9CiAgLy8gV2UgdXNlIHRoZSBjdXN0b20gZ2V0dGVycyB3ZSdsbCBzZXQgdXAgaW4gdGhlIGNvbnRhaW5lcgogIGNvbnN0IHsgdWlfdmFsdWUsIGNvbmZpZ192YWx1ZSwgY29uZmlnX3NwYW4sIGtleSB9ID0gY29udGFpbmVyOwogIGlmIChjb25maWdfdmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgc2V0Q2xhc3MoIm1pc3NpbmctY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGlzIG5vdCBwcmVzZW50IGluIHRoZSBjb25maWcuYDsKICB9IGVsc2UgaWYgKHVpX3ZhbHVlID09IGNvbmZpZ192YWx1ZSkgewogICAgc2V0Q2xhc3MoIm1hdGNoaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgdGhlIHNhbWUgdmFsdWUgaW4gdGhlIGNvbmZpZyBhbmQgaW4gdGhlIGhlYWRlci5gOwogIH0gZWxzZSB7CiAgICBzZXRDbGFzcygiZGlmZmVyZW50LWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgYSBkaWZmZXJlbnQgdmFsdWUgKDxlbT4ke2NvbmZpZ192YWx1ZX08L2VtPikgaW4gdGhlIGNvbmZpZy5gOwogIH0KICAvLyBBZGQgaW5mbyBhYm91dCBzZXR0aW5nIGFuZCB1bnNldHRpbmcKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgb24gdGhlIGxhYmVsIDxlbT48Yj5vbmNlPC9iPjwvZW0+IHRvIHNldCB0aGUgY3VycmVudCBVSSB2YWx1ZSBpbiB0aGUgY29uZmlnLmAKICApOwogIGNvbmZpZ19zcGFuLmluc2VydEFkamFjZW50SFRNTCgKICAgICJiZWZvcmVlbmQiLAogICAgYDxicj5DbGljayA8ZW0+PGI+dHdpY2U8L2I+PC9lbT4gdG8gcmVtb3ZlIHRoaXMga2V5IGZyb20gdGhlIGNvbmZpZy5gCiAgKTsKfQoKY29uc3QgdmFsaWRfZm9ybWF0cyA9IFsicG5nIiwgInN2ZyIsICJ3ZWJwIiwgImpwZWciLCAiZnVsbC1qc29uIl07CmZ1bmN0aW9uIGluaXRpYWxpemVVSVZhbHVlU3BhbihzcGFuLCBrZXksIHZhbHVlKSB7CiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9IGtleSA9PT0gImZvcm1hdCIgPyAiZmFsc2UiIDogInRydWUiOwogIGxldCBwYXJzZSA9ICh4KSA9PiB4OwogIGxldCB1cGRhdGUgPSAoeCkgPT4gKHNwYW4udGV4dENvbnRlbnQgPSB4KTsKICBpZiAoa2V5ID09PSAid2lkdGgiIHx8IGtleSA9PT0gImhlaWdodCIpIHsKICAgIHBhcnNlID0gKHgpID0+IE1hdGgucm91bmQocGFyc2VGbG9hdCh4KSk7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJzY2FsZSIpIHsKICAgIHBhcnNlID0gcGFyc2VGbG9hdDsKICB9IGVsc2UgaWYgKGtleSA9PT0gImZvcm1hdCIpIHsKICAgIC8vIFdlIHJlbW92ZSBjb250ZW50RWRpdGFibGUKICAgIHNwYW4uY29udGVudEVkaXRhYmxlID0gImZhbHNlIjsKICAgIC8vIEhlcmUgd2UgZmlyc3QgYWRkIHRoZSBzdWJzcGFucyBmb3IgZWFjaCBvcHRpb24KICAgIGNvbnN0IG9wdHNfZGl2ID0gc3Bhbi5hcHBlbmRDaGlsZChodG1sYDxkaXYgY2xhc3M9ImZvcm1hdC1vcHRpb25zIj48L2Rpdj5gKTsKICAgIGZvciAoY29uc3QgZm10IG9mIHZhbGlkX2Zvcm1hdHMpIHsKICAgICAgY29uc3Qgb3B0ID0gb3B0c19kaXYuYXBwZW5kQ2hpbGQoCiAgICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iZm9ybWF0LW9wdGlvbiAke2ZtdH0iPiR7Zm10fTwvc3Bhbj5gCiAgICAgICk7CiAgICAgIG9wdC5vbmNsaWNrID0gKGUpID0+IHsKICAgICAgICBzcGFuLnZhbHVlID0gb3B0LnRleHRDb250ZW50OwogICAgICB9OwogICAgfQogICAgcGFyc2UgPSAoeCkgPT4gewogICAgICByZXR1cm4gdmFsaWRfZm9ybWF0cy5pbmNsdWRlcyh4KSA/IHggOiBsb2NhbFZhbHVlOwogICAgfTsKICAgIHVwZGF0ZSA9ICh4KSA9PiB7CiAgICAgIGZvciAoY29uc3Qgb3B0IG9mIG9wdHNfZGl2LmNoaWxkcmVuKSB7CiAgICAgICAgb3B0LmNsYXNzTGlzdC50b2dnbGUoInNlbGVjdGVkIiwgb3B0LnRleHRDb250ZW50ID09PSB4KTsKICAgICAgfQogICAgfTsKICB9IGVsc2UgewogICAgLy8gV2Ugb25seSBoYXZlIGZpbGVuYW1lIGhlcmUKICB9CiAgbGV0IGxvY2FsVmFsdWU7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwYW4sICJ2YWx1ZSIsIHsKICAgIGdldDogKCkgPT4gewogICAgICByZXR1cm4gbG9jYWxWYWx1ZTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgaWYgKHZhbCAhPT0gIiIpIHsKICAgICAgICBsb2NhbFZhbHVlID0gcGFyc2UodmFsKTsKICAgICAgfQogICAgICB1cGRhdGUobG9jYWxWYWx1ZSk7CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKICAvLyBXZSBhbHNvIGFzc2lnbiBhIGxpc3RlbmVyIHNvIHRoYXQgdGhlIGVkaXRhYmxlIGlzIGJsdXJyZWQgd2hlbiBlbnRlciBpcyBwcmVzc2VkCiAgc3Bhbi5vbmtleWRvd24gPSAoZSkgPT4gewogICAgaWYgKGUua2V5Q29kZSA9PT0gMTMpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBzcGFuLmJsdXIoKTsKICAgIH0KICB9OwogIHNwYW4udmFsdWUgPSB2YWx1ZTsKfQoKZnVuY3Rpb24gaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3BhbihzcGFuLCBrZXkpIHsKICAvLyBIZXJlIHdlIG1vc3RseSB3YW50IHRvIGRlZmluZSB0aGUgc2V0dGVyIGFuZCBnZXR0ZXIKICBjb25zdCBjb250YWluZXIgPSBzcGFuLmNsb3Nlc3QoIi5jbGlwYm9hcmQtc3BhbiIpOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgfSwKICAgIHNldDogKHZhbCkgPT4gewogICAgICAvLyBpZiB1bmRlZmluZWQgaXMgcGFzc2VkLCB3ZSByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIG9wdGlvbnMKICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZGVsZXRlIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgICB9IGVsc2UgewogICAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldID0gdmFsOwogICAgICB9CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKfQoKY29uc3QgY29uZmlnX3NwYW5zID0ge307CmZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGdldEltYWdlT3B0aW9ucygpKSkgewogIGNvbnN0IGNvbnRhaW5lciA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcihgLmNsaXBib2FyZC1zcGFuLiR7a2V5fWApOwogIGNvbnN0IGxhYmVsID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5sYWJlbCIpOwogIC8vIFdlIGdpdmUgdGhlIGxhYmVsIGEgZnVuY3Rpb24gdGhhdCBvbiBzaW5nbGUgY2xpY2sgd2lsbCBzZXQgdGhlIGN1cnJlbnQgdmFsdWUgYW5kIHdpdGggZG91YmxlIGNsaWNrIHdpbGwgdW5zZXQgaXQKICBsYWJlbC5vbmNsaWNrID0gRHVhbENsaWNrKAogICAgKCkgPT4gewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfSwKICAgIChlKSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJlIiwgZSk7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IHVuZGVmaW5lZDsKICAgIH0KICApOwogIGNvbnN0IHVpX3ZhbHVlX3NwYW4gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC12YWx1ZSIpOwogIGNvbnN0IGNvbmZpZ192YWx1ZV9zcGFuID0KICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuY29uZmlnLXZhbHVlIikgPz8KICAgIGxhYmVsLmluc2VydEFkamFjZW50RWxlbWVudCgKICAgICAgImFmdGVyYmVnaW4iLAogICAgICBodG1sYDxzcGFuIGNsYXNzPSJjb25maWctdmFsdWUiPjwvc3Bhbj5gCiAgICApOwogIC8vIEFzc2luZyB0aGUgdHdvIHNwYW5zIGFzIHByb3BlcnRpZXMgb2YgdGhlIGNvbnRhaW5pbmcgc3BhbgogIGNvbnRhaW5lci51aV9zcGFuID0gdWlfdmFsdWVfc3BhbjsKICBjb250YWluZXIuY29uZmlnX3NwYW4gPSBjb25maWdfdmFsdWVfc3BhbjsKICBjb250YWluZXIua2V5ID0ga2V5OwogIGNvbmZpZ19zcGFuc1trZXldID0gY29udGFpbmVyOwogIGlmIChmaXJzdFJ1bikgewogICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID0KICAgICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogICAgLy8gV2UgZG8gdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSB2YWx1ZSBzcGFuCiAgICBpbml0aWFsaXplVUlWYWx1ZVNwYW4odWlfdmFsdWVfc3Bhbiwga2V5LCB2YWx1ZSk7CiAgICAvLyBUaGVuIHdlIGluaXRpYWxpemUgdGhlIGNvbmZpZyB2YWx1ZQogICAgaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3Bhbihjb25maWdfdmFsdWVfc3Bhbiwga2V5KTsKICAgIC8vIFdlIHB1dCBzb21lIGNvbnZlbmllbmNlIGdldHRlcnMvc2V0dGVycwogICAgLy8gdWlfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgInVpX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IHVpX3ZhbHVlX3NwYW4udmFsdWUsCiAgICAgIHNldDogKHZhbCkgPT4gewogICAgICAgIHVpX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICAgIC8vIGNvbmZpZ192YWx1ZSBmb3J3YXJkCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAiY29uZmlnX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IGNvbmZpZ192YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSA9IHZhbDsKICAgICAgfSwKICAgIH0pOwogIH0KfQoKLy8gVGhlc2Ugb2JqZWN0cyB3aWxsIGNvbnRhaW4gdGhlIGRlZmF1bHQgdmFsdWUKCi8vIFRoaXMgY29kZSB1cGRhdGVzIHRoZSBpbWFnZSBvcHRpb25zIGluIHRoZSBQTE9UIGNvbmZpZyB3aXRoIHRoZSBwcm92aWRlZCBvbmVzCmZ1bmN0aW9uIHNldEltYWdlT3B0aW9ucyhvKSB7CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBvW2tleV07CiAgfQp9CmZ1bmN0aW9uIHVuc2V0SW1hZ2VPcHRpb25zKCkgewogIHNldEltYWdlT3B0aW9ucyh7fSk7Cn0KCmNvbnN0IHNldF9idXR0b24gPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtc3Bhbi5zZXQiKTsKY29uc3QgdW5zZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4udW5zZXQiKTsKaWYgKGZpcnN0UnVuKSB7CiAgc2V0X2J1dHRvbi5vbmNsaWNrID0gKGUpID0+IHsKICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfQogIH07CiAgdW5zZXRfYnV0dG9uLm9uY2xpY2sgPSB1bnNldEltYWdlT3B0aW9uczsKfQoKLy8gV2UgYWRkIGEgZnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIGNsaXBib2FyZCBpcyBwb3BwZWQgb3V0CkNPTlRBSU5FUi5pc1BvcHBlZE91dCA9ICgpID0+IHsKICByZXR1cm4gQ09OVEFJTkVSLmNsYXNzTGlzdC5jb250YWlucygicG9wcGVkLW91dCIpOwp9OwoKQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNlZG93biA9IGZ1bmN0aW9uIChldmVudCkgewogIGlmIChldmVudC50YXJnZXQubWF0Y2hlcygic3Bhbi5jbGlwYm9hcmQtdmFsdWUiKSkgewogICAgY29uc29sZS5sb2coIldlIGRvbid0IG1vdmUhIik7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IHN0YXJ0ID0gewogICAgbGVmdDogcGFyc2VGbG9hdChDT05UQUlORVIuc3R5bGUubGVmdCksCiAgICB0b3A6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLnRvcCksCiAgICBYOiBldmVudC5wYWdlWCwKICAgIFk6IGV2ZW50LnBhZ2VZLAogIH07CiAgZnVuY3Rpb24gbW92ZUF0KGV2ZW50LCBzdGFydCkgewogICAgY29uc3QgdG9wID0gZXZlbnQucGFnZVkgLSBzdGFydC5ZICsgc3RhcnQudG9wICsgInB4IjsKICAgIGNvbnN0IGxlZnQgPSBldmVudC5wYWdlWCAtIHN0YXJ0LlggKyBzdGFydC5sZWZ0ICsgInB4IjsKICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUudG9wID0gdG9wOwogIH0KCiAgLy8gbW92ZSBvdXIgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGJhbGwgdW5kZXIgdGhlIHBvaW50ZXIKICBtb3ZlQXQoZXZlbnQsIHN0YXJ0KTsKICBmdW5jdGlvbiBvbk1vdXNlTW92ZShldmVudCkgewogICAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgfQoKICAvLyBXZSB1c2UgdGhpcyB0byByZW1vdmUgdGhlIG1vdXNlbW92ZSB3aGVuIGNsaWNraW5nIG91dHNpZGUgb2YgdGhlIGNvbnRhaW5lcgogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CgogIC8vIG1vdmUgdGhlIGNvbnRhaW5lciBvbiBtb3VzZW1vdmUKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCBvbk1vdXNlTW92ZSwgewogICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCwKICB9KTsKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICBjbGVhblVwKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKCiAgZnVuY3Rpb24gY2xlYW5VcCgpIHsKICAgIGNvbnNvbGUubG9nKCJjbGVhbmluZyB1cCB0aGUgcGxvdCBtb3ZlIGxpc3RlbmVyIik7CiAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICBDTElQQk9BUkRfSEVBREVSLm9ubW91c2V1cCA9IG51bGw7CiAgfQoKICAvLyAoMykgZHJvcCB0aGUgYmFsbCwgcmVtb3ZlIHVubmVlZGVkIGhhbmRsZXJzCiAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBjbGVhblVwOwp9OwoKZnVuY3Rpb24gc2VuZFRvQ2xpcGJvYXJkKGJsb2IpIHsKICBpZiAoIW5hdmlnYXRvci5jbGlwYm9hcmQpIHsKICAgIGFsZXJ0KAogICAgICAiVGhlIENsaXBib2FyZCBBUEkgZG9lcyBub3Qgc2VlbSB0byBiZSBhdmFpbGFibGUsIG1ha2Ugc3VyZSB0aGUgUGx1dG8gbm90ZWJvb2sgaXMgYmVpbmcgdXNlZCBmcm9tIGVpdGhlciBsb2NhbGhvc3Qgb3IgYW4gaHR0cHMgc291cmNlLiIKICAgICk7CiAgfQogIG5hdmlnYXRvci5jbGlwYm9hcmQKICAgIC53cml0ZShbCiAgICAgIG5ldyBDbGlwYm9hcmRJdGVtKHsKICAgICAgICAvLyBUaGUga2V5IGlzIGRldGVybWluZWQgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIGJsb2IncyB0eXBlLgogICAgICAgIFtibG9iLnR5cGVdOiBibG9iLAogICAgICB9KSwKICAgIF0pCiAgICAudGhlbigKICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgIGNvbnNvbGUubG9nKCJBc3luYzogQ29weWluZyB0byBjbGlwYm9hcmQgd2FzIHN1Y2Nlc3NmdWwhIik7CiAgICAgIH0sCiAgICAgIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJBc3luYzogQ291bGQgbm90IGNvcHkgdGV4dDogIiwgZXJyKTsKICAgICAgfQogICAgKTsKfQoKZnVuY3Rpb24gY29weUltYWdlVG9DbGlwYm9hcmQoKSB7CiAgLy8gV2UgZXh0cmFjdCB0aGUgaW1hZ2Ugb3B0aW9ucyBmcm9tIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzIChpZiB0aGV5IGV4aXN0KQogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuIFdlIGFsc28gaWdub3JlIGZvcm1hdCBiZWNhdXNlIHRoZSBjbGlwYm9hcmQgb25seSBzdXBwb3J0cyBwbmcuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwga2V5ID09PSAiZm9ybWF0IikgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbmZpZ1trZXldID0gdmFsOwogIH0KICBQbG90bHkudG9JbWFnZShQTE9ULCBjb25maWcpLnRoZW4oZnVuY3Rpb24gKGRhdGFVcmwpIHsKICAgIGZldGNoKGRhdGFVcmwpCiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5ibG9iKCkpCiAgICAgIC50aGVuKChibG9iKSA9PiB7CiAgICAgICAgY29uc3QgcGFzdGVfcmVjZWl2ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdwYXN0ZS1yZWNlaXZlci5wbHV0b3Bsb3RseScpCiAgICAgICAgaWYgKHBhc3RlX3JlY2VpdmVyKSB7CiAgICAgICAgICBwYXN0ZV9yZWNlaXZlci5hdHRhY2hJbWFnZShkYXRhVXJsLCBDT05UQUlORVIpCiAgICAgICAgfQogICAgICAgIHNlbmRUb0NsaXBib2FyZChibG9iKQogICAgICB9KTsKICB9KTsKfQoKZnVuY3Rpb24gc2F2ZUltYWdlVG9GaWxlKCkgewogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LmRvd25sb2FkSW1hZ2UoUExPVCwgY29uZmlnKTsKfQoKbGV0IGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwLCB0b3A6IDAsIGxlZnQ6IDAgfTsKZnVuY3Rpb24gdW5wb3BfY29udGFpbmVyKGNsKSB7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCBmYWxzZSk7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoY2wsIGZhbHNlKTsKICAvLyBXZSBmaXggdGhlIGhlaWdodCBiYWNrIHRvIHRoZSB2YWx1ZSBpdCBoYWQgYmVmb3JlIHBvcG91dCwgYWxzbyBzZXR0aW5nIHRoZSBmbGFnIHRvIHNpZ25hbCB0aGF0IHVwb24gZmlyc3QgcmVzaXplIHdlIHJlbW92ZSB0aGUgZml4ZWQgaW5saW5lLXN0eWxlCiAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9IGNvbnRhaW5lcl9yZWN0LmhlaWdodCArICJweCI7CiAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gdHJ1ZTsKICAvLyBXZSBzZXQgdGhlIG90aGVyIGZpeGVkIGlubGluZS1zdHlsZXMgdG8gbnVsbAogIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogIENPTlRBSU5FUi5zdHlsZS50b3AgPSAiIjsKICBDT05UQUlORVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIFdlIGFsc28gcmVtb3ZlIHRoZSBDTElQQk9BUkRfSEVBREVSCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9ICIiOwogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIEZpbmFsbHkgd2UgcmVtb3ZlIHRoZSBoaWRkZW4gY2xhc3MgdG8gdGhlIGhlYWRlcgogIENMSVBCT0FSRF9IRUFERVIuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgdHJ1ZSk7CiAgcmV0dXJuOwp9CmZ1bmN0aW9uIHBvcG91dF9jb250YWluZXIob3B0cykgewogIGNvbnN0IGNsID0gb3B0cz8uY2w7CiAgY29uc3QgdGFyZ2V0X2NvbnRhaW5lcl9zaXplID0gb3B0cz8udGFyZ2V0X2NvbnRhaW5lcl9zaXplID8/IHt9OwogIGNvbnN0IHRhcmdldF9wbG90X3NpemUgPSBvcHRzPy50YXJnZXRfcGxvdF9zaXplID8/IHt9OwogIGlmIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgcmV0dXJuIHVucG9wX2NvbnRhaW5lcihjbCk7CiAgfQogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBjbCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0cnVlKTsKICAvLyBXZSBleHRyYWN0IHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNvbnRhaW5lciwgc2F2ZSB0aGVtIGFuZCBmaXggdGhlbQogIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH0gPSBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgY29udGFpbmVyX3JlY3QgPSB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9OwogIC8vIFdlIHNhdmUgdGhlIGN1cnJlbnQgcGxvdCBzaXplIGJlZm9yZSB3ZSBwb3AgYXMgaXQgd2lsbCBmaWxsIHRoZSBzY3JlZW4KICBjb25zdCBjdXJyZW50X3Bsb3Rfc2l6ZSA9IHsKICAgIHdpZHRoOiBQTE9ULl9mdWxsTGF5b3V0LndpZHRoLAogICAgaGVpZ2h0OiBQTE9ULl9mdWxsTGF5b3V0LmhlaWdodCwKICB9OwogIC8vIFdlIGhhdmUgdG8gc2F2ZSB0aGUgcGFkIGRhdGEgYmVmb3JlIHBvcHBpbmcgc28gd2UgY2FuIHJlc2l6ZSBwcmVjaXNlbHkKICBjb25zdCBwYWQgPSB7fTsKICBwYWQudW5wb3BwZWQgPSBnZXRTaXplRGF0YSgpLmNvbnRhaW5lcl9wYWQ7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCB0cnVlKTsKICBwYWQucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIC8vIFdlIGRvIHRvcCBhbmQgbGVmdCBiYXNlZCBvbiB0aGUgY3VycmVudCByZWN0CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ0b3AiLCAibGVmdCJdKSB7CiAgICBjb25zdCBzdGFydF92YWwgPSB0YXJnZXRfY29udGFpbmVyX3NpemVba2V5XSA/PyBjb250YWluZXJfcmVjdFtrZXldOwogICAgbGV0IG9mZnNldCA9IDA7CiAgICBmb3IgKGNvbnN0IGtpbmQgb2YgWyJwYWRkaW5nIiwgImJvcmRlciJdKSB7CiAgICAgIG9mZnNldCArPSBwYWQucG9wcGVkW2tpbmRdW2tleV0gLSBwYWQudW5wb3BwZWRba2luZF1ba2V5XTsKICAgIH0KICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gc3RhcnRfdmFsIC0gb2Zmc2V0ICsgInB4IjsKICAgIGlmIChrZXkgPT09ICJsZWZ0IikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgLy8gV2UgY29tcHV0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBkZXBlbmRpbmcgb24gZXZlbnR1YWwgY29uZmlnIGRhdGEKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7CiAgICB3aWR0aDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS53aWR0aCA/PwogICAgICBjb25maWdfc3BhbnMud2lkdGguY29uZmlnX3ZhbHVlID8/CiAgICAgIGN1cnJlbnRfcGxvdF9zaXplLndpZHRoLAogICAgaGVpZ2h0OgogICAgICB0YXJnZXRfcGxvdF9zaXplLmhlaWdodCA/PwogICAgICBjb25maWdfc3BhbnMuaGVpZ2h0LmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS5oZWlnaHQsCiAgfSk7CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgY29uc3QgdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY3N6W2tleV07CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHZhbCArICJweCI7CiAgICBpZiAoa2V5ID09PSAid2lkdGgiKSB7CiAgICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGVba2V5XSA9IENPTlRBSU5FUi5zdHlsZVtrZXldOwogICAgfQogIH0KICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIGZhbHNlKTsKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICB1bnBvcF9jb250YWluZXIoKTsKICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9LAogICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0KICApOwp9CgpDT05UQUlORVIucG9wT3V0ID0gcG9wb3V0X2NvbnRhaW5lcjsKCmZ1bmN0aW9uIER1YWxDbGljayhzaW5nbGVfZnVuYywgZGJsX2Z1bmMpIHsKICBsZXQgbmNsaWNrcyA9IDA7CiAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7CiAgICBuY2xpY2tzICs9IDE7CiAgICBpZiAobmNsaWNrcyA+IDEpIHsKICAgICAgZGJsX2Z1bmMoLi4uYXJncyk7CiAgICAgIG5jbGlja3MgPSAwOwogICAgfSBlbHNlIHsKICAgICAgZGVsYXkoMzAwKS50aGVuKCgpID0+IHsKICAgICAgICBpZiAobmNsaWNrcyA9PSAxKSB7CiAgICAgICAgICBzaW5nbGVfZnVuYyguLi5hcmdzKTsKICAgICAgICB9CiAgICAgICAgbmNsaWNrcyA9IDA7CiAgICAgIH0pOwogICAgfQogIH07Cn0KCi8vIFdlIHJlbW92ZSB0aGUgZGVmYXVsdCBkb3dubG9hZCBpbWFnZSBidXR0b24KcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9SZW1vdmUgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlLAogIFsidG9JbWFnZSJdCik7Ci8vIFdlIGFkZCB0aGUgY3VzdG9tIGJ1dHRvbiB0byB0aGUgbW9kZWJhcgpwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb0FkZCA9IF8udW5pb24oCiAgcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQsCiAgWwogICAgewogICAgICBuYW1lOiAiQ29weSBQTkcgdG8gQ2xpcGJvYXJkIiwKICAgICAgaWNvbjogewogICAgICAgIGhlaWdodDogNTIwLAogICAgICAgIHdpZHRoOiA1MjAsCiAgICAgICAgcGF0aDogIk0yODAgNjRoNDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRWNDQ4YzAgMzUuMy0yOC43IDY0LTY0IDY0SDY0Yy0zNS4zIDAtNjQtMjguNy02NC02NFYxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRoNDAgOS42QzEyMSAyNy41IDE1My4zIDAgMTkyIDBzNzEgMjcuNSA3OC40IDY0SDI4MHpNNjQgMTEyYy04LjggMC0xNiA3LjItMTYgMTZWNDQ4YzAgOC44IDcuMiAxNiAxNiAxNkgzMjBjOC44IDAgMTYtNy4yIDE2LTE2VjEyOGMwLTguOC03LjItMTYtMTYtMTZIMzA0djI0YzAgMTMuMy0xMC43IDI0LTI0IDI0SDE5MiAxMDRjLTEzLjMgMC0yNC0xMC43LTI0LTI0VjExMkg2NHptMTI4LThhMjQgMjQgMCAxIDAgMC00OCAyNCAyNCAwIDEgMCAwIDQ4eiIsCiAgICAgIH0sCiAgICAgIGRpcmVjdGlvbjogInVwIiwKICAgICAgY2xpY2s6IER1YWxDbGljayhjb3B5SW1hZ2VUb0NsaXBib2FyZCwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoKTsKICAgICAgfSksCiAgICB9LAogICAgewogICAgICBuYW1lOiAiRG93bmxvYWQgSW1hZ2UiLAogICAgICBpY29uOiBQbG90bHkuSWNvbnMuY2FtZXJhLAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soc2F2ZUltYWdlVG9GaWxlLCAoKSA9PiB7CiAgICAgICAgcG9wb3V0X2NvbnRhaW5lcih7IGNsOiAiZmlsZXNhdmUiIH0pOwogICAgICB9KSwKICAgIH0sCiAgXQopOwoKZnVuY3Rpb24gZ2V0T2Zmc2V0RGF0YShlbCkgewogIGxldCBjcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsLCBudWxsKTsKICBjb25zdCBvZGF0YSA9IHsKICAgIHBhZGRpbmc6IHsKICAgICAgbGVmdDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSwKICAgICAgYm90dG9tOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSArIHBhcnNlRmxvYXQoY3MucGFkZGluZ0JvdHRvbSksCiAgICB9LAogICAgYm9yZGVyOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyTGVmdFdpZHRoKSwKICAgICAgcmlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyUmlnaHRXaWR0aCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5ib3JkZXJUb3BXaWR0aCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCkgKyBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICB9CiAgfTsKICBpZiAoZWwgPT09IFBMT1QpIHsKICAgIC8vIEZvciB0aGUgUExPVCB3ZSBhbHNvIHdhbnQgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIG9mZnNldAogICAgb2RhdGEub2Zmc2V0ID0gewogICAgICB0b3A6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0VG9wIDogMCwKICAgICAgbGVmdDogUExPVC5vZmZzZXRQYXJlbnQgPT0gQ09OVEFJTkVSID8gUExPVC5vZmZzZXRMZWZ0IDogMCwKICAgIH0KICB9CiAgcmV0dXJuIG9kYXRhOwp9CmZ1bmN0aW9uIGdldFNpemVEYXRhKCkgewogIGNvbnN0IGRhdGEgPSB7CiAgICBwbG90X3BhZDogZ2V0T2Zmc2V0RGF0YShQTE9UKSwKICAgIHBsb3RfcmVjdDogUExPVC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICAgIGNvbnRhaW5lcl9wYWQ6IGdldE9mZnNldERhdGEoQ09OVEFJTkVSKSwKICAgIGNvbnRhaW5lcl9yZWN0OiBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgfTsKICByZXR1cm4gZGF0YTsKfQpmdW5jdGlvbiBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgY29uc3QgY29tcHV0ZWRfc2l6ZSA9IGNvbXB1dGVQbG90U2l6ZShzaXplRGF0YSk7CiAgY29uc3Qgb2Zmc2V0cyA9IGNvbXB1dGVkX3NpemUub2Zmc2V0czsKCiAgY29uc3QgcGxvdF9kYXRhID0gewogICAgd2lkdGg6IHdpZHRoID8/IGNvbXB1dGVkX3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IGhlaWdodCA/PyBjb21wdXRlZF9zaXplLmhlaWdodCwKICB9OwoKICByZXR1cm4gewogICAgd2lkdGg6ICh3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoKSArIG9mZnNldHMud2lkdGgsCiAgICBoZWlnaHQ6IChoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQpICsgb2Zmc2V0cy5oZWlnaHQsCiAgICBub0NoYW5nZTogd2lkdGggPT0gY29tcHV0ZWRfc2l6ZS53aWR0aCAmJiBoZWlnaHQgPT0gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfQp9CgovLyBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hhbmdlIHRoZSBjb250YWluZXIgc2l6ZSBzbyB0aGF0IHRoZSByZXN1bHRpbmcgcGxvdCB3aWxsIGJlIG1hdGNoaW5nIHRoZSBwcm92aWRlZCBzcGVjcwpmdW5jdGlvbiBjaGFuZ2VDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICBpZiAoIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICBjb25zb2xlLmxvZygiVHJpZWQgdG8gY2hhbmdlIGNvbnRhaW5lciBzaXplIHdoZW4gbm90IHBvcHBlZCwgaWdub3JpbmciKTsKICAgIHJldHVybjsKICB9CgogIGNvbnN0IGNzeiA9IGNvbXB1dGVDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSk7CgogIGlmIChjc3oubm9DaGFuZ2UpIHsKICAgIGNvbnNvbGUubG9nKCJTaXplIGlzIHRoZSBzYW1lIGFzIGN1cnJlbnQsIGlnbm9yaW5nIik7CiAgICByZXR1cm4KICB9CiAgLy8gV2UgYXJlIG5vdyBnb2luZyB0byBzZXQgaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgY29udGFpbmVyCiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSBjc3pba2V5XSArICJweCI7CiAgfQp9Ci8vIFdlIG5vdyBjcmVhdGUgdGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCB1cGRhdGUgdGhlIHBsb3QgYmFzZWQgb24gdGhlIHZhbHVlcyBzcGVjaWZpZWQKZnVuY3Rpb24gdXBkYXRlRnJvbUhlYWRlcigpIHsKICBjb25zdCBoZWFkZXJfZGF0YSA9IHsKICAgIGhlaWdodDogY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSwKICAgIHdpZHRoOiBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUsCiAgfTsKICBjaGFuZ2VDb250YWluZXJTaXplKGhlYWRlcl9kYXRhKTsKfQovLyBXZSBhc3NpZ24gdGhpcyBmdW5jdGlvbiB0byB0aGUgb25ibHVyIGV2ZW50IG9mIHdpZHRoIGFuZCBoZWlnaHQKaWYgKGZpcnN0UnVuKSB7CiAgZm9yIChjb25zdCBjb250YWluZXIgb2YgT2JqZWN0LnZhbHVlcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIudWlfc3Bhbi5vbmJsdXIgPSAoZSkgPT4gewogICAgICBjb250YWluZXIudWlfdmFsdWUgPSBjb250YWluZXIudWlfc3Bhbi50ZXh0Q29udGVudDsKICAgICAgdXBkYXRlRnJvbUhlYWRlcigpOwogICAgfTsKICB9Cn0KLy8gVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgcGxvdCBzaXplIHRvIHVzZSBmb3IgcmVsYXlvdXQgYXMgYSBmdW5jdGlvbiBvZiB0aGUgY29udGFpbmVyIHNpemUKZnVuY3Rpb24gY29tcHV0ZVBsb3RTaXplKGRhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgLy8gUmVtb3ZlIFBhZGRpbmcKICBjb25zdCB7IGNvbnRhaW5lcl9wYWQsIHBsb3RfcGFkLCBjb250YWluZXJfcmVjdCB9ID0gZGF0YTsKICBjb25zdCBvZmZzZXRzID0gewogICAgd2lkdGg6CiAgICAgIHBsb3RfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBwbG90X3BhZC5ib3JkZXIud2lkdGggKwogICAgICBwbG90X3BhZC5vZmZzZXQubGVmdCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy53aWR0aCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLndpZHRoLAogICAgaGVpZ2h0OgogICAgICBwbG90X3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIHBsb3RfcGFkLmJvcmRlci5oZWlnaHQgKwogICAgICBwbG90X3BhZC5vZmZzZXQudG9wICsKICAgICAgY29udGFpbmVyX3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLmhlaWdodCwKICB9OwogIGNvbnN0IHN6ID0gewogICAgd2lkdGg6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3Qud2lkdGggLSBvZmZzZXRzLndpZHRoKSwKICAgIGhlaWdodDogTWF0aC5yb3VuZChjb250YWluZXJfcmVjdC5oZWlnaHQgLSBvZmZzZXRzLmhlaWdodCksCiAgICBvZmZzZXRzLAogIH07CiAgcmV0dXJuIHN6Owp9CgovLyBDcmVhdGUgdGhlIHJlc2l6ZU9ic2VydmVyIHRvIG1ha2UgdGhlIHBsb3QgZXZlbiBtb3JlIHJlc3BvbnNpdmUhIDptYWdpYzoKY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHsKICBjb25zdCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCk7CiAgY29uc3Qge2NvbnRhaW5lcl9yZWN0LCBjb250YWluZXJfcGFkfSA9IHNpemVEYXRhOwogIGxldCBwbG90X3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIC8vIFdlIHNhdmUgdGhlIGhlaWdodCBpbiB0aGUgUExPVCBvYmplY3QKICBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQ7CiAgLy8gV2UgZGVhbCB3aXRoIHNvbWUgc3R1ZmYgaWYgdGhlIGNvbnRhaW5lciBpcyBwb3BwcGVkCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9IGNvbnRhaW5lcl9yZWN0LndpZHRoICsgInB4IjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBjb250YWluZXJfcmVjdC5sZWZ0ICsgInB4IjsKICBjb25maWdfc3BhbnMuaGVpZ2h0LnVpX3ZhbHVlID0gcGxvdF9zaXplLmhlaWdodDsKICBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUgPSBwbG90X3NpemUud2lkdGg7CiAgLyogCgkJVGhlIGFkZGl0aW9uIG9mIHRoZSBpbnZhbGlkIGFyZ3VtZW50IGBwbHV0b3Jlc2l6ZWAgc2VlbXMgdG8gZml4IHRoZSBwcm9ibGVtIHdpdGggY2FsbGluZyBgcmVsYXlvdXRgIHNpbXBseSB3aXRoIGB7YXV0b3NpemU6IHRydWV9YCBhcyB1cGRhdGUgYnJlYWtpbmcgbW91c2UgcmVsYXlvdXQgZXZlbnRzIHRyYWNraW5nLiAKCQlTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Bsb3RseS9wbG90bHkuanMvaXNzdWVzLzYxNTYgZm9yIGRldGFpbHMKCQkqLwogIGxldCBjb25maWcgPSB7CiAgICAvLyBJZiB0aGlzIGlzIHBvcHBlZCBvdXQsIHdlIGlnbm9yZSB0aGUgb3JpZ2luYWwgd2lkdGgvaGVpZ2h0CiAgICB3aWR0aDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfd2lkdGgpID8/IHBsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfaGVpZ2h0KSA/PyBwbG90X3NpemUuaGVpZ2h0LAogICAgcGx1dG9yZXNpemU6IHRydWUsCiAgfTsKICBQbG90bHkucmVsYXlvdXQoUExPVCwgY29uZmlnKS50aGVuKCgpID0+IHsKICAgIGlmIChyZW1vdmVfY29udGFpbmVyX3NpemUgJiYgIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIHRoZSBmaXJzdCByZXNpemUgdXBvbiBwbG90IGNyZWF0aW9uIHRvIGFscmVhZHkgYmUgd2l0aG91dCBhIGZpeGVkIGhlaWdodAogICAgICBDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gIiI7CiAgICAgIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogICAgICByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmYWxzZTsKICAgIH0KICB9KTsKfSk7CgpyZXNpemVPYnNlcnZlci5vYnNlcnZlKENPTlRBSU5FUik7CgoKUGxvdGx5LnJlYWN0KFBMT1QsIHBsb3Rfb2JqKS50aGVuKCgpID0+IHsKCS8vIEFzc2lnbiB0aGUgUGxvdGx5IGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKHBsb3RseV9saXN0ZW5lcnMpKSB7CgkJZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcl92ZWMpIHsKCQkJUExPVC5vbihrZXksIGxpc3RlbmVyKQoJCX0KCX0KCS8vIEFzc2lnbiB0aGUgSlMgZXZlbnQgbGlzdGVuZXJzCglmb3IgKGNvbnN0IFtrZXksIGxpc3RlbmVyX3ZlY10gb2YgT2JqZWN0LmVudHJpZXMoanNfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1QuYWRkRXZlbnRMaXN0ZW5lcihrZXksIGxpc3RlbmVyLCB7CgkJCQlzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsCgkJCX0pCgkJfQoJfQp9CikKCgppbnZhbGlkYXRpb24udGhlbigoKSA9PiB7CgkvLyBSZW1vdmUgYWxsIHBsb3RseSBsaXN0ZW5lcnMKCVBMT1QucmVtb3ZlQWxsTGlzdGVuZXJzKCkKCS8vIFJlbW92ZSBhbGwgSlMgbGlzdGVuZXJzCgljb250cm9sbGVyLmFib3J0KCkKCS8vIFJlbW92ZSB0aGUgcmVzaXplT2JzZXJ2ZXIKCXJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKQp9KQoKCgoJCXJldHVybiBDT05UQUlORVIKCTwvc2NyaXB0PgqkbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/yEX8yNKwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJDA5NzU1NDdkLTY3ZDktNGU2Yi04OGZmLWE5ZGQwNmE3ZjllZrlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzwAAAAFr8+zytXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5HZNTdiY2MwNWIwLTgxZGEtMTFlZi0yMDQwLTM1ODVjOWI0OTU0Zi85NTlhNmRiZTM3ZTZlOTA5uGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDEyMzFiODMyLTQ3YjEtNGNjYi05YjU2LWE2NzgzODU5OGNjN4qmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnaaokJPHNjcmlwdCBpZD0ncGxvdF8xJz4KCQkvLyBXZSBzdGFydCBieSBwdXR0aW5nIGFsbCB0aGUgdmFyaWFibGUgaW50ZXJwb2xhdGlvbiBoZXJlIGF0IHRoZSBiZWdpbm5pbmcKCQkvLyBXZSBoYXZlIHRvIGNvbnZlcnQgYWxsIHR5cGVkYXJyYXlzIGluIHRoZSBsYXlvdXQgdG8gbm9ybWFsIGFycmF5cy4gU2VlIElzc3VlICMyNQoJCS8vIFdlIHVzZSBsb2Rhc2ggZm9yIHRoaXMgZm9yIGNvbXBhY3RuZXNzCgkJZnVuY3Rpb24gcmVtb3ZlVHlwZWRBcnJheShvKSB7CgkJCXJldHVybiBfLmlzVHlwZWRBcnJheShvKSA/IEFycmF5LmZyb20obykgOgoJCQlfLmlzUGxhaW5PYmplY3QobykgPyBfLm1hcFZhbHVlcyhvLCByZW1vdmVUeXBlZEFycmF5KSA6IAoJCQlvCgkJfQoKCQkvLyBQdWJsaXNoIHRoZSBwbG90IG9iamVjdCB0byBKUwoJCWxldCBwbG90X29iaiA9IF8udXBkYXRlKC8qIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgQWJzdHJhY3RQbHV0b0RpbmdldGplcy5EaXNwbGF5LnB1Ymxpc2hlZF90b19qcyAqLyBnZXRQdWJsaXNoZWRPYmplY3QoIjdiY2MwNWIwLTgxZGEtMTFlZi0yMDQwLTM1ODVjOWI0OTU0Zi81ZmJiMzY0MDRjNDQ2YmFhIiksICJsYXlvdXQiLCByZW1vdmVUeXBlZEFycmF5KQoJCS8vIEdldCB0aGUgcGxvdGx5IGxpc3RlbmVycwoJCWNvbnN0IHBsb3RseV9saXN0ZW5lcnMgPSB7fQoJCS8vIEdldCB0aGUgSlMgbGlzdGVuZXJzCgkJY29uc3QganNfbGlzdGVuZXJzID0ge30KCQkvLyBEZWFsIHdpdGggZXZlbnR1YWwgY3VzdG9tIGNsYXNzZXMKCQlsZXQgY3VzdG9tX2NsYXNzbGlzdCA9IFtdCgoKCQkvLyBMb2FkIHRoZSBwbG90bHkgbGlicmFyeQoJCWxldCBQbG90bHkgPSB1bmRlZmluZWQKCQl0cnkgewoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiLi9wbG90bHlqcy9wbG90bHlqcy0yLjI2LjIubWluLmpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfSBjYXRjaCAoZSkgewoJCQljb25zb2xlLmxvZygiTG9jYWwgbG9hZCBmYWlsZWQsIHRyeWluZyB3aXRoIHRoZSB3ZWIgZXNtLnNoIHZlcnNpb24iKQoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiaHR0cHM6Ly9lc20uc2gvdjEzNS9wbG90bHkuanMtZGlzdC1taW5AMi4yNi4yL2VzbmV4dC9wbG90bHkuanMtZGlzdC1taW4ubWpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfQoKCQkvLyBDaGVjayBpZiB3ZSBoYXZlIHRvIGZvcmNlIGxvY2FsIG1hdGhqYXggZm9udCBjYWNoZQoJCWlmIChmYWxzZSAmJiB3aW5kb3c/Lk1hdGhKYXg/LmNvbmZpZz8uc3ZnPy5mb250Q2FjaGUgPT09ICdnbG9iYWwnKSB7CgkJCXdpbmRvdy5NYXRoSmF4LmNvbmZpZy5zdmcuZm9udENhY2hlID0gJ2xvY2FsJwoJCX0KCgkJLy8gRmxhZyB0byBjaGVjayBpZiB0aGlzIGNlbGwgd2FzICBtYW51YWxseSByYW4gb3IgcmVhY3RpdmVseSByYW4KY29uc3QgZmlyc3RSdW4gPSB0aGlzID8gZmFsc2UgOiB0cnVlCmNvbnN0IENPTlRBSU5FUiA9IHRoaXMgPz8gaHRtbGA8ZGl2IGNsYXNzPSdwbHV0b3Bsb3RseS1jb250YWluZXInPmAKY29uc3QgUExPVCA9IENPTlRBSU5FUi5xdWVyeVNlbGVjdG9yKCcuanMtcGxvdGx5LXBsb3QnKSA/PyBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2PmApCmNvbnN0IHBhcmVudCA9IENPTlRBSU5FUi5wYXJlbnRFbGVtZW50Ci8vIFdlIHVzZSBhIGNvbnRyb2xsZXIgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVycyB1cG9uIGludmFsaWRhdGlvbgpjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpCi8vIFdlIGhhdmUgdG8gYWRkIHRoaXMgdG8ga2VlcCBzdXBwb3J0aW5nIEBiaW5kIHdpdGggdGhlIG9sZCBBUEkgdXNpbmcgUExPVApQTE9ULmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGUpID0+IHsKCUNPTlRBSU5FUi52YWx1ZSA9IFBMT1QudmFsdWUKCWlmIChlLmJ1YmJsZXMpIHsKCQlyZXR1cm4KCX0KCUNPTlRBSU5FUi5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnaW5wdXQnKSkKfSwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pCgoJLy8gVGhpcyBjcmVhdGUgdGhlIHN0eWxlIHN1YmRpdiBvbiBmaXJzdCBydW4KCWZpcnN0UnVuICYmIENPTlRBSU5FUi5hcHBlbmRDaGlsZChodG1sYAoJPHN0eWxlPgoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciB7CgkJd2lkdGg6IDEwMCU7CgkJaGVpZ2h0OiAxMDAlOwoJCW1pbi1oZWlnaHQ6IDA7CgkJbWluLXdpZHRoOiAwOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciAuanMtcGxvdGx5LXBsb3QgLnBsb3RseSBkaXYgewoJCW1hcmdpbjogMCBhdXRvOyAvLyBUaGlzIGNlbnRlcnMgdGhlIHBsb3QKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIucG9wcGVkLW91dCB7CgkJb3ZlcmZsb3c6IGF1dG87CgkJei1pbmRleDogMTAwMDsKCQlwb3NpdGlvbjogZml4ZWQ7CgkJcmVzaXplOiBib3RoOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMHB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwcHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciB7CgkJZGlzcGxheTogZmxleDsKCQlmbGV4LWZsb3c6IHJvdyB3cmFwOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDEycHg7CgkJcG9zaXRpb246IGZpeGVkOwoJCXotaW5kZXg6IDEwMDE7CgkJY3Vyc29yOiBtb3ZlOwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgLTEwMCUpOwoJCXBhZGRpbmc6IDVweDsKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIHNwYW4gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQlmbGV4OiAxCgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlci5oaWRkZW4gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuY2xpcGJvYXJkLXNwYW4gewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCX0KCS5jbGlwYm9hcmQtdmFsdWUgewoJCXBhZGRpbmctcmlnaHQ6IDVweDsKCQlwYWRkaW5nLWxlZnQ6IDJweDsKCQljdXJzb3I6IHRleHQ7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlmbGV4OiAwIDAgMTAwJTsKCQl0ZXh0LWFsaWduOiBjZW50ZXI7CgkJYm9yZGVyLXRvcDogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCW1hcmdpbi10b3A6IDVweDsKCQlkaXNwbGF5OiBub25lOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5maWxlc2F2ZSAuY2xpcGJvYXJkLXNwYW4uZmlsZW5hbWUgewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5jbGlwYm9hcmQtdmFsdWUuZmlsZW5hbWUgewoJCW1hcmdpbi1sZWZ0OiAzcHg7CgkJdGV4dC1hbGlnbjogbGVmdDsKCQltaW4td2lkdGg6IG1pbig2MCUsIG1pbi1jb250ZW50KTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogaW5saW5lLWZsZXg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IC5sYWJlbCB7CgkJZmxleDogMCAwIDA7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZvcm1hdCB7CgkJcG9zaXRpb246IHJlbGF0aXZlOwoJCWZsZXg6IDEgMCBhdXRvOwoJCW1pbi13aWR0aDogMzBweDsKCQltYXJnaW4tcmlnaHQ6IDEwcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJCWZsZXgtZmxvdzogY29sdW1uOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXBhZGRpbmctbGVmdDogM3B4OwoJCXotaW5kZXg6IDIwMDA7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgewoJCWN1cnNvcjogcG9pbnRlcjsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlwYWRkaW5nOiAzcHg7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTNweCwgLTZweCk7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5mb3JtYXQtb3B0aW9uOm5vdCguc2VsZWN0ZWQpIHsKCQltYXJnaW4tdG9wOiAzcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24uc2VsZWN0ZWQgewoJCW9yZGVyOiAtMTsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpob3ZlciB7CgkJYmFja2dyb3VuZC1jb2xvcjogdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7Cgl9CglzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZm9udC13ZWlnaHQ6IG5vcm1hbDsKCQljb2xvcjogdmFyKC0tcGx1dG8tb3V0cHV0LWNvbG9yKTsKCQlkaXNwbGF5OiBub25lOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgY2FsYygtMTAwJSAtIDEwcHgpKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkubGFiZWwgewoJCXVzZXItc2VsZWN0OiBub25lOwoJfQoJLmxhYmVsOmhvdmVyIHNwYW4uY29uZmlnLXZhbHVlIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJbWluLXdpZHRoOiAxNTBweDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5tYXRjaGluZy1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tbWFjcm8tY29sb3IpOwoJCWZvbnQtd2VpZ2h0OiBib2xkOwoJfQoJLmNsaXBib2FyZC1zcGFuLmRpZmZlcmVudC1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tdGFnLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KPC9zdHlsZT4KYCkKCmxldCBvcmlnaW5hbF9oZWlnaHQgPSBwbG90X29iai5sYXlvdXQuaGVpZ2h0CmxldCBvcmlnaW5hbF93aWR0aCA9IHBsb3Rfb2JqLmxheW91dC53aWR0aAovLyBGb3IgdGhlIGhlaWdodCB3ZSBoYXZlIHRvIGFsc28gcHV0IGEgZml4ZWQgdmFsdWUgaW4gY2FzZSB0aGUgcGxvdCBpcyBwdXQgb24gYSBub24tZml4ZWQtc2l6ZSBjb250YWluZXIgKGxpa2UgdGhlIGRlZmF1bHQgd3JhcHBlcikKLy8gV2UgZGVmaW5lIGEgdmFyaWFibGUgdG8gY2hlY2sgd2hldGhlciB3ZSBzdGlsbCBoYXZlIHRvIHJlbW92ZSB0aGUgZml4ZWQgaGVpZ2h0CmxldCByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmaXJzdFJ1bgpsZXQgY29udGFpbmVyX2hlaWdodCA9IG9yaWdpbmFsX2hlaWdodCA/PyBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPz8gNDAwCkNPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfaGVpZ2h0ICsgJ3B4JwoKLy8gV2UgY3JlYXRlIGEgUHJvbWlzZSB2ZXJzaW9uIG9mIHNldFRpbWVvdXQKZnVuY3Rpb24gZGVsYXkobXMpIHsKICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTsKfQoKLy8gV2UgaW1wb3J0IGludGVyYWN0IGZvciBkcmFnZ2luZy9yZXNpemluZwpjb25zdCB7IGRlZmF1bHQ6IGludGVyYWN0IH0gPSBhd2FpdCBpbXBvcnQoJ2h0dHBzOi8vZXNtLnNoL2ludGVyYWN0anNAMS4xMC4xOScpCgoKZnVuY3Rpb24gZ2V0SW1hZ2VPcHRpb25zKCkgewogIGNvbnN0IG8gPSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPz8ge307CiAgcmV0dXJuIHsKICAgIGZvcm1hdDogby5mb3JtYXQgPz8gInBuZyIsCiAgICB3aWR0aDogby53aWR0aCA/PyBvcmlnaW5hbF93aWR0aCwKICAgIGhlaWdodDogby5oZWlnaHQgPz8gb3JpZ2luYWxfaGVpZ2h0LAogICAgc2NhbGU6IG8uc2NhbGUgPz8gMSwKICAgIGZpbGVuYW1lOiBvLmZpbGVuYW1lID8/ICJuZXdwbG90IiwKICB9Owp9Cgpjb25zdCBDTElQQk9BUkRfSEVBREVSID0KICBDT05UQUlORVIucXVlcnlTZWxlY3RvcigiLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIiKSA/PwogIENPTlRBSU5FUi5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAiYWZ0ZXJiZWdpbiIsCiAgICBodG1sYDxkaXYgY2xhc3M9InBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgaGlkZGVuIj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZvcm1hdCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5Gb3JtYXQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZm9ybWF0Ij48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHdpZHRoIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPldpZHRoOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIHdpZHRoIj48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gaGVpZ2h0IgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkhlaWdodDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBoZWlnaHQiPjwvc3Bhbj5weDwvc3BhbgogICAgICA+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzY2FsZSIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5TY2FsZTo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBzY2FsZSI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHNldCI+U2V0PC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHVuc2V0Ij5VbnNldDwvYnV0dG9uPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gZmlsZW5hbWUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+RmlsZW5hbWU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZmlsZW5hbWUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgPC9kaXY+YAogICk7CgpmdW5jdGlvbiBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKSB7CiAgY29uc3QgdmFsaWRfY2xhc3NlcyA9IFsKICAgICJtaXNzaW5nLWNvbmZpZyIsCiAgICAibWF0Y2hpbmctY29uZmlnIiwKICAgICJkaWZmZXJlbnQtY29uZmlnIiwKICBdOwogIGZ1bmN0aW9uIHNldENsYXNzKGNsKSB7CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgdmFsaWRfY2xhc3NlcykgewogICAgICBjb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZShuYW1lLCBuYW1lID09IGNsKTsKICAgIH0KICB9CiAgLy8gV2UgdXNlIHRoZSBjdXN0b20gZ2V0dGVycyB3ZSdsbCBzZXQgdXAgaW4gdGhlIGNvbnRhaW5lcgogIGNvbnN0IHsgdWlfdmFsdWUsIGNvbmZpZ192YWx1ZSwgY29uZmlnX3NwYW4sIGtleSB9ID0gY29udGFpbmVyOwogIGlmIChjb25maWdfdmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgc2V0Q2xhc3MoIm1pc3NpbmctY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGlzIG5vdCBwcmVzZW50IGluIHRoZSBjb25maWcuYDsKICB9IGVsc2UgaWYgKHVpX3ZhbHVlID09IGNvbmZpZ192YWx1ZSkgewogICAgc2V0Q2xhc3MoIm1hdGNoaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgdGhlIHNhbWUgdmFsdWUgaW4gdGhlIGNvbmZpZyBhbmQgaW4gdGhlIGhlYWRlci5gOwogIH0gZWxzZSB7CiAgICBzZXRDbGFzcygiZGlmZmVyZW50LWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgYSBkaWZmZXJlbnQgdmFsdWUgKDxlbT4ke2NvbmZpZ192YWx1ZX08L2VtPikgaW4gdGhlIGNvbmZpZy5gOwogIH0KICAvLyBBZGQgaW5mbyBhYm91dCBzZXR0aW5nIGFuZCB1bnNldHRpbmcKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgb24gdGhlIGxhYmVsIDxlbT48Yj5vbmNlPC9iPjwvZW0+IHRvIHNldCB0aGUgY3VycmVudCBVSSB2YWx1ZSBpbiB0aGUgY29uZmlnLmAKICApOwogIGNvbmZpZ19zcGFuLmluc2VydEFkamFjZW50SFRNTCgKICAgICJiZWZvcmVlbmQiLAogICAgYDxicj5DbGljayA8ZW0+PGI+dHdpY2U8L2I+PC9lbT4gdG8gcmVtb3ZlIHRoaXMga2V5IGZyb20gdGhlIGNvbmZpZy5gCiAgKTsKfQoKY29uc3QgdmFsaWRfZm9ybWF0cyA9IFsicG5nIiwgInN2ZyIsICJ3ZWJwIiwgImpwZWciLCAiZnVsbC1qc29uIl07CmZ1bmN0aW9uIGluaXRpYWxpemVVSVZhbHVlU3BhbihzcGFuLCBrZXksIHZhbHVlKSB7CiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9IGtleSA9PT0gImZvcm1hdCIgPyAiZmFsc2UiIDogInRydWUiOwogIGxldCBwYXJzZSA9ICh4KSA9PiB4OwogIGxldCB1cGRhdGUgPSAoeCkgPT4gKHNwYW4udGV4dENvbnRlbnQgPSB4KTsKICBpZiAoa2V5ID09PSAid2lkdGgiIHx8IGtleSA9PT0gImhlaWdodCIpIHsKICAgIHBhcnNlID0gKHgpID0+IE1hdGgucm91bmQocGFyc2VGbG9hdCh4KSk7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJzY2FsZSIpIHsKICAgIHBhcnNlID0gcGFyc2VGbG9hdDsKICB9IGVsc2UgaWYgKGtleSA9PT0gImZvcm1hdCIpIHsKICAgIC8vIFdlIHJlbW92ZSBjb250ZW50RWRpdGFibGUKICAgIHNwYW4uY29udGVudEVkaXRhYmxlID0gImZhbHNlIjsKICAgIC8vIEhlcmUgd2UgZmlyc3QgYWRkIHRoZSBzdWJzcGFucyBmb3IgZWFjaCBvcHRpb24KICAgIGNvbnN0IG9wdHNfZGl2ID0gc3Bhbi5hcHBlbmRDaGlsZChodG1sYDxkaXYgY2xhc3M9ImZvcm1hdC1vcHRpb25zIj48L2Rpdj5gKTsKICAgIGZvciAoY29uc3QgZm10IG9mIHZhbGlkX2Zvcm1hdHMpIHsKICAgICAgY29uc3Qgb3B0ID0gb3B0c19kaXYuYXBwZW5kQ2hpbGQoCiAgICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iZm9ybWF0LW9wdGlvbiAke2ZtdH0iPiR7Zm10fTwvc3Bhbj5gCiAgICAgICk7CiAgICAgIG9wdC5vbmNsaWNrID0gKGUpID0+IHsKICAgICAgICBzcGFuLnZhbHVlID0gb3B0LnRleHRDb250ZW50OwogICAgICB9OwogICAgfQogICAgcGFyc2UgPSAoeCkgPT4gewogICAgICByZXR1cm4gdmFsaWRfZm9ybWF0cy5pbmNsdWRlcyh4KSA/IHggOiBsb2NhbFZhbHVlOwogICAgfTsKICAgIHVwZGF0ZSA9ICh4KSA9PiB7CiAgICAgIGZvciAoY29uc3Qgb3B0IG9mIG9wdHNfZGl2LmNoaWxkcmVuKSB7CiAgICAgICAgb3B0LmNsYXNzTGlzdC50b2dnbGUoInNlbGVjdGVkIiwgb3B0LnRleHRDb250ZW50ID09PSB4KTsKICAgICAgfQogICAgfTsKICB9IGVsc2UgewogICAgLy8gV2Ugb25seSBoYXZlIGZpbGVuYW1lIGhlcmUKICB9CiAgbGV0IGxvY2FsVmFsdWU7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwYW4sICJ2YWx1ZSIsIHsKICAgIGdldDogKCkgPT4gewogICAgICByZXR1cm4gbG9jYWxWYWx1ZTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgaWYgKHZhbCAhPT0gIiIpIHsKICAgICAgICBsb2NhbFZhbHVlID0gcGFyc2UodmFsKTsKICAgICAgfQogICAgICB1cGRhdGUobG9jYWxWYWx1ZSk7CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKICAvLyBXZSBhbHNvIGFzc2lnbiBhIGxpc3RlbmVyIHNvIHRoYXQgdGhlIGVkaXRhYmxlIGlzIGJsdXJyZWQgd2hlbiBlbnRlciBpcyBwcmVzc2VkCiAgc3Bhbi5vbmtleWRvd24gPSAoZSkgPT4gewogICAgaWYgKGUua2V5Q29kZSA9PT0gMTMpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBzcGFuLmJsdXIoKTsKICAgIH0KICB9OwogIHNwYW4udmFsdWUgPSB2YWx1ZTsKfQoKZnVuY3Rpb24gaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3BhbihzcGFuLCBrZXkpIHsKICAvLyBIZXJlIHdlIG1vc3RseSB3YW50IHRvIGRlZmluZSB0aGUgc2V0dGVyIGFuZCBnZXR0ZXIKICBjb25zdCBjb250YWluZXIgPSBzcGFuLmNsb3Nlc3QoIi5jbGlwYm9hcmQtc3BhbiIpOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgfSwKICAgIHNldDogKHZhbCkgPT4gewogICAgICAvLyBpZiB1bmRlZmluZWQgaXMgcGFzc2VkLCB3ZSByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIG9wdGlvbnMKICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZGVsZXRlIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgICB9IGVsc2UgewogICAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldID0gdmFsOwogICAgICB9CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKfQoKY29uc3QgY29uZmlnX3NwYW5zID0ge307CmZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGdldEltYWdlT3B0aW9ucygpKSkgewogIGNvbnN0IGNvbnRhaW5lciA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcihgLmNsaXBib2FyZC1zcGFuLiR7a2V5fWApOwogIGNvbnN0IGxhYmVsID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5sYWJlbCIpOwogIC8vIFdlIGdpdmUgdGhlIGxhYmVsIGEgZnVuY3Rpb24gdGhhdCBvbiBzaW5nbGUgY2xpY2sgd2lsbCBzZXQgdGhlIGN1cnJlbnQgdmFsdWUgYW5kIHdpdGggZG91YmxlIGNsaWNrIHdpbGwgdW5zZXQgaXQKICBsYWJlbC5vbmNsaWNrID0gRHVhbENsaWNrKAogICAgKCkgPT4gewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfSwKICAgIChlKSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJlIiwgZSk7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IHVuZGVmaW5lZDsKICAgIH0KICApOwogIGNvbnN0IHVpX3ZhbHVlX3NwYW4gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC12YWx1ZSIpOwogIGNvbnN0IGNvbmZpZ192YWx1ZV9zcGFuID0KICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuY29uZmlnLXZhbHVlIikgPz8KICAgIGxhYmVsLmluc2VydEFkamFjZW50RWxlbWVudCgKICAgICAgImFmdGVyYmVnaW4iLAogICAgICBodG1sYDxzcGFuIGNsYXNzPSJjb25maWctdmFsdWUiPjwvc3Bhbj5gCiAgICApOwogIC8vIEFzc2luZyB0aGUgdHdvIHNwYW5zIGFzIHByb3BlcnRpZXMgb2YgdGhlIGNvbnRhaW5pbmcgc3BhbgogIGNvbnRhaW5lci51aV9zcGFuID0gdWlfdmFsdWVfc3BhbjsKICBjb250YWluZXIuY29uZmlnX3NwYW4gPSBjb25maWdfdmFsdWVfc3BhbjsKICBjb250YWluZXIua2V5ID0ga2V5OwogIGNvbmZpZ19zcGFuc1trZXldID0gY29udGFpbmVyOwogIGlmIChmaXJzdFJ1bikgewogICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID0KICAgICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogICAgLy8gV2UgZG8gdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSB2YWx1ZSBzcGFuCiAgICBpbml0aWFsaXplVUlWYWx1ZVNwYW4odWlfdmFsdWVfc3Bhbiwga2V5LCB2YWx1ZSk7CiAgICAvLyBUaGVuIHdlIGluaXRpYWxpemUgdGhlIGNvbmZpZyB2YWx1ZQogICAgaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3Bhbihjb25maWdfdmFsdWVfc3Bhbiwga2V5KTsKICAgIC8vIFdlIHB1dCBzb21lIGNvbnZlbmllbmNlIGdldHRlcnMvc2V0dGVycwogICAgLy8gdWlfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgInVpX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IHVpX3ZhbHVlX3NwYW4udmFsdWUsCiAgICAgIHNldDogKHZhbCkgPT4gewogICAgICAgIHVpX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICAgIC8vIGNvbmZpZ192YWx1ZSBmb3J3YXJkCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAiY29uZmlnX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IGNvbmZpZ192YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSA9IHZhbDsKICAgICAgfSwKICAgIH0pOwogIH0KfQoKLy8gVGhlc2Ugb2JqZWN0cyB3aWxsIGNvbnRhaW4gdGhlIGRlZmF1bHQgdmFsdWUKCi8vIFRoaXMgY29kZSB1cGRhdGVzIHRoZSBpbWFnZSBvcHRpb25zIGluIHRoZSBQTE9UIGNvbmZpZyB3aXRoIHRoZSBwcm92aWRlZCBvbmVzCmZ1bmN0aW9uIHNldEltYWdlT3B0aW9ucyhvKSB7CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBvW2tleV07CiAgfQp9CmZ1bmN0aW9uIHVuc2V0SW1hZ2VPcHRpb25zKCkgewogIHNldEltYWdlT3B0aW9ucyh7fSk7Cn0KCmNvbnN0IHNldF9idXR0b24gPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtc3Bhbi5zZXQiKTsKY29uc3QgdW5zZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4udW5zZXQiKTsKaWYgKGZpcnN0UnVuKSB7CiAgc2V0X2J1dHRvbi5vbmNsaWNrID0gKGUpID0+IHsKICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfQogIH07CiAgdW5zZXRfYnV0dG9uLm9uY2xpY2sgPSB1bnNldEltYWdlT3B0aW9uczsKfQoKLy8gV2UgYWRkIGEgZnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIGNsaXBib2FyZCBpcyBwb3BwZWQgb3V0CkNPTlRBSU5FUi5pc1BvcHBlZE91dCA9ICgpID0+IHsKICByZXR1cm4gQ09OVEFJTkVSLmNsYXNzTGlzdC5jb250YWlucygicG9wcGVkLW91dCIpOwp9OwoKQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNlZG93biA9IGZ1bmN0aW9uIChldmVudCkgewogIGlmIChldmVudC50YXJnZXQubWF0Y2hlcygic3Bhbi5jbGlwYm9hcmQtdmFsdWUiKSkgewogICAgY29uc29sZS5sb2coIldlIGRvbid0IG1vdmUhIik7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IHN0YXJ0ID0gewogICAgbGVmdDogcGFyc2VGbG9hdChDT05UQUlORVIuc3R5bGUubGVmdCksCiAgICB0b3A6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLnRvcCksCiAgICBYOiBldmVudC5wYWdlWCwKICAgIFk6IGV2ZW50LnBhZ2VZLAogIH07CiAgZnVuY3Rpb24gbW92ZUF0KGV2ZW50LCBzdGFydCkgewogICAgY29uc3QgdG9wID0gZXZlbnQucGFnZVkgLSBzdGFydC5ZICsgc3RhcnQudG9wICsgInB4IjsKICAgIGNvbnN0IGxlZnQgPSBldmVudC5wYWdlWCAtIHN0YXJ0LlggKyBzdGFydC5sZWZ0ICsgInB4IjsKICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUudG9wID0gdG9wOwogIH0KCiAgLy8gbW92ZSBvdXIgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGJhbGwgdW5kZXIgdGhlIHBvaW50ZXIKICBtb3ZlQXQoZXZlbnQsIHN0YXJ0KTsKICBmdW5jdGlvbiBvbk1vdXNlTW92ZShldmVudCkgewogICAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgfQoKICAvLyBXZSB1c2UgdGhpcyB0byByZW1vdmUgdGhlIG1vdXNlbW92ZSB3aGVuIGNsaWNraW5nIG91dHNpZGUgb2YgdGhlIGNvbnRhaW5lcgogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CgogIC8vIG1vdmUgdGhlIGNvbnRhaW5lciBvbiBtb3VzZW1vdmUKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCBvbk1vdXNlTW92ZSwgewogICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCwKICB9KTsKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICBjbGVhblVwKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKCiAgZnVuY3Rpb24gY2xlYW5VcCgpIHsKICAgIGNvbnNvbGUubG9nKCJjbGVhbmluZyB1cCB0aGUgcGxvdCBtb3ZlIGxpc3RlbmVyIik7CiAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICBDTElQQk9BUkRfSEVBREVSLm9ubW91c2V1cCA9IG51bGw7CiAgfQoKICAvLyAoMykgZHJvcCB0aGUgYmFsbCwgcmVtb3ZlIHVubmVlZGVkIGhhbmRsZXJzCiAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBjbGVhblVwOwp9OwoKZnVuY3Rpb24gc2VuZFRvQ2xpcGJvYXJkKGJsb2IpIHsKICBpZiAoIW5hdmlnYXRvci5jbGlwYm9hcmQpIHsKICAgIGFsZXJ0KAogICAgICAiVGhlIENsaXBib2FyZCBBUEkgZG9lcyBub3Qgc2VlbSB0byBiZSBhdmFpbGFibGUsIG1ha2Ugc3VyZSB0aGUgUGx1dG8gbm90ZWJvb2sgaXMgYmVpbmcgdXNlZCBmcm9tIGVpdGhlciBsb2NhbGhvc3Qgb3IgYW4gaHR0cHMgc291cmNlLiIKICAgICk7CiAgfQogIG5hdmlnYXRvci5jbGlwYm9hcmQKICAgIC53cml0ZShbCiAgICAgIG5ldyBDbGlwYm9hcmRJdGVtKHsKICAgICAgICAvLyBUaGUga2V5IGlzIGRldGVybWluZWQgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIGJsb2IncyB0eXBlLgogICAgICAgIFtibG9iLnR5cGVdOiBibG9iLAogICAgICB9KSwKICAgIF0pCiAgICAudGhlbigKICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgIGNvbnNvbGUubG9nKCJBc3luYzogQ29weWluZyB0byBjbGlwYm9hcmQgd2FzIHN1Y2Nlc3NmdWwhIik7CiAgICAgIH0sCiAgICAgIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJBc3luYzogQ291bGQgbm90IGNvcHkgdGV4dDogIiwgZXJyKTsKICAgICAgfQogICAgKTsKfQoKZnVuY3Rpb24gY29weUltYWdlVG9DbGlwYm9hcmQoKSB7CiAgLy8gV2UgZXh0cmFjdCB0aGUgaW1hZ2Ugb3B0aW9ucyBmcm9tIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzIChpZiB0aGV5IGV4aXN0KQogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuIFdlIGFsc28gaWdub3JlIGZvcm1hdCBiZWNhdXNlIHRoZSBjbGlwYm9hcmQgb25seSBzdXBwb3J0cyBwbmcuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwga2V5ID09PSAiZm9ybWF0IikgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbmZpZ1trZXldID0gdmFsOwogIH0KICBQbG90bHkudG9JbWFnZShQTE9ULCBjb25maWcpLnRoZW4oZnVuY3Rpb24gKGRhdGFVcmwpIHsKICAgIGZldGNoKGRhdGFVcmwpCiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5ibG9iKCkpCiAgICAgIC50aGVuKChibG9iKSA9PiB7CiAgICAgICAgY29uc3QgcGFzdGVfcmVjZWl2ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdwYXN0ZS1yZWNlaXZlci5wbHV0b3Bsb3RseScpCiAgICAgICAgaWYgKHBhc3RlX3JlY2VpdmVyKSB7CiAgICAgICAgICBwYXN0ZV9yZWNlaXZlci5hdHRhY2hJbWFnZShkYXRhVXJsLCBDT05UQUlORVIpCiAgICAgICAgfQogICAgICAgIHNlbmRUb0NsaXBib2FyZChibG9iKQogICAgICB9KTsKICB9KTsKfQoKZnVuY3Rpb24gc2F2ZUltYWdlVG9GaWxlKCkgewogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LmRvd25sb2FkSW1hZ2UoUExPVCwgY29uZmlnKTsKfQoKbGV0IGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwLCB0b3A6IDAsIGxlZnQ6IDAgfTsKZnVuY3Rpb24gdW5wb3BfY29udGFpbmVyKGNsKSB7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCBmYWxzZSk7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoY2wsIGZhbHNlKTsKICAvLyBXZSBmaXggdGhlIGhlaWdodCBiYWNrIHRvIHRoZSB2YWx1ZSBpdCBoYWQgYmVmb3JlIHBvcG91dCwgYWxzbyBzZXR0aW5nIHRoZSBmbGFnIHRvIHNpZ25hbCB0aGF0IHVwb24gZmlyc3QgcmVzaXplIHdlIHJlbW92ZSB0aGUgZml4ZWQgaW5saW5lLXN0eWxlCiAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9IGNvbnRhaW5lcl9yZWN0LmhlaWdodCArICJweCI7CiAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gdHJ1ZTsKICAvLyBXZSBzZXQgdGhlIG90aGVyIGZpeGVkIGlubGluZS1zdHlsZXMgdG8gbnVsbAogIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogIENPTlRBSU5FUi5zdHlsZS50b3AgPSAiIjsKICBDT05UQUlORVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIFdlIGFsc28gcmVtb3ZlIHRoZSBDTElQQk9BUkRfSEVBREVSCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9ICIiOwogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIEZpbmFsbHkgd2UgcmVtb3ZlIHRoZSBoaWRkZW4gY2xhc3MgdG8gdGhlIGhlYWRlcgogIENMSVBCT0FSRF9IRUFERVIuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgdHJ1ZSk7CiAgcmV0dXJuOwp9CmZ1bmN0aW9uIHBvcG91dF9jb250YWluZXIob3B0cykgewogIGNvbnN0IGNsID0gb3B0cz8uY2w7CiAgY29uc3QgdGFyZ2V0X2NvbnRhaW5lcl9zaXplID0gb3B0cz8udGFyZ2V0X2NvbnRhaW5lcl9zaXplID8/IHt9OwogIGNvbnN0IHRhcmdldF9wbG90X3NpemUgPSBvcHRzPy50YXJnZXRfcGxvdF9zaXplID8/IHt9OwogIGlmIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgcmV0dXJuIHVucG9wX2NvbnRhaW5lcihjbCk7CiAgfQogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBjbCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0cnVlKTsKICAvLyBXZSBleHRyYWN0IHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNvbnRhaW5lciwgc2F2ZSB0aGVtIGFuZCBmaXggdGhlbQogIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH0gPSBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgY29udGFpbmVyX3JlY3QgPSB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9OwogIC8vIFdlIHNhdmUgdGhlIGN1cnJlbnQgcGxvdCBzaXplIGJlZm9yZSB3ZSBwb3AgYXMgaXQgd2lsbCBmaWxsIHRoZSBzY3JlZW4KICBjb25zdCBjdXJyZW50X3Bsb3Rfc2l6ZSA9IHsKICAgIHdpZHRoOiBQTE9ULl9mdWxsTGF5b3V0LndpZHRoLAogICAgaGVpZ2h0OiBQTE9ULl9mdWxsTGF5b3V0LmhlaWdodCwKICB9OwogIC8vIFdlIGhhdmUgdG8gc2F2ZSB0aGUgcGFkIGRhdGEgYmVmb3JlIHBvcHBpbmcgc28gd2UgY2FuIHJlc2l6ZSBwcmVjaXNlbHkKICBjb25zdCBwYWQgPSB7fTsKICBwYWQudW5wb3BwZWQgPSBnZXRTaXplRGF0YSgpLmNvbnRhaW5lcl9wYWQ7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCB0cnVlKTsKICBwYWQucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIC8vIFdlIGRvIHRvcCBhbmQgbGVmdCBiYXNlZCBvbiB0aGUgY3VycmVudCByZWN0CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ0b3AiLCAibGVmdCJdKSB7CiAgICBjb25zdCBzdGFydF92YWwgPSB0YXJnZXRfY29udGFpbmVyX3NpemVba2V5XSA/PyBjb250YWluZXJfcmVjdFtrZXldOwogICAgbGV0IG9mZnNldCA9IDA7CiAgICBmb3IgKGNvbnN0IGtpbmQgb2YgWyJwYWRkaW5nIiwgImJvcmRlciJdKSB7CiAgICAgIG9mZnNldCArPSBwYWQucG9wcGVkW2tpbmRdW2tleV0gLSBwYWQudW5wb3BwZWRba2luZF1ba2V5XTsKICAgIH0KICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gc3RhcnRfdmFsIC0gb2Zmc2V0ICsgInB4IjsKICAgIGlmIChrZXkgPT09ICJsZWZ0IikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgLy8gV2UgY29tcHV0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBkZXBlbmRpbmcgb24gZXZlbnR1YWwgY29uZmlnIGRhdGEKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7CiAgICB3aWR0aDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS53aWR0aCA/PwogICAgICBjb25maWdfc3BhbnMud2lkdGguY29uZmlnX3ZhbHVlID8/CiAgICAgIGN1cnJlbnRfcGxvdF9zaXplLndpZHRoLAogICAgaGVpZ2h0OgogICAgICB0YXJnZXRfcGxvdF9zaXplLmhlaWdodCA/PwogICAgICBjb25maWdfc3BhbnMuaGVpZ2h0LmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS5oZWlnaHQsCiAgfSk7CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgY29uc3QgdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY3N6W2tleV07CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHZhbCArICJweCI7CiAgICBpZiAoa2V5ID09PSAid2lkdGgiKSB7CiAgICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGVba2V5XSA9IENPTlRBSU5FUi5zdHlsZVtrZXldOwogICAgfQogIH0KICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIGZhbHNlKTsKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICB1bnBvcF9jb250YWluZXIoKTsKICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9LAogICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0KICApOwp9CgpDT05UQUlORVIucG9wT3V0ID0gcG9wb3V0X2NvbnRhaW5lcjsKCmZ1bmN0aW9uIER1YWxDbGljayhzaW5nbGVfZnVuYywgZGJsX2Z1bmMpIHsKICBsZXQgbmNsaWNrcyA9IDA7CiAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7CiAgICBuY2xpY2tzICs9IDE7CiAgICBpZiAobmNsaWNrcyA+IDEpIHsKICAgICAgZGJsX2Z1bmMoLi4uYXJncyk7CiAgICAgIG5jbGlja3MgPSAwOwogICAgfSBlbHNlIHsKICAgICAgZGVsYXkoMzAwKS50aGVuKCgpID0+IHsKICAgICAgICBpZiAobmNsaWNrcyA9PSAxKSB7CiAgICAgICAgICBzaW5nbGVfZnVuYyguLi5hcmdzKTsKICAgICAgICB9CiAgICAgICAgbmNsaWNrcyA9IDA7CiAgICAgIH0pOwogICAgfQogIH07Cn0KCi8vIFdlIHJlbW92ZSB0aGUgZGVmYXVsdCBkb3dubG9hZCBpbWFnZSBidXR0b24KcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9SZW1vdmUgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlLAogIFsidG9JbWFnZSJdCik7Ci8vIFdlIGFkZCB0aGUgY3VzdG9tIGJ1dHRvbiB0byB0aGUgbW9kZWJhcgpwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb0FkZCA9IF8udW5pb24oCiAgcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQsCiAgWwogICAgewogICAgICBuYW1lOiAiQ29weSBQTkcgdG8gQ2xpcGJvYXJkIiwKICAgICAgaWNvbjogewogICAgICAgIGhlaWdodDogNTIwLAogICAgICAgIHdpZHRoOiA1MjAsCiAgICAgICAgcGF0aDogIk0yODAgNjRoNDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRWNDQ4YzAgMzUuMy0yOC43IDY0LTY0IDY0SDY0Yy0zNS4zIDAtNjQtMjguNy02NC02NFYxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRoNDAgOS42QzEyMSAyNy41IDE1My4zIDAgMTkyIDBzNzEgMjcuNSA3OC40IDY0SDI4MHpNNjQgMTEyYy04LjggMC0xNiA3LjItMTYgMTZWNDQ4YzAgOC44IDcuMiAxNiAxNiAxNkgzMjBjOC44IDAgMTYtNy4yIDE2LTE2VjEyOGMwLTguOC03LjItMTYtMTYtMTZIMzA0djI0YzAgMTMuMy0xMC43IDI0LTI0IDI0SDE5MiAxMDRjLTEzLjMgMC0yNC0xMC43LTI0LTI0VjExMkg2NHptMTI4LThhMjQgMjQgMCAxIDAgMC00OCAyNCAyNCAwIDEgMCAwIDQ4eiIsCiAgICAgIH0sCiAgICAgIGRpcmVjdGlvbjogInVwIiwKICAgICAgY2xpY2s6IER1YWxDbGljayhjb3B5SW1hZ2VUb0NsaXBib2FyZCwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoKTsKICAgICAgfSksCiAgICB9LAogICAgewogICAgICBuYW1lOiAiRG93bmxvYWQgSW1hZ2UiLAogICAgICBpY29uOiBQbG90bHkuSWNvbnMuY2FtZXJhLAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soc2F2ZUltYWdlVG9GaWxlLCAoKSA9PiB7CiAgICAgICAgcG9wb3V0X2NvbnRhaW5lcih7IGNsOiAiZmlsZXNhdmUiIH0pOwogICAgICB9KSwKICAgIH0sCiAgXQopOwoKZnVuY3Rpb24gZ2V0T2Zmc2V0RGF0YShlbCkgewogIGxldCBjcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsLCBudWxsKTsKICBjb25zdCBvZGF0YSA9IHsKICAgIHBhZGRpbmc6IHsKICAgICAgbGVmdDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSwKICAgICAgYm90dG9tOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSArIHBhcnNlRmxvYXQoY3MucGFkZGluZ0JvdHRvbSksCiAgICB9LAogICAgYm9yZGVyOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyTGVmdFdpZHRoKSwKICAgICAgcmlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyUmlnaHRXaWR0aCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5ib3JkZXJUb3BXaWR0aCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCkgKyBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICB9CiAgfTsKICBpZiAoZWwgPT09IFBMT1QpIHsKICAgIC8vIEZvciB0aGUgUExPVCB3ZSBhbHNvIHdhbnQgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIG9mZnNldAogICAgb2RhdGEub2Zmc2V0ID0gewogICAgICB0b3A6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0VG9wIDogMCwKICAgICAgbGVmdDogUExPVC5vZmZzZXRQYXJlbnQgPT0gQ09OVEFJTkVSID8gUExPVC5vZmZzZXRMZWZ0IDogMCwKICAgIH0KICB9CiAgcmV0dXJuIG9kYXRhOwp9CmZ1bmN0aW9uIGdldFNpemVEYXRhKCkgewogIGNvbnN0IGRhdGEgPSB7CiAgICBwbG90X3BhZDogZ2V0T2Zmc2V0RGF0YShQTE9UKSwKICAgIHBsb3RfcmVjdDogUExPVC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICAgIGNvbnRhaW5lcl9wYWQ6IGdldE9mZnNldERhdGEoQ09OVEFJTkVSKSwKICAgIGNvbnRhaW5lcl9yZWN0OiBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgfTsKICByZXR1cm4gZGF0YTsKfQpmdW5jdGlvbiBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgY29uc3QgY29tcHV0ZWRfc2l6ZSA9IGNvbXB1dGVQbG90U2l6ZShzaXplRGF0YSk7CiAgY29uc3Qgb2Zmc2V0cyA9IGNvbXB1dGVkX3NpemUub2Zmc2V0czsKCiAgY29uc3QgcGxvdF9kYXRhID0gewogICAgd2lkdGg6IHdpZHRoID8/IGNvbXB1dGVkX3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IGhlaWdodCA/PyBjb21wdXRlZF9zaXplLmhlaWdodCwKICB9OwoKICByZXR1cm4gewogICAgd2lkdGg6ICh3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoKSArIG9mZnNldHMud2lkdGgsCiAgICBoZWlnaHQ6IChoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQpICsgb2Zmc2V0cy5oZWlnaHQsCiAgICBub0NoYW5nZTogd2lkdGggPT0gY29tcHV0ZWRfc2l6ZS53aWR0aCAmJiBoZWlnaHQgPT0gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfQp9CgovLyBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hhbmdlIHRoZSBjb250YWluZXIgc2l6ZSBzbyB0aGF0IHRoZSByZXN1bHRpbmcgcGxvdCB3aWxsIGJlIG1hdGNoaW5nIHRoZSBwcm92aWRlZCBzcGVjcwpmdW5jdGlvbiBjaGFuZ2VDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICBpZiAoIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICBjb25zb2xlLmxvZygiVHJpZWQgdG8gY2hhbmdlIGNvbnRhaW5lciBzaXplIHdoZW4gbm90IHBvcHBlZCwgaWdub3JpbmciKTsKICAgIHJldHVybjsKICB9CgogIGNvbnN0IGNzeiA9IGNvbXB1dGVDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSk7CgogIGlmIChjc3oubm9DaGFuZ2UpIHsKICAgIGNvbnNvbGUubG9nKCJTaXplIGlzIHRoZSBzYW1lIGFzIGN1cnJlbnQsIGlnbm9yaW5nIik7CiAgICByZXR1cm4KICB9CiAgLy8gV2UgYXJlIG5vdyBnb2luZyB0byBzZXQgaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgY29udGFpbmVyCiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSBjc3pba2V5XSArICJweCI7CiAgfQp9Ci8vIFdlIG5vdyBjcmVhdGUgdGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCB1cGRhdGUgdGhlIHBsb3QgYmFzZWQgb24gdGhlIHZhbHVlcyBzcGVjaWZpZWQKZnVuY3Rpb24gdXBkYXRlRnJvbUhlYWRlcigpIHsKICBjb25zdCBoZWFkZXJfZGF0YSA9IHsKICAgIGhlaWdodDogY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSwKICAgIHdpZHRoOiBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUsCiAgfTsKICBjaGFuZ2VDb250YWluZXJTaXplKGhlYWRlcl9kYXRhKTsKfQovLyBXZSBhc3NpZ24gdGhpcyBmdW5jdGlvbiB0byB0aGUgb25ibHVyIGV2ZW50IG9mIHdpZHRoIGFuZCBoZWlnaHQKaWYgKGZpcnN0UnVuKSB7CiAgZm9yIChjb25zdCBjb250YWluZXIgb2YgT2JqZWN0LnZhbHVlcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIudWlfc3Bhbi5vbmJsdXIgPSAoZSkgPT4gewogICAgICBjb250YWluZXIudWlfdmFsdWUgPSBjb250YWluZXIudWlfc3Bhbi50ZXh0Q29udGVudDsKICAgICAgdXBkYXRlRnJvbUhlYWRlcigpOwogICAgfTsKICB9Cn0KLy8gVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgcGxvdCBzaXplIHRvIHVzZSBmb3IgcmVsYXlvdXQgYXMgYSBmdW5jdGlvbiBvZiB0aGUgY29udGFpbmVyIHNpemUKZnVuY3Rpb24gY29tcHV0ZVBsb3RTaXplKGRhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgLy8gUmVtb3ZlIFBhZGRpbmcKICBjb25zdCB7IGNvbnRhaW5lcl9wYWQsIHBsb3RfcGFkLCBjb250YWluZXJfcmVjdCB9ID0gZGF0YTsKICBjb25zdCBvZmZzZXRzID0gewogICAgd2lkdGg6CiAgICAgIHBsb3RfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBwbG90X3BhZC5ib3JkZXIud2lkdGggKwogICAgICBwbG90X3BhZC5vZmZzZXQubGVmdCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy53aWR0aCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLndpZHRoLAogICAgaGVpZ2h0OgogICAgICBwbG90X3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIHBsb3RfcGFkLmJvcmRlci5oZWlnaHQgKwogICAgICBwbG90X3BhZC5vZmZzZXQudG9wICsKICAgICAgY29udGFpbmVyX3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLmhlaWdodCwKICB9OwogIGNvbnN0IHN6ID0gewogICAgd2lkdGg6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3Qud2lkdGggLSBvZmZzZXRzLndpZHRoKSwKICAgIGhlaWdodDogTWF0aC5yb3VuZChjb250YWluZXJfcmVjdC5oZWlnaHQgLSBvZmZzZXRzLmhlaWdodCksCiAgICBvZmZzZXRzLAogIH07CiAgcmV0dXJuIHN6Owp9CgovLyBDcmVhdGUgdGhlIHJlc2l6ZU9ic2VydmVyIHRvIG1ha2UgdGhlIHBsb3QgZXZlbiBtb3JlIHJlc3BvbnNpdmUhIDptYWdpYzoKY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHsKICBjb25zdCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCk7CiAgY29uc3Qge2NvbnRhaW5lcl9yZWN0LCBjb250YWluZXJfcGFkfSA9IHNpemVEYXRhOwogIGxldCBwbG90X3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIC8vIFdlIHNhdmUgdGhlIGhlaWdodCBpbiB0aGUgUExPVCBvYmplY3QKICBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQ7CiAgLy8gV2UgZGVhbCB3aXRoIHNvbWUgc3R1ZmYgaWYgdGhlIGNvbnRhaW5lciBpcyBwb3BwcGVkCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9IGNvbnRhaW5lcl9yZWN0LndpZHRoICsgInB4IjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBjb250YWluZXJfcmVjdC5sZWZ0ICsgInB4IjsKICBjb25maWdfc3BhbnMuaGVpZ2h0LnVpX3ZhbHVlID0gcGxvdF9zaXplLmhlaWdodDsKICBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUgPSBwbG90X3NpemUud2lkdGg7CiAgLyogCgkJVGhlIGFkZGl0aW9uIG9mIHRoZSBpbnZhbGlkIGFyZ3VtZW50IGBwbHV0b3Jlc2l6ZWAgc2VlbXMgdG8gZml4IHRoZSBwcm9ibGVtIHdpdGggY2FsbGluZyBgcmVsYXlvdXRgIHNpbXBseSB3aXRoIGB7YXV0b3NpemU6IHRydWV9YCBhcyB1cGRhdGUgYnJlYWtpbmcgbW91c2UgcmVsYXlvdXQgZXZlbnRzIHRyYWNraW5nLiAKCQlTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Bsb3RseS9wbG90bHkuanMvaXNzdWVzLzYxNTYgZm9yIGRldGFpbHMKCQkqLwogIGxldCBjb25maWcgPSB7CiAgICAvLyBJZiB0aGlzIGlzIHBvcHBlZCBvdXQsIHdlIGlnbm9yZSB0aGUgb3JpZ2luYWwgd2lkdGgvaGVpZ2h0CiAgICB3aWR0aDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfd2lkdGgpID8/IHBsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfaGVpZ2h0KSA/PyBwbG90X3NpemUuaGVpZ2h0LAogICAgcGx1dG9yZXNpemU6IHRydWUsCiAgfTsKICBQbG90bHkucmVsYXlvdXQoUExPVCwgY29uZmlnKS50aGVuKCgpID0+IHsKICAgIGlmIChyZW1vdmVfY29udGFpbmVyX3NpemUgJiYgIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIHRoZSBmaXJzdCByZXNpemUgdXBvbiBwbG90IGNyZWF0aW9uIHRvIGFscmVhZHkgYmUgd2l0aG91dCBhIGZpeGVkIGhlaWdodAogICAgICBDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gIiI7CiAgICAgIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogICAgICByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmYWxzZTsKICAgIH0KICB9KTsKfSk7CgpyZXNpemVPYnNlcnZlci5vYnNlcnZlKENPTlRBSU5FUik7CgoKUGxvdGx5LnJlYWN0KFBMT1QsIHBsb3Rfb2JqKS50aGVuKCgpID0+IHsKCS8vIEFzc2lnbiB0aGUgUGxvdGx5IGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKHBsb3RseV9saXN0ZW5lcnMpKSB7CgkJZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcl92ZWMpIHsKCQkJUExPVC5vbihrZXksIGxpc3RlbmVyKQoJCX0KCX0KCS8vIEFzc2lnbiB0aGUgSlMgZXZlbnQgbGlzdGVuZXJzCglmb3IgKGNvbnN0IFtrZXksIGxpc3RlbmVyX3ZlY10gb2YgT2JqZWN0LmVudHJpZXMoanNfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1QuYWRkRXZlbnRMaXN0ZW5lcihrZXksIGxpc3RlbmVyLCB7CgkJCQlzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsCgkJCX0pCgkJfQoJfQp9CikKCgppbnZhbGlkYXRpb24udGhlbigoKSA9PiB7CgkvLyBSZW1vdmUgYWxsIHBsb3RseSBsaXN0ZW5lcnMKCVBMT1QucmVtb3ZlQWxsTGlzdGVuZXJzKCkKCS8vIFJlbW92ZSBhbGwgSlMgbGlzdGVuZXJzCgljb250cm9sbGVyLmFib3J0KCkKCS8vIFJlbW92ZSB0aGUgcmVzaXplT2JzZXJ2ZXIKCXJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKQp9KQoKCgoJCXJldHVybiBDT05UQUlORVIKCTwvc2NyaXB0PgqkbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/yEz9i7GwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJDEyMzFiODMyLTQ3YjEtNGNjYi05YjU2LWE2NzgzODU5OGNjN7lkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzguajWq1cHVibGlzaGVkX29iamVjdF9rZXlzkdk1N2JjYzA1YjAtODFkYS0xMWVmLTIwNDAtMzU4NWM5YjQ5NTRmLzVmYmIzNjQwNGM0NDZiYWG4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkMDI2NjYzMmQtNWNhNC00MTk2LWE1MjMtMzNhNjZkZDcwZTBjiqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9keYWmcHJlZml4o0FEQ6hlbGVtZW50c5WSoU6SozEwMKp0ZXh0L3BsYWlukqFUkqQwLjA1qnRleHQvcGxhaW6SpWRlbGF5kqMwLjCqdGV4dC9wbGFpbpKjzpRmkqMwLjCqdGV4dC9wbGFpbpKiz5WSozAuMKp0ZXh0L3BsYWlupHR5cGWmc3RydWN0rHByZWZpeF9zaG9ydKNBREOob2JqZWN0aWSwNDAxOGRhMjk4Njc3MjcwMaRtaW1l2SFhcHBsaWNhdGlvbi92bmQucGx1dG8udHJlZStvYmplY3Sscm9vdGFzc2lnbmVlo2FkY7JsYXN0X3J1bl90aW1lc3RhbXDLQdm/yENKzsCwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJDAyNjY2MzJkLTVjYTQtNDE5Ni1hNTIzLTMzYTY2ZGQ3MGUwY7lkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzTgWtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwrFjZWxsX2RlcGVuZGVuY2llc94ALtkkNThiZTQxNTAtMmI3YS00ZjllLWE3ZDctNDBhMDg2ZmQzYTUzhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkNThiZTQxNTAtMmI3YS00ZjllLWE3ZDctNDBhMDg2ZmQzYTUztGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCEpEJhc2WQrkJhc2UuRG9jcy5IVE1MkKlAaHRtbF9zdHKQsWFjdGl2aXR5X2ZpbmlzaGVkkdkkYWI4ZGMxY2UtZDFlZi00M2EwLTk0OTUtZGFjOTMxYjUyYWVj2SRmMTFhMmZhMi1lZmY5LTQ5NzktYjczOS0zZGEyYjI0YTlhNDWEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SRmMTFhMmZhMi1lZmY5LTQ5NzktYjczOS0zZGEyYjI0YTlhNDW0ZG93bnN0cmVhbV9jZWxsc19tYXCAsnVwc3RyZWFtX2NlbGxzX21hcIKnQG1kX3N0cpCoZ2V0aW5kZXiQ2SQ5NzEwNGM0Ni1lODFmLTQ0NGEtOTU3Zi0wYmJiMWIwMmYxYjiEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQ5NzEwNGM0Ni1lODFmLTQ0NGEtOTU3Zi0wYmJiMWIwMmYxYji0ZG93bnN0cmVhbV9jZWxsc19tYXCAsnVwc3RyZWFtX2NlbGxzX21hcISnQG1kX3N0cpCoUmVzb3VyY2WQoj0+kKhnZXRpbmRleJDZJGU0YzgwYzI0LTIwZmQtNDJlNS05ZGNkLWE2NTk1ODU2OWMwMYS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJGU0YzgwYzI0LTIwZmQtNDJlNS05ZGNkLWE2NTk1ODU2OWMwMbRkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwhKdAbWRfc3RykKhSZXNvdXJjZZCiPT6QqGdldGluZGV4kNkkMThjODJmZjEtMGJkZS00ZmEwLTg0OGMtZDBlYjczZDFhYzdjhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkMThjODJmZjEtMGJkZS00ZmEwLTg0OGMtZDBlYjczZDFhYzdjtGRvd25zdHJlYW1fY2VsbHNfbWFwgqxmaWdfc2lnbmFsXzKQrXNpZ25hbF9sYXlvdXSR2SQxYzc5YjM3ZS1kNGUwLTQ5MGYtOTQ2Ni0yMGNlMjhmMDE3YWWydXBzdHJlYW1fY2VsbHNfbWFwhqRhdHRykLJzaWduYWxfdDJfc3Rhcl9ncmWR2SQxYTgzZDg5Ny03MDViLTQ0M2QtODlhNC1lYTVlM2U2YTNjMDepcmVsYXlvdXQhkKpzaWduYWxfZ3JlkdkkNDFkMTRkZWMtYjg1Mi00MzE2LWFlZmItYzNkMDhmYTQzMjE2qHJlbGF5b3V0kKZMYXlvdXSQ2SQxYzc5YjM3ZS1kNGUwLTQ5MGYtOTQ2Ni0yMGNlMjhmMDE3YWWEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQxYzc5YjM3ZS1kNGUwLTQ5MGYtOTQ2Ni0yMGNlMjhmMDE3YWW0ZG93bnN0cmVhbV9jZWxsc19tYXCDrGZpZ19zaWduYWxfM5CodF9hZGNfc2WQsXNpZ25hbF90Ml9zdGFyX3NlkLJ1cHN0cmVhbV9jZWxsc19tYXCNpnNlcV9zZZHZJDI3ZTY1NjgwLTIyYTAtNDA3OS1iNmRmLWQ2MGEzMjE4ZTUyZa1zaWduYWxfbGF5b3V0kdkkMThjODJmZjEtMGJkZS00ZmEwLTg0OGMtZDBlYjczZDFhYzdjsnNpZ25hbF90Ml9zdGFyX2dyZZHZJDFhODNkODk3LTcwNWItNDQzZC04OWE0LWVhNWUzZTZhM2MwN6pzaWduYWxfZ3JlkdkkNDFkMTRkZWMtYjg1Mi00MzE2LWFlZmItYzNkMDhmYTQzMjE2qHJlbGF5b3V0kKlyZWxheW91dCGQqHQyX2RlY2F5kdkkMTIzMWI4MzItNDdiMS00Y2NiLTliNTYtYTY3ODM4NTk4Y2M3qmFkZHRyYWNlcyGQrnJhd190Ml9zdGFyX3NlkdkkOTc0Nzk0MzctOWNlMy00YjMzLTkxMzQtMGYyYWY4OWJjY2I1q3Bsb3Rfc2lnbmFskKEqkNkiS29tYU1SSUNvcmUuZ2V0X2FkY19zYW1wbGluZ190aW1lc5CrS29tYU1SSUNvcmWR2SRkNmIxNzI5YS04NzRkLTExZWUtMTUxYS05YjBmY2NlMmM0ZmTZJGFiOGRjMWNlLWQxZWYtNDNhMC05NDk1LWRhYzkzMWI1MmFlY4S0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJGFiOGRjMWNlLWQxZWYtNDNhMC05NDk1LWRhYzkzMWI1MmFlY7Rkb3duc3RyZWFtX2NlbGxzX21hcIGxYWN0aXZpdHlfZmluaXNoZWSR2SQ1OGJlNDE1MC0yYjdhLTRmOWUtYTdkNy00MGEwODZmZDNhNTOydXBzdHJlYW1fY2VsbHNfbWFwgNkkOGI0YTFhZDktMmQ2YS00YzhmLWJiOGUtZjQzYzJkMDU4MTk1hLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkOGI0YTFhZDktMmQ2YS00YzhmLWJiOGUtZjQzYzJkMDU4MTk1tGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCqHBsb3Rfc2VxkKdzZXFfZ3JlkdkkOTE3OWFhNDAtYmI0MC00YTM2LWFlMWUtMDBhZTQyOTM1YTVm2SQzNWZmMzQwMi1kYzM2LTRiOTEtYmVjOS1iNGQyMWZhZjNlNjiEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQzNWZmMzQwMi1kYzM2LTRiOTEtYmVjOS1iNGQyMWZhZjNlNji0ZG93bnN0cmVhbV9jZWxsc19tYXCAsnVwc3RyZWFtX2NlbGxzX21hcIKjb2JqkdkkZDE2ZWZhNjItZGNlNy00ZWMzLTllM2MtYjVlMTY3NzM3N2ZjsHBsb3RfcGhhbnRvbV9tYXCQ2SQ0YTRhNmJkMy1iODIwLTQ3OWMtODllMy1mM2NlNzlhMzE2ZGKEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQ0YTRhNmJkMy1iODIwLTQ3OWMtODllMy1mM2NlNzlhMzE2ZGK0ZG93bnN0cmVhbV9jZWxsc19tYXCBsXJlY29uX3QyX3N0YXJfZ3JlktkkOTY0NDA0ZjYtN2Y0Ni00ZGY5LWFkOTgtOTIxOTQ4YzNiZTY52SQzNDgyNGRiNy0xM2M0LTQ1ZTItYmVmYS1mMDI3YjliNTg1YzCydXBzdHJlYW1fY2VsbHNfbWFwhKRmZnRjkdkkOWE4OGE1NGItYmNjNy00MWFkLThlNjAtZjRkNDUwZGNjYjJkr3Jhd190Ml9zdGFyX2dyZZHZJGU0ZWY1MTQ1LWE2M2MtNGY5MS1hYzA0LTNiNWJmMTZjMDg0MqRwbG90kKNhYnOQ2SQyN2U2NTY4MC0yMmEwLTQwNzktYjZkZi1kNjBhMzIxOGU1MmWEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQyN2U2NTY4MC0yMmEwLTQwNzktYjZkZi1kNjBhMzIxOGU1MmW0ZG93bnN0cmVhbV9jZWxsc19tYXCBpnNlcV9zZZTZJGYxZjNiNzAwLTU5MTYtNDk2Zi1iOTM4LTQ2ZjdmMDhiNGViNtkkNGUxNDM0ZTEtNjczZi00MjA2LWEyNzEtOWVkZWMxMGViZDZh2SQ5NzQ3OTQzNy05Y2UzLTRiMzMtOTEzNC0wZjJhZjg5YmNjYjXZJDFjNzliMzdlLWQ0ZTAtNDkwZi05NDY2LTIwY2UyOGYwMTdhZbJ1cHN0cmVhbV9jZWxsc19tYXCHoSuQpmd4X3ByZZHZJDkxNzlhYTQwLWJiNDAtNGEzNi1hZTFlLTAwYWU0MjkzNWE1ZqhTZXF1ZW5jZZChKpCiaW2QonJmkdkkYzZlMzNjYjgtZjQyYy00NjQzLTkyNTctMTI0ZDI4MDRkM2Rhp3JlYWRvdXSR2SQ5MTc5YWE0MC1iYjQwLTRhMzYtYWUxZS0wMGFlNDI5MzVhNWbZJDBmOTZhODNkLTk2ZWYtNDc2OC05MzMwLTg3YzQ2NmUzNWM5M4S0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDBmOTZhODNkLTk2ZWYtNDc2OC05MzMwLTg3YzQ2NmUzNWM5M7Rkb3duc3RyZWFtX2NlbGxzX21hcIGiQXiR2SQ5MTc5YWE0MC1iYjQwLTRhMzYtYWUxZS0wMGFlNDI5MzVhNWaydXBzdHJlYW1fY2VsbHNfbWFwiqRDb3JlkKRCYXNlkLdQbHV0b1J1bm5lci5jcmVhdGVfYm9uZJCrUGx1dG9SdW5uZXKQpXJhbmdlkK9Db3JlLmFwcGxpY2FibGWQpUBiaW5kkKhCYXNlLmdldJChKpCmU2xpZGVykNkkNWRmOTc4NzQtZjA5Yy00MTczLWEyZjYtODkzZGIzMjJjY2FmhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkNWRmOTc4NzQtZjA5Yy00MTczLWEyZjYtODkzZGIzMjJjY2FmtGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCp0BtZF9zdHKQqGdldGluZGV4kNkkZTRlZjUxNDUtYTYzYy00ZjkxLWFjMDQtM2I1YmYxNmMwODQyhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkZTRlZjUxNDUtYTYzYy00ZjkxLWFjMDQtM2I1YmYxNmMwODQytGRvd25zdHJlYW1fY2VsbHNfbWFwga9yYXdfdDJfc3Rhcl9ncmWS2SQxYTgzZDg5Ny03MDViLTQ0M2QtODlhNC1lYTVlM2U2YTNjMDfZJDRhNGE2YmQzLWI4MjAtNDc5Yy04OWUzLWYzY2U3OWEzMTZkYrJ1cHN0cmVhbV9jZWxsc19tYXCEqm9ial90MnN0YXKR2SRlZTdlODFlNy00ODRjLTQ0YTgtYTE5MS1mNzNlMjQ3MDdjZTmjc3lzkdkkYzZlMzNjYjgtZjQyYy00NjQzLTkyNTctMTI0ZDI4MDRkM2Rhp3NlcV9ncmWR2SQ5MTc5YWE0MC1iYjQwLTRhMzYtYWUxZS0wMGFlNDI5MzVhNWaoc2ltdWxhdGWQ2SQ3YTY2YWI0Ny05MThmLTQ1ODItODk1Zi0xYjQ2OTA1NjIwNTGEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQ3YTY2YWI0Ny05MThmLTQ1ODItODk1Zi0xYjQ2OTA1NjIwNTG0ZG93bnN0cmVhbV9jZWxsc19tYXCAsnVwc3RyZWFtX2NlbGxzX21hcIKjcmF3kdkkYzQ3YTUwYjgtYzkzMC00Yzk2LTliMzQtMjc3MjE4NjYzNGQ5q3Bsb3Rfc2lnbmFskNkkZDZiMTcyOWEtODc0ZC0xMWVlLTE1MWEtOWIwZmNjZTJjNGZkhLRwcmVjZWRlbmNlX2hldXJpc3RpYwenY2VsbF9pZNkkZDZiMTcyOWEtODc0ZC0xMWVlLTE1MWEtOWIwZmNjZTJjNGZktGRvd25zdHJlYW1fY2VsbHNfbWFwhadQbHV0b1VJkdkkOGU0NzRhZGQtODY1MS00MzFiLWI0ODEtN2ExMzkwMzdkYmQyrEtvbWFNUklQbG90c5CrUGx1dG9QbG90bHmQq0tvbWFNUklDb3JlktkkNDFkMTRkZWMtYjg1Mi00MzE2LWFlZmItYzNkMDhmYTQzMjE22SQxYzc5YjM3ZS1kNGUwLTQ5MGYtOTQ2Ni0yMGNlMjhmMDE3YWWkRkZUV5CydXBzdHJlYW1fY2VsbHNfbWFwgNkkOWE4OGE1NGItYmNjNy00MWFkLThlNjAtZjRkNDUwZGNjYjJkhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkOWE4OGE1NGItYmNjNy00MWFkLThlNjAtZjRkNDUwZGNjYjJktGRvd25zdHJlYW1fY2VsbHNfbWFwgqRmZnRjktkkNGE0YTZiZDMtYjgyMC00NzljLTg5ZTMtZjNjZTc5YTMxNmRi2SQyZTY1YWUzMS1mNTBhLTQ2MmItOTc0NC04MGJmNmNkYjM4OGWpcmVjb25fZ3JlktkkOTY0NDA0ZjYtN2Y0Ni00ZGY5LWFkOTgtOTIxOTQ4YzNiZTY52SQzNDgyNGRiNy0xM2M0LTQ1ZTItYmVmYS1mMDI3YjliNTg1YzCydXBzdHJlYW1fY2VsbHNfbWFwiaNhYnOQo2ZmdJCkcGxvdJChL5CpaWZmdHNoaWZ0kKRzaXplkKRwcm9kkKhmZnRzaGlmdJCncmF3X2dyZZHZJGFkYTYwMmQyLTRmNGItNGZiNC1hNzYzLThhNjM5ZTA1ZmYzONkkYzQ3YTUwYjgtYzkzMC00Yzk2LTliMzQtMjc3MjE4NjYzNGQ5hLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkYzQ3YTUwYjgtYzkzMC00Yzk2LTliMzQtMjc3MjE4NjYzNGQ5tGRvd25zdHJlYW1fY2VsbHNfbWFwgaNyYXeR2SQ3YTY2YWI0Ny05MThmLTQ1ODItODk1Zi0xYjQ2OTA1NjIwNTGydXBzdHJlYW1fY2VsbHNfbWFwhKNzZXGR2SQwOTc1NTQ3ZC02N2Q5LTRlNmItODhmZi1hOWRkMDZhN2Y5ZWajb2JqkdkkZDE2ZWZhNjItZGNlNy00ZWMzLTllM2MtYjVlMTY3NzM3N2Zjo3N5c5HZJGM2ZTMzY2I4LWY0MmMtNDY0My05MjU3LTEyNGQyODA0ZDNkYahzaW11bGF0ZZDZJDQxZDE0ZGVjLWI4NTItNDMxNi1hZWZiLWMzZDA4ZmE0MzIxNoS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDQxZDE0ZGVjLWI4NTItNDMxNi1hZWZiLWMzZDA4ZmE0MzIxNrRkb3duc3RyZWFtX2NlbGxzX21hcIKpdF9hZGNfZ3JlkdkkMWE4M2Q4OTctNzA1Yi00NDNkLTg5YTQtZWE1ZTNlNmEzYzA3qnNpZ25hbF9ncmWS2SQxOGM4MmZmMS0wYmRlLTRmYTAtODQ4Yy1kMGViNzNkMWFjN2PZJDFjNzliMzdlLWQ0ZTAtNDkwZi05NDY2LTIwY2UyOGYwMTdhZbJ1cHN0cmVhbV9jZWxsc19tYXCIqHQyX2RlY2F5kdkkMTIzMWI4MzItNDdiMS00Y2NiLTliNTYtYTY3ODM4NTk4Y2M3qmFkZHRyYWNlcyGQq3Bsb3Rfc2lnbmFskKdzZXFfZ3JlkdkkOTE3OWFhNDAtYmI0MC00YTM2LWFlMWUtMDBhZTQyOTM1YTVmoSqQ2SJLb21hTVJJQ29yZS5nZXRfYWRjX3NhbXBsaW5nX3RpbWVzkKtLb21hTVJJQ29yZZHZJGQ2YjE3MjlhLTg3NGQtMTFlZS0xNTFhLTliMGZjY2UyYzRmZKdyYXdfZ3JlkdkkYWRhNjAyZDItNGY0Yi00ZmI0LWE3NjMtOGE2MzllMDVmZjM42SRlZTdlODFlNy00ODRjLTQ0YTgtYTE5MS1mNzNlMjQ3MDdjZTmEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SRlZTdlODFlNy00ODRjLTQ0YTgtYTE5MS1mNzNlMjQ3MDdjZTm0ZG93bnN0cmVhbV9jZWxsc19tYXCDqm9ial90MnN0YXKT2SQyZWU3YmE0Ny0wMmU1LTRiMDItYTE2Mi1kZGJkNWVkNDdjN2LZJGU0ZWY1MTQ1LWE2M2MtNGY5MS1hYzA0LTNiNWJmMTZjMDg0MtkkOTc0Nzk0MzctOWNlMy00YjMzLTkxMzQtMGYyYWY4OWJjY2I1pE5pc2+Q2SBsaW5lYXJfb2ZmcmVzb25hbmNlX2Rpc3RyaWJ1dGlvbpCydXBzdHJlYW1fY2VsbHNfbWFwiaVyYW5nZZCjb2JqkdkkZDE2ZWZhNjItZGNlNy00ZWMzLTllM2MtYjVlMTY3NzM3N2ZjoS+QoSuQp1BoYW50b22Qos+AkKdGbG9hdDY0kKEqkKRjb3B5kNkkMzQ4MjRkYjctMTNjNC00NWUyLWJlZmEtZjAyN2I5YjU4NWMwhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkMzQ4MjRkYjctMTNjNC00NWUyLWJlZmEtZjAyN2I5YjU4NWMwtGRvd25zdHJlYW1fY2VsbHNfbWFwgatmaWdfcmVjb25fM5CydXBzdHJlYW1fY2VsbHNfbWFwhrByZWNvbl90Ml9zdGFyX3NlkdkkMmU2NWFlMzEtZjUwYS00NjJiLTk3NDQtODBiZjZjZGIzODhlsXJlY29uX3QyX3N0YXJfZ3JlkdkkNGE0YTZiZDMtYjgyMC00NzljLTg5ZTMtZjNjZTc5YTMxNmRirHJlY29uX2xheW91dJHZJDk2NDQwNGY2LTdmNDYtNGRmOS1hZDk4LTkyMTk0OGMzYmU2OalyZWxheW91dCGQqHJlbGF5b3V0kKlyZWNvbl9ncmWR2SQ5YTg4YTU0Yi1iY2M3LTQxYWQtOGU2MC1mNGQ0NTBkY2NiMmTZJGYxZjNiNzAwLTU5MTYtNDk2Zi1iOTM4LTQ2ZjdmMDhiNGViNoS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJGYxZjNiNzAwLTU5MTYtNDk2Zi1iOTM4LTQ2ZjdmMDhiNGViNrRkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwgqhwbG90X3NlcZCmc2VxX3NlkdkkMjdlNjU2ODAtMjJhMC00MDc5LWI2ZGYtZDYwYTMyMThlNTJl2SQ5MTc5YWE0MC1iYjQwLTRhMzYtYWUxZS0wMGFlNDI5MzVhNWaEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQ5MTc5YWE0MC1iYjQwLTRhMzYtYWUxZS0wMGFlNDI5MzVhNWa0ZG93bnN0cmVhbV9jZWxsc19tYXCGpGFkYzKQqFRfZ3hfcHJlkKdzZXFfZ3JlldkkOGI0YTFhZDktMmQ2YS00YzhmLWJiOGUtZjQzYzJkMDU4MTk12SQzYWJjYTQwNi0yZTZiLTRiMzctODgzNS02NWNmYWQ5ZDBjYWHZJGFkYTYwMmQyLTRmNGItNGZiNC1hNzYzLThhNjM5ZTA1ZmYzONkkNDFkMTRkZWMtYjg1Mi00MzE2LWFlZmItYzNkMDhmYTQzMjE22SRlNGVmNTE0NS1hNjNjLTRmOTEtYWMwNC0zYjViZjE2YzA4NDKiZ3iQpmd4X3ByZZHZJDI3ZTY1NjgwLTIyYTAtNDA3OS1iNmRmLWQ2MGEzMjE4ZTUyZadyZWFkb3V0kdkkMjdlNjU2ODAtMjJhMC00MDc5LWI2ZGYtZDYwYTMyMThlNTJlsnVwc3RyZWFtX2NlbGxzX21hcIqjQURDkKJBeJHZJDBmOTZhODNkLTk2ZWYtNDc2OC05MzMwLTg3YzQ2NmUzNWM5M6EtkKEvkKErkKEqkKhTZXF1ZW5jZZCkR3JhZJCiUkaQonJmkdkkYzZlMzNjYjgtZjQyYy00NjQzLTkyNTctMTI0ZDI4MDRkM2Rh2SRhZGE2MDJkMi00ZjRiLTRmYjQtYTc2My04YTYzOWUwNWZmMziEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SRhZGE2MDJkMi00ZjRiLTRmYjQtYTc2My04YTYzOWUwNWZmMzi0ZG93bnN0cmVhbV9jZWxsc19tYXCBp3Jhd19ncmWS2SQ0MWQxNGRlYy1iODUyLTQzMTYtYWVmYi1jM2QwOGZhNDMyMTbZJDlhODhhNTRiLWJjYzctNDFhZC04ZTYwLWY0ZDQ1MGRjY2IyZLJ1cHN0cmVhbV9jZWxsc19tYXCEo29iapHZJGQxNmVmYTYyLWRjZTctNGVjMy05ZTNjLWI1ZTE2NzczNzdmY6NzeXOR2SRjNmUzM2NiOC1mNDJjLTQ2NDMtOTI1Ny0xMjRkMjgwNGQzZGGnc2VxX2dyZZHZJDkxNzlhYTQwLWJiNDAtNGEzNi1hZTFlLTAwYWU0MjkzNWE1ZqhzaW11bGF0ZZDZJDk3NDc5NDM3LTljZTMtNGIzMy05MTM0LTBmMmFmODliY2NiNYS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDk3NDc5NDM3LTljZTMtNGIzMy05MTM0LTBmMmFmODliY2NiNbRkb3duc3RyZWFtX2NlbGxzX21hcIGucmF3X3QyX3N0YXJfc2WS2SQxYzc5YjM3ZS1kNGUwLTQ5MGYtOTQ2Ni0yMGNlMjhmMDE3YWXZJDJlNjVhZTMxLWY1MGEtNDYyYi05NzQ0LTgwYmY2Y2RiMzg4ZbJ1cHN0cmVhbV9jZWxsc19tYXCEqm9ial90MnN0YXKR2SRlZTdlODFlNy00ODRjLTQ0YTgtYTE5MS1mNzNlMjQ3MDdjZTmmc2VxX3NlkdkkMjdlNjU2ODAtMjJhMC00MDc5LWI2ZGYtZDYwYTMyMThlNTJlo3N5c5HZJGM2ZTMzY2I4LWY0MmMtNDY0My05MjU3LTEyNGQyODA0ZDNkYahzaW11bGF0ZZDZJDJlNjVhZTMxLWY1MGEtNDYyYi05NzQ0LTgwYmY2Y2RiMzg4ZYS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDJlNjVhZTMxLWY1MGEtNDYyYi05NzQ0LTgwYmY2Y2RiMzg4ZbRkb3duc3RyZWFtX2NlbGxzX21hcIGwcmVjb25fdDJfc3Rhcl9zZZHZJDM0ODI0ZGI3LTEzYzQtNDVlMi1iZWZhLWYwMjdiOWI1ODVjMLJ1cHN0cmVhbV9jZWxsc19tYXCEpGZmdGOR2SQ5YTg4YTU0Yi1iY2M3LTQxYWQtOGU2MC1mNGQ0NTBkY2NiMmSucmF3X3QyX3N0YXJfc2WR2SQ5NzQ3OTQzNy05Y2UzLTRiMzMtOTEzNC0wZjJhZjg5YmNjYjWkcGxvdJCjYWJzkNkkODUyOWYzNmQtMmQzOS00YjQ1LWE4MjEtMDFjODM0NjUzOWZkhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkODUyOWYzNmQtMmQzOS00YjQ1LWE4MjEtMDFjODM0NjUzOWZktGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCBr1RhYmxlT2ZDb250ZW50c5DZJDQ1OTUyNTEyLWFhZjEtNDNkOC1hOTVlLWMzMmJiMjYzM2Y0MoS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDQ1OTUyNTEyLWFhZjEtNDNkOC1hOTVlLWMzMmJiMjYzM2Y0MrRkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwgqdAbWRfc3RykKhnZXRpbmRleJDZJDk2NDQwNGY2LTdmNDYtNGRmOS1hZDk4LTkyMTk0OGMzYmU2OYS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDk2NDQwNGY2LTdmNDYtNGRmOS1hZDk4LTkyMTk0OGMzYmU2ObRkb3duc3RyZWFtX2NlbGxzX21hcIKrZmlnX3JlY29uXzKQrHJlY29uX2xheW91dJHZJDM0ODI0ZGI3LTEzYzQtNDVlMi1iZWZhLWYwMjdiOWI1ODVjMLJ1cHN0cmVhbV9jZWxsc19tYXCGsXJlY29uX3QyX3N0YXJfZ3JlkdkkNGE0YTZiZDMtYjgyMC00NzljLTg5ZTMtZjNjZTc5YTMxNmRipGF0dHKQqHJlbGF5b3V0kKlyZWxheW91dCGQpkxheW91dJCpcmVjb25fZ3JlkdkkOWE4OGE1NGItYmNjNy00MWFkLThlNjAtZjRkNDUwZGNjYjJk2SRkMTZlZmE2Mi1kY2U3LTRlYzMtOWUzYy1iNWUxNjc3Mzc3ZmOEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SRkMTZlZmE2Mi1kY2U3LTRlYzMtOWUzYy1iNWUxNjc3Mzc3ZmO0ZG93bnN0cmVhbV9jZWxsc19tYXCBo29iapTZJDM1ZmYzNDAyLWRjMzYtNGI5MS1iZWM5LWI0ZDIxZmFmM2U2ONkkYzQ3YTUwYjgtYzkzMC00Yzk2LTliMzQtMjc3MjE4NjYzNGQ52SRhZGE2MDJkMi00ZjRiLTRmYjQtYTc2My04YTYzOWUwNWZmMzjZJGVlN2U4MWU3LTQ4NGMtNDRhOC1hMTkxLWY3M2UyNDcwN2NlObJ1cHN0cmVhbV9jZWxsc19tYXCEpXJhbmdlkKdjb2xsZWN0kKdQaGFudG9tkKdub3RoaW5nkNkkYzAyZjM4OTgtMTBjYi00ZjFlLWI1ZWYtZWI0MmI4MDNiYWVkhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkYzAyZjM4OTgtMTBjYi00ZjFlLWI1ZWYtZWI0MmI4MDNiYWVktGRvd25zdHJlYW1fY2VsbHNfbWFwgapmaWdfa3NwYWNlkLJ1cHN0cmVhbV9jZWxsc19tYXCEqXJlbGF5b3V0IZCocmVsYXlvdXSQqmtzcGFjZV9ncmWR2SQzYWJjYTQwNi0yZTZiLTRiMzctODgzNS02NWNmYWQ5ZDBjYWGpa3NwYWNlX3NlkdkkNGUxNDM0ZTEtNjczZi00MjA2LWEyNzEtOWVkZWMxMGViZDZh2SQyZWU3YmE0Ny0wMmU1LTRiMDItYTE2Mi1kZGJkNWVkNDdjN2KEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQyZWU3YmE0Ny0wMmU1LTRiMDItYTE2Mi1kZGJkNWVkNDdjN2K0ZG93bnN0cmVhbV9jZWxsc19tYXCAsnVwc3RyZWFtX2NlbGxzX21hcIKqb2JqX3Qyc3RhcpHZJGVlN2U4MWU3LTQ4NGMtNDRhOC1hMTkxLWY3M2UyNDcwN2NlObBwbG90X3BoYW50b21fbWFwkNkkNzQ2NjZjMWEtMjY3My00OTM2LTk4MmItNjIyOWJmOTJhZjY2hLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkNzQ2NjZjMWEtMjY3My00OTM2LTk4MmItNjIyOWJmOTJhZjY2tGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCp0BtZF9zdHKQqGdldGluZGV4kNkkZWE1NDIyNzEtMDFjMi00OTYyLWE3MDgtODA0YjIzYTg2MWI5hLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkZWE1NDIyNzEtMDFjMi00OTYyLWE3MDgtODA0YjIzYTg2MWI5tGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCp0BtZF9zdHKQqGdldGluZGV4kNkkYzZlMzNjYjgtZjQyYy00NjQzLTkyNTctMTI0ZDI4MDRkM2RhhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkYzZlMzNjYjgtZjQyYy00NjQzLTkyNTctMTI0ZDI4MDRkM2RhtGRvd25zdHJlYW1fY2VsbHNfbWFwg6NzeXOU2SRjNDdhNTBiOC1jOTMwLTRjOTYtOWIzNC0yNzcyMTg2NjM0ZDnZJGFkYTYwMmQyLTRmNGItNGZiNC1hNzYzLThhNjM5ZTA1ZmYzONkkZTRlZjUxNDUtYTYzYy00ZjkxLWFjMDQtM2I1YmYxNmMwODQy2SQ5NzQ3OTQzNy05Y2UzLTRiMzMtOTEzNC0wZjJhZjg5YmNjYjWlZHVyUkaQonJmk9kkMDk3NTU0N2QtNjdkOS00ZTZiLTg4ZmYtYTlkZDA2YTdmOWVm2SQ5MTc5YWE0MC1iYjQwLTRhMzYtYWUxZS0wMGFlNDI5MzVhNWbZJDI3ZTY1NjgwLTIyYTAtNDA3OS1iNmRmLWQ2MGEzMjE4ZTUyZbJ1cHN0cmVhbV9jZWxsc19tYXCHos6zkKdTY2FubmVykKEvkLVQdWxzZURlc2lnbmVyLlJGX2hhcmSQos+AkKEqkK1QdWxzZURlc2lnbmVykNkkMjc2ODYyNjItMWExZS00NWZhLWI0ZWUtOTBhZTFkOWVlMzRlhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkMjc2ODYyNjItMWExZS00NWZhLWI0ZWUtOTBhZTFkOWVlMzRltGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCp0BtZF9zdHKQqGdldGluZGV4kNkkNmRmZTMzOGQtZGU4NS00YWRiLWIwMzAtMDk0NTVmYWU3OGEwhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkNmRmZTMzOGQtZGU4NS00YWRiLWIwMzAtMDk0NTVmYWU3OGEwtGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCp0BtZF9zdHKQqGdldGluZGV4kNkkOGU0NzRhZGQtODY1MS00MzFiLWI0ODEtN2ExMzkwMzdkYmQyhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkOGU0NzRhZGQtODY1MS00MzFiLWI0ODEtN2ExMzkwMzdkYmQytGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCFp0BtZF9zdHKQp1BsdXRvVUmR2SRkNmIxNzI5YS04NzRkLTExZWUtMTUxYS05YjBmY2NlMmM0ZmSwUGx1dG9VSS5SZXNvdXJjZZCiPT6QqGdldGluZGV4kNkkZmU4YmJjZDItZThmNS00MjI1LTgwYzMtNDdlNzMxNzZmYjNkhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkZmU4YmJjZDItZThmNS00MjI1LTgwYzMtNDdlNzMxNzZmYjNktGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCp0BtZF9zdHKQqGdldGluZGV4kNkkMWE4M2Q4OTctNzA1Yi00NDNkLTg5YTQtZWE1ZTNlNmEzYzA3hLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkMWE4M2Q4OTctNzA1Yi00NDNkLTg5YTQtZWE1ZTNlNmEzYzA3tGRvd25zdHJlYW1fY2VsbHNfbWFwgbJzaWduYWxfdDJfc3Rhcl9ncmWS2SQxOGM4MmZmMS0wYmRlLTRmYTAtODQ4Yy1kMGViNzNkMWFjN2PZJDFjNzliMzdlLWQ0ZTAtNDkwZi05NDY2LTIwY2UyOGYwMTdhZbJ1cHN0cmVhbV9jZWxsc19tYXCFqmFkZHRyYWNlcyGQqXRfYWRjX2dyZZHZJDQxZDE0ZGVjLWI4NTItNDMxNi1hZWZiLWMzZDA4ZmE0MzIxNq9yYXdfdDJfc3Rhcl9ncmWR2SRlNGVmNTE0NS1hNjNjLTRmOTEtYWMwNC0zYjViZjE2YzA4NDKrcGxvdF9zaWduYWyQqHQyX2RlY2F5kdkkMTIzMWI4MzItNDdiMS00Y2NiLTliNTYtYTY3ODM4NTk4Y2M32SQ0ZTE0MzRlMS02NzNmLTQyMDYtYTI3MS05ZWRlYzEwZWJkNmGEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQ0ZTE0MzRlMS02NzNmLTQyMDYtYTI3MS05ZWRlYzEwZWJkNmG0ZG93bnN0cmVhbV9jZWxsc19tYXCBqWtzcGFjZV9zZZHZJGMwMmYzODk4LTEwY2ItNGYxZS1iNWVmLWViNDJiODAzYmFlZLJ1cHN0cmVhbV9jZWxsc19tYXCCq3Bsb3Rfa3NwYWNlkKZzZXFfc2WR2SQyN2U2NTY4MC0yMmEwLTQwNzktYjZkZi1kNjBhMzIxOGU1MmXZJDMzNTdhMjgzLWEyMzQtNGQxNS04ZmRmLTdmYmVjNThiMzNhN4S0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDMzNTdhMjgzLWEyMzQtNGQxNS04ZmRmLTdmYmVjNThiMzNhN7Rkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwhKdAbWRfc3RykKhSZXNvdXJjZZCiPT6QqGdldGluZGV4kNkkM2FiY2E0MDYtMmU2Yi00YjM3LTg4MzUtNjVjZmFkOWQwY2FhhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkM2FiY2E0MDYtMmU2Yi00YjM3LTg4MzUtNjVjZmFkOWQwY2FhtGRvd25zdHJlYW1fY2VsbHNfbWFwgaprc3BhY2VfZ3JlkdkkYzAyZjM4OTgtMTBjYi00ZjFlLWI1ZWYtZWI0MmI4MDNiYWVksnVwc3RyZWFtX2NlbGxzX21hcIKrcGxvdF9rc3BhY2WQp3NlcV9ncmWR2SQ5MTc5YWE0MC1iYjQwLTRhMzYtYWUxZS0wMGFlNDI5MzVhNWbZJDA5NzU1NDdkLTY3ZDktNGU2Yi04OGZmLWE5ZGQwNmE3ZjllZoS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDA5NzU1NDdkLTY3ZDktNGU2Yi04OGZmLWE5ZGQwNmE3ZjllZrRkb3duc3RyZWFtX2NlbGxzX21hcIGjc2VxkdkkYzQ3YTUwYjgtYzkzMC00Yzk2LTliMzQtMjc3MjE4NjYzNGQ5snVwc3RyZWFtX2NlbGxzX21hcIWocGxvdF9zZXGQoSuQqFNlcXVlbmNlkKNhZGOR2SQwMjY2NjMyZC01Y2E0LTQxOTYtYTUyMy0zM2E2NmRkNzBlMGOicmaR2SRjNmUzM2NiOC1mNDJjLTQ2NDMtOTI1Ny0xMjRkMjgwNGQzZGHZJDEyMzFiODMyLTQ3YjEtNGNjYi05YjU2LWE2NzgzODU5OGNjN4S0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDEyMzFiODMyLTQ3YjEtNGNjYi05YjU2LWE2NzgzODU5OGNjN7Rkb3duc3RyZWFtX2NlbGxzX21hcIKhdJCodDJfZGVjYXmT2SQ0MWQxNGRlYy1iODUyLTQzMTYtYWVmYi1jM2QwOGZhNDMyMTbZJDFhODNkODk3LTcwNWItNDQzZC04OWE0LWVhNWUzZTZhM2MwN9kkMWM3OWIzN2UtZDRlMC00OTBmLTk0NjYtMjBjZTI4ZjAxN2FlsnVwc3RyZWFtX2NlbGxzX21hcIijZXhwkKEtkKdzY2F0dGVykKVyYW5nZZChL5CkcGxvdJChKpCmTGF5b3V0kNkkMDI2NjYzMmQtNWNhNC00MTk2LWE1MjMtMzNhNjZkZDcwZTBjhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkMDI2NjYzMmQtNWNhNC00MTk2LWE1MjMtMzNhNjZkZDcwZTBjtGRvd25zdHJlYW1fY2VsbHNfbWFwgaNhZGOR2SQwOTc1NTQ3ZC02N2Q5LTRlNmItODhmZi1hOWRkMDZhN2Y5ZWaydXBzdHJlYW1fY2VsbHNfbWFwgaNBREOQtGNlbGxfZXhlY3V0aW9uX29yZGVy3AAu2SRkNmIxNzI5YS04NzRkLTExZWUtMTUxYS05YjBmY2NlMmM0ZmTZJDVkZjk3ODc0LWYwOWMtNDE3My1hMmY2LTg5M2RiMzIyY2NhZtkkODUyOWYzNmQtMmQzOS00YjQ1LWE4MjEtMDFjODM0NjUzOWZk2SQ2ZGZlMzM4ZC1kZTg1LTRhZGItYjAzMC0wOTQ1NWZhZTc4YTDZJDhlNDc0YWRkLTg2NTEtNDMxYi1iNDgxLTdhMTM5MDM3ZGJkMtkkYzZlMzNjYjgtZjQyYy00NjQzLTkyNTctMTI0ZDI4MDRkM2Rh2SQwMjY2NjMyZC01Y2E0LTQxOTYtYTUyMy0zM2E2NmRkNzBlMGPZJDA5NzU1NDdkLTY3ZDktNGU2Yi04OGZmLWE5ZGQwNmE3ZjllZtkkZjExYTJmYTItZWZmOS00OTc5LWI3MzktM2RhMmIyNGE5YTQ12SRkMTZlZmE2Mi1kY2U3LTRlYzMtOWUzYy1iNWUxNjc3Mzc3ZmPZJDM1ZmYzNDAyLWRjMzYtNGI5MS1iZWM5LWI0ZDIxZmFmM2U2ONkkZWE1NDIyNzEtMDFjMi00OTYyLWE3MDgtODA0YjIzYTg2MWI52SRjNDdhNTBiOC1jOTMwLTRjOTYtOWIzNC0yNzcyMTg2NjM0ZDnZJDdhNjZhYjQ3LTkxOGYtNDU4Mi04OTVmLTFiNDY5MDU2MjA1MdkkMTIzMWI4MzItNDdiMS00Y2NiLTliNTYtYTY3ODM4NTk4Y2M32SRlNGM4MGMyNC0yMGZkLTQyZTUtOWRjZC1hNjU5NTg1NjljMDHZJDc0NjY2YzFhLTI2NzMtNDkzNi05ODJiLTYyMjliZjkyYWY2NtkkMGY5NmE4M2QtOTZlZi00NzY4LTkzMzAtODdjNDY2ZTM1Yzkz2SQ5MTc5YWE0MC1iYjQwLTRhMzYtYWUxZS0wMGFlNDI5MzVhNWbZJDhiNGExYWQ5LTJkNmEtNGM4Zi1iYjhlLWY0M2MyZDA1ODE5NdkkM2FiY2E0MDYtMmU2Yi00YjM3LTg4MzUtNjVjZmFkOWQwY2Fh2SRhZGE2MDJkMi00ZjRiLTRmYjQtYTc2My04YTYzOWUwNWZmMzjZJDlhODhhNTRiLWJjYzctNDFhZC04ZTYwLWY0ZDQ1MGRjY2IyZNkkNDFkMTRkZWMtYjg1Mi00MzE2LWFlZmItYzNkMDhmYTQzMjE22SQ5NzEwNGM0Ni1lODFmLTQ0NGEtOTU3Zi0wYmJiMWIwMmYxYjjZJGVlN2U4MWU3LTQ4NGMtNDRhOC1hMTkxLWY3M2UyNDcwN2NlOdkkMmVlN2JhNDctMDJlNS00YjAyLWExNjItZGRiZDVlZDQ3Yzdi2SQyNzY4NjI2Mi0xYTFlLTQ1ZmEtYjRlZS05MGFlMWQ5ZWUzNGXZJGU0ZWY1MTQ1LWE2M2MtNGY5MS1hYzA0LTNiNWJmMTZjMDg0MtkkMWE4M2Q4OTctNzA1Yi00NDNkLTg5YTQtZWE1ZTNlNmEzYzA32SQxOGM4MmZmMS0wYmRlLTRmYTAtODQ4Yy1kMGViNzNkMWFjN2PZJDRhNGE2YmQzLWI4MjAtNDc5Yy04OWUzLWYzY2U3OWEzMTZkYtkkOTY0NDA0ZjYtN2Y0Ni00ZGY5LWFkOTgtOTIxOTQ4YzNiZTY52SQzMzU3YTI4My1hMjM0LTRkMTUtOGZkZi03ZmJlYzU4YjMzYTfZJDI3ZTY1NjgwLTIyYTAtNDA3OS1iNmRmLWQ2MGEzMjE4ZTUyZdkkZjFmM2I3MDAtNTkxNi00OTZmLWI5MzgtNDZmN2YwOGI0ZWI22SQ0ZTE0MzRlMS02NzNmLTQyMDYtYTI3MS05ZWRlYzEwZWJkNmHZJGMwMmYzODk4LTEwY2ItNGYxZS1iNWVmLWViNDJiODAzYmFlZNkkNDU5NTI1MTItYWFmMS00M2Q4LWE5NWUtYzMyYmIyNjMzZjQy2SQ5NzQ3OTQzNy05Y2UzLTRiMzMtOTEzNC0wZjJhZjg5YmNjYjXZJDFjNzliMzdlLWQ0ZTAtNDkwZi05NDY2LTIwY2UyOGYwMTdhZdkkMmU2NWFlMzEtZjUwYS00NjJiLTk3NDQtODBiZjZjZGIzODhl2SQzNDgyNGRiNy0xM2M0LTQ1ZTItYmVmYS1mMDI3YjliNTg1YzDZJGZlOGJiY2QyLWU4ZjUtNDIyNS04MGMzLTQ3ZTczMTc2ZmIzZNkkYWI4ZGMxY2UtZDFlZi00M2EwLTk0OTUtZGFjOTMxYjUyYWVj2SQ1OGJlNDE1MC0yYjdhLTRmOWUtYTdkNy00MGEwODZmZDNhNTO0bGFzdF9ob3RfcmVsb2FkX3RpbWXLAAAAAAAAAACpc2hvcnRwYXRovTAxLWdyYWRpZW50LWVjaG8tc3Bpbi1lY2hvLmpsrnByb2Nlc3Nfc3RhdHVzpXJlYWR5pHBhdGjZXS9ob21lL3J1bm5lci93b3JrL0tvbWFNUkkuamwvS29tYU1SSS5qbC9kb2NzL3NyYy90dXRvcmlhbC1wbHV0by8wMS1ncmFkaWVudC1lY2hvLXNwaW4tZWNoby5qbK1wbHV0b192ZXJzaW9uqHYwLjE5LjQ2rmxhc3Rfc2F2ZV90aW1ly0HZv8gtS1TFqmNlbGxfb3JkZXLcAC7ZJDVkZjk3ODc0LWYwOWMtNDE3My1hMmY2LTg5M2RiMzIyY2NhZtkkODUyOWYzNmQtMmQzOS00YjQ1LWE4MjEtMDFjODM0NjUzOWZk2SQ2ZGZlMzM4ZC1kZTg1LTRhZGItYjAzMC0wOTQ1NWZhZTc4YTDZJGQ2YjE3MjlhLTg3NGQtMTFlZS0xNTFhLTliMGZjY2UyYzRmZNkkOGU0NzRhZGQtODY1MS00MzFiLWI0ODEtN2ExMzkwMzdkYmQy2SRjNmUzM2NiOC1mNDJjLTQ2NDMtOTI1Ny0xMjRkMjgwNGQzZGHZJDAyNjY2MzJkLTVjYTQtNDE5Ni1hNTIzLTMzYTY2ZGQ3MGUwY9kkMDk3NTU0N2QtNjdkOS00ZTZiLTg4ZmYtYTlkZDA2YTdmOWVm2SRmMTFhMmZhMi1lZmY5LTQ5NzktYjczOS0zZGEyYjI0YTlhNDXZJGQxNmVmYTYyLWRjZTctNGVjMy05ZTNjLWI1ZTE2NzczNzdmY9kkMzVmZjM0MDItZGMzNi00YjkxLWJlYzktYjRkMjFmYWYzZTY42SRlYTU0MjI3MS0wMWMyLTQ5NjItYTcwOC04MDRiMjNhODYxYjnZJGM0N2E1MGI4LWM5MzAtNGM5Ni05YjM0LTI3NzIxODY2MzRkOdkkN2E2NmFiNDctOTE4Zi00NTgyLTg5NWYtMWI0NjkwNTYyMDUx2SQxMjMxYjgzMi00N2IxLTRjY2ItOWI1Ni1hNjc4Mzg1OThjYzfZJGU0YzgwYzI0LTIwZmQtNDJlNS05ZGNkLWE2NTk1ODU2OWMwMdkkOTE3OWFhNDAtYmI0MC00YTM2LWFlMWUtMDBhZTQyOTM1YTVm2SQ4YjRhMWFkOS0yZDZhLTRjOGYtYmI4ZS1mNDNjMmQwNTgxOTXZJDNhYmNhNDA2LTJlNmItNGIzNy04ODM1LTY1Y2ZhZDlkMGNhYdkkNzQ2NjZjMWEtMjY3My00OTM2LTk4MmItNjIyOWJmOTJhZjY22SRhZGE2MDJkMi00ZjRiLTRmYjQtYTc2My04YTYzOWUwNWZmMzjZJDQxZDE0ZGVjLWI4NTItNDMxNi1hZWZiLWMzZDA4ZmE0MzIxNtkkOWE4OGE1NGItYmNjNy00MWFkLThlNjAtZjRkNDUwZGNjYjJk2SQwZjk2YTgzZC05NmVmLTQ3NjgtOTMzMC04N2M0NjZlMzVjOTPZJDk3MTA0YzQ2LWU4MWYtNDQ0YS05NTdmLTBiYmIxYjAyZjFiONkkZWU3ZTgxZTctNDg0Yy00NGE4LWExOTEtZjczZTI0NzA3Y2U52SQyZWU3YmE0Ny0wMmU1LTRiMDItYTE2Mi1kZGJkNWVkNDdjN2LZJDI3Njg2MjYyLTFhMWUtNDVmYS1iNGVlLTkwYWUxZDllZTM0ZdkkZTRlZjUxNDUtYTYzYy00ZjkxLWFjMDQtM2I1YmYxNmMwODQy2SQxYTgzZDg5Ny03MDViLTQ0M2QtODlhNC1lYTVlM2U2YTNjMDfZJDE4YzgyZmYxLTBiZGUtNGZhMC04NDhjLWQwZWI3M2QxYWM3Y9kkNGE0YTZiZDMtYjgyMC00NzljLTg5ZTMtZjNjZTc5YTMxNmRi2SQ5NjQ0MDRmNi03ZjQ2LTRkZjktYWQ5OC05MjE5NDhjM2JlNjnZJDMzNTdhMjgzLWEyMzQtNGQxNS04ZmRmLTdmYmVjNThiMzNhN9kkMjdlNjU2ODAtMjJhMC00MDc5LWI2ZGYtZDYwYTMyMThlNTJl2SRmMWYzYjcwMC01OTE2LTQ5NmYtYjkzOC00NmY3ZjA4YjRlYjbZJDRlMTQzNGUxLTY3M2YtNDIwNi1hMjcxLTllZGVjMTBlYmQ2YdkkYzAyZjM4OTgtMTBjYi00ZjFlLWI1ZWYtZWI0MmI4MDNiYWVk2SQ0NTk1MjUxMi1hYWYxLTQzZDgtYTk1ZS1jMzJiYjI2MzNmNDLZJDk3NDc5NDM3LTljZTMtNGIzMy05MTM0LTBmMmFmODliY2NiNdkkMWM3OWIzN2UtZDRlMC00OTBmLTk0NjYtMjBjZTI4ZjAxN2Fl2SQyZTY1YWUzMS1mNTBhLTQ2MmItOTc0NC04MGJmNmNkYjM4OGXZJDM0ODI0ZGI3LTEzYzQtNDVlMi1iZWZhLWYwMjdiOWI1ODVjMNkkZmU4YmJjZDItZThmNS00MjI1LTgwYzMtNDdlNzMxNzZmYjNk2SRhYjhkYzFjZS1kMWVmLTQzYTAtOTQ5NS1kYWM5MzFiNTJhZWPZJDU4YmU0MTUwLTJiN2EtNGY5ZS1hN2Q3LTQwYTA4NmZkM2E1M7FwdWJsaXNoZWRfb2JqZWN0c94AE9k1N2JjYzA1YjAtODFkYS0xMWVmLTIwNDAtMzU4NWM5YjQ5NTRmL2U4MjQxYjJlNTU1NTYyOTSEpmxheW91dIiqc2hvd2xlZ2VuZMKmeGF4aXMxiatyYW5nZXNsaWRlcoGndmlzaWJsZcKpZ3JpZGNvbG9ypXdoaXRlrXJhbmdlc2VsZWN0b3KBp2J1dHRvbnOShKRzdGVwykEgAACoc3RlcG1vZGWoYmFja3dhcmSlbGFiZWyiMW2lY291bnTKP4AAAIGkc3RlcKNhbGyldGl0bGWBpHRleHSgpmRvbWFpbtcXAAAAAGZm5j6lcmFuZ2WQrXplcm9saW5lY29sb3Kld2hpdGWqdGlja3N1ZmZpeKMgbXOmYW5jaG9yonkxpnlheGlzMYapZ3JpZGNvbG9ypXdoaXRlpXJhbmdl1xcAAKDAAACEQaZkb21haW7XFwAAAAAAAIA/rXplcm9saW5lY29sb3Kld2hpdGWmYW5jaG9yongxqmZpeGVkcmFuZ2XCqHRlbXBsYXRlgqZsYXlvdXTeABOpY29sb3JheGlzgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApXhheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Zalob3Zlcm1vZGWnY2xvc2VzdK1wYXBlcl9iZ2NvbG9ypXdoaXRlo2dlb4apc2hvd2xha2Vzw6hzaG93bGFuZMOpbGFuZGNvbG9ypyNFNUVDRjanYmdjb2xvcqV3aGl0ZaxzdWJ1bml0Y29sb3Kld2hpdGWpbGFrZWNvbG9ypXdoaXRlqmNvbG9yc2NhbGWDqnNlcXVlbnRpYWyaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGpZGl2ZXJnaW5nm5LKAAAAAKcjOGUwMTUykso9zMzNpyNjNTFiN2SSyj5MzM2nI2RlNzdhZZLKPpmZmqcjZjFiNmRhkso+zMzNpyNmZGUwZWaSyj8AAACnI2Y3ZjdmN5LKPxmZmqcjZTZmNWQwkso/MzMzpyNiOGUxODaSyj9MzM2nIzdmYmM0MZLKP2ZmZqcjNGQ5MjIxkso/gAAApyMyNzY0MTmvc2VxdWVudGlhbG1pbnVzmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxpXlheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Za1zaGFwZWRlZmF1bHRzgaRsaW5lgaVjb2xvcqcjMmEzZjVmqmhvdmVybGFiZWyBpWFsaWdupGxlZnSmbWFwYm94gaVzdHlsZaVsaWdodKVwb2xhcoOrYW5ndWxhcmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqpyYWRpYWxheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0Za9hdXRvdHlwZW51bWJlcnOmc3RyaWN0pGZvbnSBpWNvbG9ypyMyYTNmNWandGVybmFyeYSlYWF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqVjYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWlYmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlsmFubm90YXRpb25kZWZhdWx0c4OpYXJyb3doZWFkygAAAACqYXJyb3d3aWR0aMo/gAAAqmFycm93Y29sb3KnIzJhM2Y1ZqxwbG90X2JnY29sb3KnI0U1RUNGNqV0aXRsZYGheMo9TMzNpXNjZW5lg6V4YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWlemF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXlheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0Zahjb2xvcndheZqnIzYzNmVmYacjRUY1NTNCpyMwMGNjOTanI2FiNjNmYacjRkZBMTVBpyMxOWQzZjOnI0ZGNjY5MqcjQjZFODgwpyNGRjk3RkanI0ZFQ0I1MqRkYXRh3gAZrnNjYXR0ZXJwb2xhcmdskYKkdHlwZa5zY2F0dGVycG9sYXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmY2FycGV0kYOlYmF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaR0eXBlpmNhcnBldKVhYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlrHNjYXR0ZXJwb2xhcpGCpHR5cGWsc2NhdHRlcnBvbGFypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKlwYXJjb29yZHORgqRsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpcGFyY29vcmRzp3NjYXR0ZXKRgqR0eXBlp3NjYXR0ZXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAsmhpc3RvZ3JhbTJkY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZbJoaXN0b2dyYW0yZGNvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMadjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2NvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVyY2FycGV0kYKkdHlwZa1zY2F0dGVyY2FycGV0pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZtZXNoM2SRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWmbWVzaDNkp3N1cmZhY2WRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnc3VyZmFjZapjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJtYXBib3iRgqR0eXBlrXNjYXR0ZXJtYXBib3imbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqnNjYXR0ZXJnZW+RgqR0eXBlqnNjYXR0ZXJnZW+mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqWhpc3RvZ3JhbZGCpHR5cGWpaGlzdG9ncmFtpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKNwaWWRgqR0eXBlo3BpZaphdXRvbWFyZ2luw6pjaG9yb3BsZXRokYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqmNob3JvcGxldGipaGVhdG1hcGdskYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqWhlYXRtYXBnbKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxo2JhcpGEpHR5cGWjYmFyp2Vycm9yX3mBpWNvbG9ypyMyYTNmNWanZXJyb3JfeIGlY29sb3KnIzJhM2Y1ZqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKdoZWF0bWFwkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2hlYXRtYXCqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1jb250b3VyY2FycGV0kYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlrWNvbnRvdXJjYXJwZXSldGFibGWRg6R0eXBlpXRhYmxlpmhlYWRlcoKkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0M4RDRFM6VjZWxsc4KkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0VCRjBGOKlzY2F0dGVyM2SRg6RsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpc2NhdHRlcjNkpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKhiYXJwb2xhcpGCpHR5cGWoYmFycG9sYXKmbWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACpc2NhdHRlcmdskYKkdHlwZalzY2F0dGVyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAq2hpc3RvZ3JhbTJkkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlq2hpc3RvZ3JhbTJkqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGuc2NhdHRlcnRlcm5hcnmRgqR0eXBlrnNjYXR0ZXJ0ZXJuYXJ5pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZ4YXhpczKJq3Jhbmdlc2xpZGVygad2aXNpYmxlwqlncmlkY29sb3Kld2hpdGWtcmFuZ2VzZWxlY3RvcoGnYnV0dG9uc5KEpHN0ZXDKQSAAAKhzdGVwbW9kZahiYWNrd2FyZKVsYWJlbKIxbaVjb3VudMo/gAAAgaRzdGVwo2FsbKV0aXRsZYGkdGV4dKCmZG9tYWlu1xfNzAw/AACAP6VyYW5nZZCtemVyb2xpbmVjb2xvcqV3aGl0Zap0aWNrc3VmZml4oyBtc6ZhbmNob3KieTKmbWFyZ2luhKFsykJIAAChYspCSAAAoXLKQkgAAKF0ykJwAACmeWF4aXMyhqlncmlkY29sb3Kld2hpdGWlcmFuZ2XXFwAAoMAAAIRBpmRvbWFpbtcXAAAAAAAAgD+temVyb2xpbmVjb2xvcqV3aGl0ZaZhbmNob3KieDKqZml4ZWRyYW5nZcKrYW5ub3RhdGlvbnOSiad5YW5jaG9ypmJvdHRvbad4YW5jaG9ypmNlbnRlcqF5yj+AAACkZm9udIGkc2l6ZcpBgAAAqXNob3dhcnJvd8KkeXJlZqVwYXBlcqR0ZXh0pkdSRS1UMqR4cmVmpXBhcGVyoXjKPmZmZomneWFuY2hvcqZib3R0b22neGFuY2hvcqZjZW50ZXKheco/gAAApGZvbnSBpHNpemXKQYAAAKlzaG93YXJyb3fCpHlyZWalcGFwZXKkdGV4dKdHUkUtVDIqpHhyZWalcGFwZXKheMo/RmZmpmNvbmZpZ4Woc2hvd0xpbmvCqGVkaXRhYmxlwqpyZXNwb25zaXZlw6pz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JInkQeEm5kGdxOdBWmLpQRcA60HUnexBkDvuQU3Z70EKd/FBxxTzQYSy9EHZNTdiY2MwNWIwLTgxZGEtMTFlZi0yMDQwLTM1ODVjOWI0OTU0Zi9hY2FkN2JiYjIzNTI5ZjMwhKZsYXlvdXSCqHRlbXBsYXRlgqZsYXlvdXTeABOpY29sb3JheGlzgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApXhheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Zalob3Zlcm1vZGWnY2xvc2VzdK1wYXBlcl9iZ2NvbG9ypXdoaXRlo2dlb4apc2hvd2xha2Vzw6hzaG93bGFuZMOpbGFuZGNvbG9ypyNFNUVDRjanYmdjb2xvcqV3aGl0ZaxzdWJ1bml0Y29sb3Kld2hpdGWpbGFrZWNvbG9ypXdoaXRlqmNvbG9yc2NhbGWDqnNlcXVlbnRpYWyaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGpZGl2ZXJnaW5nm5LKAAAAAKcjOGUwMTUykso9zMzNpyNjNTFiN2SSyj5MzM2nI2RlNzdhZZLKPpmZmqcjZjFiNmRhkso+zMzNpyNmZGUwZWaSyj8AAACnI2Y3ZjdmN5LKPxmZmqcjZTZmNWQwkso/MzMzpyNiOGUxODaSyj9MzM2nIzdmYmM0MZLKP2ZmZqcjNGQ5MjIxkso/gAAApyMyNzY0MTmvc2VxdWVudGlhbG1pbnVzmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxpXlheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Za1zaGFwZWRlZmF1bHRzgaRsaW5lgaVjb2xvcqcjMmEzZjVmqmhvdmVybGFiZWyBpWFsaWdupGxlZnSmbWFwYm94gaVzdHlsZaVsaWdodKVwb2xhcoOrYW5ndWxhcmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqpyYWRpYWxheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0Za9hdXRvdHlwZW51bWJlcnOmc3RyaWN0pGZvbnSBpWNvbG9ypyMyYTNmNWandGVybmFyeYSlYWF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqVjYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWlYmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlsmFubm90YXRpb25kZWZhdWx0c4OpYXJyb3doZWFkygAAAACqYXJyb3d3aWR0aMo/gAAAqmFycm93Y29sb3KnIzJhM2Y1ZqxwbG90X2JnY29sb3KnI0U1RUNGNqV0aXRsZYGheMo9TMzNpXNjZW5lg6V4YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWlemF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXlheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0Zahjb2xvcndheZqnIzYzNmVmYacjRUY1NTNCpyMwMGNjOTanI2FiNjNmYacjRkZBMTVBpyMxOWQzZjOnI0ZGNjY5MqcjQjZFODgwpyNGRjk3RkanI0ZFQ0I1MqRkYXRh3gAZrnNjYXR0ZXJwb2xhcmdskYKkdHlwZa5zY2F0dGVycG9sYXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmY2FycGV0kYOlYmF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaR0eXBlpmNhcnBldKVhYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlrHNjYXR0ZXJwb2xhcpGCpHR5cGWsc2NhdHRlcnBvbGFypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKlwYXJjb29yZHORgqRsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpcGFyY29vcmRzp3NjYXR0ZXKRgqR0eXBlp3NjYXR0ZXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAsmhpc3RvZ3JhbTJkY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZbJoaXN0b2dyYW0yZGNvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMadjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2NvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVyY2FycGV0kYKkdHlwZa1zY2F0dGVyY2FycGV0pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZtZXNoM2SRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWmbWVzaDNkp3N1cmZhY2WRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnc3VyZmFjZapjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJtYXBib3iRgqR0eXBlrXNjYXR0ZXJtYXBib3imbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqnNjYXR0ZXJnZW+RgqR0eXBlqnNjYXR0ZXJnZW+mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqWhpc3RvZ3JhbZGCpHR5cGWpaGlzdG9ncmFtpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKNwaWWRgqR0eXBlo3BpZaphdXRvbWFyZ2luw6pjaG9yb3BsZXRokYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqmNob3JvcGxldGipaGVhdG1hcGdskYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqWhlYXRtYXBnbKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxo2JhcpGEpHR5cGWjYmFyp2Vycm9yX3mBpWNvbG9ypyMyYTNmNWanZXJyb3JfeIGlY29sb3KnIzJhM2Y1ZqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKdoZWF0bWFwkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2hlYXRtYXCqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1jb250b3VyY2FycGV0kYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlrWNvbnRvdXJjYXJwZXSldGFibGWRg6R0eXBlpXRhYmxlpmhlYWRlcoKkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0M4RDRFM6VjZWxsc4KkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0VCRjBGOKlzY2F0dGVyM2SRg6RsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpc2NhdHRlcjNkpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKhiYXJwb2xhcpGCpHR5cGWoYmFycG9sYXKmbWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRo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c6ZhbmNob3KieTKodGVtcGxhdGWCpmxheW91dN4AE6ljb2xvcmF4aXOBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACleGF4aXOHqWdyaWRjb2xvcqV3aGl0Za16ZXJvbGluZXdpZHRoykAAAACldGl0bGWBqHN0YW5kb2ZmykFwAACldGlja3OgrXplcm9saW5lY29sb3Kld2hpdGWqYXV0b21hcmdpbsOpbGluZWNvbG9ypXdoaXRlqWhvdmVybW9kZadjbG9zZXN0rXBhcGVyX2JnY29sb3Kld2hpdGWjZ2VvhqlzaG93bGFrZXPDqHNob3dsYW5kw6lsYW5kY29sb3KnI0U1RUNGNqdiZ2NvbG9ypXdoaXRlrHN1YnVuaXRjb2xvcqV3aGl0ZalsYWtlY29sb3Kld2hpdGWqY29sb3JzY2FsZYOqc2VxdWVudGlhbJqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMalkaXZlcmdpbmebksoAAAAApyM4ZTAxNTKSyj3MzM2nI2M1MWI3ZJLKPkzMzacjZGU3N2Flkso+mZmapyNmMWI2ZGGSyj7MzM2nI2ZkZTBlZpLKPwAAAKcjZjdmN2Y3kso/GZmapyNlNmY1ZDCSyj8zMzOnI2I4ZTE4NpLKP0zMzacjN2ZiYzQxkso/ZmZmpyM0ZDkyMjGSyj+AAACnIzI3NjQxOa9zZXF1ZW50aWFsbWludXOaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGleWF4aXOHqWdyaWRjb2xvcqV3aGl0Za16ZXJvbGluZXdpZHRoykAAAACldGl0bGWBqHN0YW5kb2ZmykFwAACldGlja3OgrXplcm9saW5lY29sb3Kld2hpdGWqYXV0b21hcmdpbsOpbGluZWNvbG9ypXdoaXRlrXNoYXBlZGVmYXVsdHOBpGxpbmWBpWNvbG9ypyMyYTNmNWaqaG92ZXJsYWJlbIGlYWxpZ26kbGVmdKZtYXBib3iBpXN0eWxlpWxpZ2h0pXBvbGFyg6thbmd1bGFyYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWnYmdjb2xvcqcjRTVFQ0Y2qnJhZGlhbGF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlr2F1dG90eXBlbnVtYmVyc6ZzdHJpY3SkZm9udIGlY29sb3KnIzJhM2Y1Zqd0ZXJuYXJ5hKVhYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWnYmdjb2xvcqcjRTVFQ0Y2pWNheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZaViYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWyYW5ub3RhdGlvbmRlZmF1bHRzg6lhcnJvd2hlYWTKAAAAAKphcnJvd3dpZHRoyj+AAACqYXJyb3djb2xvcqcjMmEzZjVmrHBsb3RfYmdjb2xvcqcjRTVFQ0Y2pXRpdGxlgaF4yj1MzM2lc2NlbmWDpXhheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0ZaV6YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWleWF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlqGNvbG9yd2F5mqcjNjM2ZWZhpyNFRjU1M0KnIzAwY2M5NqcjYWI2M2ZhpyNGRkExNUGnIzE5ZDNmM6cjRkY2NjkypyNCNkU4ODCnI0ZGOTdGRqcjRkVDQjUypGRhdGHeABmuc2NhdHRlcnBvbGFyZ2yRgqR0eXBlrnNjYXR0ZXJwb2xhcmdspm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZjYXJwZXSRg6ViYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlpHR5cGWmY2FycGV0pWFheGlzhalncmlkY29sb3Kld2hpdGWsZW5kbGluZWNvbG9ypyMyYTNmNWaubWlub3JncmlkY29sb3Kld2hpdGWuc3RhcnRsaW5lY29sb3KnIzJhM2Y1ZqlsaW5lY29sb3Kld2hpdGWsc2NhdHRlcnBvbGFykYKkdHlwZaxzY2F0dGVycG9sYXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqXBhcmNvb3Jkc5GCpGxpbmWBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZalwYXJjb29yZHOnc2NhdHRlcpGCpHR5cGWnc2NhdHRlcqZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACyaGlzdG9ncmFtMmRjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlsmhpc3RvZ3JhbTJkY29udG91cqpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxp2NvbnRvdXKRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnY29udG91cqpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJjYXJwZXSRgqR0eXBlrXNjYXR0ZXJjYXJwZXSmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApm1lc2gzZJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZaZtZXNoM2Snc3VyZmFjZZGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadzdXJmYWNlqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtc2NhdHRlcm1hcGJveJGCpHR5cGWtc2NhdHRlcm1hcGJveKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACqc2NhdHRlcmdlb5GCpHR5cGWqc2NhdHRlcmdlb6ZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACpaGlzdG9ncmFtkYKkdHlwZaloaXN0b2dyYW2mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAo3BpZZGCpHR5cGWjcGllqmF1dG9tYXJnaW7DqmNob3JvcGxldGiRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWqY2hvcm9wbGV0aKloZWF0bWFwZ2yRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpaGVhdG1hcGdsqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGjYmFykYSkdHlwZaNiYXKnZXJyb3JfeYGlY29sb3KnIzJhM2Y1ZqdlcnJvcl94gaVjb2xvcqcjMmEzZjVmpm1hcmtlcoGkbGluZYKlY29sb3KnI0U1RUNGNqV3aWR0aMo/AAAAp2hlYXRtYXCRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnaGVhdG1hcKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrWNvbnRvdXJjYXJwZXSRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWtY29udG91cmNhcnBldKV0YWJsZZGDpHR5cGWldGFibGWmaGVhZGVygqRsaW5lgaVjb2xvcqV3aGl0ZaRmaWxsgaVjb2xvcqcjQzhENEUzpWNlbGxzgqRsaW5lgaVjb2xvcqV3aGl0ZaRmaWxsgaVjb2xvcqcjRUJGMEY4qXNjYXR0ZXIzZJGDpGxpbmWBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZalzY2F0dGVyM2SmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqGJhcnBvbGFykYKkdHlwZahiYXJwb2xhcqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKlzY2F0dGVyZ2yRgqR0eXBlqXNjYXR0ZXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACraGlzdG9ncmFtMmSRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWraGlzdG9ncmFtMmSqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa5zY2F0dGVydGVybmFyeZGCpHR5cGWuc2NhdHRlcnRlcm5hcnmmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApnlheGlzM4apZ3JpZGNvbG9ypXdoaXRlpXJhbmdl1xcAAKDAAACEQaZkb21haW7XFwAAAAAAAIA/rXplcm9saW5lY29sb3Kld2hpdGWmYW5jaG9yongzqmZpeGVkcmFuZ2XCpnlheGlzMYapZ3JpZGNvbG9ypXdoaXRlpXJhbmdl1xcAAKDAAACEQaZkb21haW7XFwAAAAAAAIA/rXplcm9saW5lY29sb3Kld2hpdGWmYW5jaG9yongxqmZpeGVkcmFuZ2XCpnlheGlzMoapZ3JpZGNvbG9ypXdoaXRlpXJhbmdl1xcAAKDAAACEQaZkb21haW7XFwAAAAAAAIA/rXplcm9saW5lY29sb3Kld2hpdGWmYW5jaG9yongyqmZpeGVkcmFuZ2XCpnhheGlzM4mrcmFuZ2VzbGlkZXKBp3Zpc2libGXCqWdyaWRjb2xvcqV3aGl0Za1yYW5nZXNlbGVjdG9ygadidXR0b25zkoSkc3RlcMpBIAAAqHN0ZXBtb2RlqGJhY2t3YXJkpWxhYmVsojFtpWNvdW50yj+AAACBpHN0ZXCjYWxspXRpdGxlgaR0ZXh0oKZkb21haW7XF2ELNj8AAIA/pXJhbmdlkK16ZXJvbGluZWNvbG9ypXdoaXRlqnRpY2tzdWZmaXijIG1zpmFuY2hvcqJ5M6thbm5vdGF0aW9uc5OJp3lhbmNob3KmYm90dG9tp3hhbmNob3KmY2VudGVyoXnKP4AAAKRmb250gaRzaXplykGAAACpc2hvd2Fycm93wqR5cmVmpXBhcGVypHRleHSmR1JFLVQypHhyZWalcGFwZXKheMo+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YjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxqWRpdmVyZ2luZ5uSygAAAACnIzhlMDE1MpLKPczMzacjYzUxYjdkkso+TMzNpyNkZTc3YWWSyj6ZmZqnI2YxYjZkYZLKPszMzacjZmRlMGVmkso/AAAApyNmN2Y3ZjeSyj8ZmZqnI2U2ZjVkMJLKPzMzM6cjYjhlMTg2kso/TMzNpyM3ZmJjNDGSyj9mZmanIzRkOTIyMZLKP4AAAKcjMjc2NDE5r3NlcXVlbnRpYWxtaW51c5qSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMaV5YXhpc4epZ3JpZGNvbG9ypXdoaXRlrXplcm9saW5ld2lkdGjKQAAAAKV0aXRsZYGoc3RhbmRvZmbKQXAAAKV0aWNrc6CtemVyb2xpbmVjb2xvcqV3aGl0ZaphdXRvbWFyZ2luw6lsaW5lY29sb3Kld2hpdGWtc2hhcGVkZWZhdWx0c4GkbGluZYGlY29sb3KnIzJhM2Y1Zqpob3ZlcmxhYmVsgaVhbGlnbqRsZWZ0pm1hcGJveIGlc3R5bGWlbGlnaHSlcG9sYXKDq2FuZ3VsYXJheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZadiZ2NvbG9ypyNFNUVDRjaqcmFkaWFsYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWvYXV0b3R5cGVudW1iZXJzpnN0cmljdKRmb250gaVjb2xvcqcjMmEzZjVmp3Rlcm5hcnmEpWFheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZadiZ2NvbG9ypyNFNUVDRjalY2F4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlpWJheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZbJhbm5vdGF0aW9uZGVmYXVsdHODqWFycm93aGVhZMoAAAAAqmFycm93d2lkdGjKP4AAAKphcnJvd2NvbG9ypyMyYTNmNWascGxvdF9iZ2NvbG9ypyNFNUVDRjaldGl0bGWBoXjKPUzMzaVzY2VuZYOleGF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXpheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0ZaV5YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWoY29sb3J3YXmapyM2MzZlZmGnI0VGNTUzQqcjMDBjYzk2pyNhYjYzZmGnI0ZGQTE1QacjMTlkM2YzpyNGRjY2OTKnI0I2RTg4MKcjRkY5N0ZGpyNGRUNCNTKkZGF0Yd4AGa5zY2F0dGVycG9sYXJnbJGCpHR5cGWuc2NhdHRlcnBvbGFyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApmNhcnBldJGDpWJheGlzhalncmlkY29sb3Kld2hpdGWsZW5kbGluZWNvbG9ypyMyYTNmNWaubWlub3JncmlkY29sb3Kld2hpdGWuc3RhcnRsaW5lY29sb3KnIzJhM2Y1ZqlsaW5lY29sb3Kld2hpdGWkdHlwZaZjYXJwZXSlYWF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaxzY2F0dGVycG9sYXKRgqR0eXBlrHNjYXR0ZXJwb2xhcqZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACpcGFyY29vcmRzkYKkbGluZYGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqXBhcmNvb3Jkc6dzY2F0dGVykYKkdHlwZadzY2F0dGVypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAALJoaXN0b2dyYW0yZGNvbnRvdXKRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWyaGlzdG9ncmFtMmRjb250b3VyqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGnY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadjb250b3VyqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtc2NhdHRlcmNhcnBldJGCpHR5cGWtc2NhdHRlcmNhcnBldKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmbWVzaDNkkYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlpm1lc2gzZKdzdXJmYWNlkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp3N1cmZhY2WqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVybWFwYm94kYKkdHlwZa1zY2F0dGVybWFwYm94pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKpzY2F0dGVyZ2VvkYKkdHlwZapzY2F0dGVyZ2Vvpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKloaXN0b2dyYW2RgqR0eXBlqWhpc3RvZ3JhbaZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACjcGllkYKkdHlwZaNwaWWqYXV0b21hcmdpbsOqY2hvcm9wbGV0aJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZapjaG9yb3BsZXRoqWhlYXRtYXBnbJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZaloZWF0bWFwZ2yqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMaNiYXKRhKR0eXBlo2JhcqdlcnJvcl95gaVjb2xvcqcjMmEzZjVmp2Vycm9yX3iBpWNvbG9ypyMyYTNmNWambWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACnaGVhdG1hcJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadoZWF0bWFwqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtY29udG91cmNhcnBldJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZa1jb250b3VyY2FycGV0pXRhYmxlkYOkdHlwZaV0YWJsZaZoZWFkZXKCpGxpbmWBpWNvbG9ypXdoaXRlpGZpbGyBpWNvbG9ypyNDOEQ0RTOlY2VsbHOCpGxpbmWBpWNvbG9ypXdoaXRlpGZpbGyBpWNvbG9ypyNFQkYwRjipc2NhdHRlcjNkkYOkbGluZYGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqXNjYXR0ZXIzZKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACoYmFycG9sYXKRgqR0eXBlqGJhcnBvbGFypm1hcmtlcoGkbGluZYKlY29sb3KnI0U1RUNGNqV3aWR0aMo/AAAAqXNjYXR0ZXJnbJGCpHR5cGWpc2NhdHRlcmdspm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKtoaXN0b2dyYW0yZJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZatoaXN0b2dyYW0yZKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrnNjYXR0ZXJ0ZXJuYXJ5kYKkdHlwZa5zY2F0dGVydGVybmFyeaZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACrYW5ub3RhdGlvbnOSiad5YW5jaG9ypmJvdHRvbad4YW5jaG9ypmNlbnRlcqF5yj+AAACkZm9udIGkc2l6ZcpBgAAAqXNob3dhcnJvd8KkeXJlZqVwYXBlcqR0ZXh0o0dSRaR4cmVmpXBhcGVyoXjKPmZmZomneWFuY2hvcqZib3R0b22neGFuY2hvcqZjZW50ZXKheco/gAAApGZvbnSBpHNpemXKQYAAAKlzaG93YXJyb3fCpHlyZWalcGFwZXKkdGV4dKJTRaR4cmVmpXBhcGVyoXjKP0ZmZqZtYXJnaW6EoWzKQkgAAKFiykJIAAChcspCSAAAoXTKQnAAAKZzY2VuZTKBpmRvbWFpboKhedcXAAAAAAAAgD+heNcXzcwMPwAAgD+mY29uZmlnhahzaG93TGlua8KoZWRpdGFibGXCqnJlc3BvbnNpdmXDqnN0YXRpY1Bsb3TCqnNjcm9sbFpvb23DpmZyYW1lc5CkZGF0YZaJpG1vZGWlbGluZXOkbGluZYGlY29sb3KkZ3JheaF5yAKgFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKR0eXBlqXNjYXR0ZXIzZKRuYW1lqlRyYWplY3RvcnmpaG92ZXJpbmZvpHNraXClc2NlbmWmc2NlbmUxoXrIAqAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoXjIAqAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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MTAwLjAsIDUwLjApt2hzdigyMjYuMCwgMTAwLjAsIDUwLjAp2T1oc3YoMjIzLjQ1NDU0NTQ1NDU0NTQ0LCA5OS45OTk5OTk5OTk5OTk5OSwgNDkuOTk5OTk5OTk5OTk5OTkp2SNoc3YoMjIwLjkwOTA5MDkwOTA5MDksIDEwMC4wLCA1MC4wKdk+aHN2KDIxOC4zNjM2MzYzNjM2MzYzNywgMTAwLjAwMDAwMDAwMDAwMDAxLCA1MC4wMDAwMDAwMDAwMDAwMSnZI2hzdigyMTUuODE4MTgxODE4MTgxOCwgMTAwLjAsIDUwLjAp2SRoc3YoMjEzLjI3MjcyNzI3MjcyNzI1LCAxMDAuMCwgNTAuMCnZJGhzdigyMTAuNzI3MjcyNzI3MjcyNzIsIDEwMC4wLCA1MC4wKdkjaHN2KDIwOC4xODE4MTgxODE4MTgyLCAxMDAuMCwgNTAuMCnZJGhzdigyMDUuNjM2MzYzNjM2MzYzNjMsIDEwMC4wLCA1MC4wKdkkaHN2KDIwMy4wOTA5MDkwOTA5MDkwNywgMTAwLjAsIDUwLjAp2SRoc3YoMjAwLjU0NTQ1NDU0NTQ1NDUzLCAxMDAuMCwgNTAuMCm3aHN2KDE5OC4wLCAxMDAuMCwgNTAuMCnZPWhzdigxOTUuNDU0NTQ1NDU0NTQ1NDQsIDk5Ljk5OTk5OTk5OTk5OTk5LCA0OS45OTk5OTk5OTk5OTk5OSnZI2hzdigxOTIuOTA5MDkwOTA5MDkwOSwgMTAwLjAsIDUwLjAp2SRoc3YoMTkwLjM2MzYzNjM2MzYzNjM3LCAxMDAuMCwgNTAuMCnZI2hzdigxODcuODE4MTgxODE4MTgxOCwgMTAwLjAsIDUwLjAp2SRoc3YoMTg1LjI3MjcyNzI3MjcyNzI4LCAxMDAuMCwgNTAuMCnZJGhzdigxODIuNzI3MjcyNzI3MjcyNzIsIDEwMC4wLCA1MC4wKdkjaHN2KDE4MC4xODE4MTgxODE4MTgyLCAxMDAuMCwgNTAuMCnZJGhzdigxNzcuNjM2MzYzNjM2MzYzNjMsIDEwMC4wLCA1MC4wKdkjaHN2KDE3NS4wOTA5MDkwOTA5MDkxLCAxMDAuMCwgNTAuMCnZJGhzdigxNzIuNTQ1NDU0NTQ1NDU0NTMsIDEwMC4wLCA1MC4wKbdoc3YoMTcwLjAsIDEwMC4wLCA1MC4wKdk9aHN2KDE2Ny4zNjM2MzYzNjM2MzYzNywgOTkuOTk5OTk5OTk5OTk5OTksIDQ5Ljk5OTk5OTk5OTk5OTk5KdkkaHN2KDE2NC43MjcyNzI3MjcyNzI3MiwgMTAwLjAsIDUwLjAp2SNoc3YoMTYyLjA5MDkwOTA5MDkwOTEsIDEwMC4wLCA1MC4wKdkkaHN2KDE1OS40NTQ1NDU0NTQ1NDU0NCwgMTAwLjAsIDUwLjAp2SNoc3YoMTU2LjgxODE4MTgxODE4MTgsIDEwMC4wLCA1MC4wKdkjaHN2KDE1NC4xODE4MTgxODE4MTgyLCAxMDAuMCwgNTAuMCnZJGhzdigxNTEuNTQ1NDU0NTQ1NDU0NTYsIDEwMC4wLCA1MC4wKdkjaHN2KDE0OC45MDkwOTA5MDkwOTA5LCAxMDAuMCwgNTAuMCnZJGhzdigxNDYuMjcyNzI3MjcyNzI3MjUsIDEwMC4wLCA1MC4wKdkkaHN2KDE0My42MzYzNjM2MzYzNjM2MywgMTAwLjAsIDUwLjApt2hzdigxNDEuMCwgMTAwLjAsIDUwLjAp2SRoc3YoMTM4LjQ1NDU0NTQ1NDU0NTQ3LCAxMDAuMCwgNTAuMCnZI2hzdigxMzUuOTA5MDkwOTA5MDkwOSwgMTAwLjAsIDUwLjAp2SRoc3YoMTMzLjM2MzYzNjM2MzYzNjM1LCAxMDAuMCwgNTAuMCnZI2hzdigxMzAuODE4MTgxODE4MTgxOCwgMTAwLjAsIDUwLjAp2SRoc3YoMTI4LjI3MjcyNzI3MjcyNzI1LCAxMDAuMCwgNTAuMCnZJGhzdigxMjUuNzI3MjcyNzI3MjcyNzIsIDEwMC4wLCA1MC4wKdkkaHN2KDEyMy4xODE4MTgxODE4MTgxOSwgMTAwLjAsIDUwLjAp2SRoc3YoMTIwLjYzNjM2MzYzNjM2MzYzLCAxMDAuMCwgNTAuMCnZI2hzdigxMTguMDkwOTA5MDkwOTA5MSwgMTAwLjAsIDUwLjAp2SRoc3YoMTE1LjU0NTQ1NDU0NTQ1NDU2LCAxMDAuMCwgNTAuMCm3aHN2KDExMy4wLCAxMDAuMCwgNTAuMCnZPWhzdigxMTAuNDU0NTQ1NDU0NTQ1NDUsIDk5Ljk5OTk5OTk5OTk5OTk5LCA0OS45OTk5OTk5OTk5OTk5OSnZI2hzdigxMDcuOTA5MDkwOTA5MDkwOSwgMTAwLjAsIDUwLjAp2SRoc3YoMTA1LjM2MzYzNjM2MzYzNjM2LCAxMDAuMCwgNTAuMCnZJGhzdigxMDIuODE4MTgxODE4MTgxODQsIDEwMC4wLCA1MC4wKdkkaHN2KDEwMC4yNzI3MjcyNzI3MjcyNSwgMTAwLjAsIDUwLjAp2SNoc3YoOTcuNzI3MjcyNzI3MjcyNzMsIDEwMC4wLCA1MC4wKdkjaHN2KDk1LjE4MTgxODE4MTgxODE3LCAxMDAuMCwgNTAuMCnZI2hzdig5Mi42MzYzNjM2MzYzNjM2MywgMTAwLjAsIDUwLjAp2SNoc3YoOTAuMDkwOTA5MDkwOTA5MDcsIDEwMC4wLCA1MC4wKdkjaHN2KDg3LjU0NTQ1NDU0NTQ1NDUzLCAxMDAuMCwgNTAuMCm2aHN2KDg1LjAsIDEwMC4wLCA1MC4wKdkjaHN2KDgyLjM2MzYzNjM2MzYzNjM1LCAxMDAuMCwgNTAuMCnZI2hzdig3OS43MjcyNzI3MjcyNzI3MywgMTAwLjAsIDUwLjAp2SNoc3YoNzcuMDkwOTA5MDkwOTA5MDcsIDEwMC4wLCA1MC4wKdkjaHN2KDc0LjQ1NDU0NTQ1NDU0NTQ1LCAxMDAuMCwgNTAuMCnZI2hzdig3MS44MTgxODE4MTgxODE4MywgMTAwLjAsIDUwLjAp2SNoc3YoNjkuMTgxODE4MTgxODE4MTcsIDEwMC4wLCA1MC4wKdkjaHN2KDY2LjU0NTQ1NDU0NTQ1NDU2LCAxMDAuMCwgNTAuMCnZImhzdig2My45MDkwOTA5MDkwOTA5LCAxMDAuMCwgNTAuMCnZI2hzdig2MS4yNzI3MjcyNzI3MjcyNywgMTAwLjAsIDUwLjAp2SRoc3YoNTguNjM2MzYzNjM2MzYzNjU0LCAxMDAuMCwgNTAuMCm2aHN2KDU2LjAsIDEwMC4wLCA1MC4wKdk8aHN2KDUzLjQ1NDU0NTQ1NDU0NTQ2LCA5OS45OTk5OTk5OTk5OTk5OSwgNDkuOTk5OTk5OTk5OTk5OTkp2SJoc3YoNTAuOTA5MDkwOTA5MDkwOSwgMTAwLjAsIDUwLjAp2SNoc3YoNDguMzYzNjM2MzYzNjM2MzYsIDEwMC4wLCA1MC4wKdkiaHN2KDQ1Ljgx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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApHR5cGWpc2NhdHRlcjNkpG5hbWWqVHJhamVjdG9yealob3ZlcmluZm+kc2tpcKVzY2VuZaZzY2VuZTKhesgDnBcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACheMgDnBcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADK/hkxtg6MRbYOjEW2DoxFtg6MRbYOjEW2DoxFtg6MRbYOjEW2DoxFtg6MRbYOjEW2DoxFtg6MRbYOjEW2DoxFtg6MRbYOjEW2DoxFtg6MRbYOjEW2DoxFtg6MRbYOjEW2DoxFtg6MRbYOjEW2DoxFtg6MRbYOjEW2DoxFtg6MRbYOjEW2DoxFtg6MxbYOjMW2DozFtg6MxbYOjMW2DozFtg6MxbYOjMW2DozFtg6MxbYOjMW2DozFtg6MxbYOjMW2DozFtg6MxbYOjMW2DozFtg6MxbYOjMW2DozFtg6MxbYOjMW2DozFtg6MxbYOjMW2DozFtg6MxbYOjMW2DozFtg6MxbYOjMVfOonFCWaGxbORg8VcvYDFDNJ7xV8pdsWygHDFBdhqxVgvZcWrhl/F/91ZxVI1VMWljE7F+ONIxUs7Q8Wekj3F8ek3xUVBMsWYmCzF6+8mxT5HIcWRnhvF5PUVxThNEMWLpArF3vsExWKm/sQIVfPErwPoxFWy3MT7YNHEog/GxEi+usTubK/ElBukxDvKmMTheI3EhyeCxFusbcSoCVfE9WZAxEHEKcSOIRPEtf34w064y8Pocp7DAltiwzTQB8ObFTXCmxU1QjTQB0MCW2JD6HKeQ064y0O1/fhDjiETREHEKUT1ZkBEqAlXRFusbUSHJ4JE4XiNRDvKmESUG6RE7myvREi+ukSiD8ZE+2DRRFWy3ESvA+hECFXzRGKm/kTe+wRFi6QKRThNEEXk9RVFkZ4bRT5HIUXr7yZFmJgsRUVBMkXx6TdFnpI9RUs7Q0X440hFpYxORVI1VEX/3VlFq4ZfRVgvZUUF2GpFsoBwRV8pdkUM0ntFXL2ARbORg0UJZoZFXzqJRbYOjEW2DoxFtg6MRbYOjEWLpG1vZGWnbWFya2Vyc6RuYW1lo0FEQ6R0ZXh0yAGQF7TIMkEZBDZBfT85QeF6PEFGtj9BqvFCQQ4tRkFzaElB16NMQVTjT0G4HlNBHVpWQYGVWUHl0FxBSgxgQa5HY0ESg2ZBd75pQdv5bEE/NXBBpHBzQQisdkFt53lB0SJ9QRsvgEHNzIFBf2qDQTEIhUHjpYZBlkOIQUjhiUH6fotBrByNQV66jkEQWJBBw/WRQXWTk0EnMZVB2c6WQYtsmEE9CppB8KebQaJFnUFU455BBoGgQbgeokFqvKNBHVqlQc/3pkGBlahBMzOqQeXQq0GYbq1BSgyvQfypsEGuR7JBYOWzQRKDtUHRIrdBg8C4QTVeukHn+7tBmpm9QUw3v0H+1MBBsHLCQWIQxEEUrsVBx0vHQXnpyEErh8pB3STMQY/CzUFCYM9B9P3QQaab0kFYOdRBCtfVQbx010FvEtlBIbDaQdNN3EGF691BN4nfQekm4UGcxOJBTmLkQQAA5kGynedBZDvpQRfZ6kHJduxBexTuQS2y70HfT/FBke3yQUSL9EH2KPZBqMb3QVpk+UGhesgBkBcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApm1hcmtlcoGkc2l6ZcpAAAAApGxpbmWBpWNvbG9y3ABkt2hzdigyNTUuMCwgMTAwLjAsIDUwLjAp2SRoc3YoMjUyLjM2MzYzNjM2MzYzNjM3LCAxMDAuMCwgNTAuMCnZJGhzdigyNDkuNzI3MjcyNzI3MjcyNzIsIDEwMC4wLCA1MC4wKdk+aHN2KDI0Ny4wOTA5MDkwOTA5MDkxMiwgMTAwLjAwMDAwMDAwMDAwMDAxLCA1MC4wMDAwMDAwMDAwMDAwMSnZJGhzdigyNDQuNDU0NTQ1NDU0NTQ1NDQsIDEwMC4wLCA1MC4wKdkjaHN2KDI0MS44MTgxODE4MTgxODE4LCAxMDAuMCwgNTAuMCnZI2hzdigyMzkuMTgxODE4MTgxODE4MiwgMTAwLjAsIDUwLjAp2SRoc3YoMjM2LjU0NTQ1NDU0NTQ1NDU2LCAxMDAuMCwgNTAuMCnZJGhzdigyMzMuOTA5MDkwOTA5MDkwOTMsIDEwMC4wLCA1MC4wKdkkaHN2KDIzMS4yNzI3MjcyNzI3MjcyNSwgMTAwLjAsIDUwLjAp2SRoc3YoMjI4LjYzNjM2MzYzNjM2MzYzLCAxMDAuMCwgNTAuMCm3aHN2KDIyNi4wLCAxMDAuMCwgNTAuMCnZPWhzdigyMjMuNDU0NTQ1NDU0NTQ1NDQsIDk5Ljk5OTk5OTk5OTk5OTk5LCA0OS45OTk5OTk5OTk5OTk5OSnZI2hzdigyMjAuOTA5MDkwOTA5MDkwOSwgMTAwLjAsIDUwLjAp2T5oc3YoMjE4LjM2MzYzNjM2MzYzNjM3LCAxMDAuMDAwMDAwMDAwMDAwMDEsIDUwLjAwMDAwMDAwMDAwMDAxKdkjaHN2KDIxNS44MTgxODE4MTgxODE4LCAxMDAuMCwgNTAuMCnZJGhzdigyMTMuMjcyNzI3MjcyNzI3MjUsIDEwMC4wLCA1MC4wKdkkaHN2KDIxMC43MjcyNzI3MjcyNzI3MiwgMTAwLjAsIDUwLjAp2SNoc3YoMjA4LjE4MTgxODE4MTgxODIsIDEwMC4wLCA1MC4wKdkkaHN2KDIwNS42MzYzNjM2MzYzNjM2MywgMTAwLjAsIDUwLjAp2SRoc3YoMjAzLjA5MDkwOTA5MDkwOTA3LCAxMDAuMCwgNTAuMCnZJGhzdigyMDAuNTQ1NDU0NTQ1NDU0NTMsIDEwMC4wLCA1MC4wKbdoc3YoMTk4LjAsIDEwMC4wLCA1MC4wKdk9aHN2KDE5NS40NTQ1NDU0NTQ1NDU0NCwgOTkuOTk5OTk5OTk5OTk5OTksIDQ5Ljk5OTk5OTk5OTk5OTk5KdkjaHN2KDE5Mi45MDkwOTA5MDkwOTA5LCAxMDAuMCwgNTAuMCnZJGhzdigxOTAuMzYzNjM2MzYzNjM2MzcsIDEwMC4wLCA1MC4wKdkjaHN2KDE4Ny44MTgxODE4MTgxODE4LCAxMDAuMCwgNTAuMCnZJGhzdigxODUuMjcyNzI3MjcyNzI3MjgsIDEwMC4wLCA1MC4wKdkkaHN2KDE4Mi43MjcyNzI3MjcyNzI3MiwgMTAwLjAsIDUwLjAp2SNoc3YoMTgwLjE4MTgxODE4MTgxODIsIDEwMC4wLCA1MC4wKdkkaHN2KDE3Ny42MzYzNjM2MzYzNjM2MywgMTAwLjAsIDUwLjAp2SNoc3YoMTc1LjA5MDkwOTA5MDkwOTEsIDEwMC4wLCA1MC4wKdkkaHN2KDE3Mi41NDU0NTQ1NDU0NTQ1MywgMTAwLjAsIDUwLjApt2hzdigxNzAuMCwgMTAwLjAsIDUwLjAp2T1oc3YoMTY3LjM2MzYzNjM2MzYzNjM3LCA5OS45OTk5OTk5OTk5OTk5OSwgNDkuOTk5OTk5OTk5OTk5OTkp2SRoc3YoMTY0LjcyNzI3MjcyNzI3MjcyLCAxMDAuMCwgNTAuMCnZI2hzdigxNjIuMDkwOTA5MDkwOTA5MSwgMTAwLjAsIDUwLjAp2SRoc3YoMTU5LjQ1NDU0NTQ1NDU0NTQ0LCAxMDAuMCwgNTAuMCnZI2hzdigxNTYuODE4MTgxODE4MTgxOCwgMTAwLjAsIDUwLjAp2SNoc3YoMTU0LjE4MTgxODE4MTgxODIsIDEwMC4wLCA1MC4wKdkkaHN2KDE1MS41NDU0NTQ1NDU0NTQ1NiwgMTAwLjAsIDUwLjAp2SNoc3YoMTQ4LjkwOTA5MDkwOTA5MDksIDEwMC4wLCA1MC4wKdkkaHN2KDE0Ni4yNzI3MjcyNzI3MjcyNSwgMTAwLjAsIDUwLjAp2SRoc3YoMTQzLjYzNjM2MzYzNjM2MzYzLCAxMDAuMCwgNTAuMCm3aHN2KDE0MS4wLCAxMDAuMCwgNTAuMCnZJGhzdigxMzguNDU0NTQ1NDU0NTQ1NDcsIDEwMC4wLCA1MC4wKdkjaHN2KDEzNS45MDkwOTA5MDkwOTA5LCAxMDAuMCwgNTAuMCnZJGhzdigxMzMuMzYzNjM2MzYzNjM2MzUsIDEwMC4wLCA1MC4wKdkjaHN2KDEzMC44MTgxODE4MTgxODE4LCAxMDAuMCwgNTAuMCnZJGhzdigxMjguMjcyNzI3MjcyNzI3MjUsIDEwMC4wLCA1MC4wKdkkaHN2KDEyNS43MjcyNzI3MjcyNzI3MiwgMTAwLjAsIDUwLjAp2SRoc3YoMTIzLjE4MTgxODE4MTgxODE5LCAxMDAuMCwgNTAuMCnZJGhzdigxMjAuNjM2MzYzNjM2MzYzNjMsIDEwMC4wLCA1MC4wKdkjaHN2KDExOC4wOTA5MDkwOTA5MDkxLCAxMDAuMCwgNTAuMCnZJGhzdigxMTUuNTQ1NDU0NTQ1NDU0NTYsIDEwMC4wLCA1MC4wKbdoc3YoMTEzLjAsIDEwMC4wLCA1MC4wKdk9aHN2KDExMC40NTQ1NDU0NTQ1NDU0NSwgOTkuOTk5OTk5OTk5OTk5OTksIDQ5Ljk5OTk5OTk5OTk5OTk5KdkjaHN2KDEwNy45MDkwOTA5MDkwOTA5LCAxMDAuMCwgNTAuMCnZJGhzdigxMDUuMzYzNjM2MzYzNjM2MzYsIDEwMC4wLCA1MC4wKdkkaHN2KDEwMi44MTgxODE4MTgxODE4NCwgMTAwLjAsIDUwLjAp2SRoc3YoMTAwLjI3MjcyNzI3MjcyNzI1LCAxMDAuMCwgNTAuMCnZI2hzdig5Ny43MjcyNzI3MjcyNzI3MywgMTAwLjAsIDUwLjAp2SNoc3YoOTUuMTgxODE4MTgxODE4MTcsIDEwMC4wLCA1MC4wKdkjaHN2KDkyLjYzNjM2MzYzNjM2MzYzLCAxMDAuMCwgNTAuMCnZI2hzdig5MC4wOTA5MDkwOTA5MDkwNywgMTAwLjAsIDUwLjAp2SNoc3YoODcuNTQ1NDU0NTQ1NDU0NTMsIDEwMC4wLCA1MC4wKbZoc3YoODUuMCwgMTAwLjAsIDUwLjAp2SNoc3YoODIuMzYzNjM2MzYzNjM2MzUsIDEwMC4wLCA1MC4wKdkjaHN2KDc5LjcyNzI3MjcyNzI3MjczLCAxMDAuMCwgNTAuMCnZI2hzdig3Ny4wOTA5MDkwOTA5MDkwNywgMTAwLjAsIDUwLjAp2SNoc3YoNzQuNDU0NTQ1NDU0NTQ1NDUsIDEwMC4wLCA1MC4wKdkjaHN2KDcxLjgxODE4MTgxODE4MTgzLCAxMDAuMCwgNTAuMCnZI2hzdig2OS4xODE4MTgxODE4MTgxNywgMTAwLjAsIDUwLjAp2SNoc3YoNjYuNTQ1NDU0NTQ1NDU0NTYsIDEwMC4wLCA1MC4wKdkiaHN2KDYzLjkwOTA5MDkwOTA5MDksIDEwMC4wLCA1MC4wKdkjaHN2KDYxLjI3MjcyNzI3MjcyNzI3LCAxMDAuMCwgNTAuMCnZJGhzdig1OC42MzYzNjM2MzYzNjM2NTQsIDEwMC4wLCA1MC4wKbZoc3YoNTYuMCwgMTAwLjAsIDUwLjAp2Txoc3YoNTMuNDU0NTQ1NDU0NTQ1NDYsIDk5Ljk5OTk5OTk5OTk5OTk5LCA0OS45OTk5OTk5OTk5OTk5OSnZImhzdig1MC45MDkwOTA5MDkwOTA5LCAxMDAuMCwgNTAuMCnZI2hzdig0OC4zNjM2MzYzNjM2MzYzNiwgMTAwLjAsIDUwLjAp2SJoc3YoNDUuODE4MTgxODE4MTgxOCwgMTAwLjAsIDUwLjAp2SRoc3YoNDMuMjcyNzI3MjcyNzI3MjY2LCAxMDAuMCwgNTAuMCnZJGhzdig0MC43MjcyNzI3MjcyNzI3MzQsIDEwMC4wLCA1MC4wKdkjaHN2KDM4LjE4MTgxODE4MTgxODE3LCAxMDAuMCwgNTAuMCnZI2hzdigzNS42MzYzNjM2MzYzNjM2MywgMTAwLjAsIDUwLjAp2SRoc3YoMzMuMDkwOTA5MDkwOTA5MDY1LCAxMDAuMCwgNTAuMCnZJGhzdigzMC41NDU0NTQ1NDU0NTQ1MzYsIDEwMC4wLCA1MC4wKbZoc3YoMjguMCwgMTAwLjAsIDUwLjAp2SNoc3YoMjUuNDU0NTQ1NDU0NTQ1NDQsIDEwMC4wLCA1MC4wKdkkaHN2KDIyLjkwOTA5MDkwOTA5MDkwNywgMTAwLjAsIDUwLjAp2SRoc3YoMjAuMzYzNjM2MzYzNjM2MzQ2LCAxMDAuMCwgNTAuMCnZJGhzdigxNy44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YXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKV4YXhpc4epZ3JpZGNvbG9ypXdoaXRlrXplcm9saW5ld2lkdGjKQAAAAKV0aXRsZYGoc3RhbmRvZmbKQXAAAKV0aWNrc6CtemVyb2xpbmVjb2xvcqV3aGl0ZaphdXRvbWFyZ2luw6lsaW5lY29sb3Kld2hpdGWpaG92ZXJtb2Rlp2Nsb3Nlc3StcGFwZXJfYmdjb2xvcqV3aGl0ZaNnZW+GqXNob3dsYWtlc8Ooc2hvd2xhbmTDqWxhbmRjb2xvcqcjRTVFQ0Y2p2JnY29sb3Kld2hpdGWsc3VidW5pdGNvbG9ypXdoaXRlqWxha2Vjb2xvcqV3aGl0Zapjb2xvcnNjYWxlg6pzZXF1ZW50aWFsmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxqWRpdmVyZ2luZ5uSygAAAACnIzhlMDE1MpLKPczMzacjYzUxYjdkkso+TMzNpyNkZTc3YWWSyj6ZmZqnI2YxYjZkYZLKPszMzacjZmRlMGVmkso/AAAApyNmN2Y3ZjeSyj8ZmZqnI2U2ZjVkMJLKPzMzM6cjYjhlMTg2kso/TMzNpyM3ZmJjNDGSyj9mZmanIzRkOTIyMZLKP4AAAKcjMjc2NDE5r3NlcXVlbnRpYWxtaW51c5qSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMaV5YXhpc4epZ3JpZGNvbG9ypXdoaXRlrXplcm9saW5ld2lkdGjKQAAAAKV0aXRsZYGoc3RhbmRvZmbKQXAAAKV0aWNrc6CtemVyb2xpbmVjb2xvcqV3aGl0ZaphdXRvbWFyZ2luw6lsaW5lY29sb3Kld2hpdGWtc2hhcGVkZWZhdWx0c4GkbGluZYGlY29sb3KnIzJhM2Y1Zqpob3ZlcmxhYmVsgaVhbGlnbqRsZWZ0pm1hcGJveIGlc3R5bGWlbGlnaHSlcG9sYXKDq2FuZ3VsYXJheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZadiZ2NvbG9ypyNFNUVDRjaqcmFkaWFsYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWvYXV0b3R5cGVudW1iZXJzpnN0cmljdKRmb250gaVjb2xvcqcjMmEzZjVmp3Rlcm5hcnmEpWFheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZadiZ2NvbG9ypyNFNUVDRjalY2F4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlpWJheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZbJhbm5vdGF0aW9uZGVmYXVsdHODqWFycm93aGVhZMoAAAAAqmFycm93d2lkdGjKP4AAAKphcnJvd2NvbG9ypyMyYTNmNWascGxvdF9iZ2NvbG9ypyNFNUVDRjaldGl0bGWBoXjKPUzMzaVzY2VuZYOleGF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXpheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0ZaV5YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWoY29sb3J3YXmapyM2MzZlZmGnI0VGNTUzQqcjMDBjYzk2pyNhYjYzZmGnI0ZGQTE1QacjMTlkM2YzpyNGRjY2OTKnI0I2RTg4MKcjRkY5N0ZGpyNGRUNCNTKkZGF0Yd4AGa5zY2F0dGVycG9sYXJnbJGCpHR5cGWuc2NhdHRlcnBvbGFyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApmNhcnBldJGDpWJheGlzhalncmlkY29sb3Kld2hpdGWsZW5kbGluZWNvbG9ypyMyYTNmNWaubWlub3JncmlkY29sb3Kld2hpdGWuc3RhcnRsaW5lY29sb3KnIzJhM2Y1ZqlsaW5lY29sb3Kld2hpdGWkdHlwZaZjYXJwZXSlYWF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaxzY2F0dGVycG9sYXKRgqR0eXBlrHNjYXR0ZXJwb2xhcqZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACpcGFyY29vcmRzkYKkbGluZYGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqXBhcmNvb3Jkc6dzY2F0dGVykYKkdHlwZadzY2F0dGVypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAALJoaXN0b2dyYW0yZGNvbnRvdXKRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWyaGlzdG9ncmFtMmRjb250b3VyqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGnY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadjb250b3VyqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtc2NhdHRlcmNhcnBldJGCpHR5cGWtc2NhdHRlcmNhcnBldKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmbWVzaDNkkYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlpm1lc2gzZKdzdXJmYWNlkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp3N1cmZhY2WqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVybWFwYm94kYKkdHlwZa1zY2F0dGVybWFwYm94pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKpzY2F0dGVyZ2VvkYKkdHlwZapzY2F0dGVyZ2Vvpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKloaXN0b2dyYW2RgqR0eXBlqWhpc3RvZ3JhbaZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACjcGllkYKkdHlwZaNwaWWqYXV0b21hcmdpbsOqY2hvcm9wbGV0aJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZapjaG9yb3BsZXRoqWhlYXRtYXBnbJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZaloZWF0bWFwZ2yqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMaNiYXKRhKR0eXBlo2JhcqdlcnJvcl95gaVjb2xvcqcjMmEzZjVmp2Vycm9yX3iBpWNvbG9ypyMyYTNmNWambWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACnaGVhdG1hcJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadoZWF0bWFwqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtY29udG91cmNhcnBldJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZa1jb250b3VyY2FycGV0pXRhYmxlkYOkdHlwZaV0YWJsZaZoZWFkZXKCpGxpbmWBpWNvbG9ypXdoaXRlpGZpbGyBpWNvbG9ypyNDOEQ0RTOlY2VsbHOCpGxpbmWBpWNvbG9ypXdoaXRlpGZpbGyBpWNvbG9ypyNFQkYwRjipc2NhdHRlcjNkkYOkbGluZYGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqXNjYXR0ZXIzZKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACoYmFycG9sYXKRgqR0eXBlqGJhcnBvbGFypm1hcmtlcoGkbGluZYKlY29sb3KnI0U1RUNGNqV3aWR0aMo/AAAAqXNjYXR0ZXJnbJGCpHR5cGWpc2NhdHRlcmdspm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKtoaXN0b2dyYW0yZJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZatoaXN0b2dyYW0yZKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrnNjYXR0ZXJ0ZXJuYXJ5kYKkdHlwZa5zY2F0dGVydGVybmFyeaZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmbGVnZW5khad5YW5jaG9ypmJvdHRvbad4YW5jaG9ypGxlZnSheco/gAAAq29yaWVudGF0aW9uoWiheMoAAAAApXlheGlzg6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmVjb2xvcqV3aGl0ZapmaXhlZHJhbmdlwqZzaGFwZXOQpGZvbnSBpWNvbG9ypGdyYXmrYW5ub3RhdGlvbnOQrHBsb3RfYmdjb2xvcrByZ2IoMjI5LDIzNiwyNDYppm1hcmdpboShbMoAAAAAoWLKAAAAAKFyygAAAAChdMoAAAAApmNvbmZpZ4i2bW9kZUJhckJ1dHRvbnNUb1JlbW92ZZikem9vbalhdXRvU2NhbGWscmVzZXRTY2FsZTJko3Bhbq10YWJsZVJvdGF0aW9us3Jlc2V0Q2FtZXJhTGFzdFNhdmWmem9vbUlup3pvb21PdXSrZGlzcGxheWxvZ2/CtHRvSW1hZ2VCdXR0b25PcHRpb25zgaZmb3JtYXSjc3ZnqHNob3dMaW5rwqhlZGl0YWJsZcKqcmVzcG9uc2l2ZcOqc3RhdGljUGxvdMKqc2Nyb2xsWm9vbcOmZnJhbWVzkKRkYXRhk4WhecgBlBf4Ap9B22mdQdvUm0HuQ5pBCbeYQR0ul0EpqZVBGiiUQeuqkkGRMZFBA7yPQTNKjkEd3IxBs3GLQe4KikHFp4hBLEiHQR7shUGOk4RBdT6DQcnsgUGCnoBBLqd+QQMYfEFqj3lBUg13QbKRdEF3HHJBi61vQeZEbUFv4mpBIIZoQeAvZkGh32NBWJVhQfRQX0FpEl1Bn9laQYymWEEneVZBWFFUQRMvUkFQElBB+fpNQQXpS0Fl3ElBCdVHQeXSRUHs1UNBE95BQUnrP0GB/T1BsBQ8Qcsw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QAAAAKV0aXRsZYGoc3RhbmRvZmbKQXAAAKV0aWNrc6CtemVyb2xpbmVjb2xvcqV3aGl0ZaphdXRvbWFyZ2luw6lsaW5lY29sb3Kld2hpdGWpaG92ZXJtb2Rlp2Nsb3Nlc3StcGFwZXJfYmdjb2xvcqV3aGl0ZaNnZW+GqXNob3dsYWtlc8Ooc2hvd2xhbmTDqWxhbmRjb2xvcqcjRTVFQ0Y2p2JnY29sb3Kld2hpdGWsc3VidW5pdGNvbG9ypXdoaXRlqWxha2Vjb2xvcqV3aGl0Zapjb2xvcnNjYWxlg6pzZXF1ZW50aWFsmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxqWRpdmVyZ2luZ5uSygAAAACnIzhlMDE1MpLKPczMzacjYzUxYjdkkso+TMzNpyNkZTc3YWWSyj6ZmZqnI2YxYjZkYZLKPszMzacjZmRlMGVmkso/AAAApyNmN2Y3ZjeSyj8ZmZqnI2U2ZjVkMJLKPzMzM6cjYjhlMTg2kso/TMzNpyM3ZmJjNDGSyj9mZmanIzRkOTIyMZLKP4AAAKcjMjc2NDE5r3NlcXVlbnRpYWxtaW51c5qSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMaV5YXhpc4epZ3JpZGNvbG9ypXdoaXRlrXplcm9saW5ld2lkdGjKQAAAAKV0aXRsZYGoc3RhbmRvZmbKQXAAAKV0aWNrc6CtemVyb2xpbmVjb2xvcqV3aGl0ZaphdXRvbWFyZ2luw6lsaW5lY29sb3Kld2hpdGWtc2hhcGVkZWZhdWx0c4GkbGluZYGlY29sb3KnIzJhM2Y1Zqpob3ZlcmxhYmVsgaVhbGlnbqRsZWZ0pm1hcGJveIGlc3R5bGWlbGlnaHSlcG9sYXKDq2FuZ3VsYXJheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZadiZ2NvbG9ypyNFNUVDRjaqcmFkaWFsYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWvYXV0b3R5cGVudW1iZXJzpnN0cmljdKRmb250gaVjb2xvcqcjMmEzZjVmp3Rlcm5hcnmEpWFheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZadiZ2NvbG9ypyNFNUVDRjalY2F4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlpWJheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZbJhbm5vdGF0aW9uZGVmYXVsdHODqWFycm93aGVhZMoAAAAAqmFycm93d2lkdGjKP4AAAKphcnJvd2NvbG9ypyMyYTNmNWascGxvdF9iZ2NvbG9ypyNFNUVDRjaldGl0bGWBoXjKPUzMzaVzY2VuZYOleGF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXpheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0ZaV5YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWoY29sb3J3YXmapyM2MzZlZmGnI0VGNTUzQqcjMDBjYzk2pyNhYjYzZmGnI0ZGQTE1QacjMTlkM2YzpyNGRjY2OTKnI0I2RTg4MKcjRkY5N0ZGpyNGRUNCNTKkZGF0Yd4AGa5zY2F0dGVycG9sYXJnbJGCpHR5cGWuc2NhdHRlcnBvbGFyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApmNhcnBldJGDpWJheGlzhalncmlkY29sb3Kld2hpdGWsZW5kbGluZWNvbG9ypyMyYTNmNWaubWlub3JncmlkY29sb3Kld2hpdGWuc3RhcnRsaW5lY29sb3KnIzJhM2Y1ZqlsaW5lY29sb3Kld2hpdGWkdHlwZaZjYXJwZXSlYWF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaxzY2F0dGVycG9sYXKRgqR0eXBlrHNjYXR0ZXJwb2xhcqZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACpcGFyY29vcmRzkYKkbGluZYGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqXBhcmNvb3Jkc6dzY2F0dGVykYKkdHlwZadzY2F0dGVypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAALJoaXN0b2dyYW0yZGNvbnRvdXKRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWyaGlzdG9ncmFtMmRjb250b3VyqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGnY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadjb250b3VyqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtc2NhdHRlcmNhcnBldJGCpHR5cGWtc2NhdHRlcmNhcnBldKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmbWVzaDNkkYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlpm1lc2gzZKdzdXJmYWNlkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp3N1cmZhY2WqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVybWFwYm94kYKkdHlwZa1zY2F0dGVybWFwYm94pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKpzY2F0dGVyZ2VvkYKkdHlwZapzY2F0dGVyZ2Vvpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKloaXN0b2dyYW2RgqR0eXBlqWhpc3RvZ3JhbaZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACjcGllkYKkdHlwZaNwaWWqYXV0b21hcmdpbsOqY2hvcm9wbGV0aJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZapjaG9yb3BsZXRoqWhlYXRtYXBnbJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZaloZWF0bWFwZ2yqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMaNiYXKRhKR0eXBlo2JhcqdlcnJvcl95gaVjb2xvcqcjMmEzZjVmp2Vycm9yX3iBpWNvbG9ypyMyYTNmNWambWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACnaGVhdG1hcJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadoZWF0bWFwqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtY29udG91cmNhcnBldJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZa1jb250b3VyY2FycGV0pXRhYmxlkYOkdHlwZaV0YWJsZaZoZWFkZXKCpGxpbmWBpWNvbG9ypXdoaXRlpGZpbGyBpWNvbG9ypyNDOEQ0RTOlY2VsbHOCpGxpbmWBpWNvbG9ypXdoaXRlpGZpbGyBpWNvbG9ypyNFQkYwRjipc2NhdHRlcjNkkYOkbGluZYGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqXNjYXR0ZXIzZKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACoYmFycG9sYXKRgqR0eXBlqGJhcnBvbGFypm1hcmtlcoGkbGluZYKlY29sb3KnI0U1RUNGNqV3aWR0aMo/AAAAqXNjYXR0ZXJnbJGCpHR5cGWpc2NhdHRlcmdspm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKtoaXN0b2dyYW0yZJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZatoaXN0b2dyYW0yZKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrnNjYXR0ZXJ0ZXJuYXJ5kYKkdHlwZa5zY2F0dGVydGVybmFyeaZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmeWF4aXMzg6VyYW5nZdcXAAAAAM3MTD+mZG9tYWlu1xcAAAAAAACAP6ZhbmNob3KieDOmeWF4aXMxg6VyYW5nZdcXAAAAAM3MTD+mZG9tYWlu1xcAAAAAAACAP6ZhbmNob3KieDGmeWF4aXMyg6VyYW5nZdcXAAAAAM3MTD+mZG9tYWlu1xcAAAAAAACAP6ZhbmNob3KieDKmeGF4aXMzgqZkb21haW7XF2ELNj8AAIA/pmFuY2hvcqJ5M6thbm5vdGF0aW9uc5OJp3lhbmNob3KmYm90dG9tp3hhbmNob3KmY2VudGVyoXnKP4AAAKRmb250gaRzaXplykGAAACpc2hvd2Fycm93wqR5cmVmpXBhcGVypHRleHSmR1JFLVQypHhyZWalcGFwZXKheMo+E+k/iad5YW5jaG9ypmJvdHRvbad4YW5jaG9ypmNlbnRlcqF5yj+AAACkZm9udIGkc2l6ZcpBgAAAqXNob3dhcnJvd8KkeXJlZqVwYXBlcqR0ZXh0p0dSRS1UMiqkeHJlZqVwYXBlcqF4yj8AAACJp3lhbmNob3KmYm90dG9tp3hhbmNob3KmY2VudGVyoXnKP4AAAKRmb250gaRzaXplykGAAACpc2hvd2Fycm93wqR5cmVmpXBhcGVypHRleHSiU0WkeHJlZqVwYXBlcqF4yj9bBbCmbWFyZ2luhKFsykJIAAChYspCSAAAoXLKQkgAAKF0ykJwAACmY29uZmlnhahzaG93TGlua8KoZWRpdGFibGXCqnJlc3BvbnNpdmXDqnN0YXRpY1Bsb3TCqnNjcm9sbFpvb23DpmZyYW1lc5CkZGF0YZOFpXhheGlzongxoXnIAZAXhYe5OrujuToH+rk6jYm6Oo9SuzrSWbw6SZ29OqIhvzqr6MA6lfbCOjpPxTrP98c6OfPKOiBLzjqgBdI6NyzWOnzL2joA7N86bJ/lOlT06zpZA/M6jub6OqzbATtk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bG9ypXdoaXRlo2dlb4apc2hvd2xha2Vzw6hzaG93bGFuZMOpbGFuZGNvbG9ypyNFNUVDRjanYmdjb2xvcqV3aGl0ZaxzdWJ1bml0Y29sb3Kld2hpdGWpbGFrZWNvbG9ypXdoaXRlqmNvbG9yc2NhbGWDqnNlcXVlbnRpYWyaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGpZGl2ZXJnaW5nm5LKAAAAAKcjOGUwMTUykso9zMzNpyNjNTFiN2SSyj5MzM2nI2RlNzdhZZLKPpmZmqcjZjFiNmRhkso+zMzNpyNmZGUwZWaSyj8AAACnI2Y3ZjdmN5LKPxmZmqcjZTZmNWQwkso/MzMzpyNiOGUxODaSyj9MzM2nIzdmYmM0MZLKP2ZmZqcjNGQ5MjIxkso/gAAApyMyNzY0MTmvc2VxdWVudGlhbG1pbnVzmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxpXlheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Za1zaGFwZWRlZmF1bHRzgaRsaW5lgaVjb2xvcqcjMmEzZjVmqmhvdmVybGFiZWyBpWFsaWdupGxlZnSmbWFwYm94gaVzdHlsZaVsaWdodKVwb2xhcoOrYW5ndWxhcmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqpyYWRpYWxheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0Za9hdXRvdHlwZW51bWJlcnOmc3RyaWN0pGZvbnSBpWNvbG9ypyMyYTNmNWandGVybmFyeYSlYWF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqVjYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWlYmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlsmFubm90YXRpb25kZWZhdWx0c4OpYXJyb3doZWFkygAAAACqYXJyb3d3aWR0aMo/gAAAqmFycm93Y29sb3KnIzJhM2Y1ZqxwbG90X2JnY29sb3KnI0U1RUNGNqV0aXRsZYGheMo9TMzNpXNjZW5lg6V4YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWlemF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXlheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0Zahjb2xvcndheZqnIzYzNmVmYacjRUY1NTNCpyMwMGNjOTanI2FiNjNmYacjRkZBMTVBpyMxOWQzZjOnI0ZGNjY5MqcjQjZFODgwpyNGRjk3RkanI0ZFQ0I1MqRkYXRh3gAZrnNjYXR0ZXJwb2xhcmdskYKkdHlwZa5zY2F0dGVycG9sYXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmY2FycGV0kYOlYmF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaR0eXBlpmNhcnBldKVhYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlrHNjYXR0ZXJwb2xhcpGCpHR5cGWsc2NhdHRlcnBvbGFypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKlwYXJjb29yZHORgqRsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpcGFyY29vcmRzp3NjYXR0ZXKRgqR0eXBlp3NjYXR0ZXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAsmhpc3RvZ3JhbTJkY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZbJoaXN0b2dyYW0yZGNvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMadjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2NvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVyY2FycGV0kYKkdHlwZa1zY2F0dGVyY2FycGV0pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZtZXNoM2SRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWmbWVzaDNkp3N1cmZhY2WRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnc3VyZmFjZapjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJtYXBib3iRgqR0eXBlrXNjYXR0ZXJtYXBib3imbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqnNjYXR0ZXJnZW+RgqR0eXBlqnNjYXR0ZXJnZW+mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqWhpc3RvZ3JhbZGCpHR5cGWpaGlzdG9ncmFtpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKNwaWWRgqR0eXBlo3BpZaphdXRvbWFyZ2luw6pjaG9yb3BsZXRokYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqmNob3JvcGxldGipaGVhdG1hcGdskYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqWhlYXRtYXBnbKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxo2JhcpGEpHR5cGWjYmFyp2Vycm9yX3mBpWNvbG9ypyMyYTNmNWanZXJyb3JfeIGlY29sb3KnIzJhM2Y1ZqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKdoZWF0bWFwkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2hlYXRtYXCqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1jb250b3VyY2FycGV0kYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlrWNvbnRvdXJjYXJwZXSldGFibGWRg6R0eXBlpXRhYmxlpmhlYWRlcoKkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0M4RDRFM6VjZWxsc4KkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0VCRjBGOKlzY2F0dGVyM2SRg6RsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpc2NhdHRlcjNkpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKhiYXJwb2xhcpGCpHR5cGWoYmFycG9sYXKmbWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACpc2NhdHRlcmdskYKkdHlwZalzY2F0dGVyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAq2hpc3RvZ3JhbTJkkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlq2hpc3RvZ3JhbTJkqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGuc2NhdHRlcnRlcm5hcnmRgqR0eXBlrnNjYXR0ZXJ0ZXJuYXJ5pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZtYXJnaW6EoWzKQkgAAKFiykJIAAChcspCSAAAoXTKQnAAAKV5YXhpc4GlcmFuZ2XXFwAAAADNzKBBpmNvbmZpZ4Woc2hvd0xpbmvCqGVkaXRhYmxlwqpyZXNwb25zaXZlw6pzdGF0aWNQbG90wqpzY3JvbGxab29tw6ZmcmFtZXOQpGRhdGGRhaZtYXJrZXKBpWNvbG9ypnB1cnBsZaF5yAGQFwAAoEFYZJ5B1MycQWg5m0EKqplBrx6YQU6XlkHbE5VBTpSTQZsYkkG5oJBBniyPQUG8jUGXT4xBmOaKQTmBiUFyH4hBOcGGQYVmhUFND4RBiLuCQS5rgUE0HoBBJ6l9QYYce0F0lnhB4BZ2Qbqdc0HxKnFBdb5uQTRYbEEh+GlBKZ5nQT9KZUFR/GJBUrRgQTFyXkHfNVxBTv9ZQW/OV0Eyo1VBin1TQWldUUG/Qk9Bfy1NQZwdS0EGE0lBsQ1HQY8NRUGSEkNBrhxBQdUrP0H7Pz1BElk7QQ13OUHhmTdBgcE1QeDtM0HyHjJBq1QwQf+OLkHjzSxBSRErQShZKUFzpSdBH/YlQSFLJEFupCJB+gEhQbtjH0GlyR1BrjMcQcyhGkH0ExlBHIoXQTkEFkFBghRBKgQTQeqJEUF3ExBByKAOQdIxDUGNxgtB7l4KQez6CEF/mgdBnD0GQTrkBEFSjgNB2TsCQcbsAEElQv9AZ7H8QEQn+kCpo/dAhib1QMqv8kBlP/BARtXtQF5x60CkdHlwZadzY2F0dGVypG5hbWWoVDItZGVjYXmheMgBkBcAAAAA/UoBP/1KgT988ME//UoBQL2dIUB88EFAO0NiQP1KgUBddJFAvZ2hQBzHsUB88MFA3BnSQDtD4kCbbPJA/UoBQa1fCUFddBFBDYkZQb2dIUFtsilBHMcxQczbOUF88EFBLAVKQdwZUkGMLlpBO0NiQetXakGbbHJBS4F6Qf1KgUFVVYVBrV+JQQVqjUFddJFBtX6VQQ2JmUFlk51BvZ2hQRWopUFtsqlBxbytQRzHsUF00bVBzNu5QSTmvUF88MFB1PrFQSwFykGED85B3BnSQTQk1kGMLtpB5DjeQTtD4kGTTeZB61fqQUNi7kGbbPJB83b2QUuB+kGji/5B/UoBQilQA0JVVQVCgVoHQq1fCULZZAtCBWoNQjFvD0JddBFCiXkTQrV+FULhgxdCDYkZQjmOG0Jlkx1CkZgfQr2dIULpoiNCFaglQkGtJ0JtsilCmbcrQsW8LULwwS9CHMcxQkjMM0J00TVCoNY3QszbOUL44DtCJOY9QlDrP0J88EFCqPVDQtT6RUIAAEhC2TU3YmNjMDViMC04MWRhLTExZWYtMjA0MC0zNTg1YzliNDk1NGYvOTU5YTZkYmUzN2U2ZTkwOYSmbGF5b3V0i6V4YXhpc4ircmFuZ2VzbGlkZXKBp3Zpc2libGXCqWdyaWRjb2xvcqV3aGl0Za1yYW5nZXNlbGVjdG9ygadidXR0b25zkoSkc3RlcMpBIAAAqHN0ZXBtb2RlqGJhY2t3YXJkpWxhYmVsojFtpWNvdW50yj+AAACBpHN0ZXCjYWxspXRpdGxlgaR0ZXh0oKVyYW5nZZCmZG9tYWlukK16ZXJvbGluZWNvbG9ypXdoaXRlqnRpY2tzdWZmaXijIG1zp21vZGViYXKIpWNvbG9ypGdyYXmrYWN0aXZlY29sb3KwcmdiKDIyOSwyMzYsMjQ2Kad5YW5jaG9ypmJvdHRvbad4YW5jaG9ypXJpZ2h0oXnKP4AAAKdiZ2NvbG9yrXJnYmEoMCwwLDAsMCmrb3JpZW50YXRpb26haKF4ygAAAACpaG92ZXJtb2Rlp2Nsb3Nlc3StcGFwZXJfYmdjb2xvcq1yZ2JhKDAsMCwwLDApqHRlbXBsYXRlgqZsYXlvdXTeABOpY29sb3JheGlzgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApXhheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Zalob3Zlcm1vZGWnY2xvc2VzdK1wYXBlcl9iZ2NvbG9ypXdoaXRlo2dlb4apc2hvd2xha2Vzw6hzaG93bGFuZMOpbGFuZGNvbG9ypyNFNUVDRjanYmdjb2xvcqV3aGl0ZaxzdWJ1bml0Y29sb3Kld2hpdGWpbGFrZWNvbG9ypXdoaXRlqmNvbG9yc2NhbGWDqnNlcXVlbnRpYWyaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGpZGl2ZXJnaW5nm5LKAAAAAKcjOGUwMTUykso9zMzNpyNjNTFiN2SSyj5MzM2nI2RlNzdhZZLKPpmZmqcjZjFiNmRhkso+zMzNpyNmZGUwZWaSyj8AAACnI2Y3ZjdmN5LKPxmZmqcjZTZmNWQwkso/MzMzpyNiOGUxODaSyj9MzM2nIzdmYmM0MZLKP2ZmZqcjNGQ5MjIxkso/gAAApyMyNzY0MTmvc2VxdWVudGlhbG1pbnVzmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxpXlheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Za1zaGFwZWRlZmF1bHRzgaRsaW5lgaVjb2xvcqcjMmEzZjVmqmhvdmVybGFiZWyBpWFsaWdupGxlZnSmbWFwYm94gaVzdHlsZaVsaWdodKVwb2xhcoOrYW5ndWxhcmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqpyYWRpYWxheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0Za9hdXRvdHlwZW51bWJlcnOmc3RyaWN0pGZvbnSBpWNvbG9ypyMyYTNmNWandGVybmFyeYSlYWF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqVjYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWlYmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlsmFubm90YXRpb25kZWZhdWx0c4OpYXJyb3doZWFkygAAAACqYXJyb3d3aWR0aMo/gAAAqmFycm93Y29sb3KnIzJhM2Y1ZqxwbG90X2JnY29sb3KnI0U1RUNGNqV0aXRsZYGheMo9TMzNpXNjZW5lg6V4YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWlemF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXlheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0Zahjb2xvcndheZqnIzYzNmVmYacjRUY1NTNCpyMwMGNjOTanI2FiNjNmYacjRkZBMTVBpyMxOWQzZjOnI0ZGNjY5MqcjQjZFODgwpyNGRjk3RkanI0ZFQ0I1MqRkYXRh3gAZrnNjYXR0ZXJwb2xhcmdskYKkdHlwZa5zY2F0dGVycG9sYXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmY2FycGV0kYOlYmF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaR0eXBlpmNhcnBldKVhYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlrHNjYXR0ZXJwb2xhcpGCpHR5cGWsc2NhdHRlcnBvbGFypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKlwYXJjb29yZHORgqRsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpcGFyY29vcmRzp3NjYXR0ZXKRgqR0eXBlp3NjYXR0ZXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAsmhpc3RvZ3JhbTJkY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZbJoaXN0b2dyYW0yZGNvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMadjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2NvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVyY2FycGV0kYKkdHlwZa1zY2F0dGVyY2FycGV0pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZtZXNoM2SRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWmbWVzaDNkp3N1cmZhY2WRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnc3VyZmFjZapjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJtYXBib3iRgqR0eXBlrXNjYXR0ZXJtYXBib3imbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqnNjYXR0ZXJnZW+RgqR0eXBlqnNjYXR0ZXJnZW+mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqWhpc3RvZ3JhbZGCpHR5cGWpaGlzdG9ncmFtpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKNwaWWRgqR0eXBlo3BpZaphdXRvbWFyZ2luw6pjaG9yb3BsZXRokYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqmNob3JvcGxldGipaGVhdG1hcGdskYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqWhlYXRtYXBnbKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxo2JhcpGEpHR5cGWjYmFyp2Vycm9yX3mBpWNvbG9ypyMyYTNmNWanZXJyb3JfeIGlY29sb3KnIzJhM2Y1ZqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKdoZWF0bWFwkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2hlYXRtYXCqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1jb250b3VyY2FycGV0kYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlrWNvbnRvdXJjYXJwZXSldGFibGWRg6R0eXBlpXRhYmxlpmhlYWRlcoKkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0M4RDRFM6VjZWxsc4KkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0VCRjBGOKlzY2F0dGVyM2SRg6RsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpc2NhdHRlcjNkpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKhiYXJwb2xhcpGCpHR5cGWoYmFycG9sYXKmbWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACpc2NhdHRlcmdskYKkdHlwZalzY2F0dGVyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAq2hpc3RvZ3JhbTJkkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlq2hpc3RvZ3JhbTJkqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGuc2NhdHRlcnRlcm5hcnmRgqR0eXBlrnNjYXR0ZXJ0ZXJuYXJ5pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZsZWdlbmSFp3lhbmNob3KmYm90dG9tp3hhbmNob3KkbGVmdKF5yj+AAACrb3JpZW50YXRpb26haKF4ygAAAACleWF4aXODqWdyaWRjb2xvcqV3aGl0Za16ZXJvbGluZWNvbG9ypXdoaXRlqmZpeGVkcmFuZ2XCpGZvbnSBpWNvbG9ypGdyYXmldGl0bGWgrHBsb3RfYmdjb2xvcrByZ2IoMjI5LDIzNiwyNDYppm1hcmdpboShbMoAAAAAoWLKAAAAAKFyygAAAAChdMoAAAAApmNvbmZpZ4i2bW9kZUJhckJ1dHRvbnNUb1JlbW92ZZqkem9vbahzZWxlY3QyZKdsYXNzbzJkqWF1dG9TY2FsZaxyZXNldFNjYWxlMmSjcGFurXRhYmxlUm90YXRpb26zcmVzZXRDYW1lcmFMYXN0U2F2ZaZ6b29tSW6nem9vbU91dKtkaXNwbGF5bG9nb8K0dG9JbWFnZUJ1dHRvbk9wdGlvbnOBpmZvcm1hdKNzdmeoc2hvd0xpbmvCqGVkaXRhYmxlwqpyZXNwb25zaXZlw6pzdGF0aWNQbG90wqpzY3JvbGxab29tw6ZmcmFtZXOQpGRhdGGXiqpzaG93bGVnZW5kw6ZtYXJrZXKBpWNvbG9ypyM2MzZFRkGleGF4aXOheKF51xcAAIB/AACAf6R0eXBlp3NjYXR0ZXKkbmFtZaJHeKV5YXhpc6F5q2xlZ2VuZGdyb3Vwokd4rWhvdmVydGVtcGxhdGW8KCV7eDouNGZ9IG1zLCAle3k6LjJmfSBtVC9tKaF41xcAAIB/AACAf4qqc2hvd2xlZ2VuZMOmbWFya2VygaVjb2xvcqcjRUY1NTNCpXhheGlzoXihedcXAACAfwAAgH+kdHlwZadzY2F0dGVypG5hbWWiR3mleWF4aXOheatsZWdlbmRncm91cKJHea1ob3ZlcnRlbXBsYXRlvCgle3g6LjRmfSBtcywgJXt5Oi4yZn0gbVQvbSmheNcXAACAfwAAgH+KqnNob3dsZWdlbmTDpm1hcmtlcoGlY29sb3KnIzAwQ0M5NqV4YXhpc6F4oXnXFwAAgH8AAIB/pHR5cGWnc2NhdHRlcqRuYW1lokd6pXlheGlzoXmrbGVnZW5kZ3JvdXCiR3qtaG92ZXJ0ZW1wbGF0ZbwoJXt4Oi40Zn0gbXMsICV7eTouMmZ9IG1UL20poXjXFwAAgH8AAIB/iqpzaG93bGVnZW5kw6ZtYXJrZXKBpWNvbG9ypyNBQjYzRkGleGF4aXOheKF5xxgXAAAAAAAAIEEAACBBAAAAAAAAgH8AAIB/pHR5cGWnc2NhdHRlcqRuYW1lp3xCMXxfQU2leWF4aXOheatsZWdlbmRncm91cKd8QjF8X0FNrWhvdmVydGVtcGxhdGW7KCV7eDouNGZ9IG1zLCAle3k6LjJmfSDOvFQpoXjHGBcAAAAAAAAAAHJQFj9yUBY/AACAfwAAgH+MqnNob3dsZWdlbmTDpXhheGlzoXindmlzaWJsZapsZWdlbmRvbmx5pG5hbWWo4oigQjFfQU2kdGV4dMcYFwAAgD8AAIA/AACAPwAAgD8AAIA/AACAP6V5YXhpc6F5q2xlZ2VuZGdyb3VwqOKIoEIxX0FNpm1hcmtlcoGlY29sb3KnI0ZGQTE1QaF5xxgXAAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/pHR5cGWnc2NhdHRlcq1ob3ZlcnRlbXBsYXRl2SIoJXt4Oi40Zn0gbXMsIOKIoEIxOiAle3k6LjRmfSByYWQpoXjHGBcAAAAAAAAAAHJQFj9yUBY/AACAfwAAgH+NqnNob3dsZWdlbmTDpXhheGlzoXindmlzaWJsZapsZWdlbmRvbmx5pG5hbWWlQjFfRk2kdGV4dMcYFwAAgD8AAIA/AACAPwAAgD8AAIA/AACAP6V5YXhpc6F5q2xlZ2VuZGdyb3VwpUIxX0ZNpm1hcmtlcoGlY29sb3KnI0FCNjNGQaRsaW5lgaRkYXNoo2RvdKF5xxgXAAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/pHR5cGWnc2NhdHRlcq1ob3ZlcnRlbXBsYXRl2SIoJXt4Oi40Zn0gbXMsIEIxX0ZNOiAle3k6LjRmfSBrSHopoXjHGBcAAAAAAAAAAHJQFj9yUBY/AACAfwAAgH+LqnNob3dsZWdlbmTDpG1vZGWkbGluZaV4YXhpc6F4pG5hbWWjQURDpXlheGlzoXmrbGVnZW5kZ3JvdXCjQURDpm1hcmtlcoGlY29sb3KnIzE5RDNGM6F5xxgXAACAfwAAAAAAAIA/AACAPwAAAAAAAIB/pHR5cGWnc2NhdHRlcq1ob3ZlcnRlbXBsYXRltSgle3g6LjRmfSBtcywgJXt5Oml9KaF4xxgXAACAf3JQFj9yUBY/QllKQkJZSkIAAIB/2TU3YmNjMDViMC04MWRhLTExZWYtMjA0MC0zNTg1YzliNDk1NGYvM2FlMDliMDgxMjk5NjFkNoSmbGF5b3V0i6V4YXhpc4ircmFuZ2VzbGlkZXKBp3Zpc2libGXCqWdyaWRjb2xvcqV3aGl0Za1yYW5nZXNlbGVjdG9ygadidXR0b25zkoSkc3RlcMpBIAAAqHN0ZXBtb2RlqGJhY2t3YXJkpWxhYmVsojFtpWNvdW50yj+AAACBpHN0ZXCjYWxspXRpdGxlgaR0ZXh0oKVyYW5nZZCmZG9tYWlukK16ZXJvbGluZWNvbG9ypXdoaXRlqnRpY2tzdWZmaXijIG1zp21vZGViYXKIpWNvbG9ypGdyYXmrYWN0aXZlY29sb3KwcmdiKDIyOSwyMzYsMjQ2Kad5YW5jaG9ypmJvdHRvbad4YW5jaG9ypXJpZ2h0oXnKP4AAAKdiZ2NvbG9yrXJnYmEoMCwwLDAsMCmrb3JpZW50YXRpb26haKF4ygAAAACpaG92ZXJtb2Rlp2Nsb3Nlc3StcGFwZXJfYmdjb2xvcq1yZ2JhKDAsMCwwLDApqHRlbXBsYXRlgqZsYXlvdXTeABOpY29sb3JheGlzgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApXhheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Zalob3Zlcm1vZGWnY2xvc2VzdK1wYXBlcl9iZ2NvbG9ypXdoaXRlo2dlb4apc2hvd2xha2Vzw6hzaG93bGFuZMOpbGFuZGNvbG9ypyNFNUVDRjanYmdjb2xvcqV3aGl0ZaxzdWJ1bml0Y29sb3Kld2hpdGWpbGFrZWNvbG9ypXdoaXRlqmNvbG9yc2NhbGWDqnNlcXVlbnRpYWyaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGpZGl2ZXJnaW5nm5LKAAAAAKcjOGUwMTUykso9zMzNpyNjNTFiN2SSyj5MzM2nI2RlNzdhZZLKPpmZmqcjZjFiNmRhkso+zMzNpyNmZGUwZWaSyj8AAACnI2Y3ZjdmN5LKPxmZmqcjZTZmNWQwkso/MzMzpyNiOGUxODaSyj9MzM2nIzdmYmM0MZLKP2ZmZqcjNGQ5MjIxkso/gAAApyMyNzY0MTmvc2VxdWVudGlhbG1pbnVzmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxpXlheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Za1zaGFwZWRlZmF1bHRzgaRsaW5lgaVjb2xvcqcjMmEzZjVmqmhvdmVybGFiZWyBpWFsaWdupGxlZnSmbWFwYm94gaVzdHlsZaVsaWdodKVwb2xhcoOrYW5ndWxhcmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqpyYWRpYWxheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0Za9hdXRvdHlwZW51bWJlcnOmc3RyaWN0pGZvbnSBpWNvbG9ypyMyYTNmNWandGVybmFyeYSlYWF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqVjYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWlYmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlsmFubm90YXRpb25kZWZhdWx0c4OpYXJyb3doZWFkygAAAACqYXJyb3d3aWR0aMo/gAAAqmFycm93Y29sb3KnIzJhM2Y1ZqxwbG90X2JnY29sb3KnI0U1RUNGNqV0aXRsZYGheMo9TMzNpXNjZW5lg6V4YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWlemF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXlheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0Zahjb2xvcndheZqnIzYzNmVmYacjRUY1NTNCpyMwMGNjOTanI2FiNjNmYacjRkZBMTVBpyMxOWQzZjOnI0ZGNjY5MqcjQjZFODgwpyNGRjk3RkanI0ZFQ0I1MqRkYXRh3gAZrnNjYXR0ZXJwb2xhcmdskYKkdHlwZa5zY2F0dGVycG9sYXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmY2FycGV0kYOlYmF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaR0eXBlpmNhcnBldKVhYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlrHNjYXR0ZXJwb2xhcpGCpHR5cGWsc2NhdHRlcnBvbGFypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKlwYXJjb29yZHORgqRsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpcGFyY29vcmRzp3NjYXR0ZXKRgqR0eXBlp3NjYXR0ZXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAsmhpc3RvZ3JhbTJkY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZbJoaXN0b2dyYW0yZGNvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMadjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2NvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVyY2FycGV0kYKkdHlwZa1zY2F0dGVyY2FycGV0pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZtZXNoM2SRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWmbWVzaDNkp3N1cmZhY2WRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnc3VyZmFjZapjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJtYXBib3iRgqR0eXBlrXNjYXR0ZXJtYXBib3imbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqnNjYXR0ZXJnZW+RgqR0eXBlqnNjYXR0ZXJnZW+mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqWhpc3RvZ3JhbZGCpHR5cGWpaGlzdG9ncmFtpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKNwaWWRgqR0eXBlo3BpZaphdXRvbWFyZ2luw6pjaG9yb3BsZXRokYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqmNob3JvcGxldGipaGVhdG1hcGdskYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqWhlYXRtYXBnbKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxo2JhcpGEpHR5cGWjYmFyp2Vycm9yX3mBpWNvbG9ypyMyYTNmNWanZXJyb3JfeIGlY29sb3KnIzJhM2Y1ZqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKdoZWF0bWFwkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2hlYXRtYXCqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1jb250b3VyY2FycGV0kYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlrWNvbnRvdXJjYXJwZXSldGFibGWRg6R0eXBlpXRhYmxlpmhlYWRlcoKkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0M4RDRFM6VjZWxsc4KkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0VCRjBGOKlzY2F0dGVyM2SRg6RsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpc2NhdHRlcjNkpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKhiYXJwb2xhcpGCpHR5cGWoYmFycG9sYXKmbWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACpc2NhdHRlcmdskYKkdHlwZalzY2F0dGVyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAq2hpc3RvZ3JhbTJkkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlq2hpc3RvZ3JhbTJkqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGuc2NhdHRlcnRlcm5hcnmRgqR0eXBlrnNjYXR0ZXJ0ZXJuYXJ5pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZsZWdlbmSFp3lhbmNob3KmYm90dG9tp3hhbmNob3KkbGVmdKF5yj+AAACrb3JpZW50YXRpb26haKF4ygAAAACleWF4aXODqWdyaWRjb2xvcqV3aGl0Za16ZXJvbGluZWNvbG9ypXdoaXRlqmZpeGVkcmFuZ2XCpGZvbnSBpWNvbG9ypGdyYXmldGl0bGWgrHBsb3RfYmdjb2xvcrByZ2IoMjI5LDIzNiwyNDYppm1hcmdpboShbMoAAAAAoWLKAAAAAKFyygAAAAChdMoAAAAApmNvbmZpZ4i2bW9kZUJhckJ1dHRvbnNUb1JlbW92ZZqkem9vbahzZWxlY3QyZKdsYXNzbzJkqWF1dG9TY2FsZaxyZXNldFNjYWxlMmSjcGFurXRhYmxlUm90YXRpb26zcmVzZXRDYW1lcmFMYXN0U2F2ZaZ6b29tSW6nem9vbU91dKtkaXNwbGF5bG9nb8K0dG9JbWFnZUJ1dHRvbk9wdGlvbnOBpmZvcm1hdKNzdmeoc2hvd0xpbmvCqGVkaXRhYmxlwqpyZXNwb25zaXZlw6pzdGF0aWNQbG90wqpzY3JvbGxab29tw6ZmcmFtZXOQpGRhdGGXiqpzaG93bGVnZW5kw6ZtYXJrZXKBpWNvbG9ypyM2MzZFRkGleGF4aXOheKF5xywXAACAfwAAAADKayjBymsowQAAAAAAAIB/AAAAAMprKEHKayhBAAAAAAAAgH+kdHlwZadzY2F0dGVypG5hbWWiR3ileWF4aXOheatsZWdlbmRncm91cKJHeK1ob3ZlcnRlbXBsYXRlvCgle3g6LjRmfSBtcywgJXt5Oi4yZn0gbVQvbSmheMcsFwAAgH9yUBY/clAWPwdlKUEHZSlBAACAfwdlKUEHZSlBhLL0QYSy9EEAAIB/iqpzaG93bGVnZW5kw6ZtYXJrZXKBpWNvbG9ypyNFRjU1M0KleGF4aXOheKF5xwwXAACAfwAAgH8AAIB/pHR5cGWnc2NhdHRlcqRuYW1lokd5pXlheGlzoXmrbGVnZW5kZ3JvdXCiR3mtaG92ZXJ0ZW1wbGF0ZbwoJXt4Oi40Zn0gbXMsICV7eTouMmZ9IG1UL20poXjHDBcAAIB/AACAfwAAgH+KqnNob3dsZWdlbmTDpm1hcmtlcoGlY29sb3KnIzAwQ0M5NqV4YXhpc6F4oXnHDBcAAIB/AACAfwAAgH+kdHlwZadzY2F0dGVypG5hbWWiR3qleWF4aXOheatsZWdlbmRncm91cKJHeq1ob3ZlcnRlbXBsYXRlvCgle3g6LjRmfSBtcywgJXt5Oi4yZn0gbVQvbSmheMcMFwAAgH8AAIB/AACAf4qqc2hvd2xlZ2VuZMOmbWFya2VygaVjb2xvcqcjQUI2M0ZBpXhheGlzoXihecccFwAAAAAAACBBAAAgQQAAAAAAAIB/AACAfwAAgH+kdHlwZadzY2F0dGVypG5hbWWnfEIxfF9BTaV5YXhpc6F5q2xlZ2VuZGdyb3Vwp3xCMXxfQU2taG92ZXJ0ZW1wbGF0ZbsoJXt4Oi40Zn0gbXMsICV7eTouMmZ9IM68VCmheMccFwAAAAAAAAAAclAWP3JQFj8AAIB/AACAfwAAgH+MqnNob3dsZWdlbmTDpXhheGlzoXindmlzaWJsZapsZWdlbmRvbmx5pG5hbWWo4oigQjFfQU2kdGV4dMccFwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD+leWF4aXOheatsZWdlbmRncm91cKjiiKBCMV9BTaZtYXJrZXKBpWNvbG9ypyNGRkExNUGhecccFwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH+kdHlwZadzY2F0dGVyrWhvdmVydGVtcGxhdGXZIigle3g6LjRmfSBtcywg4oigQjE6ICV7eTouNGZ9IHJhZCmheMccFwAAAAAAAAAAclAWP3JQFj8AAIB/AACAfwAAgH+NqnNob3dsZWdlbmTDpXhheGlzoXindmlzaWJsZapsZWdlbmRvbmx5pG5hbWWlQjFfRk2kdGV4dMccFwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD+leWF4aXOheatsZWdlbmRncm91cKVCMV9GTaZtYXJrZXKBpWNvbG9ypyNBQjYzRkGkbGluZYGkZGFzaKNkb3ShecccFwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH+kdHlwZadzY2F0dGVyrWhvdmVydGVtcGxhdGXZIigle3g6LjRmfSBtcywgQjFfRk06ICV7eTouNGZ9IGtIeimheMccFwAAAAAAAAAAclAWP3JQFj8AAIB/AACAfwAAgH+LqnNob3dsZWdlbmTDpG1vZGWkbGluZaV4YXhpc6F4pG5hbWWjQURDpXlheGlzoXmrbGVnZW5kZ3JvdXCjQURDpm1hcmtlcoGlY29sb3KnIzE5RDNGM6F5xxwXAACAfwAAgH8AAAAAAACAPwAAgD8AAAAAAACAf6R0eXBlp3NjYXR0ZXKtaG92ZXJ0ZW1wbGF0ZbUoJXt4Oi40Zn0gbXMsICV7eTppfSmheMccFwAAgH8AAIB/B2UpQQdlKUGEsvRBhLL0QQAAgH/ZNTdiY2MwNWIwLTgxZGEtMTFlZi0yMDQwLTM1ODVjOWI0OTU0Zi8yZjJkMjA4NjVlNGNhOGRihKZsYXlvdXSMpXhheGlzhKlncmlkY29sb3Kld2hpdGWldGl0bGWBpHRleHSheK16ZXJvbGluZWNvbG9ypXdoaXRlqWNvbnN0cmFpbqZkb21haW6nbW9kZWJhcoSlY29sb3KkZ3JheathY3RpdmVjb2xvcrByZ2IoMjI5LDIzNiwyNDYpp2JnY29sb3KtcmdiYSgwLDAsMCwwKatvcmllbnRhdGlvbqForXBhcGVyX2JnY29sb3KtcmdiYSgwLDAsMCwwKalob3Zlcm1vZGWnY2xvc2VzdKh0ZW1wbGF0ZYKmbGF5b3V03gATqWNvbG9yYXhpc4GoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKV4YXhpc4epZ3JpZGNvbG9ypXdoaXRlrXplcm9saW5ld2lkdGjKQAAAAKV0aXRsZYGoc3RhbmRvZmbKQXAAAKV0aWNrc6CtemVyb2xpbmVjb2xvcqV3aGl0ZaphdXRvbWFyZ2luw6lsaW5lY29sb3Kld2hpdGWpaG92ZXJtb2Rlp2Nsb3Nlc3StcGFwZXJfYmdjb2xvcqV3aGl0ZaNnZW+GqXNob3dsYWtlc8Ooc2hvd2xhbmTDqWxhbmRjb2xvcqcjRTVFQ0Y2p2JnY29sb3Kld2hpdGWsc3VidW5pdGNvbG9ypXdoaXRlqWxha2Vjb2xvcqV3aGl0Zapjb2xvcnNjYWxlg6pzZXF1ZW50aWFsmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxqWRpdmVyZ2luZ5uSygAAAACnIzhlMDE1MpLKPczMzacjYzUxYjdkkso+TMzNpyNkZTc3YWWSyj6ZmZqnI2YxYjZkYZLKPszMzacjZmRlMGVmkso/AAAApyNmN2Y3ZjeSyj8ZmZqnI2U2ZjVkMJLKPzMzM6cjYjhlMTg2kso/TMzNpyM3ZmJjNDGSyj9mZmanIzRkOTIyMZLKP4AAAKcjMjc2NDE5r3NlcXVlbnRpYWxtaW51c5qSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMaV5YXhpc4epZ3JpZGNvbG9ypXdoaXRlrXplcm9saW5ld2lkdGjKQAAAAKV0aXRsZYGoc3RhbmRvZmbKQXAAAKV0aWNrc6CtemVyb2xpbmVjb2xvcqV3aGl0ZaphdXRvbWFyZ2luw6lsaW5lY29sb3Kld2hpdGWtc2hhcGVkZWZhdWx0c4GkbGluZYGlY29sb3KnIzJhM2Y1Zqpob3ZlcmxhYmVsgaVhbGlnbqRsZWZ0pm1hcGJveIGlc3R5bGWlbGlnaHSlcG9sYXKDq2FuZ3VsYXJheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZadiZ2NvbG9ypyNFNUVDRjaqcmFkaWFsYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWvYXV0b3R5cGVudW1iZXJzpnN0cmljdKRmb250gaVjb2xvcqcjMmEzZjVmp3Rlcm5hcnmEpWFheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZadiZ2NvbG9ypyNFNUVDRjalY2F4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlpWJheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZbJhbm5vdGF0aW9uZGVmYXVsdHODqWFycm93aGVhZMoAAAAAqmFycm93d2lkdGjKP4AAAKphcnJvd2NvbG9ypyMyYTNmNWascGxvdF9iZ2NvbG9ypyNFNUVDRjaldGl0bGWBoXjKPUzMzaVzY2VuZYOleGF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXpheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0ZaV5YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWoY29sb3J3YXmapyM2MzZlZmGnI0VGNTUzQqcjMDBjYzk2pyNhYjYzZmGnI0ZGQTE1QacjMTlkM2YzpyNGRjY2OTKnI0I2RTg4MKcjRkY5N0ZGpyNGRUNCNTKkZGF0Yd4AGa5zY2F0dGVycG9sYXJnbJGCpHR5cGWuc2NhdHRlcnBvbGFyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApmNhcnBldJGDpWJheGlzhalncmlkY29sb3Kld2hpdGWsZW5kbGluZWNvbG9ypyMyYTNmNWaubWlub3JncmlkY29sb3Kld2hpdGWuc3RhcnRsaW5lY29sb3KnIzJhM2Y1ZqlsaW5lY29sb3Kld2hpdGWkdHlwZaZjYXJwZXSlYWF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaxzY2F0dGVycG9sYXKRgqR0eXBlrHNjYXR0ZXJwb2xhcqZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACpcGFyY29vcmRzkYKkbGluZYGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqXBhcmNvb3Jkc6dzY2F0dGVykYKkdHlwZadzY2F0dGVypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAALJoaXN0b2dyYW0yZGNvbnRvdXKRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWyaGlzdG9ncmFtMmRjb250b3VyqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGnY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadjb250b3VyqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtc2NhdHRlcmNhcnBldJGCpHR5cGWtc2NhdHRlcmNhcnBldKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmbWVzaDNkkYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlpm1lc2gzZKdzdXJmYWNlkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp3N1cmZhY2WqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVybWFwYm94kYKkdHlwZa1zY2F0dGVybWFwYm94pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKpzY2F0dGVyZ2VvkYKkdHlwZapzY2F0dGVyZ2Vvpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKloaXN0b2dyYW2RgqR0eXBlqWhpc3RvZ3JhbaZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACjcGllkYKkdHlwZaNwaWWqYXV0b21hcmdpbsOqY2hvcm9wbGV0aJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZapjaG9yb3BsZXRoqWhlYXRtYXBnbJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZaloZWF0bWFwZ2yqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMaNiYXKRhKR0eXBlo2JhcqdlcnJvcl95gaVjb2xvcqcjMmEzZjVmp2Vycm9yX3iBpWNvbG9ypyMyYTNmNWambWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACnaGVhdG1hcJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadoZWF0bWFwqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtY29udG91cmNhcnBldJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZa1jb250b3VyY2FycGV0pXRhYmxlkYOkdHlwZaV0YWJsZaZoZWFkZXKCpGxpbmWBpWNvbG9ypXdoaXRlpGZpbGyBpWNvbG9ypyNDOEQ0RTOlY2VsbHOCpGxpbmWBpWNvbG9ypXdoaXRlpGZpbGyBpWNvbG9ypyNFQkYwRjipc2NhdHRlcjNkkYOkbGluZYGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqXNjYXR0ZXIzZKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACoYmFycG9sYXKRgqR0eXBlqGJhcnBvbGFypm1hcmtlcoGkbGluZYKlY29sb3KnI0U1RUNGNqV3aWR0aMo/AAAAqXNjYXR0ZXJnbJGCpHR5cGWpc2NhdHRlcmdspm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKtoaXN0b2dyYW0yZJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZatoaXN0b2dyYW0yZKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrnNjYXR0ZXJ0ZXJuYXJ5kYKkdHlwZa5zY2F0dGVydGVybmFyeaZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmaGVpZ2h0ykQWAACleWF4aXOEqWdyaWRjb2xvcqV3aGl0ZatzY2FsZWFuY2hvcqF4pXRpdGxlgaR0ZXh0oXmtemVyb2xpbmVjb2xvcqV3aGl0ZaRmb250gaVjb2xvcqRncmF5pXNjZW5lhaV4YXhpc4apZ3JpZGNvbG9ypXdoaXRlr2JhY2tncm91bmRjb2xvcrByZ2IoMjI5LDIzNiwyNDYppXRpdGxloXilcmFuZ2XXF83MzL3NzMw9qnRpY2tzdWZmaXijIGNtrXplcm9saW5lY29sb3Kld2hpdGWrYXNwZWN0cmF0aW+DoXnKP4AAAKF6yj+AAACheMo/gAAApXlheGlzhqlncmlkY29sb3Kld2hpdGWvYmFja2dyb3VuZGNvbG9ysHJnYigyMjksMjM2LDI0NimldGl0bGWheaVyYW5nZdcXzczMvc3MzD2qdGlja3N1ZmZpeKMgY22temVyb2xpbmVjb2xvcqV3aGl0ZaV6YXhpc4apZ3JpZGNvbG9ypXdoaXRlr2JhY2tncm91bmRjb2xvcrByZ2IoMjI5LDIzNiwyNDYppXRpdGxloXqlcmFuZ2XXF83MzL3NzMw9qnRpY2tzdWZmaXijIGNtrXplcm9saW5lY29sb3Kld2hpdGWqYXNwZWN0bW9kZaZtYW51YWyldGl0bGWpc3BpbnM6IFQxrHBsb3RfYmdjb2xvcrByZ2IoMjI5LDIzNiwyNDYppm1hcmdpboShbMoAAAAAoWLKQkgAAKFyygAAAAChdMpCSAAApmNvbmZpZ4i2bW9kZUJhckJ1dHRvbnNUb1JlbW92ZZakem9vbaNwYW6tdGFibGVSb3RhdGlvbrVyZXNldENhbWVyYUxhc3RTYXZlM2Stb3JiaXRSb3RhdGlvbrRyZXNldENhbWVyYURlZmF1bHQzZKtkaXNwbGF5bG9nb8K0dG9JbWFnZUJ1dHRvbk9wdGlvbnOBpmZvcm1hdKNzdmeoc2hvd0xpbmvCqGVkaXRhYmxlwqpyZXNwb25zaXZlw6pzdGF0aWNQbG90wqpzY3JvbGxab29tw6ZmcmFtZXOQpGRhdGGRiKZtYXJrZXKHpWNvbG9yx1AXAAD6QwAA+kMAAPpDAAD6QwAA+kMAAPpDAAD6QwAA+kMAAPpDAAD6QwAA+kMAAPpDAAD6QwAA+kMAAPpDAAD6QwAA+kMAAPpDAAD6QwAA+kOoY29sb3JiYXKCpXRpdGxlolQxqnRpY2tzdWZmaXijIG1zpGNtaW7KAAAAAKpjb2xvcnNjYWxl3AqMksoAAAAAqnJnYigwLDAsMCmSyjnCQLCqcmdiKDAsMCwwKZLKOkJAsKpyZ2IoMCwwLDApkso6kbCEqnJnYigwLDAsMCmSyjrCQLCqcmdiKDAsMCwwKZLKOvLQ3KpyZ2IoMCwwLDApkso7EbCEqnJnYigwLDAsMCmSyjsp+JqqcmdiKDAsMCwwKZLKO0JAsKpyZ2IoMCwwLDApkso7WojGqnJnYigwLDAsMCmSyjty0NyqcmdiKDAsMCwwKZLKO4WMeapyZ2IoMCwwLDApkso7kbCEqnJnYigwLDAsMCmSyjud1I+qcmdiKDAsMCwwKZLKO6n4mqpyZ2IoMCwwLDApkso7thylqnJnYigwLDAsMCmSyjvCQLCqcmdiKDAsMCwwKZLKO85ku6pyZ2IoMCwwLDApkso72ojGqnJnYigwLDAsMCmSyjvmrNGqcmdiKDAsMCwwKZLKO/LQ3KpyZ2IoMCwwLDApkso7/vTnqnJnYigwLDAsMCmSyjwFjHmqcmdiKDAsMCwwKZLKPAuef6pyZ2IoMCwwLDApkso8EbCEqnJnYigwLDAsMCmSyjwXwoqqcmdiKDAsMCwwKZLKPB3Uj6pyZ2IoMCwwLDApkso8I+aVqnJnYigwLDAsMCmSyjwp+JqqcmdiKDAsMCwwKZLKPDAKoKpyZ2IoMCwwLDApkso8NhylqnJnYigwLDAsMCmSyjw8LquqcmdiKDAsMCwwKZLKPEJAsKpyZ2IoMCwwLDApkso8SFK2qnJnYigwLDAsMCmSyjxOZLuqcmdiKDAsMCwwKZLKPFR2wapyZ2IoMCwwLDApkso8WojGqnJnYigwLDAsMCmSyjxgmsyqcmdiKDAsMCwwKZLKPGas0apyZ2IoMCwwLDApkso8bL7XqnJnYigwLDAsMCmSyjxy0NyqcmdiKDAsMCwwKZLKPHji4qpyZ2IoMCwwLDApkso8fvTnqnJnYigwLDAsMCmSyjyCg3aqcmdiKDAsMCwwKZLKPIWMeapyZ2IoMCwwLDApkso8iJV8qnJnYigwLDAsMCmSyjyLnn+qcmdiKDAsMCwwKZLKPI6ngapyZ2IoMCwwLDApkso8kbCEqnJnYigwLDAsMCmSyjyUuYeqcmdiKDAsMCwwKZLKPJfCiqpyZ2IoMCwwLDApkso8msuMqnJnYigwLDAsMCmSyjyd1I+qcmdiKDAsMCwwKZLKPKDdkqpyZ2IoMCwwLDApkso8o+aVqnJnYigwLDAsMCmSyjym75eqcmdiKDAsMCwwKZLKPKn4mqpyZ2IoMCwwLDApkso8rQGdqnJnYigwLDAsMCmSyjywCqCqcmdiKDAsMCwwKZLKPLMToqpyZ2IoMCwwLDApkso8thylqnJnYigwLDAsMCmSyjy5JaiqcmdiKDAsMCwxKZLKPLwuq6pyZ2IoMCwwLDEpkso8vzetqnJnYigwLDAsMSmSyjzCQLCqcmdiKDAsMCwxKZLKPMVJs6pyZ2IoMCwwLDEpkso8yFK2qnJnYigwLDAsMSmSyjzLW7iqcmdiKDAsMCwxKZLKPM5ku6pyZ2IoMCwwLDEpkso80W2+qnJnYigwLDAsMSmSyjzUdsGqcmdiKDAsMCwxKZLKPNd/w6pyZ2IoMCwwLDEpkso82ojGqnJnYigwLDAsMSmSyjzdkcmqcmdiKDAsMCwyKZLKPOCazKpyZ2IoMSwwLDIpkso846POqnJnYigxLDAsMimSyjzmrNGqcmdiKDEsMSwyKZLKPOm11KpyZ2IoMSwxLDIpkso87L7XqnJnYigxLDEsMimSyjzvx9mqcmdiKDEsMSwyKZLKPPLQ3KpyZ2IoMSwxLDIpkso89dnfqnJnYigxLDEsMymSyjz44uKqcmdiKDEsMSwzKZLKPPvr5KpyZ2IoMSwxLDMpkso8/vTnqnJnYigxLDEsMymSyj0A/vWqcmdiKDEsMSwzKZLKPQKDdqpyZ2IoMSwxLDMpkso9BAf4qnJnYigxLDEsMymSyj0FjHmqcmdiKDEsMSw0KZLKPQcQ+qpyZ2IoMSwxLDQpkso9CJV8qnJnYigxLDEsNCmSyj0KGf2qcmdiKDIsMSw0KZLKPQuef6pyZ2IoMiwxLDQpkso9DSMAqnJnYigyLDEsNCmSyj0Op4GqcmdiKDIsMSw1KZLKPRAsA6pyZ2IoMiwxLDUpkso9EbCEqnJnYigyLDIsNSmSyj0TNQWqcmdiKDIsMiw1KZLKPRS5h6pyZ2IoMiwyLDUpkso9Fj4IqnJnYigyLDIsNSmSyj0XwoqqcmdiKDIsMiw2KZLKPRlHC6pyZ2IoMiwyLDYpkso9GsuMqnJnYigyLDIsNimSyj0cUA6qcmdiKDMsMiw2KZLKPR3Uj6pyZ2IoMywyLDYpkso9H1kQqnJnYigzLDIsNymSyj0g3ZKqcmdiKDMsMiw3KZLKPSJiE6pyZ2IoMywyLDcpkso9I+aVqnJnYigzLDIsNymSyj0laxaqcmdiKDMsMiw4KZLKPSbvl6pyZ2IoMywyLDgpkso9KHQZqnJnYigzLDMsOCmSyj0p+JqqcmdiKDMsMyw4KZLKPSt9G6pyZ2IoNCwzLDkpkso9LQGdqnJnYig0LDMsOSmSyj0uhh6qcmdiKDQsMyw5KZLKPTAKoKpyZ2IoNCwzLDkpkso9MY8hq3JnYig0LDMsMTApkso9MxOiq3JnYig0LDMsMTApkso9NJgkq3JnYig0LDMsMTApkso9Nhylq3JnYig0LDMsMTApkso9N6Emq3JnYig1LDMsMTEpkso9OSWoq3JnYig1LDMsMTEpkso9Oqopq3JnYig1LDQsMTEpkso9PC6rq3JnYig1LDQsMTEpkso9PbMsq3JnYig1LDQsMTIpkso9Pzetq3JnYig1LDQsMTIpkso9QLwvq3JnYig1LDQsMTIpkso9QkCwq3JnYig2LDQsMTIpkso9Q8Uxq3JnYig2LDQsMTMpkso9RUmzq3JnYig2LDQsMTMpkso9Rs40q3JnYig2LDQsMTMpkso9SFK2q3JnYig2LDQsMTQpkso9Sdc3q3JnYig2LDQsMTQpkso9S1u4q3JnYig2LDQsMTQpkso9TOA6q3JnYig3LDUsMTUpkso9TmS7q3JnYig3LDUsMTUpkso9T+k8q3JnYig3LDUsMTUpkso9UW2+q3JnYig3LDUsMTUpkso9UvI/q3JnYig3LDUsMTYpkso9VHbBq3JnYig3LDUsMTYpkso9VftCq3JnYig4LDUsMTYpkso9V3/Dq3JnYig4LDUsMTcpkso9WQRFq3JnYig4LDUsMTcpkso9WojGq3JnYig4LDUsMTcpkso9XA1Hq3JnYig4LDUsMTgpkso9XZHJq3JnYig4LDYsMTgpkso9XxZKq3JnYig5LDYsMTgpkso9YJrMq3JnYig5LDYsMTkpkso9Yh9Nq3JnYig5LDYsMTkpkso9Y6POq3JnYig5LDYsMTkpkso9ZShQq3JnYig5LDYsMjApkso9ZqzRrHJnYigxMCw2LDIwKZLKPWgxUqxyZ2IoMTAsNiwyMCmSyj1ptdSscmdiKDEwLDYsMjEpkso9azpVrHJnYigxMCw2LDIxKZLKPWy+16xyZ2IoMTAsNywyMSmSyj1uQ1iscmdiKDEwLDcsMjIpkso9b8fZrHJnYigxMSw3LDIyKZLKPXFMW6xyZ2IoMTEsNywyMimSyj1y0NyscmdiKDExLDcsMjMpkso9dFVdrHJnYigxMSw3LDIzKZLKPXXZ36xyZ2IoMTEsNywyMymSyj13XmCscmdiKDEyLDcsMjQpkso9eOLirHJnYigxMiw3LDI0KZLKPXpnY6xyZ2IoMTIsNywyNCmSyj176+SscmdiKDEyLDgsMjUpkso9fXBmrHJnYigxMyw4LDI1KZLKPX7056xyZ2IoMTMsOCwyNSmSyj2APLSscmdiKDEzLDgsMjYpkso9gP71rHJnYigxMyw4LDI2KZLKPYHBNqxyZ2IoMTMsOCwyNimSyj2Cg3ascmdiKDE0LDgsMjcpkso9g0W3rHJnYigxNCw4LDI3KZLKPYQH+KxyZ2IoMTQsOCwyNymSyj2EyjiscmdiKDE0LDgsMjgpkso9hYx5rHJnYigxNSw5LDI4KZLKPYZOuqxyZ2IoMTUsOSwyOCmSyj2HEPqscmdiKDE1LDksMjkpkso9h9M7rHJnYigxNSw5LDI5KZLKPYiVfKxyZ2IoMTYsOSwzMCmSyj2JV7yscmdiKDE2LDksMzApkso9ihn9rHJnYigxNiw5LDMwKZLKPYrcPqxyZ2IoMTYsOSwzMSmSyj2Lnn+scmdiKDE3LDksMzEpkso9jGC/rXJnYigxNywxMCwzMSmSyj2NIwCtcmdiKDE3LDEwLDMyKZLKPY3lQa1yZ2IoMTcsMTAsMzIpkso9jqeBrXJnYigxNywxMCwzMimSyj2PacKtcmdiKDE4LDEwLDMzKZLKPZAsA61yZ2IoMTgsMTAsMzMpkso9kO5DrXJnYigxOCwxMCwzMymSyj2RsIStcmdiKDE5LDEwLDM0KZLKPZJyxa1yZ2IoMTksMTAsMzQpkso9kzUFrXJnYigxOSwxMSwzNSmSyj2T90atcmdiKDE5LDExLDM1KZLKPZS5h61yZ2IoMjAsMTEsMzUpkso9lXvHrXJnYigyMCwxMSwzNimSyj2WPgitcmdiKDIwLDExLDM2KZLKPZcASa1yZ2IoMjAsMTEsMzYpkso9l8KKrXJnYigyMSwxMSwzNymSyj2YhMqtcmdiKDIxLDExLDM3KZLKPZlHC61yZ2IoMjEsMTEsMzcpkso9mglMrXJnYigyMSwxMSwzOCmSyj2ay4ytcmdiKDIyLDEyLDM4KZLKPZuNza1yZ2IoMjIsMTIsMzgpkso9nFAOrXJnYigyMiwxMiwzOSmSyj2dEk6tcmdiKDIzLDEyLDM5KZLKPZ3Uj61yZ2IoMjMsMTIsNDApkso9npbQrXJnYigyMywxMiw0MCmSyj2fWRCtcmdiKDIzLDEyLDQwKZLKPaAbUa1yZ2IoMjQsMTIsNDEpkso9oN2SrXJnYigyNCwxMiw0MSmSyj2hn9KtcmdiKDI0LDEzLDQxKZLKPaJiE61yZ2IoMjUsMTMsNDIpkso9oyRUrXJnYigyNSwxMyw0MimSyj2j5pWtcmdiKDI1LDEzLDQyKZLKPaSo1a1yZ2IoMjUsMTMsNDMpkso9pWsWrXJnYigyNiwxMyw0MymSyj2mLVetcmdiKDI2LDEzLDQzKZLKPabvl61yZ2IoMjYsMTMsNDQpkso9p7HYrXJnYigyNywxMyw0NCmSyj2odBmtcmdiKDI3LDEzLDQ1KZLKPak2Wa1yZ2IoMjcsMTQsNDUpkso9qfiarXJnYigyOCwxNCw0NSmSyj2qututcmdiKDI4LDE0LDQ2KZLKPat9G61yZ2IoMjgsMTQsNDYpkso9rD9crXJnYigyOCwxNCw0NimSyj2tAZ2tcmdiKDI5LDE0LDQ3KZLKPa3D3a1yZ2IoMjksMTQsNDcpkso9roYerXJnYigyOSwxNCw0NymSyj2vSF+tcmdiKDMwLDE0LDQ4KZLKPbAKoK1yZ2IoMzAsMTUsNDgpkso9sMzgrXJnYigzMCwxNSw0OCmSyj2xjyGtcmdiKDMxLDE1LDQ5KZLKPbJRYq1yZ2IoMzEsMTUsNDkpkso9sxOirXJnYigzMSwxNSw0OSmSyj2z1eOtcmdiKDMyLDE1LDUwKZLKPbSYJK1yZ2IoMzIsMTUsNTApkso9tVpkrXJnYigzMiwxNSw1MCmSyj22HKWtcmdiKDMzLDE1LDUxKZLKPbbe5q1yZ2IoMzMsMTUsNTEpkso9t6EmrXJnYigzMywxNiw1MSmSyj24Y2etcmdiKDM0LDE2LDUyKZLKPbklqK1yZ2IoMzQsMTYsNTIpkso9ueforXJnYigzNCwxNiw1MimSyj26qimtcmdiKDM1LDE2LDUzKZLKPbtsaq1yZ2IoMzUsMTYsNTMpkso9vC6rrXJnYigzNSwxNiw1MymSyj288OutcmdiKDM2LDE2LDU0KZLKPb2zLK1yZ2IoMzYsMTYsNTQpkso9vnVtrXJnYigzNiwxNiw1NCmSyj2/N62tcmdiKDM3LDE3LDU1KZLKPb/57q1yZ2IoMzcsMTcsNTUpkso9wLwvrXJnYigzNywxNyw1NSmSyj3Bfm+tcmdiKDM4LDE3LDU2KZLKPcJAsK1yZ2IoMzgsMTcsNTYpkso9wwLxrXJnYigzOCwxNyw1NimSyj3DxTGtcmdiKDM5LDE3LDU3KZLKPcSHcq1yZ2IoMzksMTcsNTcpkso9xUmzrXJnYigzOSwxNyw1NymSyj3GC/OtcmdiKDQwLDE3LDU4KZLKPcbONK1yZ2IoNDAsMTgsNTgpkso9x5B1rXJnYig0MCwxOCw1OCmSyj3IUratcmdiKDQxLDE4LDU5KZLKPckU9q1yZ2IoNDEsMTgsNTkpkso9ydc3rXJnYig0MSwxOCw1OSmSyj3KmXitcmdiKDQyLDE4LDU5KZLKPctbuK1yZ2IoNDIsMTgsNjApkso9zB35rXJnYig0MiwxOCw2MCmSyj3M4DqtcmdiKDQzLDE4LDYwKZLKPc2ieq1yZ2IoNDMsMTgsNjEpkso9zmS7rXJnYig0MywxOSw2MSmSyj3PJvytcmdiKDQ0LDE5LDYxKZLKPc/pPK1yZ2IoNDQsMTksNjIpkso90Kt9rXJnYig0NCwxOSw2MimSyj3Rbb6tcmdiKDQ1LDE5LDYyKZLKPdIv/q1yZ2IoNDUsMTksNjMpkso90vI/rXJnYig0NSwxOSw2MymSyj3TtICtcmdiKDQ2LDE5LDYzKZLKPdR2wa1yZ2IoNDYsMTksNjMpkso91TkBrXJnYig0NywxOSw2NCmSyj3V+0KtcmdiKDQ3LDE5LDY0KZLKPda9g61yZ2IoNDcsMjAsNjQpkso913/DrXJnYig0OCwyMCw2NSmSyj3YQgStcmdiKDQ4LDIwLDY1KZLKPdkERa1yZ2IoNDgsMjAsNjUpkso92caFrXJnYig0OSwyMCw2NimSyj3aiMatcmdiKDQ5LDIwLDY2KZLKPdtLB61yZ2IoNDksMjAsNjYpkso93A1HrXJnYig1MCwyMCw2NimSyj3cz4itcmdiKDUwLDIwLDY3KZLKPd2Rya1yZ2IoNTAsMjAsNjcpkso93lQJrXJnYig1MSwyMCw2NymSyj3fFkqtcmdiKDUxLDIxLDY4KZLKPd/Yi61yZ2IoNTIsMjEsNjgpkso94JrMrXJnYig1MiwyMSw2OCmSyj3hXQytcmdiKDUyLDIxLDY4KZLKPeIfTa1yZ2IoNTMsMjEsNjkpkso94uGOrXJnYig1MywyMSw2OSmSyj3jo86tcmdiKDUzLDIxLDY5KZLKPeRmD61yZ2IoNTQsMjEsNjkpkso95ShQrXJnYig1NCwyMSw3MCmSyj3l6pCtcmdiKDU0LDIxLDcwKZLKPeas0a1yZ2IoNTUsMjEsNzApkso9528SrXJnYig1NSwyMSw3MSmSyj3oMVKtcmdiKDU2LDIyLDcxKZLKPejzk61yZ2IoNTYsMjIsNzEpkso96bXUrXJnYig1NiwyMiw3MSmSyj3qeBStcmdiKDU3LDIyLDcyKZLKPes6Va1yZ2IoNTcsMjIsNzIpkso96/yWrXJnYig1NywyMiw3MimSyj3svtetcmdiKDU4LDIyLDcyKZLKPe2BF61yZ2IoNTgsMjIsNzMpkso97kNYrXJnYig1OCwyMiw3MymSyj3vBZmtcmdiKDU5LDIyLDczKZLKPe/H2a1yZ2IoNTksMjIsNzMpkso98IoarXJnYig2MCwyMiw3NCmSyj3xTFutcmdiKDYwLDIzLDc0KZLKPfIOm61yZ2IoNjAsMjMsNzQpkso98tDcrXJnYig2MSwyMyw3NCmSyj3zkx2tcmdiKDYxLDIzLDc1KZLKPfRVXa1yZ2IoNjEsMjMsNzUpkso99ReerXJnYig2MiwyMyw3NSmSyj312d+tcmdiKDYyLDIzLDc1KZLKPfacH61yZ2IoNjIsMjMsNzYpkso9915grXJnYig2MywyMyw3NimSyj34IKGtcmdiKDYzLDIzLDc2KZLKPfji4q1yZ2IoNjQsMjMsNzYpkso9+aUirXJnYig2NCwyMyw3NymSyj36Z2OtcmdiKDY0LDIzLDc3KZLKPfsppK1yZ2IoNjUsMjQsNzcpkso9++vkrXJnYig2NSwyNCw3NymSyj38riWtcmdiKDY1LDI0LDc4KZLKPf1wZq1yZ2IoNjYsMjQsNzgpkso9/jKmrXJnYig2NiwyNCw3OCmSyj3+9OetcmdiKDY3LDI0LDc4KZLKPf+3KK1yZ2IoNjcsMjQsNzkpkso+ADy0rXJnYig2NywyNCw3OSmSyj4AndWtcmdiKDY4LDI0LDc5KZLKPgD+9a1yZ2IoNjgsMjQsNzkpkso+AWAVrXJnYig2OCwyNCw4MCmSyj4BwTatcmdiKDY5LDI0LDgwKZLKPgIiVq1yZ2IoNjksMjQsODApkso+AoN2rXJnYig2OSwyNCw4MCmSyj4C5JetcmdiKDcwLDI1LDgwKZLKPgNFt61yZ2IoNzAsMjUsODEpkso+A6bXrXJnYig3MSwyNSw4MSmSyj4EB/itcmdiKDcxLDI1LDgxKZLKPgRpGK1yZ2IoNzEsMjUsODEpkso+BMo4rXJnYig3MiwyNSw4MimSyj4FK1mtcmdiKDcyLDI1LDgyKZLKPgWMea1yZ2IoNzIsMjUsODIpkso+Be2ZrXJnYig3MywyNSw4MimSyj4GTrqtcmdiKDczLDI1LDgyKZLKPgav2q1yZ2IoNzQsMjUsODMpkso+BxD6rXJnYig3NCwyNSw4MymSyj4HchutcmdiKDc0LDI1LDgzKZLKPgfTO61yZ2IoNzUsMjUsODMpkso+CDRbrXJnYig3NSwyNSw4MymSyj4IlXytcmdiKDc1LDI2LDg0KZLKPgj2nK1yZ2IoNzYsMjYsODQpkso+CVe8rXJnYig3NiwyNiw4NCmSyj4JuN2tcmdiKDc2LDI2LDg0KZLKPgoZ/a1yZ2IoNzcsMjYsODQpkso+CnsdrXJnYig3NywyNiw4NSmSyj4K3D6tcmdiKDc4LDI2LDg1KZLKPgs9Xq1yZ2IoNzgsMjYsODUpkso+C55/rXJnYig3OCwyNiw4NSmSyj4L/5+tcmdiKDc5LDI2LDg1KZLKPgxgv61yZ2IoNzksMjYsODYpkso+DMHgrXJnYig3OSwyNiw4NimSyj4NIwCtcmdiKDgwLDI2LDg2KZLKPg2EIK1yZ2IoODAsMjYsODYpkso+DeVBrXJnYig4MCwyNiw4NimSyj4ORmGtcmdiKDgxLDI2LDg3KZLKPg6nga1yZ2IoODEsMjYsODcpkso+DwiirXJnYig4MiwyNyw4NymSyj4PacKtcmdiKDgyLDI3LDg3KZLKPg/K4q1yZ2IoODIsMjcsODcpkso+ECwDrXJnYig4MywyNyw4OCmSyj4QjSOtcmdiKDgzLDI3LDg4KZLKPhDuQ61yZ2IoODMsMjcsODgpkso+EU9krXJnYig4NCwyNyw4OCmSyj4RsIStcmdiKDg0LDI3LDg4KZLKPhIRpK1yZ2IoODQsMjcsODgpkso+EnLFrXJnYig4NSwyNyw4OSmSyj4S0+WtcmdiKDg1LDI3LDg5KZLKPhM1Ba1yZ2IoODUsMjcsODkpkso+E5YmrXJnYig4NiwyNyw4OSmSyj4T90atcmdiKDg2LDI3LDg5KZLKPhRYZq1yZ2IoODcsMjcsODkpkso+FLmHrXJnYig4NywyNyw5MCmSyj4VGqetcmdiKDg3LDI3LDkwKZLKPhV7x61yZ2IoODgsMjcsOTApkso+FdzorXJnYig4OCwyOCw5MCmSyj4WPgitcmdiKDg4LDI4LDkwKZLKPhafKa1yZ2IoODksMjgsOTApkso+FwBJrXJnYig4OSwyOCw5MSmSyj4XYWmtcmdiKDg5LDI4LDkxKZLKPhfCiq1yZ2IoOTAsMjgsOTEpkso+GCOqrXJnYig5MCwyOCw5MSmSyj4YhMqtcmdiKDkwLDI4LDkxKZLKPhjl661yZ2IoOTEsMjgsOTEpkso+GUcLrXJnYig5MSwyOCw5MimSyj4ZqCutcmdiKDkxLDI4LDkyKZLKPhoJTK1yZ2IoOTIsMjgsOTIpkso+GmpsrXJnYig5MiwyOCw5MimSyj4ay4ytcmdiKDkyLDI4LDkyKZLKPhssra1yZ2IoOTMsMjgsOTIpkso+G43NrXJnYig5MywyOCw5MimSyj4b7u2tcmdiKDk0LDI4LDkzKZLKPhxQDq1yZ2IoOTQsMjgsOTMpkso+HLEurXJnYig5NCwyOCw5MymSyj4dEk6tcmdiKDk1LDI4LDkzKZLKPh1zb61yZ2IoOTUsMjgsOTMpkso+HdSPrXJnYig5NSwyOSw5MymSyj4eNa+tcmdiKDk2LDI5LDkzKZLKPh6W0K1yZ2IoOTYsMjksOTQpkso+HvfwrXJnYig5NiwyOSw5NCmSyj4fWRCtcmdiKDk3LDI5LDk0KZLKPh+6Ma1yZ2IoOTcsMjksOTQpkso+IBtRrXJnYig5NywyOSw5NCmSyj4gfHGtcmdiKDk4LDI5LDk0KZLKPiDdkq1yZ2IoOTgsMjksOTQpkso+IT6yrXJnYig5OCwyOSw5NSmSyj4hn9KtcmdiKDk5LDI5LDk1KZLKPiIA861yZ2IoOTksMjksOTUpkso+ImITrXJnYig5OSwyOSw5NSmSyj4iwzSucmdiKDEwMCwyOSw5NSmSyj4jJFSucmdiKDEwMCwyOSw5NSmSyj4jhXSucmdiKDEwMCwyOSw5NSmSyj4j5pWucmdiKDEwMSwyOSw5NimSyj4kR7WucmdiKDEwMSwyOSw5NimSyj4kqNWucmdiKDEwMSwyOSw5NimSyj4lCfaucmdiKDEwMiwyOSw5NimSyj4laxaucmdiKDEwMiwyOSw5NimSyj4lzDaucmdiKDEwMiwyOSw5NimSyj4mLVeucmdiKDEwMywyOSw5NimSyj4mjneucmdiKDEwMywyOSw5NimSyj4m75eucmdiKDEwMywzMCw5NimSyj4nULiucmdiKDEwNCwzMCw5NymSyj4nsdiucmdiKDEwNCwzMCw5NymSyj4oEviucmdiKDEwNCwzMCw5NymSyj4odBmucmdiKDEwNSwzMCw5NymSyj4o1TmucmdiKDEwNSwzMCw5NymSyj4pNlmucmdiKDEwNSwzMCw5NymSyj4pl3qucmdiKDEwNiwzMCw5NymSyj4p+JqucmdiKDEwNiwzMCw5NymSyj4qWbqucmdiKDEwNiwzMCw5OCmSyj4qutuucmdiKDEwNywzMCw5OCmSyj4rG/uucmdiKDEwNywzMCw5OCmSyj4rfRuucmdiKDEwNywzMCw5OCmSyj4r3jyucmdiKDEwOCwzMCw5OCmSyj4sP1yucmdiKDEwOCwzMCw5OCmSyj4soHyucmdiKDEwOCwzMCw5OCmSyj4tAZ2ucmdiKDEwOCwzMCw5OCmSyj4tYr2ucmdiKDEwOSwzMCw5OCmSyj4tw92ucmdiKDEwOSwzMCw5OCmSyj4uJP6ucmdiKDEwOSwzMCw5OSmSyj4uhh6ucmdiKDExMCwzMCw5OSmSyj4u5z+ucmdiKDExMCwzMCw5OSmSyj4vSF+ucmdiKDExMCwzMCw5OSmSyj4vqX+ucmdiKDExMSwzMCw5OSmSyj4wCqCucmdiKDExMSwzMCw5OSmSyj4wa8CucmdiKDExMSwzMCw5OSmSyj4wzOCucmdiKDExMiwzMCw5OSmSyj4xLgGucmdiKDExMiwzMCw5OSmSyj4xjyGucmdiKDExMiwzMCw5OSmSyj4x8EGvcmdiKDExMywzMCwxMDApkso+MlFir3JnYigxMTMsMzEsMTAwKZLKPjKygq9yZ2IoMTEzLDMxLDEwMCmSyj4zE6KvcmdiKDExMywzMSwxMDApkso+M3TDr3JnYigxMTQsMzEsMTAwKZLKPjPV469yZ2IoMTE0LDMxLDEwMCmSyj40NwOvcmdiKDExNCwzMSwxMDApkso+NJgkr3JnYigxMTUsMzEsMTAwKZLKPjT5RK9yZ2IoMTE1LDMxLDEwMCmSyj41WmSvcmdiKDExNSwzMSwxMDApkso+NbuFr3JnYigxMTYsMzEsMTAwKZLKPjYcpa9yZ2IoMTE2LDMxLDEwMCmSyj42fcWvcmdiKDExNiwzMSwxMDEpkso+Nt7mr3JnYigxMTcsMzEsMTAxKZLKPjdABq9yZ2IoMTE3LDMxLDEwMSmSyj43oSavcmdiKDExNywzMSwxMDEpkso+OAJHr3JnYigxMTcsMzEsMTAxKZLKPjhjZ69yZ2IoMTE4LDMxLDEwMSmSyj44xIevcmdiKDExOCwzMSwxMDEpkso+OSWor3JnYigxMTgsMzEsMTAxKZLKPjmGyK9yZ2IoMTE5LDMxLDEwMSmSyj455+ivcmdiKDExOSwzMSwxMDEpkso+OkkJr3JnYigxMTksMzEsMTAxKZLKPjqqKa9yZ2IoMTE5LDMxLDEwMSmSyj47C0qvcmdiKDEyMCwzMSwxMDEpkso+O2xqr3JnYigxMjAsMzEsMTAxKZLKPjvNiq9yZ2IoMTIwLDMxLDEwMimSyj48LquvcmdiKDEyMSwzMSwxMDIpkso+PI/Lr3JnYigxMjEsMzEsMTAyKZLKPjzw669yZ2IoMTIxLDMxLDEwMimSyj49UgyvcmdiKDEyMiwzMSwxMDIpkso+PbMsr3JnYigxMjIsMzEsMTAyKZLKPj4UTK9yZ2IoMTIyLDMxLDEwMimSyj4+dW2vcmdiKDEyMiwzMSwxMDIpkso+PtaNr3JnYigxMjMsMzEsMTAyKZLKPj83ra9yZ2IoMTIzLDMxLDEwMimSyj4/mM6vcmdiKDEyMywzMSwxMDIpkso+P/nur3JnYigxMjQsMzEsMTAyKZLKPkBbDq9yZ2IoMTI0LDMxLDEwMimSyj5AvC+vcmdiKDEyNCwzMSwxMDIpkso+QR1Pr3JnYigxMjQsMzIsMTAyKZLKPkF+b69yZ2IoMTI1LDMyLDEwMimSyj5B35CvcmdiKDEyNSwzMiwxMDMpkso+QkCwr3JnYigxMjUsMzIsMTAzKZLKPkKh0K9yZ2IoMTI1LDMyLDEwMymSyj5DAvGvcmdiKDEyNiwzMiwxMDMpkso+Q2QRr3JnYigxMjYsMzIsMTAzKZLKPkPFMa9yZ2IoMTI2LDMyLDEwMymSyj5EJlKvcmdiKDEyNywzMiwxMDMpkso+RIdyr3JnYigxMjcsMzIsMTAzKZLKPkTokq9yZ2IoMTI3LDMyLDEwMymSyj5FSbOvcmdiKDEyNywzMiwxMDMpkso+RarTr3JnYigxMjgsMzIsMTAzKZLKPkYL869yZ2IoMTI4LDMyLDEwMymSyj5GbRSvcmdiKDEyOCwzMiwxMDMpkso+Rs40r3JnYigxMjgsMzIsMTAzKZLKPkcvVa9yZ2IoMTI5LDMyLDEwMymSyj5HkHWvcmdiKDEyOSwzMiwxMDMpkso+R/GVr3JnYigxMjksMzIsMTAzKZLKPkhStq9yZ2IoMTMwLDMyLDEwMymSyj5Is9avcmdiKDEzMCwzMiwxMDMpkso+SRT2r3JnYigxMzAsMzIsMTAzKZLKPkl2F69yZ2IoMTMwLDMyLDEwMymSyj5J1zevcmdiKDEzMSwzMiwxMDMpkso+SjhXr3JnYigxMzEsMzIsMTAzKZLKPkqZeK9yZ2IoMTMxLDMyLDEwMymSyj5K+pivcmdiKDEzMSwzMiwxMDQpkso+S1u4r3JnYigxMzIsMzIsMTA0KZLKPku82a9yZ2IoMTMyLDMyLDEwNCmSyj5MHfmvcmdiKDEzMiwzMiwxMDQpkso+TH8Zr3JnYigxMzIsMzIsMTA0KZLKPkzgOq9yZ2IoMTMzLDMyLDEwNCmSyj5NQVqvcmdiKDEzMywzMiwxMDQpkso+TaJ6r3JnYigxMzMsMzIsMTA0KZLKPk4Dm69yZ2IoMTMzLDMyLDEwNCmSyj5OZLuvcmdiKDEzNCwzMiwxMDQpkso+TsXbr3JnYigxMzQsMzIsMTA0KZLKPk8m/K9yZ2IoMTM0LDMyLDEwNCmSyj5PiByvcmdiKDEzNCwzMiwxMDQpkso+T+k8r3JnYigxMzUsMzIsMTA0KZLKPlBKXa9yZ2IoMTM1LDMyLDEwNCmSyj5Qq32vcmdiKDEzNSwzMiwxMDQpkso+UQydr3JnYigxMzUsMzIsMTA0KZLKPlFtvq9yZ2IoMTM2LDMyLDEwNCmSyj5Rzt6vcmdiKDEzNiwzMiwxMDQpkso+Ui/+r3JnYigxMzYsMzIsMTA0KZLKPlKRH69yZ2IoMTM2LDMyLDEwNCmSyj5S8j+vcmdiKDEzNywzMiwxMDQpkso+U1Ngr3JnYigxMzcsMzIsMTA0KZLKPlO0gK9yZ2IoMTM3LDMyLDEwNCmSyj5UFaCvcmdiKDEzNywzMiwxMDQpkso+VHbBr3JnYigxMzgsMzIsMTA0KZLKPlTX4a9yZ2IoMTM4LDMyLDEwNCmSyj5VOQGvcmdiKDEzOCwzMiwxMDQpkso+VZoir3JnYigxMzgsMzMsMTA0KZLKPlX7Qq9yZ2IoMTM5LDMzLDEwNCmSyj5WXGKvcmdiKDEzOSwzMywxMDQpkso+Vr2Dr3JnYigxMzksMzMsMTA0KZLKPlceo69yZ2IoMTM5LDMzLDEwNCmSyj5Xf8OvcmdiKDE0MCwzMywxMDQpkso+V+Dkr3JnYigxNDAsMzMsMTA0KZLKPlhCBK9yZ2IoMTQwLDMzLDEwNCmSyj5YoySvcmdiKDE0MCwzMywxMDQpkso+WQRFr3JnYigxNDEsMzMsMTA0KZLKPlllZa9yZ2IoMTQxLDMzLDEwNCmSyj5ZxoWvcmdiKDE0MSwzMywxMDQpkso+Wiemr3JnYigxNDEsMzMsMTA0KZLKPlqIxq9yZ2IoMTQxLDMzLDEwNCmSyj5a6eavcmdiKDE0MiwzMywxMDQpkso+W0sHr3JnYigxNDIsMzMsMTA0KZLKPlusJ69yZ2IoMTQyLDMzLDEwNCmSyj5cDUevcmdiKDE0MiwzMywxMDQpkso+XG5or3JnYigxNDMsMzMsMTA0KZLKPlzPiK9yZ2IoMTQzLDMzLDEwNCmSyj5dMKivcmdiKDE0MywzMywxMDQpkso+XZHJr3JnYigxNDMsMzMsMTA0KZLKPl3y6a9yZ2IoMTQ0LDMzLDEwNCmSyj5eVAmvcmdiKDE0NCwzMywxMDQpkso+XrUqr3JnYigxNDQsMzMsMTA0KZLKPl8WSq9yZ2IoMTQ0LDMzLDEwNCmSyj5fd2uvcmdiKDE0NCwzMywxMDQpkso+X9iLr3JnYigxNDUsMzMsMTA0KZLKPmA5q69yZ2IoMTQ1LDMzLDEwNCmSyj5gmsyvcmdiKDE0NSwzMywxMDQpkso+YPvsr3JnYigxNDUsMzMsMTA0KZLKPmFdDK9yZ2IoMTQ1LDMzLDEwNCmSyj5hvi2vcmdiKDE0NiwzMywxMDQpkso+Yh9Nr3JnYigxNDYsMzMsMTA0KZLKPmKAba9yZ2IoMTQ2LDMzLDEwNCmSyj5i4Y6vcmdiKDE0NiwzMywxMDQpkso+Y0Kur3JnYigxNDcsMzMsMTA0KZLKPmOjzq9yZ2IoMTQ3LDMzLDEwNCmSyj5kBO+vcmdiKDE0NywzMywxMDQpkso+ZGYPr3JnYigxNDcsMzMsMTA0KZLKPmTHL69yZ2IoMTQ3LDMzLDEwNCmSyj5lKFCvcmdiKDE0OCwzMywxMDQpkso+ZYlwr3JnYigxNDgsMzMsMTA0KZLKPmXqkK9yZ2IoMTQ4LDMzLDEwNCmSyj5mS7GvcmdiKDE0OCwzMywxMDQpkso+ZqzRr3JnYigxNDgsMzMsMTA0KZLKPmcN8a9yZ2IoMTQ5LDMzLDEwNCmSyj5nbxKvcmdiKDE0OSwzMywxMDQpkso+Z9Ayr3JnYigxNDksMzMsMTA0KZLKPmgxUq9yZ2IoMTQ5LDMzLDEwNCmSyj5oknOvcmdiKDE1MCwzMywxMDQpkso+aPOTr3JnYigxNTAsMzMsMTA0KZLKPmlUs69yZ2IoMTUwLDMzLDEwNCmSyj5ptdSvcmdiKDE1MCwzMywxMDQpkso+ahb0r3JnYigxNTAsMzMsMTAzKZLKPmp4FK9yZ2IoMTUxLDMzLDEwMymSyj5q2TWvcmdiKDE1MSwzMywxMDMpkso+azpVr3JnYigxNTEsMzMsMTAzKZLKPmubdq9yZ2IoMTUxLDMzLDEwMymSyj5r/JavcmdiKDE1MSwzMywxMDMpkso+bF22r3JnYigxNTIsMzMsMTAzKZLKPmy+169yZ2IoMTUyLDMzLDEwMymSyj5tH/evcmdiKDE1MiwzNCwxMDMpkso+bYEXr3JnYigxNTIsMzQsMTAzKZLKPm3iOK9yZ2IoMTUyLDM0LDEwMymSyj5uQ1ivcmdiKDE1MywzNCwxMDMpkso+bqR4r3JnYigxNTMsMzQsMTAzKZLKPm8Fma9yZ2IoMTUzLDM0LDEwMymSyj5vZrmvcmdiKDE1MywzNCwxMDMpkso+b8fZr3JnYigxNTMsMzQsMTAzKZLKPnAo+q9yZ2IoMTUzLDM0LDEwMymSyj5wihqvcmdiKDE1NCwzNCwxMDMpkso+cOs6r3JnYigxNTQsMzQsMTAzKZLKPnFMW69yZ2IoMTU0LDM0LDEwMymSyj5xrXuvcmdiKDE1NCwzNCwxMDMpkso+cg6br3JnYigxNTQsMzQsMTAzKZLKPnJvvK9yZ2IoMTU1LDM0LDEwMymSyj5y0NyvcmdiKDE1NSwzNCwxMDMpkso+czH8r3JnYigxNTUsMzQsMTAzKZLKPnOTHa9yZ2IoMTU1LDM0LDEwMimSyj5z9D2vcmdiKDE1NSwzNCwxMDIpkso+dFVdr3JnYigxNTYsMzQsMTAyKZLKPnS2fq9yZ2IoMTU2LDM0LDEwMimSyj51F56vcmdiKDE1NiwzNCwxMDIpkso+dXi+r3JnYigxNTYsMzQsMTAyKZLKPnXZ369yZ2IoMTU2LDM0LDEwMimSyj52Ov+vcmdiKDE1NiwzNCwxMDIpkso+dpwfr3JnYigxNTcsMzQsMTAyKZLKPnb9QK9yZ2IoMTU3LDM0LDEwMimSyj53XmCvcmdiKDE1NywzNCwxMDIpkso+d7+Br3JnYigxNTcsMzQsMTAyKZLKPnggoa9yZ2IoMTU3LDM0LDEwMimSyj54gcGvcmdiKDE1OCwzNCwxMDIpkso+eOLir3JnYigxNTgsMzQsMTAyKZLKPnlEAq9yZ2IoMTU4LDM0LDEwMimSyj55pSKvcmdiKDE1OCwzNCwxMDIpkso+egZDr3JnYigxNTgsMzQsMTAyKZLKPnpnY69yZ2IoMTU4LDM0LDEwMimSyj56yIOvcmdiKDE1OSwzNCwxMDEpkso+eymkr3JnYigxNTksMzQsMTAxKZLKPnuKxK9yZ2IoMTU5LDM0LDEwMSmSyj576+SvcmdiKDE1OSwzNCwxMDEpkso+fE0Fr3JnYigxNTksMzQsMTAxKZLKPnyuJa9yZ2IoMTU5LDM0LDEwMSmSyj59D0WvcmdiKDE2MCwzNCwxMDEpkso+fXBmr3JnYigxNjAsMzQsMTAxKZLKPn3Rhq9yZ2IoMTYwLDM0LDEwMSmSyj5+MqavcmdiKDE2MCwzNCwxMDEpkso+fpPHr3JnYigxNjAsMzQsMTAxKZLKPn70569yZ2IoMTYwLDM1LDEwMSmSyj5/VgevcmdiKDE2MSwzNSwxMDEpkso+f7cor3JnYigxNjEsMzUsMTAxKZLKPoAMJK9yZ2IoMTYxLDM1LDEwMSmSyj6APLSvcmdiKDE2MSwzNSwxMDApkso+gG1Er3JnYigxNjEsMzUsMTAwKZLKPoCd1a9yZ2IoMTYxLDM1LDEwMCmSyj6AzmWvcmdiKDE2MiwzNSwxMDApkso+gP71r3JnYigxNjIsMzUsMTAwKZLKPoEvha9yZ2IoMTYyLDM1LDEwMCmSyj6BYBWvcmdiKDE2MiwzNSwxMDApkso+gZClr3JnYigxNjIsMzUsMTAwKZLKPoHBNq9yZ2IoMTYyLDM1LDEwMCmSyj6B8cavcmdiKDE2MywzNSwxMDApkso+giJWr3JnYigxNjMsMzUsMTAwKZLKPoJS5q9yZ2IoMTYzLDM1LDEwMCmSyj6Cg3avcmdiKDE2MywzNSwxMDApkso+grQGrnJnYigxNjMsMzUsOTkpkso+guSXrnJnYigxNjMsMzUsOTkpkso+gxUnrnJnYigxNjQsMzUsOTkpkso+g0W3rnJnYigxNjQsMzUsOTkpkso+g3ZHrnJnYigxNjQsMzUsOTkpkso+g6bXrnJnYigxNjQsMzUsOTkpkso+g9dnrnJnYigxNjQsMzUsOTkpkso+hAf4rnJnYigxNjQsMzUsOTkpkso+hDiIrnJnYigxNjQsMzUsOTkpkso+hGkYrnJnYigxNjUsMzUsOTkpkso+hJmornJnYigxNjUsMzUsOTkpkso+hMo4rnJnYigxNjUsMzUsOTkpkso+hPrJrnJnYigxNjUsMzUsOTgpkso+hStZrnJnYigxNjUsMzUsOTgpkso+hVvprnJnYigxNjUsMzUsOTgpkso+hYx5rnJnYigxNjUsMzUsOTgpkso+hb0JrnJnYigxNjYsMzUsOTgpkso+he2ZrnJnYigxNjYsMzYsOTgpkso+hh4qrnJnYigxNjYsMzYsOTgpkso+hk66rnJnYigxNjYsMzYsOTgpkso+hn9KrnJnYigxNjYsMzYsOTgpkso+hq/arnJnYigxNjYsMzYsOTgpkso+huBqrnJnYigxNjcsMzYsOTgpkso+hxD6rnJnYigxNjcsMzYsOTcpkso+h0GLrnJnYigxNjcsMzYsOTcpkso+h3IbrnJnYigxNjcsMzYsOTcpkso+h6KrrnJnYigxNjcsMzYsOTcpkso+h9M7rnJnYigxNjcsMzYsOTcpkso+iAPLrnJnYigxNjcsMzYsOTcpkso+iDRbrnJnYigxNjgsMzYsOTcpkso+iGTsrnJnYigxNjgsMzYsOTcpkso+iJV8rnJnYigxNjgsMzYsOTcpkso+iMYMrnJnYigxNjgsMzYsOTcpkso+iPacrnJnYigxNjgsMzYsOTYpkso+iScsrnJnYigxNjgsMzYsOTYpkso+iVe8rnJnYigxNjgsMzYsOTYpkso+iYhNrnJnYigxNjgsMzYsOTYpkso+ibjdrnJnYigxNjksMzYsOTYpkso+ieltrnJnYigxNjksMzYsOTYpkso+ihn9rnJnYigxNjksMzYsOTYpkso+ikqNrnJnYigxNjksMzYsOTYpkso+insdrnJnYigxNjksMzYsOTYpkso+iquurnJnYigxNjksMzYsOTYpkso+itw+rnJnYigxNjksMzcsOTUpkso+iwzOrnJnYigxNzAsMzcsOTUpkso+iz1ernJnYigxNzAsMzcsOTUpkso+i23urnJnYigxNzAsMzcsOTUpkso+i55/rnJnYigxNzAsMzcsOTUpkso+i88PrnJnYigxNzAsMzcsOTUpkso+i/+frnJnYigxNzAsMzcsOTUpkso+jDAvrnJnYigxNzAsMzcsOTUpkso+jGC/rnJnYigxNzEsMzcsOTUpkso+jJFPrnJnYigxNzEsMzcsOTQpkso+jMHgrnJnYigxNzEsMzcsOTQpkso+jPJwrnJnYigxNzEsMzcsOTQpkso+jSMArnJnYigxNzEsMzcsOTQpkso+jVOQrnJnYigxNzEsMzcsOTQpkso+jYQgrnJnYigxNzEsMzcsOTQpkso+jbSwrnJnYigxNzEsMzcsOTQpkso+jeVBrnJnYigxNzIsMzcsOTQpkso+jhXRrnJnYigxNzIsMzcsOTQpkso+jkZhrnJnYigxNzIsMzcsOTMpkso+jnbxrnJnYigxNzIsMzcsOTMpkso+jqeBrnJnYigxNzIsMzcsOTMpkso+jtgRrnJnYigxNzIsMzgsOTMpkso+jwiirnJnYigxNzIsMzgsOTMpkso+jzkyrnJnYigxNzIsMzgsOTMpkso+j2nCrnJnYigxNzMsMzgsOTMpkso+j5pSrnJnYigxNzMsMzgsOTMpkso+j8rirnJnYigxNzMsMzgsOTIpkso+j/tyrnJnYigxNzMsMzgsOTIpkso+kCwDrnJnYigxNzMsMzgsOTIpkso+kFyTrnJnYigxNzMsMzgsOTIpkso+kI0jrnJnYigxNzMsMzgsOTIpkso+kL2zrnJnYigxNzMsMzgsOTIpkso+kO5DrnJnYigxNzMsMzgsOTIpkso+kR7UrnJnYigxNzQsMzgsOTIpkso+kU9krnJnYigxNzQsMzgsOTEpkso+kX/0rnJnYigxNzQsMzgsOTEpkso+kbCErnJnYigxNzQsMzgsOTEpkso+keEUrnJnYigxNzQsMzgsOTEpkso+khGkrnJnYigxNzQsMzgsOTEpkso+kkI1rnJnYigxNzQsMzksOTEpkso+knLFrnJnYigxNzQsMzksOTEpkso+kqNVrnJnYigxNzUsMzksOTEpkso+ktPlrnJnYigxNzUsMzksOTApkso+kwR1rnJnYigxNzUsMzksOTApkso+kzUFrnJnYigxNzUsMzksOTApkso+k2WWrnJnYigxNzUsMzksOTApkso+k5YmrnJnYigxNzUsMzksOTApkso+k8a2rnJnYigxNzUsMzksOTApkso+k/dGrnJnYigxNzUsMzksOTApkso+lCfWrnJnYigxNzUsMzksODkpkso+lFhmrnJnYigxNzYsMzksODkpkso+lIj3rnJnYigxNzYsMzksODkpkso+lLmHrnJnYigxNzYsMzksODkpkso+lOoXrnJnYigxNzYsMzksODkpkso+lRqnrnJnYigxNzYsNDAsODkpkso+lUs3rnJnYigxNzYsNDAsODkpkso+lXvHrnJnYigxNzYsNDAsODkpkso+laxYrnJnYigxNzYsNDAsODgpkso+ldzornJnYigxNzYsNDAsODgpkso+lg14rnJnYigxNzYsNDAsODgpkso+lj4IrnJnYigxNzcsNDAsODgpkso+lm6YrnJnYigxNzcsNDAsODgpkso+lp8prnJnYigxNzcsNDAsODgpkso+ls+5rnJnYigxNzcsNDAsODgpkso+lwBJrnJnYigxNzcsNDAsODcpkso+lzDZrnJnYigxNzcsNDAsODcpkso+l2FprnJnYigxNzcsNDAsODcpkso+l5H5rnJnYigxNzcsNDAsODcpkso+l8KKrnJnYigxNzcsNDEsODcpkso+l/MarnJnYigxNzgsNDEsODcpkso+mCOqrnJnYigxNzgsNDEsODcpkso+mFQ6rnJnYigxNzgsNDEsODYpkso+mITKrnJnYigxNzgsNDEsODYpkso+mLVarnJnYigxNzgsNDEsODYpkso+mOXrrnJnYigxNzgsNDEsODYpkso+mRZ7rnJnYigxNzgsNDEsODYpkso+mUcLrnJnYigxNzgsNDEsODYpkso+mXebrnJnYigxNzgsNDEsODYpkso+magrrnJnYigxNzgsNDEsODUpkso+mdi7rnJnYigxNzksNDEsODUpkso+mglMrnJnYigxNzksNDEsODUpkso+mjncrnJnYigxNzksNDIsODUpkso+mmpsrnJnYigxNzksNDIsODUpkso+mpr8rnJnYigxNzksNDIsODUpkso+msuMrnJnYigxNzksNDIsODQpkso+mvwcrnJnYigxNzksNDIsODQpkso+myytrnJnYigxNzksNDIsODQpkso+m109rnJnYigxNzksNDIsODQpkso+m43NrnJnYigxNzksNDIsODQpkso+m75drnJnYigxNzksNDIsODQpkso+m+7trnJnYigxODAsNDIsODQpkso+nB99rnJnYigxODAsNDIsODMpkso+nFAOrnJnYigxODAsNDIsODMpkso+nICernJnYigxODAsNDMsODMpkso+nLEurnJnYigxODAsNDMsODMpkso+nOG+rnJnYigxODAsNDMsODMpkso+nRJOrnJnYigxODAsNDMsODMpkso+nULfrnJnYigxODAsNDMsODIpkso+nXNvrnJnYigxODAsNDMsODIpkso+naP/rnJnYigxODAsNDMsODIpkso+ndSPrnJnYigxODAsNDMsODIpkso+ngUfrnJnYigxODEsNDMsODIpkso+njWvrnJnYigxODEsNDMsODIpkso+nmZArnJnYigxODEsNDMsODEpkso+npbQrnJnYigxODEsNDQsODEpkso+nsdgrnJnYigxODEsNDQsODEpkso+nvfwrnJnYigxODEsNDQsODEpkso+nyiArnJnYigxODEsNDQsODEpkso+n1kQrnJnYigxODEsNDQsODEpkso+n4mhrnJnYigxODEsNDQsODEpkso+n7oxrnJnYigxODEsNDQsODApkso+n+rBrnJnYigxODEsNDQsODApkso+oBtRrnJnYigxODIsNDQsODApkso+oEvhrnJnYigxODIsNDQsODApkso+oHxxrnJnYigxODIsNDUsODApkso+oK0CrnJnYigxODIsNDUsODApkso+oN2SrnJnYigxODIsNDUsNzkpkso+oQ4irnJnYigxODIsNDUsNzkpkso+oT6yrnJnYigxODIsNDUsNzkpkso+oW9CrnJnYigxODIsNDUsNzkpkso+oZ/SrnJnYigxODIsNDUsNzkpkso+odBjrnJnYigxODIsNDUsNzkpkso+ogDzrnJnYigxODIsNDUsNzgpkso+ojGDrnJnYigxODIsNDUsNzgpkso+omITrnJnYigxODMsNDYsNzgpkso+opKjrnJnYigxODMsNDYsNzgpkso+osM0rnJnYigxODMsNDYsNzgpkso+ovPErnJnYigxODMsNDYsNzgpkso+oyRUrnJnYigxODMsNDYsNzcpkso+o1TkrnJnYigxODMsNDYsNzcpkso+o4V0rnJnYigxODMsNDYsNzcpkso+o7YErnJnYigxODMsNDYsNzcpkso+o+aVrnJnYigxODMsNDYsNzcpkso+pBclrnJnYigxODMsNDcsNzYpkso+pEe1rnJnYigxODMsNDcsNzYpkso+pHhFrnJnYigxODMsNDcsNzYpkso+pKjVrnJnYigxODMsNDcsNzYpkso+pNllrnJnYigxODQsNDcsNzYpkso+pQn2rnJnYigxODQsNDcsNzYpkso+pTqGrnJnYigxODQsNDcsNzUpkso+pWsWrnJnYigxODQsNDcsNzUpkso+pZumrnJnYigxODQsNDcsNzUpkso+pcw2rnJnYigxODQsNDgsNzUpkso+pfzGrnJnYigxODQsNDgsNzUpkso+pi1XrnJnYigxODQsNDgsNzUpkso+pl3nrnJnYigxODQsNDgsNzQpkso+po53rnJnYigxODQsNDgsNzQpkso+pr8HrnJnYigxODQsNDgsNzQpkso+pu+XrnJnYigxODQsNDgsNzQpkso+pyAnrnJnYigxODQsNDgsNzQpkso+p1C4rnJnYigxODUsNDksNzQpkso+p4FIrnJnYigxODUsNDksNzMpkso+p7HYrnJnYigxODUsNDksNzMpkso+p+JornJnYigxODUsNDksNzMpkso+qBL4rnJnYigxODUsNDksNzMpkso+qEOIrnJnYigxODUsNDksNzMpkso+qHQZrnJnYigxODUsNDksNzIpkso+qKSprnJnYigxODUsNDksNzIpkso+qNU5rnJnYigxODUsNTAsNzIpkso+qQXJrnJnYigxODUsNTAsNzIpkso+qTZZrnJnYigxODUsNTAsNzIpkso+qWbqrnJnYigxODUsNTAsNzIpkso+qZd6rnJnYigxODUsNTAsNzEpkso+qcgKrnJnYigxODUsNTAsNzEpkso+qfiarnJnYigxODUsNTAsNzEpkso+qikqrnJnYigxODYsNTAsNzEpkso+qlm6rnJnYigxODYsNTEsNzEpkso+qopLrnJnYigxODYsNTEsNzApkso+qrrbrnJnYigxODYsNTEsNzApkso+qutrrnJnYigxODYsNTEsNzApkso+qxv7rnJnYigxODYsNTEsNzApkso+q0yLrnJnYigxODYsNTEsNzApkso+q30brnJnYigxODYsNTEsNzApkso+q62srnJnYigxODYsNTIsNjkpkso+q948rnJnYigxODYsNTIsNjkpkso+rA7MrnJnYigxODYsNTIsNjkpkso+rD9crnJnYigxODYsNTIsNjkpkso+rG/srnJnYigxODYsNTIsNjkpkso+rKB8rnJnYigxODYsNTIsNjgpkso+rNENrnJnYigxODYsNTIsNjgpkso+rQGdrnJnYigxODYsNTMsNjgpkso+rTItrnJnYigxODcsNTMsNjgpkso+rWK9rnJnYigxODcsNTMsNjgpkso+rZNNrnJnYigxODcsNTMsNjgpkso+rcPdrnJnYigxODcsNTMsNjcpkso+rfRurnJnYigxODcsNTMsNjcpkso+riT+rnJnYigxODcsNTMsNjcpkso+rlWOrnJnYigxODcsNTQsNjcpkso+roYernJnYigxODcsNTQsNjcpkso+rraurnJnYigxODcsNTQsNjYpkso+ruc/rnJnYigxODcsNTQsNjYpkso+rxfPrnJnYigxODcsNTQsNjYpkso+r0hfrnJnYigxODcsNTQsNjYpkso+r3jvrnJnYigxODcsNTQsNjYpkso+r6l/rnJnYigxODcsNTUsNjUpkso+r9oPrnJnYigxODcsNTUsNjUpkso+sAqgrnJnYigxODcsNTUsNjUpkso+sDswrnJnYigxODcsNTUsNjUpkso+sGvArnJnYigxODgsNTUsNjUpkso+sJxQrnJnYigxODgsNTUsNjUpkso+sMzgrnJnYigxODgsNTUsNjQpkso+sP1wrnJnYigxODgsNTYsNjQpkso+sS4BrnJnYigxODgsNTYsNjQpkso+sV6RrnJnYigxODgsNTYsNjQpkso+sY8hrnJnYigxODgsNTYsNjQpkso+sb+xrnJnYigxODgsNTYsNjMpkso+sfBBrnJnYigxODgsNTYsNjMpkso+siDRrnJnYigxODgsNTcsNjMpkso+slFirnJnYigxODgsNTcsNjMpkso+soHyrnJnYigxODgsNTcsNjMpkso+srKCrnJnYigxODgsNTcsNjIpkso+suMSrnJnYigxODgsNTcsNjIpkso+sxOirnJnYigxODgsNTcsNjIpkso+s0QyrnJnYigxODgsNTgsNjIpkso+s3TDrnJnYigxODgsNTgsNjIpkso+s6VTrnJnYigxODgsNTgsNjEpkso+s9XjrnJnYigxODksNTgsNjEpkso+tAZzrnJnYigxODksNTgsNjEpkso+tDcDrnJnYigxODksNTgsNjEpkso+tGeTrnJnYigxODksNTksNjEpkso+tJgkrnJnYigxODksNTksNjEpkso+tMi0rnJnYigxODksNTksNjApkso+tPlErnJnYigxODksNTksNjApkso+tSnUrnJnYigxODksNTksNjApkso+tVpkrnJnYigxODksNTksNjApkso+tYr1rnJnYigxODksNjAsNjApkso+tbuFrnJnYigxODksNjAsNTkpkso+tewVrnJnYigxODksNjAsNTkpkso+thylrnJnYigxODksNjAsNTkpkso+tk01rnJnYigxODksNjAsNTkpkso+tn3FrnJnYigxODksNjAsNTkpkso+tq5WrnJnYigxODksNjEsNTgpkso+tt7mrnJnYigxODksNjEsNTgpkso+tw92rnJnYigxODksNjEsNTgpkso+t0AGrnJnYigxODksNjEsNTgpkso+t3CWrnJnYigxODksNjEsNTgpkso+t6EmrnJnYigxODksNjEsNTcpkso+t9G3rnJnYigxOTAsNjIsNTcpkso+uAJHrnJnYigxOTAsNjIsNTcpkso+uDLXrnJnYigxOTAsNjIsNTcpkso+uGNnrnJnYigxOTAsNjIsNTcpkso+uJP3rnJnYigxOTAsNjIsNTYpkso+uMSHrnJnYigxOTAsNjIsNTYpkso+uPUYrnJnYigxOTAsNjMsNTYpkso+uSWornJnYigxOTAsNjMsNTYpkso+uVY4rnJnYigxOTAsNjMsNTYpkso+uYbIrnJnYigxOTAsNjMsNTYpkso+ubdYrnJnYigxOTAsNjMsNTUpkso+uefornJnYigxOTAsNjQsNTUpkso+uhh5rnJnYigxOTAsNjQsNTUpkso+ukkJrnJnYigxOTAsNjQsNTUpkso+unmZrnJnYigxOTAsNjQsNTUpkso+uqoprnJnYigxOTAsNjQsNTQpkso+utq5rnJnYigxOTAsNjQsNTQpkso+uwtKrnJnYigxOTAsNjUsNTQpkso+uzvarnJnYigxOTAsNjUsNTQpkso+u2xqrnJnYigxOTAsNjUsNTQpkso+u5z6rnJnYigxOTAsNjUsNTMpkso+u82KrnJnYigxOTAsNjUsNTMpkso+u/4arnJnYigxOTAsNjYsNTMpkso+vC6rrnJnYigxOTEsNjYsNTMpkso+vF87rnJnYigxOTEsNjYsNTMpkso+vI/LrnJnYigxOTEsNjYsNTIpkso+vMBbrnJnYigxOTEsNjYsNTIpkso+vPDrrnJnYigxOTEsNjcsNTIpkso+vSF7rnJnYigxOTEsNjcsNTIpkso+vVIMrnJnYigxOTEsNjcsNTIpkso+vYKcrnJnYigxOTEsNjcsNTEpkso+vbMsrnJnYigxOTEsNjcsNTEpkso+veO8rnJnYigxOTEsNjcsNTEpkso+vhRMrnJnYigxOTEsNjgsNTEpkso+vkTcrnJnYigxOTEsNjgsNTEpkso+vnVtrnJnYigxOTEsNjgsNTEpkso+vqX9rnJnYigxOTEsNjgsNTApkso+vtaNrnJnYigxOTEsNjgsNTApkso+vwcdrnJnYigxOTEsNjksNTApkso+vzetrnJnYigxOTEsNjksNTApkso+v2g9rnJnYigxOTEsNjksNTApkso+v5jOrnJnYigxOTEsNjksNDkpkso+v8lernJnYigxOTEsNjksNDkpkso+v/nurnJnYigxOTEsNzAsNDkpkso+wCp+rnJnYigxOTEsNzAsNDkpkso+wFsOrnJnYigxOTEsNzAsNDkpkso+wIuernJnYigxOTEsNzAsNDgpkso+wLwvrnJnYigxOTEsNzAsNDgpkso+wOy/rnJnYigxOTEsNzEsNDgpkso+wR1PrnJnYigxOTEsNzEsNDgpkso+wU3frnJnYigxOTEsNzEsNDgpkso+wX5vrnJnYigxOTIsNzEsNDcpkso+wa8ArnJnYigxOTIsNzEsNDcpkso+wd+QrnJnYigxOTIsNzIsNDcpkso+whAgrnJnYigxOTIsNzIsNDcpkso+wkCwrnJnYigxOTIsNzIsNDcpkso+wnFArnJnYigxOTIsNzIsNDcpkso+wqHQrnJnYigxOTIsNzIsNDYpkso+wtJhrnJnYigxOTIsNzMsNDYpkso+wwLxrnJnYigxOTIsNzMsNDYpkso+wzOBrnJnYigxOTIsNzMsNDYpkso+w2QRrnJnYigxOTIsNzMsNDYpkso+w5ShrnJnYigxOTIsNzMsNDUpkso+w8UxrnJnYigxOTIsNzQsNDUpkso+w/XCrnJnYigxOTIsNzQsNDUpkso+xCZSrnJnYigxOTIsNzQsNDUpkso+xFbirnJnYigxOTIsNzQsNDUpkso+xIdyrnJnYigxOTIsNzQsNDQpkso+xLgCrnJnYigxOTIsNzUsNDQpkso+xOiSrnJnYigxOTIsNzUsNDQpkso+xRkjrnJnYigxOTIsNzUsNDQpkso+xUmzrnJnYigxOTIsNzUsNDQpkso+xXpDrnJnYigxOTIsNzUsNDQpkso+xarTrnJnYigxOTIsNzYsNDMpkso+xdtjrnJnYigxOTIsNzYsNDMpkso+xgvzrnJnYigxOTIsNzYsNDMpkso+xjyErnJnYigxOTIsNzYsNDMpkso+xm0UrnJnYigxOTIsNzYsNDMpkso+xp2krnJnYigxOTIsNzcsNDIpkso+xs40rnJnYigxOTIsNzcsNDIpkso+xv7ErnJnYigxOTIsNzcsNDIpkso+xy9VrnJnYigxOTIsNzcsNDIpkso+x1/lrnJnYigxOTIsNzgsNDIpkso+x5B1rnJnYigxOTIsNzgsNDIpkso+x8EFrnJnYigxOTIsNzgsNDEpkso+x/GVrnJnYigxOTIsNzgsNDEpkso+yCIlrnJnYigxOTMsNzgsNDEpkso+yFK2rnJnYigxOTMsNzksNDEpkso+yINGrnJnYigxOTMsNzksNDEpkso+yLPWrnJnYigxOTMsNzksNDApkso+yORmrnJnYigxOTMsNzksNDApkso+yRT2rnJnYigxOTMsNzksNDApkso+yUWGrnJnYigxOTMsODAsNDApkso+yXYXrnJnYigxOTMsODAsNDApkso+yaanrnJnYigxOTMsODAsNDApkso+ydc3rnJnYigxOTMsODAsMzkpkso+ygfHrnJnYigxOTMsODAsMzkpkso+yjhXrnJnYigxOTMsODEsMzkpkso+ymjnrnJnYigxOTMsODEsMzkpkso+ypl4rnJnYigxOTMsODEsMzkpkso+ysoIrnJnYigxOTMsODEsMzgpkso+yvqYrnJnYigxOTMsODIsMzgpkso+yysornJnYigxOTMsODIsMzgpkso+y1u4rnJnYigxOTMsODIsMzgpkso+y4xIrnJnYigxOTMsODIsMzgpkso+y7zZrnJnYigxOTMsODIsMzgpkso+y+1prnJnYigxOTMsODMsMzcpkso+zB35rnJnYigxOTMsODMsMzcpkso+zE6JrnJnYigxOTMsODMsMzcpkso+zH8ZrnJnYigxOTMsODMsMzcpkso+zK+prnJnYigxOTMsODQsMzcpkso+zOA6rnJnYigxOTMsODQsMzcpkso+zRDKrnJnYigxOTMsODQsMzYpkso+zUFarnJnYigxOTMsODQsMzYpkso+zXHqrnJnYigxOTMsODQsMzYpkso+zaJ6rnJnYigxOTMsODUsMzYpkso+zdMLrnJnYigxOTMsODUsMzYpkso+zgObrnJnYigxOTMsODUsMzYpkso+zjQrrnJnYigxOTMsODUsMzUpkso+zmS7rnJnYigxOTMsODUsMzUpkso+zpVLrnJnYigxOTMsODYsMzUpkso+zsXbrnJnYigxOTMsODYsMzUpkso+zvZsrnJnYigxOTMsODYsMzUpkso+zyb8rnJnYigxOTMsODYsMzQpkso+z1eMrnJnYigxOTMsODcsMzQpkso+z4gcrnJnYigxOTMsODcsMzQpkso+z7isrnJnYigxOTMsODcsMzQpkso+z+k8rnJnYigxOTMsODcsMzQpkso+0BnNrnJnYigxOTMsODcsMzQpkso+0EpdrnJnYigxOTMsODgsMzMpkso+0HrtrnJnYigxOTMsODgsMzMpkso+0Kt9rnJnYigxOTMsODgsMzMpkso+0NwNrnJnYigxOTMsODgsMzMpkso+0QydrnJnYigxOTMsODksMzMpkso+0T0urnJnYigxOTMsODksMzMpkso+0W2+rnJnYigxOTMsODksMzIpkso+0Z5OrnJnYigxOTMsODksMzIpkso+0c7ernJnYigxOTQsODksMzIpkso+0f9urnJnYigxOTQsOTAsMzIpkso+0i/+rnJnYigxOTQsOTAsMzIpkso+0mCPrnJnYigxOTQsOTAsMzIpkso+0pEfrnJnYigxOTQsOTAsMzIpkso+0sGvrnJnYigxOTQsOTEsMzEpkso+0vI/rnJnYigxOTQsOTEsMzEpkso+0yLPrnJnYigxOTQsOTEsMzEpkso+01NgrnJnYigxOTQsOTEsMzEpkso+04PwrnJnYigxOTQsOTEsMzEpkso+07SArnJnYigxOTQsOTIsMzEpkso+0+UQrnJnYigxOTQsOTIsMzApkso+1BWgrnJnYigxOTQsOTIsMzApkso+1EYwrnJnYigxOTQsOTIsMzApkso+1HbBrnJnYigxOTQsOTMsMzApkso+1KdRrnJnYigxOTQsOTMsMzApkso+1NfhrnJnYigxOTQsOTMsMzApkso+1QhxrnJnYigxOTQsOTMsMjkpkso+1TkBrnJnYigxOTQsOTMsMjkpkso+1WmRrnJnYigxOTQsOTQsMjkpkso+1ZoirnJnYigxOTQsOTQsMjkpkso+1cqyrnJnYigxOTQsOTQsMjkpkso+1ftCrnJnYigxOTQsOTQsMjkpkso+1ivSrnJnYigxOTQsOTUsMjkpkso+1lxirnJnYigxOTQsOTUsMjgpkso+1ozyrnJnYigxOTQsOTUsMjgpkso+1r2DrnJnYigxOTQsOTUsMjgpkso+1u4TrnJnYigxOTQsOTUsMjgpkso+1x6jrnJnYigxOTQsOTYsMjgpkso+108zrnJnYigxOTQsOTYsMjgpkso+13/DrnJnYigxOTQsOTYsMjcpkso+17BTrnJnYigxOTQsOTYsMjcpkso+1+DkrnJnYigxOTQsOTcsMjcpkso+2BF0rnJnYigxOTQsOTcsMjcpkso+2EIErnJnYigxOTQsOTcsMjcpkso+2HKUrnJnYigxOTQsOTcsMjcpkso+2KMkrnJnYigxOTQsOTcsMjcpkso+2NO0rnJnYigxOTQsOTgsMjYpkso+2QRFrnJnYigxOTQsOTgsMjYpkso+2TTVrnJnYigxOTQsOTgsMjYpkso+2WVlrnJnYigxOTQsOTgsMjYpkso+2ZX1rnJnYigxOTQsOTksMjYpkso+2caFrnJnYigxOTQsOTksMjYpkso+2fcWrnJnYigxOTQsOTksMjYpkso+2iemrnJnYigxOTQsOTksMjUpkso+2lg2rnJnYigxOTQsOTksMjUpkso+2ojGr3JnYigxOTQsMTAwLDI1KZLKPtq5Vq9yZ2IoMTk0LDEwMCwyNSmSyj7a6eavcmdiKDE5NCwxMDAsMjUpkso+2xp3r3JnYigxOTQsMTAwLDI1KZLKPttLB69yZ2IoMTk0LDEwMSwyNSmSyj7be5evcmdiKDE5NCwxMDEsMjQpkso+26wnr3JnYigxOTQsMTAxLDI0KZLKPtvct69yZ2IoMTk0LDEwMSwyNCmSyj7cDUevcmdiKDE5NCwxMDEsMjQpkso+3D3Yr3JnYigxOTQsMTAyLDI0KZLKPtxuaK9yZ2IoMTk0LDEwMiwyNCmSyj7cnvivcmdiKDE5NCwxMDIsMjQpkso+3M+Ir3JnYigxOTQsMTAyLDIzKZLKPt0AGK9yZ2IoMTk0LDEwMiwyMymSyj7dMKivcmdiKDE5NCwxMDMsMjMpkso+3WE5r3JnYigxOTQsMTAzLDIzKZLKPt2Rya9yZ2IoMTk0LDEwMywyMymSyj7dwlmvcmdiKDE5NCwxMDMsMjMpkso+3fLpr3JnYigxOTQsMTA0LDIzKZLKPt4jea9yZ2IoMTk0LDEwNCwyMymSyj7eVAmvcmdiKDE5NCwxMDQsMjIpkso+3oSar3JnYigxOTQsMTA0LDIyKZLKPt61Kq9yZ2IoMTk0LDEwNCwyMimSyj7e5bqvcmdiKDE5NCwxMDUsMjIpkso+3xZKr3JnYigxOTQsMTA1LDIyKZLKPt9G2q9yZ2IoMTk0LDEwNSwyMimSyj7fd2uvcmdiKDE5NCwxMDUsMjIpkso+36f7r3JnYigxOTQsMTA2LDIyKZLKPt/Yi69yZ2IoMTk0LDEwNiwyMSmSyj7gCRuvcmdiKDE5NCwxMDYsMjEpkso+4Dmrr3JnYigxOTQsMTA2LDIxKZLKPuBqO69yZ2IoMTk0LDEwNiwyMSmSyj7gmsyvcmdiKDE5NCwxMDcsMjEpkso+4Mtcr3JnYigxOTQsMTA3LDIxKZLKPuD77K9yZ2IoMTk0LDEwNywyMSmSyj7hLHyvcmdiKDE5NCwxMDcsMjEpkso+4V0Mr3JnYigxOTQsMTA4LDIwKZLKPuGNnK9yZ2IoMTk0LDEwOCwyMCmSyj7hvi2vcmdiKDE5NCwxMDgsMjApkso+4e69r3JnYigxOTQsMTA4LDIwKZLKPuIfTa9yZ2IoMTk0LDEwOCwyMCmSyj7iT92vcmdiKDE5NCwxMDksMjApkso+4oBtr3JnYigxOTQsMTA5LDIwKZLKPuKw/a9yZ2IoMTk0LDEwOSwyMCmSyj7i4Y6vcmdiKDE5NCwxMDksMTkpkso+4xIer3JnYigxOTQsMTEwLDE5KZLKPuNCrq9yZ2IoMTk0LDExMCwxOSmSyj7jcz6vcmdiKDE5NCwxMTAsMTkpkso+46POr3JnYigxOTQsMTEwLDE5KZLKPuPUXq9yZ2IoMTk0LDExMCwxOSmSyj7kBO+vcmdiKDE5NCwxMTEsMTkpkso+5DV/r3JnYigxOTQsMTExLDE5KZLKPuRmD69yZ2IoMTk0LDExMSwxOSmSyj7klp+vcmdiKDE5NCwxMTEsMTgpkso+5Mcvr3JnYigxOTQsMTExLDE4KZLKPuT3wK9yZ2IoMTk0LDExMiwxOCmSyj7lKFCvcmdiKDE5NCwxMTIsMTgpkso+5Vjgr3JnYigxOTQsMTEyLDE4KZLKPuWJcK9yZ2IoMTk0LDExMiwxOCmSyj7lugCvcmdiKDE5NCwxMTMsMTgpkso+5eqQr3JnYigxOTQsMTEzLDE4KZLKPuYbIa9yZ2IoMTk0LDExMywxOCmSyj7mS7GvcmdiKDE5NCwxMTMsMTcpkso+5nxBr3JnYigxOTQsMTEzLDE3KZLKPuas0a9yZ2IoMTk0LDExNCwxNymSyj7m3WGvcmdiKDE5NCwxMTQsMTcpkso+5w3xr3JnYigxOTQsMTE0LDE3KZLKPuc+gq9yZ2IoMTk0LDExNCwxNymSyj7nbxKvcmdiKDE5NCwxMTQsMTcpkso+55+ir3JnYigxOTQsMTE1LDE3KZLKPufQMq9yZ2IoMTk0LDExNSwxNymSyj7oAMKvcmdiKDE5NCwxMTUsMTcpkso+6DFSr3JnYigxOTQsMTE1LDE2KZLKPuhh469yZ2IoMTk0LDExNSwxNimSyj7oknOvcmdiKDE5NCwxMTYsMTYpkso+6MMDr3JnYigxOTQsMTE2LDE2KZLKPujzk69yZ2IoMTk0LDExNiwxNimSyj7pJCOvcmdiKDE5NCwxMTYsMTYpkso+6VSzr3JnYigxOTQsMTE3LDE2KZLKPumFRK9yZ2IoMTk0LDExNywxNimSyj7ptdSvcmdiKDE5NCwxMTcsMTYpkso+6eZkr3JnYigxOTQsMTE3LDE2KZLKPuoW9K9yZ2IoMTk0LDExNywxNSmSyj7qR4SvcmdiKDE5NCwxMTgsMTUpkso+6ngUr3JnYigxOTQsMTE4LDE1KZLKPuqopa9yZ2IoMTk0LDExOCwxNSmSyj7q2TWvcmdiKDE5NCwxMTgsMTUpkso+6wnFr3JnYigxOTQsMTE4LDE1KZLKPus6Va9yZ2IoMTk0LDExOSwxNSmSyj7rauWvcmdiKDE5NCwxMTksMTUpkso+65t2r3JnYigxOTQsMTE5LDE1KZLKPuvMBq9yZ2IoMTk0LDExOSwxNSmSyj7r/JavcmdiKDE5NCwxMTksMTQpkso+7C0mr3JnYigxOTQsMTIwLDE0KZLKPuxdtq9yZ2IoMTk0LDEyMCwxNCmSyj7sjkavcmdiKDE5NCwxMjAsMTQpkso+7L7Xr3JnYigxOTQsMTIwLDE0KZLKPuzvZ69yZ2IoMTk0LDEyMCwxNCmSyj7tH/evcmdiKDE5NCwxMjEsMTQpkso+7VCHr3JnYigxOTQsMTIxLDE0KZLKPu2BF69yZ2IoMTk0LDEyMSwxNCmSyj7tsaevcmdiKDE5NCwxMjEsMTQpkso+7eI4r3JnYigxOTQsMTIyLDE0KZLKPu4SyK9yZ2IoMTk0LDEyMiwxNCmSyj7uQ1ivcmdiKDE5NCwxMjIsMTMpkso+7nPor3JnYigxOTQsMTIyLDEzKZLKPu6keK9yZ2IoMTk0LDEyMiwxMymSyj7u1QivcmdiKDE5NCwxMjMsMTMpkso+7wWZr3JnYigxOTQsMTIzLDEzKZLKPu82Ka9yZ2IoMTk0LDEyMywxMymSyj7vZrmvcmdiKDE5NCwxMjMsMTMpkso+75dJr3JnYigxOTQsMTIzLDEzKZLKPu/H2a9yZ2IoMTk0LDEyNCwxMymSyj7v+GmvcmdiKDE5MywxMjQsMTMpkso+8Cj6r3JnYigxOTMsMTI0LDEzKZLKPvBZiq9yZ2IoMTkzLDEyNCwxMymSyj7wihqvcmdiKDE5MywxMjQsMTIpkso+8Lqqr3JnYigxOTMsMTI1LDEyKZLKPvDrOq9yZ2IoMTkzLDEyNSwxMimSyj7xG8uvcmdiKDE5MywxMjUsMTIpkso+8Uxbr3JnYigxOTMsMTI1LDEyKZLKPvF8669yZ2IoMTkzLDEyNSwxMimSyj7xrXuvcmdiKDE5MywxMjYsMTIpkso+8d4Lr3JnYigxOTMsMTI2LDEyKZLKPvIOm69yZ2IoMTkzLDEyNiwxMimSyj7yPyyvcmdiKDE5MywxMjYsMTIpkso+8m+8r3JnYigxOTMsMTI2LDEyKZLKPvKgTK9yZ2IoMTkzLDEyNywxMimSyj7y0NyvcmdiKDE5MywxMjcsMTIpkso+8wFsr3JnYigxOTMsMTI3LDEyKZLKPvMx/K9yZ2IoMTkzLDEyNywxMSmSyj7zYo2vcmdiKDE5MywxMjcsMTEpkso+85Mdr3JnYigxOTMsMTI3LDExKZLKPvPDra9yZ2IoMTkzLDEyOCwxMSmSyj7z9D2vcmdiKDE5MywxMjgsMTEpkso+9CTNr3JnYigxOTMsMTI4LDExKZLKPvRVXa9yZ2IoMTkzLDEyOCwxMSmSyj70he6vcmdiKDE5MywxMjgsMTEpkso+9LZ+r3JnYigxOTMsMTI5LDExKZLKPvTnDq9yZ2IoMTkzLDEyOSwxMSmSyj71F56vcmdiKDE5MywxMjksMTEpkso+9Ugur3JnYigxOTMsMTI5LDExKZLKPvV4vq9yZ2IoMTkzLDEyOSwxMSmSyj71qU+vcmdiKDE5MywxMzAsMTEpkso+9dnfr3JnYigxOTMsMTMwLDEwKZLKPvYKb69yZ2IoMTkzLDEzMCwxMCmSyj72Ov+vcmdiKDE5MywxMzAsMTApkso+9muPr3JnYigxOTMsMTMwLDEwKZLKPvacH69yZ2IoMTkzLDEzMSwxMCmSyj72zLCvcmdiKDE5MywxMzEsMTApkso+9v1Ar3JnYigxOTMsMTMxLDEwKZLKPvct0K9yZ2IoMTkzLDEzMSwxMCmSyj73XmCvcmdiKDE5MywxMzEsMTApkso+947wr3JnYigxOTMsMTMyLDEwKZLKPve/ga9yZ2IoMTkzLDEzMiwxMCmSyj738BGvcmdiKDE5MywxMzIsMTApkso++CChr3JnYigxOTMsMTMyLDEwKZLKPvhRMa9yZ2IoMTkzLDEzMiwxMCmSyj74gcGvcmdiKDE5MywxMzIsMTApkso++LJRr3JnYigxOTMsMTMzLDEwKZLKPvji4q9yZ2IoMTkzLDEzMywxMCmSyj75E3KucmdiKDE5MywxMzMsOSmSyj75RAKucmdiKDE5MywxMzMsOSmSyj75dJKucmdiKDE5MywxMzMsOSmSyj75pSKucmdiKDE5MywxMzQsOSmSyj751bKucmdiKDE5MywxMzQsOSmSyj76BkOucmdiKDE5MywxMzQsOSmSyj76NtOucmdiKDE5MywxMzQsOSmSyj76Z2OucmdiKDE5MywxMzQsOSmSyj76l/OucmdiKDE5MywxMzQsOSmSyj76yIOucmdiKDE5MywxMzUsOSmSyj76+ROucmdiKDE5MiwxMzUsOSmSyj77KaSucmdiKDE5MiwxMzUsOSmSyj77WjSucmdiKDE5MiwxMzUsOSmSyj77isSucmdiKDE5MiwxMzUsOSmSyj77u1SucmdiKDE5MiwxMzYsOSmSyj776+SucmdiKDE5MiwxMzYsOSmSyj78HHSucmdiKDE5MiwxMzYsOSmSyj78TQWucmdiKDE5MiwxMzYsOSmSyj78fZWucmdiKDE5MiwxMzYsOSmSyj78riWucmdiKDE5MiwxMzYsOCmSyj783rWucmdiKDE5MiwxMzcsOCmSyj79D0WucmdiKDE5MiwxMzcsOCmSyj79P9aucmdiKDE5MiwxMzcsOCmSyj79cGaucmdiKDE5MiwxMzcsOCmSyj79oPaucmdiKDE5MiwxMzcsOCmSyj790YaucmdiKDE5MiwxMzgsOCmSyj7+AhaucmdiKDE5MiwxMzgsOCmSyj7+MqaucmdiKDE5MiwxMzgsOCmSyj7+YzeucmdiKDE5MiwxMzgsOCmSyj7+k8eucmdiKDE5MiwxMzgsOCmSyj7+xFeucmdiKDE5MiwxMzgsOCmSyj7+9OeucmdiKDE5MiwxMzksOCmSyj7/JXeucmdiKDE5MiwxMzksOCmSyj7/VgeucmdiKDE5MiwxMzksOCmSyj7/hpiucmdiKDE5MiwxMzksOCmSyj7/tyiucmdiKDE5MiwxMzksOCmSyj7/57iucmdiKDE5MiwxMzksOCmSyj8ADCSucmdiKDE5MiwxNDAsOCmSyj8AJGyucmdiKDE5MiwxNDAsOCmSyj8APLSucmdiKDE5MiwxNDAsOCmSyj8AVPyucmdiKDE5MiwxNDAsOCmSyj8AbUSucmdiKDE5MiwxNDAsOCmSyj8AhYyucmdiKDE5MiwxNDEsOCmSyj8AndWucmdiKDE5MiwxNDEsNymSyj8Ath2ucmdiKDE5MiwxNDEsNymSyj8AzmWucmdiKDE5MiwxNDEsNymSyj8A5q2ucmdiKDE5MiwxNDEsNymSyj8A/vWucmdiKDE5MiwxNDEsNymSyj8BFz2ucmdiKDE5MiwxNDIsNymSyj8BL4WucmdiKDE5MiwxNDIsNymSyj8BR82ucmdiKDE5MiwxNDIsNymSyj8BYBWucmdiKDE5MSwxNDIsNymSyj8BeF2ucmdiKDE5MSwxNDIsNymSyj8BkKWucmdiKDE5MSwxNDIsNymSyj8BqO6ucmdiKDE5MSwxNDMsNymSyj8BwTaucmdiKDE5MSwxNDMsNymSyj8B2X6ucmdiKDE5MSwxNDMsNymSyj8B8caucmdiKDE5MSwxNDMsNymSyj8CCg6ucmdiKDE5MSwxNDMsNymSyj8CIlaucmdiKDE5MSwxNDMsNymSyj8COp6ucmdiKDE5MSwxNDQsNymSyj8CUuaucmdiKDE5MSwxNDQsNymSyj8Cay6ucmdiKDE5MSwxNDQsNymSyj8Cg3aucmdiKDE5MSwxNDQsNymSyj8Cm76ucmdiKDE5MSwxNDQsNymSyj8CtAaucmdiKDE5MSwxNDQsNymSyj8CzE+ucmdiKDE5MSwxNDUsNymSyj8C5JeucmdiKDE5MSwxNDUsNymSyj8C/N+ucmdiKDE5MSwxNDUsNymSyj8DFSeucmdiKDE5MSwxNDUsNymSyj8DLW+ucmdiKDE5MSwxNDUsNymSyj8DRbeucmdiKDE5MSwxNDUsNymSyj8DXf+ucmdiKDE5MSwxNDUsNymSyj8DdkeucmdiKDE5MSwxNDYsNimSyj8Djo+ucmdiKDE5MSwxNDYsNimSyj8DpteucmdiKDE5MSwxNDYsNimSyj8Dvx+ucmdiKDE5MSwxNDYsNimSyj8D12eucmdiKDE5MSwxNDYsNimSyj8D77CucmdiKDE5MSwxNDYsNimSyj8EB/iucmdiKDE5MSwxNDcsNimSyj8EIECucmdiKDE5MSwxNDcsNimSyj8EOIiucmdiKDE5MSwxNDcsNimSyj8EUNCucmdiKDE5MSwxNDcsNimSyj8EaRiucmdiKDE5MSwxNDcsNimSyj8EgWCucmdiKDE5MSwxNDcsNimSyj8EmaiucmdiKDE5MCwxNDgsNimSyj8EsfCucmdiKDE5MCwxNDgsNimSyj8EyjiucmdiKDE5MCwxNDgsNimSyj8E4oCucmdiKDE5MCwxNDgsNimSyj8E+smucmdiKDE5MCwxNDgsNimSyj8FExGucmdiKDE5MCwxNDgsNimSyj8FK1mucmdiKDE5MCwxNDgsNimSyj8FQ6GucmdiKDE5MCwxNDksNimSyj8FW+mucmdiKDE5MCwxNDksNimSyj8FdDGucmdiKDE5MCwxNDksNimSyj8FjHmucmdiKDE5MCwxNDksNimSyj8FpMGucmdiKDE5MCwxNDksNimSyj8FvQmucmdiKDE5MCwxNDksNimSyj8F1VGucmdiKDE5MCwxNTAsNimSyj8F7ZmucmdiKDE5MCwxNTAsNimSyj8GBeGucmdiKDE5MCwxNTAsNimSyj8GHiqucmdiKDE5MCwxNTAsNimSyj8GNnKucmdiKDE5MCwxNTAsNimSyj8GTrqucmdiKDE5MCwxNTAsNimSyj8GZwKucmdiKDE5MCwxNTAsNimSyj8Gf0qucmdiKDE5MCwxNTEsNimSyj8Gl5KucmdiKDE5MCwxNTEsNimSyj8Gr9qucmdiKDE5MCwxNTEsNimSyj8GyCKucmdiKDE5MCwxNTEsNimSyj8G4GqucmdiKDE5MCwxNTEsNimSyj8G+LKucmdiKDE5MCwxNTEsNimSyj8HEPqucmdiKDE5MCwxNTIsNimSyj8HKUKucmdiKDE5MCwxNTIsNimSyj8HQYuucmdiKDE5MCwxNTIsNimSyj8HWdOucmdiKDE5MCwxNTIsNimSyj8HchuucmdiKDE5MCwxNTIsNimSyj8HimOucmdiKDE4OSwxNTIsNimSyj8HoquucmdiKDE4OSwxNTIsNimSyj8HuvOucmdiKDE4OSwxNTMsNimSyj8H0zuucmdiKDE4OSwxNTMsNimSyj8H64OucmdiKDE4OSwxNTMsNimSyj8IA8uucmdiKDE4OSwxNTMsNimSyj8IHBOucmdiKDE4OSwxNTMsNimSyj8INFuucmdiKDE4OSwxNTMsNimSyj8ITKSucmdiKDE4OSwxNTMsNimSyj8IZOyucmdiKDE4OSwxNTQsNimSyj8IfTSucmdiKDE4OSwxNTQsNSmSyj8IlXyucmdiKDE4OSwxNTQsNSmSyj8IrcSucmdiKDE4OSwxNTQsNSmSyj8IxgyucmdiKDE4OSwxNTQsNSmSyj8I3lSucmdiKDE4OSwxNTQsNSmSyj8I9pyucmdiKDE4OSwxNTQsNSmSyj8JDuSucmdiKDE4OSwxNTUsNSmSyj8JJyyucmdiKDE4OSwxNTUsNSmSyj8JP3SucmdiKDE4OSwxNTUsNSmSyj8JV7yucmdiKDE4OSwxNTUsNSmSyj8JcAWucmdiKDE4OSwxNTUsNSmSyj8JiE2ucmdiKDE4OSwxNTUsNSmSyj8JoJWucmdiKDE4OSwxNTUsNSmSyj8JuN2ucmdiKDE4OSwxNTYsNSmSyj8J0SWucmdiKDE4OSwxNTYsNSmSyj8J6W2ucmdiKDE4OSwxNTYsNSmSyj8KAbWucmdiKDE4OSwxNTYsNSmSyj8KGf2ucmdiKDE4OCwxNTYsNSmSyj8KMkWucmdiKDE4OCwxNTYsNSmSyj8KSo2ucmdiKDE4OCwxNTYsNSmSyj8KYtWucmdiKDE4OCwxNTYsNSmSyj8Kex2ucmdiKDE4OCwxNTcsNSmSyj8Kk2aucmdiKDE4OCwxNTcsNSmSyj8Kq66ucmdiKDE4OCwxNTcsNSmSyj8Kw/aucmdiKDE4OCwxNTcsNSmSyj8K3D6ucmdiKDE4OCwxNTcsNSmSyj8K9IaucmdiKDE4OCwxNTcsNSmSyj8LDM6ucmdiKDE4OCwxNTcsNSmSyj8LJRaucmdiKDE4OCwxNTgsNSmSyj8LPV6ucmdiKDE4OCwxNTgsNSmSyj8LVaaucmdiKDE4OCwxNTgsNSmSyj8Lbe6ucmdiKDE4OCwxNTgsNSmSyj8LhjaucmdiKDE4OCwxNTgsNSmSyj8Lnn+ucmdiKDE4OCwxNTgsNSmSyj8LtseucmdiKDE4OCwxNTgsNSmSyj8Lzw+ucmdiKDE4OCwxNTgsNSmSyj8L51eucmdiKDE4OCwxNTksNSmSyj8L/5+ucmdiKDE4OCwxNTksNSmSyj8MF+eucmdiKDE4OCwxNTksNSmSyj8MMC+ucmdiKDE4OCwxNTksNSmSyj8MSHeucmdiKDE4OCwxNTksNSmSyj8MYL+ucmdiKDE4OCwxNTksNSmSyj8MeQeucmdiKDE4OCwxNTksNSmSyj8MkU+ucmdiKDE4NywxNjAsNSmSyj8MqZeucmdiKDE4NywxNjAsNSmSyj8MweCucmdiKDE4NywxNjAsNSmSyj8M2iiucmdiKDE4NywxNjAsNSmSyj8M8nCucmdiKDE4NywxNjAsNSmSyj8NCriucmdiKDE4NywxNjAsNSmSyj8NIwCucmdiKDE4NywxNjAsNSmSyj8NO0iucmdiKDE4NywxNjAsNSmSyj8NU5CucmdiKDE4NywxNjEsNSmSyj8Na9iucmdiKDE4NywxNjEsNSmSyj8NhCCucmdiKDE4NywxNjEsNSmSyj8NnGiucmdiKDE4NywxNjEsNSmSyj8NtLCucmdiKDE4NywxNjEsNSmSyj8NzPmucmdiKDE4NywxNjEsNSmSyj8N5UGucmdiKDE4NywxNjEsNSmSyj8N/YmucmdiKDE4NywxNjEsNSmSyj8OFdGucmdiKDE4NywxNjIsNSmSyj8OLhmucmdiKDE4NywxNjIsNSmSyj8ORmGucmdiKDE4NywxNjIsNSmSyj8OXqmucmdiKDE4NywxNjIsNSmSyj8OdvGucmdiKDE4NywxNjIsNSmSyj8OjzmucmdiKDE4NywxNjIsNSmSyj8Op4GucmdiKDE4NywxNjIsNSmSyj8Ov8mucmdiKDE4NywxNjIsNSmSyj8O2BGucmdiKDE4NiwxNjMsNSmSyj8O8FqucmdiKDE4NiwxNjMsNSmSyj8PCKKucmdiKDE4NiwxNjMsNSmSyj8PIOqucmdiKDE4NiwxNjMsNSmSyj8POTKucmdiKDE4NiwxNjMsNimSyj8PUXqucmdiKDE4NiwxNjMsNimSyj8PacKucmdiKDE4NiwxNjMsNimSyj8PggqucmdiKDE4NiwxNjMsNimSyj8PmlKucmdiKDE4NiwxNjMsNimSyj8PspqucmdiKDE4NiwxNjQsNimSyj8PyuKucmdiKDE4NiwxNjQsNimSyj8P4yqucmdiKDE4NiwxNjQsNimSyj8P+3KucmdiKDE4NiwxNjQsNimSyj8QE7uucmdiKDE4NiwxNjQsNimSyj8QLAOucmdiKDE4NiwxNjQsNimSyj8QREuucmdiKDE4NiwxNjQsNimSyj8QXJOucmdiKDE4NiwxNjQsNimSyj8QdNuucmdiKDE4NiwxNjUsNimSyj8QjSOucmdiKDE4NiwxNjUsNimSyj8QpWuucmdiKDE4NiwxNjUsNimSyj8QvbOucmdiKDE4NiwxNjUsNimSyj8Q1fuucmdiKDE4NiwxNjUsNimSyj8Q7kOucmdiKDE4NiwxNjUsNimSyj8RBouucmdiKDE4NSwxNjUsNimSyj8RHtSucmdiKDE4NSwxNjUsNimSyj8RNxyucmdiKDE4NSwxNjUsNimSyj8RT2SucmdiKDE4NSwxNjYsNimSyj8RZ6yucmdiKDE4NSwxNjYsNimSyj8Rf/SucmdiKDE4NSwxNjYsNimSyj8RmDyucmdiKDE4NSwxNjYsNimSyj8RsISucmdiKDE4NSwxNjYsNimSyj8RyMyucmdiKDE4NSwxNjYsNimSyj8R4RSucmdiKDE4NSwxNjYsNimSyj8R+VyucmdiKDE4NSwxNjYsNimSyj8SEaSucmdiKDE4NSwxNjYsNimSyj8SKeyucmdiKDE4NSwxNjcsNimSyj8SQjWucmdiKDE4NSwxNjcsNimSyj8SWn2ucmdiKDE4NSwxNjcsNimSyj8ScsWucmdiKDE4NSwxNjcsNimSyj8Siw2ucmdiKDE4NSwxNjcsNimSyj8So1WucmdiKDE4NSwxNjcsNimSyj8Su52ucmdiKDE4NSwxNjcsNimSyj8S0+WucmdiKDE4NSwxNjcsNimSyj8S7C2ucmdiKDE4NSwxNjcsNimSyj8TBHWucmdiKDE4NCwxNjgsNimSyj8THL2ucmdiKDE4NCwxNjgsNimSyj8TNQWucmdiKDE4NCwxNjgsNimSyj8TTU2ucmdiKDE4NCwxNjgsNimSyj8TZZaucmdiKDE4NCwxNjgsNimSyj8Tfd6ucmdiKDE4NCwxNjgsNimSyj8TliaucmdiKDE4NCwxNjgsNimSyj8Trm6ucmdiKDE4NCwxNjgsNimSyj8TxraucmdiKDE4NCwxNjgsNimSyj8T3v6ucmdiKDE4NCwxNjksNymSyj8T90aucmdiKDE4NCwxNjksNymSyj8UD46ucmdiKDE4NCwxNjksNymSyj8UJ9aucmdiKDE4NCwxNjksNymSyj8UQB6ucmdiKDE4NCwxNjksNymSyj8UWGaucmdiKDE4NCwxNjksNymSyj8UcK+ucmdiKDE4NCwxNjksNymSyj8UiPeucmdiKDE4NCwxNjksNymSyj8UoT+ucmdiKDE4NCwxNjksNymSyj8UuYeucmdiKDE4NCwxNjksNymSyj8U0c+ucmdiKDE4NCwxNzAsNymSyj8U6heucmdiKDE4NCwxNzAsNymSyj8VAl+ucmdiKDE4NCwxNzAsNymSyj8VGqeucmdiKDE4MywxNzAsNymSyj8VMu+ucmdiKDE4MywxNzAsNymSyj8VSzeucmdiKDE4MywxNzAsNymSyj8VY3+ucmdiKDE4MywxNzAsNymSyj8Ve8eucmdiKDE4MywxNzAsNymSyj8VlBCucmdiKDE4MywxNzAsNymSyj8VrFiucmdiKDE4MywxNzAsNymSyj8VxKCucmdiKDE4MywxNzEsNymSyj8V3OiucmdiKDE4MywxNzEsNymSyj8V9TCucmdiKDE4MywxNzEsNymSyj8WDXiucmdiKDE4MywxNzEsNymSyj8WJcCucmdiKDE4MywxNzEsNymSyj8WPgiucmdiKDE4MywxNzEsNymSyj8WVlCucmdiKDE4MywxNzEsOCmSyj8WbpiucmdiKDE4MywxNzEsOCmSyj8WhuCucmdiKDE4MywxNzEsOCmSyj8WnymucmdiKDE4MywxNzEsOCmSyj8Wt3GucmdiKDE4MywxNzIsOCmSyj8Wz7mucmdiKDE4MywxNzIsOCmSyj8W6AGucmdiKDE4MywxNzIsOCmSyj8XAEmucmdiKDE4MiwxNzIsOCmSyj8XGJGucmdiKDE4MiwxNzIsOCmSyj8XMNmucmdiKDE4MiwxNzIsOCmSyj8XSSGucmdiKDE4MiwxNzIsOCmSyj8XYWmucmdiKDE4MiwxNzIsOCmSyj8XebGucmdiKDE4MiwxNzIsOCmSyj8XkfmucmdiKDE4MiwxNzIsOCmSyj8XqkGucmdiKDE4MiwxNzMsOCmSyj8XwoqucmdiKDE4MiwxNzMsOCmSyj8X2tKucmdiKDE4MiwxNzMsOCmSyj8X8xqucmdiKDE4MiwxNzMsOCmSyj8YC2KucmdiKDE4MiwxNzMsOCmSyj8YI6qucmdiKDE4MiwxNzMsOCmSyj8YO/KucmdiKDE4MiwxNzMsOSmSyj8YVDqucmdiKDE4MiwxNzMsOSmSyj8YbIKucmdiKDE4MiwxNzMsOSmSyj8YhMqucmdiKDE4MiwxNzMsOSmSyj8YnRKucmdiKDE4MiwxNzMsOSmSyj8YtVqucmdiKDE4MiwxNzQsOSmSyj8YzaKucmdiKDE4MiwxNzQsOSmSyj8Y5euucmdiKDE4MSwxNzQsOSmSyj8Y/jOucmdiKDE4MSwxNzQsOSmSyj8ZFnuucmdiKDE4MSwxNzQsOSmSyj8ZLsOucmdiKDE4MSwxNzQsOSmSyj8ZRwuucmdiKDE4MSwxNzQsOSmSyj8ZX1OucmdiKDE4MSwxNzQsOSmSyj8Zd5uucmdiKDE4MSwxNzQsOSmSyj8Zj+OucmdiKDE4MSwxNzQsOSmSyj8ZqCuucmdiKDE4MSwxNzUsOSmSyj8ZwHOvcmdiKDE4MSwxNzUsMTApkso/Gdi7r3JnYigxODEsMTc1LDEwKZLKPxnxBK9yZ2IoMTgxLDE3NSwxMCmSyj8aCUyvcmdiKDE4MSwxNzUsMTApkso/GiGUr3JnYigxODEsMTc1LDEwKZLKPxo53K9yZ2IoMTgxLDE3NSwxMCmSyj8aUiSvcmdiKDE4MSwxNzUsMTApkso/Gmpsr3JnYigxODEsMTc1LDEwKZLKPxqCtK9yZ2IoMTgxLDE3NSwxMCmSyj8amvyvcmdiKDE4MSwxNzUsMTApkso/GrNEr3JnYigxODEsMTc1LDEwKZLKPxrLjK9yZ2IoMTgwLDE3NiwxMCmSyj8a49SvcmdiKDE4MCwxNzYsMTApkso/Gvwcr3JnYigxODAsMTc2LDEwKZLKPxsUZa9yZ2IoMTgwLDE3NiwxMSmSyj8bLK2vcmdiKDE4MCwxNzYsMTEpkso/G0T1r3JnYigxODAsMTc2LDExKZLKPxtdPa9yZ2IoMTgwLDE3NiwxMSmSyj8bdYWvcmdiKDE4MCwxNzYsMTEpkso/G43Nr3JnYigxODAsMTc2LDExKZLKPxumFa9yZ2IoMTgwLDE3NiwxMSmSyj8bvl2vcmdiKDE4MCwxNzYsMTEpkso/G9alr3JnYigxODAsMTc3LDExKZLKPxvu7a9yZ2IoMTgwLDE3NywxMSmSyj8cBzWvcmdiKDE4MCwxNzcsMTEpkso/HB99r3JnYigxODAsMTc3LDExKZLKPxw3xq9yZ2IoMTgwLDE3NywxMimSyj8cUA6vcmdiKDE4MCwxNzcsMTIpkso/HGhWr3JnYigxODAsMTc3LDEyKZLKPxyAnq9yZ2IoMTgwLDE3NywxMimSyj8cmOavcmdiKDE3OSwxNzcsMTIpkso/HLEur3JnYigxNzksMTc3LDEyKZLKPxzJdq9yZ2IoMTc5LDE3NywxMimSyj8c4b6vcmdiKDE3OSwxNzcsMTIpkso/HPoGr3JnYigxNzksMTc4LDEyKZLKPx0STq9yZ2IoMTc5LDE3OCwxMimSyj8dKpavcmdiKDE3OSwxNzgsMTIpkso/HULfr3JnYigxNzksMTc4LDEzKZLKPx1bJ69yZ2IoMTc5LDE3OCwxMymSyj8dc2+vcmdiKDE3OSwxNzgsMTMpkso/HYu3r3JnYigxNzksMTc4LDEzKZLKPx2j/69yZ2IoMTc5LDE3OCwxMymSyj8dvEevcmdiKDE3OSwxNzgsMTMpkso/HdSPr3JnYigxNzksMTc4LDEzKZLKPx3s169yZ2IoMTc5LDE3OCwxMymSyj8eBR+vcmdiKDE3OSwxNzgsMTMpkso/Hh1nr3JnYigxNzksMTc4LDEzKZLKPx41r69yZ2IoMTc5LDE3OSwxNCmSyj8eTfevcmdiKDE3OSwxNzksMTQpkso/HmZAr3JnYigxNzgsMTc5LDE0KZLKPx5+iK9yZ2IoMTc4LDE3OSwxNCmSyj8eltCvcmdiKDE3OCwxNzksMTQpkso/Hq8Yr3JnYigxNzgsMTc5LDE0KZLKPx7HYK9yZ2IoMTc4LDE3OSwxNCmSyj8e36ivcmdiKDE3OCwxNzksMTQpkso/Hvfwr3JnYigxNzgsMTc5LDE0KZLKPx8QOK9yZ2IoMTc4LDE3OSwxNSmSyj8fKICvcmdiKDE3OCwxNzksMTUpkso/H0DIr3JnYigxNzgsMTc5LDE1KZLKPx9ZEK9yZ2IoMTc4LDE4MCwxNSmSyj8fcVivcmdiKDE3OCwxODAsMTUpkso/H4mhr3JnYigxNzgsMTgwLDE1KZLKPx+h6a9yZ2IoMTc4LDE4MCwxNSmSyj8fujGvcmdiKDE3OCwxODAsMTUpkso/H9J5r3JnYigxNzgsMTgwLDE2KZLKPx/qwa9yZ2IoMTc4LDE4MCwxNimSyj8gAwmvcmdiKDE3OCwxODAsMTYpkso/IBtRr3JnYigxNzgsMTgwLDE2KZLKPyAzma9yZ2IoMTc3LDE4MCwxNimSyj8gS+GvcmdiKDE3NywxODAsMTYpkso/IGQpr3JnYigxNzcsMTgwLDE2KZLKPyB8ca9yZ2IoMTc3LDE4MCwxNimSyj8glLqvcmdiKDE3NywxODAsMTcpkso/IK0Cr3JnYigxNzcsMTgxLDE3KZLKPyDFSq9yZ2IoMTc3LDE4MSwxNymSyj8g3ZKvcmdiKDE3NywxODEsMTcpkso/IPXar3JnYigxNzcsMTgxLDE3KZLKPyEOIq9yZ2IoMTc3LDE4MSwxNymSyj8hJmqvcmdiKDE3NywxODEsMTcpkso/IT6yr3JnYigxNzcsMTgxLDE4KZLKPyFW+q9yZ2IoMTc3LDE4MSwxOCmSyj8hb0KvcmdiKDE3NywxODEsMTgpkso/IYeKr3JnYigxNzcsMTgxLDE4KZLKPyGf0q9yZ2IoMTc3LDE4MSwxOCmSyj8huBuvcmdiKDE3NywxODEsMTgpkso/IdBjr3JnYigxNzcsMTgxLDE4KZLKPyHoq69yZ2IoMTc2LDE4MiwxOSmSyj8iAPOvcmdiKDE3NiwxODIsMTkpkso/Ihk7r3JnYigxNzYsMTgyLDE5KZLKPyIxg69yZ2IoMTc2LDE4MiwxOSmSyj8iScuvcmdiKDE3NiwxODIsMTkpkso/ImITr3JnYigxNzYsMTgyLDE5KZLKPyJ6W69yZ2IoMTc2LDE4MiwyMCmSyj8ikqOvcmdiKDE3NiwxODIsMjApkso/Iqrrr3JnYigxNzYsMTgyLDIwKZLKPyLDNK9yZ2IoMTc2LDE4MiwyMCmSyj8i23yvcmdiKDE3NiwxODIsMjApkso/IvPEr3JnYigxNzYsMTgyLDIwKZLKPyMMDK9yZ2IoMTc2LDE4MiwyMCmSyj8jJFSvcmdiKDE3NiwxODIsMjEpkso/Izycr3JnYigxNzYsMTgzLDIxKZLKPyNU5K9yZ2IoMTc2LDE4MywyMSmSyj8jbSyvcmdiKDE3NiwxODMsMjEpkso/I4V0r3JnYigxNzYsMTgzLDIxKZLKPyOdvK9yZ2IoMTc2LDE4MywyMSmSyj8jtgSvcmdiKDE3NSwxODMsMjIpkso/I85Mr3JnYigxNzUsMTgzLDIyKZLKPyPmla9yZ2IoMTc1LDE4MywyMimSyj8j/t2vcmdiKDE3NSwxODMsMjIpkso/JBclr3JnYigxNzUsMTgzLDIyKZLKPyQvba9yZ2IoMTc1LDE4MywyMymSyj8kR7WvcmdiKDE3NSwxODMsMjMpkso/JF/9r3JnYigxNzUsMTgzLDIzKZLKPyR4Ra9yZ2IoMTc1LDE4MywyMymSyj8kkI2vcmdiKDE3NSwxODMsMjMpkso/JKjVr3JnYigxNzUsMTg0LDIzKZLKPyTBHa9yZ2IoMTc1LDE4NCwyNCmSyj8k2WWvcmdiKDE3NSwxODQsMjQpkso/JPGtr3JnYigxNzUsMTg0LDI0KZLKPyUJ9q9yZ2IoMTc1LDE4NCwyNCmSyj8lIj6vcmdiKDE3NSwxODQsMjQpkso/JTqGr3JnYigxNzUsMTg0LDI1KZLKPyVSzq9yZ2IoMTc1LDE4NCwyNSmSyj8laxavcmdiKDE3NCwxODQsMjUpkso/JYNer3JnYigxNzQsMTg0LDI1KZLKPyWbpq9yZ2IoMTc0LDE4NCwyNSmSyj8ls+6vcmdiKDE3NCwxODQsMjYpkso/Jcw2r3JnYigxNzQsMTg0LDI2KZLKPyXkfq9yZ2IoMTc0LDE4NCwyNimSyj8l/MavcmdiKDE3NCwxODQsMjYpkso/JhUPr3JnYigxNzQsMTg0LDI2KZLKPyYtV69yZ2IoMTc0LDE4NSwyNymSyj8mRZ+vcmdiKDE3NCwxODUsMjcpkso/Jl3nr3JnYigxNzQsMTg1LDI3KZLKPyZ2L69yZ2IoMTc0LDE4NSwyNymSyj8mjnevcmdiKDE3NCwxODUsMjcpkso/Jqa/r3JnYigxNzQsMTg1LDI4KZLKPya/B69yZ2IoMTc0LDE4NSwyOCmSyj8m10+vcmdiKDE3NCwxODUsMjgpkso/Ju+Xr3JnYigxNzQsMTg1LDI4KZLKPycH369yZ2IoMTc0LDE4NSwyOCmSyj8nICevcmdiKDE3NCwxODUsMjkpkso/Jzhwr3JnYigxNzMsMTg1LDI5KZLKPydQuK9yZ2IoMTczLDE4NSwyOSmSyj8naQCvcmdiKDE3MywxODUsMjkpkso/J4FIr3JnYigxNzMsMTg1LDI5KZLKPyeZkK9yZ2IoMTczLDE4NSwzMCmSyj8nsdivcmdiKDE3MywxODYsMzApkso/J8ogr3JnYigxNzMsMTg2LDMwKZLKPyfiaK9yZ2IoMTczLDE4NiwzMCmSyj8n+rCvcmdiKDE3MywxODYsMzEpkso/KBL4r3JnYigxNzMsMTg2LDMxKZLKPygrQK9yZ2IoMTczLDE4NiwzMSmSyj8oQ4ivcmdiKDE3MywxODYsMzEpkso/KFvRr3JnYigxNzMsMTg2LDMxKZLKPyh0Ga9yZ2IoMTczLDE4NiwzMimSyj8ojGGvcmdiKDE3MywxODYsMzIpkso/KKSpr3JnYigxNzMsMTg2LDMyKZLKPyi88a9yZ2IoMTczLDE4NiwzMimSyj8o1TmvcmdiKDE3MywxODYsMzMpkso/KO2Br3JnYigxNzMsMTg2LDMzKZLKPykFya9yZ2IoMTcyLDE4NiwzMymSyj8pHhGvcmdiKDE3MiwxODYsMzMpkso/KTZZr3JnYigxNzIsMTg2LDM0KZLKPylOoa9yZ2IoMTcyLDE4NywzNCmSyj8pZuqvcmdiKDE3MiwxODcsMzQpkso/KX8yr3JnYigxNzIsMTg3LDM0KZLKPymXeq9yZ2IoMTcyLDE4NywzNSmSyj8pr8KvcmdiKDE3MiwxODcsMzUpkso/KcgKr3JnYigxNzIsMTg3LDM1KZLKPyngUq9yZ2IoMTcyLDE4NywzNSmSyj8p+JqvcmdiKDE3MiwxODcsMzYpkso/KhDir3JnYigxNzIsMTg3LDM2KZLKPyopKq9yZ2IoMTcyLDE4NywzNimSyj8qQXKvcmdiKDE3MiwxODcsMzYpkso/Klm6r3JnYigxNzIsMTg3LDM3KZLKPypyAq9yZ2IoMTcyLDE4NywzNymSyj8qikuvcmdiKDE3MiwxODcsMzcpkso/KqKTr3JnYigxNzIsMTg3LDM3KZLKPyq6269yZ2IoMTcyLDE4NywzOCmSyj8q0yOvcmdiKDE3MSwxODcsMzgpkso/Kutrr3JnYigxNzEsMTg4LDM4KZLKPysDs69yZ2IoMTcxLDE4OCwzOCmSyj8rG/uvcmdiKDE3MSwxODgsMzkpkso/KzRDr3JnYigxNzEsMTg4LDM5KZLKPytMi69yZ2IoMTcxLDE4OCwzOSmSyj8rZNOvcmdiKDE3MSwxODgsMzkpkso/K30br3JnYigxNzEsMTg4LDQwKZLKPyuVY69yZ2IoMTcxLDE4OCw0MCmSyj8rrayvcmdiKDE3MSwxODgsNDApkso/K8X0r3JnYigxNzEsMTg4LDQxKZLKPyvePK9yZ2IoMTcxLDE4OCw0MSmSyj8r9oSvcmdiKDE3MSwxODgsNDEpkso/LA7Mr3JnYigxNzEsMTg4LDQxKZLKPywnFK9yZ2IoMTcxLDE4OCw0MimSyj8sP1yvcmdiKDE3MSwxODgsNDIpkso/LFekr3JnYigxNzEsMTg4LDQyKZLKPyxv7K9yZ2IoMTcxLDE4OCw0MimSyj8siDSvcmdiKDE3MSwxODgsNDMpkso/LKB8r3JnYigxNzEsMTg4LDQzKZLKPyy4xa9yZ2IoMTcwLDE4OSw0MymSyj8s0Q2vcmdiKDE3MCwxODksNDQpkso/LOlVr3JnYigxNzAsMTg5LDQ0KZLKPy0Bna9yZ2IoMTcwLDE4OSw0NCmSyj8tGeWvcmdiKDE3MCwxODksNDQpkso/LTItr3JnYigxNzAsMTg5LDQ1KZLKPy1Kda9yZ2IoMTcwLDE4OSw0NSmSyj8tYr2vcmdiKDE3MCwxODksNDUpkso/LXsFr3JnYigxNzAsMTg5LDQ2KZLKPy2TTa9yZ2IoMTcwLDE4OSw0NimSyj8tq5WvcmdiKDE3MCwxODksNDYpkso/LcPdr3JnYigxNzAsMTg5LDQ2KZLKPy3cJq9yZ2IoMTcwLDE4OSw0NymSyj8t9G6vcmdiKDE3MCwxODksNDcpkso/Lgy2r3JnYigxNzAsMTg5LDQ3KZLKPy4k/q9yZ2IoMTcwLDE4OSw0OCmSyj8uPUavcmdiKDE3MCwxODksNDgpkso/LlWOr3JnYigxNzAsMTg5LDQ4KZLKPy5t1q9yZ2IoMTcwLDE4OSw0OCmSyj8uhh6vcmdiKDE2OSwxODksNDkpkso/Lp5mr3JnYigxNjksMTkwLDQ5KZLKPy62rq9yZ2IoMTY5LDE5MCw0OSmSyj8uzvavcmdiKDE2OSwxOTAsNTApkso/Luc/r3JnYigxNjksMTkwLDUwKZLKPy7/h69yZ2IoMTY5LDE5MCw1MCmSyj8vF8+vcmdiKDE2OSwxOTAsNTEpkso/LzAXr3JnYigxNjksMTkwLDUxKZLKPy9IX69yZ2IoMTY5LDE5MCw1MSmSyj8vYKevcmdiKDE2OSwxOTAsNTEpkso/L3jvr3JnYigxNjksMTkwLDUyKZLKPy+RN69yZ2IoMTY5LDE5MCw1MimSyj8vqX+vcmdiKDE2OSwxOTAsNTIpkso/L8HHr3JnYigxNjksMTkwLDUzKZLKPy/aD69yZ2IoMTY5LDE5MCw1MymSyj8v8levcmdiKDE2OSwxOTAsNTMpkso/MAqgr3JnYigxNjksMTkwLDU0KZLKPzAi6K9yZ2IoMTY5LDE5MCw1NCmSyj8wOzCvcmdiKDE2OSwxOTAsNTQpkso/MFN4r3JnYigxNjksMTkwLDU1KZLKPzBrwK9yZ2IoMTY5LDE5MCw1NSmSyj8whAivcmdiKDE2OCwxOTAsNTUpkso/MJxQr3JnYigxNjgsMTkxLDU1KZLKPzC0mK9yZ2IoMTY4LDE5MSw1NimSyj8wzOCvcmdiKDE2OCwxOTEsNTYpkso/MOUor3JnYigxNjgsMTkxLDU2KZLKPzD9cK9yZ2IoMTY4LDE5MSw1NymSyj8xFbivcmdiKDE2OCwxOTEsNTcpkso/MS4Br3JnYigxNjgsMTkxLDU3KZLKPzFGSa9yZ2IoMTY4LDE5MSw1OCmSyj8xXpGvcmdiKDE2OCwxOTEsNTgpkso/MXbZr3JnYigxNjgsMTkxLDU4KZLKPzGPIa9yZ2IoMTY4LDE5MSw1OSmSyj8xp2mvcmdiKDE2OCwxOTEsNTkpkso/Mb+xr3JnYigxNjgsMTkxLDU5KZLKPzHX+a9yZ2IoMTY4LDE5MSw2MCmSyj8x8EGvcmdiKDE2OCwxOTEsNjApkso/MgiJr3JnYigxNjgsMTkxLDYwKZLKPzIg0a9yZ2IoMTY4LDE5MSw2MSmSyj8yORqvcmdiKDE2OCwxOTEsNjEpkso/MlFir3JnYigxNjgsMTkxLDYxKZLKPzJpqq9yZ2IoMTY4LDE5MSw2MimSyj8ygfKvcmdiKDE2NywxOTEsNjIpkso/Mpo6r3JnYigxNjcsMTkxLDYyKZLKPzKygq9yZ2IoMTY3LDE5Miw2MymSyj8yysqvcmdiKDE2NywxOTIsNjMpkso/MuMSr3JnYigxNjcsMTkyLDYzKZLKPzL7Wq9yZ2IoMTY3LDE5Miw2MymSyj8zE6KvcmdiKDE2NywxOTIsNjQpkso/Myvqr3JnYigxNjcsMTkyLDY0KZLKPzNEMq9yZ2IoMTY3LDE5Miw2NCmSyj8zXHuvcmdiKDE2NywxOTIsNjUpkso/M3TDr3JnYigxNjcsMTkyLDY1KZLKPzONC69yZ2IoMTY3LDE5Miw2NSmSyj8zpVOvcmdiKDE2NywxOTIsNjYpkso/M72br3JnYigxNjcsMTkyLDY2KZLKPzPV469yZ2IoMTY3LDE5Miw2NimSyj8z7iuvcmdiKDE2NywxOTIsNjcpkso/NAZzr3JnYigxNjcsMTkyLDY3KZLKPzQeu69yZ2IoMTY3LDE5Miw2NymSyj80NwOvcmdiKDE2NywxOTIsNjgpkso/NE9Lr3JnYigxNjcsMTkyLDY4KZLKPzRnk69yZ2IoMTY3LDE5Miw2OCmSyj80f9yvcmdiKDE2NywxOTIsNjkpkso/NJgkr3JnYigxNjYsMTkyLDY5KZLKPzSwbK9yZ2IoMTY2LDE5Miw2OSmSyj80yLSvcmdiKDE2NiwxOTIsNzApkso/NOD8r3JnYigxNjYsMTkyLDcwKZLKPzT5RK9yZ2IoMTY2LDE5Myw3MCmSyj81EYyvcmdiKDE2NiwxOTMsNzEpkso/NSnUr3JnYigxNjYsMTkzLDcxKZLKPzVCHK9yZ2IoMTY2LDE5Myw3MSmSyj81WmSvcmdiKDE2NiwxOTMsNzIpkso/NXKsr3JnYigxNjYsMTkzLDcyKZLKPzWK9a9yZ2IoMTY2LDE5Myw3MimSyj81oz2vcmdiKDE2NiwxOTMsNzMpkso/NbuFr3JnYigxNjYsMTkzLDczKZLKPzXTza9yZ2IoMTY2LDE5Myw3MymSyj817BWvcmdiKDE2NiwxOTMsNzQpkso/NgRdr3JnYigxNjYsMTkzLDc0KZLKPzYcpa9yZ2IoMTY2LDE5Myw3NCmSyj82NO2vcmdiKDE2NiwxOTMsNzUpkso/Nk01r3JnYigxNjYsMTkzLDc1KZLKPzZlfa9yZ2IoMTY2LDE5Myw3NSmSyj82fcWvcmdiKDE2NiwxOTMsNzYpkso/NpYNr3JnYigxNjYsMTkzLDc2KZLKPzauVq9yZ2IoMTY2LDE5Myw3NimSyj82xp6vcmdiKDE2NiwxOTMsNzcpkso/Nt7mr3JnYigxNjUsMTkzLDc3KZLKPzb3Lq9yZ2IoMTY1LDE5Myw3OCmSyj83D3avcmdiKDE2NSwxOTMsNzgpkso/Nye+r3JnYigxNjUsMTkzLDc4KZLKPzdABq9yZ2IoMTY1LDE5Myw3OSmSyj83WE6vcmdiKDE2NSwxOTMsNzkpkso/N3CWr3JnYigxNjUsMTk0LDc5KZLKPzeI3q9yZ2IoMTY1LDE5NCw4MCmSyj83oSavcmdiKDE2NSwxOTQsODApkso/N7lvr3JnYigxNjUsMTk0LDgwKZLKPzfRt69yZ2IoMTY1LDE5NCw4MSmSyj836f+vcmdiKDE2NSwxOTQsODEpkso/OAJHr3JnYigxNjUsMTk0LDgxKZLKPzgaj69yZ2IoMTY1LDE5NCw4MimSyj84MtevcmdiKDE2NSwxOTQsODIpkso/OEsfr3JnYigxNjUsMTk0LDgyKZLKPzhjZ69yZ2IoMTY1LDE5NCw4MymSyj84e6+vcmdiKDE2NSwxOTQsODMpkso/OJP3r3JnYigxNjUsMTk0LDgzKZLKPzisP69yZ2IoMTY1LDE5NCw4NCmSyj84xIevcmdiKDE2NSwxOTQsODQpkso/ONzQr3JnYigxNjUsMTk0LDg0KZLKPzj1GK9yZ2IoMTY1LDE5NCw4NSmSyj85DWCvcmdiKDE2NSwxOTQsODUpkso/OSWor3JnYigxNjUsMTk0LDg1KZLKPzk98K9yZ2IoMTY1LDE5NCw4NimSyj85VjivcmdiKDE2NCwxOTQsODYpkso/OW6Ar3JnYigxNjQsMTk0LDg2KZLKPzmGyK9yZ2IoMTY0LDE5NCw4NymSyj85nxCvcmdiKDE2NCwxOTQsODcpkso/ObdYr3JnYigxNjQsMTk0LDg3KZLKPznPoK9yZ2IoMTY0LDE5NCw4OCmSyj855+ivcmdiKDE2NCwxOTQsODgpkso/OgAxr3JnYigxNjQsMTk0LDg4KZLKPzoYea9yZ2IoMTY0LDE5NSw4OSmSyj86MMGvcmdiKDE2NCwxOTUsODkpkso/OkkJr3JnYigxNjQsMTk1LDg5KZLKPzphUa9yZ2IoMTY0LDE5NSw5MCmSyj86eZmvcmdiKDE2NCwxOTUsOTApkso/OpHhr3JnYigxNjQsMTk1LDkwKZLKPzqqKa9yZ2IoMTY0LDE5NSw5MSmSyj86wnGvcmdiKDE2NCwxOTUsOTEpkso/Otq5r3JnYigxNjQsMTk1LDkxKZLKPzrzAa9yZ2IoMTY0LDE5NSw5MimSyj87C0qvcmdiKDE2NCwxOTUsOTIpkso/OyOSr3JnYigxNjQsMTk1LDkyKZLKPzs72q9yZ2IoMTY0LDE5NSw5MymSyj87VCKvcmdiKDE2NCwxOTUsOTMpkso/O2xqr3JnYigxNjQsMTk1LDkzKZLKPzuEsq9yZ2IoMTY0LDE5NSw5NCmSyj87nPqvcmdiKDE2NCwxOTUsOTQpkso/O7VCr3JnYigxNjQsMTk1LDk0KZLKPzvNiq9yZ2IoMTY0LDE5NSw5NSmSyj875dKvcmdiKDE2NCwxOTUsOTUpkso/O/4ar3JnYigxNjQsMTk1LDk1KZLKPzwWYq9yZ2IoMTYzLDE5NSw5NimSyj88LquvcmdiKDE2MywxOTUsOTYpkso/PEbzr3JnYigxNjMsMTk1LDk2KZLKPzxfO69yZ2IoMTYzLDE5NSw5NymSyj88d4OvcmdiKDE2MywxOTUsOTcpkso/PI/Lr3JnYigxNjMsMTk1LDk3KZLKPzyoE69yZ2IoMTYzLDE5NSw5OCmSyj88wFuvcmdiKDE2MywxOTUsOTgpkso/PNijr3JnYigxNjMsMTk1LDk4KZLKPzzw669yZ2IoMTYzLDE5Niw5OSmSyj89CTOvcmdiKDE2MywxOTYsOTkpkso/PSF7r3JnYigxNjMsMTk2LDk5KZLKPz05w7ByZ2IoMTYzLDE5NiwxMDApkso/PVIMsHJnYigxNjMsMTk2LDEwMCmSyj89alSwcmdiKDE2MywxOTYsMTAwKZLKPz2CnLByZ2IoMTYzLDE5NiwxMDEpkso/PZrksHJnYigxNjMsMTk2LDEwMSmSyj89syywcmdiKDE2MywxOTYsMTAxKZLKPz3LdLByZ2IoMTYzLDE5NiwxMDIpkso/PeO8sHJnYigxNjMsMTk2LDEwMimSyj89/ASwcmdiKDE2MywxOTYsMTAyKZLKPz4UTLByZ2IoMTYzLDE5NiwxMDMpkso/PiyUsHJnYigxNjMsMTk2LDEwMymSyj8+RNywcmdiKDE2MywxOTYsMTAzKZLKPz5dJbByZ2IoMTYzLDE5NiwxMDQpkso/PnVtsHJnYigxNjMsMTk2LDEwNCmSyj8+jbWwcmdiKDE2MywxOTYsMTA0KZLKPz6l/bByZ2IoMTYzLDE5NiwxMDQpkso/Pr5FsHJnYigxNjMsMTk2LDEwNSmSyj8+1o2wcmdiKDE2MywxOTYsMTA1KZLKPz7u1bByZ2IoMTYzLDE5NiwxMDUpkso/PwcdsHJnYigxNjMsMTk2LDEwNimSyj8/H2WwcmdiKDE2MywxOTYsMTA2KZLKPz83rbByZ2IoMTYzLDE5NiwxMDYpkso/P0/1sHJnYigxNjMsMTk2LDEwNymSyj8/aD2wcmdiKDE2MiwxOTYsMTA3KZLKPz+AhrByZ2IoMTYyLDE5NiwxMDcpkso/P5jOsHJnYigxNjIsMTk2LDEwOCmSyj8/sRawcmdiKDE2MiwxOTYsMTA4KZLKPz/JXrByZ2IoMTYyLDE5NiwxMDgpkso/P+GmsHJnYigxNjIsMTk2LDEwOSmSyj8/+e6wcmdiKDE2MiwxOTYsMTA5KZLKP0ASNrByZ2IoMTYyLDE5NiwxMDkpkso/QCp+sHJnYigxNjIsMTk2LDExMCmSyj9AQsawcmdiKDE2MiwxOTcsMTEwKZLKP0BbDrByZ2IoMTYyLDE5NywxMTApkso/QHNWsHJnYigxNjIsMTk3LDExMSmSyj9Ai56wcmdiKDE2MiwxOTcsMTExKZLKP0Cj57ByZ2IoMTYyLDE5NywxMTEpkso/QLwvsHJnYigxNjIsMTk3LDExMSmSyj9A1HewcmdiKDE2MiwxOTcsMTEyKZLKP0Dsv7ByZ2IoMTYyLDE5NywxMTIpkso/QQUHsHJnYigxNjIsMTk3LDExMimSyj9BHU+wcmdiKDE2MiwxOTcsMTEzKZLKP0E1l7ByZ2IoMTYyLDE5NywxMTMpkso/QU3fsHJnYigxNjIsMTk3LDExMymSyj9BZiewcmdiKDE2MiwxOTcsMTE0KZLKP0F+b7ByZ2IoMTYyLDE5NywxMTQpkso/QZa3sHJnYigxNjIsMTk3LDExNCmSyj9BrwCwcmdiKDE2MiwxOTcsMTE1KZLKP0HHSLByZ2IoMTYyLDE5NywxMTUpkso/Qd+QsHJnYigxNjIsMTk3LDExNSmSyj9B99iwcmdiKDE2MiwxOTcsMTE1KZLKP0IQILByZ2IoMTYyLDE5NywxMTYpkso/QihosHJnYigxNjIsMTk3LDExNimSyj9CQLCwcmdiKDE2MiwxOTcsMTE2KZLKP0JY+LByZ2IoMTYyLDE5NywxMTcpkso/QnFAsHJnYigxNjIsMTk3LDExNymSyj9CiYiwcmdiKDE2MiwxOTcsMTE3KZLKP0Kh0LByZ2IoMTYyLDE5NywxMTgpkso/QroYsHJnYigxNjIsMTk3LDExOCmSyj9C0mGwcmdiKDE2MiwxOTcsMTE4KZLKP0LqqbByZ2IoMTYyLDE5NywxMTgpkso/QwLxsHJnYigxNjIsMTk3LDExOSmSyj9DGzmwcmdiKDE2MiwxOTcsMTE5KZLKP0MzgbByZ2IoMTYyLDE5NywxMTkpkso/Q0vJsHJnYigxNjIsMTk3LDEyMCmSyj9DZBGwcmdiKDE2MiwxOTcsMTIwKZLKP0N8WbByZ2IoMTYyLDE5NywxMjApkso/Q5ShsHJnYigxNjIsMTk3LDEyMSmSyj9DrOmwcmdiKDE2MiwxOTcsMTIxKZLKP0PFMbByZ2IoMTYyLDE5NywxMjEpkso/Q916sHJnYigxNjIsMTk4LDEyMSmSyj9D9cKwcmdiKDE2MiwxOTgsMTIyKZLKP0QOCrByZ2IoMTYyLDE5OCwxMjIpkso/RCZSsHJnYigxNjIsMTk4LDEyMimSyj9EPpqwcmdiKDE2MSwxOTgsMTIzKZLKP0RW4rByZ2IoMTYxLDE5OCwxMjMpkso/RG8qsHJnYigxNjEsMTk4LDEyMymSyj9Eh3KwcmdiKDE2MSwxOTgsMTIzKZLKP0SfurByZ2IoMTYxLDE5OCwxMjQpkso/RLgCsHJnYigxNjEsMTk4LDEyNCmSyj9E0EqwcmdiKDE2MSwxOTgsMTI0KZLKP0TokrByZ2IoMTYxLDE5OCwxMjUpkso/RQDbsHJnYigxNjEsMTk4LDEyNSmSyj9FGSOwcmdiKDE2MSwxOTgsMTI1KZLKP0Uxa7ByZ2IoMTYxLDE5OCwxMjUpkso/RUmzsHJnYigxNjEsMTk4LDEyNimSyj9FYfuwcmdiKDE2MSwxOTgsMTI2KZLKP0V6Q7ByZ2IoMTYxLDE5OCwxMjYpkso/RZKLsHJnYigxNjEsMTk4LDEyNymSyj9FqtOwcmdiKDE2MSwxOTgsMTI3KZLKP0XDG7ByZ2IoMTYxLDE5OCwxMjcpkso/RdtjsHJnYigxNjEsMTk4LDEyNymSyj9F86uwcmdiKDE2MSwxOTgsMTI4KZLKP0YL87ByZ2IoMTYxLDE5OCwxMjgpkso/RiQ8sHJnYigxNjEsMTk4LDEyOCmSyj9GPISwcmdiKDE2MSwxOTgsMTI5KZLKP0ZUzLByZ2IoMTYxLDE5OCwxMjkpkso/Rm0UsHJnYigxNjEsMTk4LDEyOSmSyj9GhVywcmdiKDE2MSwxOTgsMTI5KZLKP0adpLByZ2IoMTYxLDE5OCwxMzApkso/RrXssHJnYigxNjEsMTk4LDEzMCmSyj9GzjSwcmdiKDE2MSwxOTgsMTMwKZLKP0bmfLByZ2IoMTYxLDE5OCwxMzApkso/Rv7EsHJnYigxNjEsMTk4LDEzMSmSyj9HFwywcmdiKDE2MSwxOTgsMTMxKZLKP0cvVbByZ2IoMTYxLDE5OCwxMzEpkso/R0edsHJnYigxNjEsMTk4LDEzMimSyj9HX+WwcmdiKDE2MSwxOTgsMTMyKZLKP0d4LbByZ2IoMTYxLDE5OCwxMzIpkso/R5B1sHJnYigxNjEsMTk4LDEzMimSyj9HqL2wcmdiKDE2MSwxOTgsMTMzKZLKP0fBBbByZ2IoMTYxLDE5OCwxMzMpkso/R9lNsHJnYigxNjEsMTk4LDEzMymSyj9H8ZWwcmdiKDE2MSwxOTgsMTMzKZLKP0gJ3bByZ2IoMTYxLDE5OCwxMzQpkso/SCIlsHJnYigxNjEsMTk4LDEzNCmSyj9IOm2wcmdiKDE2MSwxOTksMTM0KZLKP0hStrByZ2IoMTYxLDE5OSwxMzQpkso/SGr+sHJnYigxNjEsMTk5LDEzNSmSyj9Ig0awcmdiKDE2MSwxOTksMTM1KZLKP0ibjrByZ2IoMTYxLDE5OSwxMzUpkso/SLPWsHJnYigxNjEsMTk5LDEzNSmSyj9IzB6wcmdiKDE2MSwxOTksMTM2KZLKP0jkZrByZ2IoMTYxLDE5OSwxMzYpkso/SPyusHJnYigxNjEsMTk5LDEzNimSyj9JFPawcmdiKDE2MSwxOTksMTM2KZLKP0ktPrByZ2IoMTYxLDE5OSwxMzcpkso/SUWGsHJnYigxNjEsMTk5LDEzNymSyj9JXc6wcmdiKDE2MSwxOTksMTM3KZLKP0l2F7ByZ2IoMTYxLDE5OSwxMzcpkso/SY5fsHJnYigxNjEsMTk5LDEzOCmSyj9JpqewcmdiKDE2MSwxOTksMTM4KZLKP0m+77ByZ2IoMTYxLDE5OSwxMzgpkso/Sdc3sHJnYigxNjEsMTk5LDEzOCmSyj9J73+wcmdiKDE2MSwxOTksMTM5KZLKP0oHx7ByZ2IoMTYxLDE5OSwxMzkpkso/SiAPsHJnYigxNjEsMTk5LDEzOSmSyj9KOFewcmdiKDE2MSwxOTksMTM5KZLKP0pQn7ByZ2IoMTYxLDE5OSwxNDApkso/SmjnsHJnYigxNjEsMTk5LDE0MCmSyj9KgTCwcmdiKDE2MSwxOTksMTQwKZLKP0qZeLByZ2IoMTYxLDE5OSwxNDApkso/SrHAsHJnYigxNjEsMTk5LDE0MSmSyj9KygiwcmdiKDE2MSwxOTksMTQxKZLKP0riULByZ2IoMTYxLDE5OSwxNDEpkso/SvqYsHJnYigxNjEsMTk5LDE0MSmSyj9LEuCwcmdiKDE2MSwxOTksMTQyKZLKP0srKLByZ2IoMTYxLDE5OSwxNDIpkso/S0NwsHJnYigxNjEsMTk5LDE0MimSyj9LW7iwcmdiKDE2MSwxOTksMTQyKZLKP0t0ALByZ2IoMTYxLDE5OSwxNDMpkso/S4xIsHJnYigxNjEsMTk5LDE0MymSyj9LpJGwcmdiKDE2MSwxOTksMTQzKZLKP0u82bByZ2IoMTYxLDE5OSwxNDMpkso/S9UhsHJnYigxNjEsMTk5LDE0NCmSyj9L7WmwcmdiKDE2MSwxOTksMTQ0KZLKP0wFsbByZ2IoMTYxLDE5OSwxNDQpkso/TB35sHJnYigxNjEsMTk5LDE0NCmSyj9MNkGwcmdiKDE2MSwxOTksMTQ1KZLKP0xOibByZ2IoMTYxLDE5OSwxNDUpkso/TGbRsHJnYigxNjEsMTk5LDE0NSmSyj9MfxmwcmdiKDE2MSwxOTksMTQ1KZLKP0yXYbByZ2IoMTYxLDE5OSwxNDUpkso/TK+psHJnYigxNjEsMTk5LDE0NimSyj9Mx/KwcmdiKDE2MSwxOTksMTQ2KZLKP0zgOrByZ2IoMTYxLDE5OSwxNDYpkso/TPiCsHJnYigxNjEsMTk5LDE0NimSyj9NEMqwcmdiKDE2MSwxOTksMTQ3KZLKP00pErByZ2IoMTYxLDE5OSwxNDcpkso/TUFasHJnYigxNjEsMTk5LDE0NymSyj9NWaKwcmdiKDE2MSwxOTksMTQ3KZLKP01x6rByZ2IoMTYxLDE5OSwxNDcpkso/TYoysHJnYigxNjEsMjAwLDE0OCmSyj9NonqwcmdiKDE2MSwyMDAsMTQ4KZLKP026wrByZ2IoMTYxLDIwMCwxNDgpkso/TdMLsHJnYigxNjEsMjAwLDE0OCmSyj9N61OwcmdiKDE2MSwyMDAsMTQ5KZLKP04Dm7ByZ2IoMTYxLDIwMCwxNDkpkso/ThvjsHJnYigxNjIsMjAwLDE0OSmSyj9ONCuwcmdiKDE2MiwyMDAsMTQ5KZLKP05Mc7ByZ2IoMTYyLDIwMCwxNDkpkso/TmS7sHJnYigxNjIsMjAwLDE1MCmSyj9OfQOwcmdiKDE2MiwyMDAsMTUwKZLKP06VS7ByZ2IoMTYyLDIwMCwxNTApkso/Tq2TsHJnYigxNjIsMjAwLDE1MCmSyj9OxduwcmdiKDE2MiwyMDAsMTUxKZLKP07eI7ByZ2IoMTYyLDIwMCwxNTEpkso/TvZssHJnYigxNjIsMjAwLDE1MSmSyj9PDrSwcmdiKDE2MiwyMDAsMTUxKZLKP08m/LByZ2IoMTYyLDIwMCwxNTEpkso/Tz9EsHJnYigxNjIsMjAwLDE1MimSyj9PV4ywcmdiKDE2MiwyMDAsMTUyKZLKP09v1LByZ2IoMTYyLDIwMCwxNTIpkso/T4gcsHJnYigxNjIsMjAwLDE1MimSyj9PoGSwcmdiKDE2MiwyMDAsMTUyKZLKP0+4rLByZ2IoMTYyLDIwMCwxNTMpkso/T9D0sHJnYigxNjIsMjAwLDE1MymSyj9P6TywcmdiKDE2MiwyMDAsMTUzKZLKP1ABhbByZ2IoMTYyLDIwMCwxNTMpkso/UBnNsHJnYigxNjIsMjAwLDE1MymSyj9QMhWwcmdiKDE2MiwyMDAsMTU0KZLKP1BKXbByZ2IoMTYyLDIwMCwxNTQpkso/UGKlsHJnYigxNjIsMjAwLDE1NCmSyj9Qeu2wcmdiKDE2MiwyMDAsMTU0KZLKP1CTNbByZ2IoMTYyLDIwMCwxNTQpkso/UKt9sHJnYigxNjIsMjAwLDE1NSmSyj9Qw8WwcmdiKDE2MiwyMDAsMTU1KZLKP1DcDbByZ2IoMTYyLDIwMCwxNTUpkso/UPRVsHJnYigxNjIsMjAwLDE1NSmSyj9RDJ2wcmdiKDE2MiwyMDAsMTU1KZLKP1Ek5rByZ2IoMTYyLDIwMCwxNTYpkso/UT0usHJnYigxNjIsMjAwLDE1NimSyj9RVXawcmdiKDE2MiwyMDAsMTU2KZLKP1FtvrByZ2IoMTYyLDIwMCwxNTYpkso/UYYGsHJnYigxNjIsMjAwLDE1NimSyj9Rnk6wcmdiKDE2MiwyMDAsMTU3KZLKP1G2lrByZ2IoMTYyLDIwMCwxNTcpkso/Uc7esHJnYigxNjIsMjAwLDE1NymSyj9R5yawcmdiKDE2MiwyMDAsMTU3KZLKP1H/brByZ2IoMTYyLDIwMCwxNTcpkso/Uhe2sHJnYigxNjIsMjAwLDE1OCmSyj9SL/6wcmdiKDE2MiwyMDAsMTU4KZLKP1JIR7ByZ2IoMTYyLDIwMCwxNTgpkso/UmCPsHJnYigxNjIsMjAwLDE1OCmSyj9SeNewcmdiKDE2MywyMDAsMTU4KZLKP1KRH7ByZ2IoMTYzLDIwMCwxNTkpkso/UqlnsHJnYigxNjMsMjAwLDE1OSmSyj9Swa+wcmdiKDE2MywyMDAsMTU5KZLKP1LZ97ByZ2IoMTYzLDIwMCwxNTkpkso/UvI/sHJnYigxNjMsMjAwLDE1OSmSyj9TCoewcmdiKDE2MywyMDAsMTU5KZLKP1Miz7ByZ2IoMTYzLDIwMCwxNjApkso/UzsXsHJnYigxNjMsMjAwLDE2MCmSyj9TU2CwcmdiKDE2MywyMDAsMTYwKZLKP1NrqLByZ2IoMTYzLDIwMCwxNjApkso/U4PwsHJnYigxNjMsMjAwLDE2MCmSyj9TnDiwcmdiKDE2MywyMDAsMTYxKZLKP1O0gLByZ2IoMTYzLDIwMCwxNjEpkso/U8zIsHJnYigxNjMsMjAwLDE2MSmSyj9T5RCwcmdiKDE2MywyMDAsMTYxKZLKP1P9WLByZ2IoMTYzLDIwMCwxNjEpkso/VBWgsHJnYigxNjMsMjAwLDE2MSmSyj9ULeiwcmdiKDE2MywyMDAsMTYyKZLKP1RGMLByZ2IoMTYzLDIwMCwxNjIpkso/VF54sHJnYigxNjMsMjAwLDE2MimSyj9UdsGwcmdiKDE2MywyMDAsMTYyKZLKP1SPCbByZ2IoMTYzLDIwMCwxNjIpkso/VKdRsHJnYigxNjMsMjAwLDE2MymSyj9Uv5mwcmdiKDE2MywyMDAsMTYzKZLKP1TX4bByZ2IoMTYzLDIwMSwxNjMpkso/VPApsHJnYigxNjMsMjAxLDE2MymSyj9VCHGwcmdiKDE2MywyMDEsMTYzKZLKP1UgubByZ2IoMTYzLDIwMSwxNjMpkso/VTkBsHJnYigxNjQsMjAxLDE2NCmSyj9VUUmwcmdiKDE2NCwyMDEsMTY0KZLKP1VpkbByZ2IoMTY0LDIwMSwxNjQpkso/VYHZsHJnYigxNjQsMjAxLDE2NCmSyj9VmiKwcmdiKDE2NCwyMDEsMTY0KZLKP1WyarByZ2IoMTY0LDIwMSwxNjQpkso/VcqysHJnYigxNjQsMjAxLDE2NSmSyj9V4vqwcmdiKDE2NCwyMDEsMTY1KZLKP1X7QrByZ2IoMTY0LDIwMSwxNjUpkso/VhOKsHJnYigxNjQsMjAxLDE2NSmSyj9WK9KwcmdiKDE2NCwyMDEsMTY1KZLKP1ZEGrByZ2IoMTY0LDIwMSwxNjUpkso/VlxisHJnYigxNjQsMjAxLDE2NimSyj9WdKqwcmdiKDE2NCwyMDEsMTY2KZLKP1aM8rByZ2IoMTY0LDIwMSwxNjYpkso/VqU7sHJnYigxNjQsMjAxLDE2NimSyj9WvYOwcmdiKDE2NCwyMDEsMTY2KZLKP1bVy7ByZ2IoMTY0LDIwMSwxNjYpkso/Vu4TsHJnYigxNjQsMjAxLDE2NymSyj9XBluwcmdiKDE2NCwyMDEsMTY3KZLKP1ceo7ByZ2IoMTY0LDIwMSwxNjcpkso/VzbrsHJnYigxNjQsMjAxLDE2NymSyj9XTzOwcmdiKDE2NCwyMDEsMTY3KZLKP1dne7ByZ2IoMTY0LDIwMSwxNjcpkso/V3/DsHJnYigxNjQsMjAxLDE2NymSyj9XmAuwcmdiKDE2NSwyMDEsMTY4KZLKP1ewU7ByZ2IoMTY1LDIwMSwxNjgpkso/V8icsHJnYigxNjUsMjAxLDE2OCmSyj9X4OSwcmdiKDE2NSwyMDEsMTY4KZLKP1f5LLByZ2IoMTY1LDIwMSwxNjgpkso/WBF0sHJnYigxNjUsMjAxLDE2OCmSyj9YKbywcmdiKDE2NSwyMDEsMTY5KZLKP1hCBLByZ2IoMTY1LDIwMSwxNjkpkso/WFpMsHJnYigxNjUsMjAxLDE2OSmSyj9YcpSwcmdiKDE2NSwyMDEsMTY5KZLKP1iK3LByZ2IoMTY1LDIwMSwxNjkpkso/WKMksHJnYigxNjUsMjAxLDE2OSmSyj9Yu2ywcmdiKDE2NSwyMDEsMTY5KZLKP1jTtLByZ2IoMTY1LDIwMSwxNzApkso/WOv9sHJnYigxNjUsMjAxLDE3MCmSyj9ZBEWwcmdiKDE2NSwyMDEsMTcwKZLKP1kcjbByZ2IoMTY1LDIwMSwxNzApkso/WTTVsHJnYigxNjUsMjAxLDE3MCmSyj9ZTR2wcmdiKDE2NSwyMDEsMTcwKZLKP1llZbByZ2IoMTY1LDIwMSwxNzApkso/WX2tsHJnYigxNjYsMjAxLDE3MSmSyj9ZlfWwcmdiKDE2NiwyMDEsMTcxKZLKP1muPbByZ2IoMTY2LDIwMSwxNzEpkso/WcaFsHJnYigxNjYsMjAxLDE3MSmSyj9Z3s2wcmdiKDE2NiwyMDEsMTcxKZLKP1n3FrByZ2IoMTY2LDIwMSwxNzEpkso/Wg9esHJnYigxNjYsMjAxLDE3MSmSyj9aJ6awcmdiKDE2NiwyMDEsMTcyKZLKP1o/7rByZ2IoMTY2LDIwMSwxNzIpkso/Wlg2sHJnYigxNjYsMjAxLDE3MimSyj9acH6wcmdiKDE2NiwyMDEsMTcyKZLKP1qIxrByZ2IoMTY2LDIwMSwxNzIpkso/WqEOsHJnYigxNjYsMjAxLDE3MimSyj9auVawcmdiKDE2NiwyMDEsMTcyKZLKP1rRnrByZ2IoMTY2LDIwMSwxNzMpkso/WunmsHJnYigxNjYsMjAxLDE3MymSyj9bAi6wcmdiKDE2NiwyMDEsMTczKZLKP1sad7ByZ2IoMTY2LDIwMSwxNzMpkso/WzK/sHJnYigxNjYsMjAxLDE3MymSyj9bSwewcmdiKDE2NywyMDEsMTczKZLKP1tjT7ByZ2IoMTY3LDIwMSwxNzMpkso/W3uXsHJnYigxNjcsMjAxLDE3MymSyj9bk9+wcmdiKDE2NywyMDEsMTc0KZLKP1usJ7ByZ2IoMTY3LDIwMSwxNzQpkso/W8RvsHJnYigxNjcsMjAxLDE3NCmSyj9b3LewcmdiKDE2NywyMDEsMTc0KZLKP1v0/7ByZ2IoMTY3LDIwMSwxNzQpkso/XA1HsHJnYigxNjcsMjAxLDE3NCmSyj9cJZCwcmdiKDE2NywyMDEsMTc0KZLKP1w92LByZ2IoMTY3LDIwMSwxNzUpkso/XFYgsHJnYigxNjcsMjAxLDE3NSmSyj9cbmiwcmdiKDE2NywyMDEsMTc1KZLKP1yGsLByZ2IoMTY3LDIwMSwxNzUpkso/XJ74sHJnYigxNjcsMjAxLDE3NSmSyj9ct0CwcmdiKDE2NywyMDEsMTc1KZLKP1zPiLByZ2IoMTY3LDIwMSwxNzUpkso/XOfQsHJnYigxNjgsMjAxLDE3NSmSyj9dABiwcmdiKDE2OCwyMDEsMTc2KZLKP10YYLByZ2IoMTY4LDIwMSwxNzYpkso/XTCosHJnYigxNjgsMjAxLDE3NimSyj9dSPGwcmdiKDE2OCwyMDEsMTc2KZLKP11hObByZ2IoMTY4LDIwMSwxNzYpkso/XXmBsHJnYigxNjgsMjAxLDE3NimSyj9dkcmwcmdiKDE2OCwyMDEsMTc2KZLKP12qEbByZ2IoMTY4LDIwMSwxNzYpkso/XcJZsHJnYigxNjgsMjAxLDE3NimSyj9d2qGwcmdiKDE2OCwyMDEsMTc3KZLKP13y6bByZ2IoMTY4LDIwMSwxNzcpkso/XgsxsHJnYigxNjgsMjAxLDE3NymSyj9eI3mwcmdiKDE2OCwyMDEsMTc3KZLKP147wbByZ2IoMTY4LDIwMSwxNzcpkso/XlQJsHJnYigxNjgsMjAxLDE3NymSyj9ebFKwcmdiKDE2OSwyMDEsMTc3KZLKP16EmrByZ2IoMTY5LDIwMSwxNzcpkso/XpzisHJnYigxNjksMjAxLDE3OCmSyj9etSqwcmdiKDE2OSwyMDEsMTc4KZLKP17NcrByZ2IoMTY5LDIwMSwxNzgpkso/XuW6sHJnYigxNjksMjAxLDE3OCmSyj9e/gKwcmdiKDE2OSwyMDEsMTc4KZLKP18WSrByZ2IoMTY5LDIwMSwxNzgpkso/Xy6SsHJnYigxNjksMjAxLDE3OCmSyj9fRtqwcmdiKDE2OSwyMDEsMTc4KZLKP19fIrByZ2IoMTY5LDIwMSwxNzgpkso/X3drsHJnYigxNjksMjAxLDE3OSmSyj9fj7OwcmdiKDE2OSwyMDEsMTc5KZLKP1+n+7ByZ2IoMTY5LDIwMSwxNzkpkso/X8BDsHJnYigxNjksMjAxLDE3OSmSyj9f2IuwcmdiKDE3MCwyMDEsMTc5KZLKP1/w07ByZ2IoMTcwLDIwMSwxNzkpkso/YAkbsHJnYigxNzAsMjAxLDE3OSmSyj9gIWOwcmdiKDE3MCwyMDEsMTc5KZLKP2A5q7ByZ2IoMTcwLDIwMSwxNzkpkso/YFHzsHJnYigxNzAsMjAxLDE4MCmSyj9gajuwcmdiKDE3MCwyMDEsMTgwKZLKP2CCg7ByZ2IoMTcwLDIwMSwxODApkso/YJrMsHJnYigxNzAsMjAxLDE4MCmSyj9gsxSwcmdiKDE3MCwyMDEsMTgwKZLKP2DLXLByZ2IoMTcwLDIwMSwxODApkso/YOOksHJnYigxNzAsMjAxLDE4MCmSyj9g++ywcmdiKDE3MCwyMDEsMTgwKZLKP2EUNLByZ2IoMTcwLDIwMSwxODApkso/YSx8sHJnYigxNzEsMjAxLDE4MCmSyj9hRMSwcmdiKDE3MSwyMDEsMTgxKZLKP2FdDLByZ2IoMTcxLDIwMSwxODEpkso/YXVUsHJnYigxNzEsMjAxLDE4MSmSyj9hjZywcmdiKDE3MSwyMDEsMTgxKZLKP2Gl5LByZ2IoMTcxLDIwMSwxODEpkso/Yb4tsHJnYigxNzEsMjAxLDE4MSmSyj9h1nWwcmdiKDE3MSwyMDEsMTgxKZLKP2HuvbByZ2IoMTcxLDIwMSwxODEpkso/YgcFsHJnYigxNzEsMjAxLDE4MSmSyj9iH02wcmdiKDE3MSwyMDEsMTgxKZLKP2I3lbByZ2IoMTcxLDIwMSwxODIpkso/Yk/dsHJnYigxNzEsMjAxLDE4MimSyj9iaCWwcmdiKDE3MSwyMDEsMTgyKZLKP2KAbbByZ2IoMTcyLDIwMSwxODIpkso/Ypi1sHJnYigxNzIsMjAxLDE4MimSyj9isP2wcmdiKDE3MiwyMDEsMTgyKZLKP2LJRrByZ2IoMTcyLDIwMSwxODIpkso/YuGOsHJnYigxNzIsMjAxLDE4MimSyj9i+dawcmdiKDE3MiwyMDEsMTgyKZLKP2MSHrByZ2IoMTcyLDIwMSwxODIpkso/YypmsHJnYigxNzIsMjAxLDE4MymSyj9jQq6wcmdiKDE3MiwyMDEsMTgzKZLKP2Na9rByZ2IoMTcyLDIwMSwxODMpkso/Y3M+sHJnYigxNzIsMjAxLDE4MymSyj9ji4awcmdiKDE3MiwyMDEsMTgzKZLKP2OjzrByZ2IoMTcyLDIwMSwxODMpkso/Y7wWsHJnYigxNzMsMjAxLDE4MymSyj9j1F6wcmdiKDE3MywyMDEsMTgzKZLKP2Psp7ByZ2IoMTczLDIwMSwxODMpkso/ZATvsHJnYigxNzMsMjAxLDE4MymSyj9kHTewcmdiKDE3MywyMDEsMTgzKZLKP2Q1f7ByZ2IoMTczLDIwMSwxODQpkso/ZE3HsHJnYigxNzMsMjAxLDE4NCmSyj9kZg+wcmdiKDE3MywyMDEsMTg0KZLKP2R+V7ByZ2IoMTczLDIwMSwxODQpkso/ZJafsHJnYigxNzMsMjAxLDE4NCmSyj9kruewcmdiKDE3MywyMDEsMTg0KZLKP2THL7ByZ2IoMTczLDIwMSwxODQpkso/ZN93sHJnYigxNzMsMjAxLDE4NCmSyj9k98CwcmdiKDE3NCwyMDEsMTg0KZLKP2UQCLByZ2IoMTc0LDIwMSwxODQpkso/ZShQsHJnYigxNzQsMjAxLDE4NCmSyj9lQJiwcmdiKDE3NCwyMDEsMTg0KZLKP2VY4LByZ2IoMTc0LDIwMSwxODUpkso/ZXEosHJnYigxNzQsMjAxLDE4NSmSyj9liXCwcmdiKDE3NCwyMDEsMTg1KZLKP2WhuLByZ2IoMTc0LDIwMSwxODUpkso/ZboAsHJnYigxNzQsMjAxLDE4NSmSyj9l0kiwcmdiKDE3NCwyMDEsMTg1KZLKP2XqkLByZ2IoMTc0LDIwMSwxODUpkso/ZgLYsHJnYigxNzQsMjAxLDE4NSmSyj9mGyGwcmdiKDE3NCwyMDEsMTg1KZLKP2YzabByZ2IoMTc1LDIwMSwxODUpkso/ZkuxsHJnYigxNzUsMjAxLDE4NSmSyj9mY/mwcmdiKDE3NSwyMDEsMTg1KZLKP2Z8QbByZ2IoMTc1LDIwMSwxODUpkso/ZpSJsHJnYigxNzUsMjAxLDE4NimSyj9mrNGwcmdiKDE3NSwyMDEsMTg2KZLKP2bFGbByZ2IoMTc1LDIwMSwxODYpkso/Zt1hsHJnYigxNzUsMjAxLDE4NimSyj9m9amwcmdiKDE3NSwyMDEsMTg2KZLKP2cN8bByZ2IoMTc1LDIwMSwxODYpkso/ZyY5sHJnYigxNzUsMjAxLDE4NimSyj9nPoKwcmdiKDE3NSwyMDEsMTg2KZLKP2dWyrByZ2IoMTc2LDIwMSwxODYpkso/Z28SsHJnYigxNzYsMjAxLDE4NimSyj9nh1qwcmdiKDE3NiwyMDEsMTg2KZLKP2eforByZ2IoMTc2LDIwMSwxODYpkso/Z7fqsHJnYigxNzYsMjAxLDE4NimSyj9n0DKwcmdiKDE3NiwyMDEsMTg3KZLKP2foerByZ2IoMTc2LDIwMSwxODcpkso/aADCsHJnYigxNzYsMjAxLDE4NymSyj9oGQqwcmdiKDE3NiwyMDEsMTg3KZLKP2gxUrByZ2IoMTc2LDIwMSwxODcpkso/aEmbsHJnYigxNzYsMjAxLDE4NymSyj9oYeOwcmdiKDE3NiwyMDEsMTg3KZLKP2h6K7ByZ2IoMTc3LDIwMSwxODcpkso/aJJzsHJnYigxNzcsMjAxLDE4NymSyj9oqruwcmdiKDE3NywyMDEsMTg3KZLKP2jDA7ByZ2IoMTc3LDIwMSwxODcpkso/aNtLsHJnYigxNzcsMjAxLDE4NymSyj9o85OwcmdiKDE3NywyMDEsMTg3KZLKP2kL27ByZ2IoMTc3LDIwMSwxODcpkso/aSQjsHJnYigxNzcsMjAxLDE4OCmSyj9pPGuwcmdiKDE3NywyMDEsMTg4KZLKP2lUs7ByZ2IoMTc3LDIwMSwxODgpkso/aWz8sHJnYigxNzcsMjAxLDE4OCmSyj9phUSwcmdiKDE3NywyMDEsMTg4KZLKP2mdjLByZ2IoMTc4LDIwMSwxODgpkso/abXUsHJnYigxNzgsMjAxLDE4OCmSyj9pzhywcmdiKDE3OCwyMDEsMTg4KZLKP2nmZLByZ2IoMTc4LDIwMSwxODgpkso/af6ssHJnYigxNzgsMjAxLDE4OCmSyj9qFvSwcmdiKDE3OCwyMDEsMTg4KZLKP2ovPLByZ2IoMTc4LDIwMSwxODgpkso/akeEsHJnYigxNzgsMjAxLDE4OCmSyj9qX8ywcmdiKDE3OCwyMDEsMTg4KZLKP2p4FLByZ2IoMTc4LDIwMSwxODgpkso/apBdsHJnYigxNzgsMjAxLDE4OCmSyj9qqKWwcmdiKDE3OSwyMDEsMTg5KZLKP2rA7bByZ2IoMTc5LDIwMSwxODkpkso/atk1sHJnYigxNzksMjAxLDE4OSmSyj9q8X2wcmdiKDE3OSwyMDEsMTg5KZLKP2sJxbByZ2IoMTc5LDIwMSwxODkpkso/ayINsHJnYigxNzksMjAxLDE4OSmSyj9rOlWwcmdiKDE3OSwyMDEsMTg5KZLKP2tSnbByZ2IoMTc5LDIwMSwxODkpkso/a2rlsHJnYigxNzksMjAxLDE4OSmSyj9rgy2wcmdiKDE3OSwyMDEsMTg5KZLKP2ubdrByZ2IoMTc5LDIwMSwxODkpkso/a7O+sHJnYigxNzksMjAxLDE4OSmSyj9rzAawcmdiKDE4MCwyMDEsMTg5KZLKP2vkTrByZ2IoMTgwLDIwMSwxODkpkso/a/yWsHJnYigxODAsMjAxLDE4OSmSyj9sFN6wcmdiKDE4MCwyMDEsMTg5KZLKP2wtJrByZ2IoMTgwLDIwMSwxODkpkso/bEVusHJnYigxODAsMjAxLDE5MCmSyj9sXbawcmdiKDE4MCwyMDEsMTkwKZLKP2x1/rByZ2IoMTgwLDIwMSwxOTApkso/bI5GsHJnYigxODAsMjAxLDE5MCmSyj9spo6wcmdiKDE4MCwyMDEsMTkwKZLKP2y+17ByZ2IoMTgwLDIwMSwxOTApkso/bNcfsHJnYigxODEsMjAxLDE5MCmSyj9s72ewcmdiKDE4MSwyMDEsMTkwKZLKP20Hr7ByZ2IoMTgxLDIwMSwxOTApkso/bR/3sHJnYigxODEsMjAxLDE5MCmSyj9tOD+wcmdiKDE4MSwyMDEsMTkwKZLKP21Qh7ByZ2IoMTgxLDIwMSwxOTApkso/bWjPsHJnYigxODEsMjAxLDE5MCmSyj9tgRewcmdiKDE4MSwyMDEsMTkwKZLKP22ZX7ByZ2IoMTgxLDIwMSwxOTApkso/bbGnsHJnYigxODEsMjAxLDE5MCmSyj9tye+wcmdiKDE4MSwyMDEsMTkwKZLKP23iOLByZ2IoMTgxLDIwMSwxOTApkso/bfqAsHJnYigxODIsMjAxLDE5MCmSyj9uEsiwcmdiKDE4MiwyMDEsMTkxKZLKP24rELByZ2IoMTgyLDIwMSwxOTEpkso/bkNYsHJnYigxODIsMjAxLDE5MSmSyj9uW6CwcmdiKDE4MiwyMDEsMTkxKZLKP25z6LByZ2IoMTgyLDIwMSwxOTEpkso/bowwsHJnYigxODIsMjAxLDE5MSmSyj9upHiwcmdiKDE4MiwyMDEsMTkxKZLKP268wLByZ2IoMTgyLDIwMSwxOTEpkso/btUIsHJnYigxODIsMjAxLDE5MSmSyj9u7VGwcmdiKDE4MiwyMDEsMTkxKZLKP28FmbByZ2IoMTgzLDIwMSwxOTEpkso/bx3hsHJnYigxODMsMjAxLDE5MSmSyj9vNimwcmdiKDE4MywyMDEsMTkxKZLKP29OcbByZ2IoMTgzLDIwMSwxOTEpkso/b2a5sHJnYigxODMsMjAxLDE5MSmSyj9vfwGwcmdiKDE4MywyMDEsMTkxKZLKP2+XSbByZ2IoMTgzLDIwMSwxOTEpkso/b6+RsHJnYigxODMsMjAxLDE5MSmSyj9vx9mwcmdiKDE4MywyMDEsMTkxKZLKP2/gIbByZ2IoMTgzLDIwMSwxOTEpkso/b/hpsHJnYigxODMsMjAxLDE5MSmSyj9wELKwcmdiKDE4MywyMDEsMTkxKZLKP3Ao+rByZ2IoMTg0LDIwMSwxOTIpkso/cEFCsHJnYigxODQsMjAxLDE5MimSyj9wWYqwcmdiKDE4NCwyMDEsMTkyKZLKP3Bx0rByZ2IoMTg0LDIwMSwxOTIpkso/cIoasHJnYigxODQsMjAxLDE5MimSyj9womKwcmdiKDE4NCwyMDEsMTkyKZLKP3C6qrByZ2IoMTg0LDIwMSwxOTIpkso/cNLysHJnYigxODQsMjAxLDE5MimSyj9w6zqwcmdiKDE4NCwyMDEsMTkyKZLKP3EDgrByZ2IoMTg0LDIwMSwxOTIpkso/cRvLsHJnYigxODQsMjAxLDE5MimSyj9xNBOwcmdiKDE4NSwyMDEsMTkyKZLKP3FMW7ByZ2IoMTg1LDIwMSwxOTIpkso/cWSjsHJnYigxODUsMjAxLDE5MimSyj9xfOuwcmdiKDE4NSwyMDEsMTkyKZLKP3GVM7ByZ2IoMTg1LDIwMSwxOTIpkso/ca17sHJnYigxODUsMjAxLDE5MimSyj9xxcOwcmdiKDE4NSwyMDEsMTkyKZLKP3HeC7ByZ2IoMTg1LDIwMSwxOTIpkso/cfZTsHJnYigxODUsMjAxLDE5MimSyj9yDpuwcmdiKDE4NSwyMDEsMTkyKZLKP3Im47ByZ2IoMTg1LDIwMSwxOTIpkso/cj8ssHJnYigxODYsMjAxLDE5MimSyj9yV3SwcmdiKDE4NiwyMDEsMTkyKZLKP3JvvLByZ2IoMTg2LDIwMSwxOTIpkso/cogEsHJnYigxODYsMjAxLDE5MimSyj9yoEywcmdiKDE4NiwyMDEsMTkzKZLKP3K4lLByZ2IoMTg2LDIwMSwxOTMpkso/ctDcsHJnYigxODYsMjAxLDE5MymSyj9y6SSwcmdiKDE4NiwyMDEsMTkzKZLKP3MBbLByZ2IoMTg2LDIwMSwxOTMpkso/cxm0sHJnYigxODYsMjAxLDE5MymSyj9zMfywcmdiKDE4NiwyMDEsMTkzKZLKP3NKRLByZ2IoMTg2LDIwMSwxOTMpkso/c2KNsHJnYigxODcsMjAxLDE5MymSyj9zetWwcmdiKDE4NywyMDEsMTkzKZLKP3OTHbByZ2IoMTg3LDIwMSwxOTMpkso/c6tlsHJnYigxODcsMjAxLDE5MymSyj9zw62wcmdiKDE4NywyMDEsMTkzKZLKP3Pb9bByZ2IoMTg3LDIwMSwxOTMpkso/c/Q9sHJnYigxODcsMjAxLDE5MymSyj90DIWwcmdiKDE4NywyMDEsMTkzKZLKP3QkzbByZ2IoMTg3LDIwMSwxOTMpkso/dD0VsHJnYigxODcsMjAxLDE5MymSyj90VV2wcmdiKDE4NywyMDEsMTkzKZLKP3RtprByZ2IoMTg4LDIwMSwxOTMpkso/dIXusHJnYigxODgsMjAxLDE5MymSyj90njawcmdiKDE4OCwyMDEsMTkzKZLKP3S2frByZ2IoMTg4LDIwMSwxOTMpkso/dM7GsHJnYigxODgsMjAxLDE5MymSyj905w6wcmdiKDE4OCwyMDEsMTkzKZLKP3T/VrByZ2IoMTg4LDIwMSwxOTMpkso/dReesHJnYigxODgsMjAxLDE5MymSyj91L+awcmdiKDE4OCwyMDEsMTkzKZLKP3VILrByZ2IoMTg4LDIwMSwxOTMpkso/dWB2sHJnYigxODgsMjAxLDE5MymSyj91eL6wcmdiKDE4OCwyMDEsMTkzKZLKP3WRB7ByZ2IoMTg5LDIwMSwxOTMpkso/dalPsHJnYigxODksMjAxLDE5MymSyj91wZewcmdiKDE4OSwyMDEsMTkzKZLKP3XZ37ByZ2IoMTg5LDIwMSwxOTMpkso/dfInsHJnYigxODksMjAxLDE5NCmSyj92Cm+wcmdiKDE4OSwyMDEsMTk0KZLKP3Yit7ByZ2IoMTg5LDIwMSwxOTQpkso/djr/sHJnYigxODksMjAxLDE5NCmSyj92U0ewcmdiKDE4OSwyMDEsMTk0KZLKP3Zrj7ByZ2IoMTg5LDIwMSwxOTQpkso/doPXsHJnYigxODksMjAxLDE5NCmSyj92nB+wcmdiKDE4OSwyMDEsMTk0KZLKP3a0aLByZ2IoMTkwLDIwMSwxOTQpkso/dsywsHJnYigxOTAsMjAxLDE5NCmSyj925PiwcmdiKDE5MCwyMDEsMTk0KZLKP3b9QLByZ2IoMTkwLDIwMSwxOTQpkso/dxWIsHJnYigxOTAsMjAxLDE5NCmSyj93LdCwcmdiKDE5MCwyMDEsMTk0KZLKP3dGGLByZ2IoMTkwLDIwMSwxOTQpkso/d15gsHJnYigxOTAsMjAxLDE5NCmSyj93dqiwcmdiKDE5MCwyMDEsMTk0KZLKP3eO8LByZ2IoMTkwLDIwMSwxOTQpkso/d6c4sHJnYigxOTAsMjAxLDE5NCmSyj93v4GwcmdiKDE5MSwyMDEsMTk0KZLKP3fXybByZ2IoMTkxLDIwMSwxOTQpkso/d/ARsHJnYigxOTEsMjAxLDE5NCmSyj94CFmwcmdiKDE5MSwyMDEsMTk0KZLKP3ggobByZ2IoMTkxLDIwMSwxOTQpkso/eDjpsHJnYigxOTEsMjAxLDE5NCmSyj94UTGwcmdiKDE5MSwyMDEsMTk0KZLKP3hpebByZ2IoMTkxLDIwMSwxOTQpkso/eIHBsHJnYigxOTEsMjAxLDE5NCmSyj94mgmwcmdiKDE5MSwyMDEsMTk0KZLKP3iyUbByZ2IoMTkxLDIwMSwxOTQpkso/eMqZsHJnYigxOTEsMjAxLDE5NCmSyj944uKwcmdiKDE5MiwyMDEsMTk0KZLKP3j7KrByZ2IoMTkyLDIwMSwxOTQpkso/eRNysHJnYigxOTIsMjAxLDE5NCmSyj95K7qwcmdiKDE5MiwyMDEsMTk0KZLKP3lEArByZ2IoMTkyLDIwMSwxOTQpkso/eVxKsHJnYigxOTIsMjAxLDE5NCmSyj95dJKwcmdiKDE5MiwyMDEsMTk0KZLKP3mM2rByZ2IoMTkyLDIwMSwxOTQpkso/eaUisHJnYigxOTIsMjAxLDE5NCmSyj95vWqwcmdiKDE5MiwyMDEsMTk0KZLKP3nVsrByZ2IoMTkyLDIwMSwxOTQpkso/ee36sHJnYigxOTIsMjAxLDE5NCmSyj96BkOwcmdiKDE5MiwyMDEsMTk0KZLKP3oei7ByZ2IoMTkzLDIwMSwxOTQpkso/ejbTsHJnYigxOTMsMjAxLDE5NCmSyj96TxuwcmdiKDE5MywyMDEsMTk0KZLKP3pnY7ByZ2IoMTkzLDIwMSwxOTQpkso/en+rsHJnYigxOTMsMjAxLDE5NCmSyj96l/OwcmdiKDE5MywyMDEsMTk0KZLKP3qwO7ByZ2IoMTkzLDIwMSwxOTQpkso/esiDsHJnYigxOTMsMjAxLDE5NCmSyj964MuwcmdiKDE5MywyMDEsMTk0KZLKP3r5E7ByZ2IoMTkzLDIwMSwxOTQpkso/exFcsHJnYigxOTMsMjAxLDE5NCmSyj97KaSwcmdiKDE5MywyMDEsMTk0KZLKP3tB7LByZ2IoMTk0LDIwMSwxOTQpkso/e1o0sHJnYigxOTQsMjAxLDE5NCmSyj97cnywcmdiKDE5NCwyMDEsMTk0KZLKP3uKxLByZ2IoMTk0LDIwMSwxOTQpkso/e6MMsHJnYigxOTQsMjAxLDE5NCmSyj97u1SwcmdiKDE5NCwyMDEsMTk0KZLKP3vTnLByZ2IoMTk0LDIwMSwxOTQpkso/e+vksHJnYigxOTQsMjAxLDE5NCmSyj98BCywcmdiKDE5NCwyMDEsMTk0KZLKP3wcdLByZ2IoMTk0LDIwMSwxOTQpkso/fDS9sHJnYigxOTQsMjAxLDE5NCmSyj98TQWwcmdiKDE5NCwyMDEsMTk0KZLKP3xlTbByZ2IoMTk1LDIwMSwxOTQpkso/fH2VsHJnYigxOTUsMjAxLDE5NCmSyj98ld2wcmdiKDE5NSwyMDEsMTk0KZLKP3yuJbByZ2IoMTk1LDIwMSwxOTQpkso/fMZtsHJnYigxOTUsMjAxLDE5NCmSyj983rWwcmdiKDE5NSwyMDEsMTk0KZLKP3z2/bByZ2IoMTk1LDIwMSwxOTQpkso/fQ9FsHJnYigxOTUsMjAxLDE5NCmSyj99J42wcmdiKDE5NSwyMDEsMTk0KZLKP30/1rByZ2IoMTk1LDIwMSwxOTQpkso/fVgesHJnYigxOTUsMjAxLDE5NCmSyj99cGawcmdiKDE5NSwyMDEsMTk0KZLKP32IrrByZ2IoMTk1LDIwMSwxOTQpkso/faD2sHJnYigxOTYsMjAxLDE5NCmSyj99uT6wcmdiKDE5NiwyMDEsMTk0KZLKP33RhrByZ2IoMTk2LDIwMSwxOTQpkso/fenOsHJnYigxOTYsMjAxLDE5NCmSyj9+AhawcmdiKDE5NiwyMDEsMTk0KZLKP34aXrByZ2IoMTk2LDIwMSwxOTQpkso/fjKmsHJnYigxOTYsMjAxLDE5NCmSyj9+Su6wcmdiKDE5NiwyMDEsMTk0KZLKP35jN7ByZ2IoMTk2LDIwMSwxOTQpkso/fnt/sHJnYigxOTYsMjAxLDE5NCmSyj9+k8ewcmdiKDE5NiwyMDEsMTk0KZLKP36sD7ByZ2IoMTk2LDIwMSwxOTQpkso/fsRXsHJnYigxOTYsMjAxLDE5NCmSyj9+3J+wcmdiKDE5NywyMDEsMTk0KZLKP37057ByZ2IoMTk3LDIwMSwxOTQpkso/fw0vsHJnYigxOTcsMjAxLDE5NCmSyj9/JXewcmdiKDE5NywyMDEsMTk0KZLKP389v7ByZ2IoMTk3LDIwMSwxOTQpkso/f1YHsHJnYigxOTcsMjAxLDE5NCmSyj9/bk+wcmdiKDE5NywyMDEsMTk0KZLKP3+GmLByZ2IoMTk3LDIwMSwxOTQpkso/f57gsHJnYigxOTcsMjAxLDE5NCmSyj9/tyiwcmdiKDE5NywyMDEsMTk0KZLKP3/PcLByZ2IoMTk3LDIwMSwxOTQpkso/f+e4sHJnYigxOTcsMjAxLDE5NCmSyj+AAACwcmdiKDE5NywyMDEsMTk0KaRzaXplykAAAACkY21heMpFHEAAqXNob3dzY2FsZcOkbW9kZadtYXJrZXJzoXnHUBcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKR0eXBlqXNjYXR0ZXIzZKR0ZXh0x1AXAAD6QwAA+kMAAPpDAAD6QwAA+kMAAPpDAAD6QwAA+kMAAPpDAAD6QwAA+kMAAPpDAAD6QwAA+kMAAPpDAAD6QwAA+kMAAPpDAAD6QwAA+kOhesdQFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArWhvdmVydGVtcGxhdGXZWng6ICV7eDouMWZ9IGNtPGJyPnk6ICV7eTouMWZ9IGNtPGJyPno6ICV7ejouMWZ9IGNtPGJyPjxiPlQxPC9iPjogJXt0ZXh0fSBtczxleHRyYT48L2V4dHJhPqF4x1AXzczMvfs9t70or6G9ViCMvQgjbb1kBUK9v+cWvTaU17ztWIG8knasu5J2rDvtWIE8NpTXPL/nFj1kBUI9CCNtPVYgjD0or6E9+z23Pc3MzD3ZNTdiY2MwNWIwLTgxZGEtMTFlZi0yMDQwLTM1ODVjOWI0OTU0Zi83OTRhMTY1NDk3MWQwYzgxhKZsYXlvdXSCqHRlbXBsYXRlgqZsYXlvdXTeABOpY29sb3JheGlzgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApXhheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Zalob3Zlcm1vZGWnY2xvc2VzdK1wYXBlcl9iZ2NvbG9ypXdoaXRlo2dlb4apc2hvd2xha2Vzw6hzaG93bGFuZMOpbGFuZGNvbG9ypyNFNUVDRjanYmdjb2xvcqV3aGl0ZaxzdWJ1bml0Y29sb3Kld2hpdGWpbGFrZWNvbG9ypXdoaXRlqmNvbG9yc2NhbGWDqnNlcXVlbnRpYWyaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGpZGl2ZXJnaW5nm5LKAAAAAKcjOGUwMTUykso9zMzNpyNjNTFiN2SSyj5MzM2nI2RlNzdhZZLKPpmZmqcjZjFiNmRhkso+zMzNpyNmZGUwZWaSyj8AAACnI2Y3ZjdmN5LKPxmZmqcjZTZmNWQwkso/MzMzpyNiOGUxODaSyj9MzM2nIzdmYmM0MZLKP2ZmZqcjNGQ5MjIxkso/gAAApyMyNzY0MTmvc2VxdWVudGlhbG1pbnVzmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxpXlheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Za1zaGFwZWRlZmF1bHRzgaRsaW5lgaVjb2xvcqcjMmEzZjVmqmhvdmVybGFiZWyBpWFsaWdupGxlZnSmbWFwYm94gaVzdHlsZaVsaWdodKVwb2xhcoOrYW5ndWxhcmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqpyYWRpYWxheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0Za9hdXRvdHlwZW51bWJlcnOmc3RyaWN0pGZvbnSBpWNvbG9ypyMyYTNmNWandGVybmFyeYSlYWF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqVjYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWlYmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlsmFubm90YXRpb25kZWZhdWx0c4OpYXJyb3doZWFkygAAAACqYXJyb3d3aWR0aMo/gAAAqmFycm93Y29sb3KnIzJhM2Y1ZqxwbG90X2JnY29sb3KnI0U1RUNGNqV0aXRsZYGheMo9TMzNpXNjZW5lg6V4YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWlemF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXlheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0Zahjb2xvcndheZqnIzYzNmVmYacjRUY1NTNCpyMwMGNjOTanI2FiNjNmYacjRkZBMTVBpyMxOWQzZjOnI0ZGNjY5MqcjQjZFODgwpyNGRjk3RkanI0ZFQ0I1MqRkYXRh3gAZrnNjYXR0ZXJwb2xhcmdskYKkdHlwZa5zY2F0dGVycG9sYXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmY2FycGV0kYOlYmF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaR0eXBlpmNhcnBldKVhYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlrHNjYXR0ZXJwb2xhcpGCpHR5cGWsc2NhdHRlcnBvbGFypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKlwYXJjb29yZHORgqRsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpcGFyY29vcmRzp3NjYXR0ZXKRgqR0eXBlp3NjYXR0ZXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAsmhpc3RvZ3JhbTJkY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZbJoaXN0b2dyYW0yZGNvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMadjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2NvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVyY2FycGV0kYKkdHlwZa1zY2F0dGVyY2FycGV0pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZtZXNoM2SRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWmbWVzaDNkp3N1cmZhY2WRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnc3VyZmFjZapjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJtYXBib3iRgqR0eXBlrXNjYXR0ZXJtYXBib3imbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqnNjYXR0ZXJnZW+RgqR0eXBlqnNjYXR0ZXJnZW+mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqWhpc3RvZ3JhbZGCpHR5cGWpaGlzdG9ncmFtpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKNwaWWRgqR0eXBlo3BpZaphdXRvbWFyZ2luw6pjaG9yb3BsZXRokYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqmNob3JvcGxldGipaGVhdG1hcGdskYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqWhlYXRtYXBnbKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxo2JhcpGEpHR5cGWjYmFyp2Vycm9yX3mBpWNvbG9ypyMyYTNmNWanZXJyb3JfeIGlY29sb3KnIzJhM2Y1ZqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKdoZWF0bWFwkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2hlYXRtYXCqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1jb250b3VyY2FycGV0kYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlrWNvbnRvdXJjYXJwZXSldGFibGWRg6R0eXBlpXRhYmxlpmhlYWRlcoKkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0M4RDRFM6VjZWxsc4KkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0VCRjBGOKlzY2F0dGVyM2SRg6RsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpc2NhdHRlcjNkpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKhiYXJwb2xhcpGCpHR5cGWoYmFycG9sYXKmbWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACpc2NhdHRlcmdskYKkdHlwZalzY2F0dGVyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAq2hpc3RvZ3JhbTJkkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlq2hpc3RvZ3JhbTJkqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGuc2NhdHRlcnRlcm5hcnmRgqR0eXBlrnNjYXR0ZXJ0ZXJuYXJ5pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZtYXJnaW6EoWzKQkgAAKFiykJIAAChcspCSAAAoXTKQnAAAKZjb25maWeFqHNob3dMaW5rwqhlZGl0YWJsZcKqcmVzcG9uc2l2ZcOqc3RhdGljUGxvdMKqc2Nyb2xsWm9vbcOmZnJhbWVzkKRkYXRhkYOhecgBkBdckS472KsuOwv7LjtAfy87xzowO6ctMTs4WTI7bcAzO6tkNTsUSzc7H3U5OxXoOzt/qT47h71BO2ktRTs7/0g7+j1NO2zzUTsdLlc7LPxcO4VyYzt2pWo7jrJyO4O4ezvM8oI7erSIO+VEjzuUzJY7DIefO4W8qTs/2LU7x2vEO81Q1jslz+w7yv0EPJSwGDww0zQ8bmRgPKZ+ljxg9Oo89feJPd/tBD8ifgA/ZHoCP3r1AD+gKQI/2hsBP8ANAj9ZKwE/gwMCP7EvAT+DAwI/WSsBP78NAj/YGwE/nykCP3n1AD9kegI/In4AP+DtBD/x94k9ePTqPKF+ljymZGA8DdM0PK2wGDy3/QQ8Vc/sO2xQ1jv3a8Q7+de1O4u8qTv0hp872cyWO61EjzuttIg7hPKCO9a4eztasnI7hKVqO4xyYzvN+1w7dy5XO2/zUTu/PU07gP9IOzctRTuyvUE7Zak+O1vnOzsndTk7z0o3O91kNTv+vzM7O1kyO3otMTt9OjA7fH8vO/H6Ljs8rC47pHR5cGWnc2NhdHRlcqF4yAGQFwAAgD8AAABAAABAQAAAgEAAAKBAAADAQAAA4EAAAABBAAAQQQAAIEEAADBBAABAQQAAUEEAAGBBAABwQQAAgEEAAIhBAACQQQAAmEEAAKBBAACoQQAAsEEAALhBAADAQQAAyEEAANBBAADYQQAA4EEAAOhBAADwQQAA+EEAAABCAAAEQgAACEIAAAxCAAAQQgAAFEIAABhCAAAcQgAAIEIAACRCAAAoQgAALEIAADBCAAA0QgAAOEIAADxCAABAQgAAREIAAEhCAABMQgAAUEIAAFRCAABYQgAAXEIAAGBCAABkQgAAaEIAAGxCAABwQgAAdEIAAHhCAAB8QgAAgEIAAIJCAACEQgAAhkIAAIhCAACKQgAAjEIAAI5CAACQQgAAkkIAAJRCAACWQgAAmEIAAJpCAACcQgAAnkIAAKBCAACiQgAApEIAAKZCAACoQgAAqkIAAKxCAACuQgAAsEIAALJCAAC0QgAAtkIAALhCAAC6QgAAvEIAAL5CAADAQgAAwkIAAMRCAADGQgAAyELZNTdiY2MwNWIwLTgxZGEtMTFlZi0yMDQwLTM1ODVjOWI0OTU0Zi8yMDVmOTk4N2RhOGM2MzFhhKZsYXlvdXSMpXhheGlzh6tyYW5nZXNsaWRlcoGndmlzaWJsZcKpZ3JpZGNvbG9ypXdoaXRlrXJhbmdlc2VsZWN0b3KBp2J1dHRvbnOShKRzdGVwykEgAACoc3RlcG1vZGWoYmFja3dhcmSlbGFiZWyiMW2lY291bnTKP4AAAIGkc3RlcKNhbGyldGl0bGWBpHRleHSgpXJhbmdlkK16ZXJvbGluZWNvbG9ypXdoaXRlqnRpY2tzdWZmaXijIG1zp21vZGViYXKIpWNvbG9ypGdyYXmrYWN0aXZlY29sb3KwcmdiKDIyOSwyMzYsMjQ2Kad5YW5jaG9ypmJvdHRvbad4YW5jaG9ypXJpZ2h0oXnKP4AAAKdiZ2NvbG9yrXJnYmEoMCwwLDAsMCmrb3JpZW50YXRpb26haKF4ygAAAACpaG92ZXJtb2Rlp2Nsb3Nlc3StcGFwZXJfYmdjb2xvcq1yZ2JhKDAsMCwwLDApqHRlbXBsYXRlgqZsYXlvdXTeABOpY29sb3JheGlzgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApXhheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Zalob3Zlcm1vZGWnY2xvc2VzdK1wYXBlcl9iZ2NvbG9ypXdoaXRlo2dlb4apc2hvd2xha2Vzw6hzaG93bGFuZMOpbGFuZGNvbG9ypyNFNUVDRjanYmdjb2xvcqV3aGl0ZaxzdWJ1bml0Y29sb3Kld2hpdGWpbGFrZWNvbG9ypXdoaXRlqmNvbG9yc2NhbGWDqnNlcXVlbnRpYWyaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGpZGl2ZXJnaW5nm5LKAAAAAKcjOGUwMTUykso9zMzNpyNjNTFiN2SSyj5MzM2nI2RlNzdhZZLKPpmZmqcjZjFiNmRhkso+zMzNpyNmZGUwZWaSyj8AAACnI2Y3ZjdmN5LKPxmZmqcjZTZmNWQwkso/MzMzpyNiOGUxODaSyj9MzM2nIzdmYmM0MZLKP2ZmZqcjNGQ5MjIxkso/gAAApyMyNzY0MTmvc2VxdWVudGlhbG1pbnVzmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxpXlheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Za1zaGFwZWRlZmF1bHRzgaRsaW5lgaVjb2xvcqcjMmEzZjVmqmhvdmVybGFiZWyBpWFsaWdupGxlZnSmbWFwYm94gaVzdHlsZaVsaWdodKVwb2xhcoOrYW5ndWxhcmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqpyYWRpYWxheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0Za9hdXRvdHlwZW51bWJlcnOmc3RyaWN0pGZvbnSBpWNvbG9ypyMyYTNmNWandGVybmFyeYSlYWF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqVjYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWlYmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlsmFubm90YXRpb25kZWZhdWx0c4OpYXJyb3doZWFkygAAAACqYXJyb3d3aWR0aMo/gAAAqmFycm93Y29sb3KnIzJhM2Y1ZqxwbG90X2JnY29sb3KnI0U1RUNGNqV0aXRsZYGheMo9TMzNpXNjZW5lg6V4YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWlemF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXlheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0Zahjb2xvcndheZqnIzYzNmVmYacjRUY1NTNCpyMwMGNjOTanI2FiNjNmYacjRkZBMTVBpyMxOWQzZjOnI0ZGNjY5MqcjQjZFODgwpyNGRjk3RkanI0ZFQ0I1MqRkYXRh3gAZrnNjYXR0ZXJwb2xhcmdskYKkdHlwZa5zY2F0dGVycG9sYXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmY2FycGV0kYOlYmF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaR0eXBlpmNhcnBldKVhYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlrHNjYXR0ZXJwb2xhcpGCpHR5cGWsc2NhdHRlcnBvbGFypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKlwYXJjb29yZHORgqRsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpcGFyY29vcmRzp3NjYXR0ZXKRgqR0eXBlp3NjYXR0ZXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAsmhpc3RvZ3JhbTJkY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZbJoaXN0b2dyYW0yZGNvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMadjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2NvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVyY2FycGV0kYKkdHlwZa1zY2F0dGVyY2FycGV0pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZtZXNoM2SRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWmbWVzaDNkp3N1cmZhY2WRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnc3VyZmFjZapjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJtYXBib3iRgqR0eXBlrXNjYXR0ZXJtYXBib3imbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqnNjYXR0ZXJnZW+RgqR0eXBlqnNjYXR0ZXJnZW+mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqWhpc3RvZ3JhbZGCpHR5cGWpaGlzdG9ncmFtpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKNwaWWRgqR0eXBlo3BpZaphdXRvbWFyZ2luw6pjaG9yb3BsZXRokYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqmNob3JvcGxldGipaGVhdG1hcGdskYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqWhlYXRtYXBnbKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxo2JhcpGEpHR5cGWjYmFyp2Vycm9yX3mBpWNvbG9ypyMyYTNmNWanZXJyb3JfeIGlY29sb3KnIzJhM2Y1ZqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKdoZWF0bWFwkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2hlYXRtYXCqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1jb250b3VyY2FycGV0kYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlrWNvbnRvdXJjYXJwZXSldGFibGWRg6R0eXBlpXRhYmxlpmhlYWRlcoKkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0M4RDRFM6VjZWxsc4KkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0VCRjBGOKlzY2F0dGVyM2SRg6RsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpc2NhdHRlcjNkpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKhiYXJwb2xhcpGCpHR5cGWoYmFycG9sYXKmbWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACpc2NhdHRlcmdskYKkdHlwZalzY2F0dGVyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAq2hpc3RvZ3JhbTJkkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlq2hpc3RvZ3JhbTJkqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGuc2NhdHRlcnRlcm5hcnmRgqR0eXBlrnNjYXR0ZXJ0ZXJuYXJ5pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZsZWdlbmSFp3lhbmNob3KmYm90dG9tp3hhbmNob3KkbGVmdKF5yj+AAACrb3JpZW50YXRpb26haKF4ygAAAACleWF4aXODqWdyaWRjb2xvcqV3aGl0Za16ZXJvbGluZWNvbG9ypXdoaXRlqmZpeGVkcmFuZ2XCpnNoYXBlc5CkZm9udIGlY29sb3KkZ3Jheathbm5vdGF0aW9uc5CscGxvdF9iZ2NvbG9ysHJnYigyMjksMjM2LDI0NimmbWFyZ2luhKFsygAAAAChYsoAAAAAoXLKAAAA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QUhvskEFDbRBwqq1QX5It0E75rhB+IO6QbUhvEFxv71BLl2/Qev6wEGomMJBZTbEQSHUxUHeccdBmw/JQVitykEUS8xB0ejNQY6Gz0FLJNFBB8LSQcRf1EGB/dVBPpvXQfs42UG31tpBdHTcQTES3kHur99Bqk3hQWfr4kEkieRB4SbmQZ3E50FaYulBFwDrQdSd7EGQO+5BTdnvQQp38UHHFPNBhLL0Qdk1N2JjYzA1YjAtODFkYS0xMWVmLTIwNDAtMzU4NWM5YjQ5NTRmLzljYTMyMTVjNjg4MzAyZjiEpmxheW91dIiqc2hvd2xlZ2VuZMKmeGF4aXMxgqZkb21haW7XFwAAAABmZuY+pmFuY2hvcqJ5MaZ5YXhpczGDpXJhbmdl1xcAAAAAzcxMP6Zkb21haW7XFwAAAAAAAIA/pmFuY2hvcqJ4Mah0ZW1wbGF0ZYKmbGF5b3V03gATqWNvbG9yYXhpc4GoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKV4YXhpc4epZ3JpZGNvbG9ypXdoaXRlrXplcm9saW5ld2lkdGjKQAAAAKV0aXRsZYGoc3RhbmRvZmbKQXAAAKV0aWNrc6CtemVyb2xpbmVjb2xvcqV3aGl0ZaphdXRvbWFyZ2luw6lsaW5lY29sb3Kld2hpdGWpaG92ZXJtb2Rlp2Nsb3Nlc3StcGFwZXJfYmdjb2xvcqV3aGl0ZaNnZW+GqXNob3dsYWtlc8Ooc2hvd2xhbmTDqWxhbmRjb2xvcqcjRTVFQ0Y2p2JnY29sb3Kld2hpdGWsc3VidW5pdGNvbG9ypXdoaXRlqWxha2Vjb2xvcqV3aGl0Zapjb2xvcnNjYWxlg6pzZXF1ZW50aWFsmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxqWRpdmVyZ2luZ5uSygAAAACnIzhlMDE1MpLKPczMzacjYzUxYjdkkso+TMzNpyNkZTc3YWWSyj6ZmZqnI2YxYjZkYZLKPszMzacjZmRlMGVmkso/AAAApyNmN2Y3ZjeSyj8ZmZqnI2U2ZjVkMJLKPzMzM6cjYjhlMTg2kso/TMzNpyM3ZmJjNDGSyj9mZmanIzRkOTIyMZLKP4AAAKcjMjc2NDE5r3NlcXVlbnRpYWxtaW51c5qSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMaV5YXhpc4epZ3JpZGNvbG9ypXdoaXRlrXplcm9saW5ld2lkdGjKQAAAAKV0aXRsZYGoc3RhbmRvZmbKQXAAAKV0aWNrc6CtemVyb2xpbmVjb2xvcqV3aGl0ZaphdXRvbWFyZ2luw6lsaW5lY29sb3Kld2hpdGWtc2hhcGVkZWZhdWx0c4GkbGluZYGlY29sb3KnIzJhM2Y1Zqpob3ZlcmxhYmVsgaVhbGlnbqRsZWZ0pm1hcGJveIGlc3R5bGWlbGlnaHSlcG9sYXKDq2FuZ3VsYXJheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZadiZ2NvbG9ypyNFNUVDRjaqcmFkaWFsYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWvYXV0b3R5cGVudW1iZXJzpnN0cmljdKRmb250gaVjb2xvcqcjMmEzZjVmp3Rlcm5hcnmEpWFheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZadiZ2NvbG9ypyNFNUVDRjalY2F4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlpWJheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZbJhbm5vdGF0aW9uZGVmYXVsdHODqWFycm93aGVhZMoAAAAAqmFycm93d2lkdGjKP4AAAKphcnJvd2NvbG9ypyMyYTNmNWascGxvdF9iZ2NvbG9ypyNFNUVDRjaldGl0bGWBoXjKPUzMzaVzY2VuZYOleGF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXpheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0ZaV5YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWoY29sb3J3YXmapyM2MzZlZmGnI0VGNTUzQqcjMDBjYzk2pyNhYjYzZmGnI0ZGQTE1QacjMTlkM2YzpyNGRjY2OTKnI0I2RTg4MKcjRkY5N0ZGpyNGRUNCNTKkZGF0Yd4AGa5zY2F0dGVycG9sYXJnbJGCpHR5cGWuc2NhdHRlcnBvbGFyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApmNhcnBldJGDpWJheGlzhalncmlkY29sb3Kld2hpdGWsZW5kbGluZWNvbG9ypyMyYTNmNWaubWlub3JncmlkY29sb3Kld2hpdGWuc3RhcnRsaW5lY29sb3KnIzJhM2Y1ZqlsaW5lY29sb3Kld2hpdGWkdHlwZaZjYXJwZXSlYWF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaxzY2F0dGVycG9sYXKRgqR0eXBlrHNjYXR0ZXJwb2xhcqZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACpcGFyY29vcmRzkYKkbGluZYGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqXBhcmNvb3Jkc6dzY2F0dGVykYKkdHlwZadzY2F0dGVypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAALJoaXN0b2dyYW0yZGNvbnRvdXKRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWyaGlzdG9ncmFtMmRjb250b3VyqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGnY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadjb250b3VyqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtc2NhdHRlcmNhcnBldJGCpHR5cGWtc2NhdHRlcmNhcnBldKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmbWVzaDNkkYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlpm1lc2gzZKdzdXJmYWNlkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp3N1cmZhY2WqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVybWFwYm94kYKkdHlwZa1zY2F0dGVybWFwYm94pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKpzY2F0dGVyZ2VvkYKkdHlwZapzY2F0dGVyZ2Vvpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKloaXN0b2dyYW2RgqR0eXBlqWhpc3RvZ3JhbaZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACjcGllkYKkdHlwZaNwaWWqYXV0b21hcmdpbsOqY2hvcm9wbGV0aJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZapjaG9yb3BsZXRoqWhlYXRtYXBnbJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZaloZWF0bWFwZ2yqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMaNiYXKRhKR0eXBlo2JhcqdlcnJvcl95gaVjb2xvcqcjMmEzZjVmp2Vycm9yX3iBpWNvbG9ypyMyYTNmNWambWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACnaGVhdG1hcJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadoZWF0bWFwqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtY29udG91cmNhcnBldJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZa1jb250b3VyY2FycGV0pXRhYmxlkYOkdHlwZaV0YWJsZaZoZWFkZXKCpGxpbmWBpWNvbG9ypXdoaXRlpGZpbGyBpWNvbG9ypyNDOEQ0RTOlY2VsbHOCpGxpbmWBpWNvbG9ypXdoaXRlpGZpbGyBpWNvbG9ypyNFQkYwRjipc2NhdHRlcjNkkYOkbGluZYGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqXNjYXR0ZXIzZKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACoYmFycG9sYXKRgqR0eXBlqGJhcnBvbGFypm1hcmtlcoGkbGluZYKlY29sb3KnI0U1RUNGNqV3aWR0aMo/AAAAqXNjYXR0ZXJnbJGCpHR5cGWpc2NhdHRlcmdspm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKtoaXN0b2dyYW0yZJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZatoaXN0b2dyYW0yZKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrnNjYXR0ZXJ0ZXJuYXJ5kYKkdHlwZa5zY2F0dGVydGVybmFyeaZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmeGF4aXMygqZkb21haW7XF83MDD8AAIA/pmFuY2hvcqJ5MqZtYXJnaW6EoWzKQkgAAKFiykJIAAChcspCSAAAoXTKQnAAAKZ5YXhpczKDpXJhbmdl1xcAAAAAzcxMP6Zkb21haW7XFwAAAAAAAIA/pmFuY2hvcqJ4Mqthbm5vdGF0aW9uc5KJp3lhbmNob3KmYm90dG9tp3hhbmNob3KmY2VudGVyoXnKP4AAAKRmb250gaRzaXplykGAAACpc2hvd2Fycm93wqR5cmVmpXBhcGVypHRleHSmR1JFLVQypHhyZWalcGFwZXKheMo+ZmZmiad5YW5jaG9ypmJvdHRvbad4YW5jaG9ypmNlbnRlcqF5yj+AAACkZm9udIGkc2l6ZcpBgAAAqXNob3dhcnJv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xEIAAMZCAADIQtk1N2JjYzA1YjAtODFkYS0xMWVmLTIwNDAtMzU4NWM5YjQ5NTRmLzlkZjM2YzUxNzM4N2U3OWWEpmxheW91dIyleGF4aXOHq3Jhbmdlc2xpZGVygad2aXNpYmxlwqlncmlkY29sb3Kld2hpdGWtcmFuZ2VzZWxlY3RvcoGnYnV0dG9uc5KEpHN0ZXDKQSAAAKhzdGVwbW9kZahiYWNrd2FyZKVsYWJlbKIxbaVjb3VudMo/gAAAgaRzdGVwo2FsbKV0aXRsZYGkdGV4dKClcmFuZ2WQrXplcm9saW5lY29sb3Kld2hpdGWqdGlja3N1ZmZpeKMgbXOnbW9kZWJhcoilY29sb3KkZ3JheathY3RpdmVjb2xvcrByZ2IoMjI5LDIzNiwyNDYpp3lhbmNob3KmYm90dG9tp3hhbmNob3KlcmlnaHSheco/gAAAp2JnY29sb3KtcmdiYSgwLDAsMCwwKatvcmllbnRhdGlvbqFooXjKAAAAAKlob3Zlcm1vZGWnY2xvc2VzdK1wYXBlcl9iZ2NvbG9yrXJnYmEoMCwwLDAsMCmodGVtcGxhdGWCpmxheW91dN4AE6ljb2xvcmF4aXOBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACleGF4aXOHqWdyaWRjb2xvcqV3aGl0Za16ZXJvbGluZXdpZHRoykAAAACldGl0bGWBqHN0YW5kb2ZmykFwAACldGlja3OgrXplcm9saW5lY29sb3Kld2hpdGWqYXV0b21hcmdpbsOpbGluZWNvbG9ypXdoaXRlqWhvdmVybW9kZadjbG9zZXN0rXBhcGVyX2JnY29sb3Kld2hpdGWjZ2VvhqlzaG93bGFrZXPDqHNob3dsYW5kw6lsYW5kY29sb3KnI0U1RUNGNqdiZ2NvbG9ypXdoaXRlrHN1YnVuaXRjb2xvcqV3aGl0ZalsYWtlY29sb3Kld2hpdGWqY29sb3JzY2FsZYOqc2VxdWVudGlhbJqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMalkaXZlcmdpbmebksoAAAAApyM4ZTAxNTKSyj3MzM2nI2M1MWI3ZJLKPkzMzacjZGU3N2Flkso+mZmapyNmMWI2ZGGSyj7MzM2nI2ZkZTBlZpLKPwAAAKcjZjdmN2Y3kso/GZmapyNlNmY1ZDCSyj8zMzOnI2I4ZTE4NpLKP0zMzacjN2ZiYzQxkso/ZmZmpyM0ZDkyMjGSyj+AAACnIzI3NjQxOa9zZXF1ZW50aWFsbWludXOaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGleWF4aXOHqWdyaWRjb2xvcqV3aGl0Za16ZXJvbGluZXdpZHRoykAAAACldGl0bGWBqHN0YW5kb2ZmykFwAACldGlja3OgrXplcm9saW5lY29sb3Kld2hpdGWqYXV0b21hcmdpbsOpbGluZWNvbG9ypXdoaXRlrXNoYXBlZGVmYXVsdHOBpGxpbmWBpWNvbG9ypyMyYTNmNWaqaG92ZXJsYWJlbIGlYWxpZ26kbGVmdKZtYXBib3iBpXN0eWxlpWxpZ2h0pXBvbGFyg6thbmd1bGFyYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWnYmdjb2xvcqcjRTVFQ0Y2qnJhZGlhbGF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlr2F1dG90eXBlbnVtYmVyc6ZzdHJpY3SkZm9udIGlY29sb3KnIzJhM2Y1Zqd0ZXJuYXJ5hKVhYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWnYmdjb2xvcqcjRTVFQ0Y2pWNheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZaViYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWyYW5ub3RhdGlvbmRlZmF1bHRzg6lhcnJvd2hlYWTKAAAAAKphcnJvd3dpZHRoyj+AAACqYXJyb3djb2xvcqcjMmEzZjVmrHBsb3RfYmdjb2xvcqcjRTVFQ0Y2pXRpdGxlgaF4yj1MzM2lc2NlbmWDpXhheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0ZaV6YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWleWF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlqGNvbG9yd2F5mqcjNjM2ZWZhpyNFRjU1M0KnIzAwY2M5NqcjYWI2M2ZhpyNGRkExNUGnIzE5ZDNmM6cjRkY2NjkypyNCNkU4ODCnI0ZGOTdGRqcjRkVDQjUypGRhdGHeABmuc2NhdHRlcnBvbGFyZ2yRgqR0eXBlrnNjYXR0ZXJwb2xhcmdspm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZjYXJwZXSRg6ViYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlpHR5cGWmY2FycGV0pWFheGlzhalncmlkY29sb3Kld2hpdGWsZW5kbGluZWNvbG9ypyMyYTNmNWaubWlub3JncmlkY29sb3Kld2hpdGWuc3RhcnRsaW5lY29sb3KnIzJhM2Y1ZqlsaW5lY29sb3Kld2hpdGWsc2NhdHRlcnBvbGFykYKkdHlwZaxzY2F0dGVycG9sYXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqXBhcmNvb3Jkc5GCpGxpbmWBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZalwYXJjb29yZHOnc2NhdHRlcpGCpHR5cGWnc2NhdHRlcqZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACyaGlzdG9ncmFtMmRjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlsmhpc3RvZ3JhbTJkY29udG91cqpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxp2NvbnRvdXKRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnY29udG91cqpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJjYXJwZXSRgqR0eXBlrXNjYXR0ZXJjYXJwZXSmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApm1lc2gzZJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZaZtZXNoM2Snc3VyZmFjZZGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadzdXJmYWNlqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtc2NhdHRlcm1hcGJveJGCpHR5cGWtc2NhdHRlcm1hcGJveKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACqc2NhdHRlcmdlb5GCpHR5cGWqc2NhdHRlcmdlb6ZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACpaGlzdG9ncmFtkYKkdHlwZaloaXN0b2dyYW2mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAo3BpZZGCpHR5cGWjcGllqmF1dG9tYXJnaW7DqmNob3JvcGxldGiRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWqY2hvcm9wbGV0aKloZWF0bWFwZ2yRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpaGVhdG1hcGdsqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGjYmFykYSkdHlwZaNiYXKnZXJyb3JfeYGlY29sb3KnIzJhM2Y1ZqdlcnJvcl94gaVjb2xvcqcjMmEzZjVmpm1hcmtlcoGkbGluZYKlY29sb3KnI0U1RUNGNqV3aWR0aMo/AAAAp2hlYXRtYXCRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnaGVhdG1hcKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrWNvbnRvdXJjYXJwZXSRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWtY29udG91cmNhcnBldKV0YWJsZZGDpHR5cGWldGFibGWmaGVhZGVygqRsaW5lgaVjb2xvcqV3aGl0ZaRmaWxsgaVjb2xvcqcjQzhENEUzpWNlbGxzgqRsaW5lgaVjb2xvcqV3aGl0ZaRmaWxsgaVjb2xvcqcjRUJGMEY4qXNjYXR0ZXIzZJGDpGxpbmWBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZalzY2F0dGVyM2SmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqGJhcnBvbGFykYKkdHlwZahiYXJwb2xhcqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKlzY2F0dGVyZ2yRgqR0eXBlqXNjYXR0ZXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACraGlzdG9ncmFtMmSRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWraGlzdG9ncmFtMmSqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa5zY2F0dGVydGVybmFyeZGCpHR5cGWuc2NhdHRlcnRlcm5hcnmmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApmxlZ2VuZIWneWFuY2hvcqZib3R0b22neGFuY2hvcqRsZWZ0oXnKP4AAAKtvcmllbnRhdGlvbqFooXjKAAAAAKV5YXhpc4OpZ3JpZGNvbG9ypXdoaXRlrXplcm9saW5lY29sb3Kld2hpdGWqZml4ZWRyYW5nZcKmc2hhcGVzkKRmb250gaVjb2xvcqRncmF5q2Fubm90YXRpb25zkKxwbG90X2JnY29sb3KwcmdiKDIyOSwyMzYsMjQ2KaZtYXJnaW6EoWzKAAAAAKFiygAAAAChcsoAAAAAoXTKAAAAAKZjb25maWeItm1vZGVCYXJCdXR0b25zVG9SZW1vdmWYpHpvb22pYXV0b1NjYWxlrHJlc2V0U2NhbGUyZKNwYW6tdGFibGVSb3RhdGlvbrNyZXNldENhbWVyYUxhc3RTYXZlpnpvb21Jbqd6b29tT3V0q2Rpc3BsYXlsb2dvwrR0b0ltYWdlQnV0dG9uT3B0aW9uc4GmZm9ybWF0o3N2Z6hzaG93TGlua8KoZWRpdGFibGXCqnJlc3BvbnNpdmXDqnN0YXRpY1Bsb3TCqnNjcm9sbFpvb23DpmZyYW1lc5CkZGF0YZSFoXnIAZQXJtZMP5BRET+wqg0+GsatPsJPMz/gwFE/ZlInP4RghD7EY2w+DEolP741Vz/YnT4/iYbFPhhK7T0cphY/wMJdP4DMWD8eRQc/gJ1SPNqaBj+hO2Y/VUd4PxMDMz8w8Co+i8DnPqIHcj9Kn5A/ZOJrPwRDvD6gG7g+aPWBP9IVrj+5Gp8/FkwpP5DzZj4GM5E/oOveP07Z5D9wKZY/QPYoPHXIsD9n6CJAx4xAQPRoGkA1DyE/J6oLQHHYskBilQ9B9NU6QVZwUkEkl1FByJU4QWG2DEHv261A1K0GQKANGj8wghJAKjo1QEQYGEDWuKM/APIaPL7ViD+W3M4/1uHHP4IlgT/sxks+QikUP0ofij936ZU/gAZeP3UBnD5jO54+rKpEPxo3bz9sjkY/D5i8Plz9CT6WVw8/4jRFP7BmNT9sZ9I+wEgjPNYN0D5DYiU/3s4nPywp4j5gsbA9huKRPqKmCz98Zhw/LE/uPpAJKT7gzDs+8HbrPo5mEj8KS/g+07BuPlgDwT3WZsQ+0U4JPwAAgH+kdHlwZadzY2F0dGVypG5hbWWmfFModCl8rWhvdmVydGVtcGxhdGW8KCV7eDouNGZ9IG1zLCAle3k6LjNmfSBhLnUuKaF4yAGUF1pkKUG+nyxBI9svQYcWM0HsUTZBUI05QbTIPEEZBEBBfT9DQeF6RkFGtklBqvFMQQ4tUEFzaFNB16NWQTvfWUGgGl1BBFZgQWiRY0HNzGZBMQhqQZZDbUH6fnBBXrpzQcP1dkEnMXpBi2x9QfhTgEGq8YFBXI+DQQ4thUHByoZBc2iIQSUGikHXo4tBiUGNQTvfjkHufJBBoBqSQVK4k0EEVpVBtvOWQWiRmEEbL5pBzcybQX9qnUExCJ9B46WgQZZDokFI4aNB+n6lQawcp0FeuqhBEFiqQcP1q0F1k61BJzGvQdnOsEGLbLJBPQq0QfCntUGiRbdBVOO4QQaBukG4HrxBary9QR1av0HP98BBgZXCQTMzxEHl0MVBmG7HQUoMyUH8qcpBrkfMQWDlzUESg89BxSDRQXe+0kEpXNRB2/nVQY2X10E/NdlB8tLaQaRw3EFWDt5BCKzfQbpJ4UFt5+JBH4XkQdEi5kGDwOdBNV7pQef76kGamexBTDfuQf7U70GwcvFBYhDzQRSu9EEUrvRBhaF5yAGUFwAAALMAAIAzAACAMwAAAAAAAAAAAAAAswAAAAAAAAC0AAAAAAAAgLMAAAAAAAAAAAAAgDMAAIAzAACAswAAAAAAAACzAAAAAAAAAAAAAICzAAAAswAAgLMAAICzAAAAtAAAAAAAAIAzAAAAAAAAADQAACC0AADAswAAgDMAAAA0AAAAAAAAAAAAAIC0AAAAAAAAAAAAAAA0AABAswAAYDQAAMCzAABANAAAAAAAAAAAAAAAAAAAAAAAAAA1AAAANQAAAAAAAIAzAACAMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgLQAAAAAAACANAAAgLIAAAAzAAAAAAAAALQAAAC0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAzAACAsgAAQLMAAAAzAAAAAAAAgDMAAIAzAACAMwAAAAAAAMCzAACAswAAAAAAAAAzAAAAswAAAAAAAIAzAACAswAAgLMAAACzAACAswAAAAAAAIAzAAAAAAAAQDMAAIAzAAAAMwAAAAAAAAAAAAAAAAAAALMAAMD/pHR5cGWnc2NhdHRlcqRuYW1lqFJle1ModCl9rWhvdmVydGVtcGxhdGW8KCV7eDouNGZ9IG1zLCAle3k6LjNmfSBhLnUuKaF4yAGUF1pkKUG+nyxBI9svQYcWM0HsUTZBUI05QbTIPEEZBEBBfT9DQeF6RkFGtklBqvFMQQ4tUEFzaFNB16NWQTvfWUGgGl1BBFZgQWiRY0HNzGZBMQhqQZZDbUH6fnBBXrpzQcP1dkEnMXpBi2x9QfhTgEGq8YFBXI+DQQ4thUHByoZBc2iIQSUGikHXo4tBiUGNQTvfjkHufJBBoBqSQVK4k0EEVpVBtvOWQWiRmEEbL5pBzcybQX9qnUExCJ9B46WgQZZDokFI4aNB+n6lQawcp0FeuqhBEFiqQcP1q0F1k61BJzGvQdnOsEGLbLJBPQq0QfCntUGiRbdBVOO4QQaBukG4HrxBary9QR1av0HP98BBgZXCQTMzxEHl0MVBmG7HQUoMyUH8qcpBrkfMQWDlzUESg89BxSDRQXe+0kEpXNRB2/nVQY2X10E/NdlB8tLaQaRw3EFWDt5BCKzfQbpJ4UFt5+JBH4XkQdEi5kGDwOdBNV7pQef76kGamexBTDfuQf7U70GwcvFBYhDzQRSu9EEUrvRBhaF5yAGUFybWTL+QURG/sKoNvhrGrT7CTzM/4MBRP2ZSJz+EYIQ+xGNsvgxKJb++NVe/2J0+v4mGxb4YSu09HKYWP8DCXT+AzFg/HkUHP4CdUjzamga/oTtmv1VHeL8TAzO/MPAqvovA5z6iB3I/Sp+QP2Tiaz8EQ7w+oBu4vmj1gb/SFa6/uRqfvxZMKb+Q82Y+BjORP6Dr3j9O2eQ/cCmWP0D2KDx1yLC/Z+giwMeMQMD0aBrANQ8hvyeqC0Bx2LJAYpUPQfTVOkFWcFJBJJdRQciVOEFhtgxB79utQNStBkCgDRq/MIISwCo6NcBEGBjA1rijvwDyGjy+1Yg/ltzOP9bhxz+CJYE/7MZLPkIpFL9KH4q/d+mVv4AGXr91AZy+YzuePqyqRD8aN28/bI5GPw+YvD5c/Qm+llcPv+I0Rb+wZjW/bGfSvsBIIzzWDdA+Q2IlP97OJz8sKeI+YLGwPYbikb6ipgu/fGYcvyxP7r6QCSm+4Mw7PvB26z6OZhI/Ckv4PtOwbj5YA8G91mbEvtFOCb8AAIB/pHR5cGWnc2NhdHRlcqRuYW1lqElte1ModCl9rWhvdmVydGVtcGxhdGW8KCV7eDouNGZ9IG1zLCAle3k6LjNmfSBhLnUuKaF4yAGUF1pkKUG+nyxBI9svQYcWM0HsUTZBUI05QbTIPEEZBEBBfT9DQeF6RkFGtklBqvFMQQ4tUEFzaFNB16NWQTvfWUGgGl1BBFZgQWiRY0HNzGZBMQhqQZZDbUH6fnBBXrpzQcP1dkEnMXpBi2x9QfhTgEGq8YFBXI+DQQ4thUHByoZBc2iIQSUGikHXo4tBiUGNQTvfjkHufJBBoBqSQVK4k0EEVpVBtvOWQWiRmEEbL5pBzcybQX9qnUExCJ9B46WgQZZDokFI4aNB+n6lQawcp0FeuqhBEFiqQcP1q0F1k61BJzGvQdnOsEGLbLJBPQq0QfCntUGiRbdBVOO4QQaBukG4HrxBary9QR1av0HP98BBgZXCQTMzxEHl0MVBmG7HQUoMyUH8qcpBrkfMQWDlzUESg89BxSDRQXe+0kEpXNRB2/nVQY2X10E/NdlB8tLaQaRw3EFWDt5BCKzfQbpJ4UFt5+JBH4XkQdEi5kGDwOdBNV7pQef76kGamexBTDfuQf7U70GwcvFBYhDzQRSu9EEUrvRBhaZtYXJrZXKBpWNvbG9ypnB1cnBsZaF5yAGQF7N3gUEP8oBB9GyAQcXQf0GzyH5Bs8F9QcK7fEHftntBCbN6QUCweUGCrnhBzq13QSOudkGAr3VB5LF0QU21c0G7uXJBLb9xQaLFcEEYzW9Bj9VuQQXfbUF56WxB7PRrQVoBa0HEDmpBKR1pQYcsaEHdPGdBK05mQW9gZUGoc2RB1odjQfecYkELs2FBEMpgQQbiX0Hr+l5BvxReQYAvXUEuS1xByGdbQUyFWkG7o1lBEsNYQVHjV0F3BFdBgiZWQXRJVUFJbVRBAZJTQZy3UkEZ3lFBdgVRQbItUEHNVk9BxoBOQZyrTUFO10xB3ANMQUMxS0GEX0pBnY5JQY6+SEFW70dB9CBHQWZTRkGthkVBx7pEQbTvQ0FyJUNBAVxCQWCTQUGPy0BBiwRAQVU+P0HreD5BTrQ9QXvwPEFyLTxBM2s7QbypOkEN6TlBJCk5QQJqOEGlqzdBDe42QTgxNkEndTVB17k0QUn/M0F7RTNBbYwyQR/UMUGOHDFBu2UwQaWvL0FK+i5Bq0UuQcaRLUGkdHlwZadzY2F0dGVypG5hbWWoVDItZGVjYXmheMgBkBcHZSlBgaAsQfrbL0F0FzNB7VI2QWeOOUHgyTxBWgVAQdNAQ0FNfEZBxrdJQUDzTEG6LlBBM2pTQa2lVkEm4VlBoBxdQRlYYEGTk2NBDM9mQYYKakH/RW1BeYFwQfK8c0Fs+HZB5jN6QV9vfUFsVYBBKfOBQeaQg0GjLoVBX8yGQRxqiEHZB4pBlqWLQVJDjUEP4Y5BzH6QQYkckkFGupNBAliVQb/1lkF8k5hBOTGaQfXOm0GybJ1BbwqfQSyooEHoRaJBpeOjQWKBpUEfH6dB27yoQZhaqkFV+KtBEpatQc8zr0GL0bBBSG+yQQUNtEHCqrVBfki3QTvmuEH4g7pBtSG8QXG/vUEuXb9B6/rAQaiYwkFlNsRBIdTFQd5xx0GbD8lBWK3KQRRLzEHR6M1BjobPQUsk0UEHwtJBxF/UQYH91UE+m9dB+zjZQbfW2kF0dNxBMRLeQe6v30GqTeFBZ+viQSSJ5EHhJuZBncTnQVpi6UEXAOtB1J3sQZA77kFN2e9BCnfxQccU80GEsvRB2TU3YmNjMDViMC04MWRhLTExZWYtMjA0MC0zNTg1YzliNDk1NGYvYjAxZTNhNjI4NjYzY2I2Y4SmbGF5b3V0h6dtb2RlYmFyiKVjb2xvcqRncmF5q2FjdGl2ZWNvbG9ysHJnYigyMjksMjM2LDI0NimneWFuY2hvcqZib3R0b22neGFuY2hvcqVyaWdodKF5yj+AAACnYmdjb2xvcq1yZ2JhKDAsMCwwLDApq29yaWVudGF0aW9uoWiheMoAAAAArXBhcGVyX2JnY29sb3KtcmdiYSgwLDAsMCwwKaRmb250gaVjb2xvcqRncmF5qHRlbXBsYXRlgqZsYXlvdXTeABOpY29sb3JheGlzgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApXhheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Zalob3Zlcm1vZGWnY2xvc2VzdK1wYXBlcl9iZ2NvbG9ypXdoaXRlo2dlb4apc2hvd2xha2Vzw6hzaG93bGFuZMOpbGFuZGNvbG9ypyNFNUVDRjanYmdjb2xvcqV3aGl0ZaxzdWJ1bml0Y29sb3Kld2hpdGWpbGFrZWNvbG9ypXdoaXRlqmNvbG9yc2NhbGWDqnNlcXVlbnRpYWyaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGpZGl2ZXJnaW5nm5LKAAAAAKcjOGUwMTUykso9zMzNpyNjNTFiN2SSyj5MzM2nI2RlNzdhZZLKPpmZmqcjZjFiNmRhkso+zMzNpyNmZGUwZWaSyj8AAACnI2Y3ZjdmN5LKPxmZmqcjZTZmNWQwkso/MzMzpyNiOGUxODaSyj9MzM2nIzdmYmM0MZLKP2ZmZqcjNGQ5MjIxkso/gAAApyMyNzY0MTmvc2VxdWVudGlhbG1pbnVzmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxpXlheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Za1zaGFwZWRlZmF1bHRzgaRsaW5lgaVjb2xvcqcjMmEzZjVmqmhvdmVybGFiZWyBpWFsaWdupGxlZnSmbWFwYm94gaVzdHlsZaVsaWdodKVwb2xhcoOrYW5ndWxhcmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqpyYWRpYWxheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0Za9hdXRvdHlwZW51bWJlcnOmc3RyaWN0pGZvbnSBpWNvbG9ypyMyYTNmNWandGVybmFyeYSlYWF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqVjYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWlYmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlsmFubm90YXRpb25kZWZhdWx0c4OpYXJyb3doZWFkygAAAACqYXJyb3d3aWR0aMo/gAAAqmFycm93Y29sb3KnIzJhM2Y1ZqxwbG90X2JnY29sb3KnI0U1RUNGNqV0aXRsZYGheMo9TMzNpXNjZW5lg6V4YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWlemF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXlheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0Zahjb2xvcndheZqnIzYzNmVmYacjRUY1NTNCpyMwMGNjOTanI2FiNjNmYacjRkZBMTVBpyMxOWQzZjOnI0ZGNjY5MqcjQjZFODgwpyNGRjk3RkanI0ZFQ0I1MqRkYXRh3gAZrnNjYXR0ZXJwb2xhcmdskYKkdHlwZa5zY2F0dGVycG9sYXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmY2FycGV0kYOlYmF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaR0eXBlpmNhcnBldKVhYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlrHNjYXR0ZXJwb2xhcpGCpHR5cGWsc2NhdHRlcnBvbGFypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKlwYXJjb29yZHORgqRsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpcGFyY29vcmRzp3NjYXR0ZXKRgqR0eXBlp3NjYXR0ZXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAsmhpc3RvZ3JhbTJkY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZbJoaXN0b2dyYW0yZGNvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMadjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2NvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVyY2FycGV0kYKkdHlwZa1zY2F0dGVyY2FycGV0pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZtZXNoM2SRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWmbWVzaDNkp3N1cmZhY2WRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnc3VyZmFjZapjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJtYXBib3iRgqR0eXBlrXNjYXR0ZXJtYXBib3imbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqnNjYXR0ZXJnZW+RgqR0eXBlqnNjYXR0ZXJnZW+mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqWhpc3RvZ3JhbZGCpHR5cGWpaGlzdG9ncmFtpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKNwaWWRgqR0eXBlo3BpZaphdXRvbWFyZ2luw6pjaG9yb3BsZXRokYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqmNob3JvcGxldGipaGVhdG1hcGdskYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqWhlYXRtYXBnbKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxo2JhcpGEpHR5cGWjYmFyp2Vycm9yX3mBpWNvbG9ypyMyYTNmNWanZXJyb3JfeIGlY29sb3KnIzJhM2Y1ZqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKdoZWF0bWFwkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2hlYXRtYXCqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1jb250b3VyY2FycGV0kYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlrWNvbnRvdXJjYXJwZXSldGFibGWRg6R0eXBlpXRhYmxlpmhlYWRlcoKkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0M4RDRFM6VjZWxsc4KkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0VCRjBGOKlzY2F0dGVyM2SRg6RsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpc2NhdHRlcjNkpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKhiYXJwb2xhcpGCpHR5cGWoYmFycG9sYXKmbWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACpc2NhdHRlcmdskYKkdHlwZalzY2F0dGVyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAq2hpc3RvZ3JhbTJkkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlq2hpc3RvZ3JhbTJkqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGuc2NhdHRlcnRlcm5hcnmRgqR0eXBlrnNjYXR0ZXJ0ZXJuYXJ5pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKVzY2VuZYWmY2FtZXJhgqJ1cIOheco/gAAAoXrKAAAAAKF4ygAAAACjZXllg6F5ygAAAACheso/2ZmaoXjKAAAAAKV4YXhpc4WpZ3JpZGNvbG9ypXdoaXRlr2JhY2tncm91bmRjb2xvcrByZ2IoMjI5LDIzNiwyNDYppXRpdGxlq2t4IFtt4oG7wrldpXJhbmdl1xeJF+DFiRfgRa16ZXJvbGluZWNvbG9ypXdoaXRlpXlheGlzhalncmlkY29sb3Kld2hpdGWvYmFja2dyb3VuZGNvbG9ysHJnYigyMjksMjM2LDI0NimldGl0bGWra3kgW23igbvCuV2lcmFuZ2XXF6cRKMWnEShFrXplcm9saW5lY29sb3Kld2hpdGWlemF4aXOFqWdyaWRjb2xvcqV3aGl0Za9iYWNrZ3JvdW5kY29sb3KwcmdiKDIyOSwyMzYsMjQ2KaV0aXRsZatreiBbbeKBu8K5XaVyYW5nZdcXpxEoxacRKEWtemVyb2xpbmVjb2xvcqV3aGl0Zaphc3BlY3Rtb2RlpGN1YmWmbWFyZ2luhKFsygAAAAChYspCSAAAoXLKAAAAAKF0ygAAAACmbGVnZW5khad5YW5jaG9ypmJvdHRvbad4YW5jaG9ypGxlZnSheco/gAAAq29yaWVudGF0aW9uoWiheMoAAAAApmNvbmZpZ4i2bW9kZUJhckJ1dHRvbnNUb1JlbW92ZZakem9vbaNwYW6tdGFibGVSb3RhdGlvbrVyZXNldENhbWVyYUxhc3RTYXZlM2Stb3JiaXRSb3RhdGlvbrRyZXNldENhbWVyYURlZmF1bHQzZKtkaXNwbGF5bG9nb8K0dG9JbWFnZUJ1dHRvbk9wdGlvbnOBpmZvcm1hdKNzdmeoc2hvd0xpbmvCqGVkaXRhYmxlwqpyZXNwb25zaXZlw6pzdGF0aWNQbG90wqpzY3JvbGxab29tw6ZmcmFtZXOQpGRhdGGTiKRtb2RlpWxpbmVzpGxpbmWBpWNvbG9ypGdyYXmhecgDnBcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACkdHlwZalzY2F0dGVyM2SkbmFtZapUcmFqZWN0b3J5qWhvdmVyaW5mb6Rza2lwoXrIA5wXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoXjIA5wXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyv4ZMbYOjEW2DoxFtg6MRbYOjEW2DoxFtg6MRbYOjEW2DoxFtg6MRbYOjEW2DoxFtg6MRbYOjEW2DoxFtg6MRbYOjEW2DoxFtg6MRbYOjEW2DoxFtg6MRbYOjEW2DoxFtg6MRbYOjEW2DoxFtg6MRbYOjEW2DoxFtg6MRbYOjEW2DoxFtg6MRbYOjMW2DozFtg6MxbYOjMW2DozFtg6MxbYOjMW2DozFtg6MxbYOjMW2DozFtg6MxbYOjMW2DozFtg6MxbYOjMW2DozFtg6MxbYOjMW2DozFtg6MxbYOjMW2DozFtg6MxbYOjMW2DozFtg6MxbYOjMW2DozFtg6MxbYOjMW2DozFXzqJxQlmhsWzkYPFXL2AxQzSe8VfKXbFsoBwxQXYasVYL2XFq4Zfxf/dWcVSNVTFpYxOxfjjSMVLO0PFnpI9xfHpN8VFQTLFmJgsxevvJsU+RyHFkZ4bxeT1FcU4TRDFi6QKxd77BMVipv7ECFXzxK8D6MRVstzE+2DRxKIPxsRIvrrE7myvxJQbpMQ7ypjE4XiNxIcngsRbrG3EqAlXxPVmQMRBxCnEjiETxLX9+MNOuMvD6HKewwJbYsM00AfDmxU1wpsVNUI00AdDAltiQ+hynkNOuMtDtf34Q44hE0RBxClE9WZARKgJV0RbrG1EhyeCROF4jUQ7yphElBukRO5sr0RIvrpEog/GRPtg0URVstxErwPoRAhV80Ripv5E3vsERYukCkU4TRBF5PUVRZGeG0U+RyFF6+8mRZiYLEVFQTJF8ek3RZ6SPUVLO0NF+ONIRaWMTkVSNVRF/91ZRauGX0VYL2VFBdhqRbKAcEVfKXZFDNJ7RVy9gEWzkYNFCWaGRV86iUW2DoxFtg6MRbYOjEW2DoxFiqZtYXJrZXKBpHNpemXKQAAAAKRtb2Rlp21hcmtlcnOkbGluZYGlY29sb3LcAGS3aHN2KDI1NS4wLCAxMDAuMCwgNTAuMCnZJGhzdigyNTIuMzYzNjM2MzYzNjM2MzcsIDEwMC4wLCA1MC4wKdkkaHN2KDI0OS43MjcyNzI3MjcyNzI3MiwgMTAwLjAsIDUwLjAp2T5oc3YoMjQ3LjA5MDkwOTA5MDkwOTEyLCAxMDAuMDAwMDAwMDAwMDAwMDEsIDUwLjAwMDAwMDAwMDAwMDAxKdkkaHN2KDI0NC40NTQ1NDU0NTQ1NDU0NCwgMTAwLjAsIDUwLjAp2SNoc3YoMjQxLjgxODE4MTgxODE4MTgsIDEwMC4wLCA1MC4wKdkjaHN2KDIzOS4xODE4MTgxODE4MTgyLCAxMDAuMCwgNTAuMCnZJGhzdigyMzYuNTQ1NDU0NTQ1NDU0NTYsIDEwMC4wLCA1MC4wKdkkaHN2KDIzMy45MDkwOTA5MDkwOTA5MywgMTAwLjAsIDUwLjAp2SRoc3YoMjMxLjI3MjcyNzI3MjcyNzI1LCAxMDAuMCwgNTAuMCnZJGhzdigyMjguNjM2MzYzNjM2MzYzNjMsIDEwMC4wLCA1MC4wKbdoc3YoMjI2LjAsIDEwMC4wLCA1MC4wKdk9aHN2KDIyMy40NTQ1NDU0NTQ1NDU0NCwgOTkuOTk5OTk5OTk5OTk5OTksIDQ5Ljk5OTk5OTk5OTk5OTk5KdkjaHN2KDIyMC45MDkwOTA5MDkwOTA5LCAxMDAuMCwgNTAuMCnZPmhzdigyMTguMzYzNjM2MzYzNjM2MzcsIDEwMC4wMDAwMDAwMDAwMDAwMSwgNTAuMDAwMDAwMDAwMDAwMDEp2SNoc3YoMjE1LjgxODE4MTgxODE4MTgsIDEwMC4wLCA1MC4wKdkkaHN2KDIxMy4yNzI3MjcyNzI3MjcyNSwgMTAwLjAsIDUwLjAp2SRoc3YoMjEwLjcyNzI3MjcyNzI3MjcyLCAxMDAuMCwgNTAuMCnZI2hzdigyMDguMTgxODE4MTgxODE4MiwgMTAwLjAsIDUwLjAp2SRoc3YoMjA1LjYzNjM2MzYzNjM2MzYzLCAxMDAuMCwgNTAuMCnZJGhzdigyMDMuMDkwOTA5MDkwOTA5MDcsIDEwMC4wLCA1MC4wKdkkaHN2KDIwMC41NDU0NTQ1NDU0NTQ1MywgMTAwLjAsIDUwLjApt2hzdigxOTguMCwgMTAwLjAsIDUwLjAp2T1oc3YoMTk1LjQ1NDU0NTQ1NDU0NTQ0LCA5OS45OTk5OTk5OTk5OTk5OSwgNDkuOTk5OTk5OTk5OTk5OTkp2SNoc3YoMTkyLjkwOTA5MDkwOTA5MDksIDEwMC4wLCA1MC4wKdkkaHN2KDE5MC4zNjM2MzYzNjM2MzYzNywgMTAwLjAsIDUwLjAp2SNoc3YoMTg3LjgxODE4MTgxODE4MTgsIDEwMC4wLCA1MC4wKdkkaHN2KDE4NS4yNzI3MjcyNzI3MjcyOCwgMTAwLjAsIDUwLjAp2SRoc3YoMTgyLjcyNzI3MjcyNzI3MjcyLCAxMDAuMCwgNTAuMCnZI2hzdigxODAuMTgxODE4MTgxODE4MiwgMTAwLjAsIDUwLjAp2SRoc3YoMTc3LjYzNjM2MzYzNjM2MzYzLCAxMDAuMCwgNTAuMCnZI2hzdigxNzUuMDkwOTA5MDkwOTA5MSwgMTAwLjAsIDUwLjAp2SRoc3YoMTcyLjU0NTQ1NDU0NTQ1NDUzLCAxMDAuMCwgNTAuMCm3aHN2KDE3MC4wLCAxMDAuMCwgNTAuMCnZPWhzdigxNjcuMzYzNjM2MzYzNjM2MzcsIDk5Ljk5OTk5OTk5OTk5OTk5LCA0OS45OTk5OTk5OTk5OTk5OSnZJGhzdigxNjQuNzI3MjcyNzI3MjcyNzIsIDEwMC4wLCA1MC4wKdkjaHN2KDE2Mi4wOTA5MDkwOTA5MDkxLCAxMDAuMCwgNTAuMCnZJGhzdigxNTkuNDU0NTQ1NDU0NTQ1NDQsIDEwMC4wLCA1MC4wKdkjaHN2KDE1Ni44MTgxODE4MTgxODE4LCAxMDAuMCwgNTAuMCnZI2hzdigxNTQuMTgxODE4MTgxODE4MiwgMTAwLjAsIDUwLjAp2SRoc3YoMTUxLjU0NTQ1NDU0NTQ1NDU2LCAxMDAuMCwgNTAuMCnZI2hzdigxNDguOTA5MDkwOTA5MDkwOSwgMTAwLjAsIDUwLjAp2SRoc3YoMTQ2LjI3MjcyNzI3MjcyNzI1LCAxMDAuMCwgNTAuMCnZJGhzdigxNDMuNjM2MzYzNjM2MzYzNjMsIDEwMC4wLCA1MC4wKbdoc3YoMTQxLjAsIDEwMC4wLCA1MC4wKdkkaHN2KDEzOC40NTQ1NDU0NTQ1NDU0NywgMTAwLjAsIDUwLjAp2SNoc3YoMTM1LjkwOTA5MDkwOTA5MDksIDEwMC4wLCA1MC4wKdkkaHN2KDEzMy4zNjM2MzYzNjM2MzYzNSwgMTAwLjAsIDUwLjAp2SNoc3YoMTMwLjgxODE4MTgxODE4MTgsIDEwMC4wLCA1MC4wKdkkaHN2KDEyOC4yNzI3MjcyNzI3MjcyNSwgMTAwLjAsIDUwLjAp2SRoc3YoMTI1LjcyNzI3MjcyNzI3MjcyLCAxMDAuMCwgNTAuMCnZJGhzdigxMjMuMTgxODE4MTgxODE4MTksIDEwMC4wLCA1MC4wKdkkaHN2KDEyMC42MzYzNjM2MzYzNjM2MywgMTAwLjAsIDUwLjAp2SNoc3YoMTE4LjA5MDkwOTA5MDkwOTEsIDEwMC4wLCA1MC4wKdkkaHN2KDExNS41NDU0NTQ1NDU0NTQ1NiwgMTAwLjAsIDUwLjApt2hzdigxMTMuMCwgMTAwLjAsIDUwLjAp2T1oc3YoMTEwLjQ1NDU0NTQ1NDU0NTQ1LCA5OS45OTk5OTk5OTk5OTk5OSwgNDkuOTk5OTk5OTk5OTk5OTkp2SNoc3YoMTA3LjkwOTA5MDkwOTA5MDksIDEwMC4wLCA1MC4wKdkkaHN2KDEwNS4zNjM2MzYzNjM2MzYzNiwgMTAwLjAsIDUwLjAp2SRoc3YoMTAyLjgxODE4MTgxODE4MTg0LCAxMDAuMCwgNTAuMCnZJGhzdigxMDAuMjcyNzI3MjcyNzI3MjUsIDEwMC4wLCA1MC4wKdkjaHN2KDk3LjcyNzI3MjcyNzI3MjczLCAxMDAuMCwgNTAuMCnZI2hzdig5NS4xODE4MTgxODE4MTgxNywgMTAwLjAsIDUwLjAp2SNoc3YoOTIuNjM2MzYzNjM2MzYzNjMsIDEwMC4wLCA1MC4wKdkjaHN2KDkwLjA5MDkwOTA5MDkwOTA3LCAxMDAuMCwgNTAuMCnZI2hzdig4Ny41NDU0NTQ1NDU0NTQ1MywgMTAwLjAsIDUwLjAptmhzdig4NS4wLCAxMDAuMCwgNTAuMCnZI2hzdig4Mi4zNjM2MzYzNjM2MzYzNSwgMTAwLjAsIDUwLjAp2SNoc3YoNzkuNzI3MjcyNzI3MjcyNzMsIDEwMC4wLCA1MC4wKdkjaHN2KDc3LjA5MDkwOTA5MDkwOTA3LCAxMDAuMCwgNTAuMCnZI2hzdig3NC40NTQ1NDU0NTQ1NDU0NSwgMTAwLjAsIDUwLjAp2SNoc3YoNzEuODE4MTgxODE4MTgxODMsIDEwMC4wLCA1MC4wKdkjaHN2KDY5LjE4MTgxODE4MTgxODE3LCAxMDAuMCwgNTAuMCnZI2hzdig2Ni41NDU0NTQ1NDU0NTQ1NiwgMTAwLjAsIDUwLjAp2SJoc3YoNjMuOTA5MDkwOTA5MDkwOSwgMTAwLjAsIDUwLjAp2SNoc3YoNjEuMjcyNzI3MjcyNzI3MjcsIDEwMC4wLCA1MC4wKdkkaHN2KDU4LjYzNjM2MzYzNjM2MzY1NCwgMTAwLjAsIDUwLjAptmhzdig1Ni4wLCAxMDAuMCwgNTAuMCnZPGhzdig1My40NTQ1NDU0NTQ1NDU0NiwgOTkuOTk5OTk5OTk5OTk5OTksIDQ5Ljk5OTk5OTk5OTk5OTk5KdkiaHN2KDUwLjkwOTA5MDkwOTA5MDksIDEwMC4wLCA1MC4wKdkjaHN2KDQ4LjM2MzYzNjM2MzYzNjM2LCAxMDAuMCwgNTAuMCnZImhzdig0NS44MTgxODE4MTgxODE4LCAxMDAuMCwgNTAuMCnZJGhzdig0My4yNzI3MjcyNzI3MjcyNjYsIDEwMC4wLCA1MC4wKdkkaHN2KDQwLjcyNzI3MjcyNzI3MjczNCwgMTAwLjAsIDUwLjAp2SNoc3YoMzguMTgxODE4MTgxODE4MTcsIDEwMC4wLCA1MC4wKdkjaHN2KDM1LjYzNjM2MzYzNjM2MzYzLCAxMDAuMCwgNTAuMCnZJGhzdigzMy4wOTA5MDkwOTA5MDkwNjUsIDEwMC4wLCA1MC4wKdkkaHN2KDMwLjU0NTQ1NDU0NTQ1NDUzNiwgMTAwLjAsIDUwLjAptmhzdigyOC4wLCAxMDAuMCwgNTAuMCnZI2hzdigyNS40NTQ1NDU0NTQ1NDU0NCwgMTAwLjAsIDUwLjAp2SRoc3YoMjIuOTA5MDkwOTA5MDkwOTA3LCAxMDAuMCwgNTAuMCnZJGhzdigyMC4zNjM2MzYzNjM2MzYzNDYsIDEwMC4wLCA1MC4wKdkkaHN2KDE3LjgxODE4MTgxODE4MTgxMywgMTAwLjAsIDUwLjAp2SRoc3YoMTUuMjcyNzI3MjcyNzI3MjUyLCAxMDAuMCwgNTAuMCnZI2hzdigxMi43MjcyNzI3MjcyNzI3MiwgMTAwLjAsIDUwLjAp2SRoc3YoMTAuMTgxODE4MTgxODE4MTg5LCAxMDAuMCwgNTAuMCnZI2hzdig3LjYzNjM2MzYzNjM2MzYyNiwgMTAwLjAsIDUwLjAp2SNoc3YoNS4wOTA5MDkwOTA5MDkwOTMsIDEwMC4wLCA1MC4wKdkjaHN2KDIuNTQ1NDU0NTQ1NDU0NTM0LCAxMDAuMCwgNTAuMCm1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cmtlcoOmc3ltYm9spWNyb3NzpWNvbG9yo3JlZKRzaXplykEgAAChedYXAAAAAKR0eXBlqXNjYXR0ZXIzZKRuYW1lo2s9MKF61hcAAAAAoXjWFwAAAADZNTdiY2MwNWIwLTgxZGEtMTFlZi0yMDQwLTM1ODVjOWI0OTU0Zi84N2FjYzllNDgwYzViMWJhhKZsYXlvdXSCqHRlbXBsYXRlgqZsYXlvdXTeABOpY29sb3JheGlzgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApXhheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Zalob3Zlcm1vZGWnY2xvc2VzdK1wYXBlcl9iZ2NvbG9ypXdoaXRlo2dlb4apc2hvd2xha2Vzw6hzaG93bGFuZMOpbGFuZGNvbG9ypyNFNUVDRjanYmdjb2xvcqV3aGl0ZaxzdWJ1bml0Y29sb3Kld2hpdGWpbGFrZWNvbG9ypXdoaXRlqmNvbG9yc2NhbGWDqnNlcXVlbnRpYWyaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGpZGl2ZXJnaW5nm5LKAAAAAKcjOGUwMTUykso9zMzNpyNjNTFiN2SSyj5MzM2nI2RlNzdhZZLKPpmZmqcjZjFiNmRhkso+zMzNpyNmZGUwZWaSyj8AAACnI2Y3ZjdmN5LKPxmZmqcjZTZmNWQwkso/MzMzpyNiOGUxODaSyj9MzM2nIzdmYmM0MZLKP2ZmZqcjNGQ5MjIxkso/gAAApyMyNzY0MTmvc2VxdWVudGlhbG1pbnVzmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxpXlheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Za1zaGFwZWRlZmF1bHRzgaRsaW5lgaVjb2xvcqcjMmEzZjVmqmhvdmVybGFiZWyBpWFsaWdupGxlZnSmbWFwYm94gaVzdHlsZaVsaWdodKVwb2xhcoOrYW5ndWxhcmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqpyYWRpYWxheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0Za9hdXRvdHlwZW51bWJlcnOmc3RyaWN0pGZvbnSBpWNvbG9ypyMyYTNmNWandGVybmFyeYSlYWF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqVjYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWlYmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlsmFubm90YXRpb25kZWZhdWx0c4OpYXJyb3doZWFkygAAAACqYXJyb3d3aWR0aMo/gAAAqmFycm93Y29sb3KnIzJhM2Y1ZqxwbG90X2JnY29sb3KnI0U1RUNGNqV0aXRsZYGheMo9TMzNpXNjZW5lg6V4YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWlemF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXlheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0Zahjb2xvcndheZqnIzYzNmVmYacjRUY1NTNCpyMwMGNjOTanI2FiNjNmYacjRkZBMTVBpyMxOWQzZjOnI0ZGNjY5MqcjQjZFODgwpyNGRjk3RkanI0ZFQ0I1MqRkYXRh3gAZrnNjYXR0ZXJwb2xhcmdskYKkdHlwZa5zY2F0dGVycG9sYXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmY2FycGV0kYOlYmF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaR0eXBlpmNhcnBldKVhYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlrHNjYXR0ZXJwb2xhcpGCpHR5cGWsc2NhdHRlcnBvbGFypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKlwYXJjb29yZHORgqRsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpcGFyY29vcmRzp3NjYXR0ZXKRgqR0eXBlp3NjYXR0ZXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAsmhpc3RvZ3JhbTJkY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZbJoaXN0b2dyYW0yZGNvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMadjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2NvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVyY2FycGV0kYKkdHlwZa1zY2F0dGVyY2FycGV0pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZtZXNoM2SRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWmbWVzaDNkp3N1cmZhY2WRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnc3VyZmFjZapjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJtYXBib3iRgqR0eXBlrXNjYXR0ZXJtYXBib3imbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqnNjYXR0ZXJnZW+RgqR0eXBlqnNjYXR0ZXJnZW+mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqWhpc3RvZ3JhbZGCpHR5cGWpaGlzdG9ncmFtpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKNwaWWRgqR0eXBlo3BpZaphdXRvbWFyZ2luw6pjaG9yb3BsZXRokYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqmNob3JvcGxldGipaGVhdG1hcGdskYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqWhlYXRtYXBnbKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxo2JhcpGEpHR5cGWjYmFyp2Vycm9yX3mBpWNvbG9ypyMyYTNmNWanZXJyb3JfeIGlY29sb3KnIzJhM2Y1ZqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKdoZWF0bWFwkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2hlYXRtYXCqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1jb250b3VyY2FycGV0kYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlrWNvbnRvdXJjYXJwZXSldGFibGWRg6R0eXBlpXRhYmxlpmhlYWRlcoKkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0M4RDRFM6VjZWxsc4KkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0VCRjBGOKlzY2F0dGVyM2SRg6RsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpc2NhdHRlcjNkpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKhiYXJwb2xhcpGCpHR5cGWo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X2JnY29sb3Kld2hpdGWjZ2VvhqlzaG93bGFrZXPDqHNob3dsYW5kw6lsYW5kY29sb3KnI0U1RUNGNqdiZ2NvbG9ypXdoaXRlrHN1YnVuaXRjb2xvcqV3aGl0ZalsYWtlY29sb3Kld2hpdGWqY29sb3JzY2FsZYOqc2VxdWVudGlhbJqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMalkaXZlcmdpbmebksoAAAAApyM4ZTAxNTKSyj3MzM2nI2M1MWI3ZJLKPkzMzacjZGU3N2Flkso+mZmapyNmMWI2ZGGSyj7MzM2nI2ZkZTBlZpLKPwAAAKcjZjdmN2Y3kso/GZmapyNlNmY1ZDCSyj8zMzOnI2I4ZTE4NpLKP0zMzacjN2ZiYzQxkso/ZmZmpyM0ZDkyMjGSyj+AAACnIzI3NjQxOa9zZXF1ZW50aWFsbWludXOaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGleWF4aXOHqWdyaWRjb2xvcqV3aGl0Za16ZXJvbGluZXdpZHRoykAAAACldGl0bGWBqHN0YW5kb2ZmykFwAACldGlja3OgrXplcm9saW5lY29sb3Kld2hpdGWqYXV0b21hcmdpbsOpbGluZWNvbG9ypXdoaXRlrXNoYXBlZGVmYXVsdHOBpGxpbmWBpWNvbG9ypyMyYTNmNWaqaG92ZXJsYWJlbIGlYWxpZ26kbGVmdKZtYXBib3iBpXN0eWxlpWxpZ2h0pXBvbGFyg6thbmd1bGFyYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWnYmdjb2xvcqcjRTVFQ0Y2qnJhZGlhbGF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlr2F1dG90eXBlbnVtYmVyc6ZzdHJpY3SkZm9udIGlY29sb3KnIzJhM2Y1Zqd0ZXJuYXJ5hKVhYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWnYmdjb2xvcqcjRTVFQ0Y2pWNheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZaViYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWyYW5ub3RhdGlvbmRlZmF1bHRzg6lhcnJvd2hlYWTKAAAAAKphcnJvd3dpZHRoyj+AAACqYXJyb3djb2xvcqcjMmEzZjVmrHBsb3RfYmdjb2xvcqcjRTVFQ0Y2pXRpdGxlgaF4yj1MzM2lc2NlbmWDpXhheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0ZaV6YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWleWF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlqGNvbG9yd2F5mqcjNjM2ZWZhpyNFRjU1M0KnIzAwY2M5NqcjYWI2M2ZhpyNGRkExNUGnIzE5ZDNmM6cjRkY2NjkypyNCNkU4ODCnI0ZGOTdGRqcjRkVDQjUypGRhdGHeABmuc2NhdHRlcnBvbGFyZ2yRgqR0eXBlrnNjYXR0ZXJwb2xhcmdspm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZjYXJwZXSRg6ViYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlpHR5cGWmY2FycGV0pWFheGlzhalncmlkY29sb3Kld2hpdGWsZW5kbGluZWNvbG9ypyMyYTNmNWaubWlub3JncmlkY29sb3Kld2hpdGWuc3RhcnRsaW5lY29sb3KnIzJhM2Y1ZqlsaW5lY29sb3Kld2hpdGWsc2NhdHRlcnBvbGFykYKkdHlwZaxzY2F0dGVycG9sYXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqXBhcmNvb3Jkc5GCpGxpbmWBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZalwYXJjb29yZHOnc2NhdHRlcpGCpHR5cGWnc2NhdHRlcqZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACyaGlzdG9ncmFtMmRjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlsmhpc3RvZ3JhbTJkY29udG91cqpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxp2NvbnRvdXKRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnY29udG91cqpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJjYXJwZXSRgqR0eXBlrXNjYXR0ZXJjYXJwZXSmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApm1lc2gzZJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZaZtZXNoM2Snc3VyZmFjZZGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadzdXJmYWNlqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtc2NhdHRlcm1hcGJveJGCpHR5cGWtc2NhdHRlcm1hcGJveKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACqc2NhdHRlcmdlb5GCpHR5cGWqc2NhdHRlcmdlb6ZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACpaGlzdG9ncmFtkYKkdHlwZaloaXN0b2dyYW2mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAo3BpZZGCpHR5cGWjcGllqmF1dG9tYXJnaW7DqmNob3JvcGxldGiRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWqY2hvcm9wbGV0aKloZWF0bWFwZ2yRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpaGVhdG1hcGdsqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGjYmFykYSkdHlwZaNiYXKnZXJyb3JfeYGlY29sb3KnIzJhM2Y1ZqdlcnJvcl94gaVjb2xvcqcjMmEzZjVmpm1hcmtlcoGkbGluZYKlY29sb3KnI0U1RUNGNqV3aWR0aMo/AAAAp2hlYXRtYXCRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnaGVhdG1hcKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrWNvbnRvdXJjYXJwZXSRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWtY29udG91cmNhcnBldKV0YWJsZZGDpHR5cGWldGFibGWmaGVhZGVygqRsaW5lgaVjb2xvcqV3aGl0ZaRmaWxsgaVjb2xvcqcjQzhENEUzpWNlbGxzgqRsaW5lgaVjb2xvcqV3aGl0ZaRmaWxsgaVjb2xvcqcjRUJGMEY4qXNjYXR0ZXIzZJGDpGxpbmWBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZalzY2F0dGVyM2SmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqGJhcnBvbGFykYKkdHlwZahiYXJwb2xhcqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKlzY2F0dGVyZ2yRgqR0eXBlqXNjYXR0ZXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACraGlzdG9ncmFtMmSRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWraGlzdG9ncmFtMmSqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa5zY2F0dGVydGVybmFyeZGCpHR5cGWuc2NhdHRlcnRlcm5hcnmmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApXNjZW5lhaZjYW1lcmGConVwg6F5yj+AAAChesoAAAAAoXjKAAAAAKNleWWDoXnKAAAAAKF6yj/ZmZqheMoAAAAApXhheGlzhalncmlkY29sb3Kld2hpdGWvYmFja2dyb3VuZGNvbG9ysHJnYigyMjksMjM2LDI0NimldGl0bGWra3ggW23igbvCuV2lcmFuZ2XXF4kX4MWJF+BFrXplcm9saW5lY29sb3Kld2hpdGWleWF4aXOFqWdyaWRjb2xvcqV3aGl0Za9iYWNrZ3JvdW5kY29sb3KwcmdiKDIyOSwyMzYsMjQ2KaV0aXRsZatreSBbbeKBu8K5XaVyYW5nZdcXpxEoxacRKEWtemVyb2xpbmVjb2xvcqV3aGl0ZaV6YXhpc4WpZ3JpZGNvbG9ypXdoaXRlr2JhY2tncm91bmRjb2xvcrByZ2IoMjI5LDIzNiwyNDYppXRpdGxlq2t6IFtt4oG7wrldpXJhbmdl1xenESjFpxEoRa16ZXJvbGluZWNvbG9ypXdoaXRlqmFzcGVjdG1vZGWkY3ViZaZtYXJnaW6EoWzKAAAAAKFiykJIAAChcsoAAAAAoXTKAAAAAKZsZWdlbmSFp3lhbmNob3KmYm90dG9tp3hhbmNob3KkbGVmdKF5yj+AAACrb3JpZW50YXRpb26haKF4ygAAAACmY29uZmlniLZtb2RlQmFyQnV0dG9uc1RvUmVtb3ZllqR6b29to3Bhbq10YWJsZVJvdGF0aW9utXJlc2V0Q2FtZXJhTGFzdFNhdmUzZK1vcmJpdFJvdGF0aW9utHJlc2V0Q2FtZXJhRGVmYXVsdDNkq2Rpc3BsYXlsb2dvwrR0b0ltYWdlQnV0dG9uT3B0aW9uc4GmZm9ybWF0o3N2Z6hzaG93TGlua8KoZWRpdGFibGXCqnJlc3BvbnNpdmXDqnN0YXRpY1Bsb3TCqnNjcm9sbFpvb23DpmZyYW1lc5CkZGF0YZOIpG1vZGWlbGluZXOkbGluZYGlY29sb3KkZ3JheaF5yAKgFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKR0eXBlqXNjYXR0ZXIzZKRuYW1lqlRyYWplY3RvcnmpaG92ZXJpbmZvpHNraXChesgCoBcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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IDUwLjAp2SRoc3YoMjEzLjI3MjcyNzI3MjcyNzI1LCAxMDAuMCwgNTAuMCnZJGhzdigyMTAuNzI3MjcyNzI3MjcyNzIsIDEwMC4wLCA1MC4wKdkjaHN2KDIwOC4xODE4MTgxODE4MTgyLCAxMDAuMCwgNTAuMCnZJGhzdigyMDUuNjM2MzYzNjM2MzYzNjMsIDEwMC4wLCA1MC4wKdkkaHN2KDIwMy4wOTA5MDkwOTA5MDkwNywgMTAwLjAsIDUwLjAp2SRoc3YoMjAwLjU0NTQ1NDU0NTQ1NDUzLCAxMDAuMCwgNTAuMCm3aHN2KDE5OC4wLCAxMDAuMCwgNTAuMCnZPWhzdigxOTUuNDU0NTQ1NDU0NTQ1NDQsIDk5Ljk5OTk5OTk5OTk5OTk5LCA0OS45OTk5OTk5OTk5OTk5OSnZI2hzdigxOTIuOTA5MDkwOTA5MDkwOSwgMTAwLjAsIDUwLjAp2SRoc3YoMTkwLjM2MzYzNjM2MzYzNjM3LCAxMDAuMCwgNTAuMCnZI2hzdigxODcuODE4MTgxODE4MTgxOCwgMTAwLjAsIDUwLjAp2SRoc3YoMTg1LjI3MjcyNzI3MjcyNzI4LCAxMDAuMCwgNTAuMCnZJGhzdigxODIuNzI3MjcyNzI3MjcyNzIsIDEwMC4wLCA1MC4wKdkjaHN2KDE4MC4xODE4MTgxODE4MTgyLCAxMDAuMCwgNTAuMCnZJGhzdigxNzcuNjM2MzYzNjM2MzYzNjMsIDEwMC4wLCA1MC4wKdkjaHN2KDE3NS4wOTA5MDkwOTA5MDkxLCAxMDAuMCwgNTAuMCnZJGhzdigxNzIuNTQ1NDU0NTQ1NDU0NTMsIDEwMC4wLCA1MC4wKbdoc3YoMTcwLjAsIDEwMC4wLCA1MC4wKdk9aHN2KDE2Ny4zNjM2MzYzNjM2MzYzNywgOTkuOTk5OTk5OTk5OTk5OTksIDQ5Ljk5OTk5OTk5OTk5OTk5KdkkaHN2KDE2NC43MjcyNzI3MjcyNzI3MiwgMTAwLjAsIDUwLjAp2SNoc3YoMTYyLjA5MDkwOTA5MDkwOTEsIDEwMC4wLCA1MC4wKdkkaHN2KDE1OS40NTQ1NDU0NTQ1NDU0NCwgMTAwLjAsIDUwLjAp2SNoc3YoMTU2LjgxODE4MTgxODE4MTgsIDEwMC4wLCA1MC4wKdkjaHN2KDE1NC4xODE4MTgxODE4MTgyLCAxMDAuMCwgNTAuMCnZJGhzdigxNTEuNTQ1NDU0NTQ1NDU0NTYsIDEwMC4wLCA1MC4wKdkjaHN2KDE0OC45MDkwOTA5MDkwOTA5LCAxMDAuMCwgNTAuMCnZJGhzdigxNDYuMjcyNzI3MjcyNzI3MjUsIDEwMC4wLCA1MC4wKdkkaHN2KDE0My42MzYzNjM2MzYzNjM2MywgMTAwLjAsIDUwLjApt2hzdigxNDEuMCwgMTAwLjAsIDUwLjAp2SRoc3YoMTM4LjQ1NDU0NTQ1NDU0NTQ3LCAxMDAuMCwgNTAuMCnZI2hzdigxMzUuOTA5MDkwOTA5MDkwOSwgMTAwLjAsIDUwLjAp2SRoc3YoMTMzLjM2MzYzNjM2MzYzNjM1LCAxMDAuMCwgNTAuMCnZI2hzdigxMzAuODE4MTgxODE4MTgxOCwgMTAwLjAsIDUwLjAp2SRoc3YoMTI4LjI3MjcyNzI3MjcyNzI1LCAxMDAuMCwgNTAuMCnZJGhzdigxMjUuNzI3MjcyNzI3MjcyNzIsIDEwMC4wLCA1MC4wKdkkaHN2KDEyMy4xODE4MTgxODE4MTgxOSwgMTAwLjAsIDUwLjAp2SRoc3YoMTIwLjYzNjM2MzYzNjM2MzYzLCAxMDAuMCwgNTAuMCnZI2hzdigxMTguMDkwOTA5MDkwOTA5MSwgMTAwLjAsIDUwLjAp2SRoc3YoMTE1LjU0NTQ1NDU0NTQ1NDU2LCAxMDAuMCwgNTAuMCm3aHN2KDExMy4wLCAxMDAuMCwgNTAuMCnZPWhzdigxMTAuNDU0NTQ1NDU0NTQ1NDUsIDk5Ljk5OTk5OTk5OTk5OTk5LCA0OS45OTk5OTk5OTk5OTk5OSnZI2hzdigxMDcuOTA5MDkwOTA5MDkwOSwgMTAwLjAsIDUwLjAp2SRoc3YoMTA1LjM2MzYzNjM2MzYzNjM2LCAxMDAuMCwgNTAuMCnZJGhzdigxMDIuODE4MTgxODE4MTgxODQsIDEwMC4wLCA1MC4wKdkkaHN2KDEwMC4yNzI3MjcyNzI3MjcyNSwgMTAwLjAsIDUwLjAp2SNoc3YoOTcuNzI3MjcyNzI3MjcyNzMsIDEwMC4wLCA1MC4wKdkjaHN2KDk1LjE4MTgxODE4MTgxODE3LCAxMDAuMCwgNTAuMCnZI2hzdig5Mi42MzYzNjM2MzYzNjM2MywgMTAwLjAsIDUwLjAp2SNoc3YoOTAuMDkwOTA5MDkwOTA5MDcsIDEwMC4wLCA1MC4wKdkjaHN2KDg3LjU0NTQ1NDU0NTQ1NDUzLCAxMDAuMCwgNTAuMCm2aHN2KDg1LjAsIDEwMC4wLCA1MC4wKdkjaHN2KDgyLjM2MzYzNjM2MzYzNjM1LCAxMDAuMCwgNTAuMCnZI2hzdig3OS43MjcyNzI3MjcyNzI3MywgMTAwLjAsIDUwLjAp2SNoc3YoNzcuMDkwOTA5MDkwOTA5MDcsIDEwMC4wLCA1MC4wKdkjaHN2KDc0LjQ1NDU0NTQ1NDU0NTQ1LCAxMDAuMCwgNTAuMCnZI2hzdig3MS44MTgxODE4MTgxODE4MywgMTAwLjAsIDUwLjAp2SNoc3YoNjkuMTgxODE4MTgxODE4MTcsIDEwMC4wLCA1MC4wKdkjaHN2KDY2LjU0NTQ1NDU0NTQ1NDU2LCAxMDAuMCwgNTAuMCnZImhzdig2My45MDkwOTA5MDkwOTA5LCAxMDAuMCwgNTAuMCnZI2hzdig2MS4yNzI3MjcyNzI3MjcyNywgMTAwLjAsIDUwLjAp2SRoc3YoNTguNjM2MzYzNjM2MzYzNjU0LCAxMDAuMCwgNTAuMCm2aHN2KDU2LjAsIDEwMC4wLCA1MC4wKdk8aHN2KDUzLjQ1NDU0NTQ1NDU0NTQ2LCA5OS45OTk5OTk5OTk5OTk5OSwgNDkuOTk5OTk5OTk5OTk5OTkp2SJoc3YoNTAuOTA5MDkwOTA5MDkwOSwgMTAwLjAsIDUwLjAp2SNoc3YoNDguMzYzNjM2MzYzNjM2MzYsIDEwMC4wLCA1MC4wKdkiaHN2KDQ1LjgxODE4MTgxODE4MTgsIDEwMC4wLCA1MC4wKdkkaHN2KDQzLjI3MjcyNzI3MjcyNzI2NiwgMTAwLjAsIDUwLjAp2SRoc3YoNDAuNzI3MjcyNzI3MjcyNzM0LCAxMDAuMCwgNTAuMCnZI2hzdigzOC4xODE4MTgxODE4MTgxNywgMTAwLjAsIDUwLjAp2SNoc3YoMzUuNjM2MzYzNjM2MzYzNjMsIDEwMC4wLCA1MC4wKdkkaHN2KDMzLjA5MDkwOTA5MDkwOTA2NSwgMTAwLjAsIDUwLjAp2SRoc3YoMzAuNTQ1NDU0NTQ1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cAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Zalob3Zlcm1vZGWnY2xvc2VzdK1wYXBlcl9iZ2NvbG9ypXdoaXRlo2dlb4apc2hvd2xha2Vzw6hzaG93bGFuZMOpbGFuZGNvbG9ypyNFNUVDRjanYmdjb2xvcqV3aGl0ZaxzdWJ1bml0Y29sb3Kld2hpdGWpbGFrZWNvbG9ypXdoaXRlqmNvbG9yc2NhbGWDqnNlcXVlbnRpYWyaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGpZGl2ZXJnaW5nm5LKAAAAAKcjOGUwMTUykso9zMzNpyNjNTFiN2SSyj5MzM2nI2RlNzdhZZLKPpmZmqcjZjFiNmRhkso+zMzNpyNmZGUwZWaSyj8AAACnI2Y3ZjdmN5LKPxmZmqcjZTZmNWQwkso/MzMzpyNiOGUxODaSyj9MzM2nIzdmYmM0MZLKP2ZmZqcjNGQ5MjIxkso/gAAApyMyNzY0MTmvc2VxdWVudGlhbG1pbnVzmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxpXlheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Za1zaGFwZWRlZmF1bHRzgaRsaW5lgaVjb2xvcqcjMmEzZjVmqmhvdmVybGFiZWyBpWFsaWdupGxlZnSmbWFwYm94gaVzdHlsZaVsaWdodKVwb2xhcoOrYW5ndWxhcmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqpyYWRpYWxheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0Za9hdXRvdHlwZW51bWJlcnOmc3RyaWN0pGZvbnSBpWNvbG9ypyMyYTNmNWandGVybmFyeYSlYWF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqVjYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWlYmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlsmFubm90YXRpb25kZWZhdWx0c4OpYXJyb3doZWFkygAAAACqYXJyb3d3aWR0aMo/gAAAqmFycm93Y29sb3KnIzJhM2Y1ZqxwbG90X2JnY29sb3KnI0U1RUNGNqV0aXRsZYGheMo9TMzNpXNjZW5lg6V4YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWlemF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXlheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0Zahjb2xvcndheZqnIzYzNmVmYacjRUY1NTNCpyMwMGNjOTanI2FiNjNmYacjRkZBMTVBpyMxOWQzZjOnI0ZGNjY5MqcjQjZFODgwpyNGRjk3RkanI0ZFQ0I1MqRkYXRh3gAZrnNjYXR0ZXJwb2xhcmdskYKkdHlwZa5zY2F0dGVycG9sYXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmY2FycGV0kYOlYmF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaR0eXBlpmNhcnBldKVhYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlrHNjYXR0ZXJwb2xhcpGCpHR5cGWsc2NhdHRlcnBvbGFypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKlwYXJjb29yZHORgqRsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpcGFyY29vcmRzp3NjYXR0ZXKRgqR0eXBlp3NjYXR0ZXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAsmhpc3RvZ3JhbTJkY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZbJoaXN0b2dyYW0yZGNvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMadjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2NvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVyY2FycGV0kYKkdHlwZa1zY2F0dGVyY2FycGV0pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZtZXNoM2SRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWmbWVzaDNkp3N1cmZhY2WRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnc3VyZmFjZapjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJtYXBib3iRgqR0eXBlrXNjYXR0ZXJtYXBib3imbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqnNjYXR0ZXJnZW+RgqR0eXBlqnNjYXR0ZXJnZW+mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqWhpc3RvZ3JhbZGCpHR5cGWpaGlzdG9ncmFtpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKNwaWWRgqR0eXBlo3BpZaphdXRvbWFyZ2luw6pjaG9yb3BsZXRokYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqmNob3JvcGxldGipaGVhdG1hcGdskYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqWhlYXRtYXBnbKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxo2JhcpGEpHR5cGWjYmFyp2Vycm9yX3mBpWNvbG9ypyMyYTNmNWanZXJyb3JfeIGlY29sb3KnIzJhM2Y1ZqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKdoZWF0bWFwkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2hlYXRtYXCqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1jb250b3VyY2FycGV0kYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlrWNvbnRvdXJjYXJwZXSldGFibGWRg6R0eXBlpXRhYmxlpmhlYWRlcoKkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0M4RDRFM6VjZWxsc4KkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0VCRjBGOKlzY2F0dGVyM2SRg6RsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpc2NhdHRlcjNkpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKhiYXJwb2xhcpGCpHR5cGWoYmFycG9sYXKmbWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACpc2NhdHRlcmdskYKkdHlwZalzY2F0dGVyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAq2hpc3RvZ3JhbTJkkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlq2hpc3RvZ3JhbTJkqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGuc2NhdHRlcnRlcm5hcnmRgqR0eXBlrnNjYXR0ZXJ0ZXJuYXJ5pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZoZWlnaHTKRBYAAKV5YXhpc4SpZ3JpZGNvbG9ypXdoaXRlq3NjYWxlYW5jaG9yoXildGl0bGWBpHRleHShea16ZXJvbGluZWNvbG9ypXdoaXRlpGZvbnSBpWNvbG9ypGdyYXmlc2NlbmWFpXhheGlzhqlncmlkY29sb3Kld2hpdGWvYmFja2dyb3VuZGNvbG9ysHJnYigyMjksMjM2LDI0NimldGl0bGWheKVyYW5nZdcXzczMvc3MzD2qdGlja3N1ZmZpeKMgY22temVyb2xpbmVjb2xvcqV3aGl0Zathc3BlY3RyYXRpb4Oheco/gAAAoXrKP4AAAKF4yj+AAACleWF4aXOGqWdyaWRjb2xvcqV3aGl0Za9iYWNrZ3JvdW5kY29sb3KwcmdiKDIyOSwyMzYsMjQ2KaV0aXRsZaF5pXJhbmdl1xfNzMy9zczMPap0aWNrc3VmZml4oyBjba16ZXJvbGluZWNvbG9ypXdoaXRlpXpheGlzhqlncmlkY29sb3Kld2hpdGWvYmFja2dyb3VuZGNvbG9ysHJnYigyMjksMjM2LDI0NimldGl0bGWheqVyYW5nZdcXzczMvc3MzD2qdGlja3N1ZmZpeKMgY22temVyb2xpbmVjb2xvcqV3aGl0Zaphc3BlY3Rtb2Rlpm1hbnVhbKV0aXRsZbRUMiBzdGFyIHBoYW50b206IM6Ud6xwbG90X2JnY29sb3KwcmdiKDIyOSwyMzYsMjQ2KaZtYXJnaW6EoWzKAAAAAKFiykJIAAChcsoAAAAAoXTKQkgAAKZjb25maWeItm1vZGVCYXJCdXR0b25zVG9SZW1vdmWWpHpvb22jcGFurXRhYmxlUm90YXRpb261cmVzZXRDYW1lcmFMYXN0U2F2ZTNkrW9yYml0Um90YXRpb260cmVzZXRDYW1lcmFEZWZhdWx0M2SrZGlzcGxheWxvZ2/CtHRvSW1hZ2VCdXR0b25PcHRpb25zgaZmb3JtYXSjc3ZnqHNob3dM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4827LuPNuy7jzbsu4827LuPNuy7jzbsu4827LuPNuy7jzbsu4827LuPNuy7jzbsu4827LuPNuy7jzbsu4827LuPNuy7jzbsu4827Dje4uw43uLsON7i7Dje4uw43uLsON7i7Dje4uw43uLsON7i7Dje4uw43uLsON7i7Dje4uw43uLsON7i7Dje4uw43uLsON7i7Dje4uw43uLvuiqK77oqiu+6KorvuiqK77oqiu+6KorvuiqK77oqiu+6KorvuiqK77oqiu+6KorvuiqK77oqiu+6KorvuiqK77oqiu+6KorvuiqK77oqiu87ejLvO3oy7zt6Mu87ejLvO3oy7zt6Mu87ejLvO3oy7zt6Mu87ejLvO3oy7zt6Mu87ejLvO3oy7zt6Mu87ejLvO3oy7zt6Mu87ejLvO3oy7XWVuu11lbrtdZW67XWVuu11lbrtdZW67XWVuu11lbrtdZW67XWVuu11lbrtdZW67XWVuu11lbrtdZW67XWVuu11lbrtdZW67XWVuu11lbrseDUO7Hg1Dux4NQ7seDUO7Hg1Dux4NQ7seDUO7Hg1Dux4NQ7seDUO7Hg1Dux4NQ7seDUO7Hg1Dux4NQ7seDUO7Hg1Dux4NQ7seDUO7Hg1Du960F7vetBe73rQXu960F7vetBe73rQXu960F7vetBe73rQXu960F7vetBe73rQXu960F7vetBe73rQXu960F7vetBe73rQXu960F7vetBe7PrnYuj652Lo+udi6PrnYuj652Lo+udi6PrnYuj652Lo+udi6PrnYuj652Lo+udi6PrnYuj652Lo+udi6PrnYuj652Lo+udi6PrnYuj652Lq/CIK6vwiCur8Igrq/CIK6vwiCur8Igrq/CIK6vwiCur8Igrq/CIK6vwiCur8Igrq/CIK6vwiCur8Igrq/CIK6vwiCur8Igrq/CIK6vwiCuv5grbn+YK25/mCtuf5grbn+YK25/mCtuf5grbn+YK25/mCtuf5grbn+YK25/mCtuf5grbn+YK25/mCtuf5grbn+YK25/mCtuf5grbn+YK25/mCtOf5grTn+YK05/mCtOf5grTn+YK05/mCtOf5grTn+YK05/mCtOf5grTn+YK05/mCtOf5grTn+YK05/mCtOf5grTn+YK05/mCtOf5grTm/CII6vwiCOr8Igjq/CII6vwiCOr8Igjq/CII6vwiCOr8Igjq/CII6vwiCOr8Igjq/CII6vwiCOr8Igjq/CII6vwiCOr8Igjq/CII6vwiCOj652Do+udg6PrnYOj652Do+udg6PrnYOj652Do+udg6PrnYOj652Do+udg6PrnYOj652Do+udg6PrnYOj652Do+udg6PrnYOj652Do+udg63rQXO960FzvetBc73rQXO960FzvetBc73rQXO960FzvetBc73rQXO960FzvetBc73rQXO960FzvetBc73rQXO960FzvetBc73rQXO960FzseDUM7Hg1DOx4NQzseDUM7Hg1DOx4NQzseDUM7Hg1DOx4NQzseDUM7Hg1DOx4NQzseDUM7Hg1DOx4NQzseDUM7Hg1DOx4NQzseDUM7Hg1DO11lbjtdZW47XWVuO11lbjtdZW47XWVuO11lbjtdZW47XWVuO11lbjtdZW47XWVuO11lbjtdZW47XWVuO11lbjtdZW47XWVuO11lbjtdZW47zt6MO87ejDvO3ow7zt6MO87ejDvO3ow7zt6MO87ejDvO3ow7zt6MO87ejDvO3ow7zt6MO87ejDvO3ow7zt6MO87ejDvO3ow7zt6MO87ejDvuiqI77oqiO+6KojvuiqI77oqiO+6KojvuiqI77oqiO+6KojvuiqI77oqiO+6KojvuiqI77oqiO+6KojvuiqI77oqiO+6KojvuiqI77oqiOw43uDsON7g7Dje4Ow43uDsON7g7Dje4Ow43uDsON7g7Dje4Ow43uDsON7g7Dje4Ow43uDsON7g7Dje4Ow43uDsON7g7Dje4Ow43uDsON7g7LuPNOy7jzTsu4807LuPNOy7jzTsu4807LuPNOy7jzTsu4807LuPNOy7jzTsu4807LuPNOy7jzTsu4807LuPNOy7jzTsu4807LuPNOy7jzTukdHlwZalzY2F0dGVyM2SkdGV4dMgGQBcAACDBAAAgwQAAIMEAACDBAAAgwQAAIMEAACDBAAAgwQAAIMEAACDBAAAgwQAAIMEAACDBAAAgwQAAIMEAACDBAAAgwQAAIMEAACDBAAAgwY0oD8GNKA/BjSgPwY0oD8GNKA/BjSgPwY0oD8GNKA/BjSgPwY0oD8GNKA/BjSgPwY0oD8GNKA/BjSgPwY0oD8GNKA/BjSgPwY0oD8GNKA/BYqH8wGKh/MBiofzAYqH8wGKh/MBi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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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zL37Pbe9KK+hvVYgjL0II229ZAVCvb/nFr02lNe87ViBvJJ2rLuSdqw77ViBPDaU1zy/5xY9ZAVCPQgjbT1WIIw9KK+hPfs9tz3NzMw9zczMvfs9t70or6G9ViCMvQgjbb1kBUK9v+cWvTaU17ztWIG8knasu5J2rDvtWIE8NpTXPL/nFj1kBUI9CCNtPVYgjD0or6E9+z23Pc3MzD3NzMy9+z23vSivob1WIIy9CCNtvWQFQr2/5xa9NpTXvO1YgbySdqy7knasO+1YgTw2lNc8v+cWPWQFQj0II209ViCMPSivoT37Pbc9zczMPdk1N2JjYzA1YjAtODFkYS0xMWVmLTIwNDAtMzU4NWM5YjQ5NTRmLzQ1NmRlMTNhYjNiNmU5MDKEpmxheW91dIuleGF4aXOIq3Jhbmdlc2xpZGVygad2aXNpYmxlwqlncmlkY29sb3Kld2hpdGWtcmFuZ2VzZWxlY3RvcoGnYnV0dG9uc5KEpHN0ZXDKQSAAAKhzdGVwbW9kZahiYWNrd2FyZKVsYWJlbKIxbaVjb3VudMo/gAAAgaRzdGVwo2FsbKV0aXRsZYGkdGV4dKClcmFuZ2WQpmRvbWFpbpCtemVyb2xpbmVjb2xvcqV3aGl0Zap0aWNrc3VmZml4oyBtc6dtb2RlYmFyiKVjb2xvcqRncmF5q2FjdGl2ZWNvbG9ysHJnYigyMjksMjM2LDI0NimneWFuY2hvcqZib3R0b22neGFuY2hvcqVyaWdodKF5yj+AAACnYmdjb2xvcq1yZ2JhKDAsMCwwLDApq29yaWVudGF0aW9uoWiheMoAAAAAqWhvdmVybW9kZadjbG9zZXN0rXBhcGVyX2JnY29sb3KtcmdiYSgwLDAsMCwwKah0ZW1wbGF0ZYKmbGF5b3V03gATqWNvbG9yYXhpc4GoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKV4YXhpc4epZ3JpZGNvbG9ypXdoaXRlrXplcm9saW5ld2lkdGjKQAAAAKV0aXRsZYGoc3RhbmRvZmbKQXAAAKV0aWNrc6CtemVyb2xpbmVjb2xvcqV3aGl0ZaphdXRvbWFyZ2luw6lsaW5lY29sb3Kld2hpdGWpaG92ZXJtb2Rlp2Nsb3Nlc3StcGFwZXJfYmdjb2xvcqV3aGl0ZaNnZW+GqXNob3dsYWtlc8Ooc2hvd2xhbmTDqWxhbmRjb2xvcqcjRTVFQ0Y2p2JnY29sb3Kld2hpdGWsc3VidW5pdGNvbG9ypXdoaXRlqWxha2Vjb2xvcqV3aGl0Zapjb2xvcnNjYWxlg6pzZXF1ZW50aWFsmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxqWRpdmVyZ2luZ5uSygAAAACnIzhlMDE1MpLKPczMzacjYzUxYjdkkso+TMzNpyNkZTc3YWWSyj6ZmZqnI2YxYjZkYZLKPszMzacjZmRlMGVmkso/AAAApyNmN2Y3ZjeSyj8ZmZqnI2U2ZjVkMJLKPzMzM6cjYjhlMTg2kso/TMzNpyM3ZmJjNDGSyj9mZmanIzRkOTIyMZLKP4AAAKcjMjc2NDE5r3NlcXVlbnRpYWxtaW51c5qSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMaV5YXhpc4epZ3JpZGNvbG9ypXdoaXRlrXplcm9saW5ld2lkdGjKQAAAAKV0aXRsZYGoc3RhbmRvZmbKQXAAAKV0aWNrc6CtemVyb2xpbmVjb2xvcqV3aGl0ZaphdXRvbWFyZ2luw6lsaW5lY29sb3Kld2hpdGWtc2hhcGVkZWZhdWx0c4GkbGluZYGlY29sb3KnIzJhM2Y1Zqpob3ZlcmxhYmVsgaVhbGlnbqRsZWZ0pm1hcGJveIGlc3R5bGWlbGlnaHSlcG9sYXKDq2FuZ3VsYXJheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZadiZ2NvbG9ypyNFNUVDRjaqcmFkaWFsYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWvYXV0b3R5cGVudW1iZXJzpnN0cmljdKRmb250gaVjb2xvcqcjMmEzZjVmp3Rlcm5hcnmEpWFheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZadiZ2NvbG9ypyNFNUVDRjalY2F4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlpWJheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZbJhbm5vdGF0aW9uZGVmYXVsdHODqWFycm93aGVhZMoAAAAAqmFycm93d2lkdGjKP4AAAKphcnJvd2NvbG9ypyMyYTNmNWascGxvdF9iZ2NvbG9ypyNFNUVDRjaldGl0bGWBoXjKPUzMzaVzY2VuZYOleGF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXpheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0ZaV5YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWoY29sb3J3YXmapyM2MzZlZmGnI0VGNTUzQqcjMDBjYzk2pyNhYjYzZmGnI0ZGQTE1QacjMTlkM2YzpyNGRjY2OTKnI0I2RTg4MKcjRkY5N0ZGpyNGRUNCNTKkZGF0Yd4AGa5zY2F0dGVycG9sYXJnbJGCpHR5cGWuc2NhdHRlcnBvbGFyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApmNhcnBldJGDpWJheGlzhalncmlkY29sb3Kld2hpdGWsZW5kbGluZWNvbG9ypyMyYTNmNWaubWlub3JncmlkY29sb3Kld2hpdGWuc3RhcnRsaW5lY29sb3KnIzJhM2Y1ZqlsaW5lY29sb3Kld2hpdGWkdHlwZaZjYXJwZXSlYWF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaxzY2F0dGVycG9sYXKRgqR0eXBlrHNjYXR0ZXJwb2xhcqZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACpcGFyY29vcmRzkYKkbGluZYGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqXBhcmNvb3Jkc6dzY2F0dGVykYKkdHlwZadzY2F0dGVypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAALJoaXN0b2dyYW0yZGNvbnRvdXKRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWyaGlzdG9ncmFtMmRjb250b3VyqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGnY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadjb250b3VyqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtc2NhdHRlcmNhcnBldJGCpHR5cGWtc2NhdHRlcmNhcnBldKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmbWVzaDNkkYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlpm1lc2gzZKdzdXJmYWNlkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp3N1cmZhY2WqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVybWFwYm94kYKkdHlwZa1zY2F0dGVybWFwYm94pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKpzY2F0dGVyZ2VvkYKkdHlwZapzY2F0dGVyZ2Vvpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKloaXN0b2dyYW2RgqR0eXBlqWhpc3RvZ3JhbaZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACjcGllkYKkdHlwZaNwaWWqYXV0b21hcmdpbsOqY2hvcm9wbGV0aJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZapjaG9yb3BsZXRoqWhlYXRtYXBnbJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZaloZWF0bWFwZ2yqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMaNiYXKRhKR0eXBlo2JhcqdlcnJvcl95gaVjb2xvcqcjMmEzZjVmp2Vycm9yX3iBpWNvbG9ypyMyYTNmNWambWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACnaGVhdG1hcJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadoZWF0bWFwqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtY29udG91cmNhcnBldJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZa1jb250b3VyY2FycGV0pXRhYmxlkYOkdHlwZaV0YWJsZaZoZWFkZXKCpGxpbmWBpWNvbG9ypXdoaXRlpGZpbGyBpWNvbG9ypyNDOEQ0RTOlY2VsbHOCpGxpbmWBpWNvbG9ypXdoaXRlpGZpbGyBpWNvbG9ypyNFQkYwRjipc2NhdHRlcjNkkYOkbGluZYGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqXNjYXR0ZXIzZKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACoYmFycG9sYXKRgqR0eXBlqGJhcnBvbGFypm1hcmtlcoGkbGluZYKlY29sb3KnI0U1RUNGNqV3aWR0aMo/AAAAqXNjYXR0ZXJnbJGCpHR5cGWpc2NhdHRlcmdspm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKtoaXN0b2dyYW0yZJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZatoaXN0b2dyYW0yZKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrnNjYXR0ZXJ0ZXJuYXJ5kYKkdHlwZa5zY2F0dGVydGVybmFyeaZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmbGVnZW5khad5YW5jaG9ypmJvdHRvbad4YW5jaG9ypGxlZnSheco/gAAAq29yaWVudGF0aW9uoWiheMoAAAAApXlheGlzg6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmVjb2xvcqV3aGl0ZapmaXhlZHJhbmdlwqRmb250gaVjb2xvcqRncmF5pXRpdGxloKxwbG90X2JnY29sb3KwcmdiKDIyOSwyMzYsMjQ2KaZtYXJnaW6EoWzKAAAAAKFiygAAAAChcsoAAAAAoXTKAAAAAKZjb25maWeItm1vZGVCYXJCdXR0b25zVG9SZW1vdmWapHpvb22oc2VsZWN0MmSnbGFzc28yZKlhdXRvU2NhbGWscmVzZXRTY2FsZTJko3Bhbq10YWJsZVJvdGF0aW9us3Jlc2V0Q2FtZXJhTGFzdFNhdmWmem9vbUlup3pvb21PdXSrZGlzcGxheWxvZ2/CtHRvSW1hZ2VCdXR0b25PcHRpb25zgaZmb3JtYXSjc3ZnqHNob3dMaW5rwqhlZGl0YWJsZcKqcmVzcG9uc2l2ZcOqc3RhdGljUGxvdMKqc2Nyb2xsWm9vbcOmZnJhbWVzkKRkYXRhl4qqc2hvd2xlZ2VuZMOmbWFya2VygaVjb2xvcqcjNjM2RUZBpXhheGlzoXiheccwFwAAgH8AAAAAymsoQcprKEEAAAAAAACAfwAAgH8AAAAAymsoQcprKEEAAAAAAACAf6R0eXBlp3NjYXR0ZXKkbmFtZaJHeKV5YXhpc6F5q2xlZ2VuZGdyb3Vwokd4rWhvdmVydGVtcGxhdGW8KCV7eDouNGZ9IG1zLCAle3k6LjJmfSBtVC9tKaF4xzAXAACAf3JQFj9yUBY/B2UpQQdlKUEAAIB/AACAfw7KMkEOyjJBB2X5QQdl+UEAAIB/iqpzaG93bGVnZW5kw6ZtYXJrZXKBpWNvbG9ypyNFRjU1M0KleGF4aXOheKF52BcAAIB/AACAfwAAgH8AAIB/pHR5cGWnc2NhdHRlcqRuYW1lokd5pXlheGlzoXmrbGVnZW5kZ3JvdXCiR3mtaG92ZXJ0ZW1wbGF0ZbwoJXt4Oi40Zn0gbXMsICV7eTouMmZ9IG1UL20poXjYFwAAgH8AAIB/AACAfwAAgH+KqnNob3ds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eSBwcmVjb21waWxlZC6nUGx1dG9VSdoE4QobWzBtG1sxbUluc3RhbnRpYXRpbmcuLi4bWzIybQobWzkwbT09PRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQWJzdHJhY3RQbHV0b0RpbmdldGplcyDilIAgdjEuMy4xCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQmFzZURpcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjIuMyAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBJT0NhcHR1cmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjIuNAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEZpeGVkUG9pbnROdW1iZXJzIOKUgOKUgOKUgOKUgOKUgOKUgCB2MC44LjQKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBQbHV0b1VJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC43LjU4ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ29sb3JzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xMi4xMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENvbG9yU2NoZW1lcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjMuMjQuMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKG1swbRtbMW1SZXNvbHZpbmcuLi4bWzIybQobWzkwbT09PRtbMzltChtbMzJtG1sxbSAgTm8gQ2hhbmdlcxtbMjJtG1szOW0gdG8gYC90bXAvamxfYWx6dndaL1Byb2plY3QudG9tbGAK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MC4yLjQKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBGaXhlZFBvaW50TnVtYmVycyDilIDilIDilIDilIDilIDilIAgdjAuOC40ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gUGx1dG9VSSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNy41OAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENvbG9ycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMTIuMTAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBDb2xvclNjaGVtZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYzLjI0LjAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgChtbMG0bWzFtUmVzb2x2aW5nLi4uG1syMm0KG1s5MG09PT0bWzM5bQobWzMybRtbMW0gIE5vIENoYW5nZXMbWzIybRtbMzltIHRvIGAvdG1wL2psX2FsenZ3Wi9Qcm9qZWN0LnRvbWxgChtbMzJtG1sxbSAgICBVcGRhdGluZxtbMjJtG1szOW0gYC90bXAvamxfYWx6dndaL01hbmlmZXN0LnRvbWxgCiAgG1s5MG1bOGU4NTBiOTBdIBtbMzltG1s5M23ihpEgbGliYmxhc3RyYW1wb2xpbmVfamxsIHY1LjguMCsxIOKHkiB2NS4xMS4wKzAbWzM5bQoKG1swbRtbMW1QcmVjb21waWxpbmcuLi4bWzIybQobWzkwbT09PRtbMzltChtbMzJtG1sxbSAgQWN0aXZhdGluZxtbMjJtG1szOW0gcHJvamVjdCBhdCBgL3RtcC9qbF9hbHp2d1pgChtbMzJtG1sxbVByZWNvbXBpbGluZxtbMjJtG1szOW0gcHJvamVjdC4uLgogIDI0IGRlcGVuZGVuY2llcyBzdWNjZXNzZnVsbHkgcHJlY29tcGlsZWQgaW4gNjcgc2Vjb25kcy4gMTU4IGFscmVhZHkgcHJlY29tcGlsZWQup2VuYWJsZWTDt3Jlc3RhcnRfcmVjb21tZW5kZWRfbXNnwLRyZXN0YXJ0X3JlcXVpcmVkX21zZ8CtYnVzeV9wYWNrYWdlc5C2d2FpdGluZ19mb3JfcGVybWlzc2lvbsLZLHdhaXRpbmdfZm9yX3Blcm1pc3Npb25fYnV0X3Byb2JhYmx5X2Rpc2FibGVkwqtjZWxsX2lucHV0c94ALtkkNThiZTQxNTAtMmI3YS00ZjllLWE3ZDctNDBhMDg2ZmQzYTUzhKdjZWxsX2lk2SQ1OGJlNDE1MC0yYjdhLTRmOWUtYTdkNy00MGEwODZmZDNhNTOkY29kZdmwaWYgYWN0aXZpdHlfZmluaXNoZWQKICAgIGh0bWwiIiIKICAgIDxzY3JpcHQ+CiAgICBjb25zdCB7ZGVmYXVsdDogY29uZmV0dGl9ID0gYXdhaXQgaW1wb3J0KCJodHRwczovL2Nkbi5za3lwYWNrLmRldi9jYW52YXMtY29uZmV0dGlAMSIpCiAgICBjb25mZXR0aSgpCiAgICA8L3NjcmlwdD4KICAgICIiIgplbmSobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMPZJGYxMWEyZmEyLWVmZjktNDk3OS1iNzM5LTNkYTJiMjRhOWE0NYSnY2VsbF9pZNkkZjExYTJmYTItZWZmOS00OTc5LWI3MzktM2RhMmIyNGE5YTQ1pGNvZGXaARttZCIiIgpHZW5lcmF0ZSBhIHZpcnR1YWwgb2JqZWN0OgogLSAoMS40KSBBIFBoYW50b20gd2l0aCAyMCBzcGlucywgd2l0aCBwcm9wZXJ0aWVzOgogICAtIGBvYmoueGAgID0gWy0xLCAxXSBtbSAoMjAgc3BpbnMgYWxvbmcgdGhlICR4JC1heGlzKQogICAtIGBvYmouz4FgICAuPSAxCiAgIC0gYG9iai5UMWAgLj0gNTAwIG1zCiAgIC0gYG9iai5UMmAgLj0gNTAgbXMKIC0gKDEuNSkgUGxvdCB0aGUgZ2VuZXJhdGVkIGBQaGFudG9tYCAoY2hlY2sgYHBsb3RfcGhhbnRvbV9tYXBgJ3MgZG9jcykKIiIiqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTD2SQ5NzEwNGM0Ni1lODFmLTQ0NGEtOTU3Zi0wYmJiMWIwMmYxYjiEp2NlbGxfaWTZJDk3MTA0YzQ2LWU4MWYtNDQ0YS05NTdmLTBiYmIxYjAyZjFiOKRjb2Rl2gZTbWQiIiIKIyAzLiAkVF97Mn1eeyp9JC1kZWNheQoKVGhlICQkVF97Mn1eeyp9JCQtZGVjYXkgaXMgdGhlIHNpZ25hbCBkZWNheSBwcm9kdWNlZCBieSBtaWNyb3Njb3BpYyBkaXN0cmlidXRpb24gb2Ygb2ZmLXJlc29uYW5jZS4KCiQoUmVzb3VyY2UoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9MSUJSRWh1Yi9NUkktcHJvY2Vzc2luZy0yMDIzL21haW4vMDItc2ltdWxhdGlvbi9GaWd1cmVzL1Qyc3Rhci5wbmciLCA6d2lkdGg9PiI0MDBweCIpKQoKVGhlIGV4YWN0IGRpc3RyaWJ1dGlvbiBvZiBvZmYtcmVzb25hbmNlIGlzCgokJHBfe1xEZWx0YSB3fSh3KSA9IFxmcmFje1RfMl57J319e1xwaSgxK1RfMl57JzJ9IHdeMil9LFxxdWFkXHRleHR7d2l0aCB9XGZyYWN7MX17VF8yXnsqfX0gPSBcZnJhY3sxfXtUXzJ9ICsgXGZyYWN7MX17VF8yXnsnfX0uJCQKCkluIHRoaXMgZXhjZXJjaXNlIHdlIHdpbGwgc2ltcGxpZnkgdGhpcyBkaXN0cmlidXRpb24sIGJ1dCB3ZSB3aWxsIG9idGFpbiBhIHNpbWlsYXIgZWZmZWN0LgoKLSAoMy4xKSBDcmVhdGUgYSBuZXcgcGhhbnRvbSBuYW1lZCBgb2JqX3Qyc3RhcmAgd2l0aCBzcGlucyBhdCB0aGUgc2FtZSBwb3NpdGlvbnMgYXMgdGhlIG9yaWdpbmFsIHBoYW50b20gYG9iamAsIGVhY2ggaGF2aW5nIGEgbGluZWFyIGRpc3RyaWJ1dGlvbiBvZiBvZmYtcmVzb25hbmNlLiBUbyBhY2hpZXZlIHRoaXMsIGZvbGxvdyB0aGVzZSBzdGVwczoKICAgKiAoMy4xLjEpIENyZWF0ZSBhbiBlbXB0eSBwaGFudG9tIGNhbGxlZCBgb2JqX3Qyc3RhcmAuCiAgICogKDMuMS4yKSBDcmVhdGUgYSBsaW5lYXIgb2ZmLXJlc29uYW5jZSBkaXN0cmlidXRpb24gc3VjaCB0aGF0IHRoZSByYW5nZSAkJDJccGkgWy0xMCwgMTBdXCxcbWF0aHJte3JhZC9zfSQkIGlzIGNvdmVyZWQgdW5pZm9ybWx5IHdpdGggJCROX3tcbWF0aHJte2lzb2Nocm9tYXRzfX0gPSAyMCQkICh1c2UgdGhlIGZ1bmN0aW9uIGByYW5nZShzdGFydCwgc3RvcCwgbGVuZ3RoKWApLgogICAqICgzLjEuMykgSXRlcmF0ZSBvdmVyIHRoZSBlbGVtZW50cyBgb2ZmYCBvZiB0aGUgbGluZWFyIGRpc3RyaWJ1dGlvbiAoYGZvcmAgbG9vcCkgYW5kIGNyZWF0ZSBjb3BpZXMgb2YgdGhlIG9yaWdpbmFsIHBoYW50b20gKGBvYmpfYXV4ID0gY29weShvYmopYCkgYW5kIHNldCB0aGUgb2ZmLXJlc29uYW5jZSBvZiB0aGF0IGNvcHkgdG8gYG9mZmAgd2l0aCBgb2JqX2F1eC7OlHcgLj0gb2ZmYC4KICAgKiAoMy4xLjQpIFVwZGF0ZSBgb2JqX3Qyc3RhcmAgYnkgYXBwZW5kaW5nIHRoZSBtb2RpZmllZCBjb3BpZXMgYG9ial9hdXhgIChgb2JqX3Qyc3RhciArPSBvYmpfYXV4YCkuCiAgICogKDMuMS41KSBGaW5hbGx5LCBvdXRzaWRlIHRoZSBsb29wLCBkaXZpZGUgdGhlIHByb3RvbiBkZW5zaXR5IGBvYmpfdDJzdGFyLs+BYCBieSAkJE5fe1xtYXRocm17aXNvY2hyb21hdHN9fSA9IDIwJCQgYW5kIHJlbmFtZSB0aGUgcGhhbnRvbSBgb2JqX3Qyc3Rhci5uYW1lID0gIlQyIHN0YXIgcGhhbnRvbSJgLgoKIC0gKDMuMikgUGxvdCBgb2JqX3Qyc3RhcmAgd2l0aCBgcGxvdF9waGFudG9tX21hcChvYmpfdDJzdGFyLCA6zpR3KWAgYW5kIHZlcmlmeSBpdCBpcyBjb3JyZWN0CgoiIiKobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMPZJGU0YzgwYzI0LTIwZmQtNDJlNS05ZGNkLWE2NTk1ODU2OWMwMYSnY2VsbF9pZNkkZTRjODBjMjQtMjBmZC00MmU1LTlkY2QtYTY1OTU4NTY5YzAxpGNvZGXaBGhtZCIiIgojIDIuIEdyYWRpZW50IEVjaG8KCiQoUmVzb3VyY2UoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9MSUJSRWh1Yi9NUkktcHJvY2Vzc2luZy0yMDIzL21haW4vMDItc2ltdWxhdGlvbi9GaWd1cmVzL0dSRS5naWYiLCA6d2lkdGg9PiI0MDBweCIpKQoKVGhlIGdyYWRpZW50IGVjaG8gaXMgb25lIG9mIHRoZSBmaXJzdCBzdGVwcyB0byBjcmVhdGUgYW4gaW1hZ2UuIFRoZSBiaWcgCmJyZWFrdGhyb3VnaCB3YXMgdGhlIGFkZGl0aW9uIG9mIGxpbmVhcmx5IGluY3JlYXNpbmcgbWFnbmV0aWMgZmllbGRzLCBvciBncmFkaWVudHMsIHRvIGVuY29kZSB0aGUgc3BpbidzIHBvc2l0aW9ucyBpbiB0aGVpciBmcmVxdWVuY3kgKE1tbWgsIHNvbWVvbmUgc2FpZCBGb3VyaWVyPykuIFRoaXMgd29ya3MgZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlIGZyZXF1ZW5jeSAkJGYkJCBvZiBhIHNwaW4gaXMgCgokJGYoeCkgPSBcZnJhY3tcZ2FtbWF9ezJccGl9IEJfeih4KSA9IFxmcmFje1xnYW1tYX17MlxwaX0gR194IHguJCQKCkxldCdzIGNyZWF0ZSBhIGRpZmZlcmVudCBzZXF1ZW5jZS4KIC0gQ3JlYXRlIGEgOTAtZGVnIGhhcmQgUkYgcHVsc2UgYW5kIHB1dCBpdCBpbiBhIHZhcmlhYmxlIGBzZXFfZ3JlYAogLSAoMi4xKSBDcmVhdGUgYSBncmFkaWVudCB3aXRoIGFyZWEgYC1BeGAgdXNpbmcgYGd4X3ByZSA9IEdyYWQoQSxULHJpc2UsZmFsbClgIGFwcGVuZCB0byBgc2VxX2dyZWAuIEFzIGFuIG9wdGlvbmFsIGNoYWxsZW5nZSwgcHV0IGBneF9wcmUucmlzZWAgYW5kIGBneF9wcmUuZmFsbGAgc28gdGhlIHNhdGlzZnkgdGhlIGBzeXNgIHJlcXVpZXJlbWVudHMKIC0gKDIuMikgQXBwZW5kIGEgYFNlcXVlbmNlYCBibG9jayBjYWxsZWQgYHJlYWRvdXRgIHRoYXQgaW5jbHVkZXM6IAogICAtIEEgZ3JhZGllbnQgb2YgdHdpY2UgdGhlIGFyZWEsIG9yIGAyQXhgLiBDYWxsIGl0IGBneGAKICAgLSBBbiBgQURDYCB3aXRoIGBhZGMyLmRlbGF5ID0gZ3gucmlzZWAgYW5kIGBhZGMyLlQgPSBneC5UYAogLSAoMi4zKSBQbG90IGBzZXFfZ3JlYCBhbmQgaXRzIGstc3BhY2UKIC0gKDIuNCkgUGxvdCB0aGUgJCRrJCQtc3BhY2Ugd2l0aCB0aGUgYHBsb3Rfa3NwYWNlYCBmdW5jdGlvbgoiIiKobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMPZJDE4YzgyZmYxLTBiZGUtNGZhMC04NDhjLWQwZWI3M2QxYWM3Y4SnY2VsbF9pZNkkMThjODJmZjEtMGJkZS00ZmEwLTg0OGMtZDBlYjczZDFhYzdjpGNvZGXaATsjICgzLjUpIENvbXBhcmUgdGhlIHBsb3QgaW4gKDMuNCkgd2l0aCAoMi42KQpiZWdpbgoJc2lnbmFsX2xheW91dCA9IExheW91dCh5YXhpcz1hdHRyKHJhbmdlPVstNSwgMTYuNV0pKQoJcmVsYXlvdXQhKHNpZ25hbF9ncmUsIHNpZ25hbF9sYXlvdXQ7IHRpdGxlPSJHUkUtVDIiKQoJcmVsYXlvdXQhKHNpZ25hbF90Ml9zdGFyX2dyZSwgc2lnbmFsX2xheW91dDsgdGl0bGU9IkdSRS1UMioiKQoJZmlnX3NpZ25hbF8yID0gW3NpZ25hbF9ncmUgc2lnbmFsX3QyX3N0YXJfZ3JlXQoJcmVsYXlvdXQoZmlnX3NpZ25hbF8yLCBzaG93bGVnZW5kPWZhbHNlKQplbmSobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMLZJDFjNzliMzdlLWQ0ZTAtNDkwZi05NDY2LTIwY2UyOGYwMTdhZYSnY2VsbF9pZNkkMWM3OWIzN2UtZDRlMC00OTBmLTk0NjYtMjBjZTI4ZjAxN2FlpGNvZGXaAZ4jICg0LjgpIENvbXBhcmUgdGhlIHNpZ25hbCBvYnRhaW5lZCBpbiAoNC43KSB3aXRoIHRoZSBvbmUgYXQgKDMuNCkKYmVnaW4KCXRfYWRjX3NlID0gS29tYU1SSUNvcmUuZ2V0X2FkY19zYW1wbGluZ190aW1lcyhzZXFfc2UpKjFlMwoJc2lnbmFsX3QyX3N0YXJfc2UgPSBwbG90X3NpZ25hbChyYXdfdDJfc3Rhcl9zZTsgc2xpZGVyPWZhbHNlKQoJYWRkdHJhY2VzIShzaWduYWxfdDJfc3Rhcl9zZSwgdDJfZGVjYXkodF9hZGNfc2UpKQoJcmVsYXlvdXQhKHNpZ25hbF90Ml9zdGFyX3NlLCBzaWduYWxfbGF5b3V0OyB0aXRsZT0iU0UiKQoJZmlnX3NpZ25hbF8zID0gW3NpZ25hbF9ncmUgc2lnbmFsX3QyX3N0YXJfZ3JlIHNpZ25hbF90Ml9zdGFyX3NlXQoJcmVsYXlvdXQoZmlnX3NpZ25hbF8zLCBzaG93bGVnZW5kPWZhbHNlKQplbmSobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMLZJGFiOGRjMWNlLWQxZWYtNDNhMC05NDk1LWRhYzkzMWI1MmFlY4SnY2VsbF9pZNkkYWI4ZGMxY2UtZDFlZi00M2EwLTk0OTUtZGFjOTMxYjUyYWVjpGNvZGXZRSMgU2V0IHRoaXMgYm9vbGVhbiB0byBgdHJ1ZWAgd2hlbiB5b3UgZmluaXNoCmFjdGl2aXR5X2ZpbmlzaGVkID0gdHJ1ZahtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkOGI0YTFhZDktMmQ2YS00YzhmLWJiOGUtZjQzYzJkMDU4MTk1hKdjZWxsX2lk2SQ4YjRhMWFkOS0yZDZhLTRjOGYtYmI4ZS1mNDNjMmQwNTgxOTWkY29kZdlGIyAoMi4zKSBQbG90IGBzZXFfZ3JlYCBhbmQgdGhlIGstc3BhY2UKcGxvdF9zZXEoc2VxX2dyZTsgc2xpZGVyPWZhbHNlKahtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkMzVmZjM0MDItZGMzNi00YjkxLWJlYzktYjRkMjFmYWYzZTY4hKdjZWxsX2lk2SQzNWZmMzQwMi1kYzM2LTRiOTEtYmVjOS1iNGQyMWZhZjNlNjikY29kZdk9IyAoMS41KSBQbG90IHRoZSBnZW5lcmF0ZWQgUGhhbnRvbQpwbG90X3BoYW50b21fbWFwKG9iaiwgOlQxKahtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkNGE0YTZiZDMtYjgyMC00NzljLTg5ZTMtZjNjZTc5YTMxNmRihKdjZWxsX2lk2SQ0YTRhNmJkMy1iODIwLTQ3OWMtODllMy1mM2NlNzlhMzE2ZGKkY29kZdlnIyAoMy42KSBSZWNvbnN0cnVjdCB0aGUgMUQgaW1hZ2UKcmVjb25fdDJfc3Rhcl9ncmUgPSBwbG90KGFicy4oZmZ0YyhyYXdfdDJfc3Rhcl9ncmUucHJvZmlsZXNbMV0uZGF0YSkpKahtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkMjdlNjU2ODAtMjJhMC00MDc5LWI2ZGYtZDYwYTMyMThlNTJlhKdjZWxsX2lk2SQyN2U2NTY4MC0yMmEwLTQwNzktYjZkZi1kNjBhMzIxOGU1MmWkY29kZdoByCMgKDQuNSkgQ3JlYXRlIGNvbmNhdGVuYXRpbmcgdGhlc2UgYmxvY2tzIGludG8gYSBzZXF1ZW5jZSBjYWxsZWQgYHNlcV9zZWAKYmVnaW4KCSMgKDQuMSkgQSA5MGRlZyBoYXJkIFJGIHB1bHNlCglzZXFfc2UgPSBTZXF1ZW5jZSgpCglzZXFfc2UgKz0gcmYKICAgICMgKDQuMikgQSBgRGVsYXlgIG9mIFRFLzIgd2l0aCBhIHBvc2l0aXZlIGdyYWRpZW50IChhcmVhIGBBeGApCglzZXFfc2UgKz0gLTEqZ3hfcHJlCgkjICg0LjMpIEEgMTgwZGVnIGhhcmQgUkYgcHVsc2UKCXNlcV9zZSArPSAoMC4wKzIuMGltKSpyZgoJIyAoNC40KSBBIHJlYWRvdXQgZ3JhZGllbnQgb2YgYXJlYSBgMkF4YCB3aXRoIGFuIEFEQyAoc2ltaWxhciB0byAoMi4yKSksIHN1Y2ggdGhhdCB0aGUgbWlkZGxlIG9mIHRoZSBncmFkaWVudCBhbmQgQURDIGFyZSBpbiAkJFxtYXRocm17VEV9JCQKCXNlcV9zZSArPSByZWFkb3V0CmVuZKhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkMGY5NmE4M2QtOTZlZi00NzY4LTkzMzAtODdjNDY2ZTM1YzkzhKdjZWxsX2lk2SQwZjk2YTgzZC05NmVmLTQ3NjgtOTMzMC04N2M0NjZlMzVjOTOkY29kZdmDIyAoMi44KSBEbyB5b3Ugbm90aWNlIGFueXRoaW5nIHdlaXJkPyBDaGFuZ2UgQXghCkBiaW5kIEF4IFNsaWRlcihyYW5nZSgwLCAyMCwgMjApKjFlLTUsIGRlZmF1bHQ9MTBlLTUpICMgR3JhZGllbnQncyBhcmVhIGluIFtUL20gc12obWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMLZJDVkZjk3ODc0LWYwOWMtNDE3My1hMmY2LTg5M2RiMzIyY2NhZoSnY2VsbF9pZNkkNWRmOTc4NzQtZjA5Yy00MTczLWEyZjYtODkzZGIzMjJjY2FmpGNvZGXZJ21kIiMgVW5kZXJzdGFuZGluZyBiYXNpYyBNUkkgc2VxdWVuY2VzIqhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw9kkZTRlZjUxNDUtYTYzYy00ZjkxLWFjMDQtM2I1YmYxNmMwODQyhKdjZWxsX2lk2SRlNGVmNTE0NS1hNjNjLTRmOTEtYWMwNC0zYjViZjE2YzA4NDKkY29kZdlaIyAoMy4zKSBTaW11bGF0ZSB0aGUgc2VxX2dyZSBzZXF1ZW5jZQpyYXdfdDJfc3Rhcl9ncmUgPSBzaW11bGF0ZShvYmpfdDJzdGFyLCBzZXFfZ3JlLCBzeXMpqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTC2SQ3YTY2YWI0Ny05MThmLTQ1ODItODk1Zi0xYjQ2OTA1NjIwNTGEp2NlbGxfaWTZJDdhNjZhYjQ3LTkxOGYtNDU4Mi04OTVmLTFiNDY5MDU2MjA1MaRjb2Rl2VMjICgxLjcpIFBsb3QgdGhlIHJlc3VsdGluZyByYXcgZGF0YSB3aXRoIHBsb3Rfc2lnbmFsCnBsb3Rfc2lnbmFsKHJhdzsgc2xpZGVyPWZhbHNlKahtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkZDZiMTcyOWEtODc0ZC0xMWVlLTE1MWEtOWIwZmNjZTJjNGZkhKdjZWxsX2lk2SRkNmIxNzI5YS04NzRkLTExZWUtMTUxYS05YjBmY2NlMmM0ZmSkY29kZdk7dXNpbmcgS29tYU1SSUNvcmUsIEtvbWFNUklQbG90cywgRkZUVywgUGx1dG9QbG90bHksIFBsdXRvVUmobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMLZJDlhODhhNTRiLWJjYzctNDFhZC04ZTYwLWY0ZDQ1MGRjY2IyZISnY2VsbF9pZNkkOWE4OGE1NGItYmNjNy00MWFkLThlNjAtZjRkNDUwZGNjYjJkpGNvZGXZwSMgKDIuNykgUmVjb25zdHJ1Y3QgdGhlIDFEIGltYWdlCmJlZ2luCiAgICBmZnRjKHg7IGRpbXM9WzEsMl0pID0gZmZ0c2hpZnQoZmZ0KGlmZnRzaGlmdCh4LCBkaW1zKSwgZGltcyksIGRpbXMpL3Byb2Qoc2l6ZSh4KVtkaW1zXSkKICAgIHJlY29uX2dyZSA9IHBsb3QoYWJzLihmZnRjKHJhd19ncmUucHJvZmlsZXNbMV0uZGF0YSkpKQplbmSobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMLZJGM0N2E1MGI4LWM5MzAtNGM5Ni05YjM0LTI3NzIxODY2MzRkOYSnY2VsbF9pZNkkYzQ3YTUwYjgtYzkzMC00Yzk2LTliMzQtMjc3MjE4NjYzNGQ5pGNvZGXZZiMgKDEuNikgRmluYWxseSwgdXNlIHRoZSBnZW5lcmF0ZWQgc2VxLCBvYmosIGFuZCBzeXMgdG8gc2ltdWxhdGUgdGhlIEZJRApyYXcgPSBzaW11bGF0ZShvYmosIHNlcSwgc3lzKahtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkNDFkMTRkZWMtYjg1Mi00MzE2LWFlZmItYzNkMDhmYTQzMjE2hKdjZWxsX2lk2SQ0MWQxNGRlYy1iODUyLTQzMTYtYWVmYi1jM2QwOGZhNDMyMTakY29kZdnVIyAoMi42KSBQbG90IHRoZSBzaW11bGF0ZWQgc2lnbmFsCmJlZ2luCgl0X2FkY19ncmUgPSBLb21hTVJJQ29yZS5nZXRfYWRjX3NhbXBsaW5nX3RpbWVzKHNlcV9ncmUpKjFlMwoJc2lnbmFsX2dyZSA9IHBsb3Rfc2lnbmFsKHJhd19ncmU7IHNsaWRlcj1mYWxzZSkKICAgIGFkZHRyYWNlcyEoc2lnbmFsX2dyZSwgdDJfZGVjYXkodF9hZGNfZ3JlKSkKCXNpZ25hbF9ncmUKZW5kqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTC2SRlZTdlODFlNy00ODRjLTQ0YTgtYTE5MS1mNzNlMjQ3MDdjZTmEp2NlbGxfaWTZJGVlN2U4MWU3LTQ4NGMtNDRhOC1hMTkxLWY3M2UyNDcwN2NlOaRjb2Rl2gLMIyAoMy4xKSBDcmVhdGUgdGhlIG5ldyBvYmpfdDJzdGFyIHBoYW50b20gCmJlZ2luCiAgICAjICgzLjEuMSkgQ3JlYXRlIGFuIGVtcHR5IHBoYW50b20KCW9ial90MnN0YXIgPSBQaGFudG9te0Zsb2F0NjR9KHg9W10pCiAgICAjICgzLjEuMikgRGVmaW5lIHRoZSBsaW5lYXIgb2ZmLXJlc29uYW5jZSBkaXN0cmlidXRpb24KCU5pc28gPSAyMAoJbGluZWFyX29mZnJlc29uYW5jZV9kaXN0cmlidXRpb24gPSAyz4AgLiogcmFuZ2UoLTEwLCAxMCwgTmlzbykKCSMgKDMuMS4zKSBJdGVyYXRlIG92ZXIgdGhlIGxpbmVhciBvZmYtcmVzb25hbmNlIGRpc3RyaWJ1dGlvbiBhbmQgLi4uCglmb3Igb2ZmID0gbGluZWFyX29mZnJlc29uYW5jZV9kaXN0cmlidXRpb24KCQkjIC4uLiBjb3B5IHRoZSBvcmlnaW5hbCBwaGFudG9tIGFuZCBtb2RpZnkgaXRzIG9mZi1yZXNvbmFuY2UKCSAgICBhdXggPSBjb3B5KG9iaikKCQlhdXguzpR3IC49IG9mZgoJCWF1eC55ICAuKz0gb2ZmICogMWUtNiAgIyBTbyB0aGUgZGlzdHJpYnV0aW9uIGlzIHZpc2libGUKCQkjICgzLjEuNCkgVXBkYXRlIHRoZSBwaGFudG9tCgkJb2JqX3Qyc3RhciArPSBhdXgKCWVuZAoJIyAoMy4xLjUpIERpdmlkZSB0aGUgcHJvdG9uIGRlbnNpdHkgYW5kIHJlbmFtZSB0aGUgcGhhbnRvbQoJb2JqX3Qyc3Rhci7PgSAuPSAxLjAgLyBOaXNvCglvYmpfdDJzdGFyLm5hbWUgPSAiVDIgc3RhciBwaGFudG9tIgplbmSobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMLZJDM0ODI0ZGI3LTEzYzQtNDVlMi1iZWZhLWYwMjdiOWI1ODVjMISnY2VsbF9pZNkkMzQ4MjRkYjctMTNjNC00NWUyLWJlZmEtZjAyN2I5YjU4NWMwpGNvZGXZp2JlZ2luCglyZWxheW91dCEocmVjb25fdDJfc3Rhcl9zZSwgcmVjb25fbGF5b3V0OyB0aXRsZT0iU0UiKQoJZmlnX3JlY29uXzMgPSBbcmVjb25fZ3JlIHJlY29uX3QyX3N0YXJfZ3JlIHJlY29uX3QyX3N0YXJfc2VdCglyZWxheW91dChmaWdfcmVjb25fMywgc2hvd2xlZ2VuZD1mYWxzZSkKZW5kqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTC2SRmMWYzYjcwMC01OTE2LTQ5NmYtYjkzOC00NmY3ZjA4YjRlYjaEp2NlbGxfaWTZJGYxZjNiNzAwLTU5MTYtNDk2Zi1iOTM4LTQ2ZjdmMDhiNGViNqRjb2Rl2XAjICg0LjYpIFBsb3Qgc2VxX3NlIGFuZCBpdHMgay1zcGFjZS4gSXMgdGhlIGstc3BhY2UgdGhlIHNhbWUgYXMgc2VxX2dyZSBpbiAoMi4zKT8KcGxvdF9zZXEoc2VxX3NlOyBzbGlkZXI9ZmFsc2UpqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTC2SQ5MTc5YWE0MC1iYjQwLTRhMzYtYWUxZS0wMGFlNDI5MzVhNWaEp2NlbGxfaWTZJDkxNzlhYTQwLWJiNDAtNGEzNi1hZTFlLTAwYWU0MjkzNWE1ZqRjb2Rl2gF+IyAoMi4xKSBDcmVhdGUgYSBncmFkaWVudCBgZ3hfcHJlYCwgdXNlIHRoZSB2YXJpYWJsZSBgQXhgISEKYmVnaW4KCVRfZ3hfcHJlID0gMTBlLTMKCWd4X3ByZSA9IEdyYWQoLUF4L1RfZ3hfcHJlLCBUX2d4X3ByZSwgMCwgMCkKCXNlcV9ncmUgPSBTZXF1ZW5jZSgpCglzZXFfZ3JlICs9IHJmCglzZXFfZ3JlICs9IGd4X3ByZQojICgyLjIpIEFwcGVuZCBhIGBTZXF1ZW5jZWAgYmxvY2sgY2FsbGVkIGByZWFkb3V0YAoJZ3ggPSBHcmFkKDIqQXgvKDJUX2d4X3ByZSksIDJUX2d4X3ByZSwgMCwgMCkKCWFkYzIgPSBBREMoMTAwLCAyVF9neF9wcmUpCglyZWFkb3V0ID0gU2VxdWVuY2UoW2d4OztdLCBbUkYoMCwwKTs7XSwgW2FkYzJdKQoJc2VxX2dyZSArPSByZWFkb3V0CmVuZKhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkYWRhNjAyZDItNGY0Yi00ZmI0LWE3NjMtOGE2MzllMDVmZjM4hKdjZWxsX2lk2SRhZGE2MDJkMi00ZjRiLTRmYjQtYTc2My04YTYzOWUwNWZmMzikY29kZdlLIyAoMi41KSBTaW11bGF0ZSB0aGUgc2VxX2dyZSBzZXF1ZW5jZQpyYXdfZ3JlID0gc2ltdWxhdGUob2JqLCBzZXFfZ3JlLCBzeXMpqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTC2SQ5NzQ3OTQzNy05Y2UzLTRiMzMtOTEzNC0wZjJhZjg5YmNjYjWEp2NlbGxfaWTZJDk3NDc5NDM3LTljZTMtNGIzMy05MTM0LTBmMmFmODliY2NiNaRjb2Rl2V8jICg0LjcpIFNpbXVsYXRlIHVzaW5nIHNlcV9zZSBhbmQgb2JqX3Qyc3RhcgpyYXdfdDJfc3Rhcl9zZSA9IHNpbXVsYXRlKG9ial90MnN0YXIsIHNlcV9zZSwgc3lzKahtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkMmU2NWFlMzEtZjUwYS00NjJiLTk3NDQtODBiZjZjZGIzODhlhKdjZWxsX2lk2SQyZTY1YWUzMS1mNTBhLTQ2MmItOTc0NC04MGJmNmNkYjM4OGWkY29kZdllIyAoNC45KSBSZWNvbnN0cnVjdCB0aGUgMUQgaW1hZ2UKcmVjb25fdDJfc3Rhcl9zZSA9IHBsb3QoYWJzLihmZnRjKHJhd190Ml9zdGFyX3NlLnByb2ZpbGVzWzFdLmRhdGEpKSmobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMLZJDg1MjlmMzZkLTJkMzktNGI0NS1hODIxLTAxYzgzNDY1MzlmZISnY2VsbF9pZNkkODUyOWYzNmQtMmQzOS00YjQ1LWE4MjEtMDFjODM0NjUzOWZkpGNvZGXZSVRhYmxlT2ZDb250ZW50cygpICMgVGhlcmUgc2hvdWxkIGJlIGEgdGFibGUgb2YgY29udGVudHMgb24gdGhlIHJpZ2h0IC0tLT6obWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMPZJDQ1OTUyNTEyLWFhZjEtNDNkOC1hOTVlLWMzMmJiMjYzM2Y0MoSnY2VsbF9pZNkkNDU5NTI1MTItYWFmMS00M2Q4LWE5NWUtYzMyYmIyNjMzZjQypGNvZGXZoW1kIiIiCiAtICg0LjcpIFNpbXVsYXRlIHVzaW5nIGBzZXFfc2VgIGFuZCBgb2JqX3Qyc3RhcmAKIC0gKDQuOCkgQ29tcGFyZSB0aGUgc2lnbmFsIG9idGFpbmVkIGluICg0LjYpIHdpdGggdGhlIG9uZSBhdCAoMy41KQogLSAoNC45KSBSZWNvbnN0cnVjdCB0aGUgMUQgaW1hZ2UKIiIiqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTD2SQ5NjQ0MDRmNi03ZjQ2LTRkZjktYWQ5OC05MjE5NDhjM2JlNjmEp2NlbGxfaWTZJDk2NDQwNGY2LTdmNDYtNGRmOS1hZDk4LTkyMTk0OGMzYmU2OaRjb2Rl2gEDYmVnaW4KCXJlY29uX2xheW91dCA9IExheW91dCh5YXhpcz1hdHRyKHJhbmdlPVswLCAwLjhdKSkKCXJlbGF5b3V0IShyZWNvbl9ncmUsIHJlY29uX2xheW91dDsgdGl0bGU9IkdSRS1UMiIpCglyZWxheW91dCEocmVjb25fdDJfc3Rhcl9ncmUsIHJlY29uX2xheW91dDsgdGl0bGU9IkdSRS1UMioiKQoJZmlnX3JlY29uXzIgPSBbcmVjb25fZ3JlIHJlY29uX3QyX3N0YXJfZ3JlXQoJcmVsYXlvdXQoZmlnX3JlY29uXzIsIHNob3dsZWdlbmQ9ZmFsc2UpCmVuZKhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkZDE2ZWZhNjItZGNlNy00ZWMzLTllM2MtYjVlMTY3NzM3N2ZjhKdjZWxsX2lk2SRkMTZlZmE2Mi1kY2U3LTRlYzMtOWUzYy1iNWUxNjc3Mzc3ZmOkY29kZdmSIyAoMS40KSBBIFBoYW50b20gd2l0aCAyMCBzcGlucwpiZWdpbgoJb2JqID0gUGhhbnRvbSh4PWNvbGxlY3QocmFuZ2UoLTFlLTMsMWUtMywyMCkpKQoJb2JqLs+BIC49IDEKCW9iai5UMSAuPSA1MDBlLTMKCW9iai5UMiAuPSA1MGUtMwoJbm90aGluZwplbmSobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMLZJGMwMmYzODk4LTEwY2ItNGYxZS1iNWVmLWViNDJiODAzYmFlZISnY2VsbF9pZNkkYzAyZjM4OTgtMTBjYi00ZjFlLWI1ZWYtZWI0MmI4MDNiYWVkpGNvZGXZnGJlZ2luCglyZWxheW91dCEoa3NwYWNlX2dyZTsgdGl0bGU9IkdSRSIpCglyZWxheW91dCEoa3NwYWNlX3NlOyB0aXRsZT0iU0UiKQoJZmlnX2tzcGFjZSA9IFtrc3BhY2VfZ3JlIGtzcGFjZV9zZV0KCXJlbGF5b3V0KGZpZ19rc3BhY2UsIHNob3dsZWdlbmQ9ZmFsc2UpCmVuZKhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkMmVlN2JhNDctMDJlNS00YjAyLWExNjItZGRiZDVlZDQ3YzdihKdjZWxsX2lk2SQyZWU3YmE0Ny0wMmU1LTRiMDItYTE2Mi1kZGJkNWVkNDdjN2KkY29kZdk6IyAoMy4yKSBQbG90IG9ial90MnN0YXIKcGxvdF9waGFudG9tX21hcChvYmpfdDJzdGFyLCA6zpR3KahtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkNzQ2NjZjMWEtMjY3My00OTM2LTk4MmItNjIyOWJmOTJhZjY2hKdjZWxsX2lk2SQ3NDY2NmMxYS0yNjczLTQ5MzYtOTgyYi02MjI5YmY5MmFmNjakY29kZdnubWQiIiIKIC0gKDIuNSkgU2ltdWxhdGUgdGhlIGBzZXFfZ3JlYCBzZXF1ZW5jZQogLSAoMi42KSBQbG90IHRoZSBzaW11bGF0ZWQgc2lnbmFsCiAtICgyLjcpIFJlY29uc3RydWN0IHRoZSAxRCBpbWFnZQogLSAoMi44KSBEbyB5b3Ugbm90aWNlIGFueXRoaW5nIHdlaXJkPyBJZiB0aGUgYW5zd2VyIGlzIHllcywgdHJ5IGFkanVzdGluZyBgQXhgIHRvIGNoYW5nZSB0aGUgYEZPVmAgb2YgdGhlIGFjcXVpc2l0aW9uCiIiIqhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw9kkZWE1NDIyNzEtMDFjMi00OTYyLWE3MDgtODA0YjIzYTg2MWI5hKdjZWxsX2lk2SRlYTU0MjI3MS0wMWMyLTQ5NjItYTcwOC04MDRiMjNhODYxYjmkY29kZdnqbWQiIiIKIC0gKDEuNikgRmluYWxseSwgdXNlIHRoZSBnZW5lcmF0ZWQgYHNlcWAsIGBvYmpgLCBhbmQgYHN5c2AgdG8gc2ltdWxhdGUgdGhlIEZJRCAoY2hlY2sgYHNpbXVsYXRlYCdzIGRvY3MpCiAtICgxLjcpIFBsb3QgdGhlIHJlc3VsdGluZyByYXcgZGF0YSB3aXRoIGBwbG90X3NpZ25hbGAuCiAtICgxLjgpIElzIHRoZSBzaWduYWwgdGhlIHNhbWUgYXMgYHBsb3QodCwgZXhwLigtdCAuLyBUMikpYD8KIiIiqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTD2SRjNmUzM2NiOC1mNDJjLTQ2NDMtOTI1Ny0xMjRkMjgwNGQzZGGEp2NlbGxfaWTZJGM2ZTMzY2I4LWY0MmMtNDY0My05MjU3LTEyNGQyODA0ZDNkYaRjb2Rl2aojICgxLjEpIEEgOTAtZGVnIGJsb2NrIFJGIHB1bHNlCmJlZ2luCglzeXMgPSBTY2FubmVyKCkKCWR1clJGID0gz4AvMi8oMs+AKs6zKnN5cy5CMSk7ICM5MC1kZWdyZWUgaGFyZCBleGNpdGF0aW9uIHB1bHNlCglyZiA9IFB1bHNlRGVzaWduZXIuUkZfaGFyZChzeXMuQjEsIGR1clJGLCBzeXMpCmVuZKhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkMjc2ODYyNjItMWExZS00NWZhLWI0ZWUtOTBhZTFkOWVlMzRlhKdjZWxsX2lk2SQyNzY4NjI2Mi0xYTFlLTQ1ZmEtYjRlZS05MGFlMWQ5ZWUzNGWkY29kZdmlbWQiIiIKIC0gKDMuMykgU2ltdWxhdGUgdGhlIGBzZXFfZ3JlYCBzZXF1ZW5jZQogLSAoMy40KSBQbG90IHRoZSBzaW11bGF0ZWQgc2lnbmFsCiAtICgzLjUpIENvbXBhcmUgdGhlIHBsb3QgaW4gKDMuNSkgd2l0aCAoMi42KQogLSAoMy42KSBSZWNvbnN0cnVjdCB0aGUgMUQgaW1hZ2UKIiIiqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTD2SQ2ZGZlMzM4ZC1kZTg1LTRhZGItYjAzMC0wOTQ1NWZhZTc4YTCEp2NlbGxfaWTZJDZkZmUzMzhkLWRlODUtNGFkYi1iMDMwLTA5NDU1ZmFlNzhhMKRjb2Rl2b5tZCIiIgpXZWxjb21lIHRvIHRoZSBoYW5kcy1vbiBzZXNzaW9uIG9uIE1SSSBzaW11bGF0aW9uLiBMZXQncyBoYXZlIHNvbWUgZnVuIQoKSWYgeW91IGhhdmUgYW55IGRvdWJ0cyBhYm91dCBob3cgdG8gdXNlIGEgZnVuY3Rpb24sIHBsZWFzZSBzZWFyY2ggaW4gdGhlICoqTGl2ZSBEb2NzKiogYXQgdGhlIGJvdHRvbSByaWdodC4KIiIiqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTD2SQ4ZTQ3NGFkZC04NjUxLTQzMWItYjQ4MS03YTEzOTAzN2RiZDKEp2NlbGxfaWTZJDhlNDc0YWRkLTg2NTEtNDMxYi1iNDgxLTdhMTM5MDM3ZGJkMqRjb2Rl2gLXbWQiIiIjIDEuIEZyZWUgSW5kdWN0aW9uIERlY2F5IChGSUQpClRoZSBmcmVlIGluZHVjdGlvbiBkZWNheSBpcyB0aGUgc2ltcGxlc3Qgb2JzZXJ2YWJsZSBOTVIgc2lnbmFsLiBUaGlzIHNpZ25hbCBpcyB0aGUgb25lIHRoYXQgZm9sbG93cyBhIHNpbmdsZSB0aXBwaW5nIFJGIHB1bHNlLgoKJChQbHV0b1VJLlJlc291cmNlKCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vTElCUkVodWIvTVJJLXByb2Nlc3NpbmctMjAyMy9tYWluLzAyLXNpbXVsYXRpb24vRmlndXJlcy9GSUQucG5nIiwgOndpZHRoPT4iMzAwcHgiKSkKVG8gcmVjcmVhdGUgdGhpcyBleHBlcmltZW50LCB3ZSB3aWxsIG5lZWQgdG8gZGVmaW5lIGEgYFNlcXVlbmNlYDoKIC0gKDEuMSkgQSA5MC1kZWcgYmxvY2sgUkYgcHVsc2UsIHB1dCBpdCBpbiBhIHZhcmlhYmxlIGBzZXFgIChjaGVjayBgUHVsc2VEZXNpZ25lci5SRl9oYXJkYCdzIGRvY3MgdXNpbmcgdGhlIExpdmUgRG9jcykKIC0gKDEuMikgQW4gQURDIHRvIGNhcHR1cmUgdGhlIHNpZ25hbCBpbiBhIHZhcmlhYmxlIGBhZGNgLCBjb25jYXRlbmF0ZSB3aXRoICgxLjEpIHVzaW5nIGBzZXEgKz0gYWRjYAogLSAoMS4zKSBQbG90IHRoZSBnZW5lcmF0ZWQgYFNlcXVlbmNlYCAoY2hlY2sgYHBsb3Rfc2VxYCdzIGRvY3MpCgpGb3IgdGhlIGhhcmR3YXJlIGxpbWl0cyB1c2UgdGhlIGRlZmF1bHQgc2Nhbm5lciBgc3lzID0gU2Nhbm5lcigpYC4gCiIiIqhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw9kkZmU4YmJjZDItZThmNS00MjI1LTgwYzMtNDdlNzMxNzZmYjNkhKdjZWxsX2lk2SRmZThiYmNkMi1lOGY1LTQyMjUtODBjMy00N2U3MzE3NmZiM2SkY29kZdlNbWQiIiIKQ29uZ3JhdHVsYXRpb25zISB5b3UgZmluaXNoZWQgdGhlIHNpbXVsYXRpb24gaGFuZHMtb24gc2Vzc2lvbiDwn6WzIQoiIiKobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMPZJDFhODNkODk3LTcwNWItNDQzZC04OWE0LWVhNWUzZTZhM2MwN4SnY2VsbF9pZNkkMWE4M2Q4OTctNzA1Yi00NDNkLTg5YTQtZWE1ZTNlNmEzYzA3pGNvZGXZtSMgKDMuNCkgUGxvdCB0aGUgc2ltdWxhdGVkIHNpZ25hbApiZWdpbgoJc2lnbmFsX3QyX3N0YXJfZ3JlID0gcGxvdF9zaWduYWwocmF3X3QyX3N0YXJfZ3JlOyBzbGlkZXI9ZmFsc2UpCglhZGR0cmFjZXMhKHNpZ25hbF90Ml9zdGFyX2dyZSwgdDJfZGVjYXkodF9hZGNfZ3JlKSkKCXNpZ25hbF90Ml9zdGFyX2dyZQplbmSobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMLZJDRlMTQzNGUxLTY3M2YtNDIwNi1hMjcxLTllZGVjMTBlYmQ2YYSnY2VsbF9pZNkkNGUxNDM0ZTEtNjczZi00MjA2LWEyNzEtOWVkZWMxMGViZDZhpGNvZGW/a3NwYWNlX3NlID0gcGxvdF9rc3BhY2Uoc2VxX3NlKahtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkMzM1N2EyODMtYTIzNC00ZDE1LThmZGYtN2ZiZWM1OGIzM2E3hKdjZWxsX2lk2SQzMzU3YTI4My1hMjM0LTRkMTUtOGZkZi03ZmJlYzU4YjMzYTekY29kZdoDV21kIiIiCiMgNC4gU3BpbiBFY2hvCgokKFJlc291cmNlKCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vTElCUkVodWIvTVJJLXByb2Nlc3NpbmctMjAyMy9tYWluLzAyLXNpbXVsYXRpb24vRmlndXJlcy9TRS5naWYiLCA6d2lkdGg9PiI0MDBweCIpKQoKVGhlIHNwaW4gZWNobyBleHBlcmltZW50IGhhcyB0aGUgYWR2YW50YWdlIHRoYXQgdGhlIGVjaG8gc2lnbmFsIGFtcGxpdHVkIGl0IGlzIG1vZHVsYXRlZCBieSAkJFxleHAoLXQvVF8yKSQkIGFuZCBub3QgJCRcZXhwKC10L1RfMl57Kn0pJCQuCgpGb3IgdGhpcyBzZWN0aW9uIHdlIHdpbGwgdXNlIHRoZSBwaGFudG9tIGBvYmpfdDJzdGFyYCBhbmQgYSBuZXcgc2VxdWVuY2UgYHNlcV9zZWAuCgpGb3IgdGhpcyBzZXF1ZW5jZSB3ZSB3aWxsIG5lZWQ6CiAtICg0LjEpIEEgOTBkZWcgaGFyZCBSRiBwdWxzZQogLSAoNC4yKSBBIGBEZWxheWAgb2YgJCRcbWF0aHJte1RFfS8yJCQgd2l0aCBhIHBvc2l0aXZlIGdyYWRpZW50IChhcmVhIGBBeGApCiAtICg0LjMpIEEgMTgwZGVnIGhhcmQgUkYgcHVsc2UKIC0gKDQuNCkgQSByZWFkb3V0IGdyYWRpZW50IG9mIGFyZWEgYDJBeGAgd2l0aCBhbiBBREMgKHNpbWlsYXIgdG8gKDIuMikpLCBzdWNoIHRoYXQgdGhlIG1pZGRsZSBvZiB0aGUgZ3JhZGllbnQgYW5kIEFEQyBhcmUgaW4gJCRcbWF0aHJte1RFfSQkCiAtICg0LjUpIENyZWF0ZSBjb25jYXRlbmF0aW5nIHRoZXNlIGJsb2NrcyBpbnRvIGEgc2VxdWVuY2UgY2FsbGVkIGBzZXFfc2VgCiAtICg0LjYpIFBsb3QgYHNlcV9zZWAgYW5kIGl0cyBrLXNwYWNlLiBJcyB0aGUgay1zcGFjZSB0aGUgc2FtZSBhcyBgc2VxX2dyZWAgaW4gKDIuMyk/CiIiIqhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw9kkM2FiY2E0MDYtMmU2Yi00YjM3LTg4MzUtNjVjZmFkOWQwY2FhhKdjZWxsX2lk2SQzYWJjYTQwNi0yZTZiLTRiMzctODgzNS02NWNmYWQ5ZDBjYWGkY29kZdlcIyAoMi40KSBQbG90IHRoZSAkayQtc3BhY2Ugd2l0aCB0aGUgYHBsb3Rfa3NwYWNlYCBmdW5jdGlvbgprc3BhY2VfZ3JlID0gcGxvdF9rc3BhY2Uoc2VxX2dyZSmobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMLZJDA5NzU1NDdkLTY3ZDktNGU2Yi04OGZmLWE5ZGQwNmE3ZjllZoSnY2VsbF9pZNkkMDk3NTU0N2QtNjdkOS00ZTZiLTg4ZmYtYTlkZDA2YTdmOWVmpGNvZGXZcyMgKDEuMykgUGxvdCB0aGUgZ2VuZXJhdGVkIFNlcXVlbmNlCmJlZ2luCglzZXEgPSBTZXF1ZW5jZSgpCglzZXEgKz0gcmYKCXNlcSArPSBhZGMKCXBsb3Rfc2VxKHNlcTsgc2xpZGVyPWZhbHNlKQplbmSobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMLZJDEyMzFiODMyLTQ3YjEtNGNjYi05YjU2LWE2NzgzODU5OGNjN4SnY2VsbF9pZNkkMTIzMWI4MzItNDdiMS00Y2NiLTliNTYtYTY3ODM4NTk4Y2M3pGNvZGXZ6yMgKDEuOCkgSXMgdGhlIHNpZ25hbCB0aGUgc2FtZSBhcyBgcGxvdCh0LCBleHAuKC10IC4vIFQyKSlgPwpiZWdpbgoJdCA9IHJhbmdlKDAsIDUwLCAxMDApCgl0Ml9kZWNheSh0KSA9IHNjYXR0ZXIoeD10LCB5PTIwLjAuKmV4cC4oLXQgLi8gNTApLCBuYW1lPSJUMi1kZWNheSIsIG1hcmtlcl9jb2xvcj0icHVycGxlIikKCXBsb3QodDJfZGVjYXkodCksIExheW91dCh5YXhpc19yYW5nZT1bMCwgMjAuMV0pKQplbmSobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMLZJDAyNjY2MzJkLTVjYTQtNDE5Ni1hNTIzLTMzYTY2ZGQ3MGUwY4SnY2VsbF9pZNkkMDI2NjYzMmQtNWNhNC00MTk2LWE1MjMtMzNhNjZkZDcwZTBjpGNvZGXZOiMgKDEuMikgQW4gQURDIHRvIGNhcHR1cmUgdGhlIHNpZ25hbAphZGMgPSBBREMoMTAwLCA1MGUtMymobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMKrbm90ZWJvb2tfaWTZJDdiY2MwNWIwLTgxZGEtMTFlZi0yMDQwLTM1ODVjOWI0OTU0Zqtpbl90ZW1wX2RpcsKobWV0YWRhdGGBq2Zyb250bWF0dGVyg6V0aXRsZdkhVW5kZXJzdGFuZGluZyBiYXNpYyBNUkkgc2VxdWVuY2VzpHRhZ3ORq2VkdWNhdGlvbmFsq2Rlc2NyaXB0aW9u2UJGcmVlIEluZHVjdGlvbiBEZWNheSAoRklEKSwgR3JhZGllbnQgRWNobyAoR0UpLCBhbmQgU3BpbiBFY2hvIChTRSk=";
window.pluto_preamble_html = undefined;
diff --git a/dev/tutorial-pluto/01-gradient-echo-spin-echo/index.html b/dev/tutorial-pluto/01-gradient-echo-spin-echo/index.html
index cfc090738..ddf425226 100644
--- a/dev/tutorial-pluto/01-gradient-echo-spin-echo/index.html
+++ b/dev/tutorial-pluto/01-gradient-echo-spin-echo/index.html
@@ -1,2 +1,2 @@
-Understanding basic MRI sequences · KomaMRI.jl
Theme
Automatic (OS) documenter-light documenter-dark catppuccin-latte catppuccin-frappe catppuccin-macchiato catppuccin-mocha
This document was generated with Documenter.jl version 1.7.0 on Thursday 3 October 2024 . Using Julia version 1.10.5.
+Understanding basic MRI sequences · KomaMRI.jl
Theme
Automatic (OS) documenter-light documenter-dark catppuccin-latte catppuccin-frappe catppuccin-macchiato catppuccin-mocha
This document was generated with Documenter.jl version 1.7.0 on Thursday 3 October 2024 . Using Julia version 1.10.5.
diff --git a/dev/tutorial-pluto/02-low-field-cmra-optimization.html b/dev/tutorial-pluto/02-low-field-cmra-optimization.html
index 08a6a7b38..20c43d844 100644
--- a/dev/tutorial-pluto/02-low-field-cmra-optimization.html
+++ b/dev/tutorial-pluto/02-low-field-cmra-optimization.html
@@ -16,7 +16,7 @@
window.pluto_disable_ui = true;
window.pluto_slider_server_url = undefined;
window.pluto_binder_url = "https://mybinder.org/v2/gh/fonsp/pluto-on-binder/v0.19.46";
-window.pluto_statefile = "data:;base64,3gARpWJvbmRzgKxjZWxsX3Jlc3VsdHPeACTZJGQwMzc3ZjlhLTY4MGQtNDUwMS05MGNhLTllYTNhYjY4MWRiNIqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnaAp08ZGl2IGNsYXNzPSJtYXJrZG93biI+PGgyPjIuMi4gRmF0U2F0IGZsaXAgYW5nbGUgb3B0aW1pemF0aW9uPC9oMj4KPHA+Rm9yIHRoZSBzZWNvbmQgc2ltdWxhdGlvbiBleHBlcmltZW50LCB0aGUgZmF0IHNpZ25hbCB3YXMgbWluaW1pemVkIGJ5IHZhcnlpbmcgdGhlIEZhdFNhdCBmbGlwIGFuZ2xlICYjNDA7YmV0d2VlbiAyMCBhbmQgMjUwIGRlZyYjNDE7IHVzaW5nIHNpeCBpTkFWIHJlYWRvdXRzICYjNDA7aWRlbnRpZmllZCBleHBlcmltZW50YWxseSB0byByZXN1bHQgaW4gZ29vZCBmYXQgc3VwcHJlc3Npb24mIzQxOy4gVG8gYmUgcm9idXN0IHRvIDxzcGFuIGNsYXNzPSJ0ZXgiPiRCXzAkPC9zcGFuPiBpbmhvbW9nZW5laXRpZXMsIG11bHRpcGxlIHNpbXVsYXRpb25zIHdpdGggdGlzc3VlIGZyZXF1ZW5jeSBzaGlmdHMgJiM0MDtiZXR3ZWVuIDxzcGFuIGNsYXNzPSJ0ZXgiPiQtMSQ8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0idGV4Ij4kMVwsXG1hdGhybSYjMTIzO3BwbSYjMTI1OyQ8L3NwYW4+LCB0d2ljZSBvZiB3aGF0IHdhcyByZXBvcnRlZCBieSBSZXN0aXZvIGV0IGFsLiYjNDE7IHdlcmUgcGVyZm9ybWVkLCBhbmQgdGhlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgb2J0YWluZWQgZmF0IHNpZ25hbCB3ZXJlIGNhbGN1bGF0ZWQuPC9wPgo8L2Rpdj6kbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/oqsF5JewcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJGQwMzc3ZjlhLTY4MGQtNDUwMS05MGNhLTllYTNhYjY4MWRiNLlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgAEgLO1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SRmYzU4NjQwYi1jNDRjLTRjMjUtYTRmZC01YTBlMTdkN2JlY2SKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52Tk8ZGl2IGNsYXNzPSJtYXJrZG93biI+PGgxPjEuIFNpbXVsYXRpb24gc2V0dXA8L2gxPgo8L2Rpdj6kbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/oqsAG7WwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJGZjNTg2NDBiLWM0NGMtNGMyNS1hNGZkLTVhMGUxN2Q3YmVjZLlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgADccO1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjaKpnF1ZXVlZMKkbG9nc9wARoikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSp25vdGhpbmeqdGV4dC9wbGFpbqJpZNkkYmQ2ODRmOTItZGJiMC00YmIxLTkwMWMtY2EzNTVhZTc1YzZipGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OStDAuMDE0NzA1ODgyMzUyOTQxMTc2qnRleHQvcGxhaW6iaWTZJGJkNjg0ZjkyLWRiYjAtNGJiMS05MDFjLWNhMzU1YWU3NWM2YqRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrQwLjAyOTQxMTc2NDcwNTg4MjM1M6p0ZXh0L3BsYWluomlk2SRiZDY4NGY5Mi1kYmIwLTRiYjEtOTAxYy1jYTM1NWFlNzVjNmKkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KzMC4wNDQxMTc2NDcwNTg4MjM1M6p0ZXh0L3BsYWluomlk2SRiZDY4NGY5Mi1kYmIwLTRiYjEtOTAxYy1jYTM1NWFlNzVjNmKkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5K0MC4wNTg4MjM1Mjk0MTE3NjQ3MDWqdGV4dC9wbGFpbqJpZNkkYmQ2ODRmOTItZGJiMC00YmIxLTkwMWMtY2EzNTVhZTc1YzZipGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSszAuMDczNTI5NDExNzY0NzA1ODiqdGV4dC9wbGFpbqJpZNkkYmQ2ODRmOTItZGJiMC00YmIxLTkwMWMtY2EzNTVhZTc1YzZipGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSszAuMDg4MjM1Mjk0MTE3NjQ3MDaqdGV4dC9wbGFpbqJpZNkkYmQ2ODRmOTItZGJiMC00YmIxLTkwMWMtY2EzNTVhZTc1YzZipGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSszAuMTAyOTQxMTc2NDcwNTg4MjOqdGV4dC9wbGFpbqJpZNkkYmQ2ODRmOTItZGJiMC00YmIxLTkwMWMtY2EzNTVhZTc1YzZipGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSszAuMTE3NjQ3MDU4ODIzNTI5NDGqdGV4dC9wbGFpbqJpZNkkYmQ2ODRmOTItZGJiMC00YmIxLTkwMWMtY2EzNTVhZTc1YzZipGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSsjAuMTMyMzUyOTQxMTc2NDcwNqp0ZXh0L3BsYWluomlk2SRiZDY4NGY5Mi1kYmIwLTRiYjEtOTAxYy1jYTM1NWFlNzVjNmKkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KzMC4xNDcwNTg4MjM1Mjk0MTE3N6p0ZXh0L3BsYWluomlk2SRiZDY4NGY5Mi1kYmIwLTRiYjEtOTAxYy1jYTM1NWFlNzVjNmKkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KzMC4xNjE3NjQ3MDU4ODIzNTI5Nap0ZXh0L3BsYWluomlk2SRiZDY4NGY5Mi1kYmIwLTRiYjEtOTAxYy1jYTM1NWFlNzVjNmKkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KzMC4xNzY0NzA1ODgyMzUyOTQxM6p0ZXh0L3BsYWluomlk2SRiZDY4NGY5Mi1kYmIwLTRiYjEtOTAxYy1jYTM1NWFlNzVjNmKkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KzMC4xOTExNzY0NzA1ODgyMzUyOKp0ZXh0L3BsYWluomlk2SRiZDY4NGY5Mi1kYmIwLTRiYjEtOTAxYy1jYTM1NWFlNzVjNmKkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KzMC4yMDU4ODIzNTI5NDExNzY0Nqp0ZXh0L3BsYWluomlk2SRiZDY4NGY5Mi1kYmIwLTRiYjEtOTAxYy1jYTM1NWFlNzVjNmKkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KzMC4yMjA1ODgyMzUyOTQxMTc2NKp0ZXh0L3BsYWluomlk2SRiZDY4NGY5Mi1kYmIwLTRiYjEtOTAxYy1jYTM1NWFlNzVjNmKkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KzMC4yMzUyOTQxMTc2NDcwNTg4Mqp0ZXh0L3BsYWluomlk2SRiZDY4NGY5Mi1kYmIwLTRiYjEtOTAxYy1jYTM1NWFlNzVjNmKkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KkMC4yNap0ZXh0L3BsYWluomlk2SRiZDY4NGY5Mi1kYmIwLTRiYjEtOTAxYy1jYTM1NWFlNzVjNmKkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KyMC4yNjQ3MDU4ODIzNTI5NDEyqnRleHQvcGxhaW6iaWTZJGJkNjg0ZjkyLWRiYjAtNGJiMS05MDFjLWNhMzU1YWU3NWM2YqRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrMwLjI3OTQxMTc2NDcwNTg4MjM2qnRleHQvcGxhaW6iaWTZJGJkNjg0ZjkyLWRiYjAtNGJiMS05MDFjLWNhMzU1YWU3NWM2YqRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrMwLjI5NDExNzY0NzA1ODgyMzU0qnRleHQvcGxhaW6iaWTZJGJkNjg0ZjkyLWRiYjAtNGJiMS05MDFjLWNhMzU1YWU3NWM2YqRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrIwLjMwODgyMzUyOTQxMTc2NDeqdGV4dC9wbGFpbqJpZNkkYmQ2ODRmOTItZGJiMC00YmIxLTkwMWMtY2EzNTVhZTc1YzZipGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSsjAuMzIzNTI5NDExNzY0NzA1Oap0ZXh0L3BsYWluomlk2SRiZDY4NGY5Mi1kYmIwLTRiYjEtOTAxYy1jYTM1NWFlNzVjNmKkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KyMC4zMzgyMzUyOTQxMTc2NDcxqnRleHQvcGxhaW6iaWTZJGJkNjg0ZjkyLWRiYjAtNGJiMS05MDFjLWNhMzU1YWU3NWM2YqRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrMwLjM1Mjk0MTE3NjQ3MDU4ODI2qnRleHQvcGxhaW6iaWTZJGJkNjg0ZjkyLWRiYjAtNGJiMS05MDFjLWNhMzU1YWU3NWM2YqRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrMwLjM2NzY0NzA1ODgyMzUyOTQ0qnRleHQvcGxhaW6iaWTZJGJkNjg0ZjkyLWRiYjAtNGJiMS05MDFjLWNhMzU1YWU3NWM2YqRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrMwLjM4MjM1Mjk0MTE3NjQ3MDU2qnRleHQvcGxhaW6iaWTZJGJkNjg0ZjkyLWRiYjAtNGJiMS05MDFjLWNhMzU1YWU3NWM2YqRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrMwLjM5NzA1ODgyMzUyOTQxMTc0qnRleHQvcGxhaW6iaWTZJGJkNjg0ZjkyLWRiYjAtNGJiMS05MDFjLWNhMzU1YWU3NWM2YqRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrIwLjQxMTc2NDcwNTg4MjM1MjmqdGV4dC9wbGFpbqJpZNkkYmQ2ODRmOTItZGJiMC00YmIxLTkwMWMtY2EzNTVhZTc1YzZipGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSsjAuNDI2NDcwNTg4MjM1Mjk0Map0ZXh0L3BsYWluomlk2SRiZDY4NGY5Mi1kYmIwLTRiYjEtOTAxYy1jYTM1NWFlNzVjNmKkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KyMC40NDExNzY0NzA1ODgyMzUzqnRleHQvcGxhaW6iaWTZJGJkNjg0ZjkyLWRiYjAtNGJiMS05MDFjLWNhMzU1YWU3NWM2YqRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrMwLjQ1NTg4MjM1Mjk0MTE3NjQ2qnRleHQvcGxhaW6iaWTZJGJkNjg0ZjkyLWRiYjAtNGJiMS05MDFjLWNhMzU1YWU3NWM2YqRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrMwLjQ3MDU4ODIzNTI5NDExNzY0qnRleHQvcGxhaW6iaWTZJGJkNjg0ZjkyLWRiYjAtNGJiMS05MDFjLWNhMzU1YWU3NWM2YqRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrIwLjQ4NTI5NDExNzY0NzA1ODiqdGV4dC9wbGFpbqJpZNkkYmQ2ODRmOTItZGJiMC00YmIxLTkwMWMtY2EzNTVhZTc1YzZipGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSozAuNap0ZXh0L3BsYWluomlk2SRiZDY4NGY5Mi1kYmIwLTRiYjEtOTAxYy1jYTM1NWFlNzVjNmKkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KyMC41MTQ3MDU4ODIzNTI5NDExqnRleHQvcGxhaW6iaWTZJGJkNjg0ZjkyLWRiYjAtNGJiMS05MDFjLWNhMzU1YWU3NWM2YqRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrIwLjUyOTQxMTc2NDcwNTg4MjSqdGV4dC9wbGFpbqJpZNkkYmQ2ODRmOTItZGJiMC00YmIxLTkwMWMtY2EzNTVhZTc1YzZipGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSsjAuNTQ0MTE3NjQ3MDU4ODIzNap0ZXh0L3BsYWluomlk2SRiZDY4NGY5Mi1kYmIwLTRiYjEtOTAxYy1jYTM1NWFlNzVjNmKkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KyMC41NTg4MjM1Mjk0MTE3NjQ3qnRleHQvcGxhaW6iaWTZJGJkNjg0ZjkyLWRiYjAtNGJiMS05MDFjLWNhMzU1YWU3NWM2YqRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrIwLjU3MzUyOTQxMTc2NDcwNTiqdGV4dC9wbGFpbqJpZNkkYmQ2ODRmOTItZGJiMC00YmIxLTkwMWMtY2EzNTVhZTc1YzZipGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSsjAuNTg4MjM1Mjk0MTE3NjQ3Map0ZXh0L3BsYWluomlk2SRiZDY4NGY5Mi1kYmIwLTRiYjEtOTAxYy1jYTM1NWFlNzVjNmKkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KyMC42MDI5NDExNzY0NzA1ODgyqnRleHQvcGxhaW6iaWTZJGJkNjg0ZjkyLWRiYjAtNGJiMS05MDFjLWNhMzU1YWU3NWM2YqRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrIwLjYxNzY0NzA1ODgyMzUyOTSqdGV4dC9wbGFpbqJpZNkkYmQ2ODRmOTItZGJiMC00YmIxLTkwMWMtY2EzNTVhZTc1YzZipGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSsjAuNjMyMzUyOTQxMTc2NDcwNqp0ZXh0L3BsYWluomlk2SRiZDY4NGY5Mi1kYmIwLTRiYjEtOTAxYy1jYTM1NWFlNzVjNmKkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KyMC42NDcwNTg4MjM1Mjk0MTE4qnRleHQvcGxhaW6iaWTZJGJkNjg0ZjkyLWRiYjAtNGJiMS05MDFjLWNhMzU1YWU3NWM2YqRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrIwLjY2MTc2NDcwNTg4MjM1MjmqdGV4dC9wbGFpbqJpZNkkYmQ2ODRmOTItZGJiMC00YmIxLTkwMWMtY2EzNTVhZTc1YzZipGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSsjAuNjc2NDcwNTg4MjM1Mjk0Mqp0ZXh0L3BsYWluomlk2SRiZDY4NGY5Mi1kYmIwLTRiYjEtOTAxYy1jYTM1NWFlNzVjNmKkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KyMC42OTExNzY0NzA1ODgyMzUzqnRleHQvcGxhaW6iaWTZJGJkNjg0ZjkyLWRiYjAtNGJiMS05MDFjLWNhMzU1YWU3NWM2YqRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrIwLjcwNTg4MjM1Mjk0MTE3NjWqdGV4dC9wbGFpbqJpZNkkYmQ2ODRmOTItZGJiMC00YmIxLTkwMWMtY2EzNTVhZTc1YzZipGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSsjAuNzIwNTg4MjM1Mjk0MTE3Nqp0ZXh0L3BsYWluomlk2SRiZDY4NGY5Mi1kYmIwLTRiYjEtOTAxYy1jYTM1NWFlNzVjNmKkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KyMC43MzUyOTQxMTc2NDcwNTg5qnRleHQvcGxhaW6iaWTZJGJkNjg0ZjkyLWRiYjAtNGJiMS05MDFjLWNhMzU1YWU3NWM2YqRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkqQwLjc1qnRleHQvcGxhaW6iaWTZJGJkNjg0ZjkyLWRiYjAtNGJiMS05MDFjLWNhMzU1YWU3NWM2YqRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrIwLjc2NDcwNTg4MjM1Mjk0MTGqdGV4dC9wbGFpbqJpZNkkYmQ2ODRmOTItZGJiMC00YmIxLTkwMWMtY2EzNTVhZTc1YzZipGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSsjAuNzc5NDExNzY0NzA1ODgyNKp0ZXh0L3BsYWluomlk2SRiZDY4NGY5Mi1kYmIwLTRiYjEtOTAxYy1jYTM1NWFlNzVjNmKkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KyMC43OTQxMTc2NDcwNTg4MjM1qnRleHQvcGxhaW6iaWTZJGJkNjg0ZjkyLWRiYjAtNGJiMS05MDFjLWNhMzU1YWU3NWM2YqRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrIwLjgwODgyMzUyOTQxMTc2NDeqdGV4dC9wbGFpbqJpZNkkYmQ2ODRmOTItZGJiMC00YmIxLTkwMWMtY2EzNTVhZTc1YzZipGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSsjAuODIzNTI5NDExNzY0NzA1OKp0ZXh0L3BsYWluomlk2SRiZDY4NGY5Mi1kYmIwLTRiYjEtOTAxYy1jYTM1NWFlNzVjNmKkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KyMC44MzgyMzUyOTQxMTc2NDcxqnRleHQvcGxhaW6iaWTZJGJkNjg0ZjkyLWRiYjAtNGJiMS05MDFjLWNhMzU1YWU3NWM2YqRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrIwLjg1Mjk0MTE3NjQ3MDU4ODKqdGV4dC9wbGFpbqJpZNkkYmQ2ODRmOTItZGJiMC00YmIxLTkwMWMtY2EzNTVhZTc1YzZipGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSsjAuODY3NjQ3MDU4ODIzNTI5NKp0ZXh0L3BsYWluomlk2SRiZDY4NGY5Mi1kYmIwLTRiYjEtOTAxYy1jYTM1NWFlNzVjNmKkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KyMC44ODIzNTI5NDExNzY0NzA2qnRleHQvcGxhaW6iaWTZJGJkNjg0ZjkyLWRiYjAtNGJiMS05MDFjLWNhMzU1YWU3NWM2YqRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrIwLjg5NzA1ODgyMzUyOTQxMTiqdGV4dC9wbGFpbqJpZNkkYmQ2ODRmOTItZGJiMC00YmIxLTkwMWMtY2EzNTVhZTc1YzZipGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSsjAuOTExNzY0NzA1ODgyMzUyOap0ZXh0L3BsYWluomlk2SRiZDY4NGY5Mi1kYmIwLTRiYjEtOTAxYy1jYTM1NWFlNzVjNmKkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KyMC45MjY0NzA1ODgyMzUyOTQyqnRleHQvcGxhaW6iaWTZJGJkNjg0ZjkyLWRiYjAtNGJiMS05MDFjLWNhMzU1YWU3NWM2YqRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrIwLjk0MTE3NjQ3MDU4ODIzNTOqdGV4dC9wbGFpbqJpZNkkYmQ2ODRmOTItZGJiMC00YmIxLTkwMWMtY2EzNTVhZTc1YzZipGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSsjAuOTU1ODgyMzUyOTQxMTc2Nap0ZXh0L3BsYWluomlk2SRiZDY4NGY5Mi1kYmIwLTRiYjEtOTAxYy1jYTM1NWFlNzVjNmKkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KyMC45NzA1ODgyMzUyOTQxMTc2qnRleHQvcGxhaW6iaWTZJGJkNjg0ZjkyLWRiYjAtNGJiMS05MDFjLWNhMzU1YWU3NWM2YqRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrIwLjk4NTI5NDExNzY0NzA1ODmqdGV4dC9wbGFpbqJpZNkkYmQ2ODRmOTItZGJiMC00YmIxLTkwMWMtY2EzNTVhZTc1YzZipGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSozEuMKp0ZXh0L3BsYWluomlk2SRiZDY4NGY5Mi1kYmIwLTRiYjEtOTAxYy1jYTM1NWFlNzVjNmKkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KmImRvbmUiqnRleHQvcGxhaW6iaWTZJGJkNjg0ZjkyLWRiYjAtNGJiMS05MDFjLWNhMzU1YWU3NWM2YqRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmncnVubmluZ8Kmb3V0cHV0hqRib2R5oKRtaW1lqnRleHQvcGxhaW6scm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/ouvBVMqwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNrlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzwAAAAGD5/iktXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkOTIxOTRmY2ItNTgyYS00OWNlLWFhZDctMjBiMDE0NWQ0MGQziqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedkzPGRpdiBjbGFzcz0ibWFya2Rvd24iPjxoMj4xLjMuIFNlcXVlbmNlPC9oMj4KPC9kaXY+pG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv6KrAzDPsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQ5MjE5NGZjYi01ODJhLTQ5Y2UtYWFkNy0yMGIwMTQ1ZDQwZDO5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4AA1pctXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkZjQ5NjU1Y2MtNDYwZS00OTgxLTkyZWEtZGZkNjE0NzMwOGJmiqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedmcPGRpdiBjbGFzcz0ibWFya2Rvd24iPjxwPkJsb2NoIHNpbXVsYXRpb25zIHdlcmUgcGVyZm9ybWVkIHVzaW5nIDxzdHJvbmc+S29tYU1SSS5qbDwvc3Ryb25nPiB0byBvcHRpbWl6ZSB0aGUgcHJvcG9zZWQgd2hvbGUtaGVhcnQgQ01SQSBwYXJhbWV0ZXJzLjwvcD4KPC9kaXY+pG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv6KrAX6msHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SRmNDk2NTVjYy00NjBlLTQ5ODEtOTJlYS1kZmQ2MTQ3MzA4Yma5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4ABPrhtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkM2Q3ZTdkMjAtYTc3YS00OGIzLWFkMmUtNmI2MjEyMjdiZTE2iqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedoEFjxkaXYgY2xhc3M9Im1hcmtkb3duIj48aDE+UmVmZXJlbmNlczwvaDE+Cjx1bD4KPGxpPjxwPjxzdHJvbmc+Q2FzdGlsbG8tUGFzc2kgQzwvc3Ryb25nPiwgQ29yb25hZG8gUiwgVmFyZWxhLU1hdHRhdGFsbCBHLCBBbGJlcm9sYS1Mw7NwZXogQywgQm90bmFyIFIsIElyYXJyYXphdmFsIFAuIEtvbWFNUkkuamw6IEFuIG9wZW4tc291cmNlIGZyYW1ld29yayBmb3IgZ2VuZXJhbCBNUkkgc2ltdWxhdGlvbnMgd2l0aCBHUFUgYWNjZWxlcmF0aW9uLiBNYWduZXRpYyBSZXNvbmFuY2UgaW4gTWVkaWNpbmUuIDIwMjM7OTAmIzQwOzEmIzQxOzozMjktMzQyLiA8YSBocmVmPSJkb2k6MTAuMTAwMi9tcm0uMjk2MzUiPmRvaToxMC4xMDAyL21ybS4yOTYzNTwvYT48L3A+CjwvbGk+CjxsaT48cD48c3Ryb25nPkNhbXBiZWxsLVdhc2hidXJuIEFFPC9zdHJvbmc+LCBSYW1hc2F3bXkgUiwgUmVzdGl2byBNQywgZXQgYWwuIE9wcG9ydHVuaXRpZXMgaW4gSW50ZXJ2ZW50aW9uYWwgYW5kIERpYWdub3N0aWMgSW1hZ2luZyBieSBVc2luZyBIaWdoLVBlcmZvcm1hbmNlIExvdy1GaWVsZC1TdHJlbmd0aCBNUkkuIFJhZGlvbG9neS4gMjAxOTsyOTMmIzQwOzImIzQxOzozODQtMzkzLiA8YSBocmVmPSJkb2k6MTAuMTE0OC9yYWRpb2wuMjAxOTE5MDQ1MiI+ZG9pOjEwLjExNDgvcmFkaW9sLjIwMTkxOTA0NTI8L2E+PC9wPgo8L2xpPgo8bGk+PHA+PHN0cm9uZz5SZXN0aXZvIE1DPC9zdHJvbmc+LCBSYW1hc2F3bXkgUiwgQmFuZGV0dGluaSBXUCwgSGVyemthIERBLCBDYW1wYmVsbC1XYXNoYnVybiBBRS4gRWZmaWNpZW50IHNwaXJhbCBpbi1vdXQgYW5kIEVQSSBiYWxhbmNlZCBzdGVhZHktc3RhdGUgZnJlZSBwcmVjZXNzaW9uIGNpbmUgaW1hZ2luZyB1c2luZyBhIGhpZ2gtcGVyZm9ybWFuY2UgMC41NVQgTVJJLiBNYWduZXRpYyBSZXNvbmFuY2UgaW4gTWVkaWNpbmUuIDIwMjA7ODQmIzQwOzUmIzQxOzoyMzY0LTIzNzUuIDxhIGhyZWY9ImRvaToxMC4xMDAyL21ybS4yODI3OCI+ZG9pOjEwLjEwMDIvbXJtLjI4Mjc4PC9hPjwvcD4KPC9saT4KPC91bD4KPC9kaXY+pG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv6KrC5gDsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQzZDdlN2QyMC1hNzdhLTQ4YjMtYWQyZS02YjYyMTIyN2JlMTa5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4APpyTtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkYTk5YzBjNDctMWI3MC00MzYyLWEyZjYtYTdlMzI1OTYwNmZhiqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedoCITxkaXYgY2xhc3M9Im1hcmtkb3duIj48aDE+TG93LUZpZWxkIENNUkEgT3B0aW1pemF0aW9uPC9oMT4KPHA+VGhpcyBub3RlYm9vayByZXByb2R1Y2VzIHRoZSBzaW11bGF0aW9uIGV4cGVyaW1lbnRzIHBlcmZvcm1lZCBpbiBvdXIgbWFudXNjcmlwdDo8L3A+CjxibG9ja3F1b3RlPgo8cD48c3Ryb25nPiZxdW90O0hpZ2hseSBFZmZpY2llbnQgaU5BVi1iYXNlZCAzRCBXaG9sZS1IZWFydCBDTVJBIGF0IDAuNTVUJnF1b3Q7PC9zdHJvbmc+PC9wPgo8cD48c3Ryb25nPkNhcmxvcyBDYXN0aWxsby1QYXNzaTwvc3Ryb25nPiwgS2FybCBQLiBLdW56ZSwgTWljaGFlbCBHLiBDcmFiYiwgQ2FtaWxhIE11w7FveiwgQW5hc3Rhc2lhIEZvdGFraSwgUmFkaG91ZW5lIE5lamksIFBhYmxvIElyYXJyYXphdmFsLCBDbGF1ZGlhIFByaWV0bywgYW5kIFJlbsOpIE0uIEJvdG5hcjwvcD4KPHA+JiM0MDsyMDI0JiM0MTs8L3A+CjwvYmxvY2txdW90ZT4KPHA+U3VibWl0dGVkIHRvIE1hZ25ldGljIFJlc29uYW5jZSBpbiBNZWRpY2luZSAmIzQwO01STSYjNDE7LjwvcD4KPC9kaXY+pG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv6Kq//v8sHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SRhOTljMGM0Ny0xYjcwLTQzNjItYTJmNi1hN2UzMjU5NjA2ZmG5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4ANy1+tXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkYTE1ZDZiNjQtZjhlZS00ZWU0LTgxMmMtZDQ5Y2Y1ZWE3ODRkiqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedoDGzxkaXYgY2xhc3M9Im1hcmtkb3duIj48aDI+MS40LiBQaGFudG9tPC9oMj4KPHA+RWFjaCB0aXNzdWUgd2FzIHJlcHJlc2VudGVkIHdpdGggMjAwIGlzb2Nocm9tYXRzIGRpc3RyaWJ1dGVkIGFsb25nIHRoZSA8c3BhbiBjbGFzcz0idGV4Ij4keiQ8L3NwYW4+LWF4aXMgdG8gc2ltdWxhdGUgZ3JhZGllbnQgc3BvaWxpbmcgZWZmZWN0cy4gVGhlIGlzb2Nocm9tYXRzIGZvciBlYWNoIHRpc3N1ZSB3ZXJlIGluc2lkZSBhIDFEIHZveGVsIG9mIHNpemUgPHNwYW4gY2xhc3M9InRleCI+JDEuNVwsXG1hdGhybSYjMTIzO21tJiMxMjU7JDwvc3Bhbj4uIFRoZSB2YWx1ZXMgZm9yIDxzcGFuIGNsYXNzPSJ0ZXgiPiRUXzEkPC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9InRleCI+JFRfMiQ8L3NwYW4+IGZvciBibG9vZCwgbXlvY2FyZGlhbCBtdXNjbGUsIGFuZCBmYXQgYXQgMC41NVQgd2VyZSBvYnRhaW5lZCBmcm9tIHRoZSB3b3JrIG9mIENhbXBiZWxsLVdhc2hidXJuLCBldCBhbC4gRmF0IHNwaW5zIHdlcmUgc2ltdWxhdGVkIHVzaW5nIGEgY2hlbWljYWwgc2hpZnQgb2YgPHNwYW4gY2xhc3M9InRleCI+JC0zLjRcLFxtYXRocm0mIzEyMztwcG0mIzEyNTskPC9zcGFuPiwgc2ltdWxhdGluZyByZWd1bGFyIGZhdCB3aXRoIDxzcGFuIGNsYXNzPSJ0ZXgiPiRUXzEmIzYxOzE4M1wsXG1hdGhybSYjMTIzO21zJiMxMjU7JDwvc3Bhbj4sIGFuZCBmYXN0LXJlY292ZXJpbmcgZmF0IHdpdGggPHNwYW4gY2xhc3M9InRleCI+JFRfMSYjNjE7MTMwXCxcbWF0aHJtJiMxMjM7bXMmIzEyNTskPC9zcGFuPi48L3A+CjwvZGl2PqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b+iqwU7l7BwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkYTE1ZDZiNjQtZjhlZS00ZWU0LTgxMmMtZDQ5Y2Y1ZWE3ODRkuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAAU2DbVwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJGYwYTgxYzlmLTU2MTYtNDY2My05NDhmLWE0MDg0ZTE3MTlhZoqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnZZDxkaXYgY2xhc3M9Im1hcmtkb3duIj48dWw+CjxsaT48cD5QaGFudG9tIHBhcmFtZXRlcnMgJiM0MDtzaG93L2hpZGUgY29kZSYjNDE7PC9wPgo8L2xpPgo8L3VsPgo8L2Rpdj6kbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/ot9GQ3iwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJGYwYTgxYzlmLTU2MTYtNDY2My05NDhmLWE0MDg0ZTE3MTlhZrlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgJIVqe1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SRkOTcxNWJjMS00OWNkLTRkZjgtOGRiZi1jMDZkZTQyYWQ1NTCKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52mqJCTxzY3JpcHQgaWQ9J3Bsb3RfMSc+CgkJLy8gV2Ugc3RhcnQgYnkgcHV0dGluZyBhbGwgdGhlIHZhcmlhYmxlIGludGVycG9sYXRpb24gaGVyZSBhdCB0aGUgYmVnaW5uaW5nCgkJLy8gV2UgaGF2ZSB0byBjb252ZXJ0IGFsbCB0eXBlZGFycmF5cyBpbiB0aGUgbGF5b3V0IHRvIG5vcm1hbCBhcnJheXMuIFNlZSBJc3N1ZSAjMjUKCQkvLyBXZSB1c2UgbG9kYXNoIGZvciB0aGlzIGZvciBjb21wYWN0bmVzcwoJCWZ1bmN0aW9uIHJlbW92ZVR5cGVkQXJyYXkobykgewoJCQlyZXR1cm4gXy5pc1R5cGVkQXJyYXkobykgPyBBcnJheS5mcm9tKG8pIDoKCQkJXy5pc1BsYWluT2JqZWN0KG8pID8gXy5tYXBWYWx1ZXMobywgcmVtb3ZlVHlwZWRBcnJheSkgOiAKCQkJbwoJCX0KCgkJLy8gUHVibGlzaCB0aGUgcGxvdCBvYmplY3QgdG8gSlMKCQlsZXQgcGxvdF9vYmogPSBfLnVwZGF0ZSgvKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIEFic3RyYWN0UGx1dG9EaW5nZXRqZXMuRGlzcGxheS5wdWJsaXNoZWRfdG9fanMgKi8gZ2V0UHVibGlzaGVkT2JqZWN0KCIwYmNkOGU5MC04MTgxLTExZWYtMjRjMC1mMTRmNmE0ZDMwODQvODI0MTNjMDg1NjkxMDk0MiIpLCAibGF5b3V0IiwgcmVtb3ZlVHlwZWRBcnJheSkKCQkvLyBHZXQgdGhlIHBsb3RseSBsaXN0ZW5lcnMKCQljb25zdCBwbG90bHlfbGlzdGVuZXJzID0ge30KCQkvLyBHZXQgdGhlIEpTIGxpc3RlbmVycwoJCWNvbnN0IGpzX2xpc3RlbmVycyA9IHt9CgkJLy8gRGVhbCB3aXRoIGV2ZW50dWFsIGN1c3RvbSBjbGFzc2VzCgkJbGV0IGN1c3RvbV9jbGFzc2xpc3QgPSBbXQoKCgkJLy8gTG9hZCB0aGUgcGxvdGx5IGxpYnJhcnkKCQlsZXQgUGxvdGx5ID0gdW5kZWZpbmVkCgkJdHJ5IHsKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoIi4vcGxvdGx5anMvcGxvdGx5anMtMi4yNi4yLm1pbi5qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0gY2F0Y2ggKGUpIHsKCQkJY29uc29sZS5sb2coIkxvY2FsIGxvYWQgZmFpbGVkLCB0cnlpbmcgd2l0aCB0aGUgd2ViIGVzbS5zaCB2ZXJzaW9uIikKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoImh0dHBzOi8vZXNtLnNoL3YxMzUvcGxvdGx5LmpzLWRpc3QtbWluQDIuMjYuMi9lc25leHQvcGxvdGx5LmpzLWRpc3QtbWluLm1qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0KCgkJLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0byBmb3JjZSBsb2NhbCBtYXRoamF4IGZvbnQgY2FjaGUKCQlpZiAoZmFsc2UgJiYgd2luZG93Py5NYXRoSmF4Py5jb25maWc/LnN2Zz8uZm9udENhY2hlID09PSAnZ2xvYmFsJykgewoJCQl3aW5kb3cuTWF0aEpheC5jb25maWcuc3ZnLmZvbnRDYWNoZSA9ICdsb2NhbCcKCQl9CgoJCS8vIEZsYWcgdG8gY2hlY2sgaWYgdGhpcyBjZWxsIHdhcyAgbWFudWFsbHkgcmFuIG9yIHJlYWN0aXZlbHkgcmFuCmNvbnN0IGZpcnN0UnVuID0gdGhpcyA/IGZhbHNlIDogdHJ1ZQpjb25zdCBDT05UQUlORVIgPSB0aGlzID8/IGh0bWxgPGRpdiBjbGFzcz0ncGx1dG9wbG90bHktY29udGFpbmVyJz5gCmNvbnN0IFBMT1QgPSBDT05UQUlORVIucXVlcnlTZWxlY3RvcignLmpzLXBsb3RseS1wbG90JykgPz8gQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgPGRpdj5gKQpjb25zdCBwYXJlbnQgPSBDT05UQUlORVIucGFyZW50RWxlbWVudAovLyBXZSB1c2UgYSBjb250cm9sbGVyIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lcnMgdXBvbiBpbnZhbGlkYXRpb24KY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKQovLyBXZSBoYXZlIHRvIGFkZCB0aGlzIHRvIGtlZXAgc3VwcG9ydGluZyBAYmluZCB3aXRoIHRoZSBvbGQgQVBJIHVzaW5nIFBMT1QKUExPVC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChlKSA9PiB7CglDT05UQUlORVIudmFsdWUgPSBQTE9ULnZhbHVlCglpZiAoZS5idWJibGVzKSB7CgkJcmV0dXJuCgl9CglDT05UQUlORVIuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2lucHV0JykpCn0sIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KQoKCS8vIFRoaXMgY3JlYXRlIHRoZSBzdHlsZSBzdWJkaXYgb24gZmlyc3QgcnVuCglmaXJzdFJ1biAmJiBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGAKCTxzdHlsZT4KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgewoJCXdpZHRoOiAxMDAlOwoJCWhlaWdodDogMTAwJTsKCQltaW4taGVpZ2h0OiAwOwoJCW1pbi13aWR0aDogMDsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgLmpzLXBsb3RseS1wbG90IC5wbG90bHkgZGl2IHsKCQltYXJnaW46IDAgYXV0bzsgLy8gVGhpcyBjZW50ZXJzIHRoZSBwbG90Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLnBvcHBlZC1vdXQgewoJCW92ZXJmbG93OiBhdXRvOwoJCXotaW5kZXg6IDEwMDA7CgkJcG9zaXRpb246IGZpeGVkOwoJCXJlc2l6ZTogYm90aDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDBweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMHB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgewoJCWRpc3BsYXk6IGZsZXg7CgkJZmxleC1mbG93OiByb3cgd3JhcDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAxMnB4OwoJCXBvc2l0aW9uOiBmaXhlZDsKCQl6LWluZGV4OiAxMDAxOwoJCWN1cnNvcjogbW92ZTsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIC0xMDAlKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBzcGFuIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJZmxleDogMQoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIuaGlkZGVuIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuIHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlIHsKCQlwYWRkaW5nLXJpZ2h0OiA1cHg7CgkJcGFkZGluZy1sZWZ0OiAycHg7CgkJY3Vyc29yOiB0ZXh0OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZmxleDogMCAwIDEwMCU7CgkJdGV4dC1hbGlnbjogY2VudGVyOwoJCWJvcmRlci10b3A6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQltYXJnaW4tdG9wOiA1cHg7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZpbGVuYW1lIHsKCQltYXJnaW4tbGVmdDogM3B4OwoJCXRleHQtYWxpZ246IGxlZnQ7CgkJbWluLXdpZHRoOiBtaW4oNjAlLCBtaW4tY29udGVudCk7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCAubGFiZWwgewoJCWZsZXg6IDAgMCAwOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5mb3JtYXQgewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCQlmbGV4OiAxIDAgYXV0bzsKCQltaW4td2lkdGg6IDMwcHg7CgkJbWFyZ2luLXJpZ2h0OiAxMHB4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCQlmbGV4LWZsb3c6IGNvbHVtbjsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlwYWRkaW5nLWxlZnQ6IDNweDsKCQl6LWluZGV4OiAyMDAwOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIHsKCQljdXJzb3I6IHBvaW50ZXI7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJcGFkZGluZzogM3B4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKC0zcHgsIC02cHgpOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpub3QoLnNlbGVjdGVkKSB7CgkJbWFyZ2luLXRvcDogM3B4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uLnNlbGVjdGVkIHsKCQlvcmRlcjogLTE7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246aG92ZXIgewoJCWJhY2tncm91bmQtY29sb3I6IHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJfQoJc3Bhbi5jb25maWctdmFsdWUgewoJCWZvbnQtd2VpZ2h0OiBub3JtYWw7CgkJY29sb3I6IHZhcigtLXBsdXRvLW91dHB1dC1jb2xvcik7CgkJZGlzcGxheTogbm9uZTsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIGNhbGMoLTEwMCUgLSAxMHB4KSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLmxhYmVsIHsKCQl1c2VyLXNlbGVjdDogbm9uZTsKCX0KCS5sYWJlbDpob3ZlciBzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCW1pbi13aWR0aDogMTUwcHg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4ubWF0Y2hpbmctY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLW1hY3JvLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5kaWZmZXJlbnQtY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLXRhZy1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9Cjwvc3R5bGU+CmApCgpsZXQgb3JpZ2luYWxfaGVpZ2h0ID0gcGxvdF9vYmoubGF5b3V0LmhlaWdodApsZXQgb3JpZ2luYWxfd2lkdGggPSBwbG90X29iai5sYXlvdXQud2lkdGgKLy8gRm9yIHRoZSBoZWlnaHQgd2UgaGF2ZSB0byBhbHNvIHB1dCBhIGZpeGVkIHZhbHVlIGluIGNhc2UgdGhlIHBsb3QgaXMgcHV0IG9uIGEgbm9uLWZpeGVkLXNpemUgY29udGFpbmVyIChsaWtlIHRoZSBkZWZhdWx0IHdyYXBwZXIpCi8vIFdlIGRlZmluZSBhIHZhcmlhYmxlIHRvIGNoZWNrIHdoZXRoZXIgd2Ugc3RpbGwgaGF2ZSB0byByZW1vdmUgdGhlIGZpeGVkIGhlaWdodApsZXQgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmlyc3RSdW4KbGV0IGNvbnRhaW5lcl9oZWlnaHQgPSBvcmlnaW5hbF9oZWlnaHQgPz8gUExPVC5jb250YWluZXJfaGVpZ2h0ID8/IDQwMApDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX2hlaWdodCArICdweCcKCi8vIFdlIGNyZWF0ZSBhIFByb21pc2UgdmVyc2lvbiBvZiBzZXRUaW1lb3V0CmZ1bmN0aW9uIGRlbGF5KG1zKSB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7Cn0KCi8vIFdlIGltcG9ydCBpbnRlcmFjdCBmb3IgZHJhZ2dpbmcvcmVzaXppbmcKY29uc3QgeyBkZWZhdWx0OiBpbnRlcmFjdCB9ID0gYXdhaXQgaW1wb3J0KCdodHRwczovL2VzbS5zaC9pbnRlcmFjdGpzQDEuMTAuMTknKQoKCmZ1bmN0aW9uIGdldEltYWdlT3B0aW9ucygpIHsKICBjb25zdCBvID0gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogIHJldHVybiB7CiAgICBmb3JtYXQ6IG8uZm9ybWF0ID8/ICJwbmciLAogICAgd2lkdGg6IG8ud2lkdGggPz8gb3JpZ2luYWxfd2lkdGgsCiAgICBoZWlnaHQ6IG8uaGVpZ2h0ID8/IG9yaWdpbmFsX2hlaWdodCwKICAgIHNjYWxlOiBvLnNjYWxlID8/IDEsCiAgICBmaWxlbmFtZTogby5maWxlbmFtZSA/PyAibmV3cGxvdCIsCiAgfTsKfQoKY29uc3QgQ0xJUEJPQVJEX0hFQURFUiA9CiAgQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoIi5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIikgPz8KICBDT05UQUlORVIuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgImFmdGVyYmVnaW4iLAogICAgaHRtbGA8ZGl2IGNsYXNzPSJwbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIGhpZGRlbiI+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmb3JtYXQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+Rm9ybWF0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZvcm1hdCI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB3aWR0aCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5XaWR0aDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSB3aWR0aCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGhlaWdodCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5IZWlnaHQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgaGVpZ2h0Ij48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2NhbGUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+U2NhbGU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgc2NhbGUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzZXQiPlNldDwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB1bnNldCI+VW5zZXQ8L2J1dHRvbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZpbGVuYW1lIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZpbGVuYW1lOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZpbGVuYW1lIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgIDwvZGl2PmAKICApOwoKZnVuY3Rpb24gY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcikgewogIGNvbnN0IHZhbGlkX2NsYXNzZXMgPSBbCiAgICAibWlzc2luZy1jb25maWciLAogICAgIm1hdGNoaW5nLWNvbmZpZyIsCiAgICAiZGlmZmVyZW50LWNvbmZpZyIsCiAgXTsKICBmdW5jdGlvbiBzZXRDbGFzcyhjbCkgewogICAgZm9yIChjb25zdCBuYW1lIG9mIHZhbGlkX2NsYXNzZXMpIHsKICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUobmFtZSwgbmFtZSA9PSBjbCk7CiAgICB9CiAgfQogIC8vIFdlIHVzZSB0aGUgY3VzdG9tIGdldHRlcnMgd2UnbGwgc2V0IHVwIGluIHRoZSBjb250YWluZXIKICBjb25zdCB7IHVpX3ZhbHVlLCBjb25maWdfdmFsdWUsIGNvbmZpZ19zcGFuLCBrZXkgfSA9IGNvbnRhaW5lcjsKICBpZiAoY29uZmlnX3ZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgIHNldENsYXNzKCJtaXNzaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBpcyBub3QgcHJlc2VudCBpbiB0aGUgY29uZmlnLmA7CiAgfSBlbHNlIGlmICh1aV92YWx1ZSA9PSBjb25maWdfdmFsdWUpIHsKICAgIHNldENsYXNzKCJtYXRjaGluZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIHRoZSBzYW1lIHZhbHVlIGluIHRoZSBjb25maWcgYW5kIGluIHRoZSBoZWFkZXIuYDsKICB9IGVsc2UgewogICAgc2V0Q2xhc3MoImRpZmZlcmVudC1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIGEgZGlmZmVyZW50IHZhbHVlICg8ZW0+JHtjb25maWdfdmFsdWV9PC9lbT4pIGluIHRoZSBjb25maWcuYDsKICB9CiAgLy8gQWRkIGluZm8gYWJvdXQgc2V0dGluZyBhbmQgdW5zZXR0aW5nCiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIG9uIHRoZSBsYWJlbCA8ZW0+PGI+b25jZTwvYj48L2VtPiB0byBzZXQgdGhlIGN1cnJlbnQgVUkgdmFsdWUgaW4gdGhlIGNvbmZpZy5gCiAgKTsKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgPGVtPjxiPnR3aWNlPC9iPjwvZW0+IHRvIHJlbW92ZSB0aGlzIGtleSBmcm9tIHRoZSBjb25maWcuYAogICk7Cn0KCmNvbnN0IHZhbGlkX2Zvcm1hdHMgPSBbInBuZyIsICJzdmciLCAid2VicCIsICJqcGVnIiwgImZ1bGwtanNvbiJdOwpmdW5jdGlvbiBpbml0aWFsaXplVUlWYWx1ZVNwYW4oc3Bhbiwga2V5LCB2YWx1ZSkgewogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSBrZXkgPT09ICJmb3JtYXQiID8gImZhbHNlIiA6ICJ0cnVlIjsKICBsZXQgcGFyc2UgPSAoeCkgPT4geDsKICBsZXQgdXBkYXRlID0gKHgpID0+IChzcGFuLnRleHRDb250ZW50ID0geCk7CiAgaWYgKGtleSA9PT0gIndpZHRoIiB8fCBrZXkgPT09ICJoZWlnaHQiKSB7CiAgICBwYXJzZSA9ICh4KSA9PiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoeCkpOwogIH0gZWxzZSBpZiAoa2V5ID09PSAic2NhbGUiKSB7CiAgICBwYXJzZSA9IHBhcnNlRmxvYXQ7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAvLyBXZSByZW1vdmUgY29udGVudEVkaXRhYmxlCiAgICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9ICJmYWxzZSI7CiAgICAvLyBIZXJlIHdlIGZpcnN0IGFkZCB0aGUgc3Vic3BhbnMgZm9yIGVhY2ggb3B0aW9uCiAgICBjb25zdCBvcHRzX2RpdiA9IHNwYW4uYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2IGNsYXNzPSJmb3JtYXQtb3B0aW9ucyI+PC9kaXY+YCk7CiAgICBmb3IgKGNvbnN0IGZtdCBvZiB2YWxpZF9mb3JtYXRzKSB7CiAgICAgIGNvbnN0IG9wdCA9IG9wdHNfZGl2LmFwcGVuZENoaWxkKAogICAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImZvcm1hdC1vcHRpb24gJHtmbXR9Ij4ke2ZtdH08L3NwYW4+YAogICAgICApOwogICAgICBvcHQub25jbGljayA9IChlKSA9PiB7CiAgICAgICAgc3Bhbi52YWx1ZSA9IG9wdC50ZXh0Q29udGVudDsKICAgICAgfTsKICAgIH0KICAgIHBhcnNlID0gKHgpID0+IHsKICAgICAgcmV0dXJuIHZhbGlkX2Zvcm1hdHMuaW5jbHVkZXMoeCkgPyB4IDogbG9jYWxWYWx1ZTsKICAgIH07CiAgICB1cGRhdGUgPSAoeCkgPT4gewogICAgICBmb3IgKGNvbnN0IG9wdCBvZiBvcHRzX2Rpdi5jaGlsZHJlbikgewogICAgICAgIG9wdC5jbGFzc0xpc3QudG9nZ2xlKCJzZWxlY3RlZCIsIG9wdC50ZXh0Q29udGVudCA9PT0geCk7CiAgICAgIH0KICAgIH07CiAgfSBlbHNlIHsKICAgIC8vIFdlIG9ubHkgaGF2ZSBmaWxlbmFtZSBoZXJlCiAgfQogIGxldCBsb2NhbFZhbHVlOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIGxvY2FsVmFsdWU7CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIGlmICh2YWwgIT09ICIiKSB7CiAgICAgICAgbG9jYWxWYWx1ZSA9IHBhcnNlKHZhbCk7CiAgICAgIH0KICAgICAgdXBkYXRlKGxvY2FsVmFsdWUpOwogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7CiAgLy8gV2UgYWxzbyBhc3NpZ24gYSBsaXN0ZW5lciBzbyB0aGF0IHRoZSBlZGl0YWJsZSBpcyBibHVycmVkIHdoZW4gZW50ZXIgaXMgcHJlc3NlZAogIHNwYW4ub25rZXlkb3duID0gKGUpID0+IHsKICAgIGlmIChlLmtleUNvZGUgPT09IDEzKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgc3Bhbi5ibHVyKCk7CiAgICB9CiAgfTsKICBzcGFuLnZhbHVlID0gdmFsdWU7Cn0KCmZ1bmN0aW9uIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oc3Bhbiwga2V5KSB7CiAgLy8gSGVyZSB3ZSBtb3N0bHkgd2FudCB0byBkZWZpbmUgdGhlIHNldHRlciBhbmQgZ2V0dGVyCiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgLy8gaWYgdW5kZWZpbmVkIGlzIHBhc3NlZCwgd2UgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBvcHRpb25zCiAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGRlbGV0ZSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XSA9IHZhbDsKICAgICAgfQogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7Cn0KCmNvbnN0IGNvbmZpZ19zcGFucyA9IHt9Owpmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhnZXRJbWFnZU9wdGlvbnMoKSkpIHsKICBjb25zdCBjb250YWluZXIgPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoYC5jbGlwYm9hcmQtc3Bhbi4ke2tleX1gKTsKICBjb25zdCBsYWJlbCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIubGFiZWwiKTsKICAvLyBXZSBnaXZlIHRoZSBsYWJlbCBhIGZ1bmN0aW9uIHRoYXQgb24gc2luZ2xlIGNsaWNrIHdpbGwgc2V0IHRoZSBjdXJyZW50IHZhbHVlIGFuZCB3aXRoIGRvdWJsZSBjbGljayB3aWxsIHVuc2V0IGl0CiAgbGFiZWwub25jbGljayA9IER1YWxDbGljaygKICAgICgpID0+IHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0sCiAgICAoZSkgPT4gewogICAgICBjb25zb2xlLmxvZygiZSIsIGUpOwogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSB1bmRlZmluZWQ7CiAgICB9CiAgKTsKICBjb25zdCB1aV92YWx1ZV9zcGFuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtdmFsdWUiKTsKICBjb25zdCBjb25maWdfdmFsdWVfc3BhbiA9CiAgICBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNvbmZpZy12YWx1ZSIpID8/CiAgICBsYWJlbC5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAgICJhZnRlcmJlZ2luIiwKICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iY29uZmlnLXZhbHVlIj48L3NwYW4+YAogICAgKTsKICAvLyBBc3NpbmcgdGhlIHR3byBzcGFucyBhcyBwcm9wZXJ0aWVzIG9mIHRoZSBjb250YWluaW5nIHNwYW4KICBjb250YWluZXIudWlfc3BhbiA9IHVpX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmNvbmZpZ19zcGFuID0gY29uZmlnX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmtleSA9IGtleTsKICBjb25maWdfc3BhbnNba2V5XSA9IGNvbnRhaW5lcjsKICBpZiAoZmlyc3RSdW4pIHsKICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA9CiAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICAgIC8vIFdlIGRvIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdmFsdWUgc3BhbgogICAgaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHVpX3ZhbHVlX3NwYW4sIGtleSwgdmFsdWUpOwogICAgLy8gVGhlbiB3ZSBpbml0aWFsaXplIHRoZSBjb25maWcgdmFsdWUKICAgIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oY29uZmlnX3ZhbHVlX3NwYW4sIGtleSk7CiAgICAvLyBXZSBwdXQgc29tZSBjb252ZW5pZW5jZSBnZXR0ZXJzL3NldHRlcnMKICAgIC8vIHVpX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJ1aV92YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiB1aV92YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICB1aV92YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgICAvLyBjb25maWdfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgImNvbmZpZ192YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICB9Cn0KCi8vIFRoZXNlIG9iamVjdHMgd2lsbCBjb250YWluIHRoZSBkZWZhdWx0IHZhbHVlCgovLyBUaGlzIGNvZGUgdXBkYXRlcyB0aGUgaW1hZ2Ugb3B0aW9ucyBpbiB0aGUgUExPVCBjb25maWcgd2l0aCB0aGUgcHJvdmlkZWQgb25lcwpmdW5jdGlvbiBzZXRJbWFnZU9wdGlvbnMobykgewogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gb1trZXldOwogIH0KfQpmdW5jdGlvbiB1bnNldEltYWdlT3B0aW9ucygpIHsKICBzZXRJbWFnZU9wdGlvbnMoe30pOwp9Cgpjb25zdCBzZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4uc2V0Iik7CmNvbnN0IHVuc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnVuc2V0Iik7CmlmIChmaXJzdFJ1bikgewogIHNldF9idXR0b24ub25jbGljayA9IChlKSA9PiB7CiAgICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0KICB9OwogIHVuc2V0X2J1dHRvbi5vbmNsaWNrID0gdW5zZXRJbWFnZU9wdGlvbnM7Cn0KCi8vIFdlIGFkZCBhIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBjbGlwYm9hcmQgaXMgcG9wcGVkIG91dApDT05UQUlORVIuaXNQb3BwZWRPdXQgPSAoKSA9PiB7CiAgcmV0dXJuIENPTlRBSU5FUi5jbGFzc0xpc3QuY29udGFpbnMoInBvcHBlZC1vdXQiKTsKfTsKCkNMSVBCT0FSRF9IRUFERVIub25tb3VzZWRvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHsKICBpZiAoZXZlbnQudGFyZ2V0Lm1hdGNoZXMoInNwYW4uY2xpcGJvYXJkLXZhbHVlIikpIHsKICAgIGNvbnNvbGUubG9nKCJXZSBkb24ndCBtb3ZlISIpOwogICAgcmV0dXJuOwogIH0KICBjb25zdCBzdGFydCA9IHsKICAgIGxlZnQ6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLmxlZnQpLAogICAgdG9wOiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS50b3ApLAogICAgWDogZXZlbnQucGFnZVgsCiAgICBZOiBldmVudC5wYWdlWSwKICB9OwogIGZ1bmN0aW9uIG1vdmVBdChldmVudCwgc3RhcnQpIHsKICAgIGNvbnN0IHRvcCA9IGV2ZW50LnBhZ2VZIC0gc3RhcnQuWSArIHN0YXJ0LnRvcCArICJweCI7CiAgICBjb25zdCBsZWZ0ID0gZXZlbnQucGFnZVggLSBzdGFydC5YICsgc3RhcnQubGVmdCArICJweCI7CiAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9IHRvcDsKICB9CgogIC8vIG1vdmUgb3VyIGFic29sdXRlbHkgcG9zaXRpb25lZCBiYWxsIHVuZGVyIHRoZSBwb2ludGVyCiAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQpIHsKICAgIG1vdmVBdChldmVudCwgc3RhcnQpOwogIH0KCiAgLy8gV2UgdXNlIHRoaXMgdG8gcmVtb3ZlIHRoZSBtb3VzZW1vdmUgd2hlbiBjbGlja2luZyBvdXRzaWRlIG9mIHRoZSBjb250YWluZXIKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICAvLyBtb3ZlIHRoZSBjb250YWluZXIgb24gbW91c2Vtb3ZlCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgb25Nb3VzZU1vdmUsIHsKICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsCiAgfSk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgY2xlYW5VcCgpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7CgogIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICBjb25zb2xlLmxvZygiY2xlYW5pbmcgdXAgdGhlIHBsb3QgbW92ZSBsaXN0ZW5lciIpOwogICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBudWxsOwogIH0KCiAgLy8gKDMpIGRyb3AgdGhlIGJhbGwsIHJlbW92ZSB1bm5lZWRlZCBoYW5kbGVycwogIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gY2xlYW5VcDsKfTsKCmZ1bmN0aW9uIHNlbmRUb0NsaXBib2FyZChibG9iKSB7CiAgaWYgKCFuYXZpZ2F0b3IuY2xpcGJvYXJkKSB7CiAgICBhbGVydCgKICAgICAgIlRoZSBDbGlwYm9hcmQgQVBJIGRvZXMgbm90IHNlZW0gdG8gYmUgYXZhaWxhYmxlLCBtYWtlIHN1cmUgdGhlIFBsdXRvIG5vdGVib29rIGlzIGJlaW5nIHVzZWQgZnJvbSBlaXRoZXIgbG9jYWxob3N0IG9yIGFuIGh0dHBzIHNvdXJjZS4iCiAgICApOwogIH0KICBuYXZpZ2F0b3IuY2xpcGJvYXJkCiAgICAud3JpdGUoWwogICAgICBuZXcgQ2xpcGJvYXJkSXRlbSh7CiAgICAgICAgLy8gVGhlIGtleSBpcyBkZXRlcm1pbmVkIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBibG9iJ3MgdHlwZS4KICAgICAgICBbYmxvYi50eXBlXTogYmxvYiwKICAgICAgfSksCiAgICBdKQogICAgLnRoZW4oCiAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICBjb25zb2xlLmxvZygiQXN5bmM6IENvcHlpbmcgdG8gY2xpcGJvYXJkIHdhcyBzdWNjZXNzZnVsISIpOwogICAgICB9LAogICAgICBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiQXN5bmM6IENvdWxkIG5vdCBjb3B5IHRleHQ6ICIsIGVycik7CiAgICAgIH0KICAgICk7Cn0KCmZ1bmN0aW9uIGNvcHlJbWFnZVRvQ2xpcGJvYXJkKCkgewogIC8vIFdlIGV4dHJhY3QgdGhlIGltYWdlIG9wdGlvbnMgZnJvbSB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycyAoaWYgdGhleSBleGlzdCkKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LiBXZSBhbHNvIGlnbm9yZSBmb3JtYXQgYmVjYXVzZSB0aGUgY2xpcGJvYXJkIG9ubHkgc3VwcG9ydHMgcG5nLgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gImZvcm1hdCIpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LnRvSW1hZ2UoUExPVCwgY29uZmlnKS50aGVuKGZ1bmN0aW9uIChkYXRhVXJsKSB7CiAgICBmZXRjaChkYXRhVXJsKQogICAgICAudGhlbigocmVzKSA9PiByZXMuYmxvYigpKQogICAgICAudGhlbigoYmxvYikgPT4gewogICAgICAgIGNvbnN0IHBhc3RlX3JlY2VpdmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigncGFzdGUtcmVjZWl2ZXIucGx1dG9wbG90bHknKQogICAgICAgIGlmIChwYXN0ZV9yZWNlaXZlcikgewogICAgICAgICAgcGFzdGVfcmVjZWl2ZXIuYXR0YWNoSW1hZ2UoZGF0YVVybCwgQ09OVEFJTkVSKQogICAgICAgIH0KICAgICAgICBzZW5kVG9DbGlwYm9hcmQoYmxvYikKICAgICAgfSk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHNhdmVJbWFnZVRvRmlsZSgpIHsKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS5kb3dubG9hZEltYWdlKFBMT1QsIGNvbmZpZyk7Cn0KCmxldCBjb250YWluZXJfcmVjdCA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCwgdG9wOiAwLCBsZWZ0OiAwIH07CmZ1bmN0aW9uIHVucG9wX2NvbnRhaW5lcihjbCkgewogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgZmFsc2UpOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBmYWxzZSk7CiAgLy8gV2UgZml4IHRoZSBoZWlnaHQgYmFjayB0byB0aGUgdmFsdWUgaXQgaGFkIGJlZm9yZSBwb3BvdXQsIGFsc28gc2V0dGluZyB0aGUgZmxhZyB0byBzaWduYWwgdGhhdCB1cG9uIGZpcnN0IHJlc2l6ZSB3ZSByZW1vdmUgdGhlIGZpeGVkIGlubGluZS1zdHlsZQogIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQgKyAicHgiOwogIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IHRydWU7CiAgLy8gV2Ugc2V0IHRoZSBvdGhlciBmaXhlZCBpbmxpbmUtc3R5bGVzIHRvIG51bGwKICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICBDT05UQUlORVIuc3R5bGUudG9wID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBXZSBhbHNvIHJlbW92ZSB0aGUgQ0xJUEJPQVJEX0hFQURFUgogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSAiIjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBGaW5hbGx5IHdlIHJlbW92ZSB0aGUgaGlkZGVuIGNsYXNzIHRvIHRoZSBoZWFkZXIKICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIHRydWUpOwogIHJldHVybjsKfQpmdW5jdGlvbiBwb3BvdXRfY29udGFpbmVyKG9wdHMpIHsKICBjb25zdCBjbCA9IG9wdHM/LmNsOwogIGNvbnN0IHRhcmdldF9jb250YWluZXJfc2l6ZSA9IG9wdHM/LnRhcmdldF9jb250YWluZXJfc2l6ZSA/PyB7fTsKICBjb25zdCB0YXJnZXRfcGxvdF9zaXplID0gb3B0cz8udGFyZ2V0X3Bsb3Rfc2l6ZSA/PyB7fTsKICBpZiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIHJldHVybiB1bnBvcF9jb250YWluZXIoY2wpOwogIH0KICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgY2wgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdHJ1ZSk7CiAgLy8gV2UgZXh0cmFjdCB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjb250YWluZXIsIHNhdmUgdGhlbSBhbmQgZml4IHRoZW0KICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9ID0gQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogIGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfTsKICAvLyBXZSBzYXZlIHRoZSBjdXJyZW50IHBsb3Qgc2l6ZSBiZWZvcmUgd2UgcG9wIGFzIGl0IHdpbGwgZmlsbCB0aGUgc2NyZWVuCiAgY29uc3QgY3VycmVudF9wbG90X3NpemUgPSB7CiAgICB3aWR0aDogUExPVC5fZnVsbExheW91dC53aWR0aCwKICAgIGhlaWdodDogUExPVC5fZnVsbExheW91dC5oZWlnaHQsCiAgfTsKICAvLyBXZSBoYXZlIHRvIHNhdmUgdGhlIHBhZCBkYXRhIGJlZm9yZSBwb3BwaW5nIHNvIHdlIGNhbiByZXNpemUgcHJlY2lzZWx5CiAgY29uc3QgcGFkID0ge307CiAgcGFkLnVucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgdHJ1ZSk7CiAgcGFkLnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICAvLyBXZSBkbyB0b3AgYW5kIGxlZnQgYmFzZWQgb24gdGhlIGN1cnJlbnQgcmVjdAogIGZvciAoY29uc3Qga2V5IG9mIFsidG9wIiwgImxlZnQiXSkgewogICAgY29uc3Qgc3RhcnRfdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY29udGFpbmVyX3JlY3Rba2V5XTsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgZm9yIChjb25zdCBraW5kIG9mIFsicGFkZGluZyIsICJib3JkZXIiXSkgewogICAgICBvZmZzZXQgKz0gcGFkLnBvcHBlZFtraW5kXVtrZXldIC0gcGFkLnVucG9wcGVkW2tpbmRdW2tleV07CiAgICB9CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHN0YXJ0X3ZhbCAtIG9mZnNldCArICJweCI7CiAgICBpZiAoa2V5ID09PSAibGVmdCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIC8vIFdlIGNvbXB1dGUgdGhlIHdpZHRoIGFuZCBoZWlnaHQgZGVwZW5kaW5nIG9uIGV2ZW50dWFsIGNvbmZpZyBkYXRhCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoewogICAgd2lkdGg6CiAgICAgIHRhcmdldF9wbG90X3NpemUud2lkdGggPz8KICAgICAgY29uZmlnX3NwYW5zLndpZHRoLmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS5oZWlnaHQgPz8KICAgICAgY29uZmlnX3NwYW5zLmhlaWdodC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUuaGVpZ2h0LAogIH0pOwogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIGNvbnN0IHZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNzeltrZXldOwogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSB2YWwgKyAicHgiOwogICAgaWYgKGtleSA9PT0gIndpZHRoIikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCBmYWxzZSk7CiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgdW5wb3BfY29udGFpbmVyKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKfQoKQ09OVEFJTkVSLnBvcE91dCA9IHBvcG91dF9jb250YWluZXI7CgpmdW5jdGlvbiBEdWFsQ2xpY2soc2luZ2xlX2Z1bmMsIGRibF9mdW5jKSB7CiAgbGV0IG5jbGlja3MgPSAwOwogIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykgewogICAgbmNsaWNrcyArPSAxOwogICAgaWYgKG5jbGlja3MgPiAxKSB7CiAgICAgIGRibF9mdW5jKC4uLmFyZ3MpOwogICAgICBuY2xpY2tzID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIGRlbGF5KDMwMCkudGhlbigoKSA9PiB7CiAgICAgICAgaWYgKG5jbGlja3MgPT0gMSkgewogICAgICAgICAgc2luZ2xlX2Z1bmMoLi4uYXJncyk7CiAgICAgICAgfQogICAgICAgIG5jbGlja3MgPSAwOwogICAgICB9KTsKICAgIH0KICB9Owp9CgovLyBXZSByZW1vdmUgdGhlIGRlZmF1bHQgZG93bmxvYWQgaW1hZ2UgYnV0dG9uCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSwKICBbInRvSW1hZ2UiXQopOwovLyBXZSBhZGQgdGhlIGN1c3RvbSBidXR0b24gdG8gdGhlIG1vZGViYXIKcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkLAogIFsKICAgIHsKICAgICAgbmFtZTogIkNvcHkgUE5HIHRvIENsaXBib2FyZCIsCiAgICAgIGljb246IHsKICAgICAgICBoZWlnaHQ6IDUyMCwKICAgICAgICB3aWR0aDogNTIwLAogICAgICAgIHBhdGg6ICJNMjgwIDY0aDQwYzM1LjMgMCA2NCAyOC43IDY0IDY0VjQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEg2NGMtMzUuMyAwLTY0LTI4LjctNjQtNjRWMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0aDQwIDkuNkMxMjEgMjcuNSAxNTMuMyAwIDE5MiAwczcxIDI3LjUgNzguNCA2NEgyODB6TTY0IDExMmMtOC44IDAtMTYgNy4yLTE2IDE2VjQ0OGMwIDguOCA3LjIgMTYgMTYgMTZIMzIwYzguOCAwIDE2LTcuMiAxNi0xNlYxMjhjMC04LjgtNy4yLTE2LTE2LTE2SDMwNHYyNGMwIDEzLjMtMTAuNyAyNC0yNCAyNEgxOTIgMTA0Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNFYxMTJINjR6bTEyOC04YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHoiLAogICAgICB9LAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soY29weUltYWdlVG9DbGlwYm9hcmQsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKCk7CiAgICAgIH0pLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIkRvd25sb2FkIEltYWdlIiwKICAgICAgaWNvbjogUGxvdGx5Lkljb25zLmNhbWVyYSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKHNhdmVJbWFnZVRvRmlsZSwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoeyBjbDogImZpbGVzYXZlIiB9KTsKICAgICAgfSksCiAgICB9LAogIF0KKTsKCmZ1bmN0aW9uIGdldE9mZnNldERhdGEoZWwpIHsKICBsZXQgY3MgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgbnVsbCk7CiAgY29uc3Qgb2RhdGEgPSB7CiAgICBwYWRkaW5nOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgfSwKICAgIGJvcmRlcjogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgfQogIH07CiAgaWYgKGVsID09PSBQTE9UKSB7CiAgICAvLyBGb3IgdGhlIFBMT1Qgd2UgYWxzbyB3YW50IHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBvZmZzZXQKICAgIG9kYXRhLm9mZnNldCA9IHsKICAgICAgdG9wOiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldFRvcCA6IDAsCiAgICAgIGxlZnQ6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0TGVmdCA6IDAsCiAgICB9CiAgfQogIHJldHVybiBvZGF0YTsKfQpmdW5jdGlvbiBnZXRTaXplRGF0YSgpIHsKICBjb25zdCBkYXRhID0gewogICAgcGxvdF9wYWQ6IGdldE9mZnNldERhdGEoUExPVCksCiAgICBwbG90X3JlY3Q6IFBMT1QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgICBjb250YWluZXJfcGFkOiBnZXRPZmZzZXREYXRhKENPTlRBSU5FUiksCiAgICBjb250YWluZXJfcmVjdDogQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogIH07CiAgcmV0dXJuIGRhdGE7Cn0KZnVuY3Rpb24gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGNvbnN0IGNvbXB1dGVkX3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIGNvbnN0IG9mZnNldHMgPSBjb21wdXRlZF9zaXplLm9mZnNldHM7CgogIGNvbnN0IHBsb3RfZGF0YSA9IHsKICAgIHdpZHRoOiB3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiBoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfTsKCiAgcmV0dXJuIHsKICAgIHdpZHRoOiAod2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCkgKyBvZmZzZXRzLndpZHRoLAogICAgaGVpZ2h0OiAoaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0KSArIG9mZnNldHMuaGVpZ2h0LAogICAgbm9DaGFuZ2U6IHdpZHRoID09IGNvbXB1dGVkX3NpemUud2lkdGggJiYgaGVpZ2h0ID09IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH0KfQoKLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGNoYW5nZSB0aGUgY29udGFpbmVyIHNpemUgc28gdGhhdCB0aGUgcmVzdWx0aW5nIHBsb3Qgd2lsbCBiZSBtYXRjaGluZyB0aGUgcHJvdmlkZWQgc3BlY3MKZnVuY3Rpb24gY2hhbmdlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgaWYgKCFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgY29uc29sZS5sb2coIlRyaWVkIHRvIGNoYW5nZSBjb250YWluZXIgc2l6ZSB3aGVuIG5vdCBwb3BwZWQsIGlnbm9yaW5nIik7CiAgICByZXR1cm47CiAgfQoKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEpOwoKICBpZiAoY3N6Lm5vQ2hhbmdlKSB7CiAgICBjb25zb2xlLmxvZygiU2l6ZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50LCBpZ25vcmluZyIpOwogICAgcmV0dXJuCiAgfQogIC8vIFdlIGFyZSBub3cgZ29pbmcgdG8gc2V0IGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGNvbnRhaW5lcgogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gY3N6W2tleV0gKyAicHgiOwogIH0KfQovLyBXZSBub3cgY3JlYXRlIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgdXBkYXRlIHRoZSBwbG90IGJhc2VkIG9uIHRoZSB2YWx1ZXMgc3BlY2lmaWVkCmZ1bmN0aW9uIHVwZGF0ZUZyb21IZWFkZXIoKSB7CiAgY29uc3QgaGVhZGVyX2RhdGEgPSB7CiAgICBoZWlnaHQ6IGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUsCiAgICB3aWR0aDogY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlLAogIH07CiAgY2hhbmdlQ29udGFpbmVyU2l6ZShoZWFkZXJfZGF0YSk7Cn0KLy8gV2UgYXNzaWduIHRoaXMgZnVuY3Rpb24gdG8gdGhlIG9uYmx1ciBldmVudCBvZiB3aWR0aCBhbmQgaGVpZ2h0CmlmIChmaXJzdFJ1bikgewogIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLnVpX3NwYW4ub25ibHVyID0gKGUpID0+IHsKICAgICAgY29udGFpbmVyLnVpX3ZhbHVlID0gY29udGFpbmVyLnVpX3NwYW4udGV4dENvbnRlbnQ7CiAgICAgIHVwZGF0ZUZyb21IZWFkZXIoKTsKICAgIH07CiAgfQp9Ci8vIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIHBsb3Qgc2l6ZSB0byB1c2UgZm9yIHJlbGF5b3V0IGFzIGEgZnVuY3Rpb24gb2YgdGhlIGNvbnRhaW5lciBzaXplCmZ1bmN0aW9uIGNvbXB1dGVQbG90U2l6ZShkYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIC8vIFJlbW92ZSBQYWRkaW5nCiAgY29uc3QgeyBjb250YWluZXJfcGFkLCBwbG90X3BhZCwgY29udGFpbmVyX3JlY3QgfSA9IGRhdGE7CiAgY29uc3Qgb2Zmc2V0cyA9IHsKICAgIHdpZHRoOgogICAgICBwbG90X3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLndpZHRoICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LmxlZnQgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci53aWR0aCwKICAgIGhlaWdodDoKICAgICAgcGxvdF9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBwbG90X3BhZC5ib3JkZXIuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LnRvcCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci5oZWlnaHQsCiAgfTsKICBjb25zdCBzeiA9IHsKICAgIHdpZHRoOiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LndpZHRoIC0gb2Zmc2V0cy53aWR0aCksCiAgICBoZWlnaHQ6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3QuaGVpZ2h0IC0gb2Zmc2V0cy5oZWlnaHQpLAogICAgb2Zmc2V0cywKICB9OwogIHJldHVybiBzejsKfQoKLy8gQ3JlYXRlIHRoZSByZXNpemVPYnNlcnZlciB0byBtYWtlIHRoZSBwbG90IGV2ZW4gbW9yZSByZXNwb25zaXZlISA6bWFnaWM6CmNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7CiAgY29uc3Qgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpOwogIGNvbnN0IHtjb250YWluZXJfcmVjdCwgY29udGFpbmVyX3BhZH0gPSBzaXplRGF0YTsKICBsZXQgcGxvdF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICAvLyBXZSBzYXZlIHRoZSBoZWlnaHQgaW4gdGhlIFBMT1Qgb2JqZWN0CiAgUExPVC5jb250YWluZXJfaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0OwogIC8vIFdlIGRlYWwgd2l0aCBzb21lIHN0dWZmIGlmIHRoZSBjb250YWluZXIgaXMgcG9wcHBlZAogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSBjb250YWluZXJfcmVjdC53aWR0aCArICJweCI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gY29udGFpbmVyX3JlY3QubGVmdCArICJweCI7CiAgY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS5oZWlnaHQ7CiAgY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlID0gcGxvdF9zaXplLndpZHRoOwogIC8qIAoJCVRoZSBhZGRpdGlvbiBvZiB0aGUgaW52YWxpZCBhcmd1bWVudCBgcGx1dG9yZXNpemVgIHNlZW1zIHRvIGZpeCB0aGUgcHJvYmxlbSB3aXRoIGNhbGxpbmcgYHJlbGF5b3V0YCBzaW1wbHkgd2l0aCBge2F1dG9zaXplOiB0cnVlfWAgYXMgdXBkYXRlIGJyZWFraW5nIG1vdXNlIHJlbGF5b3V0IGV2ZW50cyB0cmFja2luZy4gCgkJU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wbG90bHkvcGxvdGx5LmpzL2lzc3Vlcy82MTU2IGZvciBkZXRhaWxzCgkJKi8KICBsZXQgY29uZmlnID0gewogICAgLy8gSWYgdGhpcyBpcyBwb3BwZWQgb3V0LCB3ZSBpZ25vcmUgdGhlIG9yaWdpbmFsIHdpZHRoL2hlaWdodAogICAgd2lkdGg6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX3dpZHRoKSA/PyBwbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX2hlaWdodCkgPz8gcGxvdF9zaXplLmhlaWdodCwKICAgIHBsdXRvcmVzaXplOiB0cnVlLAogIH07CiAgUGxvdGx5LnJlbGF5b3V0KFBMT1QsIGNvbmZpZykudGhlbigoKSA9PiB7CiAgICBpZiAocmVtb3ZlX2NvbnRhaW5lcl9zaXplICYmICFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBhdm9pZCB0aGUgZmlyc3QgcmVzaXplIHVwb24gcGxvdCBjcmVhdGlvbiB0byBhbHJlYWR5IGJlIHdpdGhvdXQgYSBmaXhlZCBoZWlnaHQKICAgICAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9ICIiOwogICAgICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICAgICAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmFsc2U7CiAgICB9CiAgfSk7Cn0pOwoKcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShDT05UQUlORVIpOwoKClBsb3RseS5yZWFjdChQTE9ULCBwbG90X29iaikudGhlbigoKSA9PiB7CgkvLyBBc3NpZ24gdGhlIFBsb3RseSBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhwbG90bHlfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1Qub24oa2V5LCBsaXN0ZW5lcikKCQl9Cgl9CgkvLyBBc3NpZ24gdGhlIEpTIGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKGpzX2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULmFkZEV2ZW50TGlzdGVuZXIoa2V5LCBsaXN0ZW5lciwgewoJCQkJc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbAoJCQl9KQoJCX0KCX0KfQopCgoKaW52YWxpZGF0aW9uLnRoZW4oKCkgPT4gewoJLy8gUmVtb3ZlIGFsbCBwbG90bHkgbGlzdGVuZXJzCglQTE9ULnJlbW92ZUFsbExpc3RlbmVycygpCgkvLyBSZW1vdmUgYWxsIEpTIGxpc3RlbmVycwoJY29udHJvbGxlci5hYm9ydCgpCgkvLyBSZW1vdmUgdGhlIHJlc2l6ZU9ic2VydmVyCglyZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCkKfSkKCgoKCQlyZXR1cm4gQ09OVEFJTkVSCgk8L3NjcmlwdD4KpG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv6LqHa6KsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SRkOTcxNWJjMS00OWNkLTRkZjgtOGRiZi1jMDZkZTQyYWQ1NTC5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc6XyeNjtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5HZNTBiY2Q4ZTkwLTgxODEtMTFlZi0yNGMwLWYxNGY2YTRkMzA4NC84MjQxM2MwODU2OTEwOTQyuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYYqmcXVldWVkwqRsb2dz3ACGiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5Knbm90aGluZ6p0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5K0MC4wMDc1NzU3NTc1NzU3NTc1NzaqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OStDAuMDE1MTUxNTE1MTUxNTE1MTUyqnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrQwLjAyMjcyNzI3MjcyNzI3MjcyOKp0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5K0MC4wMzAzMDMwMzAzMDMwMzAzMDSqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSszAuMDM3ODc4Nzg3ODc4Nzg3ODiqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OStDAuMDQ1NDU0NTQ1NDU0NTQ1NDU2qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjA1MzAzMDMwMzAzMDMwMzAzqnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjA2MDYwNjA2MDYwNjA2MDYxqnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjA2ODE4MTgxODE4MTgxODE4qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjA3NTc1NzU3NTc1NzU3NTc2qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjA4MzMzMzMzMzMzMzMzMzMzqnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjA5MDkwOTA5MDkwOTA5MDkxqnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjA5ODQ4NDg0ODQ4NDg0ODQ4qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjEwNjA2MDYwNjA2MDYwNjA2qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjExMzYzNjM2MzYzNjM2MzYzqnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjEyMTIxMjEyMTIxMjEyMTIyqnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjEyODc4Nzg3ODc4Nzg3ODc4qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjEzNjM2MzYzNjM2MzYzNjM1qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjE0MzkzOTM5MzkzOTM5Mzk1qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjE1MTUxNTE1MTUxNTE1MTUyqnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjE1OTA5MDkwOTA5MDkwOTGqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSszAuMTY2NjY2NjY2NjY2NjY2NjaqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSszAuMTc0MjQyNDI0MjQyNDI0MjWqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSszAuMTgxODE4MTgxODE4MTgxODKqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuMTg5MzkzOTM5MzkzOTM5NKp0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KzMC4xOTY5Njk2OTY5Njk2OTY5Nqp0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KzMC4yMDQ1NDU0NTQ1NDU0NTQ1Nqp0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KzMC4yMTIxMjEyMTIxMjEyMTIxM6p0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC4yMTk2OTY5Njk2OTY5Njk3qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjIyNzI3MjcyNzI3MjcyNzI3qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjIzNDg0ODQ4NDg0ODQ4NDg2qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjI0MjQyNDI0MjQyNDI0MjQzqnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkqQwLjI1qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjI1NzU3NTc1NzU3NTc1NzU3qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjI2NTE1MTUxNTE1MTUxNTE0qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjI3MjcyNzI3MjcyNzI3MjeqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuMjgwMzAzMDMwMzAzMDMwM6p0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC4yODc4Nzg3ODc4Nzg3ODc5qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjI5NTQ1NDU0NTQ1NDU0NTQ3qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjMwMzAzMDMwMzAzMDMwMzA0qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjMxMDYwNjA2MDYwNjA2MDaqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuMzE4MTgxODE4MTgxODE4Mqp0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KzMC4zMjU3NTc1NzU3NTc1NzU3Nap0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC4zMzMzMzMzMzMzMzMzMzMzqnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjM0MDkwOTA5MDkwOTA5MDmqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuMzQ4NDg0ODQ4NDg0ODQ4Nap0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC4zNTYwNjA2MDYwNjA2MDYxqnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjM2MzYzNjM2MzYzNjM2MzY1qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjM3MTIxMjEyMTIxMjEyMTKqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuMzc4Nzg3ODc4Nzg3ODc4OKp0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KzMC4zODYzNjM2MzYzNjM2MzYzNap0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC4zOTM5MzkzOTM5MzkzOTM5qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjQwMTUxNTE1MTUxNTE1MTWqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuNDA5MDkwOTA5MDkwOTA5Map0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC40MTY2NjY2NjY2NjY2NjY3qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjQyNDI0MjQyNDI0MjQyNDI1qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjQzMTgxODE4MTgxODE4MTiqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuNDM5MzkzOTM5MzkzOTM5NKp0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KzMC40NDY5Njk2OTY5Njk2OTY5Nqp0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KzMC40NTQ1NDU0NTQ1NDU0NTQ1M6p0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC40NjIxMjEyMTIxMjEyMTIxqnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjQ2OTY5Njk2OTY5Njk2OTeqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuNDc3MjcyNzI3MjcyNzI3M6p0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KzMC40ODQ4NDg0ODQ4NDg0ODQ4Nqp0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KzMC40OTI0MjQyNDI0MjQyNDI0M6p0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KjMC41qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjUwNzU3NTc1NzU3NTc1NzaqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuNTE1MTUxNTE1MTUxNTE1Map0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC41MjI3MjcyNzI3MjcyNzI3qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjUzMDMwMzAzMDMwMzAzMDOqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuNTM3ODc4Nzg3ODc4Nzg3OKp0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC41NDU0NTQ1NDU0NTQ1NDU0qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrEwLjU1MzAzMDMwMzAzMDMwM6p0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC41NjA2MDYwNjA2MDYwNjA2qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjU2ODE4MTgxODE4MTgxODKqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuNTc1NzU3NTc1NzU3NTc1OKp0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC41ODMzMzMzMzMzMzMzMzM0qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjU5MDkwOTA5MDkwOTA5MDmqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuNTk4NDg0ODQ4NDg0ODQ4Nap0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC42MDYwNjA2MDYwNjA2MDYxqnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjYxMzYzNjM2MzYzNjM2MzaqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuNjIxMjEyMTIxMjEyMTIxMqp0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC42Mjg3ODc4Nzg3ODc4Nzg4qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjYzNjM2MzYzNjM2MzYzNjSqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuNjQzOTM5MzkzOTM5MzkzOap0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC42NTE1MTUxNTE1MTUxNTE1qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjY1OTA5MDkwOTA5MDkwOTGqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuNjY2NjY2NjY2NjY2NjY2Nqp0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC42NzQyNDI0MjQyNDI0MjQyqnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjY4MTgxODE4MTgxODE4MTiqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuNjg5MzkzOTM5MzkzOTM5NKp0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KxMC42OTY5Njk2OTY5Njk2OTeqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuNzA0NTQ1NDU0NTQ1NDU0Nqp0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC43MTIxMjEyMTIxMjEyMTIyqnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjcxOTY5Njk2OTY5Njk2OTeqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuNzI3MjcyNzI3MjcyNzI3M6p0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC43MzQ4NDg0ODQ4NDg0ODQ5qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjc0MjQyNDI0MjQyNDI0MjSqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSpDAuNzWqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuNzU3NTc1NzU3NTc1NzU3Nqp0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC43NjUxNTE1MTUxNTE1MTUxqnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjc3MjcyNzI3MjcyNzI3MjeqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuNzgwMzAzMDMwMzAzMDMwM6p0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC43ODc4Nzg3ODc4Nzg3ODc4qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjc5NTQ1NDU0NTQ1NDU0NTSqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsTAuODAzMDMwMzAzMDMwMzAzqnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjgxMDYwNjA2MDYwNjA2MDaqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuODE4MTgxODE4MTgxODE4Mqp0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC44MjU3NTc1NzU3NTc1NzU4qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjgzMzMzMzMzMzMzMzMzMzSqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuODQwOTA5MDkwOTA5MDkwOap0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC44NDg0ODQ4NDg0ODQ4NDg1qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjg1NjA2MDYwNjA2MDYwNjGqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuODYzNjM2MzYzNjM2MzYzNqp0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC44NzEyMTIxMjEyMTIxMjEyqnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjg3ODc4Nzg3ODc4Nzg3ODiqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuODg2MzYzNjM2MzYzNjM2NKp0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC44OTM5MzkzOTM5MzkzOTM5qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjkwMTUxNTE1MTUxNTE1MTWqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuOTA5MDkwOTA5MDkwOTA5Map0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC45MTY2NjY2NjY2NjY2NjY2qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjkyNDI0MjQyNDI0MjQyNDKqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuOTMxODE4MTgxODE4MTgxOKp0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC45MzkzOTM5MzkzOTM5Mzk0qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrEwLjk0Njk2OTY5Njk2OTY5N6p0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC45NTQ1NDU0NTQ1NDU0NTQ2qnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjk2MjEyMTIxMjEyMTIxMjKqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuOTY5Njk2OTY5Njk2OTY5N6p0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC45NzcyNzI3MjcyNzI3MjczqnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjk4NDg0ODQ4NDg0ODQ4NDmqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuOTkyNDI0MjQyNDI0MjQyNKp0ZXh0L3BsYWluomlk2SQ1NmE3MTNkNS0zZDczLTRkNjItYTAzMC1hZTYzM2M0M2Q5ZTGkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KjMS4wqnRleHQvcGxhaW6iaWTZJDU2YTcxM2Q1LTNkNzMtNGQ2Mi1hMDMwLWFlNjMzYzQzZDllMaRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkqYiZG9uZSKqdGV4dC9wbGFpbqJpZNkkNTZhNzEzZDUtM2Q3My00ZDYyLWEwMzAtYWU2MzNjNDNkOWUxpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKadydW5uaW5nwqZvdXRwdXSGpGJvZHmgpG1pbWWqdGV4dC9wbGFpbqxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b+i7kxHmbBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXPAAAAAltxpW61cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQ5ZTM5NzQyNi1iNjBiLTRiOTgtYmU4Yi1mN2YxMjg2MjFjNDSKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52gEkU2Nhbm5lcgogIEIwOiBGbG9hdDY0IDAuNTUKICBCMTogRmxvYXQ2NCAxLjBlLTUKICBHbWF4OiBGbG9hdDY0IDAuMDQKICBTbWF4OiBGbG9hdDY0IDI1LjAKICBBRENfzpR0OiBGbG9hdDY0IDIuMGUtNgogIHNlcV/OlHQ6IEZsb2F0NjQgMS4wZS01CiAgR1JfzpR0OiBGbG9hdDY0IDEuMGUtNQogIFJGX86UdDogRmxvYXQ2NCAxLjBlLTYKICBSRl9yaW5nX2Rvd25fVDogRmxvYXQ2NCAyLjBlLTUKICBSRl9kZWFkX3RpbWVfVDogRmxvYXQ2NCAwLjAwMDEKICBBRENfZGVhZF90aW1lX1Q6IEZsb2F0NjQgMS4wZS01CqRtaW1lqnRleHQvcGxhaW6scm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/ot7ZLRuwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJDllMzk3NDI2LWI2MGItNGI5OC1iZThiLWY3ZjEyODYyMWM0NLlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzZJ8tXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkZDA1ZGNiYTctMmY0Mi00N2JmLWExNzItNjEyM2QwMTEzYjNmiqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9keYWmcHJlZml4sURpY3R7U3RyaW5nLCBBbnl9qGVsZW1lbnRzlZKSpSJncHUiqnRleHQvcGxhaW6SpWZhbHNlqnRleHQvcGxhaW6SkqoiTnRocmVhZHMiqnRleHQvcGxhaW6SoTGqdGV4dC9wbGFpbpKSrCJzaW1fbWV0aG9kIqp0ZXh0L3BsYWlukrdCbG9jaERpY3Qoc2F2ZV9Nej10cnVlKap0ZXh0L3BsYWlukpKtInJldHVybl90eXBlIqp0ZXh0L3BsYWlukqUibWF0Iqp0ZXh0L3BsYWlukpKoIs6UdF9yZiKqdGV4dC9wbGFpbpKmMC4wMDA1qnRleHQvcGxhaW6kdHlwZaREaWN0rHByZWZpeF9zaG9ydKREaWN0qG9iamVjdGlksDhiZjc0NDk0NWE1NWE5MGOkbWltZdkhYXBwbGljYXRpb24vdm5kLnBsdXRvLnRyZWUrb2JqZWN0rHJvb3Rhc3NpZ25lZapzaW1fcGFyYW1zsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b+i32xHlbBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkZDA1ZGNiYTctMmY0Mi00N2JmLWExNzItNjEyM2QwMTEzYjNmuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXN5Pu1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQzOWY0NDAyNS0yOTc0LTRjNGMtYjBjMi1lMjEzOTliYmRiMWaKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52gGHPGRpdiBjbGFzcz0ibWFya2Rvd24iPjxoMj4yLjEuIEZsaXAgYW5nbGUgb3B0aW1pemF0aW9uPC9oMj4KPHA+Rm9yIHRoZSBmaXJzdCBzaW11bGF0aW9uIGV4cGVyaW1lbnQsIFNOUiB3YXMgbWF4aW1pemVkIGJ5IHZhcnlpbmcgdGhlIGltYWdpbmcgZmxpcCBhbmdsZSAmIzQwO2JldHdlZW4gMjAgYW5kIDE4MCBkZWcmIzQxOy4gVG8gb3B0aW1pemUgU05SIGluZGVwZW5kZW50bHkgb2YgaGVhcnQgcmF0ZSwgbXVsdGlwbGUgaGVhcnQgcmF0ZXMgJiM0MDtiZXR3ZWVuIDU1IGFuZCA4NSBicG0mIzQxOyB3ZXJlIHNpbXVsYXRlZCBhbmQgdGhlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgb2J0YWluZWQgYmxvb2Qgc2lnbmFsIHdlcmUgY2FsY3VsYXRlZC48L3A+CjwvZGl2PqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b+iqwXKbbBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkMzlmNDQwMjUtMjk3NC00YzRjLWIwYzItZTIxMzk5YmJkYjFmuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAAQWrrVwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDM3ZjdmZDdmLTVjYjEtNDhiNS1iODc3LWIyYmMyM2ExZTdkZIqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHmgpG1pbWWqdGV4dC9wbGFpbqxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b+i5hn967BwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkMzdmN2ZkN2YtNWNiMS00OGI1LWI4NzctYjJiYzIzYTFlN2RkuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXPAAAABjR+pFO1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQ3NzE1M2U1Yy03MWJkLTQyZTMtYmFlOS1lNDgxMWZmYTdhM2SKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52bg8ZGl2IGNsYXNzPSJtYXJrZG93biI+PGgyPjEuMi4gU2Nhbm5lcjwvaDI+CjxwPldlIHN0YXJ0IGJ5IGRlZmluaW5nIHRoZSBoYXJkd2FyZSBjaGFyYWN0ZXJpc3RpY3MuIFRoZSA8Y29kZT5zeXMuQjA8L2NvZGU+IHdpbGwgYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIG9mZi1yZXNvbmFuY2Ugb2YgZmF0LjwvcD4KPC9kaXY+pG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv6KrAxJRsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQ3NzE1M2U1Yy03MWJkLTQyZTMtYmFlOS1lNDgxMWZmYTdhM2S5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4ABHC7tXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkZDU0ZDY4MDctNDQ0Zi00ZTBlLThmZDYtODQ0NTc5NzQxMTVhiqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedl/PGRpdiBjbGFzcz0ibWFya2Rvd24iPjxwPkhlcmUgd2Ugc2hvdyB0aGUgbWFnbmV0aXphdGlvbiBkeW5hbWljcyBvZiB0aGUgbXlvY2FyZGl1bSwgYmxvb2QsIGFuZCBmYXQgc2lnbmFscyBhdCAwLjU1VC48L3A+CjwvZGl2PqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b+iqwWQT7BwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkZDU0ZDY4MDctNDQ0Zi00ZTBlLThmZDYtODQ0NTc5NzQxMTVhuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAANaSbVwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDQ0YTMxMDU3LTdiMzQtNGM4MC1hMjczLTY2MjFjMDc3M2RjN4qmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnaaokJPHNjcmlwdCBpZD0ncGxvdF8xJz4KCQkvLyBXZSBzdGFydCBieSBwdXR0aW5nIGFsbCB0aGUgdmFyaWFibGUgaW50ZXJwb2xhdGlvbiBoZXJlIGF0IHRoZSBiZWdpbm5pbmcKCQkvLyBXZSBoYXZlIHRvIGNvbnZlcnQgYWxsIHR5cGVkYXJyYXlzIGluIHRoZSBsYXlvdXQgdG8gbm9ybWFsIGFycmF5cy4gU2VlIElzc3VlICMyNQoJCS8vIFdlIHVzZSBsb2Rhc2ggZm9yIHRoaXMgZm9yIGNvbXBhY3RuZXNzCgkJZnVuY3Rpb24gcmVtb3ZlVHlwZWRBcnJheShvKSB7CgkJCXJldHVybiBfLmlzVHlwZWRBcnJheShvKSA/IEFycmF5LmZyb20obykgOgoJCQlfLmlzUGxhaW5PYmplY3QobykgPyBfLm1hcFZhbHVlcyhvLCByZW1vdmVUeXBlZEFycmF5KSA6IAoJCQlvCgkJfQoKCQkvLyBQdWJsaXNoIHRoZSBwbG90IG9iamVjdCB0byBKUwoJCWxldCBwbG90X29iaiA9IF8udXBkYXRlKC8qIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgQWJzdHJhY3RQbHV0b0RpbmdldGplcy5EaXNwbGF5LnB1Ymxpc2hlZF90b19qcyAqLyBnZXRQdWJsaXNoZWRPYmplY3QoIjBiY2Q4ZTkwLTgxODEtMTFlZi0yNGMwLWYxNGY2YTRkMzA4NC9lNzZlOTdiZTIxY2M4OTUwIiksICJsYXlvdXQiLCByZW1vdmVUeXBlZEFycmF5KQoJCS8vIEdldCB0aGUgcGxvdGx5IGxpc3RlbmVycwoJCWNvbnN0IHBsb3RseV9saXN0ZW5lcnMgPSB7fQoJCS8vIEdldCB0aGUgSlMgbGlzdGVuZXJzCgkJY29uc3QganNfbGlzdGVuZXJzID0ge30KCQkvLyBEZWFsIHdpdGggZXZlbnR1YWwgY3VzdG9tIGNsYXNzZXMKCQlsZXQgY3VzdG9tX2NsYXNzbGlzdCA9IFtdCgoKCQkvLyBMb2FkIHRoZSBwbG90bHkgbGlicmFyeQoJCWxldCBQbG90bHkgPSB1bmRlZmluZWQKCQl0cnkgewoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiLi9wbG90bHlqcy9wbG90bHlqcy0yLjI2LjIubWluLmpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfSBjYXRjaCAoZSkgewoJCQljb25zb2xlLmxvZygiTG9jYWwgbG9hZCBmYWlsZWQsIHRyeWluZyB3aXRoIHRoZSB3ZWIgZXNtLnNoIHZlcnNpb24iKQoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiaHR0cHM6Ly9lc20uc2gvdjEzNS9wbG90bHkuanMtZGlzdC1taW5AMi4yNi4yL2VzbmV4dC9wbG90bHkuanMtZGlzdC1taW4ubWpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfQoKCQkvLyBDaGVjayBpZiB3ZSBoYXZlIHRvIGZvcmNlIGxvY2FsIG1hdGhqYXggZm9udCBjYWNoZQoJCWlmIChmYWxzZSAmJiB3aW5kb3c/Lk1hdGhKYXg/LmNvbmZpZz8uc3ZnPy5mb250Q2FjaGUgPT09ICdnbG9iYWwnKSB7CgkJCXdpbmRvdy5NYXRoSmF4LmNvbmZpZy5zdmcuZm9udENhY2hlID0gJ2xvY2FsJwoJCX0KCgkJLy8gRmxhZyB0byBjaGVjayBpZiB0aGlzIGNlbGwgd2FzICBtYW51YWxseSByYW4gb3IgcmVhY3RpdmVseSByYW4KY29uc3QgZmlyc3RSdW4gPSB0aGlzID8gZmFsc2UgOiB0cnVlCmNvbnN0IENPTlRBSU5FUiA9IHRoaXMgPz8gaHRtbGA8ZGl2IGNsYXNzPSdwbHV0b3Bsb3RseS1jb250YWluZXInPmAKY29uc3QgUExPVCA9IENPTlRBSU5FUi5xdWVyeVNlbGVjdG9yKCcuanMtcGxvdGx5LXBsb3QnKSA/PyBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2PmApCmNvbnN0IHBhcmVudCA9IENPTlRBSU5FUi5wYXJlbnRFbGVtZW50Ci8vIFdlIHVzZSBhIGNvbnRyb2xsZXIgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVycyB1cG9uIGludmFsaWRhdGlvbgpjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpCi8vIFdlIGhhdmUgdG8gYWRkIHRoaXMgdG8ga2VlcCBzdXBwb3J0aW5nIEBiaW5kIHdpdGggdGhlIG9sZCBBUEkgdXNpbmcgUExPVApQTE9ULmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGUpID0+IHsKCUNPTlRBSU5FUi52YWx1ZSA9IFBMT1QudmFsdWUKCWlmIChlLmJ1YmJsZXMpIHsKCQlyZXR1cm4KCX0KCUNPTlRBSU5FUi5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnaW5wdXQnKSkKfSwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pCgoJLy8gVGhpcyBjcmVhdGUgdGhlIHN0eWxlIHN1YmRpdiBvbiBmaXJzdCBydW4KCWZpcnN0UnVuICYmIENPTlRBSU5FUi5hcHBlbmRDaGlsZChodG1sYAoJPHN0eWxlPgoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciB7CgkJd2lkdGg6IDEwMCU7CgkJaGVpZ2h0OiAxMDAlOwoJCW1pbi1oZWlnaHQ6IDA7CgkJbWluLXdpZHRoOiAwOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciAuanMtcGxvdGx5LXBsb3QgLnBsb3RseSBkaXYgewoJCW1hcmdpbjogMCBhdXRvOyAvLyBUaGlzIGNlbnRlcnMgdGhlIHBsb3QKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIucG9wcGVkLW91dCB7CgkJb3ZlcmZsb3c6IGF1dG87CgkJei1pbmRleDogMTAwMDsKCQlwb3NpdGlvbjogZml4ZWQ7CgkJcmVzaXplOiBib3RoOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMHB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwcHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciB7CgkJZGlzcGxheTogZmxleDsKCQlmbGV4LWZsb3c6IHJvdyB3cmFwOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDEycHg7CgkJcG9zaXRpb246IGZpeGVkOwoJCXotaW5kZXg6IDEwMDE7CgkJY3Vyc29yOiBtb3ZlOwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgLTEwMCUpOwoJCXBhZGRpbmc6IDVweDsKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIHNwYW4gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQlmbGV4OiAxCgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlci5oaWRkZW4gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuY2xpcGJvYXJkLXNwYW4gewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCX0KCS5jbGlwYm9hcmQtdmFsdWUgewoJCXBhZGRpbmctcmlnaHQ6IDVweDsKCQlwYWRkaW5nLWxlZnQ6IDJweDsKCQljdXJzb3I6IHRleHQ7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlmbGV4OiAwIDAgMTAwJTsKCQl0ZXh0LWFsaWduOiBjZW50ZXI7CgkJYm9yZGVyLXRvcDogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCW1hcmdpbi10b3A6IDVweDsKCQlkaXNwbGF5OiBub25lOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5maWxlc2F2ZSAuY2xpcGJvYXJkLXNwYW4uZmlsZW5hbWUgewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5jbGlwYm9hcmQtdmFsdWUuZmlsZW5hbWUgewoJCW1hcmdpbi1sZWZ0OiAzcHg7CgkJdGV4dC1hbGlnbjogbGVmdDsKCQltaW4td2lkdGg6IG1pbig2MCUsIG1pbi1jb250ZW50KTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogaW5saW5lLWZsZXg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IC5sYWJlbCB7CgkJZmxleDogMCAwIDA7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZvcm1hdCB7CgkJcG9zaXRpb246IHJlbGF0aXZlOwoJCWZsZXg6IDEgMCBhdXRvOwoJCW1pbi13aWR0aDogMzBweDsKCQltYXJnaW4tcmlnaHQ6IDEwcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJCWZsZXgtZmxvdzogY29sdW1uOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXBhZGRpbmctbGVmdDogM3B4OwoJCXotaW5kZXg6IDIwMDA7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgewoJCWN1cnNvcjogcG9pbnRlcjsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlwYWRkaW5nOiAzcHg7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTNweCwgLTZweCk7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5mb3JtYXQtb3B0aW9uOm5vdCguc2VsZWN0ZWQpIHsKCQltYXJnaW4tdG9wOiAzcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24uc2VsZWN0ZWQgewoJCW9yZGVyOiAtMTsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpob3ZlciB7CgkJYmFja2dyb3VuZC1jb2xvcjogdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7Cgl9CglzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZm9udC13ZWlnaHQ6IG5vcm1hbDsKCQljb2xvcjogdmFyKC0tcGx1dG8tb3V0cHV0LWNvbG9yKTsKCQlkaXNwbGF5OiBub25lOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgY2FsYygtMTAwJSAtIDEwcHgpKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkubGFiZWwgewoJCXVzZXItc2VsZWN0OiBub25lOwoJfQoJLmxhYmVsOmhvdmVyIHNwYW4uY29uZmlnLXZhbHVlIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJbWluLXdpZHRoOiAxNTBweDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5tYXRjaGluZy1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tbWFjcm8tY29sb3IpOwoJCWZvbnQtd2VpZ2h0OiBib2xkOwoJfQoJLmNsaXBib2FyZC1zcGFuLmRpZmZlcmVudC1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tdGFnLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KPC9zdHlsZT4KYCkKCmxldCBvcmlnaW5hbF9oZWlnaHQgPSBwbG90X29iai5sYXlvdXQuaGVpZ2h0CmxldCBvcmlnaW5hbF93aWR0aCA9IHBsb3Rfb2JqLmxheW91dC53aWR0aAovLyBGb3IgdGhlIGhlaWdodCB3ZSBoYXZlIHRvIGFsc28gcHV0IGEgZml4ZWQgdmFsdWUgaW4gY2FzZSB0aGUgcGxvdCBpcyBwdXQgb24gYSBub24tZml4ZWQtc2l6ZSBjb250YWluZXIgKGxpa2UgdGhlIGRlZmF1bHQgd3JhcHBlcikKLy8gV2UgZGVmaW5lIGEgdmFyaWFibGUgdG8gY2hlY2sgd2hldGhlciB3ZSBzdGlsbCBoYXZlIHRvIHJlbW92ZSB0aGUgZml4ZWQgaGVpZ2h0CmxldCByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmaXJzdFJ1bgpsZXQgY29udGFpbmVyX2hlaWdodCA9IG9yaWdpbmFsX2hlaWdodCA/PyBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPz8gNDAwCkNPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfaGVpZ2h0ICsgJ3B4JwoKLy8gV2UgY3JlYXRlIGEgUHJvbWlzZSB2ZXJzaW9uIG9mIHNldFRpbWVvdXQKZnVuY3Rpb24gZGVsYXkobXMpIHsKICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTsKfQoKLy8gV2UgaW1wb3J0IGludGVyYWN0IGZvciBkcmFnZ2luZy9yZXNpemluZwpjb25zdCB7IGRlZmF1bHQ6IGludGVyYWN0IH0gPSBhd2FpdCBpbXBvcnQoJ2h0dHBzOi8vZXNtLnNoL2ludGVyYWN0anNAMS4xMC4xOScpCgoKZnVuY3Rpb24gZ2V0SW1hZ2VPcHRpb25zKCkgewogIGNvbnN0IG8gPSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPz8ge307CiAgcmV0dXJuIHsKICAgIGZvcm1hdDogby5mb3JtYXQgPz8gInBuZyIsCiAgICB3aWR0aDogby53aWR0aCA/PyBvcmlnaW5hbF93aWR0aCwKICAgIGhlaWdodDogby5oZWlnaHQgPz8gb3JpZ2luYWxfaGVpZ2h0LAogICAgc2NhbGU6IG8uc2NhbGUgPz8gMSwKICAgIGZpbGVuYW1lOiBvLmZpbGVuYW1lID8/ICJuZXdwbG90IiwKICB9Owp9Cgpjb25zdCBDTElQQk9BUkRfSEVBREVSID0KICBDT05UQUlORVIucXVlcnlTZWxlY3RvcigiLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIiKSA/PwogIENPTlRBSU5FUi5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAiYWZ0ZXJiZWdpbiIsCiAgICBodG1sYDxkaXYgY2xhc3M9InBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgaGlkZGVuIj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZvcm1hdCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5Gb3JtYXQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZm9ybWF0Ij48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHdpZHRoIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPldpZHRoOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIHdpZHRoIj48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gaGVpZ2h0IgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkhlaWdodDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBoZWlnaHQiPjwvc3Bhbj5weDwvc3BhbgogICAgICA+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzY2FsZSIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5TY2FsZTo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBzY2FsZSI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHNldCI+U2V0PC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHVuc2V0Ij5VbnNldDwvYnV0dG9uPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gZmlsZW5hbWUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+RmlsZW5hbWU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZmlsZW5hbWUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgPC9kaXY+YAogICk7CgpmdW5jdGlvbiBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKSB7CiAgY29uc3QgdmFsaWRfY2xhc3NlcyA9IFsKICAgICJtaXNzaW5nLWNvbmZpZyIsCiAgICAibWF0Y2hpbmctY29uZmlnIiwKICAgICJkaWZmZXJlbnQtY29uZmlnIiwKICBdOwogIGZ1bmN0aW9uIHNldENsYXNzKGNsKSB7CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgdmFsaWRfY2xhc3NlcykgewogICAgICBjb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZShuYW1lLCBuYW1lID09IGNsKTsKICAgIH0KICB9CiAgLy8gV2UgdXNlIHRoZSBjdXN0b20gZ2V0dGVycyB3ZSdsbCBzZXQgdXAgaW4gdGhlIGNvbnRhaW5lcgogIGNvbnN0IHsgdWlfdmFsdWUsIGNvbmZpZ192YWx1ZSwgY29uZmlnX3NwYW4sIGtleSB9ID0gY29udGFpbmVyOwogIGlmIChjb25maWdfdmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgc2V0Q2xhc3MoIm1pc3NpbmctY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGlzIG5vdCBwcmVzZW50IGluIHRoZSBjb25maWcuYDsKICB9IGVsc2UgaWYgKHVpX3ZhbHVlID09IGNvbmZpZ192YWx1ZSkgewogICAgc2V0Q2xhc3MoIm1hdGNoaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgdGhlIHNhbWUgdmFsdWUgaW4gdGhlIGNvbmZpZyBhbmQgaW4gdGhlIGhlYWRlci5gOwogIH0gZWxzZSB7CiAgICBzZXRDbGFzcygiZGlmZmVyZW50LWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgYSBkaWZmZXJlbnQgdmFsdWUgKDxlbT4ke2NvbmZpZ192YWx1ZX08L2VtPikgaW4gdGhlIGNvbmZpZy5gOwogIH0KICAvLyBBZGQgaW5mbyBhYm91dCBzZXR0aW5nIGFuZCB1bnNldHRpbmcKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgb24gdGhlIGxhYmVsIDxlbT48Yj5vbmNlPC9iPjwvZW0+IHRvIHNldCB0aGUgY3VycmVudCBVSSB2YWx1ZSBpbiB0aGUgY29uZmlnLmAKICApOwogIGNvbmZpZ19zcGFuLmluc2VydEFkamFjZW50SFRNTCgKICAgICJiZWZvcmVlbmQiLAogICAgYDxicj5DbGljayA8ZW0+PGI+dHdpY2U8L2I+PC9lbT4gdG8gcmVtb3ZlIHRoaXMga2V5IGZyb20gdGhlIGNvbmZpZy5gCiAgKTsKfQoKY29uc3QgdmFsaWRfZm9ybWF0cyA9IFsicG5nIiwgInN2ZyIsICJ3ZWJwIiwgImpwZWciLCAiZnVsbC1qc29uIl07CmZ1bmN0aW9uIGluaXRpYWxpemVVSVZhbHVlU3BhbihzcGFuLCBrZXksIHZhbHVlKSB7CiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9IGtleSA9PT0gImZvcm1hdCIgPyAiZmFsc2UiIDogInRydWUiOwogIGxldCBwYXJzZSA9ICh4KSA9PiB4OwogIGxldCB1cGRhdGUgPSAoeCkgPT4gKHNwYW4udGV4dENvbnRlbnQgPSB4KTsKICBpZiAoa2V5ID09PSAid2lkdGgiIHx8IGtleSA9PT0gImhlaWdodCIpIHsKICAgIHBhcnNlID0gKHgpID0+IE1hdGgucm91bmQocGFyc2VGbG9hdCh4KSk7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJzY2FsZSIpIHsKICAgIHBhcnNlID0gcGFyc2VGbG9hdDsKICB9IGVsc2UgaWYgKGtleSA9PT0gImZvcm1hdCIpIHsKICAgIC8vIFdlIHJlbW92ZSBjb250ZW50RWRpdGFibGUKICAgIHNwYW4uY29udGVudEVkaXRhYmxlID0gImZhbHNlIjsKICAgIC8vIEhlcmUgd2UgZmlyc3QgYWRkIHRoZSBzdWJzcGFucyBmb3IgZWFjaCBvcHRpb24KICAgIGNvbnN0IG9wdHNfZGl2ID0gc3Bhbi5hcHBlbmRDaGlsZChodG1sYDxkaXYgY2xhc3M9ImZvcm1hdC1vcHRpb25zIj48L2Rpdj5gKTsKICAgIGZvciAoY29uc3QgZm10IG9mIHZhbGlkX2Zvcm1hdHMpIHsKICAgICAgY29uc3Qgb3B0ID0gb3B0c19kaXYuYXBwZW5kQ2hpbGQoCiAgICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iZm9ybWF0LW9wdGlvbiAke2ZtdH0iPiR7Zm10fTwvc3Bhbj5gCiAgICAgICk7CiAgICAgIG9wdC5vbmNsaWNrID0gKGUpID0+IHsKICAgICAgICBzcGFuLnZhbHVlID0gb3B0LnRleHRDb250ZW50OwogICAgICB9OwogICAgfQogICAgcGFyc2UgPSAoeCkgPT4gewogICAgICByZXR1cm4gdmFsaWRfZm9ybWF0cy5pbmNsdWRlcyh4KSA/IHggOiBsb2NhbFZhbHVlOwogICAgfTsKICAgIHVwZGF0ZSA9ICh4KSA9PiB7CiAgICAgIGZvciAoY29uc3Qgb3B0IG9mIG9wdHNfZGl2LmNoaWxkcmVuKSB7CiAgICAgICAgb3B0LmNsYXNzTGlzdC50b2dnbGUoInNlbGVjdGVkIiwgb3B0LnRleHRDb250ZW50ID09PSB4KTsKICAgICAgfQogICAgfTsKICB9IGVsc2UgewogICAgLy8gV2Ugb25seSBoYXZlIGZpbGVuYW1lIGhlcmUKICB9CiAgbGV0IGxvY2FsVmFsdWU7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwYW4sICJ2YWx1ZSIsIHsKICAgIGdldDogKCkgPT4gewogICAgICByZXR1cm4gbG9jYWxWYWx1ZTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgaWYgKHZhbCAhPT0gIiIpIHsKICAgICAgICBsb2NhbFZhbHVlID0gcGFyc2UodmFsKTsKICAgICAgfQogICAgICB1cGRhdGUobG9jYWxWYWx1ZSk7CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKICAvLyBXZSBhbHNvIGFzc2lnbiBhIGxpc3RlbmVyIHNvIHRoYXQgdGhlIGVkaXRhYmxlIGlzIGJsdXJyZWQgd2hlbiBlbnRlciBpcyBwcmVzc2VkCiAgc3Bhbi5vbmtleWRvd24gPSAoZSkgPT4gewogICAgaWYgKGUua2V5Q29kZSA9PT0gMTMpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBzcGFuLmJsdXIoKTsKICAgIH0KICB9OwogIHNwYW4udmFsdWUgPSB2YWx1ZTsKfQoKZnVuY3Rpb24gaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3BhbihzcGFuLCBrZXkpIHsKICAvLyBIZXJlIHdlIG1vc3RseSB3YW50IHRvIGRlZmluZSB0aGUgc2V0dGVyIGFuZCBnZXR0ZXIKICBjb25zdCBjb250YWluZXIgPSBzcGFuLmNsb3Nlc3QoIi5jbGlwYm9hcmQtc3BhbiIpOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgfSwKICAgIHNldDogKHZhbCkgPT4gewogICAgICAvLyBpZiB1bmRlZmluZWQgaXMgcGFzc2VkLCB3ZSByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIG9wdGlvbnMKICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZGVsZXRlIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgICB9IGVsc2UgewogICAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldID0gdmFsOwogICAgICB9CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKfQoKY29uc3QgY29uZmlnX3NwYW5zID0ge307CmZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGdldEltYWdlT3B0aW9ucygpKSkgewogIGNvbnN0IGNvbnRhaW5lciA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcihgLmNsaXBib2FyZC1zcGFuLiR7a2V5fWApOwogIGNvbnN0IGxhYmVsID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5sYWJlbCIpOwogIC8vIFdlIGdpdmUgdGhlIGxhYmVsIGEgZnVuY3Rpb24gdGhhdCBvbiBzaW5nbGUgY2xpY2sgd2lsbCBzZXQgdGhlIGN1cnJlbnQgdmFsdWUgYW5kIHdpdGggZG91YmxlIGNsaWNrIHdpbGwgdW5zZXQgaXQKICBsYWJlbC5vbmNsaWNrID0gRHVhbENsaWNrKAogICAgKCkgPT4gewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfSwKICAgIChlKSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJlIiwgZSk7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IHVuZGVmaW5lZDsKICAgIH0KICApOwogIGNvbnN0IHVpX3ZhbHVlX3NwYW4gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC12YWx1ZSIpOwogIGNvbnN0IGNvbmZpZ192YWx1ZV9zcGFuID0KICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuY29uZmlnLXZhbHVlIikgPz8KICAgIGxhYmVsLmluc2VydEFkamFjZW50RWxlbWVudCgKICAgICAgImFmdGVyYmVnaW4iLAogICAgICBodG1sYDxzcGFuIGNsYXNzPSJjb25maWctdmFsdWUiPjwvc3Bhbj5gCiAgICApOwogIC8vIEFzc2luZyB0aGUgdHdvIHNwYW5zIGFzIHByb3BlcnRpZXMgb2YgdGhlIGNvbnRhaW5pbmcgc3BhbgogIGNvbnRhaW5lci51aV9zcGFuID0gdWlfdmFsdWVfc3BhbjsKICBjb250YWluZXIuY29uZmlnX3NwYW4gPSBjb25maWdfdmFsdWVfc3BhbjsKICBjb250YWluZXIua2V5ID0ga2V5OwogIGNvbmZpZ19zcGFuc1trZXldID0gY29udGFpbmVyOwogIGlmIChmaXJzdFJ1bikgewogICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID0KICAgICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogICAgLy8gV2UgZG8gdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSB2YWx1ZSBzcGFuCiAgICBpbml0aWFsaXplVUlWYWx1ZVNwYW4odWlfdmFsdWVfc3Bhbiwga2V5LCB2YWx1ZSk7CiAgICAvLyBUaGVuIHdlIGluaXRpYWxpemUgdGhlIGNvbmZpZyB2YWx1ZQogICAgaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3Bhbihjb25maWdfdmFsdWVfc3Bhbiwga2V5KTsKICAgIC8vIFdlIHB1dCBzb21lIGNvbnZlbmllbmNlIGdldHRlcnMvc2V0dGVycwogICAgLy8gdWlfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgInVpX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IHVpX3ZhbHVlX3NwYW4udmFsdWUsCiAgICAgIHNldDogKHZhbCkgPT4gewogICAgICAgIHVpX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICAgIC8vIGNvbmZpZ192YWx1ZSBmb3J3YXJkCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAiY29uZmlnX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IGNvbmZpZ192YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSA9IHZhbDsKICAgICAgfSwKICAgIH0pOwogIH0KfQoKLy8gVGhlc2Ugb2JqZWN0cyB3aWxsIGNvbnRhaW4gdGhlIGRlZmF1bHQgdmFsdWUKCi8vIFRoaXMgY29kZSB1cGRhdGVzIHRoZSBpbWFnZSBvcHRpb25zIGluIHRoZSBQTE9UIGNvbmZpZyB3aXRoIHRoZSBwcm92aWRlZCBvbmVzCmZ1bmN0aW9uIHNldEltYWdlT3B0aW9ucyhvKSB7CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBvW2tleV07CiAgfQp9CmZ1bmN0aW9uIHVuc2V0SW1hZ2VPcHRpb25zKCkgewogIHNldEltYWdlT3B0aW9ucyh7fSk7Cn0KCmNvbnN0IHNldF9idXR0b24gPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtc3Bhbi5zZXQiKTsKY29uc3QgdW5zZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4udW5zZXQiKTsKaWYgKGZpcnN0UnVuKSB7CiAgc2V0X2J1dHRvbi5vbmNsaWNrID0gKGUpID0+IHsKICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfQogIH07CiAgdW5zZXRfYnV0dG9uLm9uY2xpY2sgPSB1bnNldEltYWdlT3B0aW9uczsKfQoKLy8gV2UgYWRkIGEgZnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIGNsaXBib2FyZCBpcyBwb3BwZWQgb3V0CkNPTlRBSU5FUi5pc1BvcHBlZE91dCA9ICgpID0+IHsKICByZXR1cm4gQ09OVEFJTkVSLmNsYXNzTGlzdC5jb250YWlucygicG9wcGVkLW91dCIpOwp9OwoKQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNlZG93biA9IGZ1bmN0aW9uIChldmVudCkgewogIGlmIChldmVudC50YXJnZXQubWF0Y2hlcygic3Bhbi5jbGlwYm9hcmQtdmFsdWUiKSkgewogICAgY29uc29sZS5sb2coIldlIGRvbid0IG1vdmUhIik7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IHN0YXJ0ID0gewogICAgbGVmdDogcGFyc2VGbG9hdChDT05UQUlORVIuc3R5bGUubGVmdCksCiAgICB0b3A6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLnRvcCksCiAgICBYOiBldmVudC5wYWdlWCwKICAgIFk6IGV2ZW50LnBhZ2VZLAogIH07CiAgZnVuY3Rpb24gbW92ZUF0KGV2ZW50LCBzdGFydCkgewogICAgY29uc3QgdG9wID0gZXZlbnQucGFnZVkgLSBzdGFydC5ZICsgc3RhcnQudG9wICsgInB4IjsKICAgIGNvbnN0IGxlZnQgPSBldmVudC5wYWdlWCAtIHN0YXJ0LlggKyBzdGFydC5sZWZ0ICsgInB4IjsKICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUudG9wID0gdG9wOwogIH0KCiAgLy8gbW92ZSBvdXIgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGJhbGwgdW5kZXIgdGhlIHBvaW50ZXIKICBtb3ZlQXQoZXZlbnQsIHN0YXJ0KTsKICBmdW5jdGlvbiBvbk1vdXNlTW92ZShldmVudCkgewogICAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgfQoKICAvLyBXZSB1c2UgdGhpcyB0byByZW1vdmUgdGhlIG1vdXNlbW92ZSB3aGVuIGNsaWNraW5nIG91dHNpZGUgb2YgdGhlIGNvbnRhaW5lcgogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CgogIC8vIG1vdmUgdGhlIGNvbnRhaW5lciBvbiBtb3VzZW1vdmUKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCBvbk1vdXNlTW92ZSwgewogICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCwKICB9KTsKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICBjbGVhblVwKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKCiAgZnVuY3Rpb24gY2xlYW5VcCgpIHsKICAgIGNvbnNvbGUubG9nKCJjbGVhbmluZyB1cCB0aGUgcGxvdCBtb3ZlIGxpc3RlbmVyIik7CiAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICBDTElQQk9BUkRfSEVBREVSLm9ubW91c2V1cCA9IG51bGw7CiAgfQoKICAvLyAoMykgZHJvcCB0aGUgYmFsbCwgcmVtb3ZlIHVubmVlZGVkIGhhbmRsZXJzCiAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBjbGVhblVwOwp9OwoKZnVuY3Rpb24gc2VuZFRvQ2xpcGJvYXJkKGJsb2IpIHsKICBpZiAoIW5hdmlnYXRvci5jbGlwYm9hcmQpIHsKICAgIGFsZXJ0KAogICAgICAiVGhlIENsaXBib2FyZCBBUEkgZG9lcyBub3Qgc2VlbSB0byBiZSBhdmFpbGFibGUsIG1ha2Ugc3VyZSB0aGUgUGx1dG8gbm90ZWJvb2sgaXMgYmVpbmcgdXNlZCBmcm9tIGVpdGhlciBsb2NhbGhvc3Qgb3IgYW4gaHR0cHMgc291cmNlLiIKICAgICk7CiAgfQogIG5hdmlnYXRvci5jbGlwYm9hcmQKICAgIC53cml0ZShbCiAgICAgIG5ldyBDbGlwYm9hcmRJdGVtKHsKICAgICAgICAvLyBUaGUga2V5IGlzIGRldGVybWluZWQgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIGJsb2IncyB0eXBlLgogICAgICAgIFtibG9iLnR5cGVdOiBibG9iLAogICAgICB9KSwKICAgIF0pCiAgICAudGhlbigKICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgIGNvbnNvbGUubG9nKCJBc3luYzogQ29weWluZyB0byBjbGlwYm9hcmQgd2FzIHN1Y2Nlc3NmdWwhIik7CiAgICAgIH0sCiAgICAgIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJBc3luYzogQ291bGQgbm90IGNvcHkgdGV4dDogIiwgZXJyKTsKICAgICAgfQogICAgKTsKfQoKZnVuY3Rpb24gY29weUltYWdlVG9DbGlwYm9hcmQoKSB7CiAgLy8gV2UgZXh0cmFjdCB0aGUgaW1hZ2Ugb3B0aW9ucyBmcm9tIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzIChpZiB0aGV5IGV4aXN0KQogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuIFdlIGFsc28gaWdub3JlIGZvcm1hdCBiZWNhdXNlIHRoZSBjbGlwYm9hcmQgb25seSBzdXBwb3J0cyBwbmcuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwga2V5ID09PSAiZm9ybWF0IikgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbmZpZ1trZXldID0gdmFsOwogIH0KICBQbG90bHkudG9JbWFnZShQTE9ULCBjb25maWcpLnRoZW4oZnVuY3Rpb24gKGRhdGFVcmwpIHsKICAgIGZldGNoKGRhdGFVcmwpCiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5ibG9iKCkpCiAgICAgIC50aGVuKChibG9iKSA9PiB7CiAgICAgICAgY29uc3QgcGFzdGVfcmVjZWl2ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdwYXN0ZS1yZWNlaXZlci5wbHV0b3Bsb3RseScpCiAgICAgICAgaWYgKHBhc3RlX3JlY2VpdmVyKSB7CiAgICAgICAgICBwYXN0ZV9yZWNlaXZlci5hdHRhY2hJbWFnZShkYXRhVXJsLCBDT05UQUlORVIpCiAgICAgICAgfQogICAgICAgIHNlbmRUb0NsaXBib2FyZChibG9iKQogICAgICB9KTsKICB9KTsKfQoKZnVuY3Rpb24gc2F2ZUltYWdlVG9GaWxlKCkgewogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LmRvd25sb2FkSW1hZ2UoUExPVCwgY29uZmlnKTsKfQoKbGV0IGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwLCB0b3A6IDAsIGxlZnQ6IDAgfTsKZnVuY3Rpb24gdW5wb3BfY29udGFpbmVyKGNsKSB7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCBmYWxzZSk7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoY2wsIGZhbHNlKTsKICAvLyBXZSBmaXggdGhlIGhlaWdodCBiYWNrIHRvIHRoZSB2YWx1ZSBpdCBoYWQgYmVmb3JlIHBvcG91dCwgYWxzbyBzZXR0aW5nIHRoZSBmbGFnIHRvIHNpZ25hbCB0aGF0IHVwb24gZmlyc3QgcmVzaXplIHdlIHJlbW92ZSB0aGUgZml4ZWQgaW5saW5lLXN0eWxlCiAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9IGNvbnRhaW5lcl9yZWN0LmhlaWdodCArICJweCI7CiAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gdHJ1ZTsKICAvLyBXZSBzZXQgdGhlIG90aGVyIGZpeGVkIGlubGluZS1zdHlsZXMgdG8gbnVsbAogIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogIENPTlRBSU5FUi5zdHlsZS50b3AgPSAiIjsKICBDT05UQUlORVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIFdlIGFsc28gcmVtb3ZlIHRoZSBDTElQQk9BUkRfSEVBREVSCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9ICIiOwogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIEZpbmFsbHkgd2UgcmVtb3ZlIHRoZSBoaWRkZW4gY2xhc3MgdG8gdGhlIGhlYWRlcgogIENMSVBCT0FSRF9IRUFERVIuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgdHJ1ZSk7CiAgcmV0dXJuOwp9CmZ1bmN0aW9uIHBvcG91dF9jb250YWluZXIob3B0cykgewogIGNvbnN0IGNsID0gb3B0cz8uY2w7CiAgY29uc3QgdGFyZ2V0X2NvbnRhaW5lcl9zaXplID0gb3B0cz8udGFyZ2V0X2NvbnRhaW5lcl9zaXplID8/IHt9OwogIGNvbnN0IHRhcmdldF9wbG90X3NpemUgPSBvcHRzPy50YXJnZXRfcGxvdF9zaXplID8/IHt9OwogIGlmIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgcmV0dXJuIHVucG9wX2NvbnRhaW5lcihjbCk7CiAgfQogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBjbCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0cnVlKTsKICAvLyBXZSBleHRyYWN0IHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNvbnRhaW5lciwgc2F2ZSB0aGVtIGFuZCBmaXggdGhlbQogIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH0gPSBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgY29udGFpbmVyX3JlY3QgPSB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9OwogIC8vIFdlIHNhdmUgdGhlIGN1cnJlbnQgcGxvdCBzaXplIGJlZm9yZSB3ZSBwb3AgYXMgaXQgd2lsbCBmaWxsIHRoZSBzY3JlZW4KICBjb25zdCBjdXJyZW50X3Bsb3Rfc2l6ZSA9IHsKICAgIHdpZHRoOiBQTE9ULl9mdWxsTGF5b3V0LndpZHRoLAogICAgaGVpZ2h0OiBQTE9ULl9mdWxsTGF5b3V0LmhlaWdodCwKICB9OwogIC8vIFdlIGhhdmUgdG8gc2F2ZSB0aGUgcGFkIGRhdGEgYmVmb3JlIHBvcHBpbmcgc28gd2UgY2FuIHJlc2l6ZSBwcmVjaXNlbHkKICBjb25zdCBwYWQgPSB7fTsKICBwYWQudW5wb3BwZWQgPSBnZXRTaXplRGF0YSgpLmNvbnRhaW5lcl9wYWQ7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCB0cnVlKTsKICBwYWQucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIC8vIFdlIGRvIHRvcCBhbmQgbGVmdCBiYXNlZCBvbiB0aGUgY3VycmVudCByZWN0CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ0b3AiLCAibGVmdCJdKSB7CiAgICBjb25zdCBzdGFydF92YWwgPSB0YXJnZXRfY29udGFpbmVyX3NpemVba2V5XSA/PyBjb250YWluZXJfcmVjdFtrZXldOwogICAgbGV0IG9mZnNldCA9IDA7CiAgICBmb3IgKGNvbnN0IGtpbmQgb2YgWyJwYWRkaW5nIiwgImJvcmRlciJdKSB7CiAgICAgIG9mZnNldCArPSBwYWQucG9wcGVkW2tpbmRdW2tleV0gLSBwYWQudW5wb3BwZWRba2luZF1ba2V5XTsKICAgIH0KICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gc3RhcnRfdmFsIC0gb2Zmc2V0ICsgInB4IjsKICAgIGlmIChrZXkgPT09ICJsZWZ0IikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgLy8gV2UgY29tcHV0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBkZXBlbmRpbmcgb24gZXZlbnR1YWwgY29uZmlnIGRhdGEKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7CiAgICB3aWR0aDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS53aWR0aCA/PwogICAgICBjb25maWdfc3BhbnMud2lkdGguY29uZmlnX3ZhbHVlID8/CiAgICAgIGN1cnJlbnRfcGxvdF9zaXplLndpZHRoLAogICAgaGVpZ2h0OgogICAgICB0YXJnZXRfcGxvdF9zaXplLmhlaWdodCA/PwogICAgICBjb25maWdfc3BhbnMuaGVpZ2h0LmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS5oZWlnaHQsCiAgfSk7CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgY29uc3QgdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY3N6W2tleV07CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHZhbCArICJweCI7CiAgICBpZiAoa2V5ID09PSAid2lkdGgiKSB7CiAgICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGVba2V5XSA9IENPTlRBSU5FUi5zdHlsZVtrZXldOwogICAgfQogIH0KICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIGZhbHNlKTsKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICB1bnBvcF9jb250YWluZXIoKTsKICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9LAogICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0KICApOwp9CgpDT05UQUlORVIucG9wT3V0ID0gcG9wb3V0X2NvbnRhaW5lcjsKCmZ1bmN0aW9uIER1YWxDbGljayhzaW5nbGVfZnVuYywgZGJsX2Z1bmMpIHsKICBsZXQgbmNsaWNrcyA9IDA7CiAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7CiAgICBuY2xpY2tzICs9IDE7CiAgICBpZiAobmNsaWNrcyA+IDEpIHsKICAgICAgZGJsX2Z1bmMoLi4uYXJncyk7CiAgICAgIG5jbGlja3MgPSAwOwogICAgfSBlbHNlIHsKICAgICAgZGVsYXkoMzAwKS50aGVuKCgpID0+IHsKICAgICAgICBpZiAobmNsaWNrcyA9PSAxKSB7CiAgICAgICAgICBzaW5nbGVfZnVuYyguLi5hcmdzKTsKICAgICAgICB9CiAgICAgICAgbmNsaWNrcyA9IDA7CiAgICAgIH0pOwogICAgfQogIH07Cn0KCi8vIFdlIHJlbW92ZSB0aGUgZGVmYXVsdCBkb3dubG9hZCBpbWFnZSBidXR0b24KcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9SZW1vdmUgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlLAogIFsidG9JbWFnZSJdCik7Ci8vIFdlIGFkZCB0aGUgY3VzdG9tIGJ1dHRvbiB0byB0aGUgbW9kZWJhcgpwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb0FkZCA9IF8udW5pb24oCiAgcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQsCiAgWwogICAgewogICAgICBuYW1lOiAiQ29weSBQTkcgdG8gQ2xpcGJvYXJkIiwKICAgICAgaWNvbjogewogICAgICAgIGhlaWdodDogNTIwLAogICAgICAgIHdpZHRoOiA1MjAsCiAgICAgICAgcGF0aDogIk0yODAgNjRoNDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRWNDQ4YzAgMzUuMy0yOC43IDY0LTY0IDY0SDY0Yy0zNS4zIDAtNjQtMjguNy02NC02NFYxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRoNDAgOS42QzEyMSAyNy41IDE1My4zIDAgMTkyIDBzNzEgMjcuNSA3OC40IDY0SDI4MHpNNjQgMTEyYy04LjggMC0xNiA3LjItMTYgMTZWNDQ4YzAgOC44IDcuMiAxNiAxNiAxNkgzMjBjOC44IDAgMTYtNy4yIDE2LTE2VjEyOGMwLTguOC03LjItMTYtMTYtMTZIMzA0djI0YzAgMTMuMy0xMC43IDI0LTI0IDI0SDE5MiAxMDRjLTEzLjMgMC0yNC0xMC43LTI0LTI0VjExMkg2NHptMTI4LThhMjQgMjQgMCAxIDAgMC00OCAyNCAyNCAwIDEgMCAwIDQ4eiIsCiAgICAgIH0sCiAgICAgIGRpcmVjdGlvbjogInVwIiwKICAgICAgY2xpY2s6IER1YWxDbGljayhjb3B5SW1hZ2VUb0NsaXBib2FyZCwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoKTsKICAgICAgfSksCiAgICB9LAogICAgewogICAgICBuYW1lOiAiRG93bmxvYWQgSW1hZ2UiLAogICAgICBpY29uOiBQbG90bHkuSWNvbnMuY2FtZXJhLAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soc2F2ZUltYWdlVG9GaWxlLCAoKSA9PiB7CiAgICAgICAgcG9wb3V0X2NvbnRhaW5lcih7IGNsOiAiZmlsZXNhdmUiIH0pOwogICAgICB9KSwKICAgIH0sCiAgXQopOwoKZnVuY3Rpb24gZ2V0T2Zmc2V0RGF0YShlbCkgewogIGxldCBjcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsLCBudWxsKTsKICBjb25zdCBvZGF0YSA9IHsKICAgIHBhZGRpbmc6IHsKICAgICAgbGVmdDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSwKICAgICAgYm90dG9tOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSArIHBhcnNlRmxvYXQoY3MucGFkZGluZ0JvdHRvbSksCiAgICB9LAogICAgYm9yZGVyOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyTGVmdFdpZHRoKSwKICAgICAgcmlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyUmlnaHRXaWR0aCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5ib3JkZXJUb3BXaWR0aCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCkgKyBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICB9CiAgfTsKICBpZiAoZWwgPT09IFBMT1QpIHsKICAgIC8vIEZvciB0aGUgUExPVCB3ZSBhbHNvIHdhbnQgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIG9mZnNldAogICAgb2RhdGEub2Zmc2V0ID0gewogICAgICB0b3A6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0VG9wIDogMCwKICAgICAgbGVmdDogUExPVC5vZmZzZXRQYXJlbnQgPT0gQ09OVEFJTkVSID8gUExPVC5vZmZzZXRMZWZ0IDogMCwKICAgIH0KICB9CiAgcmV0dXJuIG9kYXRhOwp9CmZ1bmN0aW9uIGdldFNpemVEYXRhKCkgewogIGNvbnN0IGRhdGEgPSB7CiAgICBwbG90X3BhZDogZ2V0T2Zmc2V0RGF0YShQTE9UKSwKICAgIHBsb3RfcmVjdDogUExPVC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICAgIGNvbnRhaW5lcl9wYWQ6IGdldE9mZnNldERhdGEoQ09OVEFJTkVSKSwKICAgIGNvbnRhaW5lcl9yZWN0OiBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgfTsKICByZXR1cm4gZGF0YTsKfQpmdW5jdGlvbiBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgY29uc3QgY29tcHV0ZWRfc2l6ZSA9IGNvbXB1dGVQbG90U2l6ZShzaXplRGF0YSk7CiAgY29uc3Qgb2Zmc2V0cyA9IGNvbXB1dGVkX3NpemUub2Zmc2V0czsKCiAgY29uc3QgcGxvdF9kYXRhID0gewogICAgd2lkdGg6IHdpZHRoID8/IGNvbXB1dGVkX3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IGhlaWdodCA/PyBjb21wdXRlZF9zaXplLmhlaWdodCwKICB9OwoKICByZXR1cm4gewogICAgd2lkdGg6ICh3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoKSArIG9mZnNldHMud2lkdGgsCiAgICBoZWlnaHQ6IChoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQpICsgb2Zmc2V0cy5oZWlnaHQsCiAgICBub0NoYW5nZTogd2lkdGggPT0gY29tcHV0ZWRfc2l6ZS53aWR0aCAmJiBoZWlnaHQgPT0gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfQp9CgovLyBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hhbmdlIHRoZSBjb250YWluZXIgc2l6ZSBzbyB0aGF0IHRoZSByZXN1bHRpbmcgcGxvdCB3aWxsIGJlIG1hdGNoaW5nIHRoZSBwcm92aWRlZCBzcGVjcwpmdW5jdGlvbiBjaGFuZ2VDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICBpZiAoIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICBjb25zb2xlLmxvZygiVHJpZWQgdG8gY2hhbmdlIGNvbnRhaW5lciBzaXplIHdoZW4gbm90IHBvcHBlZCwgaWdub3JpbmciKTsKICAgIHJldHVybjsKICB9CgogIGNvbnN0IGNzeiA9IGNvbXB1dGVDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSk7CgogIGlmIChjc3oubm9DaGFuZ2UpIHsKICAgIGNvbnNvbGUubG9nKCJTaXplIGlzIHRoZSBzYW1lIGFzIGN1cnJlbnQsIGlnbm9yaW5nIik7CiAgICByZXR1cm4KICB9CiAgLy8gV2UgYXJlIG5vdyBnb2luZyB0byBzZXQgaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgY29udGFpbmVyCiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSBjc3pba2V5XSArICJweCI7CiAgfQp9Ci8vIFdlIG5vdyBjcmVhdGUgdGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCB1cGRhdGUgdGhlIHBsb3QgYmFzZWQgb24gdGhlIHZhbHVlcyBzcGVjaWZpZWQKZnVuY3Rpb24gdXBkYXRlRnJvbUhlYWRlcigpIHsKICBjb25zdCBoZWFkZXJfZGF0YSA9IHsKICAgIGhlaWdodDogY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSwKICAgIHdpZHRoOiBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUsCiAgfTsKICBjaGFuZ2VDb250YWluZXJTaXplKGhlYWRlcl9kYXRhKTsKfQovLyBXZSBhc3NpZ24gdGhpcyBmdW5jdGlvbiB0byB0aGUgb25ibHVyIGV2ZW50IG9mIHdpZHRoIGFuZCBoZWlnaHQKaWYgKGZpcnN0UnVuKSB7CiAgZm9yIChjb25zdCBjb250YWluZXIgb2YgT2JqZWN0LnZhbHVlcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIudWlfc3Bhbi5vbmJsdXIgPSAoZSkgPT4gewogICAgICBjb250YWluZXIudWlfdmFsdWUgPSBjb250YWluZXIudWlfc3Bhbi50ZXh0Q29udGVudDsKICAgICAgdXBkYXRlRnJvbUhlYWRlcigpOwogICAgfTsKICB9Cn0KLy8gVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgcGxvdCBzaXplIHRvIHVzZSBmb3IgcmVsYXlvdXQgYXMgYSBmdW5jdGlvbiBvZiB0aGUgY29udGFpbmVyIHNpemUKZnVuY3Rpb24gY29tcHV0ZVBsb3RTaXplKGRhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgLy8gUmVtb3ZlIFBhZGRpbmcKICBjb25zdCB7IGNvbnRhaW5lcl9wYWQsIHBsb3RfcGFkLCBjb250YWluZXJfcmVjdCB9ID0gZGF0YTsKICBjb25zdCBvZmZzZXRzID0gewogICAgd2lkdGg6CiAgICAgIHBsb3RfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBwbG90X3BhZC5ib3JkZXIud2lkdGggKwogICAgICBwbG90X3BhZC5vZmZzZXQubGVmdCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy53aWR0aCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLndpZHRoLAogICAgaGVpZ2h0OgogICAgICBwbG90X3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIHBsb3RfcGFkLmJvcmRlci5oZWlnaHQgKwogICAgICBwbG90X3BhZC5vZmZzZXQudG9wICsKICAgICAgY29udGFpbmVyX3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLmhlaWdodCwKICB9OwogIGNvbnN0IHN6ID0gewogICAgd2lkdGg6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3Qud2lkdGggLSBvZmZzZXRzLndpZHRoKSwKICAgIGhlaWdodDogTWF0aC5yb3VuZChjb250YWluZXJfcmVjdC5oZWlnaHQgLSBvZmZzZXRzLmhlaWdodCksCiAgICBvZmZzZXRzLAogIH07CiAgcmV0dXJuIHN6Owp9CgovLyBDcmVhdGUgdGhlIHJlc2l6ZU9ic2VydmVyIHRvIG1ha2UgdGhlIHBsb3QgZXZlbiBtb3JlIHJlc3BvbnNpdmUhIDptYWdpYzoKY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHsKICBjb25zdCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCk7CiAgY29uc3Qge2NvbnRhaW5lcl9yZWN0LCBjb250YWluZXJfcGFkfSA9IHNpemVEYXRhOwogIGxldCBwbG90X3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIC8vIFdlIHNhdmUgdGhlIGhlaWdodCBpbiB0aGUgUExPVCBvYmplY3QKICBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQ7CiAgLy8gV2UgZGVhbCB3aXRoIHNvbWUgc3R1ZmYgaWYgdGhlIGNvbnRhaW5lciBpcyBwb3BwcGVkCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9IGNvbnRhaW5lcl9yZWN0LndpZHRoICsgInB4IjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBjb250YWluZXJfcmVjdC5sZWZ0ICsgInB4IjsKICBjb25maWdfc3BhbnMuaGVpZ2h0LnVpX3ZhbHVlID0gcGxvdF9zaXplLmhlaWdodDsKICBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUgPSBwbG90X3NpemUud2lkdGg7CiAgLyogCgkJVGhlIGFkZGl0aW9uIG9mIHRoZSBpbnZhbGlkIGFyZ3VtZW50IGBwbHV0b3Jlc2l6ZWAgc2VlbXMgdG8gZml4IHRoZSBwcm9ibGVtIHdpdGggY2FsbGluZyBgcmVsYXlvdXRgIHNpbXBseSB3aXRoIGB7YXV0b3NpemU6IHRydWV9YCBhcyB1cGRhdGUgYnJlYWtpbmcgbW91c2UgcmVsYXlvdXQgZXZlbnRzIHRyYWNraW5nLiAKCQlTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Bsb3RseS9wbG90bHkuanMvaXNzdWVzLzYxNTYgZm9yIGRldGFpbHMKCQkqLwogIGxldCBjb25maWcgPSB7CiAgICAvLyBJZiB0aGlzIGlzIHBvcHBlZCBvdXQsIHdlIGlnbm9yZSB0aGUgb3JpZ2luYWwgd2lkdGgvaGVpZ2h0CiAgICB3aWR0aDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfd2lkdGgpID8/IHBsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfaGVpZ2h0KSA/PyBwbG90X3NpemUuaGVpZ2h0LAogICAgcGx1dG9yZXNpemU6IHRydWUsCiAgfTsKICBQbG90bHkucmVsYXlvdXQoUExPVCwgY29uZmlnKS50aGVuKCgpID0+IHsKICAgIGlmIChyZW1vdmVfY29udGFpbmVyX3NpemUgJiYgIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIHRoZSBmaXJzdCByZXNpemUgdXBvbiBwbG90IGNyZWF0aW9uIHRvIGFscmVhZHkgYmUgd2l0aG91dCBhIGZpeGVkIGhlaWdodAogICAgICBDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gIiI7CiAgICAgIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogICAgICByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmYWxzZTsKICAgIH0KICB9KTsKfSk7CgpyZXNpemVPYnNlcnZlci5vYnNlcnZlKENPTlRBSU5FUik7CgoKUGxvdGx5LnJlYWN0KFBMT1QsIHBsb3Rfb2JqKS50aGVuKCgpID0+IHsKCS8vIEFzc2lnbiB0aGUgUGxvdGx5IGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKHBsb3RseV9saXN0ZW5lcnMpKSB7CgkJZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcl92ZWMpIHsKCQkJUExPVC5vbihrZXksIGxpc3RlbmVyKQoJCX0KCX0KCS8vIEFzc2lnbiB0aGUgSlMgZXZlbnQgbGlzdGVuZXJzCglmb3IgKGNvbnN0IFtrZXksIGxpc3RlbmVyX3ZlY10gb2YgT2JqZWN0LmVudHJpZXMoanNfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1QuYWRkRXZlbnRMaXN0ZW5lcihrZXksIGxpc3RlbmVyLCB7CgkJCQlzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsCgkJCX0pCgkJfQoJfQp9CikKCgppbnZhbGlkYXRpb24udGhlbigoKSA9PiB7CgkvLyBSZW1vdmUgYWxsIHBsb3RseSBsaXN0ZW5lcnMKCVBMT1QucmVtb3ZlQWxsTGlzdGVuZXJzKCkKCS8vIFJlbW92ZSBhbGwgSlMgbGlzdGVuZXJzCgljb250cm9sbGVyLmFib3J0KCkKCS8vIFJlbW92ZSB0aGUgcmVzaXplT2JzZXJ2ZXIKCXJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKQp9KQoKCgoJCXJldHVybiBDT05UQUlORVIKCTwvc2NyaXB0PgqkbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/ou+z6n2wcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJDQ0YTMxMDU3LTdiMzQtNGM4MC1hMjczLTY2MjFjMDc3M2RjN7lkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgLRs7i1cHVibGlzaGVkX29iamVjdF9rZXlzkdk1MGJjZDhlOTAtODE4MS0xMWVmLTI0YzAtZjE0ZjZhNGQzMDg0L2U3NmU5N2JlMjFjYzg5NTC4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkY2I2NTkxMTgtOWYyMi00M2MzLTgwMWQtNDkyNDFkZWU0ZGY2iqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9keYOoZWxlbWVudHOYkrFkdW1teV9oZWFydF9iZWF0c5KhM6p0ZXh0L3BsYWlukqppTkFWX2xpbmVzkqE2qnRleHQvcGxhaW6Sq2ltX3NlZ21lbnRzkqIyMKp0ZXh0L3BsYWlukq9pTkFWX2ZsaXBfYW5nbGWSozMuMqp0ZXh0L3BsYWlukq1pbV9mbGlwX2FuZ2xlkqMxMTCqdGV4dC9wbGFpbpKvVDJwcmVwX2R1cmF0aW9ukqQwLjA1qnRleHQvcGxhaW6SsUZhdFNhdF9mbGlwX2FuZ2xlkqMxODCqdGV4dC9wbGFpbpKiUlKSozEuMKp0ZXh0L3BsYWlupHR5cGWqTmFtZWRUdXBsZahvYmplY3RpZLBhOTA4MGI1MzgzMWNjODZlpG1pbWXZIWFwcGxpY2F0aW9uL3ZuZC5wbHV0by50cmVlK29iamVjdKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b+i3v47bbBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkY2I2NTkxMTgtOWYyMi00M2MzLTgwMWQtNDkyNDFkZWU0ZGY2uWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAAEl87VwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDhkYzExMTc1LWViYzgtNDA3YS1hYjBiLTZkNTQzZjg0OWE3MoqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnZSjxkaXYgY2xhc3M9Im1hcmtkb3duIj48cD5BdXggZnVuY3Rpb25zICYjNDA7c2hvdy9oaWRlIGNvZGUmIzQxOzwvcD4KPC9kaXY+pG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv6LuTMEWsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQ4ZGMxMTE3NS1lYmM4LTQwN2EtYWIwYi02ZDU0M2Y4NDlhNzK5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4ALlk6tXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkZjczMDgyZmYtYTZkMy00MWY4LTg3OTYtNDExNGZhODlkMmJiiqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedpqiQk8c2NyaXB0IGlkPSdwbG90XzEnPgoJCS8vIFdlIHN0YXJ0IGJ5IHB1dHRpbmcgYWxsIHRoZSB2YXJpYWJsZSBpbnRlcnBvbGF0aW9uIGhlcmUgYXQgdGhlIGJlZ2lubmluZwoJCS8vIFdlIGhhdmUgdG8gY29udmVydCBhbGwgdHlwZWRhcnJheXMgaW4gdGhlIGxheW91dCB0byBub3JtYWwgYXJyYXlzLiBTZWUgSXNzdWUgIzI1CgkJLy8gV2UgdXNlIGxvZGFzaCBmb3IgdGhpcyBmb3IgY29tcGFjdG5lc3MKCQlmdW5jdGlvbiByZW1vdmVUeXBlZEFycmF5KG8pIHsKCQkJcmV0dXJuIF8uaXNUeXBlZEFycmF5KG8pID8gQXJyYXkuZnJvbShvKSA6CgkJCV8uaXNQbGFpbk9iamVjdChvKSA/IF8ubWFwVmFsdWVzKG8sIHJlbW92ZVR5cGVkQXJyYXkpIDogCgkJCW8KCQl9CgoJCS8vIFB1Ymxpc2ggdGhlIHBsb3Qgb2JqZWN0IHRvIEpTCgkJbGV0IHBsb3Rfb2JqID0gXy51cGRhdGUoLyogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBBYnN0cmFjdFBsdXRvRGluZ2V0amVzLkRpc3BsYXkucHVibGlzaGVkX3RvX2pzICovIGdldFB1Ymxpc2hlZE9iamVjdCgiMGJjZDhlOTAtODE4MS0xMWVmLTI0YzAtZjE0ZjZhNGQzMDg0LzM0MDlhNGI5ZTI1OThhZTciKSwgImxheW91dCIsIHJlbW92ZVR5cGVkQXJyYXkpCgkJLy8gR2V0IHRoZSBwbG90bHkgbGlzdGVuZXJzCgkJY29uc3QgcGxvdGx5X2xpc3RlbmVycyA9IHt9CgkJLy8gR2V0IHRoZSBKUyBsaXN0ZW5lcnMKCQljb25zdCBqc19saXN0ZW5lcnMgPSB7fQoJCS8vIERlYWwgd2l0aCBldmVudHVhbCBjdXN0b20gY2xhc3NlcwoJCWxldCBjdXN0b21fY2xhc3NsaXN0ID0gW10KCgoJCS8vIExvYWQgdGhlIHBsb3RseSBsaWJyYXJ5CgkJbGV0IFBsb3RseSA9IHVuZGVmaW5lZAoJCXRyeSB7CgkJCWxldCBfbW9kID0gYXdhaXQgaW1wb3J0KCIuL3Bsb3RseWpzL3Bsb3RseWpzLTIuMjYuMi5taW4uanMiKQoJCQlQbG90bHkgPSBfbW9kLmRlZmF1bHQKCQl9IGNhdGNoIChlKSB7CgkJCWNvbnNvbGUubG9nKCJMb2NhbCBsb2FkIGZhaWxlZCwgdHJ5aW5nIHdpdGggdGhlIHdlYiBlc20uc2ggdmVyc2lvbiIpCgkJCWxldCBfbW9kID0gYXdhaXQgaW1wb3J0KCJodHRwczovL2VzbS5zaC92MTM1L3Bsb3RseS5qcy1kaXN0LW1pbkAyLjI2LjIvZXNuZXh0L3Bsb3RseS5qcy1kaXN0LW1pbi5tanMiKQoJCQlQbG90bHkgPSBfbW9kLmRlZmF1bHQKCQl9CgoJCS8vIENoZWNrIGlmIHdlIGhhdmUgdG8gZm9yY2UgbG9jYWwgbWF0aGpheCBmb250IGNhY2hlCgkJaWYgKGZhbHNlICYmIHdpbmRvdz8uTWF0aEpheD8uY29uZmlnPy5zdmc/LmZvbnRDYWNoZSA9PT0gJ2dsb2JhbCcpIHsKCQkJd2luZG93Lk1hdGhKYXguY29uZmlnLnN2Zy5mb250Q2FjaGUgPSAnbG9jYWwnCgkJfQoKCQkvLyBGbGFnIHRvIGNoZWNrIGlmIHRoaXMgY2VsbCB3YXMgIG1hbnVhbGx5IHJhbiBvciByZWFjdGl2ZWx5IHJhbgpjb25zdCBmaXJzdFJ1biA9IHRoaXMgPyBmYWxzZSA6IHRydWUKY29uc3QgQ09OVEFJTkVSID0gdGhpcyA/PyBodG1sYDxkaXYgY2xhc3M9J3BsdXRvcGxvdGx5LWNvbnRhaW5lcic+YApjb25zdCBQTE9UID0gQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoJy5qcy1wbG90bHktcGxvdCcpID8/IENPTlRBSU5FUi5hcHBlbmRDaGlsZChodG1sYDxkaXY+YCkKY29uc3QgcGFyZW50ID0gQ09OVEFJTkVSLnBhcmVudEVsZW1lbnQKLy8gV2UgdXNlIGEgY29udHJvbGxlciB0byByZW1vdmUgZXZlbnQgbGlzdGVuZXJzIHVwb24gaW52YWxpZGF0aW9uCmNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCkKLy8gV2UgaGF2ZSB0byBhZGQgdGhpcyB0byBrZWVwIHN1cHBvcnRpbmcgQGJpbmQgd2l0aCB0aGUgb2xkIEFQSSB1c2luZyBQTE9UClBMT1QuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoZSkgPT4gewoJQ09OVEFJTkVSLnZhbHVlID0gUExPVC52YWx1ZQoJaWYgKGUuYnViYmxlcykgewoJCXJldHVybgoJfQoJQ09OVEFJTkVSLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdpbnB1dCcpKQp9LCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSkKCgkvLyBUaGlzIGNyZWF0ZSB0aGUgc3R5bGUgc3ViZGl2IG9uIGZpcnN0IHJ1bgoJZmlyc3RSdW4gJiYgQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgCgk8c3R5bGU+CgkucGx1dG9wbG90bHktY29udGFpbmVyIHsKCQl3aWR0aDogMTAwJTsKCQloZWlnaHQ6IDEwMCU7CgkJbWluLWhlaWdodDogMDsKCQltaW4td2lkdGg6IDA7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyIC5qcy1wbG90bHktcGxvdCAucGxvdGx5IGRpdiB7CgkJbWFyZ2luOiAwIGF1dG87IC8vIFRoaXMgY2VudGVycyB0aGUgcGxvdAoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5wb3BwZWQtb3V0IHsKCQlvdmVyZmxvdzogYXV0bzsKCQl6LWluZGV4OiAxMDAwOwoJCXBvc2l0aW9uOiBmaXhlZDsKCQlyZXNpemU6IGJvdGg7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwcHg7CgkJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDBweDsKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIHsKCQlkaXNwbGF5OiBmbGV4OwoJCWZsZXgtZmxvdzogcm93IHdyYXA7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMTJweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMTJweDsKCQlwb3NpdGlvbjogZml4ZWQ7CgkJei1pbmRleDogMTAwMTsKCQljdXJzb3I6IG1vdmU7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCAtMTAwJSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgc3BhbiB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCWZsZXg6IDEKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyLmhpZGRlbiB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3BhbiB7CgkJcG9zaXRpb246IHJlbGF0aXZlOwoJfQoJLmNsaXBib2FyZC12YWx1ZSB7CgkJcGFkZGluZy1yaWdodDogNXB4OwoJCXBhZGRpbmctbGVmdDogMnB4OwoJCWN1cnNvcjogdGV4dDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZmlsZW5hbWUgewoJCWZsZXg6IDAgMCAxMDAlOwoJCXRleHQtYWxpZ246IGNlbnRlcjsKCQlib3JkZXItdG9wOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJbWFyZ2luLXRvcDogNXB4OwoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5maWxlbmFtZSB7CgkJbWFyZ2luLWxlZnQ6IDNweDsKCQl0ZXh0LWFsaWduOiBsZWZ0OwoJCW1pbi13aWR0aDogbWluKDYwJSwgbWluLWNvbnRlbnQpOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5maWxlc2F2ZSAuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgLmxhYmVsIHsKCQlmbGV4OiAwIDAgMDsKCX0KCS5jbGlwYm9hcmQtdmFsdWUuZm9ybWF0IHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7CgkJZmxleDogMSAwIGF1dG87CgkJbWluLXdpZHRoOiAzMHB4OwoJCW1hcmdpbi1yaWdodDogMTBweDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyB7CgkJZGlzcGxheTogaW5saW5lLWZsZXg7CgkJZmxleC1mbG93OiBjb2x1bW47CgkJcG9zaXRpb246IGFic29sdXRlOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJcGFkZGluZy1sZWZ0OiAzcHg7CgkJei1pbmRleDogMjAwMDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9uczpob3ZlciB7CgkJY3Vyc29yOiBwb2ludGVyOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCXBhZGRpbmc6IDNweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtM3B4LCAtNnB4KTsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyAuZm9ybWF0LW9wdGlvbiB7CgkJZGlzcGxheTogbm9uZTsKCX0KCWRpdi5mb3JtYXQtb3B0aW9uczpob3ZlciAuZm9ybWF0LW9wdGlvbiB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246bm90KC5zZWxlY3RlZCkgewoJCW1hcmdpbi10b3A6IDNweDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyAuZm9ybWF0LW9wdGlvbi5zZWxlY3RlZCB7CgkJb3JkZXI6IC0xOwoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5mb3JtYXQtb3B0aW9uOmhvdmVyIHsKCQliYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCX0KCXNwYW4uY29uZmlnLXZhbHVlIHsKCQlmb250LXdlaWdodDogbm9ybWFsOwoJCWNvbG9yOiB2YXIoLS1wbHV0by1vdXRwdXQtY29sb3IpOwoJCWRpc3BsYXk6IG5vbmU7CgkJcG9zaXRpb246IGFic29sdXRlOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCBjYWxjKC0xMDAlIC0gMTBweCkpOwoJCXBhZGRpbmc6IDVweDsKCX0KCS5sYWJlbCB7CgkJdXNlci1zZWxlY3Q6IG5vbmU7Cgl9CgkubGFiZWw6aG92ZXIgc3Bhbi5jb25maWctdmFsdWUgewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQltaW4td2lkdGg6IDE1MHB4OwoJfQoJLmNsaXBib2FyZC1zcGFuLm1hdGNoaW5nLWNvbmZpZyAubGFiZWwgewoJCWNvbG9yOiB2YXIoLS1jbS1tYWNyby1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZGlmZmVyZW50LWNvbmZpZyAubGFiZWwgewoJCWNvbG9yOiB2YXIoLS1jbS10YWctY29sb3IpOwoJCWZvbnQtd2VpZ2h0OiBib2xkOwoJfQo8L3N0eWxlPgpgKQoKbGV0IG9yaWdpbmFsX2hlaWdodCA9IHBsb3Rfb2JqLmxheW91dC5oZWlnaHQKbGV0IG9yaWdpbmFsX3dpZHRoID0gcGxvdF9vYmoubGF5b3V0LndpZHRoCi8vIEZvciB0aGUgaGVpZ2h0IHdlIGhhdmUgdG8gYWxzbyBwdXQgYSBmaXhlZCB2YWx1ZSBpbiBjYXNlIHRoZSBwbG90IGlzIHB1dCBvbiBhIG5vbi1maXhlZC1zaXplIGNvbnRhaW5lciAobGlrZSB0aGUgZGVmYXVsdCB3cmFwcGVyKQovLyBXZSBkZWZpbmUgYSB2YXJpYWJsZSB0byBjaGVjayB3aGV0aGVyIHdlIHN0aWxsIGhhdmUgdG8gcmVtb3ZlIHRoZSBmaXhlZCBoZWlnaHQKbGV0IHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IGZpcnN0UnVuCmxldCBjb250YWluZXJfaGVpZ2h0ID0gb3JpZ2luYWxfaGVpZ2h0ID8/IFBMT1QuY29udGFpbmVyX2hlaWdodCA/PyA0MDAKQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9IGNvbnRhaW5lcl9oZWlnaHQgKyAncHgnCgovLyBXZSBjcmVhdGUgYSBQcm9taXNlIHZlcnNpb24gb2Ygc2V0VGltZW91dApmdW5jdGlvbiBkZWxheShtcykgewogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpOwp9CgovLyBXZSBpbXBvcnQgaW50ZXJhY3QgZm9yIGRyYWdnaW5nL3Jlc2l6aW5nCmNvbnN0IHsgZGVmYXVsdDogaW50ZXJhY3QgfSA9IGF3YWl0IGltcG9ydCgnaHR0cHM6Ly9lc20uc2gvaW50ZXJhY3Rqc0AxLjEwLjE5JykKCgpmdW5jdGlvbiBnZXRJbWFnZU9wdGlvbnMoKSB7CiAgY29uc3QgbyA9IHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICByZXR1cm4gewogICAgZm9ybWF0OiBvLmZvcm1hdCA/PyAicG5nIiwKICAgIHdpZHRoOiBvLndpZHRoID8/IG9yaWdpbmFsX3dpZHRoLAogICAgaGVpZ2h0OiBvLmhlaWdodCA/PyBvcmlnaW5hbF9oZWlnaHQsCiAgICBzY2FsZTogby5zY2FsZSA/PyAxLAogICAgZmlsZW5hbWU6IG8uZmlsZW5hbWUgPz8gIm5ld3Bsb3QiLAogIH07Cn0KCmNvbnN0IENMSVBCT0FSRF9IRUFERVIgPQogIENPTlRBSU5FUi5xdWVyeVNlbGVjdG9yKCIucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciIpID8/CiAgQ09OVEFJTkVSLmluc2VydEFkamFjZW50RWxlbWVudCgKICAgICJhZnRlcmJlZ2luIiwKICAgIGh0bWxgPGRpdiBjbGFzcz0icGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBoaWRkZW4iPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gZm9ybWF0IgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZvcm1hdDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBmb3JtYXQiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gd2lkdGgiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+V2lkdGg6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgd2lkdGgiPjwvc3Bhbj5weDwvc3BhbgogICAgICA+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBoZWlnaHQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+SGVpZ2h0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGhlaWdodCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHNjYWxlIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPlNjYWxlOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIHNjYWxlIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2V0Ij5TZXQ8L2J1dHRvbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gdW5zZXQiPlVuc2V0PC9idXR0b24+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmaWxlbmFtZSIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5GaWxlbmFtZTo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBmaWxlbmFtZSI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICA8L2Rpdj5gCiAgKTsKCmZ1bmN0aW9uIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpIHsKICBjb25zdCB2YWxpZF9jbGFzc2VzID0gWwogICAgIm1pc3NpbmctY29uZmlnIiwKICAgICJtYXRjaGluZy1jb25maWciLAogICAgImRpZmZlcmVudC1jb25maWciLAogIF07CiAgZnVuY3Rpb24gc2V0Q2xhc3MoY2wpIHsKICAgIGZvciAoY29uc3QgbmFtZSBvZiB2YWxpZF9jbGFzc2VzKSB7CiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKG5hbWUsIG5hbWUgPT0gY2wpOwogICAgfQogIH0KICAvLyBXZSB1c2UgdGhlIGN1c3RvbSBnZXR0ZXJzIHdlJ2xsIHNldCB1cCBpbiB0aGUgY29udGFpbmVyCiAgY29uc3QgeyB1aV92YWx1ZSwgY29uZmlnX3ZhbHVlLCBjb25maWdfc3Bhbiwga2V5IH0gPSBjb250YWluZXI7CiAgaWYgKGNvbmZpZ192YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICBzZXRDbGFzcygibWlzc2luZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaXMgbm90IHByZXNlbnQgaW4gdGhlIGNvbmZpZy5gOwogIH0gZWxzZSBpZiAodWlfdmFsdWUgPT0gY29uZmlnX3ZhbHVlKSB7CiAgICBzZXRDbGFzcygibWF0Y2hpbmctY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGhhcyB0aGUgc2FtZSB2YWx1ZSBpbiB0aGUgY29uZmlnIGFuZCBpbiB0aGUgaGVhZGVyLmA7CiAgfSBlbHNlIHsKICAgIHNldENsYXNzKCJkaWZmZXJlbnQtY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGhhcyBhIGRpZmZlcmVudCB2YWx1ZSAoPGVtPiR7Y29uZmlnX3ZhbHVlfTwvZW0+KSBpbiB0aGUgY29uZmlnLmA7CiAgfQogIC8vIEFkZCBpbmZvIGFib3V0IHNldHRpbmcgYW5kIHVuc2V0dGluZwogIGNvbmZpZ19zcGFuLmluc2VydEFkamFjZW50SFRNTCgKICAgICJiZWZvcmVlbmQiLAogICAgYDxicj5DbGljayBvbiB0aGUgbGFiZWwgPGVtPjxiPm9uY2U8L2I+PC9lbT4gdG8gc2V0IHRoZSBjdXJyZW50IFVJIHZhbHVlIGluIHRoZSBjb25maWcuYAogICk7CiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIDxlbT48Yj50d2ljZTwvYj48L2VtPiB0byByZW1vdmUgdGhpcyBrZXkgZnJvbSB0aGUgY29uZmlnLmAKICApOwp9Cgpjb25zdCB2YWxpZF9mb3JtYXRzID0gWyJwbmciLCAic3ZnIiwgIndlYnAiLCAianBlZyIsICJmdWxsLWpzb24iXTsKZnVuY3Rpb24gaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHNwYW4sIGtleSwgdmFsdWUpIHsKICBjb25zdCBjb250YWluZXIgPSBzcGFuLmNsb3Nlc3QoIi5jbGlwYm9hcmQtc3BhbiIpOwogIHNwYW4uY29udGVudEVkaXRhYmxlID0ga2V5ID09PSAiZm9ybWF0IiA/ICJmYWxzZSIgOiAidHJ1ZSI7CiAgbGV0IHBhcnNlID0gKHgpID0+IHg7CiAgbGV0IHVwZGF0ZSA9ICh4KSA9PiAoc3Bhbi50ZXh0Q29udGVudCA9IHgpOwogIGlmIChrZXkgPT09ICJ3aWR0aCIgfHwga2V5ID09PSAiaGVpZ2h0IikgewogICAgcGFyc2UgPSAoeCkgPT4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KHgpKTsKICB9IGVsc2UgaWYgKGtleSA9PT0gInNjYWxlIikgewogICAgcGFyc2UgPSBwYXJzZUZsb2F0OwogIH0gZWxzZSBpZiAoa2V5ID09PSAiZm9ybWF0IikgewogICAgLy8gV2UgcmVtb3ZlIGNvbnRlbnRFZGl0YWJsZQogICAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSAiZmFsc2UiOwogICAgLy8gSGVyZSB3ZSBmaXJzdCBhZGQgdGhlIHN1YnNwYW5zIGZvciBlYWNoIG9wdGlvbgogICAgY29uc3Qgb3B0c19kaXYgPSBzcGFuLmFwcGVuZENoaWxkKGh0bWxgPGRpdiBjbGFzcz0iZm9ybWF0LW9wdGlvbnMiPjwvZGl2PmApOwogICAgZm9yIChjb25zdCBmbXQgb2YgdmFsaWRfZm9ybWF0cykgewogICAgICBjb25zdCBvcHQgPSBvcHRzX2Rpdi5hcHBlbmRDaGlsZCgKICAgICAgICBodG1sYDxzcGFuIGNsYXNzPSJmb3JtYXQtb3B0aW9uICR7Zm10fSI+JHtmbXR9PC9zcGFuPmAKICAgICAgKTsKICAgICAgb3B0Lm9uY2xpY2sgPSAoZSkgPT4gewogICAgICAgIHNwYW4udmFsdWUgPSBvcHQudGV4dENvbnRlbnQ7CiAgICAgIH07CiAgICB9CiAgICBwYXJzZSA9ICh4KSA9PiB7CiAgICAgIHJldHVybiB2YWxpZF9mb3JtYXRzLmluY2x1ZGVzKHgpID8geCA6IGxvY2FsVmFsdWU7CiAgICB9OwogICAgdXBkYXRlID0gKHgpID0+IHsKICAgICAgZm9yIChjb25zdCBvcHQgb2Ygb3B0c19kaXYuY2hpbGRyZW4pIHsKICAgICAgICBvcHQuY2xhc3NMaXN0LnRvZ2dsZSgic2VsZWN0ZWQiLCBvcHQudGV4dENvbnRlbnQgPT09IHgpOwogICAgICB9CiAgICB9OwogIH0gZWxzZSB7CiAgICAvLyBXZSBvbmx5IGhhdmUgZmlsZW5hbWUgaGVyZQogIH0KICBsZXQgbG9jYWxWYWx1ZTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBsb2NhbFZhbHVlOwogICAgfSwKICAgIHNldDogKHZhbCkgPT4gewogICAgICBpZiAodmFsICE9PSAiIikgewogICAgICAgIGxvY2FsVmFsdWUgPSBwYXJzZSh2YWwpOwogICAgICB9CiAgICAgIHVwZGF0ZShsb2NhbFZhbHVlKTsKICAgICAgY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcik7CiAgICB9LAogIH0pOwogIC8vIFdlIGFsc28gYXNzaWduIGEgbGlzdGVuZXIgc28gdGhhdCB0aGUgZWRpdGFibGUgaXMgYmx1cnJlZCB3aGVuIGVudGVyIGlzIHByZXNzZWQKICBzcGFuLm9ua2V5ZG93biA9IChlKSA9PiB7CiAgICBpZiAoZS5rZXlDb2RlID09PSAxMykgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHNwYW4uYmx1cigpOwogICAgfQogIH07CiAgc3Bhbi52YWx1ZSA9IHZhbHVlOwp9CgpmdW5jdGlvbiBpbml0aWFsaXplQ29uZmlnVmFsdWVTcGFuKHNwYW4sIGtleSkgewogIC8vIEhlcmUgd2UgbW9zdGx5IHdhbnQgdG8gZGVmaW5lIHRoZSBzZXR0ZXIgYW5kIGdldHRlcgogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwYW4sICJ2YWx1ZSIsIHsKICAgIGdldDogKCkgPT4gewogICAgICByZXR1cm4gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV07CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIC8vIGlmIHVuZGVmaW5lZCBpcyBwYXNzZWQsIHdlIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgb3B0aW9ucwogICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsKICAgICAgICBkZWxldGUgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV0gPSB2YWw7CiAgICAgIH0KICAgICAgY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcik7CiAgICB9LAogIH0pOwp9Cgpjb25zdCBjb25maWdfc3BhbnMgPSB7fTsKZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZ2V0SW1hZ2VPcHRpb25zKCkpKSB7CiAgY29uc3QgY29udGFpbmVyID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKGAuY2xpcGJvYXJkLXNwYW4uJHtrZXl9YCk7CiAgY29uc3QgbGFiZWwgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmxhYmVsIik7CiAgLy8gV2UgZ2l2ZSB0aGUgbGFiZWwgYSBmdW5jdGlvbiB0aGF0IG9uIHNpbmdsZSBjbGljayB3aWxsIHNldCB0aGUgY3VycmVudCB2YWx1ZSBhbmQgd2l0aCBkb3VibGUgY2xpY2sgd2lsbCB1bnNldCBpdAogIGxhYmVsLm9uY2xpY2sgPSBEdWFsQ2xpY2soCiAgICAoKSA9PiB7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBjb250YWluZXIudWlfdmFsdWU7CiAgICB9LAogICAgKGUpID0+IHsKICAgICAgY29uc29sZS5sb2coImUiLCBlKTsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gdW5kZWZpbmVkOwogICAgfQogICk7CiAgY29uc3QgdWlfdmFsdWVfc3BhbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXZhbHVlIik7CiAgY29uc3QgY29uZmlnX3ZhbHVlX3NwYW4gPQogICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jb25maWctdmFsdWUiKSA/PwogICAgbGFiZWwuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgICAiYWZ0ZXJiZWdpbiIsCiAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImNvbmZpZy12YWx1ZSI+PC9zcGFuPmAKICAgICk7CiAgLy8gQXNzaW5nIHRoZSB0d28gc3BhbnMgYXMgcHJvcGVydGllcyBvZiB0aGUgY29udGFpbmluZyBzcGFuCiAgY29udGFpbmVyLnVpX3NwYW4gPSB1aV92YWx1ZV9zcGFuOwogIGNvbnRhaW5lci5jb25maWdfc3BhbiA9IGNvbmZpZ192YWx1ZV9zcGFuOwogIGNvbnRhaW5lci5rZXkgPSBrZXk7CiAgY29uZmlnX3NwYW5zW2tleV0gPSBjb250YWluZXI7CiAgaWYgKGZpcnN0UnVuKSB7CiAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPQogICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPz8ge307CiAgICAvLyBXZSBkbyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHZhbHVlIHNwYW4KICAgIGluaXRpYWxpemVVSVZhbHVlU3Bhbih1aV92YWx1ZV9zcGFuLCBrZXksIHZhbHVlKTsKICAgIC8vIFRoZW4gd2UgaW5pdGlhbGl6ZSB0aGUgY29uZmlnIHZhbHVlCiAgICBpbml0aWFsaXplQ29uZmlnVmFsdWVTcGFuKGNvbmZpZ192YWx1ZV9zcGFuLCBrZXkpOwogICAgLy8gV2UgcHV0IHNvbWUgY29udmVuaWVuY2UgZ2V0dGVycy9zZXR0ZXJzCiAgICAvLyB1aV92YWx1ZSBmb3J3YXJkCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAidWlfdmFsdWUiLCB7CiAgICAgIGdldDogKCkgPT4gdWlfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgdWlfdmFsdWVfc3Bhbi52YWx1ZSA9IHZhbDsKICAgICAgfSwKICAgIH0pOwogICAgLy8gY29uZmlnX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJjb25maWdfdmFsdWUiLCB7CiAgICAgIGdldDogKCkgPT4gY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUsCiAgICAgIHNldDogKHZhbCkgPT4gewogICAgICAgIGNvbmZpZ192YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgfQp9CgovLyBUaGVzZSBvYmplY3RzIHdpbGwgY29udGFpbiB0aGUgZGVmYXVsdCB2YWx1ZQoKLy8gVGhpcyBjb2RlIHVwZGF0ZXMgdGhlIGltYWdlIG9wdGlvbnMgaW4gdGhlIFBMT1QgY29uZmlnIHdpdGggdGhlIHByb3ZpZGVkIG9uZXMKZnVuY3Rpb24gc2V0SW1hZ2VPcHRpb25zKG8pIHsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IG9ba2V5XTsKICB9Cn0KZnVuY3Rpb24gdW5zZXRJbWFnZU9wdGlvbnMoKSB7CiAgc2V0SW1hZ2VPcHRpb25zKHt9KTsKfQoKY29uc3Qgc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnNldCIpOwpjb25zdCB1bnNldF9idXR0b24gPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtc3Bhbi51bnNldCIpOwppZiAoZmlyc3RSdW4pIHsKICBzZXRfYnV0dG9uLm9uY2xpY2sgPSAoZSkgPT4gewogICAgZm9yIChjb25zdCBjb250YWluZXIgb2YgT2JqZWN0LnZhbHVlcyhjb25maWdfc3BhbnMpKSB7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBjb250YWluZXIudWlfdmFsdWU7CiAgICB9CiAgfTsKICB1bnNldF9idXR0b24ub25jbGljayA9IHVuc2V0SW1hZ2VPcHRpb25zOwp9CgovLyBXZSBhZGQgYSBmdW5jdGlvbiB0byBjaGVjayBpZiB0aGUgY2xpcGJvYXJkIGlzIHBvcHBlZCBvdXQKQ09OVEFJTkVSLmlzUG9wcGVkT3V0ID0gKCkgPT4gewogIHJldHVybiBDT05UQUlORVIuY2xhc3NMaXN0LmNvbnRhaW5zKCJwb3BwZWQtb3V0Iik7Cn07CgpDTElQQk9BUkRfSEVBREVSLm9ubW91c2Vkb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgaWYgKGV2ZW50LnRhcmdldC5tYXRjaGVzKCJzcGFuLmNsaXBib2FyZC12YWx1ZSIpKSB7CiAgICBjb25zb2xlLmxvZygiV2UgZG9uJ3QgbW92ZSEiKTsKICAgIHJldHVybjsKICB9CiAgY29uc3Qgc3RhcnQgPSB7CiAgICBsZWZ0OiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS5sZWZ0KSwKICAgIHRvcDogcGFyc2VGbG9hdChDT05UQUlORVIuc3R5bGUudG9wKSwKICAgIFg6IGV2ZW50LnBhZ2VYLAogICAgWTogZXZlbnQucGFnZVksCiAgfTsKICBmdW5jdGlvbiBtb3ZlQXQoZXZlbnQsIHN0YXJ0KSB7CiAgICBjb25zdCB0b3AgPSBldmVudC5wYWdlWSAtIHN0YXJ0LlkgKyBzdGFydC50b3AgKyAicHgiOwogICAgY29uc3QgbGVmdCA9IGV2ZW50LnBhZ2VYIC0gc3RhcnQuWCArIHN0YXJ0LmxlZnQgKyAicHgiOwogICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gbGVmdDsKICAgIENPTlRBSU5FUi5zdHlsZS5sZWZ0ID0gbGVmdDsKICAgIENPTlRBSU5FUi5zdHlsZS50b3AgPSB0b3A7CiAgfQoKICAvLyBtb3ZlIG91ciBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYmFsbCB1bmRlciB0aGUgcG9pbnRlcgogIG1vdmVBdChldmVudCwgc3RhcnQpOwogIGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGV2ZW50KSB7CiAgICBtb3ZlQXQoZXZlbnQsIHN0YXJ0KTsKICB9CgogIC8vIFdlIHVzZSB0aGlzIHRvIHJlbW92ZSB0aGUgbW91c2Vtb3ZlIHdoZW4gY2xpY2tpbmcgb3V0c2lkZSBvZiB0aGUgY29udGFpbmVyCiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgLy8gbW92ZSB0aGUgY29udGFpbmVyIG9uIG1vdXNlbW92ZQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIG9uTW91c2VNb3ZlLCB7CiAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLAogIH0pOwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAibW91c2Vkb3duIiwKICAgIChlKSA9PiB7CiAgICAgIGlmIChlLnRhcmdldC5jbG9zZXN0KCIucGx1dG9wbG90bHktY29udGFpbmVyIikgIT09IENPTlRBSU5FUikgewogICAgICAgIGNsZWFuVXAoKTsKICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9LAogICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0KICApOwoKICBmdW5jdGlvbiBjbGVhblVwKCkgewogICAgY29uc29sZS5sb2coImNsZWFuaW5nIHVwIHRoZSBwbG90IG1vdmUgbGlzdGVuZXIiKTsKICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gbnVsbDsKICB9CgogIC8vICgzKSBkcm9wIHRoZSBiYWxsLCByZW1vdmUgdW5uZWVkZWQgaGFuZGxlcnMKICBDTElQQk9BUkRfSEVBREVSLm9ubW91c2V1cCA9IGNsZWFuVXA7Cn07CgpmdW5jdGlvbiBzZW5kVG9DbGlwYm9hcmQoYmxvYikgewogIGlmICghbmF2aWdhdG9yLmNsaXBib2FyZCkgewogICAgYWxlcnQoCiAgICAgICJUaGUgQ2xpcGJvYXJkIEFQSSBkb2VzIG5vdCBzZWVtIHRvIGJlIGF2YWlsYWJsZSwgbWFrZSBzdXJlIHRoZSBQbHV0byBub3RlYm9vayBpcyBiZWluZyB1c2VkIGZyb20gZWl0aGVyIGxvY2FsaG9zdCBvciBhbiBodHRwcyBzb3VyY2UuIgogICAgKTsKICB9CiAgbmF2aWdhdG9yLmNsaXBib2FyZAogICAgLndyaXRlKFsKICAgICAgbmV3IENsaXBib2FyZEl0ZW0oewogICAgICAgIC8vIFRoZSBrZXkgaXMgZGV0ZXJtaW5lZCBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgYmxvYidzIHR5cGUuCiAgICAgICAgW2Jsb2IudHlwZV06IGJsb2IsCiAgICAgIH0pLAogICAgXSkKICAgIC50aGVuKAogICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgY29uc29sZS5sb2coIkFzeW5jOiBDb3B5aW5nIHRvIGNsaXBib2FyZCB3YXMgc3VjY2Vzc2Z1bCEiKTsKICAgICAgfSwKICAgICAgZnVuY3Rpb24gKGVycikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkFzeW5jOiBDb3VsZCBub3QgY29weSB0ZXh0OiAiLCBlcnIpOwogICAgICB9CiAgICApOwp9CgpmdW5jdGlvbiBjb3B5SW1hZ2VUb0NsaXBib2FyZCgpIHsKICAvLyBXZSBleHRyYWN0IHRoZSBpbWFnZSBvcHRpb25zIGZyb20gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMgKGlmIHRoZXkgZXhpc3QpCiAgY29uc3QgY29uZmlnID0ge307CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGxldCB2YWwgPQogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID8/CiAgICAgIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IGNvbnRhaW5lci51aV92YWx1ZSA6IHVuZGVmaW5lZCk7CiAgICAvLyBJZiB3ZSBoYXZlIHVuZGVmaW5lZCB3ZSBkb24ndCBjcmVhdGUgdGhlIGtleS4gV2UgYWxzbyBpZ25vcmUgZm9ybWF0IGJlY2F1c2UgdGhlIGNsaXBib2FyZCBvbmx5IHN1cHBvcnRzIHBuZy4KICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS50b0ltYWdlKFBMT1QsIGNvbmZpZykudGhlbihmdW5jdGlvbiAoZGF0YVVybCkgewogICAgZmV0Y2goZGF0YVVybCkKICAgICAgLnRoZW4oKHJlcykgPT4gcmVzLmJsb2IoKSkKICAgICAgLnRoZW4oKGJsb2IpID0+IHsKICAgICAgICBjb25zdCBwYXN0ZV9yZWNlaXZlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3Bhc3RlLXJlY2VpdmVyLnBsdXRvcGxvdGx5JykKICAgICAgICBpZiAocGFzdGVfcmVjZWl2ZXIpIHsKICAgICAgICAgIHBhc3RlX3JlY2VpdmVyLmF0dGFjaEltYWdlKGRhdGFVcmwsIENPTlRBSU5FUikKICAgICAgICB9CiAgICAgICAgc2VuZFRvQ2xpcGJvYXJkKGJsb2IpCiAgICAgIH0pOwogIH0pOwp9CgpmdW5jdGlvbiBzYXZlSW1hZ2VUb0ZpbGUoKSB7CiAgY29uc3QgY29uZmlnID0ge307CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGxldCB2YWwgPQogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID8/CiAgICAgIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IGNvbnRhaW5lci51aV92YWx1ZSA6IHVuZGVmaW5lZCk7CiAgICAvLyBJZiB3ZSBoYXZlIHVuZGVmaW5lZCB3ZSBkb24ndCBjcmVhdGUgdGhlIGtleS4KICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbmZpZ1trZXldID0gdmFsOwogIH0KICBQbG90bHkuZG93bmxvYWRJbWFnZShQTE9ULCBjb25maWcpOwp9CgpsZXQgY29udGFpbmVyX3JlY3QgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAsIHRvcDogMCwgbGVmdDogMCB9OwpmdW5jdGlvbiB1bnBvcF9jb250YWluZXIoY2wpIHsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZSgicG9wcGVkLW91dCIsIGZhbHNlKTsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgZmFsc2UpOwogIC8vIFdlIGZpeCB0aGUgaGVpZ2h0IGJhY2sgdG8gdGhlIHZhbHVlIGl0IGhhZCBiZWZvcmUgcG9wb3V0LCBhbHNvIHNldHRpbmcgdGhlIGZsYWcgdG8gc2lnbmFsIHRoYXQgdXBvbiBmaXJzdCByZXNpemUgd2UgcmVtb3ZlIHRoZSBmaXhlZCBpbmxpbmUtc3R5bGUKICBDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0ICsgInB4IjsKICByZW1vdmVfY29udGFpbmVyX3NpemUgPSB0cnVlOwogIC8vIFdlIHNldCB0aGUgb3RoZXIgZml4ZWQgaW5saW5lLXN0eWxlcyB0byBudWxsCiAgQ09OVEFJTkVSLnN0eWxlLndpZHRoID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9ICIiOwogIENPTlRBSU5FUi5zdHlsZS5sZWZ0ID0gIiI7CiAgLy8gV2UgYWxzbyByZW1vdmUgdGhlIENMSVBCT0FSRF9IRUFERVIKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLndpZHRoID0gIiI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gIiI7CiAgLy8gRmluYWxseSB3ZSByZW1vdmUgdGhlIGhpZGRlbiBjbGFzcyB0byB0aGUgaGVhZGVyCiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCB0cnVlKTsKICByZXR1cm47Cn0KZnVuY3Rpb24gcG9wb3V0X2NvbnRhaW5lcihvcHRzKSB7CiAgY29uc3QgY2wgPSBvcHRzPy5jbDsKICBjb25zdCB0YXJnZXRfY29udGFpbmVyX3NpemUgPSBvcHRzPy50YXJnZXRfY29udGFpbmVyX3NpemUgPz8ge307CiAgY29uc3QgdGFyZ2V0X3Bsb3Rfc2l6ZSA9IG9wdHM/LnRhcmdldF9wbG90X3NpemUgPz8ge307CiAgaWYgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICByZXR1cm4gdW5wb3BfY29udGFpbmVyKGNsKTsKICB9CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoY2wsIGNsID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IHRydWUpOwogIC8vIFdlIGV4dHJhY3QgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgY29udGFpbmVyLCBzYXZlIHRoZW0gYW5kIGZpeCB0aGVtCiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfSA9IENPTlRBSU5FUi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICBjb250YWluZXJfcmVjdCA9IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH07CiAgLy8gV2Ugc2F2ZSB0aGUgY3VycmVudCBwbG90IHNpemUgYmVmb3JlIHdlIHBvcCBhcyBpdCB3aWxsIGZpbGwgdGhlIHNjcmVlbgogIGNvbnN0IGN1cnJlbnRfcGxvdF9zaXplID0gewogICAgd2lkdGg6IFBMT1QuX2Z1bGxMYXlvdXQud2lkdGgsCiAgICBoZWlnaHQ6IFBMT1QuX2Z1bGxMYXlvdXQuaGVpZ2h0LAogIH07CiAgLy8gV2UgaGF2ZSB0byBzYXZlIHRoZSBwYWQgZGF0YSBiZWZvcmUgcG9wcGluZyBzbyB3ZSBjYW4gcmVzaXplIHByZWNpc2VseQogIGNvbnN0IHBhZCA9IHt9OwogIHBhZC51bnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZSgicG9wcGVkLW91dCIsIHRydWUpOwogIHBhZC5wb3BwZWQgPSBnZXRTaXplRGF0YSgpLmNvbnRhaW5lcl9wYWQ7CiAgLy8gV2UgZG8gdG9wIGFuZCBsZWZ0IGJhc2VkIG9uIHRoZSBjdXJyZW50IHJlY3QKICBmb3IgKGNvbnN0IGtleSBvZiBbInRvcCIsICJsZWZ0Il0pIHsKICAgIGNvbnN0IHN0YXJ0X3ZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNvbnRhaW5lcl9yZWN0W2tleV07CiAgICBsZXQgb2Zmc2V0ID0gMDsKICAgIGZvciAoY29uc3Qga2luZCBvZiBbInBhZGRpbmciLCAiYm9yZGVyIl0pIHsKICAgICAgb2Zmc2V0ICs9IHBhZC5wb3BwZWRba2luZF1ba2V5XSAtIHBhZC51bnBvcHBlZFtraW5kXVtrZXldOwogICAgfQogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSBzdGFydF92YWwgLSBvZmZzZXQgKyAicHgiOwogICAgaWYgKGtleSA9PT0gImxlZnQiKSB7CiAgICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGVba2V5XSA9IENPTlRBSU5FUi5zdHlsZVtrZXldOwogICAgfQogIH0KICAvLyBXZSBjb21wdXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGRlcGVuZGluZyBvbiBldmVudHVhbCBjb25maWcgZGF0YQogIGNvbnN0IGNzeiA9IGNvbXB1dGVDb250YWluZXJTaXplKHsKICAgIHdpZHRoOgogICAgICB0YXJnZXRfcGxvdF9zaXplLndpZHRoID8/CiAgICAgIGNvbmZpZ19zcGFucy53aWR0aC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6CiAgICAgIHRhcmdldF9wbG90X3NpemUuaGVpZ2h0ID8/CiAgICAgIGNvbmZpZ19zcGFucy5oZWlnaHQuY29uZmlnX3ZhbHVlID8/CiAgICAgIGN1cnJlbnRfcGxvdF9zaXplLmhlaWdodCwKICB9KTsKICBmb3IgKGNvbnN0IGtleSBvZiBbIndpZHRoIiwgImhlaWdodCJdKSB7CiAgICBjb25zdCB2YWwgPSB0YXJnZXRfY29udGFpbmVyX3NpemVba2V5XSA/PyBjc3pba2V5XTsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gdmFsICsgInB4IjsKICAgIGlmIChrZXkgPT09ICJ3aWR0aCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIENMSVBCT0FSRF9IRUFERVIuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgZmFsc2UpOwogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CgogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAibW91c2Vkb3duIiwKICAgIChlKSA9PiB7CiAgICAgIGlmIChlLnRhcmdldC5jbG9zZXN0KCIucGx1dG9wbG90bHktY29udGFpbmVyIikgIT09IENPTlRBSU5FUikgewogICAgICAgIHVucG9wX2NvbnRhaW5lcigpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7Cn0KCkNPTlRBSU5FUi5wb3BPdXQgPSBwb3BvdXRfY29udGFpbmVyOwoKZnVuY3Rpb24gRHVhbENsaWNrKHNpbmdsZV9mdW5jLCBkYmxfZnVuYykgewogIGxldCBuY2xpY2tzID0gMDsKICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHsKICAgIG5jbGlja3MgKz0gMTsKICAgIGlmIChuY2xpY2tzID4gMSkgewogICAgICBkYmxfZnVuYyguLi5hcmdzKTsKICAgICAgbmNsaWNrcyA9IDA7CiAgICB9IGVsc2UgewogICAgICBkZWxheSgzMDApLnRoZW4oKCkgPT4gewogICAgICAgIGlmIChuY2xpY2tzID09IDEpIHsKICAgICAgICAgIHNpbmdsZV9mdW5jKC4uLmFyZ3MpOwogICAgICAgIH0KICAgICAgICBuY2xpY2tzID0gMDsKICAgICAgfSk7CiAgICB9CiAgfTsKfQoKLy8gV2UgcmVtb3ZlIHRoZSBkZWZhdWx0IGRvd25sb2FkIGltYWdlIGJ1dHRvbgpwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSA9IF8udW5pb24oCiAgcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9SZW1vdmUsCiAgWyJ0b0ltYWdlIl0KKTsKLy8gV2UgYWRkIHRoZSBjdXN0b20gYnV0dG9uIHRvIHRoZSBtb2RlYmFyCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb0FkZCwKICBbCiAgICB7CiAgICAgIG5hbWU6ICJDb3B5IFBORyB0byBDbGlwYm9hcmQiLAogICAgICBpY29uOiB7CiAgICAgICAgaGVpZ2h0OiA1MjAsCiAgICAgICAgd2lkdGg6IDUyMCwKICAgICAgICBwYXRoOiAiTTI4MCA2NGg0MGMzNS4zIDAgNjQgMjguNyA2NCA2NFY0NDhjMCAzNS4zLTI4LjcgNjQtNjQgNjRINjRjLTM1LjMgMC02NC0yOC43LTY0LTY0VjEyOEMwIDkyLjcgMjguNyA2NCA2NCA2NGg0MCA5LjZDMTIxIDI3LjUgMTUzLjMgMCAxOTIgMHM3MSAyNy41IDc4LjQgNjRIMjgwek02NCAxMTJjLTguOCAwLTE2IDcuMi0xNiAxNlY0NDhjMCA4LjggNy4yIDE2IDE2IDE2SDMyMGM4LjggMCAxNi03LjIgMTYtMTZWMTI4YzAtOC44LTcuMi0xNi0xNi0xNkgzMDR2MjRjMCAxMy4zLTEwLjcgMjQtMjQgMjRIMTkyIDEwNGMtMTMuMyAwLTI0LTEwLjctMjQtMjRWMTEySDY0em0xMjgtOGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6IiwKICAgICAgfSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKGNvcHlJbWFnZVRvQ2xpcGJvYXJkLCAoKSA9PiB7CiAgICAgICAgcG9wb3V0X2NvbnRhaW5lcigpOwogICAgICB9KSwKICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICJEb3dubG9hZCBJbWFnZSIsCiAgICAgIGljb246IFBsb3RseS5JY29ucy5jYW1lcmEsCiAgICAgIGRpcmVjdGlvbjogInVwIiwKICAgICAgY2xpY2s6IER1YWxDbGljayhzYXZlSW1hZ2VUb0ZpbGUsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKHsgY2w6ICJmaWxlc2F2ZSIgfSk7CiAgICAgIH0pLAogICAgfSwKICBdCik7CgpmdW5jdGlvbiBnZXRPZmZzZXREYXRhKGVsKSB7CiAgbGV0IGNzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwsIG51bGwpOwogIGNvbnN0IG9kYXRhID0gewogICAgcGFkZGluZzogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdMZWZ0KSwKICAgICAgcmlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1JpZ2h0KSwKICAgICAgdG9wOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdUb3ApLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MucGFkZGluZ0JvdHRvbSksCiAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdMZWZ0KSArIHBhcnNlRmxvYXQoY3MucGFkZGluZ1JpZ2h0KSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdUb3ApICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgIH0sCiAgICBib3JkZXI6IHsKICAgICAgbGVmdDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgdG9wOiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSwKICAgICAgYm90dG9tOiBwYXJzZUZsb2F0KGNzLmJvcmRlckJvdHRvbVdpZHRoKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MuYm9yZGVyTGVmdFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyUmlnaHRXaWR0aCksCiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChjcy5ib3JkZXJUb3BXaWR0aCkgKyBwYXJzZUZsb2F0KGNzLmJvcmRlckJvdHRvbVdpZHRoKSwKICAgIH0KICB9OwogIGlmIChlbCA9PT0gUExPVCkgewogICAgLy8gRm9yIHRoZSBQTE9UIHdlIGFsc28gd2FudCB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgb2Zmc2V0CiAgICBvZGF0YS5vZmZzZXQgPSB7CiAgICAgIHRvcDogUExPVC5vZmZzZXRQYXJlbnQgPT0gQ09OVEFJTkVSID8gUExPVC5vZmZzZXRUb3AgOiAwLAogICAgICBsZWZ0OiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldExlZnQgOiAwLAogICAgfQogIH0KICByZXR1cm4gb2RhdGE7Cn0KZnVuY3Rpb24gZ2V0U2l6ZURhdGEoKSB7CiAgY29uc3QgZGF0YSA9IHsKICAgIHBsb3RfcGFkOiBnZXRPZmZzZXREYXRhKFBMT1QpLAogICAgcGxvdF9yZWN0OiBQTE9ULmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogICAgY29udGFpbmVyX3BhZDogZ2V0T2Zmc2V0RGF0YShDT05UQUlORVIpLAogICAgY29udGFpbmVyX3JlY3Q6IENPTlRBSU5FUi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICB9OwogIHJldHVybiBkYXRhOwp9CmZ1bmN0aW9uIGNvbXB1dGVDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICBjb25zdCBjb21wdXRlZF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICBjb25zdCBvZmZzZXRzID0gY29tcHV0ZWRfc2l6ZS5vZmZzZXRzOwoKICBjb25zdCBwbG90X2RhdGEgPSB7CiAgICB3aWR0aDogd2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCwKICAgIGhlaWdodDogaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH07CgogIHJldHVybiB7CiAgICB3aWR0aDogKHdpZHRoID8/IGNvbXB1dGVkX3NpemUud2lkdGgpICsgb2Zmc2V0cy53aWR0aCwKICAgIGhlaWdodDogKGhlaWdodCA/PyBjb21wdXRlZF9zaXplLmhlaWdodCkgKyBvZmZzZXRzLmhlaWdodCwKICAgIG5vQ2hhbmdlOiB3aWR0aCA9PSBjb21wdXRlZF9zaXplLndpZHRoICYmIGhlaWdodCA9PSBjb21wdXRlZF9zaXplLmhlaWdodCwKICB9Cn0KCi8vIFRoaXMgZnVuY3Rpb24gd2lsbCBjaGFuZ2UgdGhlIGNvbnRhaW5lciBzaXplIHNvIHRoYXQgdGhlIHJlc3VsdGluZyBwbG90IHdpbGwgYmUgbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIHNwZWNzCmZ1bmN0aW9uIGNoYW5nZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGlmICghQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIGNvbnNvbGUubG9nKCJUcmllZCB0byBjaGFuZ2UgY29udGFpbmVyIHNpemUgd2hlbiBub3QgcG9wcGVkLCBpZ25vcmluZyIpOwogICAgcmV0dXJuOwogIH0KCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhKTsKCiAgaWYgKGNzei5ub0NoYW5nZSkgewogICAgY29uc29sZS5sb2coIlNpemUgaXMgdGhlIHNhbWUgYXMgY3VycmVudCwgaWdub3JpbmciKTsKICAgIHJldHVybgogIH0KICAvLyBXZSBhcmUgbm93IGdvaW5nIHRvIHNldCBoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBjb250YWluZXIKICBmb3IgKGNvbnN0IGtleSBvZiBbIndpZHRoIiwgImhlaWdodCJdKSB7CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IGNzeltrZXldICsgInB4IjsKICB9Cn0KLy8gV2Ugbm93IGNyZWF0ZSB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIHVwZGF0ZSB0aGUgcGxvdCBiYXNlZCBvbiB0aGUgdmFsdWVzIHNwZWNpZmllZApmdW5jdGlvbiB1cGRhdGVGcm9tSGVhZGVyKCkgewogIGNvbnN0IGhlYWRlcl9kYXRhID0gewogICAgaGVpZ2h0OiBjb25maWdfc3BhbnMuaGVpZ2h0LnVpX3ZhbHVlLAogICAgd2lkdGg6IGNvbmZpZ19zcGFucy53aWR0aC51aV92YWx1ZSwKICB9OwogIGNoYW5nZUNvbnRhaW5lclNpemUoaGVhZGVyX2RhdGEpOwp9Ci8vIFdlIGFzc2lnbiB0aGlzIGZ1bmN0aW9uIHRvIHRoZSBvbmJsdXIgZXZlbnQgb2Ygd2lkdGggYW5kIGhlaWdodAppZiAoZmlyc3RSdW4pIHsKICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGNvbnRhaW5lci51aV9zcGFuLm9uYmx1ciA9IChlKSA9PiB7CiAgICAgIGNvbnRhaW5lci51aV92YWx1ZSA9IGNvbnRhaW5lci51aV9zcGFuLnRleHRDb250ZW50OwogICAgICB1cGRhdGVGcm9tSGVhZGVyKCk7CiAgICB9OwogIH0KfQovLyBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBwbG90IHNpemUgdG8gdXNlIGZvciByZWxheW91dCBhcyBhIGZ1bmN0aW9uIG9mIHRoZSBjb250YWluZXIgc2l6ZQpmdW5jdGlvbiBjb21wdXRlUGxvdFNpemUoZGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICAvLyBSZW1vdmUgUGFkZGluZwogIGNvbnN0IHsgY29udGFpbmVyX3BhZCwgcGxvdF9wYWQsIGNvbnRhaW5lcl9yZWN0IH0gPSBkYXRhOwogIGNvbnN0IG9mZnNldHMgPSB7CiAgICB3aWR0aDoKICAgICAgcGxvdF9wYWQucGFkZGluZy53aWR0aCArCiAgICAgIHBsb3RfcGFkLmJvcmRlci53aWR0aCArCiAgICAgIHBsb3RfcGFkLm9mZnNldC5sZWZ0ICsKICAgICAgY29udGFpbmVyX3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgY29udGFpbmVyX3BhZC5ib3JkZXIud2lkdGgsCiAgICBoZWlnaHQ6CiAgICAgIHBsb3RfcGFkLnBhZGRpbmcuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLmhlaWdodCArCiAgICAgIHBsb3RfcGFkLm9mZnNldC50b3AgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcuaGVpZ2h0ICsKICAgICAgY29udGFpbmVyX3BhZC5ib3JkZXIuaGVpZ2h0LAogIH07CiAgY29uc3Qgc3ogPSB7CiAgICB3aWR0aDogTWF0aC5yb3VuZChjb250YWluZXJfcmVjdC53aWR0aCAtIG9mZnNldHMud2lkdGgpLAogICAgaGVpZ2h0OiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LmhlaWdodCAtIG9mZnNldHMuaGVpZ2h0KSwKICAgIG9mZnNldHMsCiAgfTsKICByZXR1cm4gc3o7Cn0KCi8vIENyZWF0ZSB0aGUgcmVzaXplT2JzZXJ2ZXIgdG8gbWFrZSB0aGUgcGxvdCBldmVuIG1vcmUgcmVzcG9uc2l2ZSEgOm1hZ2ljOgpjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4gewogIGNvbnN0IHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKTsKICBjb25zdCB7Y29udGFpbmVyX3JlY3QsIGNvbnRhaW5lcl9wYWR9ID0gc2l6ZURhdGE7CiAgbGV0IHBsb3Rfc2l6ZSA9IGNvbXB1dGVQbG90U2l6ZShzaXplRGF0YSk7CiAgLy8gV2Ugc2F2ZSB0aGUgaGVpZ2h0IGluIHRoZSBQTE9UIG9iamVjdAogIFBMT1QuY29udGFpbmVyX2hlaWdodCA9IGNvbnRhaW5lcl9yZWN0LmhlaWdodDsKICAvLyBXZSBkZWFsIHdpdGggc29tZSBzdHVmZiBpZiB0aGUgY29udGFpbmVyIGlzIHBvcHBwZWQKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLndpZHRoID0gY29udGFpbmVyX3JlY3Qud2lkdGggKyAicHgiOwogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9IGNvbnRhaW5lcl9yZWN0LmxlZnQgKyAicHgiOwogIGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUgPSBwbG90X3NpemUuaGVpZ2h0OwogIGNvbmZpZ19zcGFucy53aWR0aC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS53aWR0aDsKICAvKiAKCQlUaGUgYWRkaXRpb24gb2YgdGhlIGludmFsaWQgYXJndW1lbnQgYHBsdXRvcmVzaXplYCBzZWVtcyB0byBmaXggdGhlIHByb2JsZW0gd2l0aCBjYWxsaW5nIGByZWxheW91dGAgc2ltcGx5IHdpdGggYHthdXRvc2l6ZTogdHJ1ZX1gIGFzIHVwZGF0ZSBicmVha2luZyBtb3VzZSByZWxheW91dCBldmVudHMgdHJhY2tpbmcuIAoJCVNlZSBodHRwczovL2dpdGh1Yi5jb20vcGxvdGx5L3Bsb3RseS5qcy9pc3N1ZXMvNjE1NiBmb3IgZGV0YWlscwoJCSovCiAgbGV0IGNvbmZpZyA9IHsKICAgIC8vIElmIHRoaXMgaXMgcG9wcGVkIG91dCwgd2UgaWdub3JlIHRoZSBvcmlnaW5hbCB3aWR0aC9oZWlnaHQKICAgIHdpZHRoOiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyB1bmRlZmluZWQgOiBvcmlnaW5hbF93aWR0aCkgPz8gcGxvdF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyB1bmRlZmluZWQgOiBvcmlnaW5hbF9oZWlnaHQpID8/IHBsb3Rfc2l6ZS5oZWlnaHQsCiAgICBwbHV0b3Jlc2l6ZTogdHJ1ZSwKICB9OwogIFBsb3RseS5yZWxheW91dChQTE9ULCBjb25maWcpLnRoZW4oKCkgPT4gewogICAgaWYgKHJlbW92ZV9jb250YWluZXJfc2l6ZSAmJiAhQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgdGhlIGZpcnN0IHJlc2l6ZSB1cG9uIHBsb3QgY3JlYXRpb24gdG8gYWxyZWFkeSBiZSB3aXRob3V0IGEgZml4ZWQgaGVpZ2h0CiAgICAgIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSAiIjsKICAgICAgQ09OVEFJTkVSLnN0eWxlLndpZHRoID0gIiI7CiAgICAgIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IGZhbHNlOwogICAgfQogIH0pOwp9KTsKCnJlc2l6ZU9ic2VydmVyLm9ic2VydmUoQ09OVEFJTkVSKTsKCgpQbG90bHkucmVhY3QoUExPVCwgcGxvdF9vYmopLnRoZW4oKCkgPT4gewoJLy8gQXNzaWduIHRoZSBQbG90bHkgZXZlbnQgbGlzdGVuZXJzCglmb3IgKGNvbnN0IFtrZXksIGxpc3RlbmVyX3ZlY10gb2YgT2JqZWN0LmVudHJpZXMocGxvdGx5X2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULm9uKGtleSwgbGlzdGVuZXIpCgkJfQoJfQoJLy8gQXNzaWduIHRoZSBKUyBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhqc19saXN0ZW5lcnMpKSB7CgkJZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcl92ZWMpIHsKCQkJUExPVC5hZGRFdmVudExpc3RlbmVyKGtleSwgbGlzdGVuZXIsIHsKCQkJCXNpZ25hbDogY29udHJvbGxlci5zaWduYWwKCQkJfSkKCQl9Cgl9Cn0KKQoKCmludmFsaWRhdGlvbi50aGVuKCgpID0+IHsKCS8vIFJlbW92ZSBhbGwgcGxvdGx5IGxpc3RlbmVycwoJUExPVC5yZW1vdmVBbGxMaXN0ZW5lcnMoKQoJLy8gUmVtb3ZlIGFsbCBKUyBsaXN0ZW5lcnMKCWNvbnRyb2xsZXIuYWJvcnQoKQoJLy8gUmVtb3ZlIHRoZSByZXNpemVPYnNlcnZlcgoJcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpCn0pCgoKCgkJcmV0dXJuIENPTlRBSU5FUgoJPC9zY3JpcHQ+CqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b+i76+ul7BwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkZjczMDgyZmYtYTZkMy00MWY4LTg3OTYtNDExNGZhODlkMmJiuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXPAAAAAT5wF9+1cHVibGlzaGVkX29iamVjdF9rZXlzkdk1MGJjZDhlOTAtODE4MS0xMWVmLTI0YzAtZjE0ZjZhNGQzMDg0LzM0MDlhNGI5ZTI1OThhZTe4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkNzBkYmMyYmQtOGI5My00NzFkLTgzNDAtMDRkOThhMDA4Y2E2iqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9keaCkbWltZap0ZXh0L3BsYWlurHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv6Ld4yTdsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQ3MGRiYzJiZC04YjkzLTQ3MWQtODM0MC0wNGQ5OGEwMDhjYTa5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4BfSUTtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkYWJlYTJjNDMtZDgzZS00NDM4LThjZDMtNGJlMDZiODE3NGIziqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedoBIjxkaXYgY2xhc3M9Im1hcmtkb3duIj48aDE+UmVwcm9kdWNpYmlsaXR5PC9oMT4KPHA+VGhpcyA8YSBocmVmPSJodHRwczovL3BsdXRvamwub3JnLyI+UGx1dG8gbm90ZWJvb2s8L2E+IGlzIHJlcHJvZHVjaWJsZSBieSBkZWZhdWx0LCBhcyBpdCBoYXMgYW4gZW1iZWRkZWQgPGNvZGU+UHJvamVjdC50b21sPC9jb2RlPiBhbmQgPGNvZGU+TWFuaWZlc3QudG9tbDwvY29kZT4sIHRoYXQgc3RvcmUgdGhlIGV4YWN0IHBhY2thZ2UgdmVyc2lvbnMgdXNlZCB0byBjcmVhdGUgdGhlIG5vdGVib29rLjwvcD4KPC9kaXY+pG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv6KrC7u6sHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SRhYmVhMmM0My1kODNlLTQ0MzgtOGNkMy00YmUwNmI4MTc0YjO5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4ABmo1tXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkYWU3MmZmYzUtN2Y4ZS00OTA3LWE5OWUtOGFkN2NiOGZkZGFiiqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedlxPGRpdiBjbGFzcz0ibWFya2Rvd24iPjxwPlRoZSBDTVJBIHNlcXVlbmNlICYjNDA7PGNvZGU+Q01SQV9pTkFWX2JTU0ZQX2NhcmRpYWM8L2NvZGU+JiM0MTsgY29uc2lzdHMgb2Y6PC9wPgo8L2Rpdj6kbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/oqsDSnOwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJGFlNzJmZmM1LTdmOGUtNDkwNy1hOTllLThhZDdjYjhmZGRhYrlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgADmQ61cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQwYjdhNDA1ZS1iYmI1LTExZWUtMDVjYS00YjFjODU2NzM5OGSKpnF1ZXVlZMKkbG9nc5GIpGxpbmX/o21zZ5LZK05ldyBLb21hTVJJUGxvdHMgYmFja2VuZCBzZXQ6IFBsdXRvUGxvdGx5LgqqdGV4dC9wbGFpbqdjZWxsX2lk2SQwYjdhNDA1ZS1iYmI1LTExZWUtMDVjYS00YjFjODU2NzM5OGSma3dhcmdzkKJpZLVLb21hTVJJUGxvdHNfZjc2ZTQ2NmGkZmlsZdlGL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Lb21hTVJJUGxvdHMvZ2RNTGcvc3JjL3VpL1Bsb3RCYWNrZW5kcy5qbKVncm91cKxQbG90QmFja2VuZHOlbGV2ZWykSW5mb6dydW5uaW5nwqZvdXRwdXSGpGJvZHmgpG1pbWWqdGV4dC9wbGFpbqxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b+i3dEorrBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkMGI3YTQwNWUtYmJiNS0xMWVlLTA1Y2EtNGIxYzg1NjczOThkuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXO9yafF7VwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJGRiZjE2Njc2LTY0ZjItNGQ5Yi1iZjFiLThkZTA2YjA0ODYwMoqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnZRDxkaXYgY2xhc3M9Im1hcmtkb3duIj48aDI+MS4xLiBMb2FkaW5nIHJlcXVpcmVkIHBhY2thZ2VzPC9oMj4KPC9kaXY+pG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv6KrAV10sHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SRkYmYxNjY3Ni02NGYyLTRkOWItYmYxYi04ZGUwNmIwNDg2MDK5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4ANntutXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkZjIxZTllNTktMjVjMy00ZjA2LThkZTQtNzkyY2IzMDVlYjAxiqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kednsPGRpdiBjbGFzcz0ibWFya2Rvd24iPjxoMT4yLiBTaW11bGF0aW9uPC9oMT4KPHA+VHdvIHNpbXVsYXRpb24gZXhwZXJpbWVudHMgd2VyZSBwZXJmb3JtZWQgdG8gb3B0aW1pemUgdGhlIHNlcXVlbmNlIHBhcmFtZXRlcnMsICYjNDA7MSYjNDE7IHRvIG9wdGltaXplIHRoZSBpbWFnaW5nIGZsaXAgYW5nbGUsIGFuZCAmIzQwOzImIzQxOyB0byBvcHRpbWl6ZSB0aGUgRmF0U2F0IGZsaXAgYW5nbGUuPC9wPgo8L2Rpdj6kbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/oqsFXK+wcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJGYyMWU5ZTU5LTI1YzMtNGYwNi04ZGU0LTc5MmNiMzA1ZWIwMblkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgAEhdS1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQwYjZjMWY3Mi1iMDQwLTQ4M2MtOTY5Yi04OGJmZTA5YjMyYzOKpnF1ZXVlZMKkbG9nc5GIpGxpbmX/o21zZ5LZLERvd25sb2FkaW5nIGEgbG9jYWwgdmVyc2lvbiBvZiBwbG90bHlAMi4yNi4yqnRleHQvcGxhaW6nY2VsbF9pZNkkMGI2YzFmNzItYjA0MC00ODNjLTk2OWItODhiZmUwOWIzMmMzpmt3YXJnc5CiaWS0UGx1dG9QbG90bHlfNzBhNTAxZDikZmlsZdlKL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9QbHV0b1Bsb3RseS9QZWNKUC9zcmMvbG9jYWxfcGxvdGx5X2xpYnJhcnkuamylZ3JvdXC0bG9jYWxfcGxvdGx5X2xpYnJhcnmlbGV2ZWykSW5mb6dydW5uaW5nwqZvdXRwdXSGpGJvZHnaaogJPHNjcmlwdCBpZD0ncGxvdF8xJz4KCQkvLyBXZSBzdGFydCBieSBwdXR0aW5nIGFsbCB0aGUgdmFyaWFibGUgaW50ZXJwb2xhdGlvbiBoZXJlIGF0IHRoZSBiZWdpbm5pbmcKCQkvLyBXZSBoYXZlIHRvIGNvbnZlcnQgYWxsIHR5cGVkYXJyYXlzIGluIHRoZSBsYXlvdXQgdG8gbm9ybWFsIGFycmF5cy4gU2VlIElzc3VlICMyNQoJCS8vIFdlIHVzZSBsb2Rhc2ggZm9yIHRoaXMgZm9yIGNvbXBhY3RuZXNzCgkJZnVuY3Rpb24gcmVtb3ZlVHlwZWRBcnJheShvKSB7CgkJCXJldHVybiBfLmlzVHlwZWRBcnJheShvKSA/IEFycmF5LmZyb20obykgOgoJCQlfLmlzUGxhaW5PYmplY3QobykgPyBfLm1hcFZhbHVlcyhvLCByZW1vdmVUeXBlZEFycmF5KSA6IAoJCQlvCgkJfQoKCQkvLyBQdWJsaXNoIHRoZSBwbG90IG9iamVjdCB0byBKUwoJCWxldCBwbG90X29iaiA9IF8udXBkYXRlKC8qIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgQWJzdHJhY3RQbHV0b0RpbmdldGplcy5EaXNwbGF5LnB1Ymxpc2hlZF90b19qcyAqLyBnZXRQdWJsaXNoZWRPYmplY3QoIjBiY2Q4ZTkwLTgxODEtMTFlZi0yNGMwLWYxNGY2YTRkMzA4NC84YjM0MmNjODZkMjZlMzUiKSwgImxheW91dCIsIHJlbW92ZVR5cGVkQXJyYXkpCgkJLy8gR2V0IHRoZSBwbG90bHkgbGlzdGVuZXJzCgkJY29uc3QgcGxvdGx5X2xpc3RlbmVycyA9IHt9CgkJLy8gR2V0IHRoZSBKUyBsaXN0ZW5lcnMKCQljb25zdCBqc19saXN0ZW5lcnMgPSB7fQoJCS8vIERlYWwgd2l0aCBldmVudHVhbCBjdXN0b20gY2xhc3NlcwoJCWxldCBjdXN0b21fY2xhc3NsaXN0ID0gW10KCgoJCS8vIExvYWQgdGhlIHBsb3RseSBsaWJyYXJ5CgkJbGV0IFBsb3RseSA9IHVuZGVmaW5lZAoJCXRyeSB7CgkJCWxldCBfbW9kID0gYXdhaXQgaW1wb3J0KCIuL3Bsb3RseWpzL3Bsb3RseWpzLTIuMjYuMi5taW4uanMiKQoJCQlQbG90bHkgPSBfbW9kLmRlZmF1bHQKCQl9IGNhdGNoIChlKSB7CgkJCWNvbnNvbGUubG9nKCJMb2NhbCBsb2FkIGZhaWxlZCwgdHJ5aW5nIHdpdGggdGhlIHdlYiBlc20uc2ggdmVyc2lvbiIpCgkJCWxldCBfbW9kID0gYXdhaXQgaW1wb3J0KCJodHRwczovL2VzbS5zaC92MTM1L3Bsb3RseS5qcy1kaXN0LW1pbkAyLjI2LjIvZXNuZXh0L3Bsb3RseS5qcy1kaXN0LW1pbi5tanMiKQoJCQlQbG90bHkgPSBfbW9kLmRlZmF1bHQKCQl9CgoJCS8vIENoZWNrIGlmIHdlIGhhdmUgdG8gZm9yY2UgbG9jYWwgbWF0aGpheCBmb250IGNhY2hlCgkJaWYgKGZhbHNlICYmIHdpbmRvdz8uTWF0aEpheD8uY29uZmlnPy5zdmc/LmZvbnRDYWNoZSA9PT0gJ2dsb2JhbCcpIHsKCQkJd2luZG93Lk1hdGhKYXguY29uZmlnLnN2Zy5mb250Q2FjaGUgPSAnbG9jYWwnCgkJfQoKCQkvLyBGbGFnIHRvIGNoZWNrIGlmIHRoaXMgY2VsbCB3YXMgIG1hbnVhbGx5IHJhbiBvciByZWFjdGl2ZWx5IHJhbgpjb25zdCBmaXJzdFJ1biA9IHRoaXMgPyBmYWxzZSA6IHRydWUKY29uc3QgQ09OVEFJTkVSID0gdGhpcyA/PyBodG1sYDxkaXYgY2xhc3M9J3BsdXRvcGxvdGx5LWNvbnRhaW5lcic+YApjb25zdCBQTE9UID0gQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoJy5qcy1wbG90bHktcGxvdCcpID8/IENPTlRBSU5FUi5hcHBlbmRDaGlsZChodG1sYDxkaXY+YCkKY29uc3QgcGFyZW50ID0gQ09OVEFJTkVSLnBhcmVudEVsZW1lbnQKLy8gV2UgdXNlIGEgY29udHJvbGxlciB0byByZW1vdmUgZXZlbnQgbGlzdGVuZXJzIHVwb24gaW52YWxpZGF0aW9uCmNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCkKLy8gV2UgaGF2ZSB0byBhZGQgdGhpcyB0byBrZWVwIHN1cHBvcnRpbmcgQGJpbmQgd2l0aCB0aGUgb2xkIEFQSSB1c2luZyBQTE9UClBMT1QuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoZSkgPT4gewoJQ09OVEFJTkVSLnZhbHVlID0gUExPVC52YWx1ZQoJaWYgKGUuYnViYmxlcykgewoJCXJldHVybgoJfQoJQ09OVEFJTkVSLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdpbnB1dCcpKQp9LCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSkKCgkvLyBUaGlzIGNyZWF0ZSB0aGUgc3R5bGUgc3ViZGl2IG9uIGZpcnN0IHJ1bgoJZmlyc3RSdW4gJiYgQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgCgk8c3R5bGU+CgkucGx1dG9wbG90bHktY29udGFpbmVyIHsKCQl3aWR0aDogMTAwJTsKCQloZWlnaHQ6IDEwMCU7CgkJbWluLWhlaWdodDogMDsKCQltaW4td2lkdGg6IDA7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyIC5qcy1wbG90bHktcGxvdCAucGxvdGx5IGRpdiB7CgkJbWFyZ2luOiAwIGF1dG87IC8vIFRoaXMgY2VudGVycyB0aGUgcGxvdAoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5wb3BwZWQtb3V0IHsKCQlvdmVyZmxvdzogYXV0bzsKCQl6LWluZGV4OiAxMDAwOwoJCXBvc2l0aW9uOiBmaXhlZDsKCQlyZXNpemU6IGJvdGg7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwcHg7CgkJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDBweDsKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIHsKCQlkaXNwbGF5OiBmbGV4OwoJCWZsZXgtZmxvdzogcm93IHdyYXA7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMTJweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMTJweDsKCQlwb3NpdGlvbjogZml4ZWQ7CgkJei1pbmRleDogMTAwMTsKCQljdXJzb3I6IG1vdmU7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCAtMTAwJSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgc3BhbiB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCWZsZXg6IDEKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyLmhpZGRlbiB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3BhbiB7CgkJcG9zaXRpb246IHJlbGF0aXZlOwoJfQoJLmNsaXBib2FyZC12YWx1ZSB7CgkJcGFkZGluZy1yaWdodDogNXB4OwoJCXBhZGRpbmctbGVmdDogMnB4OwoJCWN1cnNvcjogdGV4dDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZmlsZW5hbWUgewoJCWZsZXg6IDAgMCAxMDAlOwoJCXRleHQtYWxpZ246IGNlbnRlcjsKCQlib3JkZXItdG9wOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJbWFyZ2luLXRvcDogNXB4OwoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5maWxlbmFtZSB7CgkJbWFyZ2luLWxlZnQ6IDNweDsKCQl0ZXh0LWFsaWduOiBsZWZ0OwoJCW1pbi13aWR0aDogbWluKDYwJSwgbWluLWNvbnRlbnQpOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5maWxlc2F2ZSAuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgLmxhYmVsIHsKCQlmbGV4OiAwIDAgMDsKCX0KCS5jbGlwYm9hcmQtdmFsdWUuZm9ybWF0IHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7CgkJZmxleDogMSAwIGF1dG87CgkJbWluLXdpZHRoOiAzMHB4OwoJCW1hcmdpbi1yaWdodDogMTBweDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyB7CgkJZGlzcGxheTogaW5saW5lLWZsZXg7CgkJZmxleC1mbG93OiBjb2x1bW47CgkJcG9zaXRpb246IGFic29sdXRlOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJcGFkZGluZy1sZWZ0OiAzcHg7CgkJei1pbmRleDogMjAwMDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9uczpob3ZlciB7CgkJY3Vyc29yOiBwb2ludGVyOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCXBhZGRpbmc6IDNweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtM3B4LCAtNnB4KTsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyAuZm9ybWF0LW9wdGlvbiB7CgkJZGlzcGxheTogbm9uZTsKCX0KCWRpdi5mb3JtYXQtb3B0aW9uczpob3ZlciAuZm9ybWF0LW9wdGlvbiB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246bm90KC5zZWxlY3RlZCkgewoJCW1hcmdpbi10b3A6IDNweDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyAuZm9ybWF0LW9wdGlvbi5zZWxlY3RlZCB7CgkJb3JkZXI6IC0xOwoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5mb3JtYXQtb3B0aW9uOmhvdmVyIHsKCQliYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCX0KCXNwYW4uY29uZmlnLXZhbHVlIHsKCQlmb250LXdlaWdodDogbm9ybWFsOwoJCWNvbG9yOiB2YXIoLS1wbHV0by1vdXRwdXQtY29sb3IpOwoJCWRpc3BsYXk6IG5vbmU7CgkJcG9zaXRpb246IGFic29sdXRlOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCBjYWxjKC0xMDAlIC0gMTBweCkpOwoJCXBhZGRpbmc6IDVweDsKCX0KCS5sYWJlbCB7CgkJdXNlci1zZWxlY3Q6IG5vbmU7Cgl9CgkubGFiZWw6aG92ZXIgc3Bhbi5jb25maWctdmFsdWUgewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQltaW4td2lkdGg6IDE1MHB4OwoJfQoJLmNsaXBib2FyZC1zcGFuLm1hdGNoaW5nLWNvbmZpZyAubGFiZWwgewoJCWNvbG9yOiB2YXIoLS1jbS1tYWNyby1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZGlmZmVyZW50LWNvbmZpZyAubGFiZWwgewoJCWNvbG9yOiB2YXIoLS1jbS10YWctY29sb3IpOwoJCWZvbnQtd2VpZ2h0OiBib2xkOwoJfQo8L3N0eWxlPgpgKQoKbGV0IG9yaWdpbmFsX2hlaWdodCA9IHBsb3Rfb2JqLmxheW91dC5oZWlnaHQKbGV0IG9yaWdpbmFsX3dpZHRoID0gcGxvdF9vYmoubGF5b3V0LndpZHRoCi8vIEZvciB0aGUgaGVpZ2h0IHdlIGhhdmUgdG8gYWxzbyBwdXQgYSBmaXhlZCB2YWx1ZSBpbiBjYXNlIHRoZSBwbG90IGlzIHB1dCBvbiBhIG5vbi1maXhlZC1zaXplIGNvbnRhaW5lciAobGlrZSB0aGUgZGVmYXVsdCB3cmFwcGVyKQovLyBXZSBkZWZpbmUgYSB2YXJpYWJsZSB0byBjaGVjayB3aGV0aGVyIHdlIHN0aWxsIGhhdmUgdG8gcmVtb3ZlIHRoZSBmaXhlZCBoZWlnaHQKbGV0IHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IGZpcnN0UnVuCmxldCBjb250YWluZXJfaGVpZ2h0ID0gb3JpZ2luYWxfaGVpZ2h0ID8/IFBMT1QuY29udGFpbmVyX2hlaWdodCA/PyA0MDAKQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9IGNvbnRhaW5lcl9oZWlnaHQgKyAncHgnCgovLyBXZSBjcmVhdGUgYSBQcm9taXNlIHZlcnNpb24gb2Ygc2V0VGltZW91dApmdW5jdGlvbiBkZWxheShtcykgewogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpOwp9CgovLyBXZSBpbXBvcnQgaW50ZXJhY3QgZm9yIGRyYWdnaW5nL3Jlc2l6aW5nCmNvbnN0IHsgZGVmYXVsdDogaW50ZXJhY3QgfSA9IGF3YWl0IGltcG9ydCgnaHR0cHM6Ly9lc20uc2gvaW50ZXJhY3Rqc0AxLjEwLjE5JykKCgpmdW5jdGlvbiBnZXRJbWFnZU9wdGlvbnMoKSB7CiAgY29uc3QgbyA9IHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICByZXR1cm4gewogICAgZm9ybWF0OiBvLmZvcm1hdCA/PyAicG5nIiwKICAgIHdpZHRoOiBvLndpZHRoID8/IG9yaWdpbmFsX3dpZHRoLAogICAgaGVpZ2h0OiBvLmhlaWdodCA/PyBvcmlnaW5hbF9oZWlnaHQsCiAgICBzY2FsZTogby5zY2FsZSA/PyAxLAogICAgZmlsZW5hbWU6IG8uZmlsZW5hbWUgPz8gIm5ld3Bsb3QiLAogIH07Cn0KCmNvbnN0IENMSVBCT0FSRF9IRUFERVIgPQogIENPTlRBSU5FUi5xdWVyeVNlbGVjdG9yKCIucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciIpID8/CiAgQ09OVEFJTkVSLmluc2VydEFkamFjZW50RWxlbWVudCgKICAgICJhZnRlcmJlZ2luIiwKICAgIGh0bWxgPGRpdiBjbGFzcz0icGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBoaWRkZW4iPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gZm9ybWF0IgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZvcm1hdDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBmb3JtYXQiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gd2lkdGgiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+V2lkdGg6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgd2lkdGgiPjwvc3Bhbj5weDwvc3BhbgogICAgICA+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBoZWlnaHQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+SGVpZ2h0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGhlaWdodCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHNjYWxlIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPlNjYWxlOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIHNjYWxlIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2V0Ij5TZXQ8L2J1dHRvbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gdW5zZXQiPlVuc2V0PC9idXR0b24+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmaWxlbmFtZSIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5GaWxlbmFtZTo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBmaWxlbmFtZSI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICA8L2Rpdj5gCiAgKTsKCmZ1bmN0aW9uIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpIHsKICBjb25zdCB2YWxpZF9jbGFzc2VzID0gWwogICAgIm1pc3NpbmctY29uZmlnIiwKICAgICJtYXRjaGluZy1jb25maWciLAogICAgImRpZmZlcmVudC1jb25maWciLAogIF07CiAgZnVuY3Rpb24gc2V0Q2xhc3MoY2wpIHsKICAgIGZvciAoY29uc3QgbmFtZSBvZiB2YWxpZF9jbGFzc2VzKSB7CiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKG5hbWUsIG5hbWUgPT0gY2wpOwogICAgfQogIH0KICAvLyBXZSB1c2UgdGhlIGN1c3RvbSBnZXR0ZXJzIHdlJ2xsIHNldCB1cCBpbiB0aGUgY29udGFpbmVyCiAgY29uc3QgeyB1aV92YWx1ZSwgY29uZmlnX3ZhbHVlLCBjb25maWdfc3Bhbiwga2V5IH0gPSBjb250YWluZXI7CiAgaWYgKGNvbmZpZ192YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICBzZXRDbGFzcygibWlzc2luZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaXMgbm90IHByZXNlbnQgaW4gdGhlIGNvbmZpZy5gOwogIH0gZWxzZSBpZiAodWlfdmFsdWUgPT0gY29uZmlnX3ZhbHVlKSB7CiAgICBzZXRDbGFzcygibWF0Y2hpbmctY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGhhcyB0aGUgc2FtZSB2YWx1ZSBpbiB0aGUgY29uZmlnIGFuZCBpbiB0aGUgaGVhZGVyLmA7CiAgfSBlbHNlIHsKICAgIHNldENsYXNzKCJkaWZmZXJlbnQtY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGhhcyBhIGRpZmZlcmVudCB2YWx1ZSAoPGVtPiR7Y29uZmlnX3ZhbHVlfTwvZW0+KSBpbiB0aGUgY29uZmlnLmA7CiAgfQogIC8vIEFkZCBpbmZvIGFib3V0IHNldHRpbmcgYW5kIHVuc2V0dGluZwogIGNvbmZpZ19zcGFuLmluc2VydEFkamFjZW50SFRNTCgKICAgICJiZWZvcmVlbmQiLAogICAgYDxicj5DbGljayBvbiB0aGUgbGFiZWwgPGVtPjxiPm9uY2U8L2I+PC9lbT4gdG8gc2V0IHRoZSBjdXJyZW50IFVJIHZhbHVlIGluIHRoZSBjb25maWcuYAogICk7CiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIDxlbT48Yj50d2ljZTwvYj48L2VtPiB0byByZW1vdmUgdGhpcyBrZXkgZnJvbSB0aGUgY29uZmlnLmAKICApOwp9Cgpjb25zdCB2YWxpZF9mb3JtYXRzID0gWyJwbmciLCAic3ZnIiwgIndlYnAiLCAianBlZyIsICJmdWxsLWpzb24iXTsKZnVuY3Rpb24gaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHNwYW4sIGtleSwgdmFsdWUpIHsKICBjb25zdCBjb250YWluZXIgPSBzcGFuLmNsb3Nlc3QoIi5jbGlwYm9hcmQtc3BhbiIpOwogIHNwYW4uY29udGVudEVkaXRhYmxlID0ga2V5ID09PSAiZm9ybWF0IiA/ICJmYWxzZSIgOiAidHJ1ZSI7CiAgbGV0IHBhcnNlID0gKHgpID0+IHg7CiAgbGV0IHVwZGF0ZSA9ICh4KSA9PiAoc3Bhbi50ZXh0Q29udGVudCA9IHgpOwogIGlmIChrZXkgPT09ICJ3aWR0aCIgfHwga2V5ID09PSAiaGVpZ2h0IikgewogICAgcGFyc2UgPSAoeCkgPT4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KHgpKTsKICB9IGVsc2UgaWYgKGtleSA9PT0gInNjYWxlIikgewogICAgcGFyc2UgPSBwYXJzZUZsb2F0OwogIH0gZWxzZSBpZiAoa2V5ID09PSAiZm9ybWF0IikgewogICAgLy8gV2UgcmVtb3ZlIGNvbnRlbnRFZGl0YWJsZQogICAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSAiZmFsc2UiOwogICAgLy8gSGVyZSB3ZSBmaXJzdCBhZGQgdGhlIHN1YnNwYW5zIGZvciBlYWNoIG9wdGlvbgogICAgY29uc3Qgb3B0c19kaXYgPSBzcGFuLmFwcGVuZENoaWxkKGh0bWxgPGRpdiBjbGFzcz0iZm9ybWF0LW9wdGlvbnMiPjwvZGl2PmApOwogICAgZm9yIChjb25zdCBmbXQgb2YgdmFsaWRfZm9ybWF0cykgewogICAgICBjb25zdCBvcHQgPSBvcHRzX2Rpdi5hcHBlbmRDaGlsZCgKICAgICAgICBodG1sYDxzcGFuIGNsYXNzPSJmb3JtYXQtb3B0aW9uICR7Zm10fSI+JHtmbXR9PC9zcGFuPmAKICAgICAgKTsKICAgICAgb3B0Lm9uY2xpY2sgPSAoZSkgPT4gewogICAgICAgIHNwYW4udmFsdWUgPSBvcHQudGV4dENvbnRlbnQ7CiAgICAgIH07CiAgICB9CiAgICBwYXJzZSA9ICh4KSA9PiB7CiAgICAgIHJldHVybiB2YWxpZF9mb3JtYXRzLmluY2x1ZGVzKHgpID8geCA6IGxvY2FsVmFsdWU7CiAgICB9OwogICAgdXBkYXRlID0gKHgpID0+IHsKICAgICAgZm9yIChjb25zdCBvcHQgb2Ygb3B0c19kaXYuY2hpbGRyZW4pIHsKICAgICAgICBvcHQuY2xhc3NMaXN0LnRvZ2dsZSgic2VsZWN0ZWQiLCBvcHQudGV4dENvbnRlbnQgPT09IHgpOwogICAgICB9CiAgICB9OwogIH0gZWxzZSB7CiAgICAvLyBXZSBvbmx5IGhhdmUgZmlsZW5hbWUgaGVyZQogIH0KICBsZXQgbG9jYWxWYWx1ZTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBsb2NhbFZhbHVlOwogICAgfSwKICAgIHNldDogKHZhbCkgPT4gewogICAgICBpZiAodmFsICE9PSAiIikgewogICAgICAgIGxvY2FsVmFsdWUgPSBwYXJzZSh2YWwpOwogICAgICB9CiAgICAgIHVwZGF0ZShsb2NhbFZhbHVlKTsKICAgICAgY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcik7CiAgICB9LAogIH0pOwogIC8vIFdlIGFsc28gYXNzaWduIGEgbGlzdGVuZXIgc28gdGhhdCB0aGUgZWRpdGFibGUgaXMgYmx1cnJlZCB3aGVuIGVudGVyIGlzIHByZXNzZWQKICBzcGFuLm9ua2V5ZG93biA9IChlKSA9PiB7CiAgICBpZiAoZS5rZXlDb2RlID09PSAxMykgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHNwYW4uYmx1cigpOwogICAgfQogIH07CiAgc3Bhbi52YWx1ZSA9IHZhbHVlOwp9CgpmdW5jdGlvbiBpbml0aWFsaXplQ29uZmlnVmFsdWVTcGFuKHNwYW4sIGtleSkgewogIC8vIEhlcmUgd2UgbW9zdGx5IHdhbnQgdG8gZGVmaW5lIHRoZSBzZXR0ZXIgYW5kIGdldHRlcgogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwYW4sICJ2YWx1ZSIsIHsKICAgIGdldDogKCkgPT4gewogICAgICByZXR1cm4gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV07CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIC8vIGlmIHVuZGVmaW5lZCBpcyBwYXNzZWQsIHdlIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgb3B0aW9ucwogICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsKICAgICAgICBkZWxldGUgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV0gPSB2YWw7CiAgICAgIH0KICAgICAgY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcik7CiAgICB9LAogIH0pOwp9Cgpjb25zdCBjb25maWdfc3BhbnMgPSB7fTsKZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZ2V0SW1hZ2VPcHRpb25zKCkpKSB7CiAgY29uc3QgY29udGFpbmVyID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKGAuY2xpcGJvYXJkLXNwYW4uJHtrZXl9YCk7CiAgY29uc3QgbGFiZWwgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmxhYmVsIik7CiAgLy8gV2UgZ2l2ZSB0aGUgbGFiZWwgYSBmdW5jdGlvbiB0aGF0IG9uIHNpbmdsZSBjbGljayB3aWxsIHNldCB0aGUgY3VycmVudCB2YWx1ZSBhbmQgd2l0aCBkb3VibGUgY2xpY2sgd2lsbCB1bnNldCBpdAogIGxhYmVsLm9uY2xpY2sgPSBEdWFsQ2xpY2soCiAgICAoKSA9PiB7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBjb250YWluZXIudWlfdmFsdWU7CiAgICB9LAogICAgKGUpID0+IHsKICAgICAgY29uc29sZS5sb2coImUiLCBlKTsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gdW5kZWZpbmVkOwogICAgfQogICk7CiAgY29uc3QgdWlfdmFsdWVfc3BhbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXZhbHVlIik7CiAgY29uc3QgY29uZmlnX3ZhbHVlX3NwYW4gPQogICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jb25maWctdmFsdWUiKSA/PwogICAgbGFiZWwuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgICAiYWZ0ZXJiZWdpbiIsCiAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImNvbmZpZy12YWx1ZSI+PC9zcGFuPmAKICAgICk7CiAgLy8gQXNzaW5nIHRoZSB0d28gc3BhbnMgYXMgcHJvcGVydGllcyBvZiB0aGUgY29udGFpbmluZyBzcGFuCiAgY29udGFpbmVyLnVpX3NwYW4gPSB1aV92YWx1ZV9zcGFuOwogIGNvbnRhaW5lci5jb25maWdfc3BhbiA9IGNvbmZpZ192YWx1ZV9zcGFuOwogIGNvbnRhaW5lci5rZXkgPSBrZXk7CiAgY29uZmlnX3NwYW5zW2tleV0gPSBjb250YWluZXI7CiAgaWYgKGZpcnN0UnVuKSB7CiAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPQogICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPz8ge307CiAgICAvLyBXZSBkbyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHZhbHVlIHNwYW4KICAgIGluaXRpYWxpemVVSVZhbHVlU3Bhbih1aV92YWx1ZV9zcGFuLCBrZXksIHZhbHVlKTsKICAgIC8vIFRoZW4gd2UgaW5pdGlhbGl6ZSB0aGUgY29uZmlnIHZhbHVlCiAgICBpbml0aWFsaXplQ29uZmlnVmFsdWVTcGFuKGNvbmZpZ192YWx1ZV9zcGFuLCBrZXkpOwogICAgLy8gV2UgcHV0IHNvbWUgY29udmVuaWVuY2UgZ2V0dGVycy9zZXR0ZXJzCiAgICAvLyB1aV92YWx1ZSBmb3J3YXJkCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAidWlfdmFsdWUiLCB7CiAgICAgIGdldDogKCkgPT4gdWlfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgdWlfdmFsdWVfc3Bhbi52YWx1ZSA9IHZhbDsKICAgICAgfSwKICAgIH0pOwogICAgLy8gY29uZmlnX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJjb25maWdfdmFsdWUiLCB7CiAgICAgIGdldDogKCkgPT4gY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUsCiAgICAgIHNldDogKHZhbCkgPT4gewogICAgICAgIGNvbmZpZ192YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgfQp9CgovLyBUaGVzZSBvYmplY3RzIHdpbGwgY29udGFpbiB0aGUgZGVmYXVsdCB2YWx1ZQoKLy8gVGhpcyBjb2RlIHVwZGF0ZXMgdGhlIGltYWdlIG9wdGlvbnMgaW4gdGhlIFBMT1QgY29uZmlnIHdpdGggdGhlIHByb3ZpZGVkIG9uZXMKZnVuY3Rpb24gc2V0SW1hZ2VPcHRpb25zKG8pIHsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IG9ba2V5XTsKICB9Cn0KZnVuY3Rpb24gdW5zZXRJbWFnZU9wdGlvbnMoKSB7CiAgc2V0SW1hZ2VPcHRpb25zKHt9KTsKfQoKY29uc3Qgc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnNldCIpOwpjb25zdCB1bnNldF9idXR0b24gPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtc3Bhbi51bnNldCIpOwppZiAoZmlyc3RSdW4pIHsKICBzZXRfYnV0dG9uLm9uY2xpY2sgPSAoZSkgPT4gewogICAgZm9yIChjb25zdCBjb250YWluZXIgb2YgT2JqZWN0LnZhbHVlcyhjb25maWdfc3BhbnMpKSB7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBjb250YWluZXIudWlfdmFsdWU7CiAgICB9CiAgfTsKICB1bnNldF9idXR0b24ub25jbGljayA9IHVuc2V0SW1hZ2VPcHRpb25zOwp9CgovLyBXZSBhZGQgYSBmdW5jdGlvbiB0byBjaGVjayBpZiB0aGUgY2xpcGJvYXJkIGlzIHBvcHBlZCBvdXQKQ09OVEFJTkVSLmlzUG9wcGVkT3V0ID0gKCkgPT4gewogIHJldHVybiBDT05UQUlORVIuY2xhc3NMaXN0LmNvbnRhaW5zKCJwb3BwZWQtb3V0Iik7Cn07CgpDTElQQk9BUkRfSEVBREVSLm9ubW91c2Vkb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgaWYgKGV2ZW50LnRhcmdldC5tYXRjaGVzKCJzcGFuLmNsaXBib2FyZC12YWx1ZSIpKSB7CiAgICBjb25zb2xlLmxvZygiV2UgZG9uJ3QgbW92ZSEiKTsKICAgIHJldHVybjsKICB9CiAgY29uc3Qgc3RhcnQgPSB7CiAgICBsZWZ0OiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS5sZWZ0KSwKICAgIHRvcDogcGFyc2VGbG9hdChDT05UQUlORVIuc3R5bGUudG9wKSwKICAgIFg6IGV2ZW50LnBhZ2VYLAogICAgWTogZXZlbnQucGFnZVksCiAgfTsKICBmdW5jdGlvbiBtb3ZlQXQoZXZlbnQsIHN0YXJ0KSB7CiAgICBjb25zdCB0b3AgPSBldmVudC5wYWdlWSAtIHN0YXJ0LlkgKyBzdGFydC50b3AgKyAicHgiOwogICAgY29uc3QgbGVmdCA9IGV2ZW50LnBhZ2VYIC0gc3RhcnQuWCArIHN0YXJ0LmxlZnQgKyAicHgiOwogICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gbGVmdDsKICAgIENPTlRBSU5FUi5zdHlsZS5sZWZ0ID0gbGVmdDsKICAgIENPTlRBSU5FUi5zdHlsZS50b3AgPSB0b3A7CiAgfQoKICAvLyBtb3ZlIG91ciBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYmFsbCB1bmRlciB0aGUgcG9pbnRlcgogIG1vdmVBdChldmVudCwgc3RhcnQpOwogIGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGV2ZW50KSB7CiAgICBtb3ZlQXQoZXZlbnQsIHN0YXJ0KTsKICB9CgogIC8vIFdlIHVzZSB0aGlzIHRvIHJlbW92ZSB0aGUgbW91c2Vtb3ZlIHdoZW4gY2xpY2tpbmcgb3V0c2lkZSBvZiB0aGUgY29udGFpbmVyCiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgLy8gbW92ZSB0aGUgY29udGFpbmVyIG9uIG1vdXNlbW92ZQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIG9uTW91c2VNb3ZlLCB7CiAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLAogIH0pOwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAibW91c2Vkb3duIiwKICAgIChlKSA9PiB7CiAgICAgIGlmIChlLnRhcmdldC5jbG9zZXN0KCIucGx1dG9wbG90bHktY29udGFpbmVyIikgIT09IENPTlRBSU5FUikgewogICAgICAgIGNsZWFuVXAoKTsKICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9LAogICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0KICApOwoKICBmdW5jdGlvbiBjbGVhblVwKCkgewogICAgY29uc29sZS5sb2coImNsZWFuaW5nIHVwIHRoZSBwbG90IG1vdmUgbGlzdGVuZXIiKTsKICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gbnVsbDsKICB9CgogIC8vICgzKSBkcm9wIHRoZSBiYWxsLCByZW1vdmUgdW5uZWVkZWQgaGFuZGxlcnMKICBDTElQQk9BUkRfSEVBREVSLm9ubW91c2V1cCA9IGNsZWFuVXA7Cn07CgpmdW5jdGlvbiBzZW5kVG9DbGlwYm9hcmQoYmxvYikgewogIGlmICghbmF2aWdhdG9yLmNsaXBib2FyZCkgewogICAgYWxlcnQoCiAgICAgICJUaGUgQ2xpcGJvYXJkIEFQSSBkb2VzIG5vdCBzZWVtIHRvIGJlIGF2YWlsYWJsZSwgbWFrZSBzdXJlIHRoZSBQbHV0byBub3RlYm9vayBpcyBiZWluZyB1c2VkIGZyb20gZWl0aGVyIGxvY2FsaG9zdCBvciBhbiBodHRwcyBzb3VyY2UuIgogICAgKTsKICB9CiAgbmF2aWdhdG9yLmNsaXBib2FyZAogICAgLndyaXRlKFsKICAgICAgbmV3IENsaXBib2FyZEl0ZW0oewogICAgICAgIC8vIFRoZSBrZXkgaXMgZGV0ZXJtaW5lZCBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgYmxvYidzIHR5cGUuCiAgICAgICAgW2Jsb2IudHlwZV06IGJsb2IsCiAgICAgIH0pLAogICAgXSkKICAgIC50aGVuKAogICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgY29uc29sZS5sb2coIkFzeW5jOiBDb3B5aW5nIHRvIGNsaXBib2FyZCB3YXMgc3VjY2Vzc2Z1bCEiKTsKICAgICAgfSwKICAgICAgZnVuY3Rpb24gKGVycikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkFzeW5jOiBDb3VsZCBub3QgY29weSB0ZXh0OiAiLCBlcnIpOwogICAgICB9CiAgICApOwp9CgpmdW5jdGlvbiBjb3B5SW1hZ2VUb0NsaXBib2FyZCgpIHsKICAvLyBXZSBleHRyYWN0IHRoZSBpbWFnZSBvcHRpb25zIGZyb20gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMgKGlmIHRoZXkgZXhpc3QpCiAgY29uc3QgY29uZmlnID0ge307CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGxldCB2YWwgPQogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID8/CiAgICAgIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IGNvbnRhaW5lci51aV92YWx1ZSA6IHVuZGVmaW5lZCk7CiAgICAvLyBJZiB3ZSBoYXZlIHVuZGVmaW5lZCB3ZSBkb24ndCBjcmVhdGUgdGhlIGtleS4gV2UgYWxzbyBpZ25vcmUgZm9ybWF0IGJlY2F1c2UgdGhlIGNsaXBib2FyZCBvbmx5IHN1cHBvcnRzIHBuZy4KICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS50b0ltYWdlKFBMT1QsIGNvbmZpZykudGhlbihmdW5jdGlvbiAoZGF0YVVybCkgewogICAgZmV0Y2goZGF0YVVybCkKICAgICAgLnRoZW4oKHJlcykgPT4gcmVzLmJsb2IoKSkKICAgICAgLnRoZW4oKGJsb2IpID0+IHsKICAgICAgICBjb25zdCBwYXN0ZV9yZWNlaXZlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3Bhc3RlLXJlY2VpdmVyLnBsdXRvcGxvdGx5JykKICAgICAgICBpZiAocGFzdGVfcmVjZWl2ZXIpIHsKICAgICAgICAgIHBhc3RlX3JlY2VpdmVyLmF0dGFjaEltYWdlKGRhdGFVcmwsIENPTlRBSU5FUikKICAgICAgICB9CiAgICAgICAgc2VuZFRvQ2xpcGJvYXJkKGJsb2IpCiAgICAgIH0pOwogIH0pOwp9CgpmdW5jdGlvbiBzYXZlSW1hZ2VUb0ZpbGUoKSB7CiAgY29uc3QgY29uZmlnID0ge307CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGxldCB2YWwgPQogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID8/CiAgICAgIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IGNvbnRhaW5lci51aV92YWx1ZSA6IHVuZGVmaW5lZCk7CiAgICAvLyBJZiB3ZSBoYXZlIHVuZGVmaW5lZCB3ZSBkb24ndCBjcmVhdGUgdGhlIGtleS4KICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbmZpZ1trZXldID0gdmFsOwogIH0KICBQbG90bHkuZG93bmxvYWRJbWFnZShQTE9ULCBjb25maWcpOwp9CgpsZXQgY29udGFpbmVyX3JlY3QgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAsIHRvcDogMCwgbGVmdDogMCB9OwpmdW5jdGlvbiB1bnBvcF9jb250YWluZXIoY2wpIHsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZSgicG9wcGVkLW91dCIsIGZhbHNlKTsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgZmFsc2UpOwogIC8vIFdlIGZpeCB0aGUgaGVpZ2h0IGJhY2sgdG8gdGhlIHZhbHVlIGl0IGhhZCBiZWZvcmUgcG9wb3V0LCBhbHNvIHNldHRpbmcgdGhlIGZsYWcgdG8gc2lnbmFsIHRoYXQgdXBvbiBmaXJzdCByZXNpemUgd2UgcmVtb3ZlIHRoZSBmaXhlZCBpbmxpbmUtc3R5bGUKICBDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0ICsgInB4IjsKICByZW1vdmVfY29udGFpbmVyX3NpemUgPSB0cnVlOwogIC8vIFdlIHNldCB0aGUgb3RoZXIgZml4ZWQgaW5saW5lLXN0eWxlcyB0byBudWxsCiAgQ09OVEFJTkVSLnN0eWxlLndpZHRoID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9ICIiOwogIENPTlRBSU5FUi5zdHlsZS5sZWZ0ID0gIiI7CiAgLy8gV2UgYWxzbyByZW1vdmUgdGhlIENMSVBCT0FSRF9IRUFERVIKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLndpZHRoID0gIiI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gIiI7CiAgLy8gRmluYWxseSB3ZSByZW1vdmUgdGhlIGhpZGRlbiBjbGFzcyB0byB0aGUgaGVhZGVyCiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCB0cnVlKTsKICByZXR1cm47Cn0KZnVuY3Rpb24gcG9wb3V0X2NvbnRhaW5lcihvcHRzKSB7CiAgY29uc3QgY2wgPSBvcHRzPy5jbDsKICBjb25zdCB0YXJnZXRfY29udGFpbmVyX3NpemUgPSBvcHRzPy50YXJnZXRfY29udGFpbmVyX3NpemUgPz8ge307CiAgY29uc3QgdGFyZ2V0X3Bsb3Rfc2l6ZSA9IG9wdHM/LnRhcmdldF9wbG90X3NpemUgPz8ge307CiAgaWYgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICByZXR1cm4gdW5wb3BfY29udGFpbmVyKGNsKTsKICB9CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoY2wsIGNsID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IHRydWUpOwogIC8vIFdlIGV4dHJhY3QgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgY29udGFpbmVyLCBzYXZlIHRoZW0gYW5kIGZpeCB0aGVtCiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfSA9IENPTlRBSU5FUi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICBjb250YWluZXJfcmVjdCA9IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH07CiAgLy8gV2Ugc2F2ZSB0aGUgY3VycmVudCBwbG90IHNpemUgYmVmb3JlIHdlIHBvcCBhcyBpdCB3aWxsIGZpbGwgdGhlIHNjcmVlbgogIGNvbnN0IGN1cnJlbnRfcGxvdF9zaXplID0gewogICAgd2lkdGg6IFBMT1QuX2Z1bGxMYXlvdXQud2lkdGgsCiAgICBoZWlnaHQ6IFBMT1QuX2Z1bGxMYXlvdXQuaGVpZ2h0LAogIH07CiAgLy8gV2UgaGF2ZSB0byBzYXZlIHRoZSBwYWQgZGF0YSBiZWZvcmUgcG9wcGluZyBzbyB3ZSBjYW4gcmVzaXplIHByZWNpc2VseQogIGNvbnN0IHBhZCA9IHt9OwogIHBhZC51bnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZSgicG9wcGVkLW91dCIsIHRydWUpOwogIHBhZC5wb3BwZWQgPSBnZXRTaXplRGF0YSgpLmNvbnRhaW5lcl9wYWQ7CiAgLy8gV2UgZG8gdG9wIGFuZCBsZWZ0IGJhc2VkIG9uIHRoZSBjdXJyZW50IHJlY3QKICBmb3IgKGNvbnN0IGtleSBvZiBbInRvcCIsICJsZWZ0Il0pIHsKICAgIGNvbnN0IHN0YXJ0X3ZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNvbnRhaW5lcl9yZWN0W2tleV07CiAgICBsZXQgb2Zmc2V0ID0gMDsKICAgIGZvciAoY29uc3Qga2luZCBvZiBbInBhZGRpbmciLCAiYm9yZGVyIl0pIHsKICAgICAgb2Zmc2V0ICs9IHBhZC5wb3BwZWRba2luZF1ba2V5XSAtIHBhZC51bnBvcHBlZFtraW5kXVtrZXldOwogICAgfQogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSBzdGFydF92YWwgLSBvZmZzZXQgKyAicHgiOwogICAgaWYgKGtleSA9PT0gImxlZnQiKSB7CiAgICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGVba2V5XSA9IENPTlRBSU5FUi5zdHlsZVtrZXldOwogICAgfQogIH0KICAvLyBXZSBjb21wdXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGRlcGVuZGluZyBvbiBldmVudHVhbCBjb25maWcgZGF0YQogIGNvbnN0IGNzeiA9IGNvbXB1dGVDb250YWluZXJTaXplKHsKICAgIHdpZHRoOgogICAgICB0YXJnZXRfcGxvdF9zaXplLndpZHRoID8/CiAgICAgIGNvbmZpZ19zcGFucy53aWR0aC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6CiAgICAgIHRhcmdldF9wbG90X3NpemUuaGVpZ2h0ID8/CiAgICAgIGNvbmZpZ19zcGFucy5oZWlnaHQuY29uZmlnX3ZhbHVlID8/CiAgICAgIGN1cnJlbnRfcGxvdF9zaXplLmhlaWdodCwKICB9KTsKICBmb3IgKGNvbnN0IGtleSBvZiBbIndpZHRoIiwgImhlaWdodCJdKSB7CiAgICBjb25zdCB2YWwgPSB0YXJnZXRfY29udGFpbmVyX3NpemVba2V5XSA/PyBjc3pba2V5XTsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gdmFsICsgInB4IjsKICAgIGlmIChrZXkgPT09ICJ3aWR0aCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIENMSVBCT0FSRF9IRUFERVIuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgZmFsc2UpOwogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CgogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAibW91c2Vkb3duIiwKICAgIChlKSA9PiB7CiAgICAgIGlmIChlLnRhcmdldC5jbG9zZXN0KCIucGx1dG9wbG90bHktY29udGFpbmVyIikgIT09IENPTlRBSU5FUikgewogICAgICAgIHVucG9wX2NvbnRhaW5lcigpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7Cn0KCkNPTlRBSU5FUi5wb3BPdXQgPSBwb3BvdXRfY29udGFpbmVyOwoKZnVuY3Rpb24gRHVhbENsaWNrKHNpbmdsZV9mdW5jLCBkYmxfZnVuYykgewogIGxldCBuY2xpY2tzID0gMDsKICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHsKICAgIG5jbGlja3MgKz0gMTsKICAgIGlmIChuY2xpY2tzID4gMSkgewogICAgICBkYmxfZnVuYyguLi5hcmdzKTsKICAgICAgbmNsaWNrcyA9IDA7CiAgICB9IGVsc2UgewogICAgICBkZWxheSgzMDApLnRoZW4oKCkgPT4gewogICAgICAgIGlmIChuY2xpY2tzID09IDEpIHsKICAgICAgICAgIHNpbmdsZV9mdW5jKC4uLmFyZ3MpOwogICAgICAgIH0KICAgICAgICBuY2xpY2tzID0gMDsKICAgICAgfSk7CiAgICB9CiAgfTsKfQoKLy8gV2UgcmVtb3ZlIHRoZSBkZWZhdWx0IGRvd25sb2FkIGltYWdlIGJ1dHRvbgpwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSA9IF8udW5pb24oCiAgcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9SZW1vdmUsCiAgWyJ0b0ltYWdlIl0KKTsKLy8gV2UgYWRkIHRoZSBjdXN0b20gYnV0dG9uIHRvIHRoZSBtb2RlYmFyCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb0FkZCwKICBbCiAgICB7CiAgICAgIG5hbWU6ICJDb3B5IFBORyB0byBDbGlwYm9hcmQiLAogICAgICBpY29uOiB7CiAgICAgICAgaGVpZ2h0OiA1MjAsCiAgICAgICAgd2lkdGg6IDUyMCwKICAgICAgICBwYXRoOiAiTTI4MCA2NGg0MGMzNS4zIDAgNjQgMjguNyA2NCA2NFY0NDhjMCAzNS4zLTI4LjcgNjQtNjQgNjRINjRjLTM1LjMgMC02NC0yOC43LTY0LTY0VjEyOEMwIDkyLjcgMjguNyA2NCA2NCA2NGg0MCA5LjZDMTIxIDI3LjUgMTUzLjMgMCAxOTIgMHM3MSAyNy41IDc4LjQgNjRIMjgwek02NCAxMTJjLTguOCAwLTE2IDcuMi0xNiAxNlY0NDhjMCA4LjggNy4yIDE2IDE2IDE2SDMyMGM4LjggMCAxNi03LjIgMTYtMTZWMTI4YzAtOC44LTcuMi0xNi0xNi0xNkgzMDR2MjRjMCAxMy4zLTEwLjcgMjQtMjQgMjRIMTkyIDEwNGMtMTMuMyAwLTI0LTEwLjctMjQtMjRWMTEySDY0em0xMjgtOGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6IiwKICAgICAgfSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKGNvcHlJbWFnZVRvQ2xpcGJvYXJkLCAoKSA9PiB7CiAgICAgICAgcG9wb3V0X2NvbnRhaW5lcigpOwogICAgICB9KSwKICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICJEb3dubG9hZCBJbWFnZSIsCiAgICAgIGljb246IFBsb3RseS5JY29ucy5jYW1lcmEsCiAgICAgIGRpcmVjdGlvbjogInVwIiwKICAgICAgY2xpY2s6IER1YWxDbGljayhzYXZlSW1hZ2VUb0ZpbGUsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKHsgY2w6ICJmaWxlc2F2ZSIgfSk7CiAgICAgIH0pLAogICAgfSwKICBdCik7CgpmdW5jdGlvbiBnZXRPZmZzZXREYXRhKGVsKSB7CiAgbGV0IGNzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwsIG51bGwpOwogIGNvbnN0IG9kYXRhID0gewogICAgcGFkZGluZzogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdMZWZ0KSwKICAgICAgcmlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1JpZ2h0KSwKICAgICAgdG9wOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdUb3ApLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MucGFkZGluZ0JvdHRvbSksCiAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdMZWZ0KSArIHBhcnNlRmxvYXQoY3MucGFkZGluZ1JpZ2h0KSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdUb3ApICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgIH0sCiAgICBib3JkZXI6IHsKICAgICAgbGVmdDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgdG9wOiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSwKICAgICAgYm90dG9tOiBwYXJzZUZsb2F0KGNzLmJvcmRlckJvdHRvbVdpZHRoKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MuYm9yZGVyTGVmdFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyUmlnaHRXaWR0aCksCiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChjcy5ib3JkZXJUb3BXaWR0aCkgKyBwYXJzZUZsb2F0KGNzLmJvcmRlckJvdHRvbVdpZHRoKSwKICAgIH0KICB9OwogIGlmIChlbCA9PT0gUExPVCkgewogICAgLy8gRm9yIHRoZSBQTE9UIHdlIGFsc28gd2FudCB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgb2Zmc2V0CiAgICBvZGF0YS5vZmZzZXQgPSB7CiAgICAgIHRvcDogUExPVC5vZmZzZXRQYXJlbnQgPT0gQ09OVEFJTkVSID8gUExPVC5vZmZzZXRUb3AgOiAwLAogICAgICBsZWZ0OiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldExlZnQgOiAwLAogICAgfQogIH0KICByZXR1cm4gb2RhdGE7Cn0KZnVuY3Rpb24gZ2V0U2l6ZURhdGEoKSB7CiAgY29uc3QgZGF0YSA9IHsKICAgIHBsb3RfcGFkOiBnZXRPZmZzZXREYXRhKFBMT1QpLAogICAgcGxvdF9yZWN0OiBQTE9ULmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogICAgY29udGFpbmVyX3BhZDogZ2V0T2Zmc2V0RGF0YShDT05UQUlORVIpLAogICAgY29udGFpbmVyX3JlY3Q6IENPTlRBSU5FUi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICB9OwogIHJldHVybiBkYXRhOwp9CmZ1bmN0aW9uIGNvbXB1dGVDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICBjb25zdCBjb21wdXRlZF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICBjb25zdCBvZmZzZXRzID0gY29tcHV0ZWRfc2l6ZS5vZmZzZXRzOwoKICBjb25zdCBwbG90X2RhdGEgPSB7CiAgICB3aWR0aDogd2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCwKICAgIGhlaWdodDogaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH07CgogIHJldHVybiB7CiAgICB3aWR0aDogKHdpZHRoID8/IGNvbXB1dGVkX3NpemUud2lkdGgpICsgb2Zmc2V0cy53aWR0aCwKICAgIGhlaWdodDogKGhlaWdodCA/PyBjb21wdXRlZF9zaXplLmhlaWdodCkgKyBvZmZzZXRzLmhlaWdodCwKICAgIG5vQ2hhbmdlOiB3aWR0aCA9PSBjb21wdXRlZF9zaXplLndpZHRoICYmIGhlaWdodCA9PSBjb21wdXRlZF9zaXplLmhlaWdodCwKICB9Cn0KCi8vIFRoaXMgZnVuY3Rpb24gd2lsbCBjaGFuZ2UgdGhlIGNvbnRhaW5lciBzaXplIHNvIHRoYXQgdGhlIHJlc3VsdGluZyBwbG90IHdpbGwgYmUgbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIHNwZWNzCmZ1bmN0aW9uIGNoYW5nZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGlmICghQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIGNvbnNvbGUubG9nKCJUcmllZCB0byBjaGFuZ2UgY29udGFpbmVyIHNpemUgd2hlbiBub3QgcG9wcGVkLCBpZ25vcmluZyIpOwogICAgcmV0dXJuOwogIH0KCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhKTsKCiAgaWYgKGNzei5ub0NoYW5nZSkgewogICAgY29uc29sZS5sb2coIlNpemUgaXMgdGhlIHNhbWUgYXMgY3VycmVudCwgaWdub3JpbmciKTsKICAgIHJldHVybgogIH0KICAvLyBXZSBhcmUgbm93IGdvaW5nIHRvIHNldCBoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBjb250YWluZXIKICBmb3IgKGNvbnN0IGtleSBvZiBbIndpZHRoIiwgImhlaWdodCJdKSB7CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IGNzeltrZXldICsgInB4IjsKICB9Cn0KLy8gV2Ugbm93IGNyZWF0ZSB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIHVwZGF0ZSB0aGUgcGxvdCBiYXNlZCBvbiB0aGUgdmFsdWVzIHNwZWNpZmllZApmdW5jdGlvbiB1cGRhdGVGcm9tSGVhZGVyKCkgewogIGNvbnN0IGhlYWRlcl9kYXRhID0gewogICAgaGVpZ2h0OiBjb25maWdfc3BhbnMuaGVpZ2h0LnVpX3ZhbHVlLAogICAgd2lkdGg6IGNvbmZpZ19zcGFucy53aWR0aC51aV92YWx1ZSwKICB9OwogIGNoYW5nZUNvbnRhaW5lclNpemUoaGVhZGVyX2RhdGEpOwp9Ci8vIFdlIGFzc2lnbiB0aGlzIGZ1bmN0aW9uIHRvIHRoZSBvbmJsdXIgZXZlbnQgb2Ygd2lkdGggYW5kIGhlaWdodAppZiAoZmlyc3RSdW4pIHsKICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGNvbnRhaW5lci51aV9zcGFuLm9uYmx1ciA9IChlKSA9PiB7CiAgICAgIGNvbnRhaW5lci51aV92YWx1ZSA9IGNvbnRhaW5lci51aV9zcGFuLnRleHRDb250ZW50OwogICAgICB1cGRhdGVGcm9tSGVhZGVyKCk7CiAgICB9OwogIH0KfQovLyBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBwbG90IHNpemUgdG8gdXNlIGZvciByZWxheW91dCBhcyBhIGZ1bmN0aW9uIG9mIHRoZSBjb250YWluZXIgc2l6ZQpmdW5jdGlvbiBjb21wdXRlUGxvdFNpemUoZGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICAvLyBSZW1vdmUgUGFkZGluZwogIGNvbnN0IHsgY29udGFpbmVyX3BhZCwgcGxvdF9wYWQsIGNvbnRhaW5lcl9yZWN0IH0gPSBkYXRhOwogIGNvbnN0IG9mZnNldHMgPSB7CiAgICB3aWR0aDoKICAgICAgcGxvdF9wYWQucGFkZGluZy53aWR0aCArCiAgICAgIHBsb3RfcGFkLmJvcmRlci53aWR0aCArCiAgICAgIHBsb3RfcGFkLm9mZnNldC5sZWZ0ICsKICAgICAgY29udGFpbmVyX3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgY29udGFpbmVyX3BhZC5ib3JkZXIud2lkdGgsCiAgICBoZWlnaHQ6CiAgICAgIHBsb3RfcGFkLnBhZGRpbmcuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLmhlaWdodCArCiAgICAgIHBsb3RfcGFkLm9mZnNldC50b3AgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcuaGVpZ2h0ICsKICAgICAgY29udGFpbmVyX3BhZC5ib3JkZXIuaGVpZ2h0LAogIH07CiAgY29uc3Qgc3ogPSB7CiAgICB3aWR0aDogTWF0aC5yb3VuZChjb250YWluZXJfcmVjdC53aWR0aCAtIG9mZnNldHMud2lkdGgpLAogICAgaGVpZ2h0OiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LmhlaWdodCAtIG9mZnNldHMuaGVpZ2h0KSwKICAgIG9mZnNldHMsCiAgfTsKICByZXR1cm4gc3o7Cn0KCi8vIENyZWF0ZSB0aGUgcmVzaXplT2JzZXJ2ZXIgdG8gbWFrZSB0aGUgcGxvdCBldmVuIG1vcmUgcmVzcG9uc2l2ZSEgOm1hZ2ljOgpjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4gewogIGNvbnN0IHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKTsKICBjb25zdCB7Y29udGFpbmVyX3JlY3QsIGNvbnRhaW5lcl9wYWR9ID0gc2l6ZURhdGE7CiAgbGV0IHBsb3Rfc2l6ZSA9IGNvbXB1dGVQbG90U2l6ZShzaXplRGF0YSk7CiAgLy8gV2Ugc2F2ZSB0aGUgaGVpZ2h0IGluIHRoZSBQTE9UIG9iamVjdAogIFBMT1QuY29udGFpbmVyX2hlaWdodCA9IGNvbnRhaW5lcl9yZWN0LmhlaWdodDsKICAvLyBXZSBkZWFsIHdpdGggc29tZSBzdHVmZiBpZiB0aGUgY29udGFpbmVyIGlzIHBvcHBwZWQKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLndpZHRoID0gY29udGFpbmVyX3JlY3Qud2lkdGggKyAicHgiOwogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9IGNvbnRhaW5lcl9yZWN0LmxlZnQgKyAicHgiOwogIGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUgPSBwbG90X3NpemUuaGVpZ2h0OwogIGNvbmZpZ19zcGFucy53aWR0aC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS53aWR0aDsKICAvKiAKCQlUaGUgYWRkaXRpb24gb2YgdGhlIGludmFsaWQgYXJndW1lbnQgYHBsdXRvcmVzaXplYCBzZWVtcyB0byBmaXggdGhlIHByb2JsZW0gd2l0aCBjYWxsaW5nIGByZWxheW91dGAgc2ltcGx5IHdpdGggYHthdXRvc2l6ZTogdHJ1ZX1gIGFzIHVwZGF0ZSBicmVha2luZyBtb3VzZSByZWxheW91dCBldmVudHMgdHJhY2tpbmcuIAoJCVNlZSBodHRwczovL2dpdGh1Yi5jb20vcGxvdGx5L3Bsb3RseS5qcy9pc3N1ZXMvNjE1NiBmb3IgZGV0YWlscwoJCSovCiAgbGV0IGNvbmZpZyA9IHsKICAgIC8vIElmIHRoaXMgaXMgcG9wcGVkIG91dCwgd2UgaWdub3JlIHRoZSBvcmlnaW5hbCB3aWR0aC9oZWlnaHQKICAgIHdpZHRoOiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyB1bmRlZmluZWQgOiBvcmlnaW5hbF93aWR0aCkgPz8gcGxvdF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyB1bmRlZmluZWQgOiBvcmlnaW5hbF9oZWlnaHQpID8/IHBsb3Rfc2l6ZS5oZWlnaHQsCiAgICBwbHV0b3Jlc2l6ZTogdHJ1ZSwKICB9OwogIFBsb3RseS5yZWxheW91dChQTE9ULCBjb25maWcpLnRoZW4oKCkgPT4gewogICAgaWYgKHJlbW92ZV9jb250YWluZXJfc2l6ZSAmJiAhQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgdGhlIGZpcnN0IHJlc2l6ZSB1cG9uIHBsb3QgY3JlYXRpb24gdG8gYWxyZWFkeSBiZSB3aXRob3V0IGEgZml4ZWQgaGVpZ2h0CiAgICAgIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSAiIjsKICAgICAgQ09OVEFJTkVSLnN0eWxlLndpZHRoID0gIiI7CiAgICAgIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IGZhbHNlOwogICAgfQogIH0pOwp9KTsKCnJlc2l6ZU9ic2VydmVyLm9ic2VydmUoQ09OVEFJTkVSKTsKCgpQbG90bHkucmVhY3QoUExPVCwgcGxvdF9vYmopLnRoZW4oKCkgPT4gewoJLy8gQXNzaWduIHRoZSBQbG90bHkgZXZlbnQgbGlzdGVuZXJzCglmb3IgKGNvbnN0IFtrZXksIGxpc3RlbmVyX3ZlY10gb2YgT2JqZWN0LmVudHJpZXMocGxvdGx5X2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULm9uKGtleSwgbGlzdGVuZXIpCgkJfQoJfQoJLy8gQXNzaWduIHRoZSBKUyBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhqc19saXN0ZW5lcnMpKSB7CgkJZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcl92ZWMpIHsKCQkJUExPVC5hZGRFdmVudExpc3RlbmVyKGtleSwgbGlzdGVuZXIsIHsKCQkJCXNpZ25hbDogY29udHJvbGxlci5zaWduYWwKCQkJfSkKCQl9Cgl9Cn0KKQoKCmludmFsaWRhdGlvbi50aGVuKCgpID0+IHsKCS8vIFJlbW92ZSBhbGwgcGxvdGx5IGxpc3RlbmVycwoJUExPVC5yZW1vdmVBbGxMaXN0ZW5lcnMoKQoJLy8gUmVtb3ZlIGFsbCBKUyBsaXN0ZW5lcnMKCWNvbnRyb2xsZXIuYWJvcnQoKQoJLy8gUmVtb3ZlIHRoZSByZXNpemVPYnNlcnZlcgoJcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpCn0pCgoKCgkJcmV0dXJuIENPTlRBSU5FUgoJPC9zY3JpcHQ+CqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b+i6P02CbBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkMGI2YzFmNzItYjA0MC00ODNjLTk2OWItODhiZmUwOWIzMmMzuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXPAAAAAWLbuoW1cHVibGlzaGVkX29iamVjdF9rZXlzkdk0MGJjZDhlOTAtODE4MS0xMWVmLTI0YzAtZjE0ZjZhNGQzMDg0LzhiMzQyY2M4NmQyNmUzNbhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQ3ODkwZjgxZS1jYjE1LTQ4ZDItYTgwYy05ZDczZjk1MTYwNTaKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52gKtPGRpdiBjbGFzcz0ibWFya2Rvd24iPjx1bD4KPGxpPjxwPjxjb2RlPkNNUkE8L2NvZGU+ICYjNDA7c2hvdy9oaWRlIGNvZGUmIzQxOzwvcD4KPC9saT4KPC91bD4KPHByZT48Y29kZSBjbGFzcz0ibGFuZ3VhZ2UtanVsaWEiPiMgU2VxIGluaXQKc2VxICYjNjE7IFNlcXVlbmNlJiM0MDsmIzQxOwpmb3IgaGIgJiM2MTsgMSA6IGR1bW15X2hlYXJ0X2JlYXRzICYjNDM7IDEKCSMgR2VuZXJhdGluZyBzZXEgYmxvY2tzCgl0MnAgJiM2MTsgVDJwcmVwJiM0MDtUMnByZXBfZHVyYXRpb24mIzQxOwoJZmF0c2F0ICYjNjE7IEZhdFNhdCYjNDA7RmF0U2F0X2ZsaXBfYW5nbGUsIGZhdF9mcmVxJiM0MTsKCWJzc2ZwICYjNjE7IGJTU0ZQJiM0MDtpTkFWX2xpbmVzLCBpbV9zZWdtZW50cywgaU5BVl9mbGlwX2FuZ2xlLCBpbV9mbGlwX2FuZ2xlJiM0MTsKCSMgQ29uY2F0ZW5hdGluZyBzZXEgYmxvY2tzCglzZXEgJiM0MzsmIzYxOyB0MnAKCXNlcSAmIzQzOyYjNjE7IGZhdHNhdAoJc2VxICYjNDM7JiM2MTsgYnNzZnAKCSMgUlIgaW50ZXJ2YWwgY29uc2lkZXJhdGlvbgoJUlJkZWxheSAmIzYxOyBSUiAgLSBkdXImIzQwO2Jzc2ZwJiM0MTsgLSBkdXImIzQwO3QycCYjNDE7IC0gZHVyJiM0MDtmYXRzYXQmIzQxOwoJc2VxICYjNDM7JiM2MTsgRGVsYXkmIzQwO1JSZGVsYXkmIzQxOwplbmQ8L2NvZGU+PC9wcmU+CjwvZGl2PqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b+i309+zLBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkNzg5MGY4MWUtY2IxNS00OGQyLWE4MGMtOWQ3M2Y5NTE2MDU2uWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAEjLj7VwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDFiYjNlNDliLTFhMTktNDM0My1hYzA5LWZiYWYxY2FlNGJhM4qmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnaTYw8c2NyaXB0PgoJCi8vIExvYWQgdGhlIGxpYnJhcnkgZm9yIGNvbnNpc3RlbnQgc21vb3RoIHNjcm9sbGluZwpjb25zdCB7ZGVmYXVsdDogc2Nyb2xsSW50b1ZpZXd9ID0gYXdhaXQgaW1wb3J0KCJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsZG1GeUlGRTlaVDArSW05aWFtVmpkQ0k5UFhSNWNHVnZaaUJsSmladWRXeHNJVDFsSmlZeFBUMDlaUzV1YjJSbFZIbHdaU3hWUFNobExIUXBQVDRvSVhSOGZDSm9hV1JrWlc0aUlUMDlaU2ttSmlKMmFYTnBZbXhsSWlFOVBXVW1KaUpqYkdsd0lpRTlQV1VzUVQwb1pTeDBLVDArZTJsbUtHVXVZMnhwWlc1MFNHVnBaMmgwUEdVdWMyTnliMnhzU0dWcFoyaDBmSHhsTG1Oc2FXVnVkRmRwWkhSb1BHVXVjMk55YjJ4c1YybGtkR2dwZTJ4bGRDQnNQV2RsZEVOdmJYQjFkR1ZrVTNSNWJHVW9aU3h1ZFd4c0tUdHlaWFIxY200Z1ZTaHNMbTkyWlhKbWJHOTNXU3gwS1h4OFZTaHNMbTkyWlhKbWJHOTNXQ3gwS1h4OEtHVTlQbnRzWlhRZ2REMG9aVDArZTJsbUtDRmxMbTkzYm1WeVJHOWpkVzFsYm5SOGZDRmxMbTkzYm1WeVJHOWpkVzFsYm5RdVpHVm1ZWFZzZEZacFpYY3BjbVYwZFhKdUlHNTFiR3c3ZEhKNWUzSmxkSFZ5YmlCbExtOTNibVZ5Ukc5amRXMWxiblF1WkdWbVlYVnNkRlpwWlhjdVpuSmhiV1ZGYkdWdFpXNTBmV05oZEdOb2UzSmxkSFZ5YmlCdWRXeHNmWDBwS0dVcE8zSmxkSFZ5YmlFaGRDWW1LSFF1WTJ4cFpXNTBTR1ZwWjJoMFBHVXVjMk55YjJ4c1NHVnBaMmgwZkh4MExtTnNhV1Z1ZEZkcFpIUm9QR1V1YzJOeWIyeHNWMmxrZEdncGZTa29aU2w5Y21WMGRYSnVJVEY5TEZnOUtHVXNkQ3hzTEc4c2JpeHlMR2tzY3lrOVBuSThaU1ltYVQ1MGZIeHlQbVVtSm1rOGREOHdPbkk4UFdVbUpuTThQV3g4ZkdrK1BYUW1Kbk0rUFd3L2NpMWxMVzg2YVQ1MEppWnpQR3g4ZkhJOFpTWW1jejVzUDJrdGRDdHVPakFzSkQxbFBUNWxMbkJoY21WdWRFVnNaVzFsYm5RL1B5aGxMbWRsZEZKdmIzUk9iMlJsS0NrdWFHOXpkSHg4Ym5Wc2JDa3NkSFE5S0dVc2RDazlQbnQyWVhJZ2JDeHZMRzRzY2p0cFppaDBlWEJsYjJZZ1pHOWpkVzFsYm5RK0luVWlLWEpsZEhWeWJsdGRPMnhsZEh0elkzSnZiR3hOYjJSbE9ta3NZbXh2WTJzNmN5eHBibXhwYm1VNllTeGliM1Z1WkdGeWVUcG9MSE5yYVhCUGRtVnlabXh2ZDBocFpHUmxia1ZzWlcxbGJuUnpPblY5UFhRc1p6MGlablZ1WTNScGIyNGlQVDEwZVhCbGIyWWdhRDlvT21VOVBtVWhQVDFvTzJsbUtDRlJLR1VwS1hSb2NtOTNJRlI1Y0dWRmNuSnZjaWdpU1c1MllXeHBaQ0IwWVhKblpYUWlLVHRzWlhRZ2RqMWtiMk4xYldWdWRDNXpZM0p2Ykd4cGJtZEZiR1Z0Wlc1MGZIeGtiMk4xYldWdWRDNWtiMk4xYldWdWRFVnNaVzFsYm5Rc2JUMWJYU3gzUFdVN1ptOXlLRHRSS0hjcEppWm5LSGNwT3lsN2FXWW9LSGM5SkNoM0tTazlQVDEyS1h0dExuQjFjMmdvZHlrN1luSmxZV3Q5Ym5Wc2JDRTlkeVltZHowOVBXUnZZM1Z0Wlc1MExtSnZaSGttSmtFb2R5a21KaUZCS0dSdlkzVnRaVzUwTG1SdlkzVnRaVzUwUld4bGJXVnVkQ2w4Zkc1MWJHd2hQWGNtSmtFb2R5eDFLU1ltYlM1d2RYTm9LSGNwZld4bGRDQlhQVzUxYkd3aFBTaHZQVzUxYkd3OVBTaHNQWGRwYm1SdmR5NTJhWE4xWVd4V2FXVjNjRzl5ZENrL2RtOXBaQ0F3T213dWQybGtkR2dwUDI4NmFXNXVaWEpYYVdSMGFDeElQVzUxYkd3aFBTaHlQVzUxYkd3OVBTaHVQWGRwYm1SdmR5NTJhWE4xWVd4V2FXVjNjRzl5ZENrL2RtOXBaQ0F3T200dWFHVnBaMmgwS1Q5eU9tbHVibVZ5U0dWcFoyaDBMSHR6WTNKdmJHeFlPbDhzYzJOeWIyeHNXVHA0ZlQxM2FXNWtiM2NzZTJobGFXZG9kRHBGTEhkcFpIUm9PbFFzZEc5d09rNHNjbWxuYUhRNlRDeGliM1IwYjIwNldTeHNaV1owT2tOOVBXVXVaMlYwUW05MWJtUnBibWREYkdsbGJuUlNaV04wS0Nrc1VqMGljM1JoY25RaVBUMDljM3g4SW01bFlYSmxjM1FpUFQwOWN6OU9PaUpsYm1RaVBUMDljejlaT2s0clJTOHlMRlk5SW1ObGJuUmxjaUk5UFQxaFAwTXJWQzh5T2lKbGJtUWlQVDA5WVQ5TU9rTXNRajFiWFR0bWIzSW9iR1YwSUVROU1EdEVQRzB1YkdWdVozUm9PMFFyS3lsN2JHVjBJRTg5YlZ0RVhTeDdhR1ZwWjJoME9tb3NkMmxrZEdnNlNTeDBiM0E2VXl4eWFXZG9kRHB4TEdKdmRIUnZiVHA2TEd4bFpuUTZSbjA5VHk1blpYUkNiM1Z1WkdsdVowTnNhV1Z1ZEZKbFkzUW9LVHRwWmlnaWFXWXRibVZsWkdWa0lqMDlQV2ttSms0K1BUQW1Ka00rUFRBbUpsazhQVWdtSmt3OFBWY21KazQrUFZNbUpsazhQWG9tSmtNK1BVWW1Ka3c4UFhFcFluSmxZV3M3YkdWMElFYzlaMlYwUTI5dGNIVjBaV1JUZEhsc1pTaFBLU3hLUFhCaGNuTmxTVzUwS0VjdVltOXlaR1Z5VEdWbWRGZHBaSFJvTERFd0tTeExQWEJoY25ObFNXNTBLRWN1WW05eVpHVnlWRzl3VjJsa2RHZ3NNVEFwTEZBOWNHRnljMlZKYm5Rb1J5NWliM0prWlhKU2FXZG9kRmRwWkhSb0xERXdLU3hhUFhCaGNuTmxTVzUwS0VjdVltOXlaR1Z5UW05MGRHOXRWMmxrZEdnc01UQXBMR1ZsUFRBc1pYUTlNQ3hsYkQwaWIyWm1jMlYwVjJsa2RHZ2lhVzRnVHo5UExtOW1abk5sZEZkcFpIUm9MVTh1WTJ4cFpXNTBWMmxrZEdndFNpMVFPakFzWlc4OUltOW1abk5sZEVobGFXZG9kQ0pwYmlCUFAwOHViMlptYzJWMFNHVnBaMmgwTFU4dVkyeHBaVzUwU0dWcFoyaDBMVXN0V2pvd0xHVnVQU0p2Wm1aelpYUlhhV1IwYUNKcGJpQlBQekE5UFQxUExtOW1abk5sZEZkcFpIUm9QekE2U1M5UExtOW1abk5sZEZkcFpIUm9PakFzWlhJOUltOW1abk5sZEVobGFXZG9kQ0pwYmlCUFB6QTlQVDFQTG05bVpuTmxkRWhsYVdkb2REOHdPbW92VHk1dlptWnpaWFJJWldsbmFIUTZNRHRwWmloMlBUMDlUeWxsWlQwaWMzUmhjblFpUFQwOWN6OVNPaUpsYm1RaVBUMDljejlTTFVnNkltNWxZWEpsYzNRaVBUMDljejlZS0hnc2VDdElMRWdzU3l4YUxIZ3JVaXg0SzFJclJTeEZLVHBTTFVndk1peGxkRDBpYzNSaGNuUWlQVDA5WVQ5V09pSmpaVzUwWlhJaVBUMDlZVDlXTFZjdk1qb2laVzVrSWowOVBXRS9WaTFYT2xnb1h5eGZLMWNzVnl4S0xGQXNYeXRXTEY4clZpdFVMRlFwTEdWbFBVMWhkR2d1YldGNEtEQXNaV1VyZUNrc1pYUTlUV0YwYUM1dFlYZ29NQ3hsZEN0ZktUdGxiSE5sZTJWbFBTSnpkR0Z5ZENJOVBUMXpQMUl0VXkxTE9pSmxibVFpUFQwOWN6OVNMWG9yV2l0bGJ6b2libVZoY21WemRDSTlQVDF6UDFnb1V5eDZMR29zU3l4YUsyVnZMRklzVWl0RkxFVXBPbEl0S0ZNcmFpOHlLU3RsYnk4eUxHVjBQU0p6ZEdGeWRDSTlQVDFoUDFZdFJpMUtPaUpqWlc1MFpYSWlQVDA5WVQ5V0xTaEdLMGt2TWlrclpXd3ZNam9pWlc1a0lqMDlQV0UvVmkxeEsxQXJaV3c2V0NoR0xIRXNTU3hLTEZBclpXd3NWaXhXSzFRc1ZDazdiR1YwZTNOamNtOXNiRXhsWm5RNlpXa3NjMk55YjJ4c1ZHOXdPbVZrZlQxUE8yVmxQVTFoZEdndWJXRjRLREFzVFdGMGFDNXRhVzRvWldRclpXVXZaWElzVHk1elkzSnZiR3hJWldsbmFIUXRhaTlsY2l0bGJ5a3BMR1YwUFUxaGRHZ3ViV0Y0S0RBc1RXRjBhQzV0YVc0b1pXa3JaWFF2Wlc0c1R5NXpZM0p2Ykd4WGFXUjBhQzFKTDJWdUsyVnNLU2tzVWlzOVpXUXRaV1VzVmlzOVpXa3RaWFI5UWk1d2RYTm9LSHRsYkRwUExIUnZjRHBsWlN4c1pXWjBPbVYwZlNsOWNtVjBkWEp1SUVKOUxHWTlaVDArZTNaaGNpQjBPM0psZEhWeWJpRXhQVDA5WlQ5N1lteHZZMnM2SW1WdVpDSXNhVzVzYVc1bE9pSnVaV0Z5WlhOMEluMDZLSFE5WlNrOVBUMVBZbXBsWTNRb2RDa21KakFoUFQxUFltcGxZM1F1YTJWNWN5aDBLUzVzWlc1bmRHZy9aVHA3WW14dlkyczZJbk4wWVhKMElpeHBibXhwYm1VNkltNWxZWEpsYzNRaWZYMDdablZ1WTNScGIyNGdZeWhsTEhRcGUzWmhjaUJzTzJsbUtDRmxMbWx6UTI5dWJtVmpkR1ZrZkh3aEtHVTlQbnRzWlhRZ2REMWxPMlp2Y2lnN2RDWW1kQzV3WVhKbGJuUk9iMlJsT3lsN2FXWW9kQzV3WVhKbGJuUk9iMlJsUFQwOVpHOWpkVzFsYm5RcGNtVjBkWEp1SVRBN2REMTBMbkJoY21WdWRFNXZaR1VnYVc1emRHRnVZMlZ2WmlCVGFHRmtiM2RTYjI5MFAzUXVjR0Z5Wlc1MFRtOWtaUzVvYjNOME9uUXVjR0Z5Wlc1MFRtOWtaWDF5WlhSMWNtNGhNWDBwS0dVcEtYSmxkSFZ5Ymp0cFppZ2liMkpxWldOMElqMDlkSGx3Wlc5bUtHdzlkQ2ttSmlKbWRXNWpkR2x2YmlJOVBYUjVjR1Z2WmlCc0xtSmxhR0YyYVc5eUtYSmxkSFZ5YmlCMExtSmxhR0YyYVc5eUtIUjBLR1VzZENrcE8yeGxkQ0J2UFNKaWIyOXNaV0Z1SWowOWRIbHdaVzltSUhSOGZHNTFiR3c5UFhRL2RtOXBaQ0F3T25RdVltVm9ZWFpwYjNJN1ptOXlLR3hsZEh0bGJEcHVMSFJ2Y0RweUxHeGxablE2YVgxdlppQjBkQ2hsTEdZb2RDa3BLVzR1YzJOeWIyeHNLSHQwYjNBNmNpeHNaV1owT21rc1ltVm9ZWFpwYjNJNmIzMHBmWFpoY2lCa0xIQTlLQ2s5UGloa2ZId29aRDBpY0dWeVptOXliV0Z1WTJVaWFXNGdkMmx1Wkc5M1AzQmxjbVp2Y20xaGJtTmxMbTV2ZHk1aWFXNWtLSEJsY21admNtMWhibU5sS1RwRVlYUmxMbTV2ZHlrc1pDZ3BLVHRtZFc1amRHbHZiaUJpS0dVcGUyeGxkQ0IwUFUxaGRHZ3ViV2x1S0Nod0tDa3RaUzV6ZEdGeWRGUnBiV1VwTDJVdVpIVnlZWFJwYjI0c01Ta3NiRDFsTG1WaGMyVW9kQ2tzYnoxbExuTjBZWEowV0Nzb1pTNTRMV1V1YzNSaGNuUllLU3BzTEc0OVpTNXpkR0Z5ZEZrcktHVXVlUzFsTG5OMFlYSjBXU2txYkR0bExtMWxkR2h2WkNodkxHNHNkQ3hzS1N4dklUMDlaUzU0Zkh4dUlUMDlaUzU1UDNKbGNYVmxjM1JCYm1sdFlYUnBiMjVHY21GdFpTZ29LVDArWWlobEtTazZaUzVqWWlncGZXWjFibU4wYVc5dUlIa29aU3gwTEd3cGUyeGxkQ0J2UFdGeVozVnRaVzUwY3k1c1pXNW5kR2crTXlZbWRtOXBaQ0F3SVQwOVlYSm5kVzFsYm5Seld6TmRQMkZ5WjNWdFpXNTBjMXN6WFRvMk1EQXNiajFoY21kMWJXVnVkSE11YkdWdVozUm9QalFtSm5admFXUWdNQ0U5UFdGeVozVnRaVzUwYzFzMFhUOWhjbWQxYldWdWRITmJORjA2WlQwK01Tc3RMV1VxWlNwbEttVXFaU3h5UFdGeVozVnRaVzUwY3k1c1pXNW5kR2crTlQ5aGNtZDFiV1Z1ZEhOYk5WMDZkbTlwWkNBd0xHazlZWEpuZFcxbGJuUnpMbXhsYm1kMGFENDJQMkZ5WjNWdFpXNTBjMXMyWFRwMmIybGtJREFzY3oxbExuTmpjbTlzYkV4bFpuUXNZVDFsTG5OamNtOXNiRlJ2Y0R0aUtIdHpZM0p2Ykd4aFlteGxPbVVzYldWMGFHOWtLSFFzYkN4dkxHNHBlMnhsZENCeVBVMWhkR2d1WTJWcGJDaDBLU3h6UFUxaGRHZ3VZMlZwYkNoc0tUdGxMbk5qY205c2JFeGxablE5Y2l4bExuTmpjbTlzYkZSdmNEMXpMR2svTGloN2RHRnlaMlYwT21Vc1pXeGhjSE5sWkRwdkxIWmhiSFZsT200c2JHVm1kRHB5TEhSdmNEcHpmU2w5TEhOMFlYSjBWR2x0WlRwd0tDa3NjM1JoY25SWU9uTXNjM1JoY25SWk9tRXNlRHAwTEhrNmJDeGtkWEpoZEdsdmJqcHZMR1ZoYzJVNmJpeGpZanB5ZlNsOWRtRnlJRTA5WlQwK1pTWW1JV1V1WW1Wb1lYWnBiM0o4ZkNKemJXOXZkR2dpUFQwOVpTNWlaV2hoZG1sdmNpeHJQV1oxYm1OMGFXOXVLR1VzZENsN2JHVjBJR3c5ZEh4OGUzMDdjbVYwZFhKdUlFMG9iQ2svWXlobExIdGliRzlqYXpwc0xtSnNiMk5yTEdsdWJHbHVaVHBzTG1sdWJHbHVaU3h6WTNKdmJHeE5iMlJsT213dWMyTnliMnhzVFc5a1pTeGliM1Z1WkdGeWVUcHNMbUp2ZFc1a1lYSjVMSE5yYVhCUGRtVnlabXh2ZDBocFpHUmxia1ZzWlcxbGJuUnpPbXd1YzJ0cGNFOTJaWEptYkc5M1NHbGtaR1Z1Uld4bGJXVnVkSE1zWW1Wb1lYWnBiM0k2WlQwK1VISnZiV2x6WlM1aGJHd29aUzV5WldSMVkyVW9LR1VzZENrOVBudHNaWFI3Wld3NmJ5eHNaV1owT200c2RHOXdPbko5UFhRc2FUMXZMbk5qY205c2JFeGxablFzY3oxdkxuTmpjbTlzYkZSdmNEdHlaWFIxY200Z2FUMDlQVzRtSm5NOVBUMXlQMlU2V3k0dUxtVXNibVYzSUZCeWIyMXBjMlVvWlQwK2VTaHZMRzRzY2l4c0xtUjFjbUYwYVc5dUxHd3VaV0Z6WlN3b0tUMCtaU2g3Wld3NmJ5eHNaV1owT2x0cExHNWRMSFJ2Y0RwYmN5eHlYWDBwTEd3dWIyNVRZM0p2Ykd4RGFHRnVaMlVwS1YxOUxGdGRLU2w5S1RwUWNtOXRhWE5sTG5KbGMyOXNkbVVvWXlobExIUXBLWDA3Wlhod2IzSjBlMnNnWVhNZ1pHVm1ZWFZzZEgwNyIpCgpjb25zdCBpbmRlbnQgPSB0cnVlCmNvbnN0IGFzaWRlID0gdHJ1ZQpjb25zdCB0aXRsZV90ZXh0ID0gIlRhYmxlIG9mIENvbnRlbnRzIgpjb25zdCBpbmNsdWRlX2RlZmluaXRpb25zID0gZmFsc2UKCgpjb25zdCB0b2NOb2RlID0gaHRtbGA8bmF2IGNsYXNzPSJwbHV0b3VpLXRvYyI+Cgk8aGVhZGVyPgoJIDxzcGFuIGNsYXNzPSJ0b2MtdG9nZ2xlIG9wZW4tdG9jIj48L3NwYW4+CgkgPHNwYW4gY2xhc3M9InRvYy10b2dnbGUgY2xvc2VkLXRvYyI+PC9zcGFuPgoJICR7dGl0bGVfdGV4dH0KCTwvaGVhZGVyPgoJPHNlY3Rpb24+PC9zZWN0aW9uPgo8L25hdj5gCgp0b2NOb2RlLmNsYXNzTGlzdC50b2dnbGUoImFzaWRlIiwgYXNpZGUpCnRvY05vZGUuY2xhc3NMaXN0LnRvZ2dsZSgiaW5kZW50IiwgaW5kZW50KQoKCmNvbnN0IGdldFBhcmVudENlbGwgPSBlbCA9PiBlbC5jbG9zZXN0KCJwbHV0by1jZWxsIikKCmNvbnN0IGdldEhlYWRlcnMgPSAoKSA9PiB7Cgljb25zdCBkZXB0aCA9IE1hdGgubWF4KDEsIE1hdGgubWluKDYsIDMpKSAvLyBzaG91bGQgYmUgaW4gcmFuZ2UgMTo2Cgljb25zdCByYW5nZSA9IEFycmF5LmZyb20oe2xlbmd0aDogZGVwdGh9LCAoeCwgaSkgPT4gaSsxKSAvLyBbMSwgLi4uLCBkZXB0aF0KCQoJY29uc3Qgc2VsZWN0b3IgPSBbCgkJLi4uKGluY2x1ZGVfZGVmaW5pdGlvbnMgPyBbCgkJCWBwbHV0by1ub3RlYm9vayBwbHV0by1jZWxsIC5wbHV0by1kb2NzLWJpbmRpbmdgLCAKCQkJYHBsdXRvLW5vdGVib29rIHBsdXRvLWNlbGwgYXNzaWduZWU6bm90KDplbXB0eSlgLCAKCQldIDogW10pLAoJCS4uLnJhbmdlLm1hcChpID0+IGBwbHV0by1ub3RlYm9vayBwbHV0by1jZWxsIGgke2l9YCkKCV0uam9pbigiLCIpCglyZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSkuZmlsdGVyKGVsID0+IAoJCS8vIGV4Y2x1ZGUgaGVhZGVycyBpbnNpZGUgb2YgYSBwbHV0by1kb2NzLWJpbmRpbmcgYmxvY2sKCQkhKGVsLm5vZGVOYW1lLnN0YXJ0c1dpdGgoIkgiKSAmJiBlbC5jbG9zZXN0KCIucGx1dG8tZG9jcy1iaW5kaW5nIikpCgkpCn0KCgpjb25zdCBkb2N1bWVudF9jbGlja19oYW5kbGVyID0gKGV2ZW50KSA9PiB7Cgljb25zdCBwYXRoID0gKGV2ZW50LnBhdGggfHwgZXZlbnQuY29tcG9zZWRQYXRoKCkpCgljb25zdCB0b2MgPSBwYXRoLmZpbmQoZWxlbSA9PiBlbGVtPy5jbGFzc0xpc3Q/LmNvbnRhaW5zPy4oInRvYy10b2dnbGUiKSkKCWlmICh0b2MpIHsKCQlldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKQoJCXRvYy5jbG9zZXN0KCIucGx1dG91aS10b2MiKS5jbGFzc0xpc3QudG9nZ2xlKCJoaWRlIikKCX0KfQoKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBkb2N1bWVudF9jbGlja19oYW5kbGVyKQoKCmNvbnN0IGhlYWRlcl90b19pbmRleF9lbnRyeV9tYXAgPSBuZXcgTWFwKCkKY29uc3QgY3VycmVudGx5X2hpZ2hsaWdodGVkX3NldCA9IG5ldyBTZXQoKQoKY29uc3QgbGFzdF90b2NfZWxlbWVudF9jbGlja190aW1lID0geyBjdXJyZW50OiAwIH0KCmNvbnN0IGludGVyc2VjdGlvbl9jYWxsYmFjayA9IChpeHMpID0+IHsKCWxldCBvbl90b3AgPSBpeHMuZmlsdGVyKGl4ID0+IGl4LmludGVyc2VjdGlvblJhdGlvID4gMCAmJiBpeC5pbnRlcnNlY3Rpb25SZWN0LnkgPCBpeC5yb290Qm91bmRzLmhlaWdodCAvIDIpCglpZihvbl90b3AubGVuZ3RoID4gMCl7CgkJY3VycmVudGx5X2hpZ2hsaWdodGVkX3NldC5mb3JFYWNoKGEgPT4gYS5jbGFzc0xpc3QucmVtb3ZlKCJpbi12aWV3IikpCgkJY3VycmVudGx5X2hpZ2hsaWdodGVkX3NldC5jbGVhcigpCgkJb25fdG9wLnNsaWNlKDAsMSkuZm9yRWFjaChpID0+IHsKCQkJbGV0IGRpdiA9IGhlYWRlcl90b19pbmRleF9lbnRyeV9tYXAuZ2V0KGkudGFyZ2V0KQoJCQlkaXYuY2xhc3NMaXN0LmFkZCgiaW4tdmlldyIpCgkJCWN1cnJlbnRseV9oaWdobGlnaHRlZF9zZXQuYWRkKGRpdikKCQkJCgkJCS8vLyBzY3JvbGwgaW50byB2aWV3CgkJCS8qCgkJCWNvbnN0IHRvY19oZWlnaHQgPSB0b2NOb2RlLm9mZnNldEhlaWdodAoJCQljb25zdCBkaXZfcG9zID0gZGl2Lm9mZnNldFRvcAoJCQljb25zdCBkaXZfaGVpZ2h0ID0gZGl2Lm9mZnNldEhlaWdodAoJCQljb25zdCBjdXJyZW50X3Njcm9sbCA9IHRvY05vZGUuc2Nyb2xsVG9wCgkJCWNvbnN0IGhlYWRlcl9oZWlnaHQgPSB0b2NOb2RlLnF1ZXJ5U2VsZWN0b3IoImhlYWRlciIpLm9mZnNldEhlaWdodAoJCQkKCQkJY29uc3Qgc2Nyb2xsX3RvX3RvcCA9IGRpdl9wb3MgLSBoZWFkZXJfaGVpZ2h0CgkJCWNvbnN0IHNjcm9sbF90b19ib3R0b20gPSBkaXZfcG9zICsgZGl2X2hlaWdodCAtIHRvY19oZWlnaHQKCQkJCgkJCS8vIGlmIHdlIHNldCBhIHNjcm9sbFRvcCwgdGhlbiB0aGUgYnJvd3NlciB3aWxsIHN0b3AgYW55IGN1cnJlbnRseSBvbmdvaW5nIHNtb290aHNjcm9sbCBhbmltYXRpb24uIFNvIGxldCdzIG9ubHkgZG8gdGhpcyBpZiB5b3UgYXJlIG5vdCBjdXJyZW50bHkgaW4gYSBzbW9vdGhzY3JvbGwuCgkJCWlmKERhdGUubm93KCkgLSBsYXN0X3RvY19lbGVtZW50X2NsaWNrX3RpbWUuY3VycmVudCA+PSAyMDAwKQoJCQkJaWYoY3VycmVudF9zY3JvbGwgPCBzY3JvbGxfdG9fYm90dG9tKXsKCQkJCQl0b2NOb2RlLnNjcm9sbFRvcCA9IHNjcm9sbF90b19ib3R0b20KCQkJCX0gZWxzZSBpZihjdXJyZW50X3Njcm9sbCA+IHNjcm9sbF90b190b3ApewoJCQkJCXRvY05vZGUuc2Nyb2xsVG9wID0gc2Nyb2xsX3RvX3RvcAoJCQkJfQoJCQkqLwoJCX0pCgl9Cn0KbGV0IGludGVyc2VjdGlvbl9vYnNlcnZlcl8xID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGludGVyc2VjdGlvbl9jYWxsYmFjaywgewoJcm9vdDogbnVsbCwgLy8gaS5lLiB0aGUgdmlld3BvcnQKICAJdGhyZXNob2xkOiAxLAoJcm9vdE1hcmdpbjogIi0xNXB4IiwgLy8gc2xpZ2h0bHkgc21hbGxlciB0aGFuIHRoZSB2aWV3cG9ydAoJLy8gZGVsYXk6IDEwMCwKfSkKbGV0IGludGVyc2VjdGlvbl9vYnNlcnZlcl8yID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGludGVyc2VjdGlvbl9jYWxsYmFjaywgewoJcm9vdDogbnVsbCwgLy8gaS5lLiB0aGUgdmlld3BvcnQKICAJdGhyZXNob2xkOiAxLAoJcm9vdE1hcmdpbjogIjE1cHgiLCAvLyBzbGlnaHRseSBsYXJnZXIgdGhhbiB0aGUgdmlld3BvcnQKCS8vIGRlbGF5OiAxMDAsCn0pCgpjb25zdCByZW5kZXIgPSAoZWxlbWVudHMpID0+IHsKCWhlYWRlcl90b19pbmRleF9lbnRyeV9tYXAuY2xlYXIoKQoJY3VycmVudGx5X2hpZ2hsaWdodGVkX3NldC5jbGVhcigpCglpbnRlcnNlY3Rpb25fb2JzZXJ2ZXJfMS5kaXNjb25uZWN0KCkKCWludGVyc2VjdGlvbl9vYnNlcnZlcl8yLmRpc2Nvbm5lY3QoKQoKCQlsZXQgbGFzdF9sZXZlbCA9IGBIMWAKCXJldHVybiBodG1sYCR7ZWxlbWVudHMubWFwKGggPT4gewoJY29uc3QgcGFyZW50X2NlbGwgPSBnZXRQYXJlbnRDZWxsKGgpCgoJCWxldCBbY2xhc3NOYW1lLCB0aXRsZV9lbF0gPSBoLm1hdGNoZXMoYC5wbHV0by1kb2NzLWJpbmRpbmdgKSA/IFsicGx1dG8tZG9jcy1iaW5kaW5nLWVsIiwgaC5maXJzdEVsZW1lbnRDaGlsZF0gOiBbaC5ub2RlTmFtZSwgaF0KCgljb25zdCBhID0gaHRtbGA8YSAKCQljbGFzcz0iJHtjbGFzc05hbWV9IiAKCQl0aXRsZT0iJHt0aXRsZV9lbC5pbm5lclRleHR9IgoJCWhyZWY9IiMke3BhcmVudF9jZWxsLmlkfSIKCT4ke3RpdGxlX2VsLmlubmVySFRNTH08L2E+YAoJLyogYS5vbm1vdXNlb3Zlcj0oKT0+ewoJCXBhcmVudF9jZWxsLmZpcnN0RWxlbWVudENoaWxkLmNsYXNzTGlzdC5hZGQoCgkJCSdoaWdobGlnaHQtcGx1dG8tY2VsbC1zaG91bGRlcicKCQkpCgl9CglhLm9ubW91c2VvdXQ9KCkgPT4gewoJCXBhcmVudF9jZWxsLmZpcnN0RWxlbWVudENoaWxkLmNsYXNzTGlzdC5yZW1vdmUoCgkJCSdoaWdobGlnaHQtcGx1dG8tY2VsbC1zaG91bGRlcicKCQkpCgl9ICovCgkJCgkJCglhLm9uY2xpY2s9KGUpID0+IHsKCQllLnByZXZlbnREZWZhdWx0KCk7CgkJbGFzdF90b2NfZWxlbWVudF9jbGlja190aW1lLmN1cnJlbnQgPSBEYXRlLm5vdygpCgkJc2Nyb2xsSW50b1ZpZXcoaCwgewoJCQliZWhhdmlvcjogJ3Ntb290aCcsIAoJCQlibG9jazogJ3N0YXJ0JywKCQl9KS50aGVuKCgpID0+IAoJCQkvLyBzb21ldGltZXMgaXQgZG9lc24ndCBzY3JvbGwgdG8gdGhlIHJpZ2h0IHBsYWNlCgkJCS8vIHNvbHV0aW9uOiB0cnkgYSBzZWNvbmQgdGltZSEKCQkJc2Nyb2xsSW50b1ZpZXcoaCwgewoJCQkJYmVoYXZpb3I6ICdzbW9vdGgnLCAKCQkJCWJsb2NrOiAnc3RhcnQnLAoJCQl9KQoJICAgKQoJfQoKCWNvbnN0IHJvdyA9ICBodG1sYDxkaXYgY2xhc3M9InRvYy1yb3cgJHtjbGFzc05hbWV9IGFmdGVyLSR7bGFzdF9sZXZlbH0iPiR7YX08L2Rpdj5gCgkJaW50ZXJzZWN0aW9uX29ic2VydmVyXzEub2JzZXJ2ZSh0aXRsZV9lbCkKCQlpbnRlcnNlY3Rpb25fb2JzZXJ2ZXJfMi5vYnNlcnZlKHRpdGxlX2VsKQoJCWhlYWRlcl90b19pbmRleF9lbnRyeV9tYXAuc2V0KHRpdGxlX2VsLCByb3cpCgoJaWYoY2xhc3NOYW1lLnN0YXJ0c1dpdGgoIkgiKSkKCQlsYXN0X2xldmVsID0gY2xhc3NOYW1lCgkJCglyZXR1cm4gcm93Cn0pfWAKfQoKY29uc3QgaW52YWxpZGF0ZWQgPSB7IGN1cnJlbnQ6IGZhbHNlIH0KCmNvbnN0IHVwZGF0ZUNhbGxiYWNrID0gKCkgPT4gewoJaWYgKCFpbnZhbGlkYXRlZC5jdXJyZW50KSB7CgkJdG9jTm9kZS5xdWVyeVNlbGVjdG9yKCJzZWN0aW9uIikucmVwbGFjZVdpdGgoCgkJCWh0bWxgPHNlY3Rpb24+JHtyZW5kZXIoZ2V0SGVhZGVycygpKX08L3NlY3Rpb24+YAoJCSkKCX0KfQp1cGRhdGVDYWxsYmFjaygpCnNldFRpbWVvdXQodXBkYXRlQ2FsbGJhY2ssIDEwMCkKc2V0VGltZW91dCh1cGRhdGVDYWxsYmFjaywgMTAwMCkKc2V0VGltZW91dCh1cGRhdGVDYWxsYmFjaywgNTAwMCkKCmNvbnN0IG5vdGVib29rID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigicGx1dG8tbm90ZWJvb2siKQoKCi8vIFdlIGhhdmUgYSBtdXRhdGlvbm9ic2VydmVyIGZvciBlYWNoIGNlbGw6CmNvbnN0IG11dF9vYnNlcnZlcnMgPSB7CgljdXJyZW50OiBbXSwKfQoKY29uc3QgY3JlYXRlQ2VsbE9ic2VydmVycyA9ICgpID0+IHsKCW11dF9vYnNlcnZlcnMuY3VycmVudC5mb3JFYWNoKChvKSA9PiBvLmRpc2Nvbm5lY3QoKSkKCW11dF9vYnNlcnZlcnMuY3VycmVudCA9IEFycmF5LmZyb20obm90ZWJvb2sucXVlcnlTZWxlY3RvckFsbCgicGx1dG8tY2VsbCIpKS5tYXAoZWwgPT4gewoJCWNvbnN0IG8gPSBuZXcgTXV0YXRpb25PYnNlcnZlcih1cGRhdGVDYWxsYmFjaykKCQlvLm9ic2VydmUoZWwsIHthdHRyaWJ1dGVGaWx0ZXI6IFsiY2xhc3MiXX0pCgkJcmV0dXJuIG8KCX0pCn0KY3JlYXRlQ2VsbE9ic2VydmVycygpCgovLyBBbmQgb25lIGZvciB0aGUgbm90ZWJvb2sncyBjaGlsZCBsaXN0LCB3aGljaCB1cGRhdGVzIG91ciBjZWxsIG9ic2VydmVyczoKY29uc3Qgbm90ZWJvb2tPYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsKCXVwZGF0ZUNhbGxiYWNrKCkKCWNyZWF0ZUNlbGxPYnNlcnZlcnMoKQp9KQpub3RlYm9va09ic2VydmVyLm9ic2VydmUobm90ZWJvb2ssIHtjaGlsZExpc3Q6IHRydWV9KQoKLy8gQW5kIGZpbmFsbHksIGFuIG9ic2VydmVyIGZvciB0aGUgZG9jdW1lbnQuYm9keSBjbGFzc0xpc3QsIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0b2MgYWxzbyB3b3JrcyB3aGVuIGl0IGlzIGxvYWRlZCBkdXJpbmcgbm90ZWJvb2sgaW5pdGlhbGl6YXRpb24KY29uc3QgYm9keUNsYXNzT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcih1cGRhdGVDYWxsYmFjaykKYm9keUNsYXNzT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7YXR0cmlidXRlRmlsdGVyOiBbImNsYXNzIl19KQoKLy8gSGlkZS9zaG93IHRoZSBUb0Mgd2hlbiB0aGUgc2NyZWVuIGdldHMgc21hbGwKbGV0IG1hdGNoX2xpc3RlbmVyID0gKCkgPT4gCgl0b2NOb2RlLmNsYXNzTGlzdC50b2dnbGUoImhpZGUiLCAodG9jTm9kZS5jbG9zZXN0KCJwbHV0by1lZGl0b3IiKSA/PyBkb2N1bWVudC5ib2R5KS5zY3JvbGxXaWR0aCA8IDEwMDApCmZvcihsZXQgcyBvZiBbMTAwMCwgMTEwMCwgMTIwMCwgMTMwMCwgMTQwMCwgMTUwMCwgMTYwMCwgMTcwMCwgMTgwMCwgMTkwMCwgMjAwMF0pIHsKCWxldCBtID0gbWF0Y2hNZWRpYShgKG1heC13aWR0aDogJHtzfXB4KWApCgltLmFkZExpc3RlbmVyKG1hdGNoX2xpc3RlbmVyKQoJaW52YWxpZGF0aW9uLnRoZW4oKCkgPT4gbS5yZW1vdmVMaXN0ZW5lcihtYXRjaF9saXN0ZW5lcikpCn0KbWF0Y2hfbGlzdGVuZXIoKQoKaW52YWxpZGF0aW9uLnRoZW4oKCkgPT4gewoJaW52YWxpZGF0ZWQuY3VycmVudCA9IHRydWUKCWludGVyc2VjdGlvbl9vYnNlcnZlcl8xLmRpc2Nvbm5lY3QoKQoJaW50ZXJzZWN0aW9uX29ic2VydmVyXzIuZGlzY29ubmVjdCgpCglub3RlYm9va09ic2VydmVyLmRpc2Nvbm5lY3QoKQoJYm9keUNsYXNzT2JzZXJ2ZXIuZGlzY29ubmVjdCgpCgltdXRfb2JzZXJ2ZXJzLmN1cnJlbnQuZm9yRWFjaCgobykgPT4gby5kaXNjb25uZWN0KCkpCglkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsIGRvY3VtZW50X2NsaWNrX2hhbmRsZXIpCn0pCgpyZXR1cm4gdG9jTm9kZQo8L3NjcmlwdD4KPHN0eWxlPgpAbWVkaWEgbm90IHByaW50IHsKCi5wbHV0b3VpLXRvYyB7Cglmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAiU2Vnb2UgVUkiLCBSb2JvdG8sIE94eWdlbi1TYW5zLCBDYW50YXJlbGwsICJBcHBsZSBDb2xvciBFbW9qaSIsCgkJIlNlZ29lIFVJIEVtb2ppIiwgIlNlZ29lIFVJIFN5bWJvbCIsIHN5c3RlbS11aSwgc2Fucy1zZXJpZjsKCS0tbWFpbi1iZy1jb2xvcjogI2ZhZmFmYTsKCS0tcGx1dG8tb3V0cHV0LWNvbG9yOiBoc2woMCwgMCUsIDM2JSk7CgktLXBsdXRvLW91dHB1dC1oLWNvbG9yOiBoc2woMCwgMCUsIDIxJSk7CgktLXNpZGViYXItbGktYWN0aXZlLWJnOiByZ2IoMjM1LCAyMzUsIDIzNSk7CgktLWljb24tZmlsdGVyOiB1bnNldDsKfQoKQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewoJLnBsdXRvdWktdG9jIHsKCQktLW1haW4tYmctY29sb3I6ICMzMDMwMzA7CgkJLS1wbHV0by1vdXRwdXQtY29sb3I6IGhzbCgwLCAwJSwgOTAlKTsKCQktLXBsdXRvLW91dHB1dC1oLWNvbG9yOiBoc2woMCwgMCUsIDk3JSk7CgkJLS1zaWRlYmFyLWxpLWFjdGl2ZS1iZzogcmdiKDgyLCA4MiwgODIpOwoJCS0taWNvbi1maWx0ZXI6IGludmVydCgxKTsKCX0KfQoKLnBsdXRvdWktdG9jLmFzaWRlIHsKCWNvbG9yOiB2YXIoLS1wbHV0by1vdXRwdXQtY29sb3IpOwoJcG9zaXRpb246IGZpeGVkOwoJcmlnaHQ6IDFyZW07Cgl0b3A6IDVyZW07Cgl3aWR0aDogbWluKDgwdncsIDMwMHB4KTsKCXBhZGRpbmc6IDAuNXJlbTsKCXBhZGRpbmctdG9wOiAwZW07CgkvKiBib3JkZXI6IDNweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTUpOyAqLwoJYm9yZGVyLXJhZGl1czogMTBweDsKCS8qIGJveC1zaGFkb3c6IDAgMCAxMXB4IDBweCAjMDAwMDAwMTA7ICovCgltYXgtaGVpZ2h0OiBjYWxjKDEwMHZoIC0gNXJlbSAtIDkwcHgpOwoJb3ZlcmZsb3c6IGF1dG87Cgl6LWluZGV4OiA0MDsKCWJhY2tncm91bmQtY29sb3I6IHZhcigtLW1haW4tYmctY29sb3IpOwoJdHJhbnNpdGlvbjogdHJhbnNmb3JtIDMwMG1zIGN1YmljLWJlemllcigwLjE4LCAwLjg5LCAwLjQ1LCAxLjEyKTsKfQoKLnBsdXRvdWktdG9jLmFzaWRlLmhpZGUgewoJdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMTAwJSAtIDI4cHgpKTsKfQoucGx1dG91aS10b2MuYXNpZGUuaGlkZSBzZWN0aW9uIHsKCWRpc3BsYXk6IG5vbmU7Cn0KLnBsdXRvdWktdG9jLmFzaWRlLmhpZGUgaGVhZGVyIHsKCW1hcmdpbi1ib3R0b206IDBlbTsKCXBhZGRpbmctYm90dG9tOiAwZW07Cglib3JkZXItYm90dG9tOiBub25lOwp9Cn0gIC8qIEVuZCBvZiBNZWRpYSBwcmludCBxdWVyeSAqLwoucGx1dG91aS10b2MuYXNpZGUuaGlkZSAub3Blbi10b2MsCi5wbHV0b3VpLXRvYy5hc2lkZTpub3QoLmhpZGUpIC5jbG9zZWQtdG9jLAoucGx1dG91aS10b2M6bm90KC5hc2lkZSkgLmNsb3NlZC10b2MgewoJZGlzcGxheTogbm9uZTsKfQoKQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uKSB7CiAgLnBsdXRvdWktdG9jLmFzaWRlIHsKCXRyYW5zaXRpb24tZHVyYXRpb246IDBzOwogIH0KfQoKLnRvYy10b2dnbGUgewoJY3Vyc29yOiBwb2ludGVyOwogICAgcGFkZGluZzogMWVtOwogICAgbWFyZ2luOiAtMWVtOwogICAgbWFyZ2luLXJpZ2h0OiAtMC43ZW07CiAgICBsaW5lLWhlaWdodDogMWVtOwogICAgZGlzcGxheTogZmxleDsKfQoKLnRvYy10b2dnbGU6OmJlZm9yZSB7CiAgICBjb250ZW50OiAiIjsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIGhlaWdodDogMWVtOwogICAgd2lkdGg6IDFlbTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL2lvbmljLXRlYW0vaW9uaWNvbnNANS41LjEvc3JjL3N2Zy9saXN0LW91dGxpbmUuc3ZnIik7CgkvKiBnZW5lcmF0ZWQgdXNpbmcgaHR0cHM6Ly9kb3BpYXphLm9yZy90b29scy9kYXRhdXJpL2luZGV4LnBocCAqLwogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTFNVElpSUdobGFXZG9kRDBpTlRFeUlpQjJhV1YzUW05NFBTSXdJREFnTlRFeUlEVXhNaUkrUEhScGRHeGxQbWx2Ym1samIyNXpMWFkxTFc4OEwzUnBkR3hsUGp4c2FXNWxJSGd4UFNJeE5qQWlJSGt4UFNJeE5EUWlJSGd5UFNJME5EZ2lJSGt5UFNJeE5EUWlJSE4wZVd4bFBTSm1hV3hzT201dmJtVTdjM1J5YjJ0bE9pTXdNREE3YzNSeWIydGxMV3hwYm1WallYQTZjbTkxYm1RN2MzUnliMnRsTFd4cGJtVnFiMmx1T25KdmRXNWtPM04wY205clpTMTNhV1IwYURvek1uQjRJaTgrUEd4cGJtVWdlREU5SWpFMk1DSWdlVEU5SWpJMU5pSWdlREk5SWpRME9DSWdlVEk5SWpJMU5pSWdjM1I1YkdVOUltWnBiR3c2Ym05dVpUdHpkSEp2YTJVNkl6QXdNRHR6ZEhKdmEyVXRiR2x1WldOaGNEcHliM1Z1WkR0emRISnZhMlV0YkdsdVpXcHZhVzQ2Y205MWJtUTdjM1J5YjJ0bExYZHBaSFJvT2pNeWNIZ2lMejQ4YkdsdVpTQjRNVDBpTVRZd0lpQjVNVDBpTXpZNElpQjRNajBpTkRRNElpQjVNajBpTXpZNElpQnpkSGxzWlQwaVptbHNiRHB1YjI1bE8zTjBjbTlyWlRvak1EQXdPM04wY205clpTMXNhVzVsWTJGd09uSnZkVzVrTzNOMGNtOXJaUzFzYVc1bGFtOXBianB5YjNWdVpEdHpkSEp2YTJVdGQybGtkR2c2TXpKd2VDSXZQanhqYVhKamJHVWdZM2c5SWpnd0lpQmplVDBpTVRRMElpQnlQU0l4TmlJZ2MzUjViR1U5SW1acGJHdzZibTl1WlR0emRISnZhMlU2SXpBd01EdHpkSEp2YTJVdGJHbHVaV05oY0RweWIzVnVaRHR6ZEhKdmEyVXRiR2x1WldwdmFXNDZjbTkxYm1RN2MzUnliMnRsTFhkcFpIUm9Pak15Y0hnaUx6NDhZMmx5WTJ4bElHTjRQU0k0TUNJZ1kzazlJakkxTmlJZ2NqMGlNVFlpSUhOMGVXeGxQU0ptYVd4c09tNXZibVU3YzNSeWIydGxPaU13TURBN2MzUnliMnRsTFd4cGJtVmpZWEE2Y205MWJtUTdjM1J5YjJ0bExXeHBibVZxYjJsdU9uSnZkVzVrTzNOMGNtOXJaUzEzYVdSMGFEb3pNbkI0SWk4K1BHTnBjbU5zWlNCamVEMGlPREFpSUdONVBTSXpOamdpSUhJOUlqRTJJaUJ6ZEhsc1pUMGlabWxzYkRwdWIyNWxPM04wY205clpUb2pNREF3TzNOMGNtOXJaUzFzYVc1bFkyRndPbkp2ZFc1a08zTjBjbTlyWlMxc2FXNWxhbTlwYmpweWIzVnVaRHR6ZEhKdmEyVXRkMmxrZEdnNk16SndlQ0l2UGp3dmMzWm5QZz09Iik7CiAgICBiYWNrZ3JvdW5kLXNpemU6IDFlbTsKCWZpbHRlcjogdmFyKC0taWNvbi1maWx0ZXIpOwp9CgouYXNpZGUgLnRvYy10b2dnbGUub3Blbi10b2M6aG92ZXI6OmJlZm9yZSB7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9naC9pb25pYy10ZWFtL2lvbmljb25zQDUuNS4xL3NyYy9zdmcvYXJyb3ctZm9yd2FyZC1vdXRsaW5lLnN2ZyIpOwoJLyogZ2VuZXJhdGVkIHVzaW5nIGh0dHBzOi8vZG9waWF6YS5vcmcvdG9vbHMvZGF0YXVyaS9pbmRleC5waHAgKi8KICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhkcFpIUm9QU0kxTVRJaUlHaGxhV2RvZEQwaU5URXlJaUIyYVdWM1FtOTRQU0l3SURBZ05URXlJRFV4TWlJK1BIUnBkR3hsUG1sdmJtbGpiMjV6TFhZMUxXRThMM1JwZEd4bFBqeHdiMng1YkdsdVpTQndiMmx1ZEhNOUlqSTJPQ0F4TVRJZ05ERXlJREkxTmlBeU5qZ2dOREF3SWlCemRIbHNaVDBpWm1sc2JEcHViMjVsTzNOMGNtOXJaVG9qTURBd08zTjBjbTlyWlMxc2FXNWxZMkZ3T25KdmRXNWtPM04wY205clpTMXNhVzVsYW05cGJqcHliM1Z1WkR0emRISnZhMlV0ZDJsa2RHZzZORGh3ZUNJdlBqeHNhVzVsSUhneFBTSXpPVElpSUhreFBTSXlOVFlpSUhneVBTSXhNREFpSUhreVBTSXlOVFlpSUhOMGVXeGxQU0ptYVd4c09tNXZibVU3YzNSeWIydGxPaU13TURBN2MzUnliMnRsTFd4cGJtVmpZWEE2Y205MWJtUTdjM1J5YjJ0bExXeHBibVZxYjJsdU9uSnZkVzVrTzNOMGNtOXJaUzEzYVdSMGFEbzBPSEI0SWk4K1BDOXpkbWMrIik7Cn0KLmFzaWRlIC50b2MtdG9nZ2xlLmNsb3NlZC10b2M6aG92ZXI6OmJlZm9yZSB7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9naC9pb25pYy10ZWFtL2lvbmljb25zQDUuNS4xL3NyYy9zdmcvYXJyb3ctYmFjay1vdXRsaW5lLnN2ZyIpOwoJLyogZ2VuZXJhdGVkIHVzaW5nIGh0dHBzOi8vZG9waWF6YS5vcmcvdG9vbHMvZGF0YXVyaS9pbmRleC5waHAgKi8KICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhkcFpIUm9QU0kxTVRJaUlHaGxhV2RvZEQwaU5URXlJaUIyYVdWM1FtOTRQU0l3SURBZ05URXlJRFV4TWlJK1BIUnBkR3hsUG1sdmJtbGpiMjV6TFhZMUxXRThMM1JwZEd4bFBqeHdiMng1YkdsdVpTQndiMmx1ZEhNOUlqSTBOQ0EwTURBZ01UQXdJREkxTmlBeU5EUWdNVEV5SWlCemRIbHNaVDBpWm1sc2JEcHViMjVsTzNOMGNtOXJaVG9qTURBd08zTjBjbTlyWlMxc2FXNWxZMkZ3T25KdmRXNWtPM04wY205clpTMXNhVzVsYW05cGJqcHliM1Z1WkR0emRISnZhMlV0ZDJsa2RHZzZORGh3ZUNJdlBqeHNhVzVsSUhneFBTSXhNakFpSUhreFBTSXlOVFlpSUhneVBTSTBNVElpSUhreVBTSXlOVFlpSUhOMGVXeGxQU0ptYVd4c09tNXZibVU3YzNSeWIydGxPaU13TURBN2MzUnliMnRsTFd4cGJtVmpZWEE2Y205MWJtUTdjM1J5YjJ0bExXeHBibVZxYjJsdU9uSnZkVzVrTzNOMGNtOXJaUzEzYVdSMGFEbzBPSEI0SWk4K1BDOXpkbWMrIik7Cn0KCgoKLnBsdXRvdWktdG9jIGhlYWRlciB7CglkaXNwbGF5OiBmbGV4OwoJYWxpZ24taXRlbXM6IGNlbnRlcjsKCWdhcDogLjNlbTsKCWZvbnQtc2l6ZTogMS41ZW07CgkvKiBtYXJnaW4tdG9wOiAtMC4xZW07ICovCgltYXJnaW4tYm90dG9tOiAwLjRlbTsKCXBhZGRpbmc6IDAuNXJlbTsKCW1hcmdpbi1sZWZ0OiAwOwoJbWFyZ2luLXJpZ2h0OiAwOwoJZm9udC13ZWlnaHQ6IGJvbGQ7CgkvKiBib3JkZXItYm90dG9tOiAycHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjE1KTsgKi8KCXBvc2l0aW9uOiBzdGlja3k7Cgl0b3A6IDBweDsKCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJei1pbmRleDogNDE7Cn0KLnBsdXRvdWktdG9jLmFzaWRlIGhlYWRlciB7CglwYWRkaW5nLWxlZnQ6IDA7CglwYWRkaW5nLXJpZ2h0OiAwOwp9CgoucGx1dG91aS10b2Mgc2VjdGlvbiAudG9jLXJvdyB7Cgl3aGl0ZS1zcGFjZTogbm93cmFwOwoJb3ZlcmZsb3c6IGhpZGRlbjsKCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJcGFkZGluZzogLjFlbTsKCWJvcmRlci1yYWRpdXM6IC4yZW07Cn0KCi5wbHV0b3VpLXRvYyBzZWN0aW9uIC50b2Mtcm93LkgxIHsKCW1hcmdpbi10b3A6IDFlbTsKfQoKCi5wbHV0b3VpLXRvYy5hc2lkZSBzZWN0aW9uIC50b2Mtcm93LmluLXZpZXcgewoJYmFja2dyb3VuZDogdmFyKC0tc2lkZWJhci1saS1hY3RpdmUtYmcpOwp9CgoKCQouaGlnaGxpZ2h0LXBsdXRvLWNlbGwtc2hvdWxkZXIgewoJYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA1KTsKCWJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7Cn0KCi5wbHV0b3VpLXRvYyBzZWN0aW9uIGEgewoJdGV4dC1kZWNvcmF0aW9uOiBub25lOwoJZm9udC13ZWlnaHQ6IG5vcm1hbDsKCWNvbG9yOiB2YXIoLS1wbHV0by1vdXRwdXQtY29sb3IpOwp9Ci5wbHV0b3VpLXRvYyBzZWN0aW9uIGE6aG92ZXIgewoJY29sb3I6IHZhcigtLXBsdXRvLW91dHB1dC1oLWNvbG9yKTsKfQoKLnBsdXRvdWktdG9jLmluZGVudCBzZWN0aW9uIGEuSDEgewoJZm9udC13ZWlnaHQ6IDcwMDsKCWxpbmUtaGVpZ2h0OiAxZW07Cn0KCi5wbHV0b3VpLXRvYy5pbmRlbnQgc2VjdGlvbiAuYWZ0ZXItSDIgYSB7IHBhZGRpbmctbGVmdDogMTBweDsgfQoucGx1dG91aS10b2MuaW5kZW50IHNlY3Rpb24gLmFmdGVyLUgzIGEgeyBwYWRkaW5nLWxlZnQ6IDIwcHg7IH0KLnBsdXRvdWktdG9jLmluZGVudCBzZWN0aW9uIC5hZnRlci1INCBhIHsgcGFkZGluZy1sZWZ0OiAzMHB4OyB9Ci5wbHV0b3VpLXRvYy5pbmRlbnQgc2VjdGlvbiAuYWZ0ZXItSDUgYSB7IHBhZGRpbmctbGVmdDogNDBweDsgfQoucGx1dG91aS10b2MuaW5kZW50IHNlY3Rpb24gLmFmdGVyLUg2IGEgeyBwYWRkaW5nLWxlZnQ6IDUwcHg7IH0KCi5wbHV0b3VpLXRvYy5pbmRlbnQgc2VjdGlvbiBhLkgxIHsgcGFkZGluZy1sZWZ0OiAwcHg7IH0KLnBsdXRvdWktdG9jLmluZGVudCBzZWN0aW9uIGEuSDIgeyBwYWRkaW5nLWxlZnQ6IDEwcHg7IH0KLnBsdXRvdWktdG9jLmluZGVudCBzZWN0aW9uIGEuSDMgeyBwYWRkaW5nLWxlZnQ6IDIwcHg7IH0KLnBsdXRvdWktdG9jLmluZGVudCBzZWN0aW9uIGEuSDQgeyBwYWRkaW5nLWxlZnQ6IDMwcHg7IH0KLnBsdXRvdWktdG9jLmluZGVudCBzZWN0aW9uIGEuSDUgeyBwYWRkaW5nLWxlZnQ6IDQwcHg7IH0KLnBsdXRvdWktdG9jLmluZGVudCBzZWN0aW9uIGEuSDYgeyBwYWRkaW5nLWxlZnQ6IDUwcHg7IH0KCgoucGx1dG91aS10b2MuaW5kZW50IHNlY3Rpb24gYS5wbHV0by1kb2NzLWJpbmRpbmctZWwsCi5wbHV0b3VpLXRvYy5pbmRlbnQgc2VjdGlvbiBhLkFTU0lHTkVFCgl7Cglmb250LWZhbWlseTogSnVsaWFNb25vLCBtb25vc3BhY2U7Cglmb250LXNpemU6IC44ZW07CgkvKiBiYWNrZ3JvdW5kOiBibGFjazsgKi8KCWZvbnQtd2VpZ2h0OiA3MDA7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cgljb2xvcjogdmFyKC0tY20tdmFyLWNvbG9yKTsgLyogdGhpcyBpcyBzdGVhbGluZyBhIHZhcmlhYmxlIGZyb20gUGx1dG8sIGJ1dCBpdCdzIGZpbmUgaWYgdGhhdCBkb2VzbnQgd29yayAqLwp9Ci5wbHV0b3VpLXRvYy5pbmRlbnQgc2VjdGlvbiBhLnBsdXRvLWRvY3MtYmluZGluZy1lbDo6YmVmb3JlLAoucGx1dG91aS10b2MuaW5kZW50IHNlY3Rpb24gYS5BU1NJR05FRTo6YmVmb3JlCgl7Cgljb250ZW50OiAiPiAiOwoJb3BhY2l0eTogLjM7Cn0KPC9zdHlsZT4KpG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv6LeviU1sHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQxYmIzZTQ5Yi0xYTE5LTQzNDMtYWMwOS1mYmFmMWNhZTRiYTO5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc08RLVwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJGVjZWIzMjZhLWNhYjYtNDY1ZS04ZTVjLWU4MzU4ODFiZDNiMIqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnZQTxkaXYgY2xhc3M9Im1hcmtkb3duIj48aDI+Mi4wLiBNYWduZXRpemF0aW9uIGR5bmFtaWNzPC9oMj4KPC9kaXY+pG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv6KrBXZ9sHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SRlY2ViMzI2YS1jYWI2LTQ2NWUtOGU1Yy1lODM1ODgxYmQzYjC5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4AAxfKtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkMWE2MmFlNzEtNThkYi00OWVhLWFlNmEtOWFlYTY2MTQ1OTYziqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedpqiQk8c2NyaXB0IGlkPSdwbG90XzEnPgoJCS8vIFdlIHN0YXJ0IGJ5IHB1dHRpbmcgYWxsIHRoZSB2YXJpYWJsZSBpbnRlcnBvbGF0aW9uIGhlcmUgYXQgdGhlIGJlZ2lubmluZwoJCS8vIFdlIGhhdmUgdG8gY29udmVydCBhbGwgdHlwZWRhcnJheXMgaW4gdGhlIGxheW91dCB0byBub3JtYWwgYXJyYXlzLiBTZWUgSXNzdWUgIzI1CgkJLy8gV2UgdXNlIGxvZGFzaCBmb3IgdGhpcyBmb3IgY29tcGFjdG5lc3MKCQlmdW5jdGlvbiByZW1vdmVUeXBlZEFycmF5KG8pIHsKCQkJcmV0dXJuIF8uaXNUeXBlZEFycmF5KG8pID8gQXJyYXkuZnJvbShvKSA6CgkJCV8uaXNQbGFpbk9iamVjdChvKSA/IF8ubWFwVmFsdWVzKG8sIHJlbW92ZVR5cGVkQXJyYXkpIDogCgkJCW8KCQl9CgoJCS8vIFB1Ymxpc2ggdGhlIHBsb3Qgb2JqZWN0IHRvIEpTCgkJbGV0IHBsb3Rfb2JqID0gXy51cGRhdGUoLyogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBBYnN0cmFjdFBsdXRvRGluZ2V0amVzLkRpc3BsYXkucHVibGlzaGVkX3RvX2pzICovIGdldFB1Ymxpc2hlZE9iamVjdCgiMGJjZDhlOTAtODE4MS0xMWVmLTI0YzAtZjE0ZjZhNGQzMDg0LzFmYWIwNzFmZDEwYTNhZTMiKSwgImxheW91dCIsIHJlbW92ZVR5cGVkQXJyYXkpCgkJLy8gR2V0IHRoZSBwbG90bHkgbGlzdGVuZXJzCgkJY29uc3QgcGxvdGx5X2xpc3RlbmVycyA9IHt9CgkJLy8gR2V0IHRoZSBKUyBsaXN0ZW5lcnMKCQljb25zdCBqc19saXN0ZW5lcnMgPSB7fQoJCS8vIERlYWwgd2l0aCBldmVudHVhbCBjdXN0b20gY2xhc3NlcwoJCWxldCBjdXN0b21fY2xhc3NsaXN0ID0gW10KCgoJCS8vIExvYWQgdGhlIHBsb3RseSBsaWJyYXJ5CgkJbGV0IFBsb3RseSA9IHVuZGVmaW5lZAoJCXRyeSB7CgkJCWxldCBfbW9kID0gYXdhaXQgaW1wb3J0KCIuL3Bsb3RseWpzL3Bsb3RseWpzLTIuMjYuMi5taW4uanMiKQoJCQlQbG90bHkgPSBfbW9kLmRlZmF1bHQKCQl9IGNhdGNoIChlKSB7CgkJCWNvbnNvbGUubG9nKCJMb2NhbCBsb2FkIGZhaWxlZCwgdHJ5aW5nIHdpdGggdGhlIHdlYiBlc20uc2ggdmVyc2lvbiIpCgkJCWxldCBfbW9kID0gYXdhaXQgaW1wb3J0KCJodHRwczovL2VzbS5zaC92MTM1L3Bsb3RseS5qcy1kaXN0LW1pbkAyLjI2LjIvZXNuZXh0L3Bsb3RseS5qcy1kaXN0LW1pbi5tanMiKQoJCQlQbG90bHkgPSBfbW9kLmRlZmF1bHQKCQl9CgoJCS8vIENoZWNrIGlmIHdlIGhhdmUgdG8gZm9yY2UgbG9jYWwgbWF0aGpheCBmb250IGNhY2hlCgkJaWYgKGZhbHNlICYmIHdpbmRvdz8uTWF0aEpheD8uY29uZmlnPy5zdmc/LmZvbnRDYWNoZSA9PT0gJ2dsb2JhbCcpIHsKCQkJd2luZG93Lk1hdGhKYXguY29uZmlnLnN2Zy5mb250Q2FjaGUgPSAnbG9jYWwnCgkJfQoKCQkvLyBGbGFnIHRvIGNoZWNrIGlmIHRoaXMgY2VsbCB3YXMgIG1hbnVhbGx5IHJhbiBvciByZWFjdGl2ZWx5IHJhbgpjb25zdCBmaXJzdFJ1biA9IHRoaXMgPyBmYWxzZSA6IHRydWUKY29uc3QgQ09OVEFJTkVSID0gdGhpcyA/PyBodG1sYDxkaXYgY2xhc3M9J3BsdXRvcGxvdGx5LWNvbnRhaW5lcic+YApjb25zdCBQTE9UID0gQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoJy5qcy1wbG90bHktcGxvdCcpID8/IENPTlRBSU5FUi5hcHBlbmRDaGlsZChodG1sYDxkaXY+YCkKY29uc3QgcGFyZW50ID0gQ09OVEFJTkVSLnBhcmVudEVsZW1lbnQKLy8gV2UgdXNlIGEgY29udHJvbGxlciB0byByZW1vdmUgZXZlbnQgbGlzdGVuZXJzIHVwb24gaW52YWxpZGF0aW9uCmNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCkKLy8gV2UgaGF2ZSB0byBhZGQgdGhpcyB0byBrZWVwIHN1cHBvcnRpbmcgQGJpbmQgd2l0aCB0aGUgb2xkIEFQSSB1c2luZyBQTE9UClBMT1QuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoZSkgPT4gewoJQ09OVEFJTkVSLnZhbHVlID0gUExPVC52YWx1ZQoJaWYgKGUuYnViYmxlcykgewoJCXJldHVybgoJfQoJQ09OVEFJTkVSLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdpbnB1dCcpKQp9LCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSkKCgkvLyBUaGlzIGNyZWF0ZSB0aGUgc3R5bGUgc3ViZGl2IG9uIGZpcnN0IHJ1bgoJZmlyc3RSdW4gJiYgQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgCgk8c3R5bGU+CgkucGx1dG9wbG90bHktY29udGFpbmVyIHsKCQl3aWR0aDogMTAwJTsKCQloZWlnaHQ6IDEwMCU7CgkJbWluLWhlaWdodDogMDsKCQltaW4td2lkdGg6IDA7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyIC5qcy1wbG90bHktcGxvdCAucGxvdGx5IGRpdiB7CgkJbWFyZ2luOiAwIGF1dG87IC8vIFRoaXMgY2VudGVycyB0aGUgcGxvdAoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5wb3BwZWQtb3V0IHsKCQlvdmVyZmxvdzogYXV0bzsKCQl6LWluZGV4OiAxMDAwOwoJCXBvc2l0aW9uOiBmaXhlZDsKCQlyZXNpemU6IGJvdGg7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwcHg7CgkJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDBweDsKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIHsKCQlkaXNwbGF5OiBmbGV4OwoJCWZsZXgtZmxvdzogcm93IHdyYXA7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMTJweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMTJweDsKCQlwb3NpdGlvbjogZml4ZWQ7CgkJei1pbmRleDogMTAwMTsKCQljdXJzb3I6IG1vdmU7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCAtMTAwJSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgc3BhbiB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCWZsZXg6IDEKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyLmhpZGRlbiB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3BhbiB7CgkJcG9zaXRpb246IHJlbGF0aXZlOwoJfQoJLmNsaXBib2FyZC12YWx1ZSB7CgkJcGFkZGluZy1yaWdodDogNXB4OwoJCXBhZGRpbmctbGVmdDogMnB4OwoJCWN1cnNvcjogdGV4dDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZmlsZW5hbWUgewoJCWZsZXg6IDAgMCAxMDAlOwoJCXRleHQtYWxpZ246IGNlbnRlcjsKCQlib3JkZXItdG9wOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJbWFyZ2luLXRvcDogNXB4OwoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5maWxlbmFtZSB7CgkJbWFyZ2luLWxlZnQ6IDNweDsKCQl0ZXh0LWFsaWduOiBsZWZ0OwoJCW1pbi13aWR0aDogbWluKDYwJSwgbWluLWNvbnRlbnQpOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5maWxlc2F2ZSAuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgLmxhYmVsIHsKCQlmbGV4OiAwIDAgMDsKCX0KCS5jbGlwYm9hcmQtdmFsdWUuZm9ybWF0IHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7CgkJZmxleDogMSAwIGF1dG87CgkJbWluLXdpZHRoOiAzMHB4OwoJCW1hcmdpbi1yaWdodDogMTBweDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyB7CgkJZGlzcGxheTogaW5saW5lLWZsZXg7CgkJZmxleC1mbG93OiBjb2x1bW47CgkJcG9zaXRpb246IGFic29sdXRlOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJcGFkZGluZy1sZWZ0OiAzcHg7CgkJei1pbmRleDogMjAwMDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9uczpob3ZlciB7CgkJY3Vyc29yOiBwb2ludGVyOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCXBhZGRpbmc6IDNweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtM3B4LCAtNnB4KTsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyAuZm9ybWF0LW9wdGlvbiB7CgkJZGlzcGxheTogbm9uZTsKCX0KCWRpdi5mb3JtYXQtb3B0aW9uczpob3ZlciAuZm9ybWF0LW9wdGlvbiB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246bm90KC5zZWxlY3RlZCkgewoJCW1hcmdpbi10b3A6IDNweDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyAuZm9ybWF0LW9wdGlvbi5zZWxlY3RlZCB7CgkJb3JkZXI6IC0xOwoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5mb3JtYXQtb3B0aW9uOmhvdmVyIHsKCQliYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCX0KCXNwYW4uY29uZmlnLXZhbHVlIHsKCQlmb250LXdlaWdodDogbm9ybWFsOwoJCWNvbG9yOiB2YXIoLS1wbHV0by1vdXRwdXQtY29sb3IpOwoJCWRpc3BsYXk6IG5vbmU7CgkJcG9zaXRpb246IGFic29sdXRlOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCBjYWxjKC0xMDAlIC0gMTBweCkpOwoJCXBhZGRpbmc6IDVweDsKCX0KCS5sYWJlbCB7CgkJdXNlci1zZWxlY3Q6IG5vbmU7Cgl9CgkubGFiZWw6aG92ZXIgc3Bhbi5jb25maWctdmFsdWUgewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQltaW4td2lkdGg6IDE1MHB4OwoJfQoJLmNsaXBib2FyZC1zcGFuLm1hdGNoaW5nLWNvbmZpZyAubGFiZWwgewoJCWNvbG9yOiB2YXIoLS1jbS1tYWNyby1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZGlmZmVyZW50LWNvbmZpZyAubGFiZWwgewoJCWNvbG9yOiB2YXIoLS1jbS10YWctY29sb3IpOwoJCWZvbnQtd2VpZ2h0OiBib2xkOwoJfQo8L3N0eWxlPgpgKQoKbGV0IG9yaWdpbmFsX2hlaWdodCA9IHBsb3Rfb2JqLmxheW91dC5oZWlnaHQKbGV0IG9yaWdpbmFsX3dpZHRoID0gcGxvdF9vYmoubGF5b3V0LndpZHRoCi8vIEZvciB0aGUgaGVpZ2h0IHdlIGhhdmUgdG8gYWxzbyBwdXQgYSBmaXhlZCB2YWx1ZSBpbiBjYXNlIHRoZSBwbG90IGlzIHB1dCBvbiBhIG5vbi1maXhlZC1zaXplIGNvbnRhaW5lciAobGlrZSB0aGUgZGVmYXVsdCB3cmFwcGVyKQovLyBXZSBkZWZpbmUgYSB2YXJpYWJsZSB0byBjaGVjayB3aGV0aGVyIHdlIHN0aWxsIGhhdmUgdG8gcmVtb3ZlIHRoZSBmaXhlZCBoZWlnaHQKbGV0IHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IGZpcnN0UnVuCmxldCBjb250YWluZXJfaGVpZ2h0ID0gb3JpZ2luYWxfaGVpZ2h0ID8/IFBMT1QuY29udGFpbmVyX2hlaWdodCA/PyA0MDAKQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9IGNvbnRhaW5lcl9oZWlnaHQgKyAncHgnCgovLyBXZSBjcmVhdGUgYSBQcm9taXNlIHZlcnNpb24gb2Ygc2V0VGltZW91dApmdW5jdGlvbiBkZWxheShtcykgewogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpOwp9CgovLyBXZSBpbXBvcnQgaW50ZXJhY3QgZm9yIGRyYWdnaW5nL3Jlc2l6aW5nCmNvbnN0IHsgZGVmYXVsdDogaW50ZXJhY3QgfSA9IGF3YWl0IGltcG9ydCgnaHR0cHM6Ly9lc20uc2gvaW50ZXJhY3Rqc0AxLjEwLjE5JykKCgpmdW5jdGlvbiBnZXRJbWFnZU9wdGlvbnMoKSB7CiAgY29uc3QgbyA9IHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICByZXR1cm4gewogICAgZm9ybWF0OiBvLmZvcm1hdCA/PyAicG5nIiwKICAgIHdpZHRoOiBvLndpZHRoID8/IG9yaWdpbmFsX3dpZHRoLAogICAgaGVpZ2h0OiBvLmhlaWdodCA/PyBvcmlnaW5hbF9oZWlnaHQsCiAgICBzY2FsZTogby5zY2FsZSA/PyAxLAogICAgZmlsZW5hbWU6IG8uZmlsZW5hbWUgPz8gIm5ld3Bsb3QiLAogIH07Cn0KCmNvbnN0IENMSVBCT0FSRF9IRUFERVIgPQogIENPTlRBSU5FUi5xdWVyeVNlbGVjdG9yKCIucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciIpID8/CiAgQ09OVEFJTkVSLmluc2VydEFkamFjZW50RWxlbWVudCgKICAgICJhZnRlcmJlZ2luIiwKICAgIGh0bWxgPGRpdiBjbGFzcz0icGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBoaWRkZW4iPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gZm9ybWF0IgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZvcm1hdDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBmb3JtYXQiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gd2lkdGgiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+V2lkdGg6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgd2lkdGgiPjwvc3Bhbj5weDwvc3BhbgogICAgICA+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBoZWlnaHQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+SGVpZ2h0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGhlaWdodCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHNjYWxlIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPlNjYWxlOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIHNjYWxlIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2V0Ij5TZXQ8L2J1dHRvbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gdW5zZXQiPlVuc2V0PC9idXR0b24+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmaWxlbmFtZSIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5GaWxlbmFtZTo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBmaWxlbmFtZSI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICA8L2Rpdj5gCiAgKTsKCmZ1bmN0aW9uIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpIHsKICBjb25zdCB2YWxpZF9jbGFzc2VzID0gWwogICAgIm1pc3NpbmctY29uZmlnIiwKICAgICJtYXRjaGluZy1jb25maWciLAogICAgImRpZmZlcmVudC1jb25maWciLAogIF07CiAgZnVuY3Rpb24gc2V0Q2xhc3MoY2wpIHsKICAgIGZvciAoY29uc3QgbmFtZSBvZiB2YWxpZF9jbGFzc2VzKSB7CiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKG5hbWUsIG5hbWUgPT0gY2wpOwogICAgfQogIH0KICAvLyBXZSB1c2UgdGhlIGN1c3RvbSBnZXR0ZXJzIHdlJ2xsIHNldCB1cCBpbiB0aGUgY29udGFpbmVyCiAgY29uc3QgeyB1aV92YWx1ZSwgY29uZmlnX3ZhbHVlLCBjb25maWdfc3Bhbiwga2V5IH0gPSBjb250YWluZXI7CiAgaWYgKGNvbmZpZ192YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICBzZXRDbGFzcygibWlzc2luZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaXMgbm90IHByZXNlbnQgaW4gdGhlIGNvbmZpZy5gOwogIH0gZWxzZSBpZiAodWlfdmFsdWUgPT0gY29uZmlnX3ZhbHVlKSB7CiAgICBzZXRDbGFzcygibWF0Y2hpbmctY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGhhcyB0aGUgc2FtZSB2YWx1ZSBpbiB0aGUgY29uZmlnIGFuZCBpbiB0aGUgaGVhZGVyLmA7CiAgfSBlbHNlIHsKICAgIHNldENsYXNzKCJkaWZmZXJlbnQtY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGhhcyBhIGRpZmZlcmVudCB2YWx1ZSAoPGVtPiR7Y29uZmlnX3ZhbHVlfTwvZW0+KSBpbiB0aGUgY29uZmlnLmA7CiAgfQogIC8vIEFkZCBpbmZvIGFib3V0IHNldHRpbmcgYW5kIHVuc2V0dGluZwogIGNvbmZpZ19zcGFuLmluc2VydEFkamFjZW50SFRNTCgKICAgICJiZWZvcmVlbmQiLAogICAgYDxicj5DbGljayBvbiB0aGUgbGFiZWwgPGVtPjxiPm9uY2U8L2I+PC9lbT4gdG8gc2V0IHRoZSBjdXJyZW50IFVJIHZhbHVlIGluIHRoZSBjb25maWcuYAogICk7CiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIDxlbT48Yj50d2ljZTwvYj48L2VtPiB0byByZW1vdmUgdGhpcyBrZXkgZnJvbSB0aGUgY29uZmlnLmAKICApOwp9Cgpjb25zdCB2YWxpZF9mb3JtYXRzID0gWyJwbmciLCAic3ZnIiwgIndlYnAiLCAianBlZyIsICJmdWxsLWpzb24iXTsKZnVuY3Rpb24gaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHNwYW4sIGtleSwgdmFsdWUpIHsKICBjb25zdCBjb250YWluZXIgPSBzcGFuLmNsb3Nlc3QoIi5jbGlwYm9hcmQtc3BhbiIpOwogIHNwYW4uY29udGVudEVkaXRhYmxlID0ga2V5ID09PSAiZm9ybWF0IiA/ICJmYWxzZSIgOiAidHJ1ZSI7CiAgbGV0IHBhcnNlID0gKHgpID0+IHg7CiAgbGV0IHVwZGF0ZSA9ICh4KSA9PiAoc3Bhbi50ZXh0Q29udGVudCA9IHgpOwogIGlmIChrZXkgPT09ICJ3aWR0aCIgfHwga2V5ID09PSAiaGVpZ2h0IikgewogICAgcGFyc2UgPSAoeCkgPT4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KHgpKTsKICB9IGVsc2UgaWYgKGtleSA9PT0gInNjYWxlIikgewogICAgcGFyc2UgPSBwYXJzZUZsb2F0OwogIH0gZWxzZSBpZiAoa2V5ID09PSAiZm9ybWF0IikgewogICAgLy8gV2UgcmVtb3ZlIGNvbnRlbnRFZGl0YWJsZQogICAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSAiZmFsc2UiOwogICAgLy8gSGVyZSB3ZSBmaXJzdCBhZGQgdGhlIHN1YnNwYW5zIGZvciBlYWNoIG9wdGlvbgogICAgY29uc3Qgb3B0c19kaXYgPSBzcGFuLmFwcGVuZENoaWxkKGh0bWxgPGRpdiBjbGFzcz0iZm9ybWF0LW9wdGlvbnMiPjwvZGl2PmApOwogICAgZm9yIChjb25zdCBmbXQgb2YgdmFsaWRfZm9ybWF0cykgewogICAgICBjb25zdCBvcHQgPSBvcHRzX2Rpdi5hcHBlbmRDaGlsZCgKICAgICAgICBodG1sYDxzcGFuIGNsYXNzPSJmb3JtYXQtb3B0aW9uICR7Zm10fSI+JHtmbXR9PC9zcGFuPmAKICAgICAgKTsKICAgICAgb3B0Lm9uY2xpY2sgPSAoZSkgPT4gewogICAgICAgIHNwYW4udmFsdWUgPSBvcHQudGV4dENvbnRlbnQ7CiAgICAgIH07CiAgICB9CiAgICBwYXJzZSA9ICh4KSA9PiB7CiAgICAgIHJldHVybiB2YWxpZF9mb3JtYXRzLmluY2x1ZGVzKHgpID8geCA6IGxvY2FsVmFsdWU7CiAgICB9OwogICAgdXBkYXRlID0gKHgpID0+IHsKICAgICAgZm9yIChjb25zdCBvcHQgb2Ygb3B0c19kaXYuY2hpbGRyZW4pIHsKICAgICAgICBvcHQuY2xhc3NMaXN0LnRvZ2dsZSgic2VsZWN0ZWQiLCBvcHQudGV4dENvbnRlbnQgPT09IHgpOwogICAgICB9CiAgICB9OwogIH0gZWxzZSB7CiAgICAvLyBXZSBvbmx5IGhhdmUgZmlsZW5hbWUgaGVyZQogIH0KICBsZXQgbG9jYWxWYWx1ZTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBsb2NhbFZhbHVlOwogICAgfSwKICAgIHNldDogKHZhbCkgPT4gewogICAgICBpZiAodmFsICE9PSAiIikgewogICAgICAgIGxvY2FsVmFsdWUgPSBwYXJzZSh2YWwpOwogICAgICB9CiAgICAgIHVwZGF0ZShsb2NhbFZhbHVlKTsKICAgICAgY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcik7CiAgICB9LAogIH0pOwogIC8vIFdlIGFsc28gYXNzaWduIGEgbGlzdGVuZXIgc28gdGhhdCB0aGUgZWRpdGFibGUgaXMgYmx1cnJlZCB3aGVuIGVudGVyIGlzIHByZXNzZWQKICBzcGFuLm9ua2V5ZG93biA9IChlKSA9PiB7CiAgICBpZiAoZS5rZXlDb2RlID09PSAxMykgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHNwYW4uYmx1cigpOwogICAgfQogIH07CiAgc3Bhbi52YWx1ZSA9IHZhbHVlOwp9CgpmdW5jdGlvbiBpbml0aWFsaXplQ29uZmlnVmFsdWVTcGFuKHNwYW4sIGtleSkgewogIC8vIEhlcmUgd2UgbW9zdGx5IHdhbnQgdG8gZGVmaW5lIHRoZSBzZXR0ZXIgYW5kIGdldHRlcgogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwYW4sICJ2YWx1ZSIsIHsKICAgIGdldDogKCkgPT4gewogICAgICByZXR1cm4gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV07CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIC8vIGlmIHVuZGVmaW5lZCBpcyBwYXNzZWQsIHdlIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgb3B0aW9ucwogICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsKICAgICAgICBkZWxldGUgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV0gPSB2YWw7CiAgICAgIH0KICAgICAgY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcik7CiAgICB9LAogIH0pOwp9Cgpjb25zdCBjb25maWdfc3BhbnMgPSB7fTsKZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZ2V0SW1hZ2VPcHRpb25zKCkpKSB7CiAgY29uc3QgY29udGFpbmVyID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKGAuY2xpcGJvYXJkLXNwYW4uJHtrZXl9YCk7CiAgY29uc3QgbGFiZWwgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmxhYmVsIik7CiAgLy8gV2UgZ2l2ZSB0aGUgbGFiZWwgYSBmdW5jdGlvbiB0aGF0IG9uIHNpbmdsZSBjbGljayB3aWxsIHNldCB0aGUgY3VycmVudCB2YWx1ZSBhbmQgd2l0aCBkb3VibGUgY2xpY2sgd2lsbCB1bnNldCBpdAogIGxhYmVsLm9uY2xpY2sgPSBEdWFsQ2xpY2soCiAgICAoKSA9PiB7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBjb250YWluZXIudWlfdmFsdWU7CiAgICB9LAogICAgKGUpID0+IHsKICAgICAgY29uc29sZS5sb2coImUiLCBlKTsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gdW5kZWZpbmVkOwogICAgfQogICk7CiAgY29uc3QgdWlfdmFsdWVfc3BhbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXZhbHVlIik7CiAgY29uc3QgY29uZmlnX3ZhbHVlX3NwYW4gPQogICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jb25maWctdmFsdWUiKSA/PwogICAgbGFiZWwuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgICAiYWZ0ZXJiZWdpbiIsCiAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImNvbmZpZy12YWx1ZSI+PC9zcGFuPmAKICAgICk7CiAgLy8gQXNzaW5nIHRoZSB0d28gc3BhbnMgYXMgcHJvcGVydGllcyBvZiB0aGUgY29udGFpbmluZyBzcGFuCiAgY29udGFpbmVyLnVpX3NwYW4gPSB1aV92YWx1ZV9zcGFuOwogIGNvbnRhaW5lci5jb25maWdfc3BhbiA9IGNvbmZpZ192YWx1ZV9zcGFuOwogIGNvbnRhaW5lci5rZXkgPSBrZXk7CiAgY29uZmlnX3NwYW5zW2tleV0gPSBjb250YWluZXI7CiAgaWYgKGZpcnN0UnVuKSB7CiAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPQogICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPz8ge307CiAgICAvLyBXZSBkbyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHZhbHVlIHNwYW4KICAgIGluaXRpYWxpemVVSVZhbHVlU3Bhbih1aV92YWx1ZV9zcGFuLCBrZXksIHZhbHVlKTsKICAgIC8vIFRoZW4gd2UgaW5pdGlhbGl6ZSB0aGUgY29uZmlnIHZhbHVlCiAgICBpbml0aWFsaXplQ29uZmlnVmFsdWVTcGFuKGNvbmZpZ192YWx1ZV9zcGFuLCBrZXkpOwogICAgLy8gV2UgcHV0IHNvbWUgY29udmVuaWVuY2UgZ2V0dGVycy9zZXR0ZXJzCiAgICAvLyB1aV92YWx1ZSBmb3J3YXJkCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAidWlfdmFsdWUiLCB7CiAgICAgIGdldDogKCkgPT4gdWlfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgdWlfdmFsdWVfc3Bhbi52YWx1ZSA9IHZhbDsKICAgICAgfSwKICAgIH0pOwogICAgLy8gY29uZmlnX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJjb25maWdfdmFsdWUiLCB7CiAgICAgIGdldDogKCkgPT4gY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUsCiAgICAgIHNldDogKHZhbCkgPT4gewogICAgICAgIGNvbmZpZ192YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgfQp9CgovLyBUaGVzZSBvYmplY3RzIHdpbGwgY29udGFpbiB0aGUgZGVmYXVsdCB2YWx1ZQoKLy8gVGhpcyBjb2RlIHVwZGF0ZXMgdGhlIGltYWdlIG9wdGlvbnMgaW4gdGhlIFBMT1QgY29uZmlnIHdpdGggdGhlIHByb3ZpZGVkIG9uZXMKZnVuY3Rpb24gc2V0SW1hZ2VPcHRpb25zKG8pIHsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IG9ba2V5XTsKICB9Cn0KZnVuY3Rpb24gdW5zZXRJbWFnZU9wdGlvbnMoKSB7CiAgc2V0SW1hZ2VPcHRpb25zKHt9KTsKfQoKY29uc3Qgc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnNldCIpOwpjb25zdCB1bnNldF9idXR0b24gPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtc3Bhbi51bnNldCIpOwppZiAoZmlyc3RSdW4pIHsKICBzZXRfYnV0dG9uLm9uY2xpY2sgPSAoZSkgPT4gewogICAgZm9yIChjb25zdCBjb250YWluZXIgb2YgT2JqZWN0LnZhbHVlcyhjb25maWdfc3BhbnMpKSB7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBjb250YWluZXIudWlfdmFsdWU7CiAgICB9CiAgfTsKICB1bnNldF9idXR0b24ub25jbGljayA9IHVuc2V0SW1hZ2VPcHRpb25zOwp9CgovLyBXZSBhZGQgYSBmdW5jdGlvbiB0byBjaGVjayBpZiB0aGUgY2xpcGJvYXJkIGlzIHBvcHBlZCBvdXQKQ09OVEFJTkVSLmlzUG9wcGVkT3V0ID0gKCkgPT4gewogIHJldHVybiBDT05UQUlORVIuY2xhc3NMaXN0LmNvbnRhaW5zKCJwb3BwZWQtb3V0Iik7Cn07CgpDTElQQk9BUkRfSEVBREVSLm9ubW91c2Vkb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgaWYgKGV2ZW50LnRhcmdldC5tYXRjaGVzKCJzcGFuLmNsaXBib2FyZC12YWx1ZSIpKSB7CiAgICBjb25zb2xlLmxvZygiV2UgZG9uJ3QgbW92ZSEiKTsKICAgIHJldHVybjsKICB9CiAgY29uc3Qgc3RhcnQgPSB7CiAgICBsZWZ0OiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS5sZWZ0KSwKICAgIHRvcDogcGFyc2VGbG9hdChDT05UQUlORVIuc3R5bGUudG9wKSwKICAgIFg6IGV2ZW50LnBhZ2VYLAogICAgWTogZXZlbnQucGFnZVksCiAgfTsKICBmdW5jdGlvbiBtb3ZlQXQoZXZlbnQsIHN0YXJ0KSB7CiAgICBjb25zdCB0b3AgPSBldmVudC5wYWdlWSAtIHN0YXJ0LlkgKyBzdGFydC50b3AgKyAicHgiOwogICAgY29uc3QgbGVmdCA9IGV2ZW50LnBhZ2VYIC0gc3RhcnQuWCArIHN0YXJ0LmxlZnQgKyAicHgiOwogICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gbGVmdDsKICAgIENPTlRBSU5FUi5zdHlsZS5sZWZ0ID0gbGVmdDsKICAgIENPTlRBSU5FUi5zdHlsZS50b3AgPSB0b3A7CiAgfQoKICAvLyBtb3ZlIG91ciBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYmFsbCB1bmRlciB0aGUgcG9pbnRlcgogIG1vdmVBdChldmVudCwgc3RhcnQpOwogIGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGV2ZW50KSB7CiAgICBtb3ZlQXQoZXZlbnQsIHN0YXJ0KTsKICB9CgogIC8vIFdlIHVzZSB0aGlzIHRvIHJlbW92ZSB0aGUgbW91c2Vtb3ZlIHdoZW4gY2xpY2tpbmcgb3V0c2lkZSBvZiB0aGUgY29udGFpbmVyCiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgLy8gbW92ZSB0aGUgY29udGFpbmVyIG9uIG1vdXNlbW92ZQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIG9uTW91c2VNb3ZlLCB7CiAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLAogIH0pOwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAibW91c2Vkb3duIiwKICAgIChlKSA9PiB7CiAgICAgIGlmIChlLnRhcmdldC5jbG9zZXN0KCIucGx1dG9wbG90bHktY29udGFpbmVyIikgIT09IENPTlRBSU5FUikgewogICAgICAgIGNsZWFuVXAoKTsKICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9LAogICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0KICApOwoKICBmdW5jdGlvbiBjbGVhblVwKCkgewogICAgY29uc29sZS5sb2coImNsZWFuaW5nIHVwIHRoZSBwbG90IG1vdmUgbGlzdGVuZXIiKTsKICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gbnVsbDsKICB9CgogIC8vICgzKSBkcm9wIHRoZSBiYWxsLCByZW1vdmUgdW5uZWVkZWQgaGFuZGxlcnMKICBDTElQQk9BUkRfSEVBREVSLm9ubW91c2V1cCA9IGNsZWFuVXA7Cn07CgpmdW5jdGlvbiBzZW5kVG9DbGlwYm9hcmQoYmxvYikgewogIGlmICghbmF2aWdhdG9yLmNsaXBib2FyZCkgewogICAgYWxlcnQoCiAgICAgICJUaGUgQ2xpcGJvYXJkIEFQSSBkb2VzIG5vdCBzZWVtIHRvIGJlIGF2YWlsYWJsZSwgbWFrZSBzdXJlIHRoZSBQbHV0byBub3RlYm9vayBpcyBiZWluZyB1c2VkIGZyb20gZWl0aGVyIGxvY2FsaG9zdCBvciBhbiBodHRwcyBzb3VyY2UuIgogICAgKTsKICB9CiAgbmF2aWdhdG9yLmNsaXBib2FyZAogICAgLndyaXRlKFsKICAgICAgbmV3IENsaXBib2FyZEl0ZW0oewogICAgICAgIC8vIFRoZSBrZXkgaXMgZGV0ZXJtaW5lZCBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgYmxvYidzIHR5cGUuCiAgICAgICAgW2Jsb2IudHlwZV06IGJsb2IsCiAgICAgIH0pLAogICAgXSkKICAgIC50aGVuKAogICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgY29uc29sZS5sb2coIkFzeW5jOiBDb3B5aW5nIHRvIGNsaXBib2FyZCB3YXMgc3VjY2Vzc2Z1bCEiKTsKICAgICAgfSwKICAgICAgZnVuY3Rpb24gKGVycikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkFzeW5jOiBDb3VsZCBub3QgY29weSB0ZXh0OiAiLCBlcnIpOwogICAgICB9CiAgICApOwp9CgpmdW5jdGlvbiBjb3B5SW1hZ2VUb0NsaXBib2FyZCgpIHsKICAvLyBXZSBleHRyYWN0IHRoZSBpbWFnZSBvcHRpb25zIGZyb20gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMgKGlmIHRoZXkgZXhpc3QpCiAgY29uc3QgY29uZmlnID0ge307CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGxldCB2YWwgPQogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID8/CiAgICAgIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IGNvbnRhaW5lci51aV92YWx1ZSA6IHVuZGVmaW5lZCk7CiAgICAvLyBJZiB3ZSBoYXZlIHVuZGVmaW5lZCB3ZSBkb24ndCBjcmVhdGUgdGhlIGtleS4gV2UgYWxzbyBpZ25vcmUgZm9ybWF0IGJlY2F1c2UgdGhlIGNsaXBib2FyZCBvbmx5IHN1cHBvcnRzIHBuZy4KICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS50b0ltYWdlKFBMT1QsIGNvbmZpZykudGhlbihmdW5jdGlvbiAoZGF0YVVybCkgewogICAgZmV0Y2goZGF0YVVybCkKICAgICAgLnRoZW4oKHJlcykgPT4gcmVzLmJsb2IoKSkKICAgICAgLnRoZW4oKGJsb2IpID0+IHsKICAgICAgICBjb25zdCBwYXN0ZV9yZWNlaXZlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3Bhc3RlLXJlY2VpdmVyLnBsdXRvcGxvdGx5JykKICAgICAgICBpZiAocGFzdGVfcmVjZWl2ZXIpIHsKICAgICAgICAgIHBhc3RlX3JlY2VpdmVyLmF0dGFjaEltYWdlKGRhdGFVcmwsIENPTlRBSU5FUikKICAgICAgICB9CiAgICAgICAgc2VuZFRvQ2xpcGJvYXJkKGJsb2IpCiAgICAgIH0pOwogIH0pOwp9CgpmdW5jdGlvbiBzYXZlSW1hZ2VUb0ZpbGUoKSB7CiAgY29uc3QgY29uZmlnID0ge307CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGxldCB2YWwgPQogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID8/CiAgICAgIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IGNvbnRhaW5lci51aV92YWx1ZSA6IHVuZGVmaW5lZCk7CiAgICAvLyBJZiB3ZSBoYXZlIHVuZGVmaW5lZCB3ZSBkb24ndCBjcmVhdGUgdGhlIGtleS4KICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbmZpZ1trZXldID0gdmFsOwogIH0KICBQbG90bHkuZG93bmxvYWRJbWFnZShQTE9ULCBjb25maWcpOwp9CgpsZXQgY29udGFpbmVyX3JlY3QgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAsIHRvcDogMCwgbGVmdDogMCB9OwpmdW5jdGlvbiB1bnBvcF9jb250YWluZXIoY2wpIHsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZSgicG9wcGVkLW91dCIsIGZhbHNlKTsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgZmFsc2UpOwogIC8vIFdlIGZpeCB0aGUgaGVpZ2h0IGJhY2sgdG8gdGhlIHZhbHVlIGl0IGhhZCBiZWZvcmUgcG9wb3V0LCBhbHNvIHNldHRpbmcgdGhlIGZsYWcgdG8gc2lnbmFsIHRoYXQgdXBvbiBmaXJzdCByZXNpemUgd2UgcmVtb3ZlIHRoZSBmaXhlZCBpbmxpbmUtc3R5bGUKICBDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0ICsgInB4IjsKICByZW1vdmVfY29udGFpbmVyX3NpemUgPSB0cnVlOwogIC8vIFdlIHNldCB0aGUgb3RoZXIgZml4ZWQgaW5saW5lLXN0eWxlcyB0byBudWxsCiAgQ09OVEFJTkVSLnN0eWxlLndpZHRoID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9ICIiOwogIENPTlRBSU5FUi5zdHlsZS5sZWZ0ID0gIiI7CiAgLy8gV2UgYWxzbyByZW1vdmUgdGhlIENMSVBCT0FSRF9IRUFERVIKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLndpZHRoID0gIiI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gIiI7CiAgLy8gRmluYWxseSB3ZSByZW1vdmUgdGhlIGhpZGRlbiBjbGFzcyB0byB0aGUgaGVhZGVyCiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCB0cnVlKTsKICByZXR1cm47Cn0KZnVuY3Rpb24gcG9wb3V0X2NvbnRhaW5lcihvcHRzKSB7CiAgY29uc3QgY2wgPSBvcHRzPy5jbDsKICBjb25zdCB0YXJnZXRfY29udGFpbmVyX3NpemUgPSBvcHRzPy50YXJnZXRfY29udGFpbmVyX3NpemUgPz8ge307CiAgY29uc3QgdGFyZ2V0X3Bsb3Rfc2l6ZSA9IG9wdHM/LnRhcmdldF9wbG90X3NpemUgPz8ge307CiAgaWYgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICByZXR1cm4gdW5wb3BfY29udGFpbmVyKGNsKTsKICB9CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoY2wsIGNsID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IHRydWUpOwogIC8vIFdlIGV4dHJhY3QgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgY29udGFpbmVyLCBzYXZlIHRoZW0gYW5kIGZpeCB0aGVtCiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfSA9IENPTlRBSU5FUi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICBjb250YWluZXJfcmVjdCA9IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH07CiAgLy8gV2Ugc2F2ZSB0aGUgY3VycmVudCBwbG90IHNpemUgYmVmb3JlIHdlIHBvcCBhcyBpdCB3aWxsIGZpbGwgdGhlIHNjcmVlbgogIGNvbnN0IGN1cnJlbnRfcGxvdF9zaXplID0gewogICAgd2lkdGg6IFBMT1QuX2Z1bGxMYXlvdXQud2lkdGgsCiAgICBoZWlnaHQ6IFBMT1QuX2Z1bGxMYXlvdXQuaGVpZ2h0LAogIH07CiAgLy8gV2UgaGF2ZSB0byBzYXZlIHRoZSBwYWQgZGF0YSBiZWZvcmUgcG9wcGluZyBzbyB3ZSBjYW4gcmVzaXplIHByZWNpc2VseQogIGNvbnN0IHBhZCA9IHt9OwogIHBhZC51bnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZSgicG9wcGVkLW91dCIsIHRydWUpOwogIHBhZC5wb3BwZWQgPSBnZXRTaXplRGF0YSgpLmNvbnRhaW5lcl9wYWQ7CiAgLy8gV2UgZG8gdG9wIGFuZCBsZWZ0IGJhc2VkIG9uIHRoZSBjdXJyZW50IHJlY3QKICBmb3IgKGNvbnN0IGtleSBvZiBbInRvcCIsICJsZWZ0Il0pIHsKICAgIGNvbnN0IHN0YXJ0X3ZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNvbnRhaW5lcl9yZWN0W2tleV07CiAgICBsZXQgb2Zmc2V0ID0gMDsKICAgIGZvciAoY29uc3Qga2luZCBvZiBbInBhZGRpbmciLCAiYm9yZGVyIl0pIHsKICAgICAgb2Zmc2V0ICs9IHBhZC5wb3BwZWRba2luZF1ba2V5XSAtIHBhZC51bnBvcHBlZFtraW5kXVtrZXldOwogICAgfQogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSBzdGFydF92YWwgLSBvZmZzZXQgKyAicHgiOwogICAgaWYgKGtleSA9PT0gImxlZnQiKSB7CiAgICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGVba2V5XSA9IENPTlRBSU5FUi5zdHlsZVtrZXldOwogICAgfQogIH0KICAvLyBXZSBjb21wdXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGRlcGVuZGluZyBvbiBldmVudHVhbCBjb25maWcgZGF0YQogIGNvbnN0IGNzeiA9IGNvbXB1dGVDb250YWluZXJTaXplKHsKICAgIHdpZHRoOgogICAgICB0YXJnZXRfcGxvdF9zaXplLndpZHRoID8/CiAgICAgIGNvbmZpZ19zcGFucy53aWR0aC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6CiAgICAgIHRhcmdldF9wbG90X3NpemUuaGVpZ2h0ID8/CiAgICAgIGNvbmZpZ19zcGFucy5oZWlnaHQuY29uZmlnX3ZhbHVlID8/CiAgICAgIGN1cnJlbnRfcGxvdF9zaXplLmhlaWdodCwKICB9KTsKICBmb3IgKGNvbnN0IGtleSBvZiBbIndpZHRoIiwgImhlaWdodCJdKSB7CiAgICBjb25zdCB2YWwgPSB0YXJnZXRfY29udGFpbmVyX3NpemVba2V5XSA/PyBjc3pba2V5XTsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gdmFsICsgInB4IjsKICAgIGlmIChrZXkgPT09ICJ3aWR0aCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIENMSVBCT0FSRF9IRUFERVIuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgZmFsc2UpOwogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CgogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAibW91c2Vkb3duIiwKICAgIChlKSA9PiB7CiAgICAgIGlmIChlLnRhcmdldC5jbG9zZXN0KCIucGx1dG9wbG90bHktY29udGFpbmVyIikgIT09IENPTlRBSU5FUikgewogICAgICAgIHVucG9wX2NvbnRhaW5lcigpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7Cn0KCkNPTlRBSU5FUi5wb3BPdXQgPSBwb3BvdXRfY29udGFpbmVyOwoKZnVuY3Rpb24gRHVhbENsaWNrKHNpbmdsZV9mdW5jLCBkYmxfZnVuYykgewogIGxldCBuY2xpY2tzID0gMDsKICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHsKICAgIG5jbGlja3MgKz0gMTsKICAgIGlmIChuY2xpY2tzID4gMSkgewogICAgICBkYmxfZnVuYyguLi5hcmdzKTsKICAgICAgbmNsaWNrcyA9IDA7CiAgICB9IGVsc2UgewogICAgICBkZWxheSgzMDApLnRoZW4oKCkgPT4gewogICAgICAgIGlmIChuY2xpY2tzID09IDEpIHsKICAgICAgICAgIHNpbmdsZV9mdW5jKC4uLmFyZ3MpOwogICAgICAgIH0KICAgICAgICBuY2xpY2tzID0gMDsKICAgICAgfSk7CiAgICB9CiAgfTsKfQoKLy8gV2UgcmVtb3ZlIHRoZSBkZWZhdWx0IGRvd25sb2FkIGltYWdlIGJ1dHRvbgpwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSA9IF8udW5pb24oCiAgcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9SZW1vdmUsCiAgWyJ0b0ltYWdlIl0KKTsKLy8gV2UgYWRkIHRoZSBjdXN0b20gYnV0dG9uIHRvIHRoZSBtb2RlYmFyCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb0FkZCwKICBbCiAgICB7CiAgICAgIG5hbWU6ICJDb3B5IFBORyB0byBDbGlwYm9hcmQiLAogICAgICBpY29uOiB7CiAgICAgICAgaGVpZ2h0OiA1MjAsCiAgICAgICAgd2lkdGg6IDUyMCwKICAgICAgICBwYXRoOiAiTTI4MCA2NGg0MGMzNS4zIDAgNjQgMjguNyA2NCA2NFY0NDhjMCAzNS4zLTI4LjcgNjQtNjQgNjRINjRjLTM1LjMgMC02NC0yOC43LTY0LTY0VjEyOEMwIDkyLjcgMjguNyA2NCA2NCA2NGg0MCA5LjZDMTIxIDI3LjUgMTUzLjMgMCAxOTIgMHM3MSAyNy41IDc4LjQgNjRIMjgwek02NCAxMTJjLTguOCAwLTE2IDcuMi0xNiAxNlY0NDhjMCA4LjggNy4yIDE2IDE2IDE2SDMyMGM4LjggMCAxNi03LjIgMTYtMTZWMTI4YzAtOC44LTcuMi0xNi0xNi0xNkgzMDR2MjRjMCAxMy4zLTEwLjcgMjQtMjQgMjRIMTkyIDEwNGMtMTMuMyAwLTI0LTEwLjctMjQtMjRWMTEySDY0em0xMjgtOGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6IiwKICAgICAgfSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKGNvcHlJbWFnZVRvQ2xpcGJvYXJkLCAoKSA9PiB7CiAgICAgICAgcG9wb3V0X2NvbnRhaW5lcigpOwogICAgICB9KSwKICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICJEb3dubG9hZCBJbWFnZSIsCiAgICAgIGljb246IFBsb3RseS5JY29ucy5jYW1lcmEsCiAgICAgIGRpcmVjdGlvbjogInVwIiwKICAgICAgY2xpY2s6IER1YWxDbGljayhzYXZlSW1hZ2VUb0ZpbGUsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKHsgY2w6ICJmaWxlc2F2ZSIgfSk7CiAgICAgIH0pLAogICAgfSwKICBdCik7CgpmdW5jdGlvbiBnZXRPZmZzZXREYXRhKGVsKSB7CiAgbGV0IGNzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwsIG51bGwpOwogIGNvbnN0IG9kYXRhID0gewogICAgcGFkZGluZzogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdMZWZ0KSwKICAgICAgcmlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1JpZ2h0KSwKICAgICAgdG9wOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdUb3ApLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MucGFkZGluZ0JvdHRvbSksCiAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdMZWZ0KSArIHBhcnNlRmxvYXQoY3MucGFkZGluZ1JpZ2h0KSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdUb3ApICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgIH0sCiAgICBib3JkZXI6IHsKICAgICAgbGVmdDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgdG9wOiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSwKICAgICAgYm90dG9tOiBwYXJzZUZsb2F0KGNzLmJvcmRlckJvdHRvbVdpZHRoKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MuYm9yZGVyTGVmdFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyUmlnaHRXaWR0aCksCiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChjcy5ib3JkZXJUb3BXaWR0aCkgKyBwYXJzZUZsb2F0KGNzLmJvcmRlckJvdHRvbVdpZHRoKSwKICAgIH0KICB9OwogIGlmIChlbCA9PT0gUExPVCkgewogICAgLy8gRm9yIHRoZSBQTE9UIHdlIGFsc28gd2FudCB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgb2Zmc2V0CiAgICBvZGF0YS5vZmZzZXQgPSB7CiAgICAgIHRvcDogUExPVC5vZmZzZXRQYXJlbnQgPT0gQ09OVEFJTkVSID8gUExPVC5vZmZzZXRUb3AgOiAwLAogICAgICBsZWZ0OiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldExlZnQgOiAwLAogICAgfQogIH0KICByZXR1cm4gb2RhdGE7Cn0KZnVuY3Rpb24gZ2V0U2l6ZURhdGEoKSB7CiAgY29uc3QgZGF0YSA9IHsKICAgIHBsb3RfcGFkOiBnZXRPZmZzZXREYXRhKFBMT1QpLAogICAgcGxvdF9yZWN0OiBQTE9ULmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogICAgY29udGFpbmVyX3BhZDogZ2V0T2Zmc2V0RGF0YShDT05UQUlORVIpLAogICAgY29udGFpbmVyX3JlY3Q6IENPTlRBSU5FUi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICB9OwogIHJldHVybiBkYXRhOwp9CmZ1bmN0aW9uIGNvbXB1dGVDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICBjb25zdCBjb21wdXRlZF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICBjb25zdCBvZmZzZXRzID0gY29tcHV0ZWRfc2l6ZS5vZmZzZXRzOwoKICBjb25zdCBwbG90X2RhdGEgPSB7CiAgICB3aWR0aDogd2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCwKICAgIGhlaWdodDogaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH07CgogIHJldHVybiB7CiAgICB3aWR0aDogKHdpZHRoID8/IGNvbXB1dGVkX3NpemUud2lkdGgpICsgb2Zmc2V0cy53aWR0aCwKICAgIGhlaWdodDogKGhlaWdodCA/PyBjb21wdXRlZF9zaXplLmhlaWdodCkgKyBvZmZzZXRzLmhlaWdodCwKICAgIG5vQ2hhbmdlOiB3aWR0aCA9PSBjb21wdXRlZF9zaXplLndpZHRoICYmIGhlaWdodCA9PSBjb21wdXRlZF9zaXplLmhlaWdodCwKICB9Cn0KCi8vIFRoaXMgZnVuY3Rpb24gd2lsbCBjaGFuZ2UgdGhlIGNvbnRhaW5lciBzaXplIHNvIHRoYXQgdGhlIHJlc3VsdGluZyBwbG90IHdpbGwgYmUgbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIHNwZWNzCmZ1bmN0aW9uIGNoYW5nZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGlmICghQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIGNvbnNvbGUubG9nKCJUcmllZCB0byBjaGFuZ2UgY29udGFpbmVyIHNpemUgd2hlbiBub3QgcG9wcGVkLCBpZ25vcmluZyIpOwogICAgcmV0dXJuOwogIH0KCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhKTsKCiAgaWYgKGNzei5ub0NoYW5nZSkgewogICAgY29uc29sZS5sb2coIlNpemUgaXMgdGhlIHNhbWUgYXMgY3VycmVudCwgaWdub3JpbmciKTsKICAgIHJldHVybgogIH0KICAvLyBXZSBhcmUgbm93IGdvaW5nIHRvIHNldCBoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBjb250YWluZXIKICBmb3IgKGNvbnN0IGtleSBvZiBbIndpZHRoIiwgImhlaWdodCJdKSB7CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IGNzeltrZXldICsgInB4IjsKICB9Cn0KLy8gV2Ugbm93IGNyZWF0ZSB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIHVwZGF0ZSB0aGUgcGxvdCBiYXNlZCBvbiB0aGUgdmFsdWVzIHNwZWNpZmllZApmdW5jdGlvbiB1cGRhdGVGcm9tSGVhZGVyKCkgewogIGNvbnN0IGhlYWRlcl9kYXRhID0gewogICAgaGVpZ2h0OiBjb25maWdfc3BhbnMuaGVpZ2h0LnVpX3ZhbHVlLAogICAgd2lkdGg6IGNvbmZpZ19zcGFucy53aWR0aC51aV92YWx1ZSwKICB9OwogIGNoYW5nZUNvbnRhaW5lclNpemUoaGVhZGVyX2RhdGEpOwp9Ci8vIFdlIGFzc2lnbiB0aGlzIGZ1bmN0aW9uIHRvIHRoZSBvbmJsdXIgZXZlbnQgb2Ygd2lkdGggYW5kIGhlaWdodAppZiAoZmlyc3RSdW4pIHsKICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGNvbnRhaW5lci51aV9zcGFuLm9uYmx1ciA9IChlKSA9PiB7CiAgICAgIGNvbnRhaW5lci51aV92YWx1ZSA9IGNvbnRhaW5lci51aV9zcGFuLnRleHRDb250ZW50OwogICAgICB1cGRhdGVGcm9tSGVhZGVyKCk7CiAgICB9OwogIH0KfQovLyBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBwbG90IHNpemUgdG8gdXNlIGZvciByZWxheW91dCBhcyBhIGZ1bmN0aW9uIG9mIHRoZSBjb250YWluZXIgc2l6ZQpmdW5jdGlvbiBjb21wdXRlUGxvdFNpemUoZGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICAvLyBSZW1vdmUgUGFkZGluZwogIGNvbnN0IHsgY29udGFpbmVyX3BhZCwgcGxvdF9wYWQsIGNvbnRhaW5lcl9yZWN0IH0gPSBkYXRhOwogIGNvbnN0IG9mZnNldHMgPSB7CiAgICB3aWR0aDoKICAgICAgcGxvdF9wYWQucGFkZGluZy53aWR0aCArCiAgICAgIHBsb3RfcGFkLmJvcmRlci53aWR0aCArCiAgICAgIHBsb3RfcGFkLm9mZnNldC5sZWZ0ICsKICAgICAgY29udGFpbmVyX3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgY29udGFpbmVyX3BhZC5ib3JkZXIud2lkdGgsCiAgICBoZWlnaHQ6CiAgICAgIHBsb3RfcGFkLnBhZGRpbmcuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLmhlaWdodCArCiAgICAgIHBsb3RfcGFkLm9mZnNldC50b3AgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcuaGVpZ2h0ICsKICAgICAgY29udGFpbmVyX3BhZC5ib3JkZXIuaGVpZ2h0LAogIH07CiAgY29uc3Qgc3ogPSB7CiAgICB3aWR0aDogTWF0aC5yb3VuZChjb250YWluZXJfcmVjdC53aWR0aCAtIG9mZnNldHMud2lkdGgpLAogICAgaGVpZ2h0OiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LmhlaWdodCAtIG9mZnNldHMuaGVpZ2h0KSwKICAgIG9mZnNldHMsCiAgfTsKICByZXR1cm4gc3o7Cn0KCi8vIENyZWF0ZSB0aGUgcmVzaXplT2JzZXJ2ZXIgdG8gbWFrZSB0aGUgcGxvdCBldmVuIG1vcmUgcmVzcG9uc2l2ZSEgOm1hZ2ljOgpjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4gewogIGNvbnN0IHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKTsKICBjb25zdCB7Y29udGFpbmVyX3JlY3QsIGNvbnRhaW5lcl9wYWR9ID0gc2l6ZURhdGE7CiAgbGV0IHBsb3Rfc2l6ZSA9IGNvbXB1dGVQbG90U2l6ZShzaXplRGF0YSk7CiAgLy8gV2Ugc2F2ZSB0aGUgaGVpZ2h0IGluIHRoZSBQTE9UIG9iamVjdAogIFBMT1QuY29udGFpbmVyX2hlaWdodCA9IGNvbnRhaW5lcl9yZWN0LmhlaWdodDsKICAvLyBXZSBkZWFsIHdpdGggc29tZSBzdHVmZiBpZiB0aGUgY29udGFpbmVyIGlzIHBvcHBwZWQKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLndpZHRoID0gY29udGFpbmVyX3JlY3Qud2lkdGggKyAicHgiOwogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9IGNvbnRhaW5lcl9yZWN0LmxlZnQgKyAicHgiOwogIGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUgPSBwbG90X3NpemUuaGVpZ2h0OwogIGNvbmZpZ19zcGFucy53aWR0aC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS53aWR0aDsKICAvKiAKCQlUaGUgYWRkaXRpb24gb2YgdGhlIGludmFsaWQgYXJndW1lbnQgYHBsdXRvcmVzaXplYCBzZWVtcyB0byBmaXggdGhlIHByb2JsZW0gd2l0aCBjYWxsaW5nIGByZWxheW91dGAgc2ltcGx5IHdpdGggYHthdXRvc2l6ZTogdHJ1ZX1gIGFzIHVwZGF0ZSBicmVha2luZyBtb3VzZSByZWxheW91dCBldmVudHMgdHJhY2tpbmcuIAoJCVNlZSBodHRwczovL2dpdGh1Yi5jb20vcGxvdGx5L3Bsb3RseS5qcy9pc3N1ZXMvNjE1NiBmb3IgZGV0YWlscwoJCSovCiAgbGV0IGNvbmZpZyA9IHsKICAgIC8vIElmIHRoaXMgaXMgcG9wcGVkIG91dCwgd2UgaWdub3JlIHRoZSBvcmlnaW5hbCB3aWR0aC9oZWlnaHQKICAgIHdpZHRoOiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyB1bmRlZmluZWQgOiBvcmlnaW5hbF93aWR0aCkgPz8gcGxvdF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyB1bmRlZmluZWQgOiBvcmlnaW5hbF9oZWlnaHQpID8/IHBsb3Rfc2l6ZS5oZWlnaHQsCiAgICBwbHV0b3Jlc2l6ZTogdHJ1ZSwKICB9OwogIFBsb3RseS5yZWxheW91dChQTE9ULCBjb25maWcpLnRoZW4oKCkgPT4gewogICAgaWYgKHJlbW92ZV9jb250YWluZXJfc2l6ZSAmJiAhQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgdGhlIGZpcnN0IHJlc2l6ZSB1cG9uIHBsb3QgY3JlYXRpb24gdG8gYWxyZWFkeSBiZSB3aXRob3V0IGEgZml4ZWQgaGVpZ2h0CiAgICAgIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSAiIjsKICAgICAgQ09OVEFJTkVSLnN0eWxlLndpZHRoID0gIiI7CiAgICAgIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IGZhbHNlOwogICAgfQogIH0pOwp9KTsKCnJlc2l6ZU9ic2VydmVyLm9ic2VydmUoQ09OVEFJTkVSKTsKCgpQbG90bHkucmVhY3QoUExPVCwgcGxvdF9vYmopLnRoZW4oKCkgPT4gewoJLy8gQXNzaWduIHRoZSBQbG90bHkgZXZlbnQgbGlzdGVuZXJzCglmb3IgKGNvbnN0IFtrZXksIGxpc3RlbmVyX3ZlY10gb2YgT2JqZWN0LmVudHJpZXMocGxvdGx5X2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULm9uKGtleSwgbGlzdGVuZXIpCgkJfQoJfQoJLy8gQXNzaWduIHRoZSBKUyBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhqc19saXN0ZW5lcnMpKSB7CgkJZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcl92ZWMpIHsKCQkJUExPVC5hZGRFdmVudExpc3RlbmVyKGtleSwgbGlzdGVuZXIsIHsKCQkJCXNpZ25hbDogY29udHJvbGxlci5zaWduYWwKCQkJfSkKCQl9Cgl9Cn0KKQoKCmludmFsaWRhdGlvbi50aGVuKCgpID0+IHsKCS8vIFJlbW92ZSBhbGwgcGxvdGx5IGxpc3RlbmVycwoJUExPVC5yZW1vdmVBbGxMaXN0ZW5lcnMoKQoJLy8gUmVtb3ZlIGFsbCBKUyBsaXN0ZW5lcnMKCWNvbnRyb2xsZXIuYWJvcnQoKQoJLy8gUmVtb3ZlIHRoZSByZXNpemVPYnNlcnZlcgoJcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpCn0pCgoKCgkJcmV0dXJuIENPTlRBSU5FUgoJPC9zY3JpcHQ+CqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b+i6Wnx5bBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkMWE2MmFlNzEtNThkYi00OWVhLWFlNmEtOWFlYTY2MTQ1OTYzuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOO++RZbVwdWJsaXNoZWRfb2JqZWN0X2tleXOR2TUwYmNkOGU5MC04MTgxLTExZWYtMjRjMC1mMTRmNmE0ZDMwODQvMWZhYjA3MWZkMTBhM2FlM7hkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SRmNTdhMmI2Yy1lYjRjLTQ1YmQtODA1OC00YTYwYjAzODkyNWSKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52WE8ZGl2IGNsYXNzPSJtYXJrZG93biI+PHVsPgo8bGk+PHA+Q2FyZGlhYyBwaGFudG9tICYjNDA7c2hvdy9oaWRlIGNvZGUmIzQxOzwvcD4KPC9saT4KPC91bD4KPC9kaXY+pG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv6LfT/y5sHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SRmNTdhMmI2Yy1lYjRjLTQ1YmQtODA1OC00YTYwYjAzODkyNWS5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4AMzxktXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkOGRkNzA0YTQtYmY1MC00ZGRjLWE4MzItZDA3NGJkNTJhZDAxiqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedm5PGRpdiBjbGFzcz0ibWFya2Rvd24iPjxwPlRocmVlIGhlYXJ0YmVhdHMgd2VyZSBjb25zaWRlcmVkIHRvIGFjaGlldmUgc3RlYWR5LXN0YXRlIGFuZCB0aGUgZm91cnRoIGhlYXJ0YmVhdCB3YXMgdXNlZCB0byBtZWFzdXJlIHRoZSBtYWduZXRpemF0aW9uIHJlc3VsdHMgaW4gdGhlIG5leHQgc2VjdGlvbnMuPC9wPgo8L2Rpdj6kbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/oqsFsJKwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJDhkZDcwNGE0LWJmNTAtNGRkYy1hODMyLWQwNzRiZDUyYWQwMblkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgADYcG1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQ2Yjg3MDQ0My03YmU1LTQyODctYjk1Ny1jYTVjMTRlZGE4OWOKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52ag8ZGl2IGNsYXNzPSJtYXJrZG93biI+PHVsPgo8bGk+PHA+U2VxdWVuY2UgYnVpbGRpbmcgYmxvY2tzOiA8Y29kZT5UMnByZXA8L2NvZGU+LCA8Y29kZT5GYXRTYXQ8L2NvZGU+LCA8Y29kZT5iU1NGUDwvY29kZT4gJiM0MDtzaG93L2hpZGUgY29kZSYjNDE7PC9wPgo8L2xpPgo8L3VsPgo8L2Rpdj6kbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/ot9NOhmwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJDZiODcwNDQzLTdiZTUtNDI4Ny1iOTU3LWNhNWMxNGVkYTg5Y7lkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgBxVV21cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQ3ZGVhZGQ1OC1iMjAyLTQ1MDgtYjRjNy02ODZmNzQyY2I3MTOKpnF1ZXVlZMKkbG9nc5GIpGxpbmX/o21zZ5LZWE9TIHg4Nl82NC1saW51eC1nbnUKSnVsaWEgMS4xMC41CktvbWFNUklQbG90cyAwLjguMwpLb21hTVJJQ29yZSAwLjguMwpLb21hTVJJQmFzZSAwLjguNAqqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3ZGVhZGQ1OC1iMjAyLTQ1MDgtYjRjNy02ODZmNzQyY2I3MTOma3dhcmdzkKJpZLRQbHV0b1J1bm5lcl9kMWFjYjgxZaRmaWxl2VIvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1BsdXRvL1J2ZUdIL3NyYy9ydW5uZXIvUGx1dG9SdW5uZXIvc3JjL1BsdXRvUnVubmVyLmpspWdyb3Vwq1BsdXRvUnVubmVypWxldmVsrkxvZ0xldmVsKC01NTUpp3J1bm5pbmfCpm91dHB1dIakYm9keaCkbWltZap0ZXh0L3BsYWlurHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv6LcpnEZsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQ3ZGVhZGQ1OC1iMjAyLTQ1MDgtYjRjNy02ODZmNzQyY2I3MTO5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4SJ2RdtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwrFjZWxsX2RlcGVuZGVuY2llc94AJNkkZDAzNzdmOWEtNjgwZC00NTAxLTkwY2EtOWVhM2FiNjgxZGI0hLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkZDAzNzdmOWEtNjgwZC00NTAxLTkwY2EtOWVhM2FiNjgxZGI0tGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCp0BtZF9zdHKQqGdldGluZGV4kNkkZmM1ODY0MGItYzQ0Yy00YzI1LWE0ZmQtNWEwZTE3ZDdiZWNkhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkZmM1ODY0MGItYzQ0Yy00YzI1LWE0ZmQtNWEwZTE3ZDdiZWNktGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCp0BtZF9zdHKQqGdldGluZGV4kNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2hLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2tGRvd25zdHJlYW1fY2VsbHNfbWFwg6RtYWcxkdkkZjczMDgyZmYtYTZkMy00MWY4LTg3OTYtNDExNGZhODlkMmJio1JSc5HZJGY3MzA4MmZmLWE2ZDMtNDFmOC04Nzk2LTQxMTRmYTg5ZDJiYqNGQXOR2SRmNzMwODJmZi1hNmQzLTQxZjgtODc5Ni00MTE0ZmE4OWQyYmKydXBzdHJlYW1fY2VsbHNfbWFw3gA4oT6Qo3N5c5HZJDllMzk3NDI2LWI2MGItNGI5OC1iZThiLWY3ZjEyODYyMWM0NKZpc2xlc3OQ2SRTdXBwcmVzc29yLkJhc2UuQ29yZUxvZ2dpbmcuTG9nU3RhdGWQtFN1cHByZXNzb3IuQ29yZS5ldmFskKpTdXBwcmVzc29ykdkkNzBkYmMyYmQtOGI5My00NzFkLTgzNDAtMDRkOThhMDA4Y2E2r1N1cHByZXNzb3IuRXhwcpCvY2FyZGlhY19waGFudG9tkdkkZjU3YTJiNmMtZWI0Yy00NWJkLTgwNTgtNGE2MGIwMzg5MjVkpmxlbmd0aJCpQmFzZS5UYXNrkKE8kKpzaW1fcGFyYW1zkdkkZDA1ZGNiYTctMmY0Mi00N2JmLWExNzItNjEyM2QwMTEzYjNmqUJhc2UucHV0IZCqQ29tcGxleEY2NJCnbm90aGluZ5ChL5CxQmFzZS5pbnZva2VsYXRlc3SQsVN1cHByZXNzb3IudHlwZW9mkNknQmFzZS5Db3JlTG9nZ2luZy5CYXNlLmZpeHVwX3N0ZGxpYl9wYXRokLRCYXNlLkNvcmVMb2dnaW5nLj09PZC5U3VwcHJlc3Nvci5jdXJyZW50X2xvZ2dlcpCvU3VwcHJlc3Nvci5yZWFkkKV6ZXJvc5C6I19fX3RoaXNfcGx1dG9fbW9kdWxlX25hbWWQoj0+kKRCYXNlkK1TdXBwcmVzc29yLmlukLBTdXBwcmVzc29yLmNsb3NlkKlAc3VwcHJlc3OQtEJhc2UuQ29yZUxvZ2dpbmcuaXNhkKEtkKErkKEqkLNCYXNlLkNvcmVMb2dnaW5nLj49kKROaXNvkdkkZjBhODFjOWYtNTYxNi00NjYzLTk0OGYtYTQwODRlMTcxOWFmqUBwcm9ncmVzc5C6U3VwcHJlc3Nvci5yZWRpcmVjdF9zdGRvdXSQpERpY3SQq2ltX3NlZ21lbnRzkdkkY2I2NTkxMTgtOWYyMi00M2MzLTgwMWQtNDkyNDFkZWU0ZGY2qnNlcV9wYXJhbXOR2SRjYjY1OTExOC05ZjIyLTQzYzMtODAxZC00OTI0MWRlZTRkZjayQmFzZS5Db3JlTG9nZ2luZy4hkK1TdXBwcmVzc29yLj09kLhCYXNlLkNvcmVMb2dnaW5nLmNvbnZlcnSQulN1cHByZXNzb3IucmVkaXJlY3Rfc3RkZXJykKVtZXJnZZC9QmFzZS5Db3JlTG9nZ2luZy5pbnZva2VsYXRlc3SQoTqQpENNUkGR2SQ3ODkwZjgxZS1jYjE1LTQ4ZDItYTgwYy05ZDczZjk1MTYwNTaoc2ltdWxhdGWQo2VuZJC4U3VwcHJlc3Nvci5wcm9wZXJ0eW5hbWVzkK1CYXNlLnNjaGVkdWxlkKlCbG9jaERpY3SQqWVudW1lcmF0ZZCxIyNwcm9ncmVzc19pZCMyMjWQpWNjYWxskNkkOTIxOTRmY2ItNTgyYS00OWNlLWFhZDctMjBiMDE0NWQ0MGQzhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkOTIxOTRmY2ItNTgyYS00OWNlLWFhZDctMjBiMDE0NWQ0MGQztGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCp0BtZF9zdHKQqGdldGluZGV4kNkkZjQ5NjU1Y2MtNDYwZS00OTgxLTkyZWEtZGZkNjE0NzMwOGJmhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkZjQ5NjU1Y2MtNDYwZS00OTgxLTkyZWEtZGZkNjE0NzMwOGJmtGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCp0BtZF9zdHKQqGdldGluZGV4kNkkM2Q3ZTdkMjAtYTc3YS00OGIzLWFkMmUtNmI2MjEyMjdiZTE2hLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkM2Q3ZTdkMjAtYTc3YS00OGIzLWFkMmUtNmI2MjEyMjdiZTE2tGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCp0BtZF9zdHKQqGdldGluZGV4kNkkYTk5YzBjNDctMWI3MC00MzYyLWEyZjYtYTdlMzI1OTYwNmZhhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkYTk5YzBjNDctMWI3MC00MzYyLWEyZjYtYTdlMzI1OTYwNmZhtGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCp0BtZF9zdHKQqGdldGluZGV4kNkkYTE1ZDZiNjQtZjhlZS00ZWU0LTgxMmMtZDQ5Y2Y1ZWE3ODRkhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkYTE1ZDZiNjQtZjhlZS00ZWU0LTgxMmMtZDQ5Y2Y1ZWE3ODRktGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCp0BtZF9zdHKQqGdldGluZGV4kNkkZjBhODFjOWYtNTYxNi00NjYzLTk0OGYtYTQwODRlMTcxOWFmhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkZjBhODFjOWYtNTYxNi00NjYzLTk0OGYtYTQwODRlMTcxOWFmtGRvd25zdHJlYW1fY2VsbHNfbWFwhahmYXRfZnJlcZPZJDZiODcwNDQzLTdiZTUtNDI4Ny1iOTU3LWNhNWMxNGVkYTg5Y9kkNzg5MGY4MWUtY2IxNS00OGQyLWE4MGMtOWQ3M2Y5NTE2MDU22SRmNTdhMmI2Yy1lYjRjLTQ1YmQtODA1OC00YTYwYjAzODkyNWSnZmF0X3BwbZCkTmlzb5XZJGY1N2EyYjZjLWViNGMtNDViZC04MDU4LTRhNjBiMDM4OTI1ZNkkZDk3MTViYzEtNDljZC00ZGY4LThkYmYtYzA2ZGU0MmFkNTUw2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjbZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYdkkOGRjMTExNzUtZWJjOC00MDdhLWFiMGItNmQ1NDNmODQ5YTcyqc6UeF92b3hlbJCiZHiR2SRmNTdhMmI2Yy1lYjRjLTQ1YmQtODA1OC00YTYwYjAzODkyNWSydXBzdHJlYW1fY2VsbHNfbWFwiadAbWRfc3RykKLOs5ChLZClcmFuZ2WQoS+Qo3N5c5HZJDllMzk3NDI2LWI2MGItNGI5OC1iZThiLWY3ZjEyODYyMWM0NKVBcnJheZChKpCoZ2V0aW5kZXiQ2SRkOTcxNWJjMS00OWNkLTRkZjgtOGRiZi1jMDZkZTQyYWQ1NTCEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SRkOTcxNWJjMS00OWNkLTRkZjgtOGRiZi1jMDZkZTQyYWQ1NTC0ZG93bnN0cmVhbV9jZWxsc19tYXCHo014eZChdJCkbGFic5CicDCQok16kKRjb2xzkKpzcGluX2dyb3VwkLJ1cHN0cmVhbV9jZWxsc19tYXDeABajc3VtkKlyZWxheW91dCGQp2Fkam9pbnSQpHJlYWyQpmxlbmd0aJCpZWFjaGluZGV4kKdzY2F0dGVykKEvkLFkdW1teV9oZWFydF9iZWF0c5HZJGNiNjU5MTE4LTlmMjItNDNjMy04MDFkLTQ5MjQxZGVlNGRmNqRjb25qkKNhYnOQqmFkZF90cmFjZSGQo3NlcZHZJDM3ZjdmZDdmLTVjYjEtNDhiNS1iODc3LWIyYmMyM2ExZTdkZKE6kK1tYWtlX3N1YnBsb3RzkKJSUpHZJGNiNjU5MTE4LTlmMjItNDNjMy04MDFkLTQ5MjQxZGVlNGRmNqErkKEqkKROaXNvkdkkZjBhODFjOWYtNTYxNi00NjYzLTk0OGYtYTQwODRlMTcxOWFmrW1hZ25ldGl6YXRpb26R2SQzN2Y3ZmQ3Zi01Y2IxLTQ4YjUtYjg3Ny1iMmJjMjNhMWU3ZGTZIktvbWFNUklDb3JlLmdldF9hZGNfc2FtcGxpbmdfdGltZXOQq0tvbWFNUklDb3JlkdkkMGI3YTQwNWUtYmJiNS0xMWVlLTA1Y2EtNGIxYzg1NjczOThk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGG0ZG93bnN0cmVhbV9jZWxsc19tYXCDpM6UZnOR2SQ0NGEzMTA1Ny03YjM0LTRjODAtYTI3My02NjIxYzA3NzNkYzekbWFnMpHZJDQ0YTMxMDU3LTdiMzQtNGM4MC1hMjczLTY2MjFjMDc3M2RjN6RGRkFzkdkkNDRhMzEwNTctN2IzNC00YzgwLWEyNzMtNjYyMWMwNzczZGM3snVwc3RyZWFtX2NlbGxzX21hcN4AOKE+kKNzeXOR2SQ5ZTM5NzQyNi1iNjBiLTRiOTgtYmU4Yi1mN2YxMjg2MjFjNDSmaXNsZXNzkNkkU3VwcHJlc3Nvci5CYXNlLkNvcmVMb2dnaW5nLkxvZ1N0YXRlkLRTdXBwcmVzc29yLkNvcmUuZXZhbJCqU3VwcHJlc3NvcpHZJDcwZGJjMmJkLThiOTMtNDcxZC04MzQwLTA0ZDk4YTAwOGNhNq9TdXBwcmVzc29yLkV4cHKQr2NhcmRpYWNfcGhhbnRvbZHZJGY1N2EyYjZjLWViNGMtNDViZC04MDU4LTRhNjBiMDM4OTI1ZKZsZW5ndGiQqUJhc2UuVGFza5ChPJCqc2ltX3BhcmFtc5HZJGQwNWRjYmE3LTJmNDItNDdiZi1hMTcyLTYxMjNkMDExM2IzZqlCYXNlLnB1dCGQqkNvbXBsZXhGNjSQp25vdGhpbmeQ2SdCYXNlLkNvcmVMb2dnaW5nLkJhc2UuZml4dXBfc3RkbGliX3BhdGiQsUJhc2UuaW52b2tlbGF0ZXN0kLFTdXBwcmVzc29yLnR5cGVvZpC0QmFzZS5Db3JlTG9nZ2luZy49PT2QuVN1cHByZXNzb3IuY3VycmVudF9sb2dnZXKQr1N1cHByZXNzb3IucmVhZJClemVyb3OQuiNfX190aGlzX3BsdXRvX21vZHVsZV9uYW1lkKI9PpCkQmFzZZCizrOQsFN1cHByZXNzb3IuY2xvc2WQqUBzdXBwcmVzc5C0QmFzZS5Db3JlTG9nZ2luZy5pc2GQrVN1cHByZXNzb3IuaW6QoS2QoSuQoSqQs0Jhc2UuQ29yZUxvZ2dpbmcuPj2QpE5pc2+R2SRmMGE4MWM5Zi01NjE2LTQ2NjMtOTQ4Zi1hNDA4NGUxNzE5YWapQHByb2dyZXNzkLpTdXBwcmVzc29yLnJlZGlyZWN0X3N0ZG91dJCkRGljdJCraW1fc2VnbWVudHOR2SRjYjY1OTExOC05ZjIyLTQzYzMtODAxZC00OTI0MWRlZTRkZjaqc2VxX3BhcmFtc5HZJGNiNjU5MTE4LTlmMjItNDNjMy04MDFkLTQ5MjQxZGVlNGRmNrJCYXNlLkNvcmVMb2dnaW5nLiGQrVN1cHByZXNzb3IuPT2QuEJhc2UuQ29yZUxvZ2dpbmcuY29udmVydJC6U3VwcHJlc3Nvci5yZWRpcmVjdF9zdGRlcnKQpW1lcmdlkL1CYXNlLkNvcmVMb2dnaW5nLmludm9rZWxhdGVzdJChOpCkQ01SQZHZJDc4OTBmODFlLWNiMTUtNDhkMi1hODBjLTlkNzNmOTUxNjA1NqhzaW11bGF0ZZCjZW5kkLhTdXBwcmVzc29yLnByb3BlcnR5bmFtZXOQrUJhc2Uuc2NoZWR1bGWQqUJsb2NoRGljdJCpZW51bWVyYXRlkLEjI3Byb2dyZXNzX2lkIzIyNZClY2NhbGyQ2SQ5ZTM5NzQyNi1iNjBiLTRiOTgtYmU4Yi1mN2YxMjg2MjFjNDSEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQ5ZTM5NzQyNi1iNjBiLTRiOTgtYmU4Yi1mN2YxMjg2MjFjNDS0ZG93bnN0cmVhbV9jZWxsc19tYXCBo3N5c5TZJGYwYTgxYzlmLTU2MTYtNDY2My05NDhmLWE0MDg0ZTE3MTlhZtkkMzdmN2ZkN2YtNWNiMS00OGI1LWI4NzctYjJiYzIzYTFlN2Rk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjbZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYbJ1cHN0cmVhbV9jZWxsc19tYXCBp1NjYW5uZXKQ2SRkMDVkY2JhNy0yZjQyLTQ3YmYtYTE3Mi02MTIzZDAxMTNiM2aEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SRkMDVkY2JhNy0yZjQyLTQ3YmYtYTE3Mi02MTIzZDAxMTNiM2a0ZG93bnN0cmVhbV9jZWxsc19tYXCBqnNpbV9wYXJhbXOT2SQzN2Y3ZmQ3Zi01Y2IxLTQ4YjUtYjg3Ny1iMmJjMjNhMWU3ZGTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNtkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhsnVwc3RyZWFtX2NlbGxzX21hcIakRGljdJCjVHJmkdkkY2I2NTkxMTgtOWYyMi00M2MzLTgwMWQtNDkyNDFkZWU0ZGY2qUJsb2NoRGljdJCmU3RyaW5nkKI9PpCjQW55kNkkMzlmNDQwMjUtMjk3NC00YzRjLWIwYzItZTIxMzk5YmJkYjFmhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkMzlmNDQwMjUtMjk3NC00YzRjLWIwYzItZTIxMzk5YmJkYjFmtGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCp0BtZF9zdHKQqGdldGluZGV4kNkkMzdmN2ZkN2YtNWNiMS00OGI1LWI4NzctYjJiYzIzYTFlN2RkhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkMzdmN2ZkN2YtNWNiMS00OGI1LWI4NzctYjJiYzIzYTFlN2RktGRvd25zdHJlYW1fY2VsbHNfbWFwj6sjNzU2I291dF93cpCjc2VxktkkMGI2YzFmNzItYjA0MC00ODNjLTk2OWItODhiZmUwOWIzMmMz2SRkOTcxNWJjMS00OWNkLTRkZjgtOGRiZi1jMDZkZTQyYWQ1NTCsIzc2NSNfbG9nZ2VykKsjNzYzI2xvZ2dlcpCtIzc2MiNsb2dzdGF0ZZC0Izc1OCNvcmlnaW5hbF9zdGRlcnKQtCM3NTQjb3JpZ2luYWxfc3Rkb3V0kKNvYmqR2SQxYTYyYWU3MS01OGRiLTQ5ZWEtYWU2YS05YWVhNjYxNDU5NjOrIzc1OSNlcnJfcmSQqyM3NjAjZXJyX3dykK8jNzYxI2Vycl9yZWFkZXKQryM3NTcjb3V0X3JlYWRlcpCtbWFnbmV0aXphdGlvbpHZJGQ5NzE1YmMxLTQ5Y2QtNGRmOC04ZGJmLWMwNmRlNDJhZDU1MLEjNzY0I25ld19sb2dzdGF0ZZCrIzc1NSNvdXRfcmSQsnVwc3RyZWFtX2NlbGxzX21hcN4AHqNzeXOR2SQ5ZTM5NzQyNi1iNjBiLTRiOTgtYmU4Yi1mN2YxMjg2MjFjNDTZJFN1cHByZXNzb3IuQmFzZS5Db3JlTG9nZ2luZy5Mb2dTdGF0ZZC0U3VwcHJlc3Nvci5Db3JlLmV2YWyQqlN1cHByZXNzb3KR2SQ3MGRiYzJiZC04YjkzLTQ3MWQtODM0MC0wNGQ5OGEwMDhjYTaqc2VxX3BhcmFtc5HZJGNiNjU5MTE4LTlmMjItNDNjMy04MDFkLTQ5MjQxZGVlNGRmNq9TdXBwcmVzc29yLkV4cHKQr2NhcmRpYWNfcGhhbnRvbZHZJGY1N2EyYjZjLWViNGMtNDViZC04MDU4LTRhNjBiMDM4OTI1ZKlCYXNlLlRhc2uQrVN1cHByZXNzb3IuPT2Qp25vdGhpbmeQqnNpbV9wYXJhbXOR2SRkMDVkY2JhNy0yZjQyLTQ3YmYtYTE3Mi02MTIzZDAxMTNiM2apQmFzZS5wdXQhkLFTdXBwcmVzc29yLnR5cGVvZpCxZHVtbXlfaGVhcnRfYmVhdHOR2SRjYjY1OTExOC05ZjIyLTQzYzMtODAxZC00OTI0MWRlZTRkZja6U3VwcHJlc3Nvci5yZWRpcmVjdF9zdGRlcnKQuVN1cHByZXNzb3IuY3VycmVudF9sb2dnZXKQr1N1cHByZXNzb3IucmVhZJCkQ01SQZHZJDc4OTBmODFlLWNiMTUtNDhkMi1hODBjLTlkNzNmOTUxNjA1NqRvbmVzkKRCb29skKhzaW11bGF0ZZC4U3VwcHJlc3Nvci5wcm9wZXJ0eW5hbWVzkKRCYXNlkK1TdXBwcmVzc29yLmlukK1CYXNlLnNjaGVkdWxlkKlAc3VwcHJlc3OQsFN1cHByZXNzb3IuY2xvc2WQoSuQulN1cHByZXNzb3IucmVkaXJlY3Rfc3Rkb3V0kKVjY2FsbJDZJDc3MTUzZTVjLTcxYmQtNDJlMy1iYWU5LWU0ODExZmZhN2EzZIS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDc3MTUzZTVjLTcxYmQtNDJlMy1iYWU5LWU0ODExZmZhN2EzZLRkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwgqdAbWRfc3RykKhnZXRpbmRleJDZJGQ1NGQ2ODA3LTQ0NGYtNGUwZS04ZmQ2LTg0NDU3OTc0MTE1YYS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJGQ1NGQ2ODA3LTQ0NGYtNGUwZS04ZmQ2LTg0NDU3OTc0MTE1YbRkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwgqdAbWRfc3RykKhnZXRpbmRleJDZJDQ0YTMxMDU3LTdiMzQtNGM4MC1hMjczLTY2MjFjMDc3M2RjN4S0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDQ0YTMxMDU3LTdiMzQtNGM4MC1hMjczLTY2MjFjMDc3M2RjN7Rkb3duc3RyZWFtX2NlbGxzX21hcN4AFaxzaWduYWxfYmxvbzKQqHN0ZF9mYXQykKNzMTKQqm1lYW5fYmxvbzKQrHNpZ25hbF9teW9jMpCpbWVhbl9mYXQykKxzaWduYWxfZmF0MjKQpGZpZzKQo3M4MpCjczUykKNzNjKQo3M0MpCrc2lnbmFsX2ZhdDKQo3MzMpCjczcykKlzdGRfZmF0MjKQo3MyMpCqbWVhbl9mYXQyMpCpc3RkX215b2MykKptZWFuX215b2MykKlzdGRfYmxvbzKQsnVwc3RyZWFtX2NlbGxzX21hcN4AFKdyZXZlcnNlkKTOlGZzkdkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhoTqQpG1hZzKR2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGkRkZBc5HZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZjb2xvcnOR2SQ4ZGMxMTE3NS1lYmM4LTQwN2EtYWIwYi02ZDU0M2Y4NDlhNzKpcmVsYXlvdXQhkKNlbmSQpmxlbmd0aJChLZCnc2NhdHRlcpCncmVzaGFwZZCkcGxvdJCmbGFiZWxzkdkkOGRjMTExNzUtZWJjOC00MDdhLWFiMGItNmQ1NDNmODQ5YTcyoSuQpGF0dHKQpXNwaW5zkdkkOGRjMTExNzUtZWJjOC00MDdhLWFiMGItNmQ1NDNmODQ5YTcypG1lYW6R2SQ4ZGMxMTE3NS1lYmM4LTQwN2EtYWIwYi02ZDU0M2Y4NDlhNzKjYWJzkKNzdGSR2SQ4ZGMxMTE3NS1lYmM4LTQwN2EtYWIwYi02ZDU0M2Y4NDlhNzLZJGNiNjU5MTE4LTlmMjItNDNjMy04MDFkLTQ5MjQxZGVlNGRmNoS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJGNiNjU5MTE4LTlmMjItNDNjMy04MDFkLTQ5MjQxZGVlNGRmNrRkb3duc3RyZWFtX2NlbGxzX21hcI+iVFKR2SQ2Yjg3MDQ0My03YmU1LTQyODctYjk1Ny1jYTVjMTRlZGE4OWOjVHJmktkkNmI4NzA0NDMtN2JlNS00Mjg3LWI5NTctY2E1YzE0ZWRhODlj2SRkMDVkY2JhNy0yZjQyLTQ3YmYtYTE3Mi02MTIzZDAxMTNiM2aiVEWR2SQ2Yjg3MDQ0My03YmU1LTQyODctYjk1Ny1jYTVjMTRlZGE4OWOraW1fc2VnbWVudHOS2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjbZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYa9pTkFWX2ZsaXBfYW5nbGWQokIxkdkkNmI4NzA0NDMtN2JlNS00Mjg3LWI5NTctY2E1YzE0ZWRhODljqnNlcV9wYXJhbXOT2SQzN2Y3ZmQ3Zi01Y2IxLTQ4YjUtYjg3Ny1iMmJjMjNhMWU3ZGTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNtkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhrWltX2ZsaXBfYW5nbGWQolJSkdkkZDk3MTViYzEtNDljZC00ZGY4LThkYmYtYzA2ZGU0MmFkNTUwr1QycHJlcF9kdXJhdGlvbpCnVGZhdHNhdJHZJDZiODcwNDQzLTdiZTUtNDI4Ny1iOTU3LWNhNWMxNGVkYTg5Y7FkdW1teV9oZWFydF9iZWF0c5LZJDM3ZjdmZDdmLTVjYjEtNDhiNS1iODc3LWIyYmMyM2ExZTdkZNkkZDk3MTViYzEtNDljZC00ZGY4LThkYmYtYzA2ZGU0MmFkNTUwpFRhZGOR2SQ2Yjg3MDQ0My03YmU1LTQyODctYjk1Ny1jYTVjMTRlZGE4OWOqaU5BVl9saW5lc5CxRmF0U2F0X2ZsaXBfYW5nbGWQsnVwc3RyZWFtX2NlbGxzX21hcIOizrOQoS+QoSqQ2SQ4ZGMxMTE3NS1lYmM4LTQwN2EtYWIwYi02ZDU0M2Y4NDlhNzKEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQ4ZGMxMTE3NS1lYmM4LTQwN2EtYWIwYi02ZDU0M2Y4NDlhNzK0ZG93bnN0cmVhbV9jZWxsc19tYXCFpmxhYmVsc5LZJGY3MzA4MmZmLWE2ZDMtNDFmOC04Nzk2LTQxMTRmYTg5ZDJiYtkkNDRhMzEwNTctN2IzNC00YzgwLWEyNzMtNjYyMWMwNzczZGM3pmNvbG9yc5LZJGY3MzA4MmZmLWE2ZDMtNDFmOC04Nzk2LTQxMTRmYTg5ZDJiYtkkNDRhMzEwNTctN2IzNC00YzgwLWEyNzMtNjYyMWMwNzczZGM3pXNwaW5zktkkZjczMDgyZmYtYTZkMy00MWY4LTg3OTYtNDExNGZhODlkMmJi2SQ0NGEzMTA1Ny03YjM0LTRjODAtYTI3My02NjIxYzA3NzNkYzekbWVhbpLZJGY3MzA4MmZmLWE2ZDMtNDFmOC04Nzk2LTQxMTRmYTg5ZDJiYtkkNDRhMzEwNTctN2IzNC00YzgwLWEyNzMtNjYyMWMwNzczZGM3o3N0ZJLZJGY3MzA4MmZmLWE2ZDMtNDFmOC04Nzk2LTQxMTRmYTg5ZDJiYtkkNDRhMzEwNTctN2IzNC00YzgwLWEyNzMtNjYyMWMwNzczZGM3snVwc3RyZWFtX2NlbGxzX21hcI+nQG1kX3N0cpChOpCjc3VtkKRzcXJ0kKRzaXplkKdhZGpvaW50kKEtkKEvkKFekKErkKROaXNvkdkkZjBhODFjOWYtNTYxNi00NjYzLTk0OGYtYTQwODRlMTcxOWFmoSqQpGNvbmqQo2Fic5CoZ2V0aW5kZXiQ2SRmNzMwODJmZi1hNmQzLTQxZjgtODc5Ni00MTE0ZmE4OWQyYmKEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SRmNzMwODJmZi1hNmQzLTQxZjgtODc5Ni00MTE0ZmE4OWQyYmK0ZG93bnN0cmVhbV9jZWxsc19tYXDeABCiczGQqW1lYW5fZGlmZpCiczWQqHN0ZF9teW9jkKJzMpCiczSQq3NpZ25hbF9teW9jkKltZWFuX2Jsb2+QqW1lYW5fbXlvY5CjZmlnkKtzaWduYWxfYmxvb5CiczaQqHN0ZF9kaWZmkK5kaWZmX2Jsb29fbXlvY5Coc3RkX2Jsb2+QonMzkLJ1cHN0cmVhbV9jZWxsc19tYXDeABSjRkFzkdkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2p3JldmVyc2WQoTqQpG1hZzGR2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjamY29sb3JzkdkkOGRjMTExNzUtZWJjOC00MDdhLWFiMGItNmQ1NDNmODQ5YTcyqXJlbGF5b3V0IZCjUlJzkdkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2o2VuZJCmbGVuZ3RokKEtkKdzY2F0dGVykKdyZXNoYXBlkKRwbG90kKZsYWJlbHOR2SQ4ZGMxMTE3NS1lYmM4LTQwN2EtYWIwYi02ZDU0M2Y4NDlhNzKhK5CkYXR0cpClc3BpbnOR2SQ4ZGMxMTE3NS1lYmM4LTQwN2EtYWIwYi02ZDU0M2Y4NDlhNzKkbWVhbpHZJDhkYzExMTc1LWViYzgtNDA3YS1hYjBiLTZkNTQzZjg0OWE3MqNhYnOQo3N0ZJHZJDhkYzExMTc1LWViYzgtNDA3YS1hYjBiLTZkNTQzZjg0OWE3MtkkNzBkYmMyYmQtOGI5My00NzFkLTgzNDAtMDRkOThhMDA4Y2E2hLRwcmVjZWRlbmNlX2hldXJpc3RpYwenY2VsbF9pZNkkNzBkYmMyYmQtOGI5My00NzFkLTgzNDAtMDRkOThhMDA4Y2E2tGRvd25zdHJlYW1fY2VsbHNfbWFwg69Qcm9ncmVzc0xvZ2dpbmeQp1BsdXRvVUmQqlN1cHByZXNzb3KT2SQzN2Y3ZmQ3Zi01Y2IxLTQ4YjUtYjg3Ny1iMmJjMjNhMWU3ZGTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNtkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhsnVwc3RyZWFtX2NlbGxzX21hcIDZJGFiZWEyYzQzLWQ4M2UtNDQzOC04Y2QzLTRiZTA2YjgxNzRiM4S0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJGFiZWEyYzQzLWQ4M2UtNDQzOC04Y2QzLTRiZTA2YjgxNzRiM7Rkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwgqdAbWRfc3RykKhnZXRpbmRleJDZJGFlNzJmZmM1LTdmOGUtNDkwNy1hOTllLThhZDdjYjhmZGRhYoS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJGFlNzJmZmM1LTdmOGUtNDkwNy1hOTllLThhZDdjYjhmZGRhYrRkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwgqdAbWRfc3RykKhnZXRpbmRleJDZJDBiN2E0MDVlLWJiYjUtMTFlZS0wNWNhLTRiMWM4NTY3Mzk4ZIS0cHJlY2VkZW5jZV9oZXVyaXN0aWMHp2NlbGxfaWTZJDBiN2E0MDVlLWJiYjUtMTFlZS0wNWNhLTRiMWM4NTY3Mzk4ZLRkb3duc3RyZWFtX2NlbGxzX21hcIOsS29tYU1SSVBsb3RzkKtQbHV0b1Bsb3RseZCrS29tYU1SSUNvcmWR2SRkOTcxNWJjMS00OWNkLTRkZjgtOGRiZi1jMDZkZTQyYWQ1NTCydXBzdHJlYW1fY2VsbHNfbWFwgNkkZGJmMTY2NzYtNjRmMi00ZDliLWJmMWItOGRlMDZiMDQ4NjAyhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkZGJmMTY2NzYtNjRmMi00ZDliLWJmMWItOGRlMDZiMDQ4NjAytGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCp0BtZF9zdHKQqGdldGluZGV4kNkkZjIxZTllNTktMjVjMy00ZjA2LThkZTQtNzkyY2IzMDVlYjAxhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkZjIxZTllNTktMjVjMy00ZjA2LThkZTQtNzkyY2IzMDVlYjAxtGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCp0BtZF9zdHKQqGdldGluZGV4kNkkMGI2YzFmNzItYjA0MC00ODNjLTk2OWItODhiZmUwOWIzMmMzhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkMGI2YzFmNzItYjA0MC00ODNjLTk2OWItODhiZmUwOWIzMmMztGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCo3NlcZHZJDM3ZjdmZDdmLTVjYjEtNDhiNS1iODc3LWIyYmMyM2ExZTdkZKhwbG90X3NlcZDZJDc4OTBmODFlLWNiMTUtNDhkMi1hODBjLTlkNzNmOTUxNjA1NoS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDc4OTBmODFlLWNiMTUtNDhkMi1hODBjLTlkNzNmOTUxNjA1NrRkb3duc3RyZWFtX2NlbGxzX21hcIGkQ01SQZPZJDM3ZjdmZDdmLTVjYjEtNDhiNS1iODc3LWIyYmMyM2ExZTdkZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY22SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGydXBzdHJlYW1fY2VsbHNfbWFwj6dAbWRfc3RykKZGYXRTYXSR2SQ2Yjg3MDQ0My03YmU1LTQyODctYjk1Ny1jYTVjMTRlZGE4OWOoZmF0X2ZyZXGR2SRmMGE4MWM5Zi01NjE2LTQ2NjMtOTQ4Zi1hNDA4NGUxNzE5YWahOpClYlNTRlCR2SQ2Yjg3MDQ0My03YmU1LTQyODctYjk1Ny1jYTVjMTRlZGE4OWOlemVyb3OQpEJvb2yQo0FEQ5ChLZClRGVsYXmQo2R1cpChK5CmVDJwcmVwkdkkNmI4NzA0NDMtN2JlNS00Mjg3LWI5NTctY2E1YzE0ZWRhODljqFNlcXVlbmNlkKhnZXRpbmRleJDZJDFiYjNlNDliLTFhMTktNDM0My1hYzA5LWZiYWYxY2FlNGJhM4S0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDFiYjNlNDliLTFhMTktNDM0My1hYzA5LWZiYWYxY2FlNGJhM7Rkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwga9UYWJsZU9mQ29udGVudHOQ2SRlY2ViMzI2YS1jYWI2LTQ2NWUtOGU1Yy1lODM1ODgxYmQzYjCEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SRlY2ViMzI2YS1jYWI2LTQ2NWUtOGU1Yy1lODM1ODgxYmQzYjC0ZG93bnN0cmVhbV9jZWxsc19tYXCAsnVwc3RyZWFtX2NlbGxzX21hcIKnQG1kX3N0cpCoZ2V0aW5kZXiQ2SQxYTYyYWU3MS01OGRiLTQ5ZWEtYWU2YS05YWVhNjYxNDU5NjOEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQxYTYyYWU3MS01OGRiLTQ5ZWEtYWU2YS05YWVhNjYxNDU5NjO0ZG93bnN0cmVhbV9jZWxsc19tYXCCqnBoYW50b21fVDGQqnBoYW50b21fVDKQsnVwc3RyZWFtX2NlbGxzX21hcImmdW5pcXVlkKdzY2F0dGVykKNvYmqR2SQzN2Y3ZmQ3Zi01Y2IxLTQ4YjUtYjg3Ny1iMmJjMjNhMWU3ZGShL5CkcGxvdJCkYXR0cpCpcmVsYXlvdXQhkKEqkKdtYXhpbXVtkNkkZjU3YTJiNmMtZWI0Yy00NWJkLTgwNTgtNGE2MGIwMzg5MjVkhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkZjU3YTJiNmMtZWI0Yy00NWJkLTgwNTgtNGE2MGIwMzg5MjVktGRvd25zdHJlYW1fY2VsbHNfbWFwga9jYXJkaWFjX3BoYW50b22T2SQzN2Y3ZmQ3Zi01Y2IxLTQ4YjUtYjg3Ny1iMmJjMjNhMWU3ZGTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNtkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhsnVwc3RyZWFtX2NlbGxzX21hcIunQG1kX3N0cpCoZmF0X2ZyZXGR2SRmMGE4MWM5Zi01NjE2LTQ2NjMtOTQ4Zi1hNDA4NGUxNzE5YWanRmxvYXQ2NJCkb25lc5ChK5CnUGhhbnRvbZCiz4CQpE5pc2+R2SRmMGE4MWM5Zi01NjE2LTQ2NjMtOTQ4Zi1hNDA4NGUxNzE5YWaiZHiR2SRmMGE4MWM5Zi01NjE2LTQ2NjMtOTQ4Zi1hNDA4NGUxNzE5YWahKpCoZ2V0aW5kZXiQ2SQ4ZGQ3MDRhNC1iZjUwLTRkZGMtYTgzMi1kMDc0YmQ1MmFkMDGEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQ4ZGQ3MDRhNC1iZjUwLTRkZGMtYTgzMi1kMDc0YmQ1MmFkMDG0ZG93bnN0cmVhbV9jZWxsc19tYXCAsnVwc3RyZWFtX2NlbGxzX21hcIKnQG1kX3N0cpCoZ2V0aW5kZXiQ2SQ2Yjg3MDQ0My03YmU1LTQyODctYjk1Ny1jYTVjMTRlZGE4OWOEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQ2Yjg3MDQ0My03YmU1LTQyODctYjk1Ny1jYTVjMTRlZGE4OWO0ZG93bnN0cmVhbV9jZWxsc19tYXCDpkZhdFNhdJHZJDc4OTBmODFlLWNiMTUtNDhkMi1hODBjLTlkNzNmOTUxNjA1NqViU1NGUJHZJDc4OTBmODFlLWNiMTUtNDhkMi1hODBjLTlkNzNmOTUxNjA1NqZUMnByZXCR2SQ3ODkwZjgxZS1jYjE1LTQ4ZDItYTgwYy05ZDczZjk1MTYwNTaydXBzdHJlYW1fY2VsbHNfbWFw3gAhp0BtZF9zdHKQoSGQpHNxcnSQokIxkdkkY2I2NTkxMTgtOWYyMi00M2MzLTgwMWQtNDkyNDFkZWU0ZGY2pmlzbGVzc5ChPJCnVGZhdHNhdJHZJGNiNjU5MTE4LTlmMjItNDNjMy04MDFkLTQ5MjQxZGVlNGRmNqVyYW5nZZCjbWlukKEvkKVEZWxheZChXpCvZ2V0X2ZsaXBfYW5nbGVzkKhTZXF1ZW5jZZCiPT2QomltkKRUYWRjkdkkY2I2NTkxMTgtOWYyMi00M2MzLTgwMWQtNDkyNDFkZWU0ZGY2qGdldGluZGV4kKJUUpHZJGNiNjU5MTE4LTlmMjItNDNjMy04MDFkLTQ5MjQxZGVlNGRmNqhmYXRfZnJlcZHZJGYwYTgxYzlmLTU2MTYtNDY2My05NDhmLWE0MDg0ZTE3MTlhZqNleHCQo1RyZpHZJGNiNjU5MTE4LTlmMjItNDNjMy04MDFkLTQ5MjQxZGVlNGRmNqJURZHZJGNiNjU5MTE4LTlmMjItNDNjMy04MDFkLTQ5MjQxZGVlNGRmNqIhPZCiz4CQoTqQo0FEQ5ChLZCjbG9nkKErkKEqkKRHcmFkkKJSRpDZJDdkZWFkZDU4LWIyMDItNDUwOC1iNGM3LTY4NmY3NDJjYjcxM4S0cHJlY2VkZW5jZV9oZXVyaXN0aWMBp2NlbGxfaWTZJDdkZWFkZDU4LWIyMDItNDUwOC1iNGM3LTY4NmY3NDJjYjcxM7Rkb3duc3RyZWFtX2NlbGxzX21hcIGjUGtnkdkkN2RlYWRkNTgtYjIwMi00NTA4LWI0YzctNjg2Zjc0MmNiNzEzsnVwc3RyZWFtX2NlbGxzX21hcIekQmFzZZCjUGtnkdkkN2RlYWRkNTgtYjIwMi00NTA4LWI0YzctNjg2Zjc0MmNiNzEzsFBrZy5kZXBlbmRlbmNpZXOQp1ZFUlNJT06QpmZpbHRlcpCncHJpbnRsbpCob2NjdXJzaW6QtGNlbGxfZXhlY3V0aW9uX29yZGVy3AAk2SQ3ZGVhZGQ1OC1iMjAyLTQ1MDgtYjRjNy02ODZmNzQyY2I3MTPZJDBiN2E0MDVlLWJiYjUtMTFlZS0wNWNhLTRiMWM4NTY3Mzk4ZNkkNzBkYmMyYmQtOGI5My00NzFkLTgzNDAtMDRkOThhMDA4Y2E22SRhOTljMGM0Ny0xYjcwLTQzNjItYTJmNi1hN2UzMjU5NjA2ZmHZJDFiYjNlNDliLTFhMTktNDM0My1hYzA5LWZiYWYxY2FlNGJhM9kkZmM1ODY0MGItYzQ0Yy00YzI1LWE0ZmQtNWEwZTE3ZDdiZWNk2SRkYmYxNjY3Ni02NGYyLTRkOWItYmYxYi04ZGUwNmIwNDg2MDLZJGY0OTY1NWNjLTQ2MGUtNDk4MS05MmVhLWRmZDYxNDczMDhiZtkkNzcxNTNlNWMtNzFiZC00MmUzLWJhZTktZTQ4MTFmZmE3YTNk2SQ5ZTM5NzQyNi1iNjBiLTRiOTgtYmU4Yi1mN2YxMjg2MjFjNDTZJDkyMTk0ZmNiLTU4MmEtNDljZS1hYWQ3LTIwYjAxNDVkNDBkM9kkYWU3MmZmYzUtN2Y4ZS00OTA3LWE5OWUtOGFkN2NiOGZkZGFi2SRjYjY1OTExOC05ZjIyLTQzYzMtODAxZC00OTI0MWRlZTRkZjbZJGExNWQ2YjY0LWY4ZWUtNGVlNC04MTJjLWQ0OWNmNWVhNzg0ZNkkZjBhODFjOWYtNTYxNi00NjYzLTk0OGYtYTQwODRlMTcxOWFm2SQ2Yjg3MDQ0My03YmU1LTQyODctYjk1Ny1jYTVjMTRlZGE4OWPZJDc4OTBmODFlLWNiMTUtNDhkMi1hODBjLTlkNzNmOTUxNjA1NtkkZjU3YTJiNmMtZWI0Yy00NWJkLTgwNTgtNGE2MGIwMzg5MjVk2SRmMjFlOWU1OS0yNWMzLTRmMDYtOGRlNC03OTJjYjMwNWViMDHZJGVjZWIzMjZhLWNhYjYtNDY1ZS04ZTVjLWU4MzU4ODFiZDNiMNkkZDU0ZDY4MDctNDQ0Zi00ZTBlLThmZDYtODQ0NTc5NzQxMTVh2SRkMDVkY2JhNy0yZjQyLTQ3YmYtYTE3Mi02MTIzZDAxMTNiM2bZJDM3ZjdmZDdmLTVjYjEtNDhiNS1iODc3LWIyYmMyM2ExZTdkZNkkMGI2YzFmNzItYjA0MC00ODNjLTk2OWItODhiZmUwOWIzMmMz2SQxYTYyYWU3MS01OGRiLTQ5ZWEtYWU2YS05YWVhNjYxNDU5NjPZJGQ5NzE1YmMxLTQ5Y2QtNGRmOC04ZGJmLWMwNmRlNDJhZDU1MNkkOGRkNzA0YTQtYmY1MC00ZGRjLWE4MzItZDA3NGJkNTJhZDAx2SQzOWY0NDAyNS0yOTc0LTRjNGMtYjBjMi1lMjEzOTliYmRiMWbZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNtkkZDAzNzdmOWEtNjgwZC00NTAxLTkwY2EtOWVhM2FiNjgxZGI02SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGHZJDhkYzExMTc1LWViYzgtNDA3YS1hYjBiLTZkNTQzZjg0OWE3MtkkZjczMDgyZmYtYTZkMy00MWY4LTg3OTYtNDExNGZhODlkMmJi2SQ0NGEzMTA1Ny03YjM0LTRjODAtYTI3My02NjIxYzA3NzNkYzfZJDNkN2U3ZDIwLWE3N2EtNDhiMy1hZDJlLTZiNjIxMjI3YmUxNtkkYWJlYTJjNDMtZDgzZS00NDM4LThjZDMtNGJlMDZiODE3NGIztGxhc3RfaG90X3JlbG9hZF90aW1lywAAAAAAAAAAqXNob3J0cGF0aNkhMDItbG93LWZpZWxkLWNtcmEtb3B0aW1pemF0aW9uLmpsrnByb2Nlc3Nfc3RhdHVzpXJlYWR5pHBhdGjZYS9ob21lL3J1bm5lci93b3JrL0tvbWFNUkkuamwvS29tYU1SSS5qbC9kb2NzL3NyYy90dXRvcmlhbC1wbHV0by8wMi1sb3ctZmllbGQtY21yYS1vcHRpbWl6YXRpb24uamytcGx1dG9fdmVyc2lvbqh2MC4xOS40Nq5sYXN0X3NhdmVfdGltZctB2b+iqgV4GKpjZWxsX29yZGVy3AAk2SRhOTljMGM0Ny0xYjcwLTQzNjItYTJmNi1hN2UzMjU5NjA2ZmHZJDFiYjNlNDliLTFhMTktNDM0My1hYzA5LWZiYWYxY2FlNGJhM9kkZmM1ODY0MGItYzQ0Yy00YzI1LWE0ZmQtNWEwZTE3ZDdiZWNk2SRkYmYxNjY3Ni02NGYyLTRkOWItYmYxYi04ZGUwNmIwNDg2MDLZJGY0OTY1NWNjLTQ2MGUtNDk4MS05MmVhLWRmZDYxNDczMDhiZtkkMGI3YTQwNWUtYmJiNS0xMWVlLTA1Y2EtNGIxYzg1NjczOThk2SQ3MGRiYzJiZC04YjkzLTQ3MWQtODM0MC0wNGQ5OGEwMDhjYTbZJDc3MTUzZTVjLTcxYmQtNDJlMy1iYWU5LWU0ODExZmZhN2EzZNkkOWUzOTc0MjYtYjYwYi00Yjk4LWJlOGItZjdmMTI4NjIxYzQ02SQ5MjE5NGZjYi01ODJhLTQ5Y2UtYWFkNy0yMGIwMTQ1ZDQwZDPZJGFlNzJmZmM1LTdmOGUtNDkwNy1hOTllLThhZDdjYjhmZGRhYtkkNmI4NzA0NDMtN2JlNS00Mjg3LWI5NTctY2E1YzE0ZWRhODlj2SQ3ODkwZjgxZS1jYjE1LTQ4ZDItYTgwYy05ZDczZjk1MTYwNTbZJGNiNjU5MTE4LTlmMjItNDNjMy04MDFkLTQ5MjQxZGVlNGRmNtkkMGI2YzFmNzItYjA0MC00ODNjLTk2OWItODhiZmUwOWIzMmMz2SRhMTVkNmI2NC1mOGVlLTRlZTQtODEyYy1kNDljZjVlYTc4NGTZJGYwYTgxYzlmLTU2MTYtNDY2My05NDhmLWE0MDg0ZTE3MTlhZtkkZjU3YTJiNmMtZWI0Yy00NWJkLTgwNTgtNGE2MGIwMzg5MjVk2SQxYTYyYWU3MS01OGRiLTQ5ZWEtYWU2YS05YWVhNjYxNDU5NjPZJGYyMWU5ZTU5LTI1YzMtNGYwNi04ZGU0LTc5MmNiMzA1ZWIwMdkkZWNlYjMyNmEtY2FiNi00NjVlLThlNWMtZTgzNTg4MWJkM2Iw2SRkNTRkNjgwNy00NDRmLTRlMGUtOGZkNi04NDQ1Nzk3NDExNWHZJGQwNWRjYmE3LTJmNDItNDdiZi1hMTcyLTYxMjNkMDExM2IzZtkkMzdmN2ZkN2YtNWNiMS00OGI1LWI4NzctYjJiYzIzYTFlN2Rk2SRkOTcxNWJjMS00OWNkLTRkZjgtOGRiZi1jMDZkZTQyYWQ1NTDZJDhkZDcwNGE0LWJmNTAtNGRkYy1hODMyLWQwNzRiZDUyYWQwMdkkMzlmNDQwMjUtMjk3NC00YzRjLWIwYzItZTIxMzk5YmJkYjFm2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjbZJGY3MzA4MmZmLWE2ZDMtNDFmOC04Nzk2LTQxMTRmYTg5ZDJiYtkkZDAzNzdmOWEtNjgwZC00NTAxLTkwY2EtOWVhM2FiNjgxZGI02SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGHZJDQ0YTMxMDU3LTdiMzQtNGM4MC1hMjczLTY2MjFjMDc3M2RjN9kkOGRjMTExNzUtZWJjOC00MDdhLWFiMGItNmQ1NDNmODQ5YTcy2SQzZDdlN2QyMC1hNzdhLTQ4YjMtYWQyZS02YjYyMTIyN2JlMTbZJGFiZWEyYzQzLWQ4M2UtNDQzOC04Y2QzLTRiZTA2YjgxNzRiM9kkN2RlYWRkNTgtYjIwMi00NTA4LWI0YzctNjg2Zjc0MmNiNzEzsXB1Ymxpc2hlZF9vYmplY3Rzhdk1MGJjZDhlOTAtODE4MS0xMWVmLTI0YzAtZjE0ZjZhNGQzMDg0LzM0MDlhNGI5ZTI1OThhZTeEpmxheW91dIileGF4aXOFqHRpY2t2YWxzxxQXAACgQQAAqkIAANxCAAACQwAANEOodGlja21vZGWlYXJyYXmldGl0bGWwRmxpcCBhbmdsZSBbZGVnXaVyYW5nZdcXAACgQQAANEOpY29uc3RyYWlupmRvbWFpbqlob3Zlcm1vZGWpeCB1bmlmaWVkpGZvbnSEpmZhbWlsealDTVUgU2VyaWarc2NhbGVhbmNob3KheKpzY2FsZXJhdGlvyj+AAACkc2l6ZcpBgAAAqHRlbXBsYXRlgqZsYXlvdXTeABOpY29sb3JheGlzgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApXhheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Zalob3Zlcm1vZGWnY2xvc2VzdK1wYXBlcl9iZ2NvbG9ypXdoaXRlo2dlb4apc2hvd2xha2Vzw6hzaG93bGFuZMOpbGFuZGNvbG9ypyNFNUVDRjanYmdjb2xvcqV3aGl0ZaxzdWJ1bml0Y29sb3Kld2hpdGWpbGFrZWNvbG9ypXdoaXRlqmNvbG9yc2NhbGWDqnNlcXVlbnRpYWyaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGpZGl2ZXJnaW5nm5LKAAAAAKcjOGUwMTUykso9zMzNpyNjNTFiN2SSyj5MzM2nI2RlNzdhZZLKPpmZmqcjZjFiNmRhkso+zMzNpyNmZGUwZWaSyj8AAACnI2Y3ZjdmN5LKPxmZmqcjZTZmNWQwkso/MzMzpyNiOGUxODaSyj9MzM2nIzdmYmM0MZLKP2ZmZqcjNGQ5MjIxkso/gAAApyMyNzY0MTmvc2VxdWVudGlhbG1pbnVzmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxpXlheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Za1zaGFwZWRlZmF1bHRzgaRsaW5lgaVjb2xvcqcjMmEzZjVmqmhvdmVybGFiZWyBpWFsaWdupGxlZnSmbWFwYm94gaVzdHlsZaVsaWdodKVwb2xhcoOrYW5ndWxhcmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqpyYWRpYWxheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0Za9hdXRvdHlwZW51bWJlcnOmc3RyaWN0pGZvbnSBpWNvbG9ypyMyYTNmNWandGVybmFyeYSlYWF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqVjYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWlYmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlsmFubm90YXRpb25kZWZhdWx0c4OpYXJyb3doZWFkygAAAACqYXJyb3d3aWR0aMo/gAAAqmFycm93Y29sb3KnIzJhM2Y1ZqxwbG90X2JnY29sb3KnI0U1RUNGNqV0aXRsZYGheMo9TMzNpXNjZW5lg6V4YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWlemF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXlheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0Zahjb2xvcndheZqnIzYzNmVmYacjRUY1NTNCpyMwMGNjOTanI2FiNjNmYacjRkZBMTVBpyMxOWQzZjOnI0ZGNjY5MqcjQjZFODgwpyNGRjk3RkanI0ZFQ0I1MqRkYXRh3gAZrnNjYXR0ZXJwb2xhcmdskYKkdHlwZa5zY2F0dGVycG9sYXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmY2FycGV0kYOlYmF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaR0eXBlpmNhcnBldKVhYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlrHNjYXR0ZXJwb2xhcpGCpHR5cGWsc2NhdHRlcnBvbGFypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKlwYXJjb29yZHORgqRsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpcGFyY29vcmRzp3NjYXR0ZXKRgqR0eXBlp3NjYXR0ZXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAsmhpc3RvZ3JhbTJkY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZbJoaXN0b2dyYW0yZGNvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMadjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2NvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVyY2FycGV0kYKkdHlwZa1zY2F0dGVyY2FycGV0pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZtZXNoM2SRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWmbWVzaDNkp3N1cmZhY2WRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnc3VyZmFjZapjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJtYXBib3iRgqR0eXBlrXNjYXR0ZXJtYXBib3imbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqnNjYXR0ZXJnZW+RgqR0eXBlqnNjYXR0ZXJnZW+mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqWhpc3RvZ3JhbZGCpHR5cGWpaGlzdG9ncmFtpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKNwaWWRgqR0eXBlo3BpZaphdXRvbWFyZ2luw6pjaG9yb3BsZXRokYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqmNob3JvcGxldGipaGVhdG1hcGdskYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqWhlYXRtYXBnbKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxo2JhcpGEpHR5cGWjYmFyp2Vycm9yX3mBpWNvbG9ypyMyYTNmNWanZXJyb3JfeIGlY29sb3KnIzJhM2Y1ZqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKdoZWF0bWFwkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2hlYXRtYXCqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1jb250b3VyY2FycGV0kYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlrWNvbnRvdXJjYXJwZXSldGFibGWRg6R0eXBlpXRhYmxlpmhlYWRlcoKkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0M4RDRFM6VjZWxsc4KkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0VCRjBGOKlzY2F0dGVyM2SRg6RsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpc2NhdHRlcjNkpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKhiYXJwb2xhcpGCpHR5cGWoYmFycG9sYXKmbWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACpc2NhdHRlcmdskYKkdHlwZalzY2F0dGVyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAq2hpc3RvZ3JhbTJkkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlq2hpc3RvZ3JhbTJkqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGuc2NhdHRlcnRlcm5hcnmRgqR0eXBlrnNjYXR0ZXJ0ZXJuYXJ5pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZoZWlnaHTKQ8gAAKZtYXJnaW6EoWzKQkgAAKFiykJIAAChcspCSAAAoXTKQnAAAKV5YXhpc4OodGlja21vZGWlYXJyYXmldGl0bGWtU2lnbmFsIFthLnUuXaVyYW5nZdcXAAAAAJqZmT6ld2lkdGjKRBYAAKZjb25maWeFqHNob3dMaW5rwqhlZGl0YWJsZcKqcmVzcG9uc2l2ZcOqc3RhdGljUGxvdMKqc2Nyb2xsWm9vbcOmZnJhbWVzkKRkYXRhloakbGluZYGlY29sb3KkYmx1ZaF5x0QX788vPYzCeT2U65o9WnyxPQLZwD2s0sk9Wn/NPdkDzT0tcck9lrLDPeGHvD29hrQ9xh+sPReloz2JUJs9wkmTPe6piz2kdHlwZadzY2F0dGVypG5hbWWqTXlvY2FyZGl1batsZWdlbmRncm91cKpNeW9j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MS0xMWVmLTI0YzAtZjE0ZjZhNGQzMDg0LzFmYWIwNzFmZDEwYTNhZTOEpmxheW91dIemeGF4aXMxhqh0aWNrdmFsc8cMFwAAQL8AAAAAAABAP6h0aWNrbW9kZaVhcnJheaV0aXRsZYGkdGV4dKZ4IFttbV2mZG9tYWlu1xcAAAAAZmbmPqVyYW5nZdcXAADAvwAAwD+mYW5jaG9yonkxpnlheGlzMYaodGlja3ZhbHPYFwBAL0QAQIxEAAA3QwAAAkOodGlja21vZGWlYXJyYXmldGl0bGWBpHRleHSnVDEgW21zXaZkb21haW7XFwAAAAAAAIA/pXJhbmdl1xcAAAAAAACWRKZhbmNob3KieDGodGVtcGxhdGWCpmxheW91dN4AE6ljb2xvcmF4aXOBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACleGF4aXOHqWdyaWRjb2xvcqV3aGl0Za16ZXJvbGluZXdpZHRoykAAAACldGl0bGWBqHN0YW5kb2ZmykFwAACldGlja3OgrXplcm9saW5lY29sb3Kld2hpdGWqYXV0b21hcmdpbsOpbGluZWNvbG9ypXdoaXRlqWhvdmVybW9kZadjbG9zZXN0rXBhcGVyX2JnY29sb3Kld2hpdGWjZ2VvhqlzaG93bGFrZXPDqHNob3dsYW5kw6lsYW5kY29sb3KnI0U1RUNGNqdiZ2NvbG9ypXdoaXRlrHN1YnVuaXRjb2xvcqV3aGl0ZalsYWtlY29sb3Kld2hpdGWqY29sb3JzY2FsZYOqc2VxdWVudGlhbJqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMalkaXZlcmdpbmebksoAAAAApyM4ZTAxNTKSyj3MzM2nI2M1MWI3ZJLKPkzMzacjZGU3N2Flkso+mZmapyNmMWI2ZGGSyj7MzM2nI2ZkZTBlZpLKPwAAAKcjZjdmN2Y3kso/GZmapyNlNmY1ZDCSyj8zMzOnI2I4ZTE4NpLKP0zMzacjN2ZiYzQxkso/ZmZmpyM0ZDkyMjGSyj+AAACnIzI3NjQxOa9zZXF1ZW50aWFsbWludXOaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGleWF4aXOHqWdyaWRjb2xvcqV3aGl0Za16ZXJvbGluZXdpZHRoykAAAACldGl0bGWBqHN0YW5kb2ZmykFwAACldGlja3OgrXplcm9saW5lY29sb3Kld2hpdGWqYXV0b21hcmdpbsOpbGluZWNvbG9ypXdoaXRlrXNoYXBlZGVmYXVsdHOBpGxpbmWBpWNvbG9ypyMyYTNmNWaqaG92ZXJsYWJlbIGlYWxpZ26kbGVmdKZtYXBib3iBpXN0eWxlpWxpZ2h0pXBvbGFyg6thbmd1bGFyYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWnYmdjb2xvcqcjRTVFQ0Y2qnJhZGlhbGF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlr2F1dG90eXBlbnVtYmVyc6ZzdHJpY3SkZm9udIGlY29sb3KnIzJhM2Y1Zqd0ZXJuYXJ5hKVhYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWnYmdjb2xvcqcjRTVFQ0Y2pWNheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZaViYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWyYW5ub3RhdGlvbmRlZmF1bHRzg6lhcnJvd2hlYWTKAAAAAKphcnJvd3dpZHRoyj+AAACqYXJyb3djb2xvcqcjMmEzZjVmrHBsb3RfYmdjb2xvcqcjRTVFQ0Y2pXRpdGxlgaF4yj1MzM2lc2NlbmWDpXhheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0ZaV6YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWleWF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlqGNvbG9yd2F5mqcjNjM2ZWZhpyNFRjU1M0KnIzAwY2M5NqcjYWI2M2ZhpyNGRkExNUGnIzE5ZDNmM6cjRkY2NjkypyNCNkU4ODCnI0ZGOTdGRqcjRkVDQjUypGRhdGHeABmuc2NhdHRlcnBvbGFyZ2yRgqR0eXBlrnNjYXR0ZXJwb2xhcmdspm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZjYXJwZXSRg6ViYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlpHR5cGWmY2FycGV0pWFheGlzhalncmlkY29sb3Kld2hpdGWsZW5kbGluZWNvbG9ypyMyYTNmNWaubWlub3JncmlkY29sb3Kld2hpdGWuc3RhcnRsaW5lY29sb3KnIzJhM2Y1ZqlsaW5lY29sb3Kld2hpdGWsc2NhdHRlcnBvbGFykYKkdHlwZaxzY2F0dGVycG9sYXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqXBhcmNvb3Jkc5GCpGxpbmWBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZalwYXJjb29yZHOnc2NhdHRlcpGCpHR5cGWnc2NhdHRlcqZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACyaGlzdG9ncmFtMmRjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlsmhpc3RvZ3JhbTJkY29udG91cqpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxp2NvbnRvdXKRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnY29udG91cqpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJjYXJwZXSRgqR0eXBlrXNjYXR0ZXJjYXJwZXSmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApm1lc2gzZJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZaZtZXNoM2Snc3VyZmFjZZGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadzdXJmYWNlqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtc2NhdHRlcm1hcGJveJGCpHR5cGWtc2NhdHRlcm1hcGJveKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACqc2NhdHRlcmdlb5GCpHR5cGWqc2NhdHRlcmdlb6ZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACpaGlzdG9ncmFtkYKkdHlwZaloaXN0b2dyYW2mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAo3BpZZGCpHR5cGWjcGllqmF1dG9tYXJnaW7DqmNob3JvcGxldGiRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWqY2hvcm9wbGV0aKloZWF0bWFwZ2yRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpaGVhdG1hcGdsqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGjYmFykYSkdHlwZaNiYXKnZXJyb3JfeYGlY29sb3KnIzJhM2Y1ZqdlcnJvcl94gaVjb2xvcqcjMmEzZjVmpm1hcmtlcoGkbGluZYKlY29sb3KnI0U1RUNGNqV3aWR0aMo/AAAAp2hlYXRtYXCRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnaGVhdG1hcKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrWNvbnRvdXJjYXJwZXSRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWtY29udG91cmNhcnBldKV0YWJsZZGDpHR5cGWldGFibGWmaGVhZGVygqRsaW5lgaVjb2xvcqV3aGl0ZaRmaWxsgaVjb2xvcqcjQzhENEUzpWNlbGxzgqRsaW5lgaVjb2xvcqV3aGl0ZaRmaWxsgaVjb2xvcqcjRUJGMEY4qXNjYXR0ZXIzZJGDpGxpbmWBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZalzY2F0dGVyM2SmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqGJhcnBvbGFykYKkdHlwZahiYXJwb2xhcqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKlzY2F0dGVyZ2yRgqR0eXBlqXNjYXR0ZXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACraGlzdG9ncmFtMmSRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWraGlzdG9ncmFtMmSqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa5zY2F0dGVydGVybmFyeZGCpHR5cGWuc2NhdHRlcnRlcm5hcnmmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApnhheGlzMoaodGlja3ZhbHPHDBcAAEC/AAAAAAAAQD+odGlja21vZGWlYXJyYXmldGl0bGWBpHRleHSmeCBbbW1dpmRvbWFpbtcXzcwMPwAAgD+lcmFuZ2XXFwAAwL8AAMA/pmFuY2hvcqJ5MqZtYXJnaW6EoWzKQkgAAKFiykJIAAChcspCSAAAoXTKQnAAAKZ5YXhpczKGqHRpY2t2YWxzxwwXAABoQgCAg0MAALpCqHRpY2ttb2RlpWFycmF5pXRpdGxlgaR0ZXh0p1QyIFttc12mZG9tYWlu1xcAAAAAAACAP6VyYW5nZdcXAAAAAAAAlkOmYW5jaG9yongyq2Fubm90YXRpb25zkomneWFuY2hvcqZib3R0b22neGFuY2hvcqZjZW50ZXKheco/gAAApGZvbnSBpHNpemXKQYAAAKlzaG93YXJyb3fCpHlyZWalcGFwZXKkdGV4dLRUMSBtYXAgb2YgMUQg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L0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQ6R0eXBlp3NjYXR0ZXKleWF4aXOieTGmbWFya2VyhqVjb2xvcsgMgBcAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAA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aEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukKkdHlwZadzY2F0dGVypXlheGlzonkypm1hcmtlcoalY29sb3LIDIAXAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukKoY29sb3JiYXKCpXRpdGxlolQyqnRpY2tzdWZmaXiibXOkY21pbsoAAAAAqmNvbG9yc2NhbGWUksoAAAAApWJsYWNrkso+YdM5pGJsdWWSyj61DKelZ3JlZW6Syj+AAACjcmVkpGNtYXjKQ4OAAKlzaG93c2NhbGXC2TUwYmNkOGU5MC04MTgxLTExZWYtMjRjMC1mMTRmNmE0ZDMwODQvZTc2ZTk3YmUyMWNjODk1MISmbGF5b3V0iKV4YXhpc4WodGlja3ZhbHPHFBcAAKBBAAACQwAAFkMAADRDAABwQ6h0aWNrbW9kZaVhcnJheaV0aXRsZbdGYXRTYXQgZmxpcCBhbmdsZSBbZGVnXaVyYW5nZdcXAACgQQAAcEOpY29uc3RyYWlupmRvbWFpbqlob3Zlcm1vZGWpeCB1bmlmaWVkpGZvbnSEpmZhbWlsealDTVUgU2VyaWarc2NhbGVhbmNob3KheKpzY2FsZXJhdGlvyj+AAACkc2l6ZcpBgAAAqHRlbXBsYXRlgqZsYXlvdXTeABOpY29sb3JheGlzgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApXhheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Zalob3Zlcm1vZGWnY2xvc2VzdK1wYXBlcl9iZ2NvbG9ypXdoaXRlo2dlb4apc2hvd2xha2Vzw6hzaG93bGFuZMOpbGFuZGNvbG9ypyNFNUVDRjanYmdjb2xvcqV3aGl0ZaxzdWJ1bml0Y29sb3Kld2hpdGWpbGFrZWNvbG9ypXdoaXRlqmNvbG9yc2NhbGWDqnNlcXVlbnRpYWyaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGpZGl2ZXJnaW5nm5LKAAAAAKcjOGUwMTUykso9zMzNpyNjNTFiN2SSyj5MzM2nI2RlNzdhZZLKPpmZmqcjZjFiNmRhkso+zMzNpyNmZGUwZWaSyj8AAACnI2Y3ZjdmN5LKPxmZmqcjZTZmNWQwkso/MzMzpyNiOGUxODaSyj9MzM2nIzdmYmM0MZLKP2ZmZqcjNGQ5MjIxkso/gAAApyMyNzY0MTmvc2VxdWVudGlhbG1pbnVzmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxpXlheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Za1zaGFwZWRlZmF1bHRzgaRsaW5lgaVjb2xvcqcjMmEzZjVmqmhvdmVybGFiZWyBpWFsaWdupGxlZnSmbWFwYm94gaVzdHlsZaVsaWdodKVwb2xhcoOrYW5ndWxhcmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqpyYWRpYWxheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0Za9hdXRvdHlwZW51bWJlcnOmc3RyaWN0pGZvbnSBpWNvbG9ypyMyYTNmNWandGVybmFyeYSlYWF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqVjYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWlYmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlsmFubm90YXRpb25kZWZhdWx0c4OpYXJyb3doZWFkygAAAACqYXJyb3d3aWR0aMo/gAAAqmFycm93Y29sb3KnIzJhM2Y1ZqxwbG90X2JnY29sb3KnI0U1RUNGNqV0aXRsZYGheMo9TMzNpXNjZW5lg6V4YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWlemF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXlheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0Zahjb2xvcndheZqnIzYzNmVmYacjRUY1NTNCpyMwMGNjOTanI2FiNjNmYacjRkZBMTVBpyMxOWQzZjOnI0ZGNjY5MqcjQjZFODgwpyNGRjk3RkanI0ZFQ0I1MqRkYXRh3gAZrnNjYXR0ZXJwb2xhcmdskYKkdHlwZa5zY2F0dGVycG9sYXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmY2FycGV0kYOlYmF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaR0eXBlpmNhcnBldKVhYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlrHNjYXR0ZXJwb2xhcpGCpHR5cGWsc2NhdHRlcnBvbGFypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKlwYXJjb29yZHORgqRsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpcGFyY29vcmRzp3NjYXR0ZXKRgqR0eXBlp3NjYXR0ZXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAsmhpc3RvZ3JhbTJkY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZbJoaXN0b2dyYW0yZGNvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMadjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2NvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVyY2FycGV0kYKkdHlwZa1zY2F0dGVyY2FycGV0pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZtZXNoM2SRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWmbWVzaDNkp3N1cmZhY2WRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnc3VyZmFjZapjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJtYXBib3iRgqR0eXBlrXNjYXR0ZXJtYXBib3imbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqnNjYXR0ZXJnZW+RgqR0eXBlqnNjYXR0ZXJnZW+mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqWhpc3RvZ3JhbZGCpHR5cGWpaGlzdG9ncmFtpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKNwaWWRgqR0eXBlo3BpZaphdXRvbWFyZ2luw6pjaG9yb3BsZXRokYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqmNob3JvcGxldGipaGVhdG1hcGdskYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqWhlYXRtYXBnbKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxo2JhcpGEpHR5cGWjYmFyp2Vycm9yX3mBpWNvbG9ypyMyYTNmNWanZXJyb3JfeIGlY29sb3KnIzJhM2Y1ZqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKdoZWF0bWFwkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2hlYXRtYXCqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1jb250b3VyY2FycGV0kYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlrWNvbnRvdXJjYXJwZXSldGFibGWRg6R0eXBlpXRhYmxlpmhlYWRlcoKkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0M4RDRFM6VjZWxsc4KkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0VCRjBGOKlzY2F0dGVyM2SRg6RsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpc2NhdHRlcjNkpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKhiYXJwb2xhcpGCpHR5cGWoYmFycG9sYXKmbWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACpc2NhdHRlcmdskYKkdHlwZalzY2F0dGVyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAq2hpc3RvZ3JhbTJkkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlq2hpc3RvZ3JhbTJkqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGuc2NhdHRlcnRlcm5hcnmRgqR0eXBlrnNjYXR0ZXJ0ZXJuYXJ5pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZoZWlnaHTKQ8gAAKZtYXJnaW6EoWzKQkgAAKFiykJIAAChcspCSAAAoXTKQnAAAKV5YXhpc4OodGlja21vZGWlYXJyYXmldGl0bGWtU2lnbmFsIFthLnUuXaVyYW5nZdcXAAAAAM3MzD6ld2lkdGjKRBYAAKZjb25maWeFqHNob3dMaW5rwqhlZGl0YWJsZcKqcmVzcG9uc2l2ZcOqc3RhdGljUGxvdMKqc2Nyb2xsWm9vbcOmZnJhbWVzkKRkYXRhmIakbGluZYGlY29sb3KkYmx1ZaF5xzAXtnfUPR/90z0tOtM9uUDSPcYl0T0N/s89xdrOPe/GzT2Cxcw9TtHLPdXdyj3Q2ck9pHR5cGWnc2NhdHRlcqRuYW1lqk15b2NhcmRpdW2rbGVnZW5kZ3JvdXCqTXlvY2FyZGl1baF4xzAXAACgQQAAIEIA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u864Pmkmzz7lj90+pHR5cGWnc2NhdHRlcqRuYW1lsUZhdCAoVOKCgT0xMzAgbXMppGZpbGymdG9zZWxmqWhvdmVyaW5mb6Rub25lq2xlZ2VuZGdyb3VwsUZhdCAoVOKCgT0xMzAgbXMpoXjHYBcAAKBBAAAgQgAAcEIAAKBCAADIQgAA8EIAAAxDAAAgQwAANEMAAEhDAABcQwAAcEMAAHBDAABcQwAASEMAADRDAAAgQwAADEMAAPBCAADIQgAAoEIAAHBCAAAgQgAAoEHZNTBiY2Q4ZTkwLTgxODEtMTFlZi0yNGMwLWYxNGY2YTRkMzA4NC84MjQxM2MwODU2OTEwOTQyhKZsYXlvdXSHpXhheGlzha5zaG93dGlja2xhYmVsc8KlcmFuZ2XXFwAAQEAAAFBApmRvbWFpbpLKAAAAAMo/gAAAp21hdGNoZXOieDKmYW5jaG9yoXmmeGF4aXMygqZkb21haW6SygAAAADKP4AAAKZhbmNob3KieTKodGVtcGxhdGWCpmxheW91dN4AE6ljb2xvcmF4aXOBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACleGF4aXOHqWdyaWRjb2xvcqV3aGl0Za16ZXJvbGluZXdpZHRoykAAAACldGl0bGWBqHN0YW5kb2ZmykFwAACldGlja3OgrXplcm9saW5lY29sb3Kld2hpdGWqYXV0b21hcmdpbsOpbGluZWNvbG9ypXdoaXRlqWhvdmVybW9kZadjbG9zZXN0rXBhcGVyX2JnY29sb3Kld2hpdGWjZ2VvhqlzaG93bGFrZXPDqHNob3dsYW5kw6lsYW5kY29sb3KnI0U1RUNGNqdiZ2NvbG9ypXdoaXRlrHN1YnVuaXRjb2xvcqV3aGl0ZalsYWtlY29sb3Kld2hpdGWqY29sb3JzY2FsZYOqc2VxdWVudGlhbJqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMalkaXZlcmdpbmebksoAAAAApyM4ZTAxNTKSyj3MzM2nI2M1MWI3ZJLKPkzMzacjZGU3N2Flkso+mZmapyNmMWI2ZGGSyj7MzM2nI2ZkZTBlZpLKPwAAAKcjZjdmN2Y3kso/GZmapyNlNmY1ZDCSyj8zMzOnI2I4ZTE4NpLKP0zMzacjN2ZiYzQxkso/ZmZmpyM0ZDkyMjGSyj+AAACnIzI3NjQxOa9zZXF1ZW50aWFsbWludXOaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGleWF4aXOHqWdyaWRjb2xvcqV3aGl0Za16ZXJvbGluZXdpZHRoykAAAACldGl0bGWBqHN0YW5kb2ZmykFwAACldGlja3OgrXplcm9saW5lY29sb3Kld2hpdGWqYXV0b21hcmdpbsOpbGluZWNvbG9ypXdoaXRlrXNoYXBlZGVmYXVsdHOBpGxpbmWBpWNvbG9ypyMyYTNmNWaqaG92ZXJsYWJlbIGlYWxpZ26kbGVmdKZtYXBib3iBpXN0eWxlpWxpZ2h0pXBvbGFyg6thbmd1bGFyYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWnYmdjb2xvcqcjRTVFQ0Y2qnJhZGlhbGF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlr2F1dG90eXBlbnVtYmVyc6ZzdHJpY3SkZm9udIGlY29sb3KnIzJhM2Y1Zqd0ZXJuYXJ5hKVhYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWnYmdjb2xvcqcjRTVFQ0Y2pWNheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZaViYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWyYW5ub3RhdGlvbmRlZmF1bHRzg6lhcnJvd2hlYWTKAAAAAKphcnJvd3dpZHRoyj+AAACqYXJyb3djb2xvcqcjMmEzZjVmrHBsb3RfYmdjb2xvcqcjRTVFQ0Y2pXRpdGxlgaF4yj1MzM2lc2NlbmWDpXhheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0ZaV6YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWleWF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlqGNvbG9yd2F5mqcjNjM2ZWZhpyNFRjU1M0KnIzAwY2M5NqcjYWI2M2ZhpyNGRkExNUGnIzE5ZDNmM6cjRkY2NjkypyNCNkU4ODCnI0ZGOTdGRqcjRkVDQjUypGRhdGHeABmuc2NhdHRlcnBvbGFyZ2yRgqR0eXBlrnNjYXR0ZXJwb2xhcmdspm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZjYXJwZXSRg6ViYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlpHR5cGWmY2FycGV0pWFheGlzhalncmlkY29sb3Kld2hpdGWsZW5kbGluZWNvbG9ypyMyYTNmNWaubWlub3JncmlkY29sb3Kld2hpdGWuc3RhcnRsaW5lY29sb3KnIzJhM2Y1ZqlsaW5lY29sb3Kld2hpdGWsc2NhdHRlcnBvbGFykYKkdHlwZaxzY2F0dGVycG9sYXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqXBhcmNvb3Jkc5GCpGxpbmWBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZalwYXJjb29yZHOnc2NhdHRlcpGCpHR5cGWnc2NhdHRlcqZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACyaGlzdG9ncmFtMmRjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlsmhpc3RvZ3JhbTJkY29udG91cqpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxp2NvbnRvdXKRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnY29udG91cqpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJjYXJwZXSRgqR0eXBlrXNjYXR0ZXJjYXJwZXSmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApm1lc2gzZJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZaZtZXNoM2Snc3VyZmFjZZGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadzdXJmYWNlqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtc2NhdHRlcm1hcGJveJGCpHR5cGWtc2NhdHRlcm1hcGJveKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACqc2NhdHRlcmdlb5GCpHR5cGWqc2NhdHRlcmdlb6ZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACpaGlzdG9ncmFtkYKkdHlwZaloaXN0b2dyYW2mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAo3BpZZGCpHR5cGWjcGllqmF1dG9tYXJnaW7DqmNob3JvcGxldGiRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWqY2hvcm9wbGV0aKloZWF0bWFwZ2yRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpaGVhdG1hcGdsqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGjYmFykYSkdHlwZaNiYXKnZXJyb3JfeYGlY29sb3KnIzJhM2Y1ZqdlcnJvcl94gaVjb2xvcqcjMmEzZjVmpm1hcmtlcoGkbGluZYKlY29sb3KnI0U1RUNGNqV3aWR0aMo/AAAAp2hlYXRtYXCRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnaGVhdG1hcKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrWNvbnRvdXJjYXJwZXSRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWtY29udG91cmNhcnBldKV0YWJsZZGDpHR5cGWldGFibGWmaGVhZGVygqRsaW5lgaVjb2xvcqV3aGl0ZaRmaWxsgaVjb2xvcqcjQzhENEUzpWNlbGxzgqRsaW5lgaVjb2xvcqV3aGl0ZaRmaWxsgaVjb2xvcqcjRUJGMEY4qXNjYXR0ZXIzZJGDpGxpbmWBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZalzY2F0dGVyM2SmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqGJhcnBvbGFykYKkdHlwZahiYXJwb2xhcqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKlzY2F0dGVyZ2yRgqR0eXBlqXNjYXR0ZXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACraGlzdG9ncmFtMmSRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWraGlzdG9ncmFtMmSqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa5zY2F0dGVydGVybmFyeZGCpHR5cGWuc2NhdHRlcnRlcm5hcnmmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAq2Fubm90YXRpb25zkomneWFuY2hvcqZib3R0b22neGFuY2hvcqZjZW50ZXKheco/gAAApGZvbnSBpHNpemXKQYAAAKR5cmVmpXBhcGVyqXNob3dhcnJvd8KkdGV4dKNNeHmkeHJlZqVwYXBlcqF4yj8AAACJp3lhbmNob3KmYm90dG9tp3hhbmNob3KmY2VudGVyoXnKPuZmZqRmb250gaRzaXplykGAAACkeXJlZqVwYXBlcqlzaG93YXJyb3fCpHRleHSiTXqkeHJlZqVwYXBlcqF4yj8AAACmbWFyZ2luhKFsykJIAAChYspCSAAAoXLKQkgAAKF0ykJw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dHRvbad4YW5jaG9ypXJpZ2h0oXnKP4AAAKdiZ2NvbG9yrXJnYmEoMCwwLDAsMCmrb3JpZW50YXRpb26haKF4ygAAAACpaG92ZXJtb2Rlp2Nsb3Nlc3StcGFwZXJfYmdjb2xvcq1yZ2JhKDAsMCwwLDApqHRlbXBsYXRlgqZsYXlvdXTeABOpY29sb3JheGlzgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApXhheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Zalob3Zlcm1vZGWnY2xvc2VzdK1wYXBlcl9iZ2NvbG9ypXdoaXRlo2dlb4apc2hvd2xha2Vzw6hzaG93bGFuZMOpbGFuZGNvbG9ypyNFNUVDRjanYmdjb2xvcqV3aGl0ZaxzdWJ1bml0Y29sb3Kld2hpdGWpbGFrZWNvbG9ypXdoaXRlqmNvbG9yc2NhbGWDqnNlcXVlbnRpYWyaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGpZGl2ZXJnaW5nm5LKAAAAAKcjOGUwMTUykso9zMzNpyNjNTFiN2SSyj5MzM2nI2RlNzdhZZLKPpmZmqcjZjFiNmRhkso+zMzNpyNmZGUwZWaSyj8AAACnI2Y3ZjdmN5LKPxmZmqcjZTZmNWQwkso/MzMzpyNiOGUxODaSyj9MzM2nIzdmYmM0MZLKP2ZmZqcjNGQ5MjIxkso/gAAApyMyNzY0MTmvc2VxdWVudGlhbG1pbnVzmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxpXlheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Za1zaGFwZWRlZmF1bHRzgaRsaW5lgaVjb2xvcqcjMmEzZjVmqmhvdmVybGFiZWyBpWFsaWdupGxlZnSmbWFwYm94gaVzdHlsZaVsaWdodKVwb2xhcoOrYW5ndWxhcmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqpyYWRpYWxheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0Za9hdXRvdHlwZW51bWJlcnOmc3RyaWN0pGZvbnSBpWNvbG9ypyMyYTNmNWandGVybmFyeYSlYWF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqVjYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWlYmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlsmFubm90YXRpb25kZWZhdWx0c4OpYXJyb3doZWFkygAAAACqYXJyb3d3aWR0aMo/gAAAqmFycm93Y29sb3KnIzJhM2Y1ZqxwbG90X2JnY29sb3KnI0U1RUNGNqV0aXRsZYGheMo9TMzNpXNjZW5lg6V4YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWlemF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXlheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0Zahjb2xvcndheZqnIzYzNmVmYacjRUY1NTNCpyMwMGNjOTanI2FiNjNmYacjRkZBMTVBpyMxOWQzZjOnI0ZGNjY5MqcjQjZFODgwpyNGRjk3RkanI0ZFQ0I1MqRkYXRh3gAZrnNjYXR0ZXJwb2xhcmdskYKkdHlwZa5zY2F0dGVycG9sYXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmY2FycGV0kYOlYmF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaR0eXBlpmNhcnBldKVhYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlrHNjYXR0ZXJwb2xhcpGCpHR5cGWsc2NhdHRlcnBvbGFypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKlwYXJjb29yZHORgqRsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpcGFyY29vcmRzp3NjYXR0ZXKRgqR0eXBlp3NjYXR0ZXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAsmhpc3RvZ3JhbTJkY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZbJoaXN0b2dyYW0yZGNvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMadjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2NvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVyY2FycGV0kYKkdHlwZa1zY2F0dGVyY2FycGV0pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZtZXNoM2SRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWmbWVzaDNkp3N1cmZhY2WRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnc3VyZmFjZapjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJtYXBib3iRgqR0eXBlrXNjYXR0ZXJtYXBib3imbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqnNjYXR0ZXJnZW+RgqR0eXBlqnNjYXR0ZXJnZW+mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqWhpc3RvZ3JhbZGCpHR5cGWpaGlzdG9ncmFtpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKNwaWWRgqR0eXBlo3BpZaphdXRvbWFyZ2luw6pjaG9yb3BsZXRokYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqmNob3JvcGxldGipaGVhdG1hcGdskYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqWhlYXRtYXBnbKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxo2JhcpGEpHR5cGWjYmFyp2Vycm9yX3mBpWNvbG9ypyMyYTNmNWanZXJyb3JfeIGlY29sb3KnIzJhM2Y1ZqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKdoZWF0bWFwkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2hlYXRtYXCqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1jb250b3VyY2FycGV0kYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlrWNvbnRvdXJjYXJwZXSldGFibGWRg6R0eXBlpXRhYmxlpmhlYWRlcoKkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0M4RDRFM6VjZWxsc4KkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0VCRjBGOKlzY2F0dGVyM2SRg6RsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpc2NhdHRlcjNkpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKhiYXJwb2xhcpGCpHR5cGWoYmFycG9sYXKmbWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACpc2NhdHRlcmdskYKkdHlwZalzY2F0dGVyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAq2hpc3RvZ3JhbTJkkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlq2hpc3RvZ3JhbTJkqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGuc2NhdHRlcnRlcm5hcnmRgqR0eXBlrnNjYXR0ZXJ0ZXJuYXJ5pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZsZWdlbmSFp3lhbmNob3KmYm90dG9tp3hhbmNob3KkbGVmdKF5yj+AAACrb3JpZW50YXRpb26haKF4ygAAAACleWF4aXODqWdyaWRjb2xvcqV3aGl0Za16ZXJvbGluZWNvbG9ypXdoaXRlqmZpeGVkcmFuZ2XCpGZvbnSBpWNvbG9ypGdyYXmldGl0bGWgrHBsb3RfYmdjb2xvcrByZ2IoMjI5LDIzNiwyNDYppm1hcmdpboShbMoAAAAAoWLKAAAAAKFyygAAAAChdMoAAAAApmNvbmZpZ4i2bW9kZUJhckJ1dHRvbnNUb1JlbW92ZZqkem9vbahzZWxlY3QyZKdsYXNzbzJkqWF1dG9TY2FsZaxyZXNldFNjYWxlMmSjcGFurXRhYmxlUm90YXRpb26zcmVzZXRDYW1lcmFMYXN0U2F2ZaZ6b29tSW6nem9vbU91dKtkaXNwbGF5bG9nb8K0dG9JbWFnZUJ1dHRvbk9wdGlvbnOBpmZvcm1hdKNzdmeoc2hvd0xpbmvCqGVkaXRhYmxlwqpyZXNwb25zaXZlw6pzdGF0aWNQbG90wqpzY3JvbGxab29tw6ZmcmFtZXOQpGRhdGGXiqpzaG93bGVnZW5kw6ZtYXJrZXKBpWNvbG9ypyM2MzZFRkGleGF4aXOheKF5yAgQFwAAgH8AAIB/AACAfwAAgH8AAIB/AAAAAAAAAEEAAABBAAAAAAAAgH8AAIB/AAAAAAAAAMEAAADBAAAAAAAAgH8AAIB/AACAfwAAAAAAAABBAAAAQQAAAAAAAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AAAAAAAAAEEAAABBAAAAAAAAgH8AAIB/AAAAAAAAAMEAAADBAAAAAAAAgH8AAIB/AACAfwAAAAAAAABBAAAAQQAAAAAAAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AAAAAAAAAEEAAABBAAAAAAAAgH8AAIB/AAAAAAAAAMEAAADBAAAAAAAAgH8AAIB/AACAfwAAAAAAAABBAAAAQQAAAAAAAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AAAAAAAAAEEAAABBAAAAAAAAgH8AAIB/AAAAAAAAAMEAAADBAAAAAAAAgH8AAIB/AACAfwAAAAAAAABBAAAAQQAAAAAAAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAf6R0eXBlp3NjYXR0ZXKkbmFtZaJHeKV5YXhpc6F5q2xlZ2VuZGdyb3Vwokd4rWhvdmVydGVtcGxhdGW8KCV7eDouNGZ9IG1zLCAle3k6LjJmfSBtVC9tKaF4yAgQFwAAgH8AAIB/AACAfwAAgH8AAIB/AABKQmZmTEJmZmRCzcxmQgAAgH8AAIB/081mQtPNaELTzXRC0812QgAAgH8AAIB/AACAf+mmsELpprFC6aa3QummuEIAAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AFCDRDNjg0QzI4REZjaERAAAgH8AAIB/bzaERG9GhERvpoREb7aERAAAgH8AAIB/AACAf28KiERvGohEb3qIRG+KiEQAAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/ACgARZoxAEWakQBFM5sARQAAgH8AAIB/N5sARTejAEU30wBFN9sARQAAgH8AAIB/AACAfzeFAkU3jQJFN70CRTfFAkUAAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AKg+RZqxPkWaET9FMxs/RQAAgH8AAIB/Nxs/RTcjP0U3Uz9FN1s/RQAAgH8AAIB/AACAfzcFQUU3DUFFNz1BRTdFQUUAAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAf4qqc2hvd2xlZ2VuZMOmbWFya2VygaVjb2xvcqcjRUY1NTNCpXhheGlzoXihecgHUBcAAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH+kdHlwZadzY2F0dGVypG5hbWWiR3mleWF4aXOheatsZWdlbmRncm91cKJHea1ob3ZlcnRlbXBsYXRlvCgle3g6LjRmfSBtcywgJXt5Oi4yZn0gbVQvbSmheMgHUBcAAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH+KqnNob3dsZWdlbmTDpm1hcmtlcoGlY29sb3KnIzAwQ0M5NqV4YXhpc6F4oXnIB1AXAACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/pHR5cGWnc2NhdHRlcqRuYW1lokd6pXlheGlzoXmrbGVnZW5kZ3JvdXCiR3qtaG92ZXJ0ZW1wbGF0ZbwoJXt4Oi40Zn0gbXMsICV7eTouMmZ9IG1UL20poXjIB1AXAACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/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40hFoutIRaLrSEUAAIB/AACAfwAAgH8AAIB/bzhJRW84SUVvQElFb0BJRQAAgH8AAIB/AACAfwAAgH87jUlFO41JRTuVSUU7lUlFAACAfwAAgH8AAIB/AACAfwAAgH+MqnNob3dsZWdlbmTDpXhheGlzoXindmlzaWJsZapsZWdlbmRvbmx5pG5hbWWo4oigQjFfQU2kdGV4dMgSsBcAAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAP6V5YXhpc6F5q2xlZ2VuZGdyb3VwqOKIoEIxX0FNpm1hcmtlcoGlY29sb3KnI0ZGQTE1QaF5yBKwFwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAAADbD8k/2w/JPwAAAAAAAIB/AACAfwAAAADbD0lA2w9JQAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAANsPSUDbD0lAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAADbD0lA2w9JQAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAA2w9JQNsPSUAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAANsPSUDbD0lAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAADbD0lA2w9JQAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAA2w9JQNsPSUAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAANsPSUDbD0lAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAADbD0lA2w9JQAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAA2w9JQNsPSUAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAANsPSUDbD0lAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAADbD0lA2w9JQAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAA2w9JQNsPSUAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAANsPSUDbD0lAAAAAAAAAgH8AAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AAAAANsPyT/bD8k/AAAAAAAAgH8AAIB/AAAAANsPSUDbD0lAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAA2w9JQNsPSUAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAANsPSUDbD0lAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAADbD0lA2w9JQAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAA2w9JQNsPSUAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAANsPSUDbD0lAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAADbD0lA2w9JQAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAA2w9JQNsPSUAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAANsPSUDbD0lAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAADbD0lA2w9JQAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAA2w9JQNsPSUAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAANsPSUDbD0lAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAADbD0lA2w9JQAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAA2w9JQNsPSUAAAAAAAACAfwAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAAAA2w/JP9sPyT8AAAAAAACAfwAAgH8AAAAA2w9JQNsPSUAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAADbD0lA2w9JQAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAA2w9JQNsPSUAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAANsPSUDbD0lAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAADbD0lA2w9JQAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAA2w9JQNsPSUAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAANsPSUDbD0lAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAADbD0lA2w9JQAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAA2w9JQNsPSUAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAANsPSUDbD0lAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAADbD0lA2w9JQAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAA2w9JQNsPSUAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAANsPSUDbD0lAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAADbD0lA2w9JQAAAAAAAAIB/AACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAAADbD8k/2w/JPwAAAAAAAIB/AACAfwAAAADbD0lA2w9JQAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAANsPSUDbD0lAAAAAAAAAgH8A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AACAfwAAgH9vkEdFb5BHRW+YR0VvmEdFAACAfwAAgH8AAIB/AACAfzvlR0U75UdFO+1HRTvtR0UAAIB/AACAfwAAgH8AAIB/CDpIRQg6SEUIQkhFCEJIRQAAgH8AAIB/AACAfwAAgH/VjkhF1Y5IRdWWSEXVlkhFAACAfwAAgH8AAIB/AACAf6LjSEWi40hFoutIRaLrSEUAAIB/AACAfwAAgH8AAIB/bzhJRW84SUVvQElFb0BJRQAAgH8AAIB/AACAfwAAgH87jUlFO41JRTuVSUU7lUlFAACAfwAAgH8AAIB/AACAfwAAgH+NqnNob3dsZWdlbmTDpXhheGlzoXindmlzaWJsZapsZWdlbmRvbmx5pG5hbWWlQjFfRk2kdGV4dMgO0BcAAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD+leWF4aXOheatsZWdlbmRncm91cKVCMV9GTaZtYXJrZXKBpWNvbG9ypyNBQjYzRkGkbGluZYGkZGFzaKNkb3ShecgO0BcAAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAC+D6O9vg+jvQAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAC+D6O9vg+jvQAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAC+D6O9vg+jvQAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAC+D6O9vg+jvQAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACA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fwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIB/AACAfwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAfwAAgH8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgH8AAIB/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIB/AACAfwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAfwAAgH8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgH8AAIB/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIB/pHR5cGWnc2NhdHRlcq1ob3ZlcnRlbXBsYXRltSgle3g6LjRmfSBt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YXRpbmcuLi4bWzIybQobWzkwbT09PRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTExWTUxvb3BJbmZvIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4wLjAKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBIeXBlcnNjcmlwdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMC41ICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBQbG90bHlLYWxlaWRvIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2Mi4yLjQKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBNUklCYXNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC40LjMKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBJbmxpbmVTdHJpbmdzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS40LjEKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBPZmZzZXRBcnJheXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjE0LjAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBBY2Nlc3NvcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjEuMzYKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBOVlRYX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjMuMS4wKzIgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBJbnZlcnRlZEluZGljZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjMuMCAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gRGF0YUZyYW1lcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNi4xCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQmFzZURpcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjIuNCAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIENvbmN1cnJlbnRVdGlsaXRpZXMg4pSA4pSA4pSA4pSAIHYyLjQuMSAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIFN0YXRpY0FycmF5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuOS41ICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gUHJvZ3Jlc3NNZXRlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMTAuMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEJGbG9hdDE2cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNS4wChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gR1BVQXJyYXlzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MTAuMi4wCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQ29sb3JTY2hlbWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2My4yNS4wICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBSYW5kb21OdW1iZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS41LjMgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBQbHV0b1VJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC43LjU5ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gU2ltcGxlQnVmZmVyU3RyZWFtIOKUgOKUgOKUgOKUgOKUgCB2MS4xLjAKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBUcmlja3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjEuOCAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEludGVsT3Blbk1QX2psbCDilIDilIDilIDilIDilIDilIDilIDilIAgdjIwMjQuMS4wKzAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ1VEQV9SdW50aW1lX2psbCDilIDilIDilIDilIDilIDilIDilIAgdjAuMTQuMCsxChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gRnVuY3RvcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjQuMTEKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBMTFZNIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2Ny4yLjEKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBId2xvY19qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYyLjEwLjArMCAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIENVREFfRHJpdmVyX2psbCDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuOS4wKzAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQnVmZmVyZWRTdHJlYW1zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4yLjEKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBSYW5kb20xMjMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjcuMCAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFNlbnRpbmVsQXJyYXlzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS40LjMKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBDb21wYXQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHY0LjE1LjAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENvZGVjWmxpYiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNy40CiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQ1VEQV9SdW50aW1lX0Rpc2NvdmVyeSDilIAgdjAuMy40ICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgVHJhbnNjb2RpbmdTdHJlYW1zIOKUgOKUgOKUgOKUgOKUgCB2MC4xMC45ICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBVbnNhZmVBdG9taWNzTExWTSDilIDilIDilIDilIDilIDilIAgdjAuMS40ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTXVzdGFjaGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjAuMTkKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBQcmV0dHlUYWJsZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYyLjMuMgogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEJhbmdCYW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC40LjIgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBNUElDSF9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHY0LjIuMSsxChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gUG9vbGVkQXJyYXlzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS40LjMKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBKTExXcmFwcGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNS4wICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgUGxvdGx5SlMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjE4LjEzICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIE5WVFgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjMuNCAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIE1LTF9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYyMDI0LjEuMCswICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIE9wZW5NUElfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2NS4wLjMrMCAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBMTFZNRXh0cmFfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4wLjI5KzAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBDb25zdHJ1Y3Rpb25CYXNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS41LjUKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBLb21hTVJJQ29yZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuOC4zChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ2hhaW5SdWxlc0NvcmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjI0LjAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBGRlRXX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjMuMy4xMCswCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQ3JheW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjQuMS4xICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gR1BVQXJyYXlzQ29yZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMS42ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gS29tYU1SSUJhc2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjguNAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIE9wZW5TU0xfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2My4wLjE0KzAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBUYWJsZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjExLjEKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBMTFZNT3Blbk1QX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjE1LjAuNyswCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgTVBJdHJhbXBvbGluZV9qbGwg4pSA4pSA4pSA4pSA4pSA4pSAIHY1LjQuMCswICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEp1bGlhTlZUWENhbGxiYWNrc19qbGwg4pSAIHYwLjIuMSswChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gS2VybmVsQWJzdHJhY3Rpb25zIOKUgOKUgOKUgOKUgOKUgCB2MC45LjIxChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gU3VwcHJlc3NvciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMi43ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gSW52ZXJzZUZ1bmN0aW9ucyDilIDilIDilIDilIDilIDilIDilIAgdjAuMS4xNAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEdQVUNvbXBpbGVyIOKUgOKUgOKUgOKUgOKU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bSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTVJJQmFzZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNC4zChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gSW5saW5lU3RyaW5ncyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNC4xChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gT2Zmc2V0QXJyYXlzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4xNC4wChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQWNjZXNzb3JzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xLjM2CiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgTlZUWF9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYzLjEuMCsyICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgSW52ZXJ0ZWRJbmRpY2VzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4zLjAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIERhdGFGcmFtZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjYuMQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEJhc2VEaXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4yLjQgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBDb25jdXJyZW50VXRpbGl0aWVzIOKUgOKUgOKUgOKUgCB2Mi40LjEgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBTdGF0aWNBcnJheXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjkuNSAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFByb2dyZXNzTWV0ZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjEwLjAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBCRmxvYXQxNnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjUuMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEdQVUFycmF5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEwLjIuMAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIENvbG9yU2NoZW1lcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjMuMjUuMCAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgUmFuZG9tTnVtYmVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNS4zICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gUGx1dG9VSSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNy41OQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFNpbXBsZUJ1ZmZlclN0cmVhbSDilIDilIDilIDilIDilIAgdjEuMS4wCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgVHJpY2tzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xLjggICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBJbnRlbE9wZW5NUF9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYyMDI0LjEuMCswICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENVREFfUnVudGltZV9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjE0LjArMQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEZ1bmN0b3JzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC40LjExChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTExWTSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjcuMi4xCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgSHdsb2NfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2Mi4xMC4wKzAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBDVURBX0RyaXZlcl9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjkuMCswICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEJ1ZmZlcmVkU3RyZWFtcyDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMi4xCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgUmFuZG9tMTIzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS43LjAgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBTZW50aW5lbEFycmF5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNC4zCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQ29tcGF0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2NC4xNS4wICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBDb2RlY1psaWIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjcuNAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIENVREFfUnVudGltZV9EaXNjb3Zlcnkg4pSAIHYwLjMuNCAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIFRyYW5zY29kaW5nU3RyZWFtcyDilIDilIDilIDilIDilIAgdjAuMTAuOSAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gVW5zYWZlQXRvbWljc0xMVk0g4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjEuNAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIE11c3RhY2hlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4wLjE5ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gUHJldHR5VGFibGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2Mi4zLjIKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBCYW5nQmFuZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNC4yICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTVBJQ0hfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2NC4yLjErMQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFBvb2xlZEFycmF5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNC4zCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgSkxMV3JhcHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjUuMCAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIFBsb3RseUpTIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xOC4xMyAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBOVlRYIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4zLjQgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBNS0xfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MjAyNC4xLjArMCAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBPcGVuTVBJX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjUuMC4zKzAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTExWTUV4dHJhX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMC4yOSswChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ29uc3RydWN0aW9uQmFzZSDilIDilIDilIDilIDilIDilIDilIAgdjEuNS41ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gS29tYU1SSUNvcmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjguMwobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENoYWluUnVsZXNDb3JlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4yNC4wChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gRkZUV19qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYzLjMuMTArMAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIENyYXlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHY0LjEuMSAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEdQVUFycmF5c0NvcmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjEuNgobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEtvbWFNUklCYXNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC44LjQKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBPcGVuU1NMX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjMuMC4xNCswICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gVGFibGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4xMS4xChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTExWTU9wZW5NUF9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxNS4wLjcrMAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIE1QSXRyYW1wb2xpbmVfamxsIOKUgOKUgOKUgOKUgOKUgOKUgCB2NS40LjArMCAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBKdWxpYU5WVFhDYWxsYmFja3NfamxsIOKUgCB2MC4yLjErMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEtlcm5lbEFic3RyYWN0aW9ucyDilIDilIDilIDilIDilIAgdjAuOS4yMQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFN1cHByZXNzb3Ig4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjIuNwobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEludmVyc2VGdW5jdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjEuMTQKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBHUFVDb21waWxlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMjYuNSAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gU3RyaW5nTWFuaXB1bGF0aW9uIOKUgOKUgOKUgOKUgOKUgCB2MC4zLjQKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBQbHV0b1Bsb3RseSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNC42ICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ1VEQSDilIDilIDilIDilIDilIDilIDilIDilIDilIDi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gOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xLjM2CiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgTlZUWF9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYzLjEuMCsyICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgSW52ZXJ0ZWRJbmRpY2VzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4zLjAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIERhdGFGcmFtZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjYuMQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEJhc2VEaXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4yLjQgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBDb25jdXJyZW50VXRpbGl0aWVzIOKUgOKUgOKUgOKUgCB2Mi40LjEgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBTdGF0aWNBcnJheXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjkuNSAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFByb2dyZXNzTWV0ZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjEwLjAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBCRmxvYXQxNnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjUuMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEdQVUFycmF5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEwLjIuMAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIENvbG9yU2NoZW1lcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjMuMjUuMCAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgUmFuZG9tTnVtYmVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNS4zICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gUGx1dG9VSSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNy41OQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFNpbXBsZUJ1ZmZlclN0cmVhbSDilIDilIDilIDilIDilIAgdjEuMS4wCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgVHJpY2tzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xLjggICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBJbnRlbE9wZW5NUF9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYyMDI0LjEuMCswICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENVREFfUnVudGltZV9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjE0LjArMQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEZ1bmN0b3JzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC40LjExChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTExWTSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjcuMi4xCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgSHdsb2NfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2Mi4xMC4wKzAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBDVURBX0RyaXZlcl9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjkuMCswICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEJ1ZmZlcmVkU3RyZWFtcyDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMi4xCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgUmFuZG9tMTIzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS43LjAgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBTZW50aW5lbEFycmF5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNC4zCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQ29tcGF0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2NC4xNS4wICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBDb2RlY1psaWIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjcuNAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIENVREFfUnVudGltZV9EaXNjb3Zlcnkg4pSAIHYwLjMuNCAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIFRyYW5zY29kaW5nU3RyZWFtcyDilIDilIDilIDilIDilIAgdjAuMTAuOSAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gVW5zYWZlQXRvbWljc0xMVk0g4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjEuNAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIE11c3RhY2hlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4wLjE5ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gUHJldHR5VGFibGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2Mi4zLjIKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBCYW5nQmFuZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNC4yICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTVBJQ0hfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2NC4yLjErMQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFBvb2xlZEFycmF5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNC4zCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgSkxMV3JhcHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjUuMCAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIFBsb3RseUpTIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xOC4xMyAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBOVlRYIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4zLjQgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBNS0xfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MjAyNC4xLjArMCAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBPcGVuTVBJX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjUuMC4zKzAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTExWTUV4dHJhX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMC4yOSswChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ29uc3RydWN0aW9uQmFzZSDilIDilIDilIDilIDilIDilIDilIAgdjEuNS41ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gS29tYU1SSUNvcmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjguMwobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENoYWluUnVsZXNDb3JlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4yNC4wChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gRkZUV19qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYzLjMuMTArMAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIENyYXlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHY0LjEuMSAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEdQVUFycmF5c0NvcmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjEuNgobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEtvbWFNUklCYXNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC44LjQKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBPcGVuU1NMX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjMuMC4xNCswICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gVGFibGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4xMS4xChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTExWTU9wZW5NUF9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxNS4wLjcrMAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIE1QSXRyYW1wb2xpbmVfamxsIOKUgOKUgOKUgOKUgOKUgOKUgCB2NS40LjArMCAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBKdWxpYU5WVFhDYWxsYmFja3NfamxsIOKUgCB2MC4yLjErMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEtlcm5lbEFic3RyYWN0aW9ucyDilIDilIDilIDilIDilIAgdjAuOS4yMQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFN1cHByZXNzb3Ig4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjIuNwobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEludmVyc2VGdW5jdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjEuMTQKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBHUFVDb21waWxlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMjYuNSAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gU3RyaW5nTWFuaXB1bGF0aW9uIOKUgOKUgOKUgOKUgOKUgCB2MC4zLjQKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBQbHV0b1Bsb3RseSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNC42ICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ1VEQSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjUuNC4yCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgS29tYU1SSVBsb3RzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC44LjMgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgIEJ1aWxkaW5nG1syMm0bWzM5bSBQbG90bHlKUyDihpIgYH4vLmp1bGlhL3NjcmF0Y2hzcGFjZXMvNDRjZmU5NWEtMWViMi01MmVhLWI2NzItZTJhZmRmNjliNzhmL2U2MmQ4ODZkMzNiODFjMzcxYzlkNGUyZjcwNjYzYzA2MzdmMTk0NTkvYnVpbGQubG9nYAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKG1swbRtbMW1SZXNvbHZpbmcuLi4bWzIybQobWzkwbT09PRtbMzltChtbMzJtG1sxbSAgTm8gQ2hhbmdlcxtbMjJtG1szOW0gdG8gYC90bXAvamxfQlVUM1FuL1Byb2plY3QudG9tbGAKG1szMm0bWzFtICAgIFVwZGF0aW5nG1syMm0bWzM5bSBgL3RtcC9qbF9CVVQzUW4vTWFuaWZlc3QudG9tbGAKICAbWzkwbVs4ZTg1MGI5MF0gG1szOW0bWzkzbeKGkSBsaWJibGFzdHJhbXBvbGluZV9qbGwgdjUuOC4wKzEg4oeSIHY1LjExLjArMBtbMzltCgobWzBtG1sxbVByZWNvbXBpbGluZy4uLhtbMjJtChtbOTBtPT09G1szOW0KG1szMm0bWzFtICBBY3RpdmF0aW5nG1syMm0bWzM5bSBwcm9qZWN0IGF0IGAvdG1wL2psX0JVVDNRbmAKG1szMm0bWzFtUHJlY29tcGlsaW5nG1syMm0bWzM5bSBwcm9qZWN0Li4uCiAgMTEyIGRlcGVuZGVuY2llcyBzdWNjZXNzZnVsbHkgcHJlY29tcGlsZWQgaW4gMTY2IHNlY29uZHMuIDcyIGFscmVhZHkgcHJlY29tcGlsZWQuCiAgG1szM20yG1szOW0gZGVwZW5kZW5jaWVzIGhhZCBvdXRwdXQgZHVyaW5nIHByZWNvbXBpbGF0aW9uOhtbMzNtCuKUjCAbWzM5bU1LTF9qbGwbWzMzbQrilIIgIBtbMzltRG93bmxvYWRpbmcgYXJ0aWZhY3Q6IE1LTBtbMzNtCuKUlCAgG1szOW0bWzMzbQrilIwgG1szOW1DVURBX0RyaXZlcl9qbGwbWzMzbQrilIIgIBtbMzltRG93bmxvYWRpbmcgYXJ0aWZhY3Q6IENVREFfRHJpdmVyG1szM20K4pSUICAbWzM5badQbHV0b1VJ2h5NChtbMG0bWzFtSW5zdGFudGlhdGluZy4uLhtbMjJtChtbOTBtPT09G1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBMTFZNTG9vcEluZm8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjAuMAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEh5cGVyc2NyaXB0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4wLjUgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFBsb3RseUthbGVpZG8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYyLjIuNAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIE1SSUJhc2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjQuMwobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIElubGluZVN0cmluZ3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjQuMQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIE9mZnNldEFycmF5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMTQuMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEFjY2Vzc29ycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMS4zNgogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIE5WVFhfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2My4xLjArMiAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEludmVydGVkSW5kaWNlcyDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMy4wICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBEYXRhRnJhbWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS42LjEKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBCYXNlRGlycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMi40ICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQ29uY3VycmVudFV0aWxpdGllcyDilIDilIDilIDilIAgdjIuNC4xICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgU3RhdGljQXJyYXlzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS45LjUgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBQcm9ncmVzc01ldGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4xMC4wChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQkZsb2F0MTZzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC41LjAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBHUFVBcnJheXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxMC4yLjAKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBDb2xvclNjaGVtZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYzLjI1LjAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIFJhbmRvbU51bWJlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjUuMyAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFBsdXRvVUkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjcuNTkKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBTaW1wbGVCdWZmZXJTdHJlYW0g4pSA4pSA4pSA4pSA4pSAIHYxLjEuMAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIFRyaWNrcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMS44ICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgSW50ZWxPcGVuTVBfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MjAyNC4xLjArMCAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBDVURBX1J1bnRpbWVfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xNC4wKzEKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBGdW5jdG9ycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNC4xMQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIExMVk0g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHY3LjIuMQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEh3bG9jX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjIuMTAuMCswICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQ1VEQV9Ecml2ZXJfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC45LjArMCAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBCdWZmZXJlZFN0cmVhbXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjIuMQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIFJhbmRvbTEyMyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNy4wICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gU2VudGluZWxBcnJheXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjQuMwogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIENvbXBhdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjQuMTUuMCAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ29kZWNabGliIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC43LjQKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBDVURBX1J1bnRpbWVfRGlzY292ZXJ5IOKUgCB2MC4zLjQgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBUcmFuc2NvZGluZ1N0cmVhbXMg4pSA4pSA4pSA4pSA4pSAIHYwLjEwLjkgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFVuc2FmZUF0b21pY3NMTFZNIOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xLjQKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBNdXN0YWNoZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMC4xOQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFByZXR0eVRhYmxlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjIuMy4yCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQmFuZ0Jhbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjQuMiAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIE1QSUNIX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjQuMi4xKzEKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBQb29sZWRBcnJheXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjQuMwogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEpMTFdyYXBwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS41LjAgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBQbG90bHlKUyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMTguMTMgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgTlZUWCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMy40ICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgTUtMX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjIwMjQuMS4wKzAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgT3Blbk1QSV9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHY1LjAuMyswICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIExMVk1FeHRyYV9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjAuMjkrMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENvbnN0cnVjdGlvbkJhc2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjUuNQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEtvbWFNUklDb3JlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC44LjMKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBDaGFpblJ1bGVzQ29yZSDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMjQuMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEZGVFdfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2My4zLjEwKzAKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBDcmF5b25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2NC4xLjEgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBHUFVBcnJheXNDb3JlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xLjYKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBLb21hTVJJQmFzZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuOC40CiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgT3BlblNTTF9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYzLjAuMTQrMCAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFRhYmxlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMTEuMQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIExMVk1PcGVuTVBfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MTUuMC43KzAKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBNUEl0cmFtcG9saW5lX2psbCDilIDilIDilIDilIDilIDilIAgdjUuNC4wKzAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gSnVsaWFOVlRYQ2FsbGJhY2tzX2psbCDilIAgdjAuMi4xKzAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBLZXJuZWxBYnN0cmFjdGlvbnMg4pSA4pSA4pSA4pSA4pSAIHYwLjkuMjEKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBTdXBwcmVzc29yIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4yLjcKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBJbnZlcnNlRnVuY3Rpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xLjE0CiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgR1BVQ29tcGlsZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjI2LjUgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxs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LjQuMwobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIElubGluZVN0cmluZ3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjQuMQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIE9mZnNldEFycmF5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMTQuMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEFjY2Vzc29ycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMS4zNgogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIE5WVFhfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2My4xLjArMiAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEludmVydGVkSW5kaWNlcyDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMy4wICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBEYXRhRnJhbWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS42LjEKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBCYXNlRGlycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMi40ICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQ29uY3VycmVudFV0aWxpdGllcyDilIDilIDilIDilIAgdjIuNC4xICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgU3RhdGljQXJyYXlzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS45LjUgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBQcm9ncmVzc01ldGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4xMC4wChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQkZsb2F0MTZzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC41LjAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBHUFVBcnJheXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxMC4yLjAKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBDb2xvclNjaGVtZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYzLjI1LjAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIFJhbmRvbU51bWJlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjUuMyAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFBsdXRvVUkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjcuNTkKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBTaW1wbGVCdWZmZXJTdHJlYW0g4pSA4pSA4pSA4pSA4pSAIHYxLjEuMAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIFRyaWNrcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMS44ICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgSW50ZWxPcGVuTVBfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MjAyNC4xLjArMCAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBDVURBX1J1bnRpbWVfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xNC4wKzEKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBGdW5jdG9ycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNC4xMQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIExMVk0g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHY3LjIuMQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEh3bG9jX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjIuMTAuMCswICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQ1VEQV9Ecml2ZXJfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC45LjArMCAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBCdWZmZXJlZFN0cmVhbXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjIuMQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIFJhbmRvbTEyMyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNy4wICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gU2VudGluZWxBcnJheXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjQuMwogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIENvbXBhdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjQuMTUuMCAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ29kZWNabGliIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC43LjQKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBDVURBX1J1bnRpbWVfRGlzY292ZXJ5IOKUgCB2MC4zLjQgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBUcmFuc2NvZGluZ1N0cmVhbXMg4pSA4pSA4pSA4pSA4pSAIHYwLjEwLjkgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFVuc2FmZUF0b21pY3NMTFZNIOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xLjQKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBNdXN0YWNoZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMC4xOQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFByZXR0eVRhYmxlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjIuMy4yCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQmFuZ0Jhbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjQuMiAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIE1QSUNIX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjQuMi4xKzEKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBQb29sZWRBcnJheXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjQuMwogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEpMTFdyYXBwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS41LjAgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBQbG90bHlKUyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMTguMTMgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgTlZUWCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMy40ICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgTUtMX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjIwMjQuMS4wKzAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgT3Blbk1QSV9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHY1LjAuMyswICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIExMVk1FeHRyYV9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjAuMjkrMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENvbnN0cnVjdGlvbkJhc2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjUuNQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEtvbWFNUklDb3JlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC44LjMKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBDaGFpblJ1bGVzQ29yZSDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMjQuMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEZGVFdfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2My4zLjEwKzAKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBDcmF5b25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2NC4xLjEgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBHUFVBcnJheXNDb3JlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xLjYKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBLb21hTVJJQmFzZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuOC40CiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgT3BlblNTTF9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYzLjAuMTQrMCAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFRhYmxlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMTEuMQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIExMVk1PcGVuTVBfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MTUuMC43KzAKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBNUEl0cmFtcG9saW5lX2psbCDilIDilIDilIDilIDilIDilIAgdjUuNC4wKzAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gSnVsaWFOVlRYQ2FsbGJhY2tzX2psbCDilIAgdjAuMi4xKzAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBLZXJuZWxBYnN0cmFjdGlvbnMg4pSA4pSA4pSA4pSA4pSAIHYwLjkuMjEKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBTdXBwcmVzc29yIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4yLjcKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBJbnZlcnNlRnVuY3Rpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xLjE0CiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgR1BVQ29tcGlsZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjI2LjUgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFN0cmluZ01hbmlwdWxhdGlvbiDilIDilIDilIDilIDilIAgdjAuMy40CiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgUGx1dG9QbG90bHkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjQuNiAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENVREEg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHY1LjQuMgogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEtvbWFNUklQbG90cyDi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lIDilIDilIDilIDilIDilIDilIDilIDilIAgdjMuMS4wKzIgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBJbnZlcnRlZEluZGljZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjMuMCAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gRGF0YUZyYW1lcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNi4xCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQmFzZURpcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjIuNCAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIENvbmN1cnJlbnRVdGlsaXRpZXMg4pSA4pSA4pSA4pSAIHYyLjQuMSAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIFN0YXRpY0FycmF5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuOS41ICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gUHJvZ3Jlc3NNZXRlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMTAuMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEJGbG9hdDE2cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNS4wChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gR1BVQXJyYXlzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MTAuMi4wCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQ29sb3JTY2hlbWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2My4yNS4wICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBSYW5kb21OdW1iZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS41LjMgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBQbHV0b1VJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC43LjU5ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gU2ltcGxlQnVmZmVyU3RyZWFtIOKUgOKUgOKUgOKUgOKUgCB2MS4xLjAKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBUcmlja3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjEuOCAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEludGVsT3Blbk1QX2psbCDilIDilIDilIDilIDilIDilIDilIDilIAgdjIwMjQuMS4wKzAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ1VEQV9SdW50aW1lX2psbCDilIDilIDilIDilIDilIDilIDilIAgdjAuMTQuMCsxChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gRnVuY3RvcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjQuMTEKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBMTFZNIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2Ny4yLjEKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBId2xvY19qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYyLjEwLjArMCAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIENVREFfRHJpdmVyX2psbCDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuOS4wKzAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQnVmZmVyZWRTdHJlYW1zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4yLjEKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBSYW5kb20xMjMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjcuMCAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFNlbnRpbmVsQXJyYXlzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS40LjMKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBDb21wYXQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHY0LjE1LjAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENvZGVjWmxpYiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNy40CiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQ1VEQV9SdW50aW1lX0Rpc2NvdmVyeSDilIAgdjAuMy40ICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgVHJhbnNjb2RpbmdTdHJlYW1zIOKUgOKUgOKUgOKUgOKUgCB2MC4xMC45ICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBVbnNhZmVBdG9taWNzTExWTSDilIDilIDilIDilIDilIDilIAgdjAuMS40ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTXVzdGFjaGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjAuMTkKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBQcmV0dHlUYWJsZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYyLjMuMgogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEJhbmdCYW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC40LjIgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBNUElDSF9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHY0LjIuMSsxChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gUG9vbGVkQXJyYXlzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS40LjMKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBKTExXcmFwcGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNS4wICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgUGxvdGx5SlMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjE4LjEzICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIE5WVFgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjMuNCAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIE1LTF9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYyMDI0LjEuMCswICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIE9wZW5NUElfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2NS4wLjMrMCAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBMTFZNRXh0cmFfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4wLjI5KzAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBDb25zdHJ1Y3Rpb25CYXNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS41LjUKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBLb21hTVJJQ29yZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuOC4zChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ2hhaW5SdWxlc0NvcmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjI0LjAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBGRlRXX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjMuMy4xMCswCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQ3JheW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjQuMS4xICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gR1BVQXJyYXlzQ29yZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMS42ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gS29tYU1SSUJhc2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjguNAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIE9wZW5TU0xfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2My4wLjE0KzAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBUYWJsZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjExLjEKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBMTFZNT3Blbk1QX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjE1LjAuNyswCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgTVBJdHJhbXBvbGluZV9qbGwg4pSA4pSA4pSA4pSA4pSA4pSAIHY1LjQuMCswICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEp1bGlhTlZUWENhbGxiYWNrc19qbGwg4pSAIHYwLjIuMSswChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gS2VybmVsQWJzdHJhY3Rpb25zIOKUgOKUgOKUgOKUgOKUgCB2MC45LjIxChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gU3VwcHJlc3NvciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMi43ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gSW52ZXJzZUZ1bmN0aW9ucyDilIDilIDilIDilIDilIDilIDilIAgdjAuMS4xNAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEdQVUNvbXBpbGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4yNi41ICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBTdHJpbmdNYW5pcHVsYXRpb24g4pSA4pSA4pSA4pSA4pSAIHYwLjMuNAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIFBsdXRvUGxvdGx5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC40LjYgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBDVURBIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2NS40LjIKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBLb21hTVJJUGxvdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjguMyAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICAgQnVpbGRpbmcbWzIybRtbMzltIFBsb3RseUpTIOKGkiBgfi8uanVsaWEvc2NyYXRjaHNwYWNlcy80NGNmZTk1YS0xZWIyLTUyZWEtYjY3Mi1lMmFmZGY2OWI3OGYvZTYyZDg4NmQzM2I4MWMzNzFjOWQ0ZTJmNzA2NjNjMDYzN2YxOTQ1OS9idWlsZC5sb2dgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAobWzBtG1sxbVJlc29sdmluZy4uLhtbMjJtChtbOTBtPT09G1szOW0KG1szMm0bWzFtICBObyBDaGFuZ2VzG1syMm0bWzM5bSB0byBgL3RtcC9qbF9CVVQzUW4vUHJvamVjdC50b21sYAobWzMybRtbMW0gICAgVXBkYXRpbmcbWzIybRtbMzltIGAvdG1wL2psX0JVVDNRbi9NYW5pZmVzdC50b21sYAogIBtbOTBtWzhlODUwYjkwXSAbWzM5bRtbOTNt4oaRIGxpYmJsYXN0cmFtcG9saW5lX2psbCB2NS44LjArMSDih5IgdjUuMTEuMCswG1szOW0KChtbMG0bWzFtUHJlY29tcGlsaW5nLi4uG1syMm0KG1s5MG09PT0bWzM5bQobWzMybRtbMW0gIEFjdGl2YXRpbmcbWzIybRtbMzltIHByb2plY3QgYXQgYC90bXAvamxfQlVUM1FuYAobWzMybRtbMW1QcmVjb21waWxpbmcbWzIybRtbMzltIHByb2plY3QuLi4KICAxMTIgZGVwZW5kZW5jaWVzIHN1Y2Nlc3NmdWxseSBwcmVjb21waWxlZCBpbiAxNjYgc2Vjb25kcy4gNzIgYWxyZWFkeSBwcmVjb21waWxlZC4KICAbWzMzbTIbWzM5bSBkZXBlbmRlbmNpZXMgaGFkIG91dHB1dCBkdXJpbmcgcHJlY29tcGlsYXRpb246G1szM20K4pSMIBtbMzltTUtMX2psbBtbMzNtCuKUgiAgG1szOW1Eb3dubG9hZGluZyBhcnRpZmFjdDogTUtMG1szM20K4pSUICAbWzM5bRtbMzNtCuKUjCAbWzM5bUNVREFfRHJpdmVyX2psbBtbMzNtCuKUgiAgG1szOW1Eb3dubG9hZGluZyBhcnRpZmFjdDogQ1VEQV9Ecml2ZXIbWzMzbQrilJQgIBtbMzltq1BsdXRvUGxvdGx52h5NChtbMG0bWzFtSW5zdGFudGlhdGluZy4uLhtbMjJtChtbOTBtPT09G1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBMTFZNTG9vcEluZm8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjAuMAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEh5cGVyc2NyaXB0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4wLjUgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFBsb3RseUthbGVpZG8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYyLjIuNAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIE1SSUJhc2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjQuMwobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIElubGluZVN0cmluZ3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjQuMQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIE9mZnNldEFycmF5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMTQuMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEFjY2Vzc29ycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMS4zNgogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIE5WVFhfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2My4xLjArMiAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEludmVydGVkSW5kaWNlcyDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMy4wICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBEYXRhRnJhbWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS42LjEKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBCYXNlRGlycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMi40ICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQ29uY3VycmVudFV0aWxpdGllcyDilIDilIDilIDilIAgdjIuNC4xICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgU3RhdGljQXJyYXlzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS45LjUgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBQcm9ncmVzc01ldGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4xMC4wChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQkZsb2F0MTZzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC41LjAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBHUFVBcnJheXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxMC4yLjAKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBDb2xvclNjaGVtZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYzLjI1LjAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIFJhbmRvbU51bWJlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjUuMyAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFBsdXRvVUkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjcuNTkKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBTaW1wbGVCdWZmZXJTdHJlYW0g4pSA4pSA4pSA4pSA4pSAIHYxLjEuMAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIFRyaWNrcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMS44ICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgSW50ZWxPcGVuTVBfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MjAyNC4xLjArMCAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBDVURBX1J1bnRpbWVfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xNC4wKzEKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBGdW5jdG9ycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNC4xMQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIExMVk0g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHY3LjIuMQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEh3bG9jX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjIuMTAuMCswICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQ1VEQV9Ecml2ZXJfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC45LjArMCAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBCdWZmZXJlZFN0cmVhbXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjIuMQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIFJhbmRvbTEyMyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNy4wICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gU2VudGluZWxBcnJheXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjQuMwogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIENvbXBhdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjQuMTUuMCAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ29kZWNabGliIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC43LjQKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBDVURBX1J1bnRpbWVfRGlzY292ZXJ5IOKUgCB2MC4zLjQgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBUcmFuc2NvZGluZ1N0cmVhbXMg4pSA4pSA4pSA4pSA4pSAIHYwLjEwLjkgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFVuc2FmZUF0b21pY3NMTFZNIOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xLjQKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBNdXN0YWNoZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMC4xOQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFByZXR0eVRhYmxlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjIuMy4yCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQmFuZ0Jhbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjQuMiAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIE1QSUNIX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjQuMi4xKzEKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBQb29sZWRBcnJheXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjQuMwogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEpMTFdyYXBwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS41LjAgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBQbG90bHlKUyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMTguMTMgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgTlZUWCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMy40ICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgTUtMX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjIwMjQuMS4wKzAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgT3Blbk1QSV9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHY1LjAuMyswICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIExMVk1FeHRyYV9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjAuMjkrMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENvbnN0cnVjdGlvbkJhc2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjUuNQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEtvbWFNUklDb3JlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC44LjMKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBDaGFpblJ1bGVzQ29yZSDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMjQuMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEZGVFdfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2My4zLjEwKzAKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBDcmF5b25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2NC4xLjEgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBHUFVBcnJheXNDb3JlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xLjYKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBLb21hTVJJQmFzZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuOC40CiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgT3BlblNTTF9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYzLjAuMTQrMCAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFRhYmxlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMTEuMQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIExMVk1PcGVuTVBfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MTUuMC43KzAKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBNUEl0cmFtcG9saW5lX2psbCDilIDilIDilIDilIDilIDilIAgdjUuNC4wKzAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gSnVsaWFOVlRYQ2FsbGJhY2tzX2psbCDilIAgdjAuMi4xKzAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBLZXJuZWxBYnN0cmFjdGlvbnMg4pSA4pSA4pSA4pSA4pSAIHYwLjkuMjEKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBTdXBwcmVzc29yIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4yLjcKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBJbnZlcnNlRnVuY3Rpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xLjE0CiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgR1BVQ29tcGlsZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjI2LjUgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFN0cmluZ01hbmlwdWxhdGlvbiDilIDilIDilIDilIDilIAgdjAuMy40CiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgUGx1dG9QbG90bHkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjQuNiAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENVREEg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHY1LjQuMgogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEtvbWFNUklQbG90cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuOC4zICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgICBCdWlsZGluZxtbMjJtG1szOW0gUGxvdGx5SlMg4oaSIGB+Ly5qdWxpYS9zY3JhdGNoc3BhY2VzLzQ0Y2ZlOTVhLTFlYjItNTJlYS1iNjcyLWUyYWZkZjY5Yjc4Zi9lNjJkODg2ZDMzYjgxYzM3MWM5ZDRlMmY3MDY2M2MwNjM3ZjE5NDU5L2J1aWxkLmxvZ2AKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgChtbMG0bWzFtUmVzb2x2aW5nLi4uG1syMm0KG1s5MG09PT0bWzM5bQobWzMybRtbMW0gIE5vIENoYW5nZXMbWzIybRtbMzltIHRvIGAvdG1wL2psX0JVVDNRbi9Qcm9qZWN0LnRvbWxgChtbMzJtG1sxbSAgICBVcGRhdGluZxtbMjJtG1szOW0gYC90bXAvamxfQlVUM1FuL01hbmlmZXN0LnRvbWxgCiAgG1s5MG1bOGU4NTBiOTBdIBtbMzltG1s5M23ihpEgbGliYmxhc3RyYW1wb2xpbmVfamxsIHY1LjguMCsxIOKHkiB2NS4xMS4wKzAbWzM5bQoKG1swbRtbMW1QcmVjb21waWxpbmcuLi4bWzIybQobWzkwbT09PRtbMzltChtbMzJtG1sxbSAgQWN0aXZhdGluZxtbMjJtG1szOW0gcHJvamVjdCBhdCBgL3RtcC9qbF9CVVQzUW5gChtbMzJtG1sxbVByZWNvbXBpbGluZxtbMjJtG1szOW0gcHJvamVjdC4uLgogIDExMiBkZXBlbmRlbmNpZXMgc3VjY2Vzc2Z1bGx5IHByZWNvbXBpbGVkIGluIDE2NiBzZWNvbmRzLiA3MiBhbHJlYWR5IHByZWNvbXBpbGVkLgogIBtbMzNtMhtbMzltIGRlcGVuZGVuY2llcyBoYWQgb3V0cHV0IGR1cmluZyBwcmVjb21waWxhdGlvbjobWzMzbQrilIwgG1szOW1NS0xfamxsG1szM20K4pSCICAbWzM5bURvd25sb2FkaW5nIGFydGlmYWN0OiBNS0wbWzMzbQrilJQgIBtbMzltG1szM20K4pSMIBtbMzltQ1VEQV9Ecml2ZXJfamxsG1szM20K4pSCICAbWzM5bURvd25sb2FkaW5nIGFydGlmYWN0OiBDVURBX0RyaXZlchtbMzNtCuKUlCAgG1szOW2rS29tYU1SSUNvcmXaHk0KG1swbRtbMW1JbnN0YW50aWF0aW5nLi4uG1syMm0KG1s5MG09PT0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIExMVk1Mb29wSW5mbyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMC4wCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgSHlwZXJzY3JpcHQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjAuNSAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gUGxvdGx5S2FsZWlkbyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjIuMi40ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTVJJQmFzZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNC4zChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gSW5saW5lU3RyaW5ncyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNC4xChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gT2Zmc2V0QXJyYXlzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4xNC4wChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQWNjZXNzb3JzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xLjM2CiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgTlZUWF9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYzLjEuMCsyICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgSW52ZXJ0ZWRJbmRpY2VzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4zLjAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIERhdGFGcmFtZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjYuMQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEJhc2VEaXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4yLjQgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBDb25jdXJyZW50VXRpbGl0aWVzIOKUgOKUgOKUgOKUgCB2Mi40LjEgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBTdGF0aWNBcnJheXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjkuNSAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFByb2dyZXNzTWV0ZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjEwLjAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBCRmxvYXQxNnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjUuMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEdQVUFycmF5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEwLjIuMAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIENvbG9yU2NoZW1lcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjMuMjUuMCAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgUmFuZG9tTnVtYmVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNS4zICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gUGx1dG9VSSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNy41OQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFNpbXBsZUJ1ZmZlclN0cmVhbSDilIDilIDilIDilIDilIAgdjEuMS4wCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgVHJpY2tzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xLjggICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBJbnRlbE9wZW5NUF9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYyMDI0LjEuMCswICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENVREFfUnVudGltZV9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjE0LjArMQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEZ1bmN0b3JzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC40LjExChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTExWTSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjcuMi4xCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgSHdsb2NfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2Mi4xMC4wKzAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBDVURBX0RyaXZlcl9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjkuMCswICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEJ1ZmZlcmVkU3RyZWFtcyDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMi4xCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgUmFuZG9tMTIzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS43LjAgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBTZW50aW5lbEFycmF5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNC4zCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQ29tcGF0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2NC4xNS4wICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBDb2RlY1psaWIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjcuNAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIENVREFfUnVudGltZV9EaXNjb3Zlcnkg4pSAIHYwLjMuNCAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIFRyYW5zY29kaW5nU3RyZWFtcyDilIDilIDilIDilIDilIAgdjAuMTAuOSAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gVW5zYWZlQXRvbWljc0xMVk0g4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjEuNAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIE11c3RhY2hlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4wLjE5ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gUHJldHR5VGFibGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2Mi4zLjIKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBCYW5nQmFuZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNC4yICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTVBJQ0hfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2NC4yLjErMQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFBvb2xlZEFycmF5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNC4zCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgSkxMV3JhcHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjUuMCAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIFBsb3RseUpTIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xOC4xMyAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBOVlRYIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4zLjQgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBNS0xfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MjAyNC4xLjArMCAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBPcGVuTVBJX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjUuMC4zKzAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTExWTUV4dHJhX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMC4yOSswChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ29uc3RydWN0aW9uQmFzZSDilIDilIDilIDilIDilIDilIDilIAgdjEuNS41ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gS29tYU1SSUNvcmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjguMwobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENoYWluUnVsZXNDb3JlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4yNC4wChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gRkZUV19qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYzLjMuMTArMAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIENyYXlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHY0LjEuMSAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEdQVUFycmF5c0NvcmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjEuNgobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEtvbWFNUklCYXNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC44LjQKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBPcGVuU1NMX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjMuMC4xNCswICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gVGFibGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4xMS4xChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTExWTU9wZW5NUF9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxNS4wLjcrMAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIE1QSXRyYW1wb2xpbmVfamxsIOKUgOKUgOKUgOKUgOKUgOKUgCB2NS40LjArMCAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBKdWxpYU5WVFhDYWxsYmFja3NfamxsIOKUgCB2MC4yLjErMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEtlcm5lbEFic3RyYWN0aW9ucyDilIDilIDilIDilIDilIAgdjAuOS4yMQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFN1cHByZXNzb3Ig4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjIuNwobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEludmVyc2VGdW5jdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjEuMTQKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBHUFVDb21waWxlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMjYuNSAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gU3RyaW5nTWFuaXB1bGF0aW9uIOKUgOKUgOKUgOKUgOKUgCB2MC4zLjQKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBQbHV0b1Bsb3RseSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNC42ICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ1VEQSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjUuNC4yCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgS29tYU1SSVBsb3RzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC44LjMgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgIEJ1aWxkaW5nG1syMm0bWzM5bSBQbG90bHlKUyDihpIgYH4vLmp1bGlhL3NjcmF0Y2hzcGFjZXMvNDRjZmU5NWEtMWViMi01MmVhLWI2NzItZTJhZmRmNjliNzhmL2U2MmQ4ODZkMzNiODFjMzcxYzlkNGUyZjcwNjYzYzA2MzdmMTk0NTkvYnVpbGQubG9nYAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKG1swbRtbMW1SZXNvbHZpbmcuLi4bWzIybQobWzkwbT09PRtbMzltChtbMzJtG1sxbSAgTm8gQ2hhbmdlcxtbMjJtG1szOW0gdG8gYC90bXAvamxfQlVUM1FuL1Byb2plY3QudG9tbGAKG1szMm0bWzFtICAgIFVwZGF0aW5nG1syMm0bWzM5bSBgL3RtcC9qbF9CVVQzUW4vTWFuaWZlc3QudG9tbGAKICAbWzkwbVs4ZTg1MGI5MF0gG1szOW0bWzkzbeKGkSBsaWJibGFzdHJhbXBvbGluZV9qbGwgdjUuOC4wKzEg4oeSIHY1LjExLjArMBtbMzltCgobWzBtG1sxbVByZWNvbXBpbGluZy4uLhtbMjJtChtbOTBtPT09G1szOW0KG1szMm0bWzFtICBBY3RpdmF0aW5nG1syMm0bWzM5bSBwcm9qZWN0IGF0IGAvdG1wL2psX0JVVDNRbmAKG1szMm0bWzFtUHJlY29tcGlsaW5nG1syMm0bWzM5bSBwcm9qZWN0Li4uCiAgMTEyIGRlcGVuZGVuY2llcyBzdWNjZXNzZnVsbHkgcHJlY29tcGlsZWQgaW4gMTY2IHNlY29uZHMuIDcyIGFscmVhZHkgcHJlY29tcGlsZWQuCiAgG1szM20yG1szOW0gZGVwZW5kZW5jaWVzIGhhZCBvdXRwdXQgZHVyaW5nIHByZWNvbXBpbGF0aW9uOhtbMzNtCuKUjCAbWzM5bU1LTF9qbGwbWzMzbQrilIIgIBtbMzltRG93bmxvYWRpbmcgYXJ0aWZhY3Q6IE1LTBtbMzNtCuKUlCAgG1szOW0bWzMzbQrilIwgG1szOW1DVURBX0RyaXZlcl9qbGwbWzMzbQrilIIgIBtbMzltRG93bmxvYWRpbmcgYXJ0aWZhY3Q6IENVREFfRHJpdmVyG1szM20K4pSUICAbWzM5badlbmFibGVkw7dyZXN0YXJ0X3JlY29tbWVuZGVkX21zZ8C0cmVzdGFydF9yZXF1aXJlZF9tc2fArWJ1c3lfcGFja2FnZXOQtndhaXRpbmdfZm9yX3Blcm1pc3Npb27C2Sx3YWl0aW5nX2Zvcl9wZXJtaXNzaW9uX2J1dF9wcm9iYWJseV9kaXNhYmxlZMKrY2VsbF9pbnB1dHPeACTZJGQwMzc3ZjlhLTY4MGQtNDUwMS05MGNhLTllYTNhYjY4MWRiNISnY2VsbF9pZNkkZDAzNzdmOWEtNjgwZC00NTAxLTkwY2EtOWVhM2FiNjgxZGI0pGNvZGXaAg9tZCIiIiMjIDIuMi4gRmF0U2F0IGZsaXAgYW5nbGUgb3B0aW1pemF0aW9uCgpGb3IgdGhlIHNlY29uZCBzaW11bGF0aW9uIGV4cGVyaW1lbnQsIHRoZSBmYXQgc2lnbmFsIHdhcyBtaW5pbWl6ZWQgYnkgdmFyeWluZyB0aGUgRmF0U2F0IGZsaXAgYW5nbGUgKGJldHdlZW4gMjAgYW5kIDI1MCBkZWcpIHVzaW5nIHNpeCBpTkFWIHJlYWRvdXRzIChpZGVudGlmaWVkIGV4cGVyaW1lbnRhbGx5IHRvIHJlc3VsdCBpbiBnb29kIGZhdCBzdXBwcmVzc2lvbikuIFRvIGJlIHJvYnVzdCB0byAkQl8wJCBpbmhvbW9nZW5laXRpZXMsIG11bHRpcGxlIHNpbXVsYXRpb25zIHdpdGggdGlzc3VlIGZyZXF1ZW5jeSBzaGlmdHMgKGJldHdlZW4gJC0xJCBhbmQgJDFcLFxtYXRocm17cHBtfSQsIHR3aWNlIG9mIHdoYXQgd2FzIHJlcG9ydGVkIGJ5IFJlc3Rpdm8gZXQgYWwuKSB3ZXJlIHBlcmZvcm1lZCwgYW5kIHRoZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG9idGFpbmVkIGZhdCBzaWduYWwgd2VyZSBjYWxjdWxhdGVkLiIiIqhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw9kkZmM1ODY0MGItYzQ0Yy00YzI1LWE0ZmQtNWEwZTE3ZDdiZWNkhKdjZWxsX2lk2SRmYzU4NjQwYi1jNDRjLTRjMjUtYTRmZC01YTBlMTdkN2JlY2SkY29kZbltZCIjIDEuIFNpbXVsYXRpb24gc2V0dXAiqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTD2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjaEp2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqRjb2Rl2gJLYmVnaW4KICAgIEZBcyA9IDIwOjEwOjE4MCAJCSMgZmxpcCBhbmdsZSBbZGVnXQoJUlJzID0gNjAgLi8gKDU1OjEwOjg1KSAgIyBSUiBbc10KICAgIG1hZzEgPSB6ZXJvcyhDb21wbGV4RjY0LCBpbV9zZWdtZW50cywgTmlzbyo0LCBsZW5ndGgoRkFzKSwgbGVuZ3RoKFJScykpCiAgICBAcHJvZ3Jlc3MgZm9yIChtLCBSUikgPSBlbnVtZXJhdGUoUlJzKSwgKG4sIGltX2ZsaXBfYW5nbGUpID0gZW51bWVyYXRlKEZBcykKCQlzZXFfcGFyYW1zMSA9IG1lcmdlKHNlcV9wYXJhbXMsICg7IGltX2ZsaXBfYW5nbGUsIFJSKSkKCQlzaW1fcGFyYW1zMSA9IG1lcmdlKHNpbV9wYXJhbXMsIERpY3QoInNpbV9tZXRob2QiPT5CbG9jaERpY3QoKSkpCgkJc2VxMSAgICAgICAgPSBDTVJBKHNlcV9wYXJhbXMxLi4uKQoJCW9iajEgICAgICAgID0gY2FyZGlhY19waGFudG9tKDApCgkJbWFnYXV4ID0gQHN1cHByZXNzIHNpbXVsYXRlKG9iajEsIHNlcTEsIHN5czsgc2ltX3BhcmFtcz1zaW1fcGFyYW1zMSkKCQltYWcxWzosIDosIG4sIG1dIC49IG1hZ2F1eFtlbmQtaW1fc2VnbWVudHMrMTplbmQsIDpdICMgTGFzdCBoZWFydGJlYXQKICAgIGVuZAplbmSobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMLZJDkyMTk0ZmNiLTU4MmEtNDljZS1hYWQ3LTIwYjAxNDVkNDBkM4SnY2VsbF9pZNkkOTIxOTRmY2ItNTgyYS00OWNlLWFhZDctMjBiMDE0NWQ0MGQzpGNvZGW0bWQiIyMgMS4zLiBTZXF1ZW5jZSKobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMPZJGY0OTY1NWNjLTQ2MGUtNDk4MS05MmVhLWRmZDYxNDczMDhiZoSnY2VsbF9pZNkkZjQ5NjU1Y2MtNDYwZS00OTgxLTkyZWEtZGZkNjE0NzMwOGJmpGNvZGXZb21kIkJsb2NoIHNpbXVsYXRpb25zIHdlcmUgcGVyZm9ybWVkIHVzaW5nICoqS29tYU1SSS5qbCoqIHRvIG9wdGltaXplIHRoZSBwcm9wb3NlZCB3aG9sZS1oZWFydCBDTVJBIHBhcmFtZXRlcnMuIqhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw9kkM2Q3ZTdkMjAtYTc3YS00OGIzLWFkMmUtNmI2MjEyMjdiZTE2hKdjZWxsX2lk2SQzZDdlN2QyMC1hNzdhLTQ4YjMtYWQyZS02YjYyMTIyN2JlMTakY29kZdoDZW1kIiIiIyBSZWZlcmVuY2VzCiAtICoqQ2FzdGlsbG8tUGFzc2kgQyoqLCBDb3JvbmFkbyBSLCBWYXJlbGEtTWF0dGF0YWxsIEcsIEFsYmVyb2xhLUzDs3BleiBDLCBCb3RuYXIgUiwgSXJhcnJhemF2YWwgUC4gS29tYU1SSS5qbDogQW4gb3Blbi1zb3VyY2UgZnJhbWV3b3JrIGZvciBnZW5lcmFsIE1SSSBzaW11bGF0aW9ucyB3aXRoIEdQVSBhY2NlbGVyYXRpb24uIE1hZ25ldGljIFJlc29uYW5jZSBpbiBNZWRpY2luZS4gMjAyMzs5MCgxKTozMjktMzQyLiBbZG9pOjEwLjEwMDIvbXJtLjI5NjM1XShkb2k6MTAuMTAwMi9tcm0uMjk2MzUpCiAtICoqQ2FtcGJlbGwtV2FzaGJ1cm4gQUUqKiwgUmFtYXNhd215IFIsIFJlc3Rpdm8gTUMsIGV0IGFsLiBPcHBvcnR1bml0aWVzIGluIEludGVydmVudGlvbmFsIGFuZCBEaWFnbm9zdGljIEltYWdpbmcgYnkgVXNpbmcgSGlnaC1QZXJmb3JtYW5jZSBMb3ctRmllbGQtU3RyZW5ndGggTVJJLiBSYWRpb2xvZ3kuIDIwMTk7MjkzKDIpOjM4NC0zOTMuIFtkb2k6MTAuMTE0OC9yYWRpb2wuMjAxOTE5MDQ1Ml0oZG9pOjEwLjExNDgvcmFkaW9sLjIwMTkxOTA0NTIpCi0gKipSZXN0aXZvIE1DKiosIFJhbWFzYXdteSBSLCBCYW5kZXR0aW5pIFdQLCBIZXJ6a2EgREEsIENhbXBiZWxsLVdhc2hidXJuIEFFLiBFZmZpY2llbnQgc3BpcmFsIGluLW91dCBhbmQgRVBJIGJhbGFuY2VkIHN0ZWFkeS1zdGF0ZSBmcmVlIHByZWNlc3Npb24gY2luZSBpbWFnaW5nIHVzaW5nIGEgaGlnaC1wZXJmb3JtYW5jZSAwLjU1VCBNUkkuIE1hZ25ldGljIFJlc29uYW5jZSBpbiBNZWRpY2luZS4gMjAyMDs4NCg1KToyMzY0LTIzNzUuIFtkb2k6MTAuMTAwMi9tcm0uMjgyNzhdKGRvaToxMC4xMDAyL21ybS4yODI3OCkKIiIiqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTD2SRhOTljMGM0Ny0xYjcwLTQzNjItYTJmNi1hN2UzMjU5NjA2ZmGEp2NlbGxfaWTZJGE5OWMwYzQ3LTFiNzAtNDM2Mi1hMmY2LWE3ZTMyNTk2MDZmYaRjb2Rl2gGhbWQiIiIjIExvdy1GaWVsZCBDTVJBIE9wdGltaXphdGlvbgoKVGhpcyBub3RlYm9vayByZXByb2R1Y2VzIHRoZSBzaW11bGF0aW9uIGV4cGVyaW1lbnRzIHBlcmZvcm1lZCBpbiBvdXIgbWFudXNjcmlwdDoKCj4gKioiSGlnaGx5IEVmZmljaWVudCBpTkFWLWJhc2VkIDNEIFdob2xlLUhlYXJ0IENNUkEgYXQgMC41NVQiKioKPgo+ICoqQ2FybG9zIENhc3RpbGxvLVBhc3NpKiosIEthcmwgUC4gS3VuemUsIE1pY2hhZWwgRy4gQ3JhYmIsIENhbWlsYSBNdcOxb3osIEFuYXN0YXNpYSBGb3Rha2ksIFJhZGhvdWVuZSBOZWppLCBQYWJsbyBJcmFycmF6YXZhbCwgQ2xhdWRpYSBQcmlldG8sIGFuZCBSZW7DqSBNLiBCb3RuYXIKPgo+ICgyMDI0KQoKU3VibWl0dGVkIHRvIE1hZ25ldGljIFJlc29uYW5jZSBpbiBNZWRpY2luZSAoTVJNKS4KIiIiqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTD2SRhMTVkNmI2NC1mOGVlLTRlZTQtODEyYy1kNDljZjVlYTc4NGSEp2NlbGxfaWTZJGExNWQ2YjY0LWY4ZWUtNGVlNC04MTJjLWQ0OWNmNWVhNzg0ZKRjb2Rl2gIcbWQiIiIKIyMgMS40LiBQaGFudG9tCkVhY2ggdGlzc3VlIHdhcyByZXByZXNlbnRlZCB3aXRoIDIwMCBpc29jaHJvbWF0cyBkaXN0cmlidXRlZCBhbG9uZyB0aGUgJHokLWF4aXMgdG8gc2ltdWxhdGUgZ3JhZGllbnQgc3BvaWxpbmcgZWZmZWN0cy4gVGhlIGlzb2Nocm9tYXRzIGZvciBlYWNoIHRpc3N1ZSB3ZXJlIGluc2lkZSBhIDFEIHZveGVsIG9mIHNpemUgJDEuNVwsXG1hdGhybXttbX0kLiBUaGUgdmFsdWVzIGZvciAkVF8xJCBhbmQgJFRfMiQgZm9yIGJsb29kLCBteW9jYXJkaWFsIG11c2NsZSwgYW5kIGZhdCBhdCAwLjU1VCB3ZXJlIG9idGFpbmVkIGZyb20gdGhlIHdvcmsgb2YgQ2FtcGJlbGwtV2FzaGJ1cm4sIGV0IGFsLiBGYXQgc3BpbnMgd2VyZSBzaW11bGF0ZWQgdXNpbmcgYSBjaGVtaWNhbCBzaGlmdCBvZiAkLTMuNFwsXG1hdGhybXtwcG19JCwgc2ltdWxhdGluZyByZWd1bGFyIGZhdCB3aXRoICRUXzE9MTgzXCxcbWF0aHJte21zfSQsIGFuZCBmYXN0LXJlY292ZXJpbmcgZmF0IHdpdGggJFRfMT0xMzBcLFxtYXRocm17bXN9JC4KIiIiqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTD2SRmMGE4MWM5Zi01NjE2LTQ2NjMtOTQ4Zi1hNDA4NGUxNzE5YWaEp2NlbGxfaWTZJGYwYTgxYzlmLTU2MTYtNDY2My05NDhmLWE0MDg0ZTE3MTlhZqRjb2Rl2gE5YmVnaW4KICAgIGZhdF9wcG0gPSAtMy40ZS02IAkJCSMgLTMuNHBwbSBmYXQtd2F0ZXIgZnJlcXVlbmN5IHNoaWZ0CiAgICBOaXNvID0gMjAwICAgICAgICAJCQkjIDIwMCBpc29jaHJvbWF0cyBpbiBzcG9pbGVyIGRpcmVjdGlvbgogICAgzpR4X3ZveGVsID0gMS41ZS0zIAkJCSMgMS41IFttbV0KICAgIGZhdF9mcmVxID0gzrMqc3lzLkIwKmZhdF9wcG0gIyAtODAgW0h6XQogICAgZHggPSBBcnJheShyYW5nZSgtzpR4X3ZveGVsLzIsIM6UeF92b3hlbC8yLCBOaXNvKSkKCW1kIi0gUGhhbnRvbSBwYXJhbWV0ZXJzIChzaG93L2hpZGUgY29kZSkiCmVuZKhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw9kkZDk3MTViYzEtNDljZC00ZGY4LThkYmYtYzA2ZGU0MmFkNTUwhKdjZWxsX2lk2SRkOTcxNWJjMS00OWNkLTRkZjgtOGRiZi1jMDZkZTQyYWQ1NTCkY29kZdoEBmJlZ2luCiAgICAjIFByZXAgcGxvdHMKICAgIGxhYnMgPSBbIk15b2NhcmRpdW0iLCAiQmxvb2QiLCAiRmF0Il0KCWNvbHMgPSBbImJsdWUiLCAicmVkIiwgImdyZWVuIl0KICAgIHNwaW5fZ3JvdXAgPSBbKDE6TmlzbyknLCAoTmlzbysxOjJOaXNvKScsICgyTmlzbysxOjNOaXNvKSddCiAgICB0ID0gS29tYU1SSUNvcmUuZ2V0X2FkY19zYW1wbGluZ190aW1lcyhzZXEpCiAgICBNeHkoaSkgPSBhYnMuKHN1bShtYWduZXRpemF0aW9uWzosc3Bpbl9ncm91cFtpXSwxLDFdWzosMSw6XSxkaW1zPTIpWzpdL2xlbmd0aChzcGluX2dyb3VwW2ldKSkKICAgIE16KGkpID0gcmVhbC4oc3VtKG1hZ25ldGl6YXRpb25bOixzcGluX2dyb3VwW2ldLDIsMV1bOiwxLDpdLGRpbXM9MilbOl0vbGVuZ3RoKHNwaW5fZ3JvdXBbaV0pKQoKICAgICMgUGxvdAogICAgcDAgPSBtYWtlX3N1YnBsb3RzKAoJCXJvd3M9MiwKCQljb2xzPTEsCgkJc3VicGxvdF90aXRsZXM9WyJNeHkiICJNeiIgIlNlcXVlbmNlIl0sCgkJc2hhcmVkX3hheGVzPXRydWUsCgkJdmVydGljYWxfc3BhY2luZz0wLjEKCSkKICAgIGZvciBpPWVhY2hpbmRleChzcGluX2dyb3VwKQogICAgICAgIHAxID0gc2NhdHRlcigKCQkJeD10LCB5PU14eShpKSwKCQkJbmFtZT1sYWJzW2ldLAoJCQlsZWdlbmRncm91cD1sYWJzW2ldLAoJCQltYXJrZXJfY29sb3I9Y29sc1tpXQoJCSkKICAgICAgICBwMiA9IHNjYXR0ZXIoCgkJCXg9dCwKCQkJeT1NeihpKSwKCQkJbmFtZT1sYWJzW2ldLAoJCQlsZWdlbmRncm91cD1sYWJzW2ldLAoJCQlzaG93bGVnZW5kPWZhbHNlLAoJCQltYXJrZXJfY29sb3I9Y29sc1tpXQoJCSkKICAgICAgICBhZGRfdHJhY2UhKHAwLCBwMSwgcm93PTEsIGNvbD0xKQogICAgICAgIGFkZF90cmFjZSEocDAsIHAyLCByb3c9MiwgY29sPTEpCiAgICBlbmQKCXJlbGF5b3V0IShwMCwKCQl5YXhpc19yYW5nZT1bMCwgMC40XSwKCQl4YXhpc19yYW5nZT1bUlIqZHVtbXlfaGVhcnRfYmVhdHMsIFJSKmR1bW15X2hlYXJ0X2JlYXRzKy4yNTBdCgkpCiAgICBwMAplbmSobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMPZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYYSnY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpGNvZGXaAn5iZWdpbgogICAgRkZBcyA9IDIwOjIwOjI1MCAJCQkJCQkgIyBmbGlwIGFuZ2xlIFtkZWddCgnOlGZzID0gKC0xOjAuMjoxKSAuKiAozrMgKiBzeXMuQjAgKiAxZS02KSAgIyBvZmYtcmVzb25hbmNlIM6UZiBbc10KICAgIG1hZzIgPSB6ZXJvcyhDb21wbGV4RjY0LCBpbV9zZWdtZW50cywgTmlzbyo0LCBsZW5ndGgoRkZBcyksIGxlbmd0aCjOlGZzKSkKICAgIEBwcm9ncmVzcyBmb3IgKG0sIM6UZikgPSBlbnVtZXJhdGUozpRmcyksIChuLCBGYXRTYXRfZmxpcF9hbmdsZSkgPSBlbnVtZXJhdGUoRkZBcykKCQlzZXFfcGFyYW1zMiA9IG1lcmdlKHNlcV9wYXJhbXMsICg7IEZhdFNhdF9mbGlwX2FuZ2xlKSkKCQlzaW1fcGFyYW1zMiA9IG1lcmdlKHNpbV9wYXJhbXMsIERpY3QoInNpbV9tZXRob2QiPT5CbG9jaERpY3QoKSkpCgkJc2VxMiAgICAgICAgPSBDTVJBKHNlcV9wYXJhbXMyLi4uKQoJCW9iajIgICAgICAgID0gY2FyZGlhY19waGFudG9tKM6UZikKCQltYWdhdXggPSBAc3VwcHJlc3Mgc2ltdWxhdGUob2JqMiwgc2VxMiwgc3lzOyBzaW1fcGFyYW1zPXNpbV9wYXJhbXMyKQoJCW1hZzJbOiwgOiwgbiwgbV0gLj0gbWFnYXV4W2VuZC1pbV9zZWdtZW50cysxOmVuZCwgOl0gIyBMYXN0IGhlYXJ0YmVhdAogICAgZW5kCmVuZKhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkOWUzOTc0MjYtYjYwYi00Yjk4LWJlOGItZjdmMTI4NjIxYzQ0hKdjZWxsX2lk2SQ5ZTM5NzQyNi1iNjBiLTRiOTgtYmU4Yi1mN2YxMjg2MjFjNDSkY29kZdlTYmVnaW4KCXN5cyA9IFNjYW5uZXIoKQoJc3lzLkIwID0gMC41NQoJc3lzLkdtYXggPSA0MC4wZS0zCglzeXMuU21heCA9IDI1LjAKCXN5cwplbmSobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMPZJGQwNWRjYmE3LTJmNDItNDdiZi1hMTcyLTYxMjNkMDExM2IzZoSnY2VsbF9pZNkkZDA1ZGNiYTctMmY0Mi00N2JmLWExNzItNjEyM2QwMTEzYjNmpGNvZGXZjXNpbV9wYXJhbXMgPSBEaWN0e1N0cmluZyxBbnl9KAoJInJldHVybl90eXBlIj0+Im1hdCIsCgkic2ltX21ldGhvZCI9PkJsb2NoRGljdChzYXZlX016PXRydWUpLAoJIs6UdF9yZiI9PlRyZiwKCSJncHUiPT5mYWxzZSwKCSJOdGhyZWFkcyI9PjEKKahtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw9kkMzlmNDQwMjUtMjk3NC00YzRjLWIwYzItZTIxMzk5YmJkYjFmhKdjZWxsX2lk2SQzOWY0NDAyNS0yOTc0LTRjNGMtYjBjMi1lMjEzOTliYmRiMWakY29kZdoBWG1kIiIiCiMjIDIuMS4gRmxpcCBhbmdsZSBvcHRpbWl6YXRpb24KCkZvciB0aGUgZmlyc3Qgc2ltdWxhdGlvbiBleHBlcmltZW50LCBTTlIgd2FzIG1heGltaXplZCBieSB2YXJ5aW5nIHRoZSBpbWFnaW5nIGZsaXAgYW5nbGUgKGJldHdlZW4gMjAgYW5kIDE4MCBkZWcpLiBUbyBvcHRpbWl6ZSBTTlIgaW5kZXBlbmRlbnRseSBvZiBoZWFydCByYXRlLCBtdWx0aXBsZSBoZWFydCByYXRlcyAoYmV0d2VlbiA1NSBhbmQgODUgYnBtKSB3ZXJlIHNpbXVsYXRlZCBhbmQgdGhlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgb2J0YWluZWQgYmxvb2Qgc2lnbmFsIHdlcmUgY2FsY3VsYXRlZC4KIiIiqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTD2SQzN2Y3ZmQ3Zi01Y2IxLTQ4YjUtYjg3Ny1iMmJjMjNhMWU3ZGSEp2NlbGxfaWTZJDM3ZjdmZDdmLTVjYjEtNDhiNS1iODc3LWIyYmMyM2ExZTdkZKRjb2Rl2ctiZWdpbgogICAgc2VxID0gQ01SQShzZXFfcGFyYW1zLi4uOyBzYW1wbGVfcmVjb3Zlcnk9b25lcyhCb29sLCBkdW1teV9oZWFydF9iZWF0cysxKSkKCW9iaiA9IGNhcmRpYWNfcGhhbnRvbSgwKQogICAgbWFnbmV0aXphdGlvbiA9IEBzdXBwcmVzcyBzaW11bGF0ZShvYmosIHNlcSwgc3lzOyBzaW1fcGFyYW1zKQoJbm90aGluZyAjIGhpZGUgb3V0cHV0CmVuZKhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkNzcxNTNlNWMtNzFiZC00MmUzLWJhZTktZTQ4MTFmZmE3YTNkhKdjZWxsX2lk2SQ3NzE1M2U1Yy03MWJkLTQyZTMtYmFlOS1lNDgxMWZmYTdhM2SkY29kZdmMbWQiIiIjIyAxLjIuIFNjYW5uZXIKCldlIHN0YXJ0IGJ5IGRlZmluaW5nIHRoZSBoYXJkd2FyZSBjaGFyYWN0ZXJpc3RpY3MuIFRoZSBgc3lzLkIwYCB3aWxsIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBvZmYtcmVzb25hbmNlIG9mIGZhdC4iIiKobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMPZJGQ1NGQ2ODA3LTQ0NGYtNGUwZS04ZmQ2LTg0NDU3OTc0MTE1YYSnY2VsbF9pZNkkZDU0ZDY4MDctNDQ0Zi00ZTBlLThmZDYtODQ0NTc5NzQxMTVhpGNvZGXZX21kIkhlcmUgd2Ugc2hvdyB0aGUgbWFnbmV0aXphdGlvbiBkeW5hbWljcyBvZiB0aGUgbXlvY2FyZGl1bSwgYmxvb2QsIGFuZCBmYXQgc2lnbmFscyBhdCAwLjU1VC4iqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTD2SQ0NGEzMTA1Ny03YjM0LTRjODAtYTI3My02NjIxYzA3NzNkYzeEp2NlbGxfaWTZJDQ0YTMxMDU3LTdiMzQtNGM4MC1hMjczLTY2MjFjMDc3M2RjN6Rjb2Rl2gxSYmVnaW4KCSMjIENhbGN1bGF0aW5nIHJlc3VsdHMKCXNpZ25hbF9teW9jMiA9IHJlc2hhcGUoCgkgICAgbWVhbihhYnMuKG1lYW4obWFnMls6LCBzcGluc1sxXSwgOiwgOl0sIDMpKSwgMSksIGxlbmd0aChGRkFzKSwgbGVuZ3RoKM6UZnMpCgkpCglzaWduYWxfYmxvbzIgPSByZXNoYXBlKAoJICAgIG1lYW4oYWJzLihtZWFuKG1hZzJbOiwgc3BpbnNbMl0sIDosIDpdLCAzKSksIDEpLCBsZW5ndGgoRkZBcyksIGxlbmd0aCjOlGZzKQoJKQoJc2lnbmFsX2ZhdDIgPSByZXNoYXBlKAoJICAgIG1lYW4oYWJzLihtZWFuKG1hZzJbOiwgc3BpbnNbM10sIDosIDpdLCAzKSksIDEpLCBsZW5ndGgoRkZBcyksIGxlbmd0aCjOlGZzKQoJKQoJc2lnbmFsX2ZhdDIyID0gcmVzaGFwZSgKCSAgICBtZWFuKGFicy4obWVhbihtYWcyWzosIHNwaW5zWzRdLCA6LCA6XSwgMykpLCAxKSwgbGVuZ3RoKEZGQXMpLCBsZW5ndGgozpRmcykKCSkKCW1lYW5fbXlvYzIgPSBtZWFuKHNpZ25hbF9teW9jMiwgMikKCW1lYW5fYmxvbzIgPSBtZWFuKHNpZ25hbF9ibG9vMiwgMikKCW1lYW5fZmF0MiAgPSBtZWFuKHNpZ25hbF9mYXQyLCAyKQoJbWVhbl9mYXQyMiA9IG1lYW4oc2lnbmFsX2ZhdDIyLCAyKQoJc3RkX215b2MyICA9IHN0ZChzaWduYWxfbXlvYzIsIDIpCglzdGRfYmxvbzIgID0gc3RkKHNpZ25hbF9ibG9vMiwgMikKCXN0ZF9mYXQyICAgPSBzdGQoc2lnbmFsX2ZhdDIsIDIpCglzdGRfZmF0MjIgID0gc3RkKHNpZ25hbF9mYXQyMiwgMikKCSMgUGxvdHRpbmcgcmVzdWx0cwoJIyBNZWFuCglzMTIgPSBzY2F0dGVyKDsKCSAgICB4PUZGQXMsCgkgICAgeT1tZWFuX215b2MyWzpdLAoJICAgIG5hbWU9bGFiZWxzWzFdLAoJICAgIGxlZ2VuZGdyb3VwPWxhYmVsc1sxXSwKCSAgICBsaW5lPWF0dHIoOyBjb2xvcj1jb2xvcnNbMV0pLAoJKQoJczIyID0gc2NhdHRlcig7CgkgICAgeD1GRkFzLAoJICAgIHk9bWVhbl9ibG9vMls6XSwKCSAgICBuYW1lPWxhYmVsc1syXSwKCSAgICBsZWdlbmRncm91cD1sYWJlbHNbMl0sCgkgICAgbGluZT1hdHRyKDsgY29sb3I9Y29sb3JzWzJdKSwKCSkKCXMzMiA9IHNjYXR0ZXIoOwoJICAgIHg9RkZBcywKCSAgICB5PW1lYW5fZmF0Mls6XSwKCSAgICBuYW1lPWxhYmVsc1szXSwKCSAgICBsZWdlbmRncm91cD1sYWJlbHNbM10sCgkgICAgbGluZT1hdHRyKDsgY29sb3I9Y29sb3JzWzNdKSwKCSkKCXM1MiA9IHNjYXR0ZXIoOwoJICAgIHg9RkZBcywKCSAgICB5PW1lYW5fZmF0MjJbOl0sCgkgICAgbmFtZT1sYWJlbHNbNF0sCgkgICAgbGVnZW5kZ3JvdXA9bGFiZWxzWzRdLAoJICAgIGxpbmU9YXR0cig7IGNvbG9yPWNvbG9yc1szXSwgZGFzaD0iZGFzaCIpLAoJKQoJIyBTdGQKCXM0MiA9IHNjYXR0ZXIoOwoJICAgIHg9W0ZGQXM7IHJldmVyc2UoRkZBcyldLAoJICAgIHk9WyhtZWFuX215b2MyIC4tIHN0ZF9teW9jMilbOl07IHJldmVyc2UoKG1lYW5fbXlvYzIgLisgc3RkX215b2MyKVs6XSldLAoJICAgIG5hbWU9bGFiZWxzWzFdLAoJICAgIGxlZ2VuZGdyb3VwPWxhYmVsc1sxXSwKCSAgICBzaG93bGVnZW5kPWZhbHNlLAoJICAgIGZpbGw9InRvc2VsZiIsCgkgICAgZmlsbGNvbG9yPSJyZ2JhKDAsMCwyNTUsMC4yKSIsCgkgICAgbGluZT1hdHRyKDsgY29sb3I9InJnYmEoMCwwLDAsMCkiKSwKCQlob3ZlcmluZm89Im5vbmUiLAoJKQoJczYyID0gc2NhdHRlcig7CgkgICAgeD1bRkZBczsgcmV2ZXJzZShGRkFzKV0sCgkgICAgeT1bKG1lYW5fYmxvbzIgLi0gc3RkX2Jsb28yKVs6XTsgcmV2ZXJzZSgobWVhbl9ibG9vMiAuKyBzdGRfYmxvbzIpWzpdKV0sCgkgICAgbmFtZT1sYWJlbHNbMl0sCgkgICAgbGVnZW5kZ3JvdXA9bGFiZWxzWzJdLAoJICAgIHNob3dsZWdlbmQ9ZmFsc2UsCgkgICAgZmlsbD0idG9zZWxmIiwKCSAgICBmaWxsY29sb3I9InJnYmEoMjU1LDAsMCwwLjIpIiwKCSAgICBsaW5lPWF0dHIoOyBjb2xvcj0icmdiYSgwLDAsMCwwKSIpLAoJCWhvdmVyaW5mbz0ibm9uZSIsCgkpCglzNzIgPSBzY2F0dGVyKDsKCSAgICB4PVtGRkFzOyByZXZlcnNlKEZGQXMpXSwKCSAgICB5PVsobWVhbl9mYXQyIC4tIHN0ZF9mYXQyKVs6XTsgcmV2ZXJzZSgobWVhbl9mYXQyIC4rIHN0ZF9mYXQyKVs6XSldLAoJICAgIG5hbWU9bGFiZWxzWzNdLAoJICAgIGxlZ2VuZGdyb3VwPWxhYmVsc1szXSwKCSAgICBzaG93bGVnZW5kPWZhbHNlLAoJICAgIGZpbGw9InRvc2VsZiIsCgkgICAgZmlsbGNvbG9yPSJyZ2JhKDAsMjU1LDAsMC4yKSIsCgkgICAgbGluZT1hdHRyKDsgY29sb3I9InJnYmEoMCwwLDAsMCkiKSwKCQlob3ZlcmluZm89Im5vbmUiLAoJKQoJczgyID0gc2NhdHRlcig7CgkgICAgeD1bRkZBczsgcmV2ZXJzZShGRkFzKV0sCgkgICAgeT1bKG1lYW5fZmF0MjIgLi0gc3RkX2ZhdDIyKVs6XTsgcmV2ZXJzZSgobWVhbl9mYXQyMiAuKyBzdGRfZmF0MjIpWzpdKV0sCgkgICAgbmFtZT1sYWJlbHNbNF0sCgkgICAgbGVnZW5kZ3JvdXA9bGFiZWxzWzRdLAoJICAgIHNob3dsZWdlbmQ9ZmFsc2UsCgkgICAgZmlsbD0idG9zZWxmIiwKCSAgICBmaWxsY29sb3I9InJnYmEoMCwyNTUsMCwwLjIpIiwKCSAgICBsaW5lPWF0dHIoOyBjb2xvcj0icmdiYSgwLDAsMCwwKSIpLAoJCWhvdmVyaW5mbz0ibm9uZSIsCgkpCgkjIFBsb3RzCglmaWcyID0gcGxvdChbczEyLCBzMjIsIHMzMiwgczQyLCBzNTIsIHM2MiwgczcyLCBzODJdKQoJcmVsYXlvdXQhKAoJICAgIGZpZzI7CgkgICAgeWF4aXM9YXR0cig7IHRpdGxlPSJTaWduYWwgW2EudS5dIiwgdGlja21vZGU9ImFycmF5IiksCgkgICAgeGF4aXM9YXR0cig7CgkgICAgICAgIHRpdGxlPSJGYXRTYXQgZmxpcCBhbmdsZSBbZGVnXSIsCgkgICAgICAgIHRpY2ttb2RlPSJhcnJheSIsCgkgICAgICAgIHRpY2t2YWxzPVtGRkFzWzFdLCAxMzAsIDE1MCwgMTgwLCBGRkFzW2VuZF1dLAoJICAgICAgICBjb25zdHJhaW49ImRvbWFpbiIsCgkgICAgKSwKCSAgICBmb250PWF0dHIoOyBmYW1pbHk9IkNNVSBTZXJpZiIsIHNpemU9MTYsIHNjYWxlYW5jaG9yPSJ4Iiwgc2NhbGVyYXRpbz0xKSwKCSAgICB5YXhpc19yYW5nZT1bMCwgMC40XSwKCQl4YXhpc19yYW5nZT1bRkZBc1sxXSwgRkZBc1tlbmRdXSwKCSAgICB3aWR0aD02MDAsCgkgICAgaGVpZ2h0PTQwMCwKCSAgICBob3Zlcm1vZGU9InggdW5pZmllZCIsCgkpCglmaWcyCmVuZKhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw9kkY2I2NTkxMTgtOWYyMi00M2MzLTgwMWQtNDkyNDFkZWU0ZGY2hKdjZWxsX2lk2SRjYjY1OTExOC05ZjIyLTQzYzMtODAxZC00OTI0MWRlZTRkZjakY29kZdoDIWJlZ2luCgkjIEdlbmVyYWwgc2VxdWVuY2UgcGFyYW1ldGVycwoJVHJmID0gNTAwZS02ICAJCQkjIDUwMCBbbXNdCglCMSA9IDEgLyAoMzYwKs6zKlRyZikgICAgIyBCMSBhbXBsaXR1ZGUgW3VUXQoJVGFkYyA9IDFlLTYgCQkJIyAxdXMKCgkjIFByZXB1bHNlcwoJVGZhdHNhdCA9IDI2LjYyNGUtMyAgICAgIyAyNi42IFttc10KCVQycHJlcF9kdXJhdGlvbiA9IDUwZS0zICMgNTAgW21zXQoKCSMgQWNxdWlzaXRpb24KCVJSID0gMS4wIAkJCQkjIDEgW3NdCglkdW1teV9oZWFydF9iZWF0cyA9IDMgCSMgU3RlYWR5LXN0YXRlCglUUiA9IDUuM2UtMyAgICAgICAgICAgICAjIDUuMyBbbXNdIFJGIExvdyBTQVIKCVRFID0gVFIgLyAyIAkJCSMgYlNTRlAgY29uZGl0aW9uCglpTkFWX2xpbmVzID0gNiAgICAgICAgICAjIEZhdFNhdC1BY3EgZGVsYXk6IGlOQVZfbGluZXMgKiBUUgoJaU5BVl9mbGlwX2FuZ2xlID0gMy4yICAgIyAzLjIgW2RlZ10KCWltX3NlZ21lbnRzID0gMjAgICAgICAgICMgQWNxdWlzaXRpbm8gd2luZG93OiBpbV9zZWdtZW50cyAqIFRSCgoJIyBUbyBiZSBvcHRpbWl6ZWQKCWltX2ZsaXBfYW5nbGUgPSAxMTAgICAgIyAxMTAgW2RlZ10KCUZhdFNhdF9mbGlwX2FuZ2xlID0gMTgwICMgMTgwIFtkZWddCgoJc2VxX3BhcmFtcyA9ICg7CgkJZHVtbXlfaGVhcnRfYmVhdHMsCgkJaU5BVl9saW5lcywKCQlpbV9zZWdtZW50cywKCQlpTkFWX2ZsaXBfYW5nbGUsCgkJaW1fZmxpcF9hbmdsZSwKCQlUMnByZXBfZHVyYXRpb24sCgkJRmF0U2F0X2ZsaXBfYW5nbGUsCgkJUlIKCSkKCglzZXFfcGFyYW1zCmVuZKhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw9kkOGRjMTExNzUtZWJjOC00MDdhLWFiMGItNmQ1NDNmODQ5YTcyhKdjZWxsX2lk2SQ4ZGMxMTE3NS1lYmM4LTQwN2EtYWIwYi02ZDU0M2Y4NDlhNzKkY29kZdoBmmJlZ2luCgkjIExhYmVscwoJbGFiZWxzID0gWyJNeW9jYXJkaXVtIiwgIkJsb29kIiwgIkZhdCAoVOKCgT0xODMgbXMpIiwgIkZhdCAoVOKCgT0xMzAgbXMpIl0KCWNvbG9ycyA9IFsiYmx1ZSIsICJyZWQiLCAiZ3JlZW4iLCAicHVycGxlIl0KCXNwaW5zID0gWygxOk5pc28pJywgKChOaXNvICsgMSk6KDJOaXNvKSknLCAoKDJOaXNvICsgMSk6KDNOaXNvKSknLCAoKDNOaXNvICsgMSk6KDROaXNvKSknXQoJbWVhbih4LCBkaW0pID0gc3VtKHg7IGRpbXM9ZGltKSAvIHNpemUoeCwgZGltKQoJc3RkKHgsIGRpbTsgbXU9bWVhbih4LCBkaW0pKSA9IHNxcnQuKHN1bShhYnMuKHggLi0gbXUpIC5eIDI7IGRpbXM9ZGltKSAvIChzaXplKHgsIGRpbSkgLSAxKSkKCW1kIkF1eCBmdW5jdGlvbnMgKHNob3cvaGlkZSBjb2RlKSIKZW5kqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTD2SRmNzMwODJmZi1hNmQzLTQxZjgtODc5Ni00MTE0ZmE4OWQyYmKEp2NlbGxfaWTZJGY3MzA4MmZmLWE2ZDMtNDFmOC04Nzk2LTQxMTRmYTg5ZDJiYqRjb2Rl2glDYmVnaW4KCSMgUmVkdWNpbmcgdGlzc3VlcydzIHNpZ25hbAoJc2lnbmFsX215b2MgPSByZXNoYXBlKAoJICAgIG1lYW4oYWJzLihtZWFuKG1hZzFbOiwgc3BpbnNbMV0sIDosIDpdLCAzKSksIDEpLCBsZW5ndGgoRkFzKSwgbGVuZ3RoKFJScykKCSkKCXNpZ25hbF9ibG9vID0gcmVzaGFwZSgKCSAgICBtZWFuKGFicy4obWVhbihtYWcxWzosIHNwaW5zWzJdLCA6LCA6XSwgMykpLCAxKSwgbGVuZ3RoKEZBcyksIGxlbmd0aChSUnMpCgkpCglkaWZmX2Jsb29fbXlvYyA9IGFicy4oc2lnbmFsX2Jsb28gLi0gc2lnbmFsX215b2MpCgkjIE1lYW4KCW1lYW5fbXlvYyA9IG1lYW4oc2lnbmFsX215b2MsIDIpCgltZWFuX2Jsb28gPSBtZWFuKHNpZ25hbF9ibG9vLCAyKQoJbWVhbl9kaWZmID0gbWVhbihkaWZmX2Jsb29fbXlvYywyKQoJIyBTdGQKCXN0ZF9teW9jICA9IHN0ZChzaWduYWxfbXlvYywgMikKCXN0ZF9ibG9vICA9IHN0ZChzaWduYWxfYmxvbywgMikKCXN0ZF9kaWZmID0gc3RkKGRpZmZfYmxvb19teW9jLDIpCgkjIFBsb3R0aW5nIHJlc3VsdHMKCSMgTWVhbgoJczEgPSBzY2F0dGVyKDsKCSAgICB4PUZBcywKCSAgICB5PW1lYW5fbXlvY1s6XSwKCSAgICBuYW1lPWxhYmVsc1sxXSwKCSAgICBsZWdlbmRncm91cD1sYWJlbHNbMV0sCgkgICAgbGluZT1hdHRyKDsgY29sb3I9Y29sb3JzWzFdKSwKCSkKCXMyID0gc2NhdHRlcig7CgkgICAgeD1GQXMsCgkgICAgeT1tZWFuX2Jsb29bOl0sCgkgICAgbmFtZT1sYWJlbHNbMl0sCgkgICAgbGVnZW5kZ3JvdXA9bGFiZWxzWzJdLAoJICAgIGxpbmU9YXR0cig7IGNvbG9yPWNvbG9yc1syXSksCgkpCglzMyA9IHNjYXR0ZXIoOwoJCXg9RkFzLAoJCXk9bWVhbl9kaWZmWzpdLAoJCW5hbWU9InxCbG9vZC1NeW9jfCIsCgkJbGVnZW5kZ3JvdXA9InxCbG9vZC1NeW9jfCIsCgkJbGluZT1hdHRyKGNvbG9yPWNvbG9yc1s0XSkKCSkKCSMgU3RkCglzNCA9IHNjYXR0ZXIoOwoJICAgIHg9W0ZBczsgcmV2ZXJzZShGQXMpXSwKCSAgICB5PVsobWVhbl9teW9jIC4tIHN0ZF9teW9jKVs6XTsgcmV2ZXJzZSgobWVhbl9teW9jIC4rIHN0ZF9teW9jKVs6XSldLAoJICAgIG5hbWU9bGFiZWxzWzFdLAoJICAgIGxlZ2VuZGdyb3VwPWxhYmVsc1sxXSwKCSAgICBzaG93bGVnZW5kPWZhbHNlLAoJICAgIGZpbGw9InRvc2VsZiIsCgkgICAgZmlsbGNvbG9yPSJyZ2JhKDAsMCwyNTUsMC4yKSIsCgkgICAgbGluZT1hdHRyKDsgY29sb3I9InJnYmEoMCwwLDAsMCkiKSwKCQlob3ZlcmluZm89Im5vbmUiCgkpCglzNSA9IHNjYXR0ZXIoOwoJICAgIHg9W0ZBczsgcmV2ZXJzZShGQXMpXSwKCSAgICB5PVsobWVhbl9ibG9vIC4tIHN0ZF9ibG9vKVs6XTsgcmV2ZXJzZSgobWVhbl9ibG9vIC4rIHN0ZF9ibG9vKVs6XSldLAoJICAgIG5hbWU9bGFiZWxzWzJdLAoJICAgIGxlZ2VuZGdyb3VwPWxhYmVsc1syXSwKCSAgICBzaG93bGVnZW5kPWZhbHNlLAoJICAgIGZpbGw9InRvc2VsZiIsCgkgICAgZmlsbGNvbG9yPSJyZ2JhKDI1NSwwLDAsMC4yKSIsCgkgICAgbGluZT1hdHRyKDsgY29sb3I9InJnYmEoMCwwLDAsMCkiKSwKCQlob3ZlcmluZm89Im5vbmUiCgkpCglzNiA9IHNjYXR0ZXIoOwoJCXg9W0ZBczsgcmV2ZXJzZShGQXMpXSwKCQl5PVsobWVhbl9kaWZmIC4tIHN0ZF9kaWZmKVs6XTsgcmV2ZXJzZSgobWVhbl9kaWZmIC4rIHN0ZF9kaWZmKVs6XSldLAoJCW5hbWU9InxCbG9vZC1NeW9jfCIsbGVnZW5kZ3JvdXA9InxCbG9vZC1NeW9jfCIsCgkJc2hvd2xlZ2VuZD1mYWxzZSwKCQlmaWxsPSJ0b3NlbGYiLAoJCWZpbGxjb2xvcj0icmdiYSgyNTUsMCwyNTUsMC4yKSIsCgkJbGluZT1hdHRyKGNvbG9yPSJyZ2JhKDAsMCwwLDApIiksCgkJaG92ZXJpbmZvPSJub25lIgoJKQoJIyBQbG90cwoJZmlnID0gcGxvdChbczEsIHMyLCBzMywgczQsIHM1LCBzNl0pCglyZWxheW91dCEoCgkgICAgZmlnOwoJICAgIHlheGlzPWF0dHIoOyB0aXRsZT0iU2lnbmFsIFthLnUuXSIsIHRpY2ttb2RlPSJhcnJheSIpLAoJICAgIHhheGlzPWF0dHIoOwoJICAgICAgICB0aXRsZT0iRmxpcCBhbmdsZSBbZGVnXSIsCgkgICAgICAgIHRpY2ttb2RlPSJhcnJheSIsCgkgICAgICAgIHRpY2t2YWxzPVtGQXNbMV0sIDg1LCAxMTAsIDEzMCwgRkFzW2VuZF1dLAoJICAgICAgICBjb25zdHJhaW49ImRvbWFpbiIsCgkgICAgKSwKCSAgICBmb250PWF0dHIoOyBmYW1pbHk9IkNNVSBTZXJpZiIsIHNpemU9MTYsIHNjYWxlYW5jaG9yPSJ4Iiwgc2NhbGVyYXRpbz0xKSwKCSAgICB5YXhpc19yYW5nZT1bMCwgMC4zXSwKCQl4YXhpc19yYW5nZT1bRkFzWzFdLCBGQXNbZW5kXV0sCgkgICAgd2lkdGg9NjAwLAoJICAgIGhlaWdodD00MDAsCgkgICAgaG92ZXJtb2RlPSJ4IHVuaWZpZWQiLAoJKQoJZmlnCmVuZKhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw9kkNzBkYmMyYmQtOGI5My00NzFkLTgzNDAtMDRkOThhMDA4Y2E2hKdjZWxsX2lk2SQ3MGRiYzJiZC04YjkzLTQ3MWQtODM0MC0wNGQ5OGEwMDhjYTakY29kZdkzdXNpbmcgU3VwcHJlc3NvciwgUGx1dG9VSSwgUHJvZ3Jlc3NMb2dnaW5nICMgRXh0cmFzqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTC2SRhYmVhMmM0My1kODNlLTQ0MzgtOGNkMy00YmUwNmI4MTc0YjOEp2NlbGxfaWTZJGFiZWEyYzQzLWQ4M2UtNDQzOC04Y2QzLTRiZTA2YjgxNzRiM6Rjb2Rl2d9tZCIiIiMgUmVwcm9kdWNpYmlsaXR5CgpUaGlzIFtQbHV0byBub3RlYm9va10oaHR0cHM6Ly9wbHV0b2psLm9yZy8pIGlzIHJlcHJvZHVjaWJsZSBieSBkZWZhdWx0LCBhcyBpdCBoYXMgYW4gZW1iZWRkZWQgYFByb2plY3QudG9tbGAgYW5kIGBNYW5pZmVzdC50b21sYCwgdGhhdCBzdG9yZSB0aGUgZXhhY3QgcGFja2FnZSB2ZXJzaW9ucyB1c2VkIHRvIGNyZWF0ZSB0aGUgbm90ZWJvb2suIiIiqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTD2SRhZTcyZmZjNS03ZjhlLTQ5MDctYTk5ZS04YWQ3Y2I4ZmRkYWKEp2NlbGxfaWTZJGFlNzJmZmM1LTdmOGUtNDkwNy1hOTllLThhZDdjYjhmZGRhYqRjb2Rl2URtZCIiIgpUaGUgQ01SQSBzZXF1ZW5jZSAoYENNUkFfaU5BVl9iU1NGUF9jYXJkaWFjYCkgY29uc2lzdHMgb2Y6CiIiIqhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw9kkMGI3YTQwNWUtYmJiNS0xMWVlLTA1Y2EtNGIxYzg1NjczOThkhKdjZWxsX2lk2SQwYjdhNDA1ZS1iYmI1LTExZWUtMDVjYS00YjFjODU2NzM5OGSkY29kZdk5dXNpbmcgS29tYU1SSUNvcmUsIEtvbWFNUklQbG90cywgUGx1dG9QbG90bHkgIyBFc3NlbnRpYWxzqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTC2SRkYmYxNjY3Ni02NGYyLTRkOWItYmYxYi04ZGUwNmIwNDg2MDKEp2NlbGxfaWTZJGRiZjE2Njc2LTY0ZjItNGQ5Yi1iZjFiLThkZTA2YjA0ODYwMqRjb2Rl2SVtZCIjIyAxLjEuIExvYWRpbmcgcmVxdWlyZWQgcGFja2FnZXMiqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTD2SRmMjFlOWU1OS0yNWMzLTRmMDYtOGRlNC03OTJjYjMwNWViMDGEp2NlbGxfaWTZJGYyMWU5ZTU5LTI1YzMtNGYwNi04ZGU0LTc5MmNiMzA1ZWIwMaRjb2Rl2bxtZCIiIiMgMi4gU2ltdWxhdGlvbgoKVHdvIHNpbXVsYXRpb24gZXhwZXJpbWVudHMgd2VyZSBwZXJmb3JtZWQgdG8gb3B0aW1pemUgdGhlIHNlcXVlbmNlIHBhcmFtZXRlcnMsICgxKSB0byBvcHRpbWl6ZSB0aGUgaW1hZ2luZyBmbGlwIGFuZ2xlLCBhbmQgKDIpIHRvIG9wdGltaXplIHRoZSBGYXRTYXQgZmxpcCBhbmdsZS4KCiIiIqhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw9kkMGI2YzFmNzItYjA0MC00ODNjLTk2OWItODhiZmUwOWIzMmMzhKdjZWxsX2lk2SQwYjZjMWY3Mi1iMDQwLTQ4M2MtOTY5Yi04OGJmZTA5YjMyYzOkY29kZdk9cGxvdF9zZXEoc2VxOyBzaG93X2FkYz10cnVlLCByYW5nZT1bMjkwMCwgMzMyNV0sIHNsaWRlcj10cnVlKahtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkNzg5MGY4MWUtY2IxNS00OGQyLWE4MGMtOWQ3M2Y5NTE2MDU2hKdjZWxsX2lk2SQ3ODkwZjgxZS1jYjE1LTQ4ZDItYTgwYy05ZDczZjk1MTYwNTakY29kZdoFWGJlZ2luCglmdW5jdGlvbiBDTVJBKAoJCQkJZHVtbXlfaGVhcnRfYmVhdHMsCgkJCQlpTkFWX2xpbmVzLAoJCQkJaW1fc2VnbWVudHMsCgkJCQlpTkFWX2ZsaXBfYW5nbGUsCgkJCQlpbV9mbGlwX2FuZ2xlLAoJCQkJVDJwcmVwX2R1cmF0aW9uPTUwZS0zLAoJCQkJRmF0U2F0X2ZsaXBfYW5nbGU9MTgwLAoJCQkJUlI9MS4wOwoJCQkJc2FtcGxlX3JlY292ZXJ5PXplcm9zKEJvb2wsIGR1bW15X2hlYXJ0X2JlYXRzKzEpCgkJCQkpCgkJIyBTZXEgaW5pdAoJICAgIHNlcSA9IFNlcXVlbmNlKCkKCSAgICBmb3IgaGIgPSAxIDogZHVtbXlfaGVhcnRfYmVhdHMgKyAxCgkJCXNhbXBsZSA9IHNhbXBsZV9yZWNvdmVyeVtoYl0gIyBTYW1wbGluZyByZWNvdmVyeSBjdXJ2ZSBmb3IgaGIKCQkJIyBHZW5lcmF0aW5nIHNlcSBibG9ja3MKCSAgICAgICAgdDJwID0gVDJwcmVwKFQycHJlcF9kdXJhdGlvbjsgc2FtcGxlKQoJICAgICAgICBmYXRzYXQgPSBGYXRTYXQoRmF0U2F0X2ZsaXBfYW5nbGUsIGZhdF9mcmVxOyBzYW1wbGUpCgkgICAgICAgIGJzc2ZwID0gYlNTRlAoaU5BVl9saW5lcywgaW1fc2VnbWVudHMsIGlOQVZfZmxpcF9hbmdsZSwgaW1fZmxpcF9hbmdsZTsgc2FtcGxlKQoJICAgICAgICAjIENvbmNhdGVuYXRpbmcgc2VxIGJsb2NrcwoJICAgICAgICBzZXEgKz0gdDJwCgkgICAgICAgIHNlcSArPSBmYXRzYXQKCSAgICAgICAgc2VxICs9IGJzc2ZwCgkJCSMgUlIgaW50ZXJ2YWwgY29uc2lkZXJhdGlvbgoJCQlSUmRlbGF5ID0gUlIgIC0gZHVyKGJzc2ZwKSAtIGR1cih0MnApIC0gZHVyKGZhdHNhdCkKCSAgICAgICAgc2VxICs9IHNhbXBsZSA/IEFEQyg4MCwgUlJkZWxheSkgOiBEZWxheShSUmRlbGF5KQoJICAgIGVuZAoJICAgIHJldHVybiBzZXEKCWVuZAoKCW1kIiIiLSBgQ01SQWAgKHNob3cvaGlkZSBjb2RlKQoKCWBgYGp1bGlhCgkjIFNlcSBpbml0CglzZXEgPSBTZXF1ZW5jZSgpCglmb3IgaGIgPSAxIDogZHVtbXlfaGVhcnRfYmVhdHMgKyAxCgkJIyBHZW5lcmF0aW5nIHNlcSBibG9ja3MKCQl0MnAgPSBUMnByZXAoVDJwcmVwX2R1cmF0aW9uKQoJCWZhdHNhdCA9IEZhdFNhdChGYXRTYXRfZmxpcF9hbmdsZSwgZmF0X2ZyZXEpCgkJYnNzZnAgPSBiU1NGUChpTkFWX2xpbmVzLCBpbV9zZWdtZW50cywgaU5BVl9mbGlwX2FuZ2xlLCBpbV9mbGlwX2FuZ2xlKQoJCSMgQ29uY2F0ZW5hdGluZyBzZXEgYmxvY2tzCgkJc2VxICs9IHQycAoJCXNlcSArPSBmYXRzYXQKCQlzZXEgKz0gYnNzZnAKCQkjIFJSIGludGVydmFsIGNvbnNpZGVyYXRpb24KCQlSUmRlbGF5ID0gUlIgIC0gZHVyKGJzc2ZwKSAtIGR1cih0MnApIC0gZHVyKGZhdHNhdCkKCQlzZXEgKz0gRGVsYXkoUlJkZWxheSkKCWVuZAoJYGBgIiIiCmVuZKhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw9kkMWJiM2U0OWItMWExOS00MzQzLWFjMDktZmJhZjFjYWU0YmEzhKdjZWxsX2lk2SQxYmIzZTQ5Yi0xYTE5LTQzNDMtYWMwOS1mYmFmMWNhZTRiYTOkY29kZbFUYWJsZU9mQ29udGVudHMoKahtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw9kkZWNlYjMyNmEtY2FiNi00NjVlLThlNWMtZTgzNTg4MWJkM2IwhKdjZWxsX2lk2SRlY2ViMzI2YS1jYWI2LTQ2NWUtOGU1Yy1lODM1ODgxYmQzYjCkY29kZdkobWQiIiIKIyMgMi4wLiBNYWduZXRpemF0aW9uIGR5bmFtaWNzCiIiIqhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw9kkMWE2MmFlNzEtNThkYi00OWVhLWFlNmEtOWFlYTY2MTQ1OTYzhKdjZWxsX2lk2SQxYTYyYWU3MS01OGRiLTQ5ZWEtYWU2YS05YWVhNjYxNDU5NjOkY29kZdoF32JlZ2luCglwaGFudG9tX1QxID0gcGxvdCgKCQlzY2F0dGVyKAoJCQl4PW9iai54ICogMWUzLAoJCQl5PW9iai5UMSAqIDFlMywKCQkJbW9kZT0ibWFya2VycyIsCgkJCW1hcmtlcj1hdHRyKDsKCQkJCWNvbG9yPW9iai5UMSAqIDFlMywKCQkJCWNvbG9yc2NhbGU9WwoJCQkJCVswLjAsICJibGFjayJdLAoJCQkJCVsxODMuMC9tYXhpbXVtKG9iai5UMSAuKiAxZTMpLCAiZ3JlZW4iXSwKCQkJCQlbNzAxLjAvbWF4aW11bShvYmouVDEgLiogMWUzKSwgImJsdWUiXSwKCQkJCQlbMTEyMi4wL21heGltdW0ob2JqLlQxIC4qIDFlMyksICJyZWQiXSwKCQkJCV0sCgkJCQljbWluPTAuMCwKCQkJCWNtYXg9MTEyMi4wLAoJCQkJY29sb3JiYXI9YXR0cig7dGlja3N1ZmZpeD0ibXMiLCB0aXRsZT0iVDEiKSwKCQkJCXNob3dzY2FsZT1mYWxzZQoJCQkpLAoJCQlzaG93bGVnZW5kPWZhbHNlCgkJKQoJKQoJcmVsYXlvdXQhKAoJCXBoYW50b21fVDEsCgkJeWF4aXNfdGl0bGU9IlQxIFttc10iLAoJCXhheGlzX3RpdGxlPSJ4IFttbV0iLAoJCXhheGlzX3RpY2ttb2RlPSJhcnJheSIsCgkJeGF4aXNfdGlja3ZhbHM9Wy0xLjUvMiwgMC4wLCAxLjUvMl0sCgkJeWF4aXNfdGlja21vZGU9ImFycmF5IiwKCQl5YXhpc190aWNrdmFscz11bmlxdWUob2JqLlQxICogMWUzKSwKCQl4YXhpc19yYW5nZT1bLTEuNSwgMS41XSwKCQl5YXhpc19yYW5nZT1bMC4wLCAxMjAwLjBdLAoJCXRpdGxlPSJUMSBtYXAgb2YgMUQgUGhhbnRvbSIKCSkKCXBoYW50b21fVDIgPSBwbG90KAoJCXNjYXR0ZXIoCgkJCXg9b2JqLnggKiAxZTMsCgkJCXk9b2JqLlQyICogMWUzLAoJCQltb2RlPSJtYXJrZXJzIiwKCQkJbWFya2VyPWF0dHIoOwoJCQkJY29sb3I9b2JqLlQyICogMWUzLAoJCQkJY29sb3JzY2FsZT1bCgkJCQkJWzAuMCwgImJsYWNrIl0sCgkJCQkJWzU4LjAvbWF4aW11bShvYmouVDIgLiogMWUzKSwgImJsdWUiXSwKCQkJCQlbOTMuMC9tYXhpbXVtKG9iai5UMiAuKiAxZTMpLCAiZ3JlZW4iXSwKCQkJCQlbMjYzLjAvbWF4aW11bShvYmouVDIgLiogMWUzKSwgInJlZCJdLAoJCQkJXSwKCQkJCWNtaW49MC4wLAoJCQkJY21heD0yNjMuMCwKCQkJCWNvbG9yYmFyPWF0dHIoO3RpY2tzdWZmaXg9Im1zIiwgdGl0bGU9IlQyIiksCgkJCQlzaG93c2NhbGU9ZmFsc2UKCQkJKSwKCQkJc2hvd2xlZ2VuZD1mYWxzZQoJCSkKCSkKCXJlbGF5b3V0ISgKCQlwaGFudG9tX1QyLAoJCXlheGlzX3RpdGxlPSJUMiBbbXNdIiwKCQl4YXhpc190aXRsZT0ieCBbbW1dIiwKCQl4YXhpc190aWNrbW9kZT0iYXJyYXkiLAoJCXhheGlzX3RpY2t2YWxzPVstMS41LzIsIDAuMCwgMS41LzJdLAoJCXlheGlzX3RpY2ttb2RlPSJhcnJheSIsCgkJeWF4aXNfdGlja3ZhbHM9dW5pcXVlKG9iai5UMiAqIDFlMyksCgkJeGF4aXNfcmFuZ2U9Wy0xLjUsIDEuNV0sCgkJeWF4aXNfcmFuZ2U9WzAuMCwgMzAwLjBdLAoJCXRpdGxlPSJUMiBtYXAgb2YgMUQgUGhhbnRvbSIKCSkKCVtwaGFudG9tX1QxIHBoYW50b21fVDJdCmVuZKhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw9kkZjU3YTJiNmMtZWI0Yy00NWJkLTgwNTgtNGE2MGIwMzg5MjVkhKdjZWxsX2lk2SRmNTdhMmI2Yy1lYjRjLTQ1YmQtODA1OC00YTYwYjAzODkyNWSkY29kZdoDNWJlZ2luCglmdW5jdGlvbiBjYXJkaWFjX3BoYW50b20ob2ZmOyBvZmZfZmF0PWZhdF9mcmVxKQoJICAgIG15b2NhcmQgPSBQaGFudG9te0Zsb2F0NjR9KHg9ZHgsIM+BPTAuNipvbmVzKE5pc28pLCBUMT03MDFlLTMqb25lcyhOaXNvKSwKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMj01OGUtMypvbmVzKE5pc28pLCAgICDOlHc9Ms+AKm9mZipvbmVzKE5pc28pKQoJICAgIGJsb29kID0gICBQaGFudG9te0Zsb2F0NjR9KHg9ZHgsIM+BPTAuNypvbmVzKE5pc28pLCBUMT0xMTIyZS0zKm9uZXMoTmlzbyksCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDI9MjYzZS0zKm9uZXMoTmlzbyksICAgzpR3PTLPgCpvZmYqb25lcyhOaXNvKSkKCSAgICBmYXQxID0gICAgUGhhbnRvbXtGbG9hdDY0fSh4PWR4LCDPgT0xLjAqb25lcyhOaXNvKSwgVDE9MTgzZS0zKm9uZXMoTmlzbyksCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDI9OTNlLTMqb25lcyhOaXNvKSwgICAgzpR3PTLPgCoob2ZmX2ZhdCArIG9mZikqb25lcyhOaXNvKSkKCSAgICBmYXQyID0gICAgUGhhbnRvbXtGbG9hdDY0fSh4PWR4LCDPgT0xLjAqb25lcyhOaXNvKSwgVDE9MTMwZS0zKm9uZXMoTmlzbyksCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDI9OTNlLTMqb25lcyhOaXNvKSwgICAgzpR3PTLPgCoob2ZmX2ZhdCArIG9mZikqb25lcyhOaXNvKSkKCSAgICBvYmogPSBteW9jYXJkICsgYmxvb2QgKyBmYXQxICsgZmF0MgoJICAgIHJldHVybiBvYmoKCWVuZAoJbWQiLSBDYXJkaWFjIHBoYW50b20gKHNob3cvaGlkZSBjb2RlKSIKZW5kqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTD2SQ4ZGQ3MDRhNC1iZjUwLTRkZGMtYTgzMi1kMDc0YmQ1MmFkMDGEp2NlbGxfaWTZJDhkZDcwNGE0LWJmNTAtNGRkYy1hODMyLWQwNzRiZDUyYWQwMaRjb2Rl2ZltZCJUaHJlZSBoZWFydGJlYXRzIHdlcmUgY29uc2lkZXJlZCB0byBhY2hpZXZlIHN0ZWFkeS1zdGF0ZSBhbmQgdGhlIGZvdXJ0aCBoZWFydGJlYXQgd2FzIHVzZWQgdG8gbWVhc3VyZSB0aGUgbWFnbmV0aXphdGlvbiByZXN1bHRzIGluIHRoZSBuZXh0IHNlY3Rpb25zLiKobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMPZJDZiODcwNDQzLTdiZTUtNDI4Ny1iOTU3LWNhNWMxNGVkYTg5Y4SnY2VsbF9pZNkkNmI4NzA0NDMtN2JlNS00Mjg3LWI5NTctY2E1YzE0ZWRhODljpGNvZGXaB5hiZWdpbgoJZnVuY3Rpb24gRmF0U2F0KM6xLCDOlGY7IHNhbXBsZT1mYWxzZSkKCSAgICAjIEZhdFNhdCBkZXNpZ24KCQkjIGN1dG9mZl9mcmVxID0gc3FydChsb2coMikgLyAyKSAvIGEgd2hlcmUgQjEodCkgPSBleHAoLSjPgCB0IC8gYSleMikKCQljdXRvZmYgPSBmYXRfZnJlcSAvIM+AIAkJCSAgICAgICMgY3V0b2ZmIFtIel0gPT4g4omIMS8xMCBSRiBwb3dlciB0byB3YXRlcgoJCWEgPSBzcXJ0KGxvZygyKSAvIDIpIC8gY3V0b2ZmICAgICAgICAgIyBhIFtzXQoJCc+EID0gcmFuZ2UoLVRmYXRzYXQvMiwgVGZhdHNhdC8yLCA2NCkgIyB0aW1lIFtzXQoJCWdhdXNzX3B1bHNlID0gZXhwLigtKM+AICogz4QgLyBhKSAuXiAyKSAjIEIxKHQpIFtUXQoJCSMgRmF0U2F0IHByZXB1bHNlCgkgICAgc2VxID0gU2VxdWVuY2UoKQoJICAgIHNlcSArPSBHcmFkKC04ZS0zLCAzMDAwZS02LCA1MDBlLTYpICNTcG9pbGVyMQoJICAgIHNlcSArPSBSRihnYXVzc19wdWxzZSwgVGZhdHNhdCwgzpRmKQoJICAgIM6xX3JlZiA9IGdldF9mbGlwX2FuZ2xlcyhzZXEpWzJdCgkgICAgc2VxICo9ICjOsS/OsV9yZWYrMGltKQoJICAgIGlmIHNhbXBsZQoJICAgICAgICBzZXEgKz0gQURDKDEsIDFlLTYpCgkgICAgZW5kCgkgICAgc2VxICs9IEdyYWQoOGUtMywgMzAwMGUtNiwgNTAwZS02KSAjU3BvaWxlcjIKCSAgICBpZiBzYW1wbGUKCSAgICAgICAgc2VxICs9IEFEQygxLCAxZS02KQoJICAgIGVuZAoJICAgIHJldHVybiBzZXEKCWVuZAoKCWZ1bmN0aW9uIFQycHJlcChURTsgc2FtcGxlPWZhbHNlKQoJICAgIHNlcSA9IFNlcXVlbmNlKCkKCSAgICBzZXEgKz0gUkYoOTAgKiBCMSwgVHJmKQoJICAgIHNlcSArPSBzYW1wbGUgPyBBREMoMjAsIFRFLzIgLSAxLjVUcmYpIDogRGVsYXkoVEUvMiAtIDEuNVRyZikKCSAgICBzZXEgKz0gUkYoMTgwaW0gKiBCMSAvIDIsIFRyZioyKQoJICAgIHNlcSArPSBzYW1wbGUgPyBBREMoMjAsIFRFLzIgLSAxLjVUcmYpIDogRGVsYXkoVEUvMiAtIDEuNVRyZikKCSAgICBzZXEgKz0gUkYoLTkwICogQjEsIFRyZikKCSAgICBzZXEgKz0gR3JhZCg4ZS0zLCA2MDAwZS02LCA2MDBlLTYpCgkgICAgaWYgc2FtcGxlCgkgICAgICAgIHNlcSArPSBBREMoMSwgMWUtNikKCSAgICBlbmQKCSAgICByZXR1cm4gc2VxCgllbmQKCglmdW5jdGlvbiBiU1NGUChpTkFWX2xpbmVzLCBpbV9zZWdtZW50cywgaU5BVl9mbGlwX2FuZ2xlLCBpbV9mbGlwX2FuZ2xlOyBzYW1wbGU9ZmFsc2UpCgkgICAgayA9IDAKCSAgICBzZXEgPSBTZXF1ZW5jZSgpCgkgICAgZm9yIGkgPSAwIDogaU5BVl9saW5lcyArIGltX3NlZ21lbnRzIC0gMQoJICAgICAgICBpZiBpTkFWX2xpbmVzICE9IDAKCSAgICAgICAgICAgIG0gPSAoaW1fZmxpcF9hbmdsZSAtIGlOQVZfZmxpcF9hbmdsZSkgLyBpTkFWX2xpbmVzCgkgICAgICAgICAgICDOsSA9IG1pbiggbSAqIGkgKyBpTkFWX2ZsaXBfYW5nbGUsIGltX2ZsaXBfYW5nbGUgKSAqICgtMSleawoJICAgICAgICBlbHNlCgkgICAgICAgICAgICDOsSA9IGltX2ZsaXBfYW5nbGUgKiAoLTEpXmsKCSAgICAgICAgZW5kCgkgICAgICAgIHNlcSArPSBSRijOsSAqIEIxLCBUcmYpCgkgICAgICAgIGlmIGkgPCBpTkFWX2xpbmVzICYmICFzYW1wbGUKCSAgICAgICAgICAgIHNlcSArPSBEZWxheShUUiAtIFRyZikKCSAgICAgICAgZWxzZQoJICAgICAgICAgICAgc2VxICs9IERlbGF5KFRFIC0gVHJmLzIgLSBUYWRjLzIpCgkgICAgICAgICAgICBzZXEgKz0gQURDKDEsIFRhZGMpCgkgICAgICAgICAgICBzZXEgKz0gRGVsYXkoVFIgLSBURSAtIFRhZGMvMiAtIFRyZi8yKQoJICAgICAgICBlbmQKCSAgICAgICAgayArPSAxCgkgICAgZW5kCgkgICAgcmV0dXJuIHNlcQoJZW5kCgoJbWQiLSBTZXF1ZW5jZSBidWlsZGluZyBibG9ja3M6IGBUMnByZXBgLCBgRmF0U2F0YCwgYGJTU0ZQYCAoc2hvdy9oaWRlIGNvZGUpIgplbmSobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMPZJDdkZWFkZDU4LWIyMDItNDUwOC1iNGM3LTY4NmY3NDJjYjcxM4SnY2VsbF9pZNkkN2RlYWRkNTgtYjIwMi00NTA4LWI0YzctNjg2Zjc0MmNiNzEzpGNvZGXaAT9iZWdpbgoJYmVnaW4KCQl1c2luZyBQa2cKCQliZWdpbgoJCSAgcHJpbnRsbigiT1MgJChCYXNlLlN5cy5NQUNISU5FKSIpICAgICMgT1MKCQkgIHByaW50bG4oIkp1bGlhICRWRVJTSU9OIikgICAgICAgICAgICAjIEp1bGlhIHZlcnNpb24KCQkgICMgS29tYSBzdWItcGFja2FnZXMKCQkgIGZvciAoXywgcGtnKSBpbiBmaWx0ZXIoKChfLCBwa2cpLCkgLT4gb2NjdXJzaW4oIktvbWFNUkkiLCBwa2cubmFtZSksIFBrZy5kZXBlbmRlbmNpZXMoKSkKCQkgICAgcHJpbnRsbigiJChwa2cubmFtZSkgJChwa2cudmVyc2lvbikiKQoJCSAgZW5kCgkJZW5kCgllbmQKZW5kqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTDq25vdGVib29rX2lk2SQwYmNkOGU5MC04MTgxLTExZWYtMjRjMC1mMTRmNmE0ZDMwODSraW5fdGVtcF9kaXLCqG1ldGFkYXRhgatmcm9udG1hdHRlcoamYXV0aG9ykYKkbmFtZbVDYXJsb3MgQ2FzdGlsbG8gUGFzc2mjdXJs2WRodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNTk1NzEzND9zPTQwMCZ1PWZlNjJhMmE4OTljZWQxOGU4Yjg4MmNlYmRlNmIxZWVmZTZhMTIyMmMmdj00pWltYWdl2UZodHRwczovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL2EvYTAvVGV4dGZvcm1hdHRpbmcuc3ZnpXRpdGxlu0xvdy1GaWVsZCBDTVJBIE9wdGltaXphdGlvbqR0YWdzk6RDTVJBqUxvdyBGaWVsZKxPcHRpbWl6YXRpb26kZGF0ZaoyMDI0LTA0LTE2q2Rlc2NyaXB0aW9u2TZPcHRpbWl6aW5nIHNlcXVlbmNlIHRvIGltcHJvdmUgU05SIGFuZCBmYXQgc3VwcmVzc2lvbi4=";
+window.pluto_statefile = "data:;base64,3gARpWJvbmRzgKxjZWxsX3Jlc3VsdHPeACTZJGQwMzc3ZjlhLTY4MGQtNDUwMS05MGNhLTllYTNhYjY4MWRiNIqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnaAp08ZGl2IGNsYXNzPSJtYXJrZG93biI+PGgyPjIuMi4gRmF0U2F0IGZsaXAgYW5nbGUgb3B0aW1pemF0aW9uPC9oMj4KPHA+Rm9yIHRoZSBzZWNvbmQgc2ltdWxhdGlvbiBleHBlcmltZW50LCB0aGUgZmF0IHNpZ25hbCB3YXMgbWluaW1pemVkIGJ5IHZhcnlpbmcgdGhlIEZhdFNhdCBmbGlwIGFuZ2xlICYjNDA7YmV0d2VlbiAyMCBhbmQgMjUwIGRlZyYjNDE7IHVzaW5nIHNpeCBpTkFWIHJlYWRvdXRzICYjNDA7aWRlbnRpZmllZCBleHBlcmltZW50YWxseSB0byByZXN1bHQgaW4gZ29vZCBmYXQgc3VwcHJlc3Npb24mIzQxOy4gVG8gYmUgcm9idXN0IHRvIDxzcGFuIGNsYXNzPSJ0ZXgiPiRCXzAkPC9zcGFuPiBpbmhvbW9nZW5laXRpZXMsIG11bHRpcGxlIHNpbXVsYXRpb25zIHdpdGggdGlzc3VlIGZyZXF1ZW5jeSBzaGlmdHMgJiM0MDtiZXR3ZWVuIDxzcGFuIGNsYXNzPSJ0ZXgiPiQtMSQ8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0idGV4Ij4kMVwsXG1hdGhybSYjMTIzO3BwbSYjMTI1OyQ8L3NwYW4+LCB0d2ljZSBvZiB3aGF0IHdhcyByZXBvcnRlZCBieSBSZXN0aXZvIGV0IGFsLiYjNDE7IHdlcmUgcGVyZm9ybWVkLCBhbmQgdGhlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgb2J0YWluZWQgZmF0IHNpZ25hbCB3ZXJlIGNhbGN1bGF0ZWQuPC9wPgo8L2Rpdj6kbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/x/GBJ9CwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJGQwMzc3ZjlhLTY4MGQtNDUwMS05MGNhLTllYTNhYjY4MWRiNLlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgAEMpe1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SRmYzU4NjQwYi1jNDRjLTRjMjUtYTRmZC01YTBlMTdkN2JlY2SKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52Tk8ZGl2IGNsYXNzPSJtYXJrZG93biI+PGgxPjEuIFNpbXVsYXRpb24gc2V0dXA8L2gxPgo8L2Rpdj6kbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/x/GAGoewcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJGZjNTg2NDBiLWM0NGMtNGMyNS1hNGZkLTVhMGUxN2Q3YmVjZLlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgADAf+1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjaKpnF1ZXVlZMKkbG9nc9wARoikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSp25vdGhpbmeqdGV4dC9wbGFpbqJpZNkkZDdhZGQwODYtNjllOS00OTc4LWJiNmQtNDg2YzZhNzdkNjIzpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OStDAuMDE0NzA1ODgyMzUyOTQxMTc2qnRleHQvcGxhaW6iaWTZJGQ3YWRkMDg2LTY5ZTktNDk3OC1iYjZkLTQ4NmM2YTc3ZDYyM6RmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrQwLjAyOTQxMTc2NDcwNTg4MjM1M6p0ZXh0L3BsYWluomlk2SRkN2FkZDA4Ni02OWU5LTQ5NzgtYmI2ZC00ODZjNmE3N2Q2MjOkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KzMC4wNDQxMTc2NDcwNTg4MjM1M6p0ZXh0L3BsYWluomlk2SRkN2FkZDA4Ni02OWU5LTQ5NzgtYmI2ZC00ODZjNmE3N2Q2MjOkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5K0MC4wNTg4MjM1Mjk0MTE3NjQ3MDWqdGV4dC9wbGFpbqJpZNkkZDdhZGQwODYtNjllOS00OTc4LWJiNmQtNDg2YzZhNzdkNjIzpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSszAuMDczNTI5NDExNzY0NzA1ODiqdGV4dC9wbGFpbqJpZNkkZDdhZGQwODYtNjllOS00OTc4LWJiNmQtNDg2YzZhNzdkNjIzpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSszAuMDg4MjM1Mjk0MTE3NjQ3MDaqdGV4dC9wbGFpbqJpZNkkZDdhZGQwODYtNjllOS00OTc4LWJiNmQtNDg2YzZhNzdkNjIzpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSszAuMTAyOTQxMTc2NDcwNTg4MjOqdGV4dC9wbGFpbqJpZNkkZDdhZGQwODYtNjllOS00OTc4LWJiNmQtNDg2YzZhNzdkNjIzpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSszAuMTE3NjQ3MDU4ODIzNTI5NDGqdGV4dC9wbGFpbqJpZNkkZDdhZGQwODYtNjllOS00OTc4LWJiNmQtNDg2YzZhNzdkNjIzpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSsjAuMTMyMzUyOTQxMTc2NDcwNqp0ZXh0L3BsYWluomlk2SRkN2FkZDA4Ni02OWU5LTQ5NzgtYmI2ZC00ODZjNmE3N2Q2MjOkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KzMC4xNDcwNTg4MjM1Mjk0MTE3N6p0ZXh0L3BsYWluomlk2SRkN2FkZDA4Ni02OWU5LTQ5NzgtYmI2ZC00ODZjNmE3N2Q2MjOkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KzMC4xNjE3NjQ3MDU4ODIzNTI5Nap0ZXh0L3BsYWluomlk2SRkN2FkZDA4Ni02OWU5LTQ5NzgtYmI2ZC00ODZjNmE3N2Q2MjOkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KzMC4xNzY0NzA1ODgyMzUyOTQxM6p0ZXh0L3BsYWluomlk2SRkN2FkZDA4Ni02OWU5LTQ5NzgtYmI2ZC00ODZjNmE3N2Q2MjOkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KzMC4xOTExNzY0NzA1ODgyMzUyOKp0ZXh0L3BsYWluomlk2SRkN2FkZDA4Ni02OWU5LTQ5NzgtYmI2ZC00ODZjNmE3N2Q2MjOkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KzMC4yMDU4ODIzNTI5NDExNzY0Nqp0ZXh0L3BsYWluomlk2SRkN2FkZDA4Ni02OWU5LTQ5NzgtYmI2ZC00ODZjNmE3N2Q2MjOkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KzMC4yMjA1ODgyMzUyOTQxMTc2NKp0ZXh0L3BsYWluomlk2SRkN2FkZDA4Ni02OWU5LTQ5NzgtYmI2ZC00ODZjNmE3N2Q2MjOkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KzMC4yMzUyOTQxMTc2NDcwNTg4Mqp0ZXh0L3BsYWluomlk2SRkN2FkZDA4Ni02OWU5LTQ5NzgtYmI2ZC00ODZjNmE3N2Q2MjOkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KkMC4yNap0ZXh0L3BsYWluomlk2SRkN2FkZDA4Ni02OWU5LTQ5NzgtYmI2ZC00ODZjNmE3N2Q2MjOkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KyMC4yNjQ3MDU4ODIzNTI5NDEyqnRleHQvcGxhaW6iaWTZJGQ3YWRkMDg2LTY5ZTktNDk3OC1iYjZkLTQ4NmM2YTc3ZDYyM6RmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrMwLjI3OTQxMTc2NDcwNTg4MjM2qnRleHQvcGxhaW6iaWTZJGQ3YWRkMDg2LTY5ZTktNDk3OC1iYjZkLTQ4NmM2YTc3ZDYyM6RmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrMwLjI5NDExNzY0NzA1ODgyMzU0qnRleHQvcGxhaW6iaWTZJGQ3YWRkMDg2LTY5ZTktNDk3OC1iYjZkLTQ4NmM2YTc3ZDYyM6RmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrIwLjMwODgyMzUyOTQxMTc2NDeqdGV4dC9wbGFpbqJpZNkkZDdhZGQwODYtNjllOS00OTc4LWJiNmQtNDg2YzZhNzdkNjIzpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSsjAuMzIzNTI5NDExNzY0NzA1Oap0ZXh0L3BsYWluomlk2SRkN2FkZDA4Ni02OWU5LTQ5NzgtYmI2ZC00ODZjNmE3N2Q2MjOkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KyMC4zMzgyMzUyOTQxMTc2NDcxqnRleHQvcGxhaW6iaWTZJGQ3YWRkMDg2LTY5ZTktNDk3OC1iYjZkLTQ4NmM2YTc3ZDYyM6RmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrMwLjM1Mjk0MTE3NjQ3MDU4ODI2qnRleHQvcGxhaW6iaWTZJGQ3YWRkMDg2LTY5ZTktNDk3OC1iYjZkLTQ4NmM2YTc3ZDYyM6RmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrMwLjM2NzY0NzA1ODgyMzUyOTQ0qnRleHQvcGxhaW6iaWTZJGQ3YWRkMDg2LTY5ZTktNDk3OC1iYjZkLTQ4NmM2YTc3ZDYyM6RmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrMwLjM4MjM1Mjk0MTE3NjQ3MDU2qnRleHQvcGxhaW6iaWTZJGQ3YWRkMDg2LTY5ZTktNDk3OC1iYjZkLTQ4NmM2YTc3ZDYyM6RmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrMwLjM5NzA1ODgyMzUyOTQxMTc0qnRleHQvcGxhaW6iaWTZJGQ3YWRkMDg2LTY5ZTktNDk3OC1iYjZkLTQ4NmM2YTc3ZDYyM6RmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrIwLjQxMTc2NDcwNTg4MjM1MjmqdGV4dC9wbGFpbqJpZNkkZDdhZGQwODYtNjllOS00OTc4LWJiNmQtNDg2YzZhNzdkNjIzpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSsjAuNDI2NDcwNTg4MjM1Mjk0Map0ZXh0L3BsYWluomlk2SRkN2FkZDA4Ni02OWU5LTQ5NzgtYmI2ZC00ODZjNmE3N2Q2MjOkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KyMC40NDExNzY0NzA1ODgyMzUzqnRleHQvcGxhaW6iaWTZJGQ3YWRkMDg2LTY5ZTktNDk3OC1iYjZkLTQ4NmM2YTc3ZDYyM6RmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrMwLjQ1NTg4MjM1Mjk0MTE3NjQ2qnRleHQvcGxhaW6iaWTZJGQ3YWRkMDg2LTY5ZTktNDk3OC1iYjZkLTQ4NmM2YTc3ZDYyM6RmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrMwLjQ3MDU4ODIzNTI5NDExNzY0qnRleHQvcGxhaW6iaWTZJGQ3YWRkMDg2LTY5ZTktNDk3OC1iYjZkLTQ4NmM2YTc3ZDYyM6RmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrIwLjQ4NTI5NDExNzY0NzA1ODiqdGV4dC9wbGFpbqJpZNkkZDdhZGQwODYtNjllOS00OTc4LWJiNmQtNDg2YzZhNzdkNjIzpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSozAuNap0ZXh0L3BsYWluomlk2SRkN2FkZDA4Ni02OWU5LTQ5NzgtYmI2ZC00ODZjNmE3N2Q2MjOkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KyMC41MTQ3MDU4ODIzNTI5NDExqnRleHQvcGxhaW6iaWTZJGQ3YWRkMDg2LTY5ZTktNDk3OC1iYjZkLTQ4NmM2YTc3ZDYyM6RmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrIwLjUyOTQxMTc2NDcwNTg4MjSqdGV4dC9wbGFpbqJpZNkkZDdhZGQwODYtNjllOS00OTc4LWJiNmQtNDg2YzZhNzdkNjIzpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSsjAuNTQ0MTE3NjQ3MDU4ODIzNap0ZXh0L3BsYWluomlk2SRkN2FkZDA4Ni02OWU5LTQ5NzgtYmI2ZC00ODZjNmE3N2Q2MjOkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KyMC41NTg4MjM1Mjk0MTE3NjQ3qnRleHQvcGxhaW6iaWTZJGQ3YWRkMDg2LTY5ZTktNDk3OC1iYjZkLTQ4NmM2YTc3ZDYyM6RmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrIwLjU3MzUyOTQxMTc2NDcwNTiqdGV4dC9wbGFpbqJpZNkkZDdhZGQwODYtNjllOS00OTc4LWJiNmQtNDg2YzZhNzdkNjIzpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSsjAuNTg4MjM1Mjk0MTE3NjQ3Map0ZXh0L3BsYWluomlk2SRkN2FkZDA4Ni02OWU5LTQ5NzgtYmI2ZC00ODZjNmE3N2Q2MjOkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KyMC42MDI5NDExNzY0NzA1ODgyqnRleHQvcGxhaW6iaWTZJGQ3YWRkMDg2LTY5ZTktNDk3OC1iYjZkLTQ4NmM2YTc3ZDYyM6RmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrIwLjYxNzY0NzA1ODgyMzUyOTSqdGV4dC9wbGFpbqJpZNkkZDdhZGQwODYtNjllOS00OTc4LWJiNmQtNDg2YzZhNzdkNjIzpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSsjAuNjMyMzUyOTQxMTc2NDcwNqp0ZXh0L3BsYWluomlk2SRkN2FkZDA4Ni02OWU5LTQ5NzgtYmI2ZC00ODZjNmE3N2Q2MjOkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KyMC42NDcwNTg4MjM1Mjk0MTE4qnRleHQvcGxhaW6iaWTZJGQ3YWRkMDg2LTY5ZTktNDk3OC1iYjZkLTQ4NmM2YTc3ZDYyM6RmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrIwLjY2MTc2NDcwNTg4MjM1MjmqdGV4dC9wbGFpbqJpZNkkZDdhZGQwODYtNjllOS00OTc4LWJiNmQtNDg2YzZhNzdkNjIzpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSsjAuNjc2NDcwNTg4MjM1Mjk0Mqp0ZXh0L3BsYWluomlk2SRkN2FkZDA4Ni02OWU5LTQ5NzgtYmI2ZC00ODZjNmE3N2Q2MjOkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KyMC42OTExNzY0NzA1ODgyMzUzqnRleHQvcGxhaW6iaWTZJGQ3YWRkMDg2LTY5ZTktNDk3OC1iYjZkLTQ4NmM2YTc3ZDYyM6RmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrIwLjcwNTg4MjM1Mjk0MTE3NjWqdGV4dC9wbGFpbqJpZNkkZDdhZGQwODYtNjllOS00OTc4LWJiNmQtNDg2YzZhNzdkNjIzpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSsjAuNzIwNTg4MjM1Mjk0MTE3Nqp0ZXh0L3BsYWluomlk2SRkN2FkZDA4Ni02OWU5LTQ5NzgtYmI2ZC00ODZjNmE3N2Q2MjOkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KyMC43MzUyOTQxMTc2NDcwNTg5qnRleHQvcGxhaW6iaWTZJGQ3YWRkMDg2LTY5ZTktNDk3OC1iYjZkLTQ4NmM2YTc3ZDYyM6RmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkqQwLjc1qnRleHQvcGxhaW6iaWTZJGQ3YWRkMDg2LTY5ZTktNDk3OC1iYjZkLTQ4NmM2YTc3ZDYyM6RmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrIwLjc2NDcwNTg4MjM1Mjk0MTGqdGV4dC9wbGFpbqJpZNkkZDdhZGQwODYtNjllOS00OTc4LWJiNmQtNDg2YzZhNzdkNjIzpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSsjAuNzc5NDExNzY0NzA1ODgyNKp0ZXh0L3BsYWluomlk2SRkN2FkZDA4Ni02OWU5LTQ5NzgtYmI2ZC00ODZjNmE3N2Q2MjOkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KyMC43OTQxMTc2NDcwNTg4MjM1qnRleHQvcGxhaW6iaWTZJGQ3YWRkMDg2LTY5ZTktNDk3OC1iYjZkLTQ4NmM2YTc3ZDYyM6RmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrIwLjgwODgyMzUyOTQxMTc2NDeqdGV4dC9wbGFpbqJpZNkkZDdhZGQwODYtNjllOS00OTc4LWJiNmQtNDg2YzZhNzdkNjIzpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSsjAuODIzNTI5NDExNzY0NzA1OKp0ZXh0L3BsYWluomlk2SRkN2FkZDA4Ni02OWU5LTQ5NzgtYmI2ZC00ODZjNmE3N2Q2MjOkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KyMC44MzgyMzUyOTQxMTc2NDcxqnRleHQvcGxhaW6iaWTZJGQ3YWRkMDg2LTY5ZTktNDk3OC1iYjZkLTQ4NmM2YTc3ZDYyM6RmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrIwLjg1Mjk0MTE3NjQ3MDU4ODKqdGV4dC9wbGFpbqJpZNkkZDdhZGQwODYtNjllOS00OTc4LWJiNmQtNDg2YzZhNzdkNjIzpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSsjAuODY3NjQ3MDU4ODIzNTI5NKp0ZXh0L3BsYWluomlk2SRkN2FkZDA4Ni02OWU5LTQ5NzgtYmI2ZC00ODZjNmE3N2Q2MjOkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KyMC44ODIzNTI5NDExNzY0NzA2qnRleHQvcGxhaW6iaWTZJGQ3YWRkMDg2LTY5ZTktNDk3OC1iYjZkLTQ4NmM2YTc3ZDYyM6RmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrIwLjg5NzA1ODgyMzUyOTQxMTiqdGV4dC9wbGFpbqJpZNkkZDdhZGQwODYtNjllOS00OTc4LWJiNmQtNDg2YzZhNzdkNjIzpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSsjAuOTExNzY0NzA1ODgyMzUyOap0ZXh0L3BsYWluomlk2SRkN2FkZDA4Ni02OWU5LTQ5NzgtYmI2ZC00ODZjNmE3N2Q2MjOkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KyMC45MjY0NzA1ODgyMzUyOTQyqnRleHQvcGxhaW6iaWTZJGQ3YWRkMDg2LTY5ZTktNDk3OC1iYjZkLTQ4NmM2YTc3ZDYyM6RmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrIwLjk0MTE3NjQ3MDU4ODIzNTOqdGV4dC9wbGFpbqJpZNkkZDdhZGQwODYtNjllOS00OTc4LWJiNmQtNDg2YzZhNzdkNjIzpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSsjAuOTU1ODgyMzUyOTQxMTc2Nap0ZXh0L3BsYWluomlk2SRkN2FkZDA4Ni02OWU5LTQ5NzgtYmI2ZC00ODZjNmE3N2Q2MjOkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KyMC45NzA1ODgyMzUyOTQxMTc2qnRleHQvcGxhaW6iaWTZJGQ3YWRkMDg2LTY5ZTktNDk3OC1iYjZkLTQ4NmM2YTc3ZDYyM6RmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2pmt3YXJnc5GSqHByb2dyZXNzkrIwLjk4NTI5NDExNzY0NzA1ODmqdGV4dC9wbGFpbqJpZNkkZDdhZGQwODYtNjllOS00OTc4LWJiNmQtNDg2YzZhNzdkNjIzpGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjama3dhcmdzkZKocHJvZ3Jlc3OSozEuMKp0ZXh0L3BsYWluomlk2SRkN2FkZDA4Ni02OWU5LTQ5NzgtYmI2ZC00ODZjNmE3N2Q2MjOkZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNqZrd2FyZ3ORkqhwcm9ncmVzc5KmImRvbmUiqnRleHQvcGxhaW6iaWTZJGQ3YWRkMDg2LTY5ZTktNDk3OC1iYjZkLTQ4NmM2YTc3ZDYyM6RmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmncnVubmluZ8Kmb3V0cHV0hqRib2R5oKRtaW1lqnRleHQvcGxhaW6scm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/yCmCu4ywcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNrlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzwAAAAFr14CxtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkOTIxOTRmY2ItNTgyYS00OWNlLWFhZDctMjBiMDE0NWQ0MGQziqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedkzPGRpdiBjbGFzcz0ibWFya2Rvd24iPjxoMj4xLjMuIFNlcXVlbmNlPC9oMj4KPC9kaXY+pG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv8fxgHPNsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQ5MjE5NGZjYi01ODJhLTQ5Y2UtYWFkNy0yMGIwMTQ1ZDQwZDO5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4AArTwtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkZjQ5NjU1Y2MtNDYwZS00OTgxLTkyZWEtZGZkNjE0NzMwOGJmiqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedmcPGRpdiBjbGFzcz0ibWFya2Rvd24iPjxwPkJsb2NoIHNpbXVsYXRpb25zIHdlcmUgcGVyZm9ybWVkIHVzaW5nIDxzdHJvbmc+S29tYU1SSS5qbDwvc3Ryb25nPiB0byBvcHRpbWl6ZSB0aGUgcHJvcG9zZWQgd2hvbGUtaGVhcnQgQ01SQSBwYXJhbWV0ZXJzLjwvcD4KPC9kaXY+pG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv8fxgEcXsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SRmNDk2NTVjYy00NjBlLTQ5ODEtOTJlYS1kZmQ2MTQ3MzA4Yma5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4AA5WetXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkM2Q3ZTdkMjAtYTc3YS00OGIzLWFkMmUtNmI2MjEyMjdiZTE2iqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedoEFjxkaXYgY2xhc3M9Im1hcmtkb3duIj48aDE+UmVmZXJlbmNlczwvaDE+Cjx1bD4KPGxpPjxwPjxzdHJvbmc+Q2FzdGlsbG8tUGFzc2kgQzwvc3Ryb25nPiwgQ29yb25hZG8gUiwgVmFyZWxhLU1hdHRhdGFsbCBHLCBBbGJlcm9sYS1Mw7NwZXogQywgQm90bmFyIFIsIElyYXJyYXphdmFsIFAuIEtvbWFNUkkuamw6IEFuIG9wZW4tc291cmNlIGZyYW1ld29yayBmb3IgZ2VuZXJhbCBNUkkgc2ltdWxhdGlvbnMgd2l0aCBHUFUgYWNjZWxlcmF0aW9uLiBNYWduZXRpYyBSZXNvbmFuY2UgaW4gTWVkaWNpbmUuIDIwMjM7OTAmIzQwOzEmIzQxOzozMjktMzQyLiA8YSBocmVmPSJkb2k6MTAuMTAwMi9tcm0uMjk2MzUiPmRvaToxMC4xMDAyL21ybS4yOTYzNTwvYT48L3A+CjwvbGk+CjxsaT48cD48c3Ryb25nPkNhbXBiZWxsLVdhc2hidXJuIEFFPC9zdHJvbmc+LCBSYW1hc2F3bXkgUiwgUmVzdGl2byBNQywgZXQgYWwuIE9wcG9ydHVuaXRpZXMgaW4gSW50ZXJ2ZW50aW9uYWwgYW5kIERpYWdub3N0aWMgSW1hZ2luZyBieSBVc2luZyBIaWdoLVBlcmZvcm1hbmNlIExvdy1GaWVsZC1TdHJlbmd0aCBNUkkuIFJhZGlvbG9neS4gMjAxOTsyOTMmIzQwOzImIzQxOzozODQtMzkzLiA8YSBocmVmPSJkb2k6MTAuMTE0OC9yYWRpb2wuMjAxOTE5MDQ1MiI+ZG9pOjEwLjExNDgvcmFkaW9sLjIwMTkxOTA0NTI8L2E+PC9wPgo8L2xpPgo8bGk+PHA+PHN0cm9uZz5SZXN0aXZvIE1DPC9zdHJvbmc+LCBSYW1hc2F3bXkgUiwgQmFuZGV0dGluaSBXUCwgSGVyemthIERBLCBDYW1wYmVsbC1XYXNoYnVybiBBRS4gRWZmaWNpZW50IHNwaXJhbCBpbi1vdXQgYW5kIEVQSSBiYWxhbmNlZCBzdGVhZHktc3RhdGUgZnJlZSBwcmVjZXNzaW9uIGNpbmUgaW1hZ2luZyB1c2luZyBhIGhpZ2gtcGVyZm9ybWFuY2UgMC41NVQgTVJJLiBNYWduZXRpYyBSZXNvbmFuY2UgaW4gTWVkaWNpbmUuIDIwMjA7ODQmIzQwOzUmIzQxOzoyMzY0LTIzNzUuIDxhIGhyZWY9ImRvaToxMC4xMDAyL21ybS4yODI3OCI+ZG9pOjEwLjEwMDIvbXJtLjI4Mjc4PC9hPjwvcD4KPC9saT4KPC91bD4KPC9kaXY+pG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv8fxgU9RsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQzZDdlN2QyMC1hNzdhLTQ4YjMtYWQyZS02YjYyMTIyN2JlMTa5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4ACkQftXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkYTk5YzBjNDctMWI3MC00MzYyLWEyZjYtYTdlMzI1OTYwNmZhiqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedoCITxkaXYgY2xhc3M9Im1hcmtkb3duIj48aDE+TG93LUZpZWxkIENNUkEgT3B0aW1pemF0aW9uPC9oMT4KPHA+VGhpcyBub3RlYm9vayByZXByb2R1Y2VzIHRoZSBzaW11bGF0aW9uIGV4cGVyaW1lbnRzIHBlcmZvcm1lZCBpbiBvdXIgbWFudXNjcmlwdDo8L3A+CjxibG9ja3F1b3RlPgo8cD48c3Ryb25nPiZxdW90O0hpZ2hseSBFZmZpY2llbnQgaU5BVi1iYXNlZCAzRCBXaG9sZS1IZWFydCBDTVJBIGF0IDAuNTVUJnF1b3Q7PC9zdHJvbmc+PC9wPgo8cD48c3Ryb25nPkNhcmxvcyBDYXN0aWxsby1QYXNzaTwvc3Ryb25nPiwgS2FybCBQLiBLdW56ZSwgTWljaGFlbCBHLiBDcmFiYiwgQ2FtaWxhIE11w7FveiwgQW5hc3Rhc2lhIEZvdGFraSwgUmFkaG91ZW5lIE5lamksIFBhYmxvIElyYXJyYXphdmFsLCBDbGF1ZGlhIFByaWV0bywgYW5kIFJlbsOpIE0uIEJvdG5hcjwvcD4KPHA+JiM0MDsyMDI0JiM0MTs8L3A+CjwvYmxvY2txdW90ZT4KPHA+U3VibWl0dGVkIHRvIE1hZ25ldGljIFJlc29uYW5jZSBpbiBNZWRpY2luZSAmIzQwO01STSYjNDE7LjwvcD4KPC9kaXY+pG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv8fxgAUUsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SRhOTljMGM0Ny0xYjcwLTQzNjItYTJmNi1hN2UzMjU5NjA2ZmG5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4ABM4ntXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkYTE1ZDZiNjQtZjhlZS00ZWU0LTgxMmMtZDQ5Y2Y1ZWE3ODRkiqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedoDGzxkaXYgY2xhc3M9Im1hcmtkb3duIj48aDI+MS40LiBQaGFudG9tPC9oMj4KPHA+RWFjaCB0aXNzdWUgd2FzIHJlcHJlc2VudGVkIHdpdGggMjAwIGlzb2Nocm9tYXRzIGRpc3RyaWJ1dGVkIGFsb25nIHRoZSA8c3BhbiBjbGFzcz0idGV4Ij4keiQ8L3NwYW4+LWF4aXMgdG8gc2ltdWxhdGUgZ3JhZGllbnQgc3BvaWxpbmcgZWZmZWN0cy4gVGhlIGlzb2Nocm9tYXRzIGZvciBlYWNoIHRpc3N1ZSB3ZXJlIGluc2lkZSBhIDFEIHZveGVsIG9mIHNpemUgPHNwYW4gY2xhc3M9InRleCI+JDEuNVwsXG1hdGhybSYjMTIzO21tJiMxMjU7JDwvc3Bhbj4uIFRoZSB2YWx1ZXMgZm9yIDxzcGFuIGNsYXNzPSJ0ZXgiPiRUXzEkPC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9InRleCI+JFRfMiQ8L3NwYW4+IGZvciBibG9vZCwgbXlvY2FyZGlhbCBtdXNjbGUsIGFuZCBmYXQgYXQgMC41NVQgd2VyZSBvYnRhaW5lZCBmcm9tIHRoZSB3b3JrIG9mIENhbXBiZWxsLVdhc2hidXJuLCBldCBhbC4gRmF0IHNwaW5zIHdlcmUgc2ltdWxhdGVkIHVzaW5nIGEgY2hlbWljYWwgc2hpZnQgb2YgPHNwYW4gY2xhc3M9InRleCI+JC0zLjRcLFxtYXRocm0mIzEyMztwcG0mIzEyNTskPC9zcGFuPiwgc2ltdWxhdGluZyByZWd1bGFyIGZhdCB3aXRoIDxzcGFuIGNsYXNzPSJ0ZXgiPiRUXzEmIzYxOzE4M1wsXG1hdGhybSYjMTIzO21zJiMxMjU7JDwvc3Bhbj4sIGFuZCBmYXN0LXJlY292ZXJpbmcgZmF0IHdpdGggPHNwYW4gY2xhc3M9InRleCI+JFRfMSYjNjE7MTMwXCxcbWF0aHJtJiMxMjM7bXMmIzEyNTskPC9zcGFuPi48L3A+CjwvZGl2PqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b/H8YCh07BwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkYTE1ZDZiNjQtZjhlZS00ZWU0LTgxMmMtZDQ5Y2Y1ZWE3ODRkuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAAR1l7VwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJGYwYTgxYzlmLTU2MTYtNDY2My05NDhmLWE0MDg0ZTE3MTlhZoqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnZZDxkaXYgY2xhc3M9Im1hcmtkb3duIj48dWw+CjxsaT48cD5QaGFudG9tIHBhcmFtZXRlcnMgJiM0MDtzaG93L2hpZGUgY29kZSYjNDE7PC9wPgo8L2xpPgo8L3VsPgo8L2Rpdj6kbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/yB55O/ewcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJGYwYTgxYzlmLTU2MTYtNDY2My05NDhmLWE0MDg0ZTE3MTlhZrlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgH1u3q1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SRkOTcxNWJjMS00OWNkLTRkZjgtOGRiZi1jMDZkZTQyYWQ1NTCKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52mqJCTxzY3JpcHQgaWQ9J3Bsb3RfMSc+CgkJLy8gV2Ugc3RhcnQgYnkgcHV0dGluZyBhbGwgdGhlIHZhcmlhYmxlIGludGVycG9sYXRpb24gaGVyZSBhdCB0aGUgYmVnaW5uaW5nCgkJLy8gV2UgaGF2ZSB0byBjb252ZXJ0IGFsbCB0eXBlZGFycmF5cyBpbiB0aGUgbGF5b3V0IHRvIG5vcm1hbCBhcnJheXMuIFNlZSBJc3N1ZSAjMjUKCQkvLyBXZSB1c2UgbG9kYXNoIGZvciB0aGlzIGZvciBjb21wYWN0bmVzcwoJCWZ1bmN0aW9uIHJlbW92ZVR5cGVkQXJyYXkobykgewoJCQlyZXR1cm4gXy5pc1R5cGVkQXJyYXkobykgPyBBcnJheS5mcm9tKG8pIDoKCQkJXy5pc1BsYWluT2JqZWN0KG8pID8gXy5tYXBWYWx1ZXMobywgcmVtb3ZlVHlwZWRBcnJheSkgOiAKCQkJbwoJCX0KCgkJLy8gUHVibGlzaCB0aGUgcGxvdCBvYmplY3QgdG8gSlMKCQlsZXQgcGxvdF9vYmogPSBfLnVwZGF0ZSgvKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIEFic3RyYWN0UGx1dG9EaW5nZXRqZXMuRGlzcGxheS5wdWJsaXNoZWRfdG9fanMgKi8gZ2V0UHVibGlzaGVkT2JqZWN0KCJlZDI3ZGUxYS04MWQ5LTExZWYtM2I3My0xYjExNjMxMmRhZTcvYjIyZGU5ODc4NDg2NzkyOCIpLCAibGF5b3V0IiwgcmVtb3ZlVHlwZWRBcnJheSkKCQkvLyBHZXQgdGhlIHBsb3RseSBsaXN0ZW5lcnMKCQljb25zdCBwbG90bHlfbGlzdGVuZXJzID0ge30KCQkvLyBHZXQgdGhlIEpTIGxpc3RlbmVycwoJCWNvbnN0IGpzX2xpc3RlbmVycyA9IHt9CgkJLy8gRGVhbCB3aXRoIGV2ZW50dWFsIGN1c3RvbSBjbGFzc2VzCgkJbGV0IGN1c3RvbV9jbGFzc2xpc3QgPSBbXQoKCgkJLy8gTG9hZCB0aGUgcGxvdGx5IGxpYnJhcnkKCQlsZXQgUGxvdGx5ID0gdW5kZWZpbmVkCgkJdHJ5IHsKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoIi4vcGxvdGx5anMvcGxvdGx5anMtMi4yNi4yLm1pbi5qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0gY2F0Y2ggKGUpIHsKCQkJY29uc29sZS5sb2coIkxvY2FsIGxvYWQgZmFpbGVkLCB0cnlpbmcgd2l0aCB0aGUgd2ViIGVzbS5zaCB2ZXJzaW9uIikKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoImh0dHBzOi8vZXNtLnNoL3YxMzUvcGxvdGx5LmpzLWRpc3QtbWluQDIuMjYuMi9lc25leHQvcGxvdGx5LmpzLWRpc3QtbWluLm1qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0KCgkJLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0byBmb3JjZSBsb2NhbCBtYXRoamF4IGZvbnQgY2FjaGUKCQlpZiAoZmFsc2UgJiYgd2luZG93Py5NYXRoSmF4Py5jb25maWc/LnN2Zz8uZm9udENhY2hlID09PSAnZ2xvYmFsJykgewoJCQl3aW5kb3cuTWF0aEpheC5jb25maWcuc3ZnLmZvbnRDYWNoZSA9ICdsb2NhbCcKCQl9CgoJCS8vIEZsYWcgdG8gY2hlY2sgaWYgdGhpcyBjZWxsIHdhcyAgbWFudWFsbHkgcmFuIG9yIHJlYWN0aXZlbHkgcmFuCmNvbnN0IGZpcnN0UnVuID0gdGhpcyA/IGZhbHNlIDogdHJ1ZQpjb25zdCBDT05UQUlORVIgPSB0aGlzID8/IGh0bWxgPGRpdiBjbGFzcz0ncGx1dG9wbG90bHktY29udGFpbmVyJz5gCmNvbnN0IFBMT1QgPSBDT05UQUlORVIucXVlcnlTZWxlY3RvcignLmpzLXBsb3RseS1wbG90JykgPz8gQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgPGRpdj5gKQpjb25zdCBwYXJlbnQgPSBDT05UQUlORVIucGFyZW50RWxlbWVudAovLyBXZSB1c2UgYSBjb250cm9sbGVyIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lcnMgdXBvbiBpbnZhbGlkYXRpb24KY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKQovLyBXZSBoYXZlIHRvIGFkZCB0aGlzIHRvIGtlZXAgc3VwcG9ydGluZyBAYmluZCB3aXRoIHRoZSBvbGQgQVBJIHVzaW5nIFBMT1QKUExPVC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChlKSA9PiB7CglDT05UQUlORVIudmFsdWUgPSBQTE9ULnZhbHVlCglpZiAoZS5idWJibGVzKSB7CgkJcmV0dXJuCgl9CglDT05UQUlORVIuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2lucHV0JykpCn0sIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KQoKCS8vIFRoaXMgY3JlYXRlIHRoZSBzdHlsZSBzdWJkaXYgb24gZmlyc3QgcnVuCglmaXJzdFJ1biAmJiBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGAKCTxzdHlsZT4KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgewoJCXdpZHRoOiAxMDAlOwoJCWhlaWdodDogMTAwJTsKCQltaW4taGVpZ2h0OiAwOwoJCW1pbi13aWR0aDogMDsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgLmpzLXBsb3RseS1wbG90IC5wbG90bHkgZGl2IHsKCQltYXJnaW46IDAgYXV0bzsgLy8gVGhpcyBjZW50ZXJzIHRoZSBwbG90Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLnBvcHBlZC1vdXQgewoJCW92ZXJmbG93OiBhdXRvOwoJCXotaW5kZXg6IDEwMDA7CgkJcG9zaXRpb246IGZpeGVkOwoJCXJlc2l6ZTogYm90aDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDBweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMHB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgewoJCWRpc3BsYXk6IGZsZXg7CgkJZmxleC1mbG93OiByb3cgd3JhcDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAxMnB4OwoJCXBvc2l0aW9uOiBmaXhlZDsKCQl6LWluZGV4OiAxMDAxOwoJCWN1cnNvcjogbW92ZTsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIC0xMDAlKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBzcGFuIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJZmxleDogMQoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIuaGlkZGVuIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuIHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlIHsKCQlwYWRkaW5nLXJpZ2h0OiA1cHg7CgkJcGFkZGluZy1sZWZ0OiAycHg7CgkJY3Vyc29yOiB0ZXh0OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZmxleDogMCAwIDEwMCU7CgkJdGV4dC1hbGlnbjogY2VudGVyOwoJCWJvcmRlci10b3A6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQltYXJnaW4tdG9wOiA1cHg7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZpbGVuYW1lIHsKCQltYXJnaW4tbGVmdDogM3B4OwoJCXRleHQtYWxpZ246IGxlZnQ7CgkJbWluLXdpZHRoOiBtaW4oNjAlLCBtaW4tY29udGVudCk7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCAubGFiZWwgewoJCWZsZXg6IDAgMCAwOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5mb3JtYXQgewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCQlmbGV4OiAxIDAgYXV0bzsKCQltaW4td2lkdGg6IDMwcHg7CgkJbWFyZ2luLXJpZ2h0OiAxMHB4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCQlmbGV4LWZsb3c6IGNvbHVtbjsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlwYWRkaW5nLWxlZnQ6IDNweDsKCQl6LWluZGV4OiAyMDAwOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIHsKCQljdXJzb3I6IHBvaW50ZXI7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJcGFkZGluZzogM3B4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKC0zcHgsIC02cHgpOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpub3QoLnNlbGVjdGVkKSB7CgkJbWFyZ2luLXRvcDogM3B4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uLnNlbGVjdGVkIHsKCQlvcmRlcjogLTE7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246aG92ZXIgewoJCWJhY2tncm91bmQtY29sb3I6IHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJfQoJc3Bhbi5jb25maWctdmFsdWUgewoJCWZvbnQtd2VpZ2h0OiBub3JtYWw7CgkJY29sb3I6IHZhcigtLXBsdXRvLW91dHB1dC1jb2xvcik7CgkJZGlzcGxheTogbm9uZTsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIGNhbGMoLTEwMCUgLSAxMHB4KSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLmxhYmVsIHsKCQl1c2VyLXNlbGVjdDogbm9uZTsKCX0KCS5sYWJlbDpob3ZlciBzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCW1pbi13aWR0aDogMTUwcHg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4ubWF0Y2hpbmctY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLW1hY3JvLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5kaWZmZXJlbnQtY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLXRhZy1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9Cjwvc3R5bGU+CmApCgpsZXQgb3JpZ2luYWxfaGVpZ2h0ID0gcGxvdF9vYmoubGF5b3V0LmhlaWdodApsZXQgb3JpZ2luYWxfd2lkdGggPSBwbG90X29iai5sYXlvdXQud2lkdGgKLy8gRm9yIHRoZSBoZWlnaHQgd2UgaGF2ZSB0byBhbHNvIHB1dCBhIGZpeGVkIHZhbHVlIGluIGNhc2UgdGhlIHBsb3QgaXMgcHV0IG9uIGEgbm9uLWZpeGVkLXNpemUgY29udGFpbmVyIChsaWtlIHRoZSBkZWZhdWx0IHdyYXBwZXIpCi8vIFdlIGRlZmluZSBhIHZhcmlhYmxlIHRvIGNoZWNrIHdoZXRoZXIgd2Ugc3RpbGwgaGF2ZSB0byByZW1vdmUgdGhlIGZpeGVkIGhlaWdodApsZXQgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmlyc3RSdW4KbGV0IGNvbnRhaW5lcl9oZWlnaHQgPSBvcmlnaW5hbF9oZWlnaHQgPz8gUExPVC5jb250YWluZXJfaGVpZ2h0ID8/IDQwMApDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX2hlaWdodCArICdweCcKCi8vIFdlIGNyZWF0ZSBhIFByb21pc2UgdmVyc2lvbiBvZiBzZXRUaW1lb3V0CmZ1bmN0aW9uIGRlbGF5KG1zKSB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7Cn0KCi8vIFdlIGltcG9ydCBpbnRlcmFjdCBmb3IgZHJhZ2dpbmcvcmVzaXppbmcKY29uc3QgeyBkZWZhdWx0OiBpbnRlcmFjdCB9ID0gYXdhaXQgaW1wb3J0KCdodHRwczovL2VzbS5zaC9pbnRlcmFjdGpzQDEuMTAuMTknKQoKCmZ1bmN0aW9uIGdldEltYWdlT3B0aW9ucygpIHsKICBjb25zdCBvID0gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogIHJldHVybiB7CiAgICBmb3JtYXQ6IG8uZm9ybWF0ID8/ICJwbmciLAogICAgd2lkdGg6IG8ud2lkdGggPz8gb3JpZ2luYWxfd2lkdGgsCiAgICBoZWlnaHQ6IG8uaGVpZ2h0ID8/IG9yaWdpbmFsX2hlaWdodCwKICAgIHNjYWxlOiBvLnNjYWxlID8/IDEsCiAgICBmaWxlbmFtZTogby5maWxlbmFtZSA/PyAibmV3cGxvdCIsCiAgfTsKfQoKY29uc3QgQ0xJUEJPQVJEX0hFQURFUiA9CiAgQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoIi5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIikgPz8KICBDT05UQUlORVIuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgImFmdGVyYmVnaW4iLAogICAgaHRtbGA8ZGl2IGNsYXNzPSJwbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIGhpZGRlbiI+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmb3JtYXQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+Rm9ybWF0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZvcm1hdCI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB3aWR0aCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5XaWR0aDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSB3aWR0aCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGhlaWdodCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5IZWlnaHQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgaGVpZ2h0Ij48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2NhbGUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+U2NhbGU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgc2NhbGUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzZXQiPlNldDwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB1bnNldCI+VW5zZXQ8L2J1dHRvbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZpbGVuYW1lIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZpbGVuYW1lOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZpbGVuYW1lIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgIDwvZGl2PmAKICApOwoKZnVuY3Rpb24gY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcikgewogIGNvbnN0IHZhbGlkX2NsYXNzZXMgPSBbCiAgICAibWlzc2luZy1jb25maWciLAogICAgIm1hdGNoaW5nLWNvbmZpZyIsCiAgICAiZGlmZmVyZW50LWNvbmZpZyIsCiAgXTsKICBmdW5jdGlvbiBzZXRDbGFzcyhjbCkgewogICAgZm9yIChjb25zdCBuYW1lIG9mIHZhbGlkX2NsYXNzZXMpIHsKICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUobmFtZSwgbmFtZSA9PSBjbCk7CiAgICB9CiAgfQogIC8vIFdlIHVzZSB0aGUgY3VzdG9tIGdldHRlcnMgd2UnbGwgc2V0IHVwIGluIHRoZSBjb250YWluZXIKICBjb25zdCB7IHVpX3ZhbHVlLCBjb25maWdfdmFsdWUsIGNvbmZpZ19zcGFuLCBrZXkgfSA9IGNvbnRhaW5lcjsKICBpZiAoY29uZmlnX3ZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgIHNldENsYXNzKCJtaXNzaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBpcyBub3QgcHJlc2VudCBpbiB0aGUgY29uZmlnLmA7CiAgfSBlbHNlIGlmICh1aV92YWx1ZSA9PSBjb25maWdfdmFsdWUpIHsKICAgIHNldENsYXNzKCJtYXRjaGluZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIHRoZSBzYW1lIHZhbHVlIGluIHRoZSBjb25maWcgYW5kIGluIHRoZSBoZWFkZXIuYDsKICB9IGVsc2UgewogICAgc2V0Q2xhc3MoImRpZmZlcmVudC1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIGEgZGlmZmVyZW50IHZhbHVlICg8ZW0+JHtjb25maWdfdmFsdWV9PC9lbT4pIGluIHRoZSBjb25maWcuYDsKICB9CiAgLy8gQWRkIGluZm8gYWJvdXQgc2V0dGluZyBhbmQgdW5zZXR0aW5nCiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIG9uIHRoZSBsYWJlbCA8ZW0+PGI+b25jZTwvYj48L2VtPiB0byBzZXQgdGhlIGN1cnJlbnQgVUkgdmFsdWUgaW4gdGhlIGNvbmZpZy5gCiAgKTsKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgPGVtPjxiPnR3aWNlPC9iPjwvZW0+IHRvIHJlbW92ZSB0aGlzIGtleSBmcm9tIHRoZSBjb25maWcuYAogICk7Cn0KCmNvbnN0IHZhbGlkX2Zvcm1hdHMgPSBbInBuZyIsICJzdmciLCAid2VicCIsICJqcGVnIiwgImZ1bGwtanNvbiJdOwpmdW5jdGlvbiBpbml0aWFsaXplVUlWYWx1ZVNwYW4oc3Bhbiwga2V5LCB2YWx1ZSkgewogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSBrZXkgPT09ICJmb3JtYXQiID8gImZhbHNlIiA6ICJ0cnVlIjsKICBsZXQgcGFyc2UgPSAoeCkgPT4geDsKICBsZXQgdXBkYXRlID0gKHgpID0+IChzcGFuLnRleHRDb250ZW50ID0geCk7CiAgaWYgKGtleSA9PT0gIndpZHRoIiB8fCBrZXkgPT09ICJoZWlnaHQiKSB7CiAgICBwYXJzZSA9ICh4KSA9PiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoeCkpOwogIH0gZWxzZSBpZiAoa2V5ID09PSAic2NhbGUiKSB7CiAgICBwYXJzZSA9IHBhcnNlRmxvYXQ7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAvLyBXZSByZW1vdmUgY29udGVudEVkaXRhYmxlCiAgICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9ICJmYWxzZSI7CiAgICAvLyBIZXJlIHdlIGZpcnN0IGFkZCB0aGUgc3Vic3BhbnMgZm9yIGVhY2ggb3B0aW9uCiAgICBjb25zdCBvcHRzX2RpdiA9IHNwYW4uYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2IGNsYXNzPSJmb3JtYXQtb3B0aW9ucyI+PC9kaXY+YCk7CiAgICBmb3IgKGNvbnN0IGZtdCBvZiB2YWxpZF9mb3JtYXRzKSB7CiAgICAgIGNvbnN0IG9wdCA9IG9wdHNfZGl2LmFwcGVuZENoaWxkKAogICAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImZvcm1hdC1vcHRpb24gJHtmbXR9Ij4ke2ZtdH08L3NwYW4+YAogICAgICApOwogICAgICBvcHQub25jbGljayA9IChlKSA9PiB7CiAgICAgICAgc3Bhbi52YWx1ZSA9IG9wdC50ZXh0Q29udGVudDsKICAgICAgfTsKICAgIH0KICAgIHBhcnNlID0gKHgpID0+IHsKICAgICAgcmV0dXJuIHZhbGlkX2Zvcm1hdHMuaW5jbHVkZXMoeCkgPyB4IDogbG9jYWxWYWx1ZTsKICAgIH07CiAgICB1cGRhdGUgPSAoeCkgPT4gewogICAgICBmb3IgKGNvbnN0IG9wdCBvZiBvcHRzX2Rpdi5jaGlsZHJlbikgewogICAgICAgIG9wdC5jbGFzc0xpc3QudG9nZ2xlKCJzZWxlY3RlZCIsIG9wdC50ZXh0Q29udGVudCA9PT0geCk7CiAgICAgIH0KICAgIH07CiAgfSBlbHNlIHsKICAgIC8vIFdlIG9ubHkgaGF2ZSBmaWxlbmFtZSBoZXJlCiAgfQogIGxldCBsb2NhbFZhbHVlOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIGxvY2FsVmFsdWU7CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIGlmICh2YWwgIT09ICIiKSB7CiAgICAgICAgbG9jYWxWYWx1ZSA9IHBhcnNlKHZhbCk7CiAgICAgIH0KICAgICAgdXBkYXRlKGxvY2FsVmFsdWUpOwogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7CiAgLy8gV2UgYWxzbyBhc3NpZ24gYSBsaXN0ZW5lciBzbyB0aGF0IHRoZSBlZGl0YWJsZSBpcyBibHVycmVkIHdoZW4gZW50ZXIgaXMgcHJlc3NlZAogIHNwYW4ub25rZXlkb3duID0gKGUpID0+IHsKICAgIGlmIChlLmtleUNvZGUgPT09IDEzKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgc3Bhbi5ibHVyKCk7CiAgICB9CiAgfTsKICBzcGFuLnZhbHVlID0gdmFsdWU7Cn0KCmZ1bmN0aW9uIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oc3Bhbiwga2V5KSB7CiAgLy8gSGVyZSB3ZSBtb3N0bHkgd2FudCB0byBkZWZpbmUgdGhlIHNldHRlciBhbmQgZ2V0dGVyCiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgLy8gaWYgdW5kZWZpbmVkIGlzIHBhc3NlZCwgd2UgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBvcHRpb25zCiAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGRlbGV0ZSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XSA9IHZhbDsKICAgICAgfQogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7Cn0KCmNvbnN0IGNvbmZpZ19zcGFucyA9IHt9Owpmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhnZXRJbWFnZU9wdGlvbnMoKSkpIHsKICBjb25zdCBjb250YWluZXIgPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoYC5jbGlwYm9hcmQtc3Bhbi4ke2tleX1gKTsKICBjb25zdCBsYWJlbCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIubGFiZWwiKTsKICAvLyBXZSBnaXZlIHRoZSBsYWJlbCBhIGZ1bmN0aW9uIHRoYXQgb24gc2luZ2xlIGNsaWNrIHdpbGwgc2V0IHRoZSBjdXJyZW50IHZhbHVlIGFuZCB3aXRoIGRvdWJsZSBjbGljayB3aWxsIHVuc2V0IGl0CiAgbGFiZWwub25jbGljayA9IER1YWxDbGljaygKICAgICgpID0+IHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0sCiAgICAoZSkgPT4gewogICAgICBjb25zb2xlLmxvZygiZSIsIGUpOwogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSB1bmRlZmluZWQ7CiAgICB9CiAgKTsKICBjb25zdCB1aV92YWx1ZV9zcGFuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtdmFsdWUiKTsKICBjb25zdCBjb25maWdfdmFsdWVfc3BhbiA9CiAgICBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNvbmZpZy12YWx1ZSIpID8/CiAgICBsYWJlbC5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAgICJhZnRlcmJlZ2luIiwKICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iY29uZmlnLXZhbHVlIj48L3NwYW4+YAogICAgKTsKICAvLyBBc3NpbmcgdGhlIHR3byBzcGFucyBhcyBwcm9wZXJ0aWVzIG9mIHRoZSBjb250YWluaW5nIHNwYW4KICBjb250YWluZXIudWlfc3BhbiA9IHVpX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmNvbmZpZ19zcGFuID0gY29uZmlnX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmtleSA9IGtleTsKICBjb25maWdfc3BhbnNba2V5XSA9IGNvbnRhaW5lcjsKICBpZiAoZmlyc3RSdW4pIHsKICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA9CiAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICAgIC8vIFdlIGRvIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdmFsdWUgc3BhbgogICAgaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHVpX3ZhbHVlX3NwYW4sIGtleSwgdmFsdWUpOwogICAgLy8gVGhlbiB3ZSBpbml0aWFsaXplIHRoZSBjb25maWcgdmFsdWUKICAgIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oY29uZmlnX3ZhbHVlX3NwYW4sIGtleSk7CiAgICAvLyBXZSBwdXQgc29tZSBjb252ZW5pZW5jZSBnZXR0ZXJzL3NldHRlcnMKICAgIC8vIHVpX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJ1aV92YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiB1aV92YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICB1aV92YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgICAvLyBjb25maWdfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgImNvbmZpZ192YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICB9Cn0KCi8vIFRoZXNlIG9iamVjdHMgd2lsbCBjb250YWluIHRoZSBkZWZhdWx0IHZhbHVlCgovLyBUaGlzIGNvZGUgdXBkYXRlcyB0aGUgaW1hZ2Ugb3B0aW9ucyBpbiB0aGUgUExPVCBjb25maWcgd2l0aCB0aGUgcHJvdmlkZWQgb25lcwpmdW5jdGlvbiBzZXRJbWFnZU9wdGlvbnMobykgewogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gb1trZXldOwogIH0KfQpmdW5jdGlvbiB1bnNldEltYWdlT3B0aW9ucygpIHsKICBzZXRJbWFnZU9wdGlvbnMoe30pOwp9Cgpjb25zdCBzZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4uc2V0Iik7CmNvbnN0IHVuc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnVuc2V0Iik7CmlmIChmaXJzdFJ1bikgewogIHNldF9idXR0b24ub25jbGljayA9IChlKSA9PiB7CiAgICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0KICB9OwogIHVuc2V0X2J1dHRvbi5vbmNsaWNrID0gdW5zZXRJbWFnZU9wdGlvbnM7Cn0KCi8vIFdlIGFkZCBhIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBjbGlwYm9hcmQgaXMgcG9wcGVkIG91dApDT05UQUlORVIuaXNQb3BwZWRPdXQgPSAoKSA9PiB7CiAgcmV0dXJuIENPTlRBSU5FUi5jbGFzc0xpc3QuY29udGFpbnMoInBvcHBlZC1vdXQiKTsKfTsKCkNMSVBCT0FSRF9IRUFERVIub25tb3VzZWRvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHsKICBpZiAoZXZlbnQudGFyZ2V0Lm1hdGNoZXMoInNwYW4uY2xpcGJvYXJkLXZhbHVlIikpIHsKICAgIGNvbnNvbGUubG9nKCJXZSBkb24ndCBtb3ZlISIpOwogICAgcmV0dXJuOwogIH0KICBjb25zdCBzdGFydCA9IHsKICAgIGxlZnQ6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLmxlZnQpLAogICAgdG9wOiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS50b3ApLAogICAgWDogZXZlbnQucGFnZVgsCiAgICBZOiBldmVudC5wYWdlWSwKICB9OwogIGZ1bmN0aW9uIG1vdmVBdChldmVudCwgc3RhcnQpIHsKICAgIGNvbnN0IHRvcCA9IGV2ZW50LnBhZ2VZIC0gc3RhcnQuWSArIHN0YXJ0LnRvcCArICJweCI7CiAgICBjb25zdCBsZWZ0ID0gZXZlbnQucGFnZVggLSBzdGFydC5YICsgc3RhcnQubGVmdCArICJweCI7CiAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9IHRvcDsKICB9CgogIC8vIG1vdmUgb3VyIGFic29sdXRlbHkgcG9zaXRpb25lZCBiYWxsIHVuZGVyIHRoZSBwb2ludGVyCiAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQpIHsKICAgIG1vdmVBdChldmVudCwgc3RhcnQpOwogIH0KCiAgLy8gV2UgdXNlIHRoaXMgdG8gcmVtb3ZlIHRoZSBtb3VzZW1vdmUgd2hlbiBjbGlja2luZyBvdXRzaWRlIG9mIHRoZSBjb250YWluZXIKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICAvLyBtb3ZlIHRoZSBjb250YWluZXIgb24gbW91c2Vtb3ZlCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgb25Nb3VzZU1vdmUsIHsKICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsCiAgfSk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgY2xlYW5VcCgpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7CgogIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICBjb25zb2xlLmxvZygiY2xlYW5pbmcgdXAgdGhlIHBsb3QgbW92ZSBsaXN0ZW5lciIpOwogICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBudWxsOwogIH0KCiAgLy8gKDMpIGRyb3AgdGhlIGJhbGwsIHJlbW92ZSB1bm5lZWRlZCBoYW5kbGVycwogIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gY2xlYW5VcDsKfTsKCmZ1bmN0aW9uIHNlbmRUb0NsaXBib2FyZChibG9iKSB7CiAgaWYgKCFuYXZpZ2F0b3IuY2xpcGJvYXJkKSB7CiAgICBhbGVydCgKICAgICAgIlRoZSBDbGlwYm9hcmQgQVBJIGRvZXMgbm90IHNlZW0gdG8gYmUgYXZhaWxhYmxlLCBtYWtlIHN1cmUgdGhlIFBsdXRvIG5vdGVib29rIGlzIGJlaW5nIHVzZWQgZnJvbSBlaXRoZXIgbG9jYWxob3N0IG9yIGFuIGh0dHBzIHNvdXJjZS4iCiAgICApOwogIH0KICBuYXZpZ2F0b3IuY2xpcGJvYXJkCiAgICAud3JpdGUoWwogICAgICBuZXcgQ2xpcGJvYXJkSXRlbSh7CiAgICAgICAgLy8gVGhlIGtleSBpcyBkZXRlcm1pbmVkIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBibG9iJ3MgdHlwZS4KICAgICAgICBbYmxvYi50eXBlXTogYmxvYiwKICAgICAgfSksCiAgICBdKQogICAgLnRoZW4oCiAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICBjb25zb2xlLmxvZygiQXN5bmM6IENvcHlpbmcgdG8gY2xpcGJvYXJkIHdhcyBzdWNjZXNzZnVsISIpOwogICAgICB9LAogICAgICBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiQXN5bmM6IENvdWxkIG5vdCBjb3B5IHRleHQ6ICIsIGVycik7CiAgICAgIH0KICAgICk7Cn0KCmZ1bmN0aW9uIGNvcHlJbWFnZVRvQ2xpcGJvYXJkKCkgewogIC8vIFdlIGV4dHJhY3QgdGhlIGltYWdlIG9wdGlvbnMgZnJvbSB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycyAoaWYgdGhleSBleGlzdCkKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LiBXZSBhbHNvIGlnbm9yZSBmb3JtYXQgYmVjYXVzZSB0aGUgY2xpcGJvYXJkIG9ubHkgc3VwcG9ydHMgcG5nLgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gImZvcm1hdCIpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LnRvSW1hZ2UoUExPVCwgY29uZmlnKS50aGVuKGZ1bmN0aW9uIChkYXRhVXJsKSB7CiAgICBmZXRjaChkYXRhVXJsKQogICAgICAudGhlbigocmVzKSA9PiByZXMuYmxvYigpKQogICAgICAudGhlbigoYmxvYikgPT4gewogICAgICAgIGNvbnN0IHBhc3RlX3JlY2VpdmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigncGFzdGUtcmVjZWl2ZXIucGx1dG9wbG90bHknKQogICAgICAgIGlmIChwYXN0ZV9yZWNlaXZlcikgewogICAgICAgICAgcGFzdGVfcmVjZWl2ZXIuYXR0YWNoSW1hZ2UoZGF0YVVybCwgQ09OVEFJTkVSKQogICAgICAgIH0KICAgICAgICBzZW5kVG9DbGlwYm9hcmQoYmxvYikKICAgICAgfSk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHNhdmVJbWFnZVRvRmlsZSgpIHsKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS5kb3dubG9hZEltYWdlKFBMT1QsIGNvbmZpZyk7Cn0KCmxldCBjb250YWluZXJfcmVjdCA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCwgdG9wOiAwLCBsZWZ0OiAwIH07CmZ1bmN0aW9uIHVucG9wX2NvbnRhaW5lcihjbCkgewogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgZmFsc2UpOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBmYWxzZSk7CiAgLy8gV2UgZml4IHRoZSBoZWlnaHQgYmFjayB0byB0aGUgdmFsdWUgaXQgaGFkIGJlZm9yZSBwb3BvdXQsIGFsc28gc2V0dGluZyB0aGUgZmxhZyB0byBzaWduYWwgdGhhdCB1cG9uIGZpcnN0IHJlc2l6ZSB3ZSByZW1vdmUgdGhlIGZpeGVkIGlubGluZS1zdHlsZQogIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQgKyAicHgiOwogIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IHRydWU7CiAgLy8gV2Ugc2V0IHRoZSBvdGhlciBmaXhlZCBpbmxpbmUtc3R5bGVzIHRvIG51bGwKICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICBDT05UQUlORVIuc3R5bGUudG9wID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBXZSBhbHNvIHJlbW92ZSB0aGUgQ0xJUEJPQVJEX0hFQURFUgogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSAiIjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBGaW5hbGx5IHdlIHJlbW92ZSB0aGUgaGlkZGVuIGNsYXNzIHRvIHRoZSBoZWFkZXIKICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIHRydWUpOwogIHJldHVybjsKfQpmdW5jdGlvbiBwb3BvdXRfY29udGFpbmVyKG9wdHMpIHsKICBjb25zdCBjbCA9IG9wdHM/LmNsOwogIGNvbnN0IHRhcmdldF9jb250YWluZXJfc2l6ZSA9IG9wdHM/LnRhcmdldF9jb250YWluZXJfc2l6ZSA/PyB7fTsKICBjb25zdCB0YXJnZXRfcGxvdF9zaXplID0gb3B0cz8udGFyZ2V0X3Bsb3Rfc2l6ZSA/PyB7fTsKICBpZiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIHJldHVybiB1bnBvcF9jb250YWluZXIoY2wpOwogIH0KICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgY2wgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdHJ1ZSk7CiAgLy8gV2UgZXh0cmFjdCB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjb250YWluZXIsIHNhdmUgdGhlbSBhbmQgZml4IHRoZW0KICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9ID0gQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogIGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfTsKICAvLyBXZSBzYXZlIHRoZSBjdXJyZW50IHBsb3Qgc2l6ZSBiZWZvcmUgd2UgcG9wIGFzIGl0IHdpbGwgZmlsbCB0aGUgc2NyZWVuCiAgY29uc3QgY3VycmVudF9wbG90X3NpemUgPSB7CiAgICB3aWR0aDogUExPVC5fZnVsbExheW91dC53aWR0aCwKICAgIGhlaWdodDogUExPVC5fZnVsbExheW91dC5oZWlnaHQsCiAgfTsKICAvLyBXZSBoYXZlIHRvIHNhdmUgdGhlIHBhZCBkYXRhIGJlZm9yZSBwb3BwaW5nIHNvIHdlIGNhbiByZXNpemUgcHJlY2lzZWx5CiAgY29uc3QgcGFkID0ge307CiAgcGFkLnVucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgdHJ1ZSk7CiAgcGFkLnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICAvLyBXZSBkbyB0b3AgYW5kIGxlZnQgYmFzZWQgb24gdGhlIGN1cnJlbnQgcmVjdAogIGZvciAoY29uc3Qga2V5IG9mIFsidG9wIiwgImxlZnQiXSkgewogICAgY29uc3Qgc3RhcnRfdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY29udGFpbmVyX3JlY3Rba2V5XTsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgZm9yIChjb25zdCBraW5kIG9mIFsicGFkZGluZyIsICJib3JkZXIiXSkgewogICAgICBvZmZzZXQgKz0gcGFkLnBvcHBlZFtraW5kXVtrZXldIC0gcGFkLnVucG9wcGVkW2tpbmRdW2tleV07CiAgICB9CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHN0YXJ0X3ZhbCAtIG9mZnNldCArICJweCI7CiAgICBpZiAoa2V5ID09PSAibGVmdCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIC8vIFdlIGNvbXB1dGUgdGhlIHdpZHRoIGFuZCBoZWlnaHQgZGVwZW5kaW5nIG9uIGV2ZW50dWFsIGNvbmZpZyBkYXRhCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoewogICAgd2lkdGg6CiAgICAgIHRhcmdldF9wbG90X3NpemUud2lkdGggPz8KICAgICAgY29uZmlnX3NwYW5zLndpZHRoLmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS5oZWlnaHQgPz8KICAgICAgY29uZmlnX3NwYW5zLmhlaWdodC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUuaGVpZ2h0LAogIH0pOwogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIGNvbnN0IHZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNzeltrZXldOwogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSB2YWwgKyAicHgiOwogICAgaWYgKGtleSA9PT0gIndpZHRoIikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCBmYWxzZSk7CiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgdW5wb3BfY29udGFpbmVyKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKfQoKQ09OVEFJTkVSLnBvcE91dCA9IHBvcG91dF9jb250YWluZXI7CgpmdW5jdGlvbiBEdWFsQ2xpY2soc2luZ2xlX2Z1bmMsIGRibF9mdW5jKSB7CiAgbGV0IG5jbGlja3MgPSAwOwogIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykgewogICAgbmNsaWNrcyArPSAxOwogICAgaWYgKG5jbGlja3MgPiAxKSB7CiAgICAgIGRibF9mdW5jKC4uLmFyZ3MpOwogICAgICBuY2xpY2tzID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIGRlbGF5KDMwMCkudGhlbigoKSA9PiB7CiAgICAgICAgaWYgKG5jbGlja3MgPT0gMSkgewogICAgICAgICAgc2luZ2xlX2Z1bmMoLi4uYXJncyk7CiAgICAgICAgfQogICAgICAgIG5jbGlja3MgPSAwOwogICAgICB9KTsKICAgIH0KICB9Owp9CgovLyBXZSByZW1vdmUgdGhlIGRlZmF1bHQgZG93bmxvYWQgaW1hZ2UgYnV0dG9uCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSwKICBbInRvSW1hZ2UiXQopOwovLyBXZSBhZGQgdGhlIGN1c3RvbSBidXR0b24gdG8gdGhlIG1vZGViYXIKcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkLAogIFsKICAgIHsKICAgICAgbmFtZTogIkNvcHkgUE5HIHRvIENsaXBib2FyZCIsCiAgICAgIGljb246IHsKICAgICAgICBoZWlnaHQ6IDUyMCwKICAgICAgICB3aWR0aDogNTIwLAogICAgICAgIHBhdGg6ICJNMjgwIDY0aDQwYzM1LjMgMCA2NCAyOC43IDY0IDY0VjQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEg2NGMtMzUuMyAwLTY0LTI4LjctNjQtNjRWMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0aDQwIDkuNkMxMjEgMjcuNSAxNTMuMyAwIDE5MiAwczcxIDI3LjUgNzguNCA2NEgyODB6TTY0IDExMmMtOC44IDAtMTYgNy4yLTE2IDE2VjQ0OGMwIDguOCA3LjIgMTYgMTYgMTZIMzIwYzguOCAwIDE2LTcuMiAxNi0xNlYxMjhjMC04LjgtNy4yLTE2LTE2LTE2SDMwNHYyNGMwIDEzLjMtMTAuNyAyNC0yNCAyNEgxOTIgMTA0Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNFYxMTJINjR6bTEyOC04YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHoiLAogICAgICB9LAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soY29weUltYWdlVG9DbGlwYm9hcmQsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKCk7CiAgICAgIH0pLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIkRvd25sb2FkIEltYWdlIiwKICAgICAgaWNvbjogUGxvdGx5Lkljb25zLmNhbWVyYSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKHNhdmVJbWFnZVRvRmlsZSwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoeyBjbDogImZpbGVzYXZlIiB9KTsKICAgICAgfSksCiAgICB9LAogIF0KKTsKCmZ1bmN0aW9uIGdldE9mZnNldERhdGEoZWwpIHsKICBsZXQgY3MgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgbnVsbCk7CiAgY29uc3Qgb2RhdGEgPSB7CiAgICBwYWRkaW5nOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgfSwKICAgIGJvcmRlcjogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgfQogIH07CiAgaWYgKGVsID09PSBQTE9UKSB7CiAgICAvLyBGb3IgdGhlIFBMT1Qgd2UgYWxzbyB3YW50IHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBvZmZzZXQKICAgIG9kYXRhLm9mZnNldCA9IHsKICAgICAgdG9wOiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldFRvcCA6IDAsCiAgICAgIGxlZnQ6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0TGVmdCA6IDAsCiAgICB9CiAgfQogIHJldHVybiBvZGF0YTsKfQpmdW5jdGlvbiBnZXRTaXplRGF0YSgpIHsKICBjb25zdCBkYXRhID0gewogICAgcGxvdF9wYWQ6IGdldE9mZnNldERhdGEoUExPVCksCiAgICBwbG90X3JlY3Q6IFBMT1QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgICBjb250YWluZXJfcGFkOiBnZXRPZmZzZXREYXRhKENPTlRBSU5FUiksCiAgICBjb250YWluZXJfcmVjdDogQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogIH07CiAgcmV0dXJuIGRhdGE7Cn0KZnVuY3Rpb24gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGNvbnN0IGNvbXB1dGVkX3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIGNvbnN0IG9mZnNldHMgPSBjb21wdXRlZF9zaXplLm9mZnNldHM7CgogIGNvbnN0IHBsb3RfZGF0YSA9IHsKICAgIHdpZHRoOiB3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiBoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfTsKCiAgcmV0dXJuIHsKICAgIHdpZHRoOiAod2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCkgKyBvZmZzZXRzLndpZHRoLAogICAgaGVpZ2h0OiAoaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0KSArIG9mZnNldHMuaGVpZ2h0LAogICAgbm9DaGFuZ2U6IHdpZHRoID09IGNvbXB1dGVkX3NpemUud2lkdGggJiYgaGVpZ2h0ID09IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH0KfQoKLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGNoYW5nZSB0aGUgY29udGFpbmVyIHNpemUgc28gdGhhdCB0aGUgcmVzdWx0aW5nIHBsb3Qgd2lsbCBiZSBtYXRjaGluZyB0aGUgcHJvdmlkZWQgc3BlY3MKZnVuY3Rpb24gY2hhbmdlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgaWYgKCFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgY29uc29sZS5sb2coIlRyaWVkIHRvIGNoYW5nZSBjb250YWluZXIgc2l6ZSB3aGVuIG5vdCBwb3BwZWQsIGlnbm9yaW5nIik7CiAgICByZXR1cm47CiAgfQoKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEpOwoKICBpZiAoY3N6Lm5vQ2hhbmdlKSB7CiAgICBjb25zb2xlLmxvZygiU2l6ZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50LCBpZ25vcmluZyIpOwogICAgcmV0dXJuCiAgfQogIC8vIFdlIGFyZSBub3cgZ29pbmcgdG8gc2V0IGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGNvbnRhaW5lcgogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gY3N6W2tleV0gKyAicHgiOwogIH0KfQovLyBXZSBub3cgY3JlYXRlIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgdXBkYXRlIHRoZSBwbG90IGJhc2VkIG9uIHRoZSB2YWx1ZXMgc3BlY2lmaWVkCmZ1bmN0aW9uIHVwZGF0ZUZyb21IZWFkZXIoKSB7CiAgY29uc3QgaGVhZGVyX2RhdGEgPSB7CiAgICBoZWlnaHQ6IGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUsCiAgICB3aWR0aDogY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlLAogIH07CiAgY2hhbmdlQ29udGFpbmVyU2l6ZShoZWFkZXJfZGF0YSk7Cn0KLy8gV2UgYXNzaWduIHRoaXMgZnVuY3Rpb24gdG8gdGhlIG9uYmx1ciBldmVudCBvZiB3aWR0aCBhbmQgaGVpZ2h0CmlmIChmaXJzdFJ1bikgewogIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLnVpX3NwYW4ub25ibHVyID0gKGUpID0+IHsKICAgICAgY29udGFpbmVyLnVpX3ZhbHVlID0gY29udGFpbmVyLnVpX3NwYW4udGV4dENvbnRlbnQ7CiAgICAgIHVwZGF0ZUZyb21IZWFkZXIoKTsKICAgIH07CiAgfQp9Ci8vIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIHBsb3Qgc2l6ZSB0byB1c2UgZm9yIHJlbGF5b3V0IGFzIGEgZnVuY3Rpb24gb2YgdGhlIGNvbnRhaW5lciBzaXplCmZ1bmN0aW9uIGNvbXB1dGVQbG90U2l6ZShkYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIC8vIFJlbW92ZSBQYWRkaW5nCiAgY29uc3QgeyBjb250YWluZXJfcGFkLCBwbG90X3BhZCwgY29udGFpbmVyX3JlY3QgfSA9IGRhdGE7CiAgY29uc3Qgb2Zmc2V0cyA9IHsKICAgIHdpZHRoOgogICAgICBwbG90X3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLndpZHRoICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LmxlZnQgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci53aWR0aCwKICAgIGhlaWdodDoKICAgICAgcGxvdF9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBwbG90X3BhZC5ib3JkZXIuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LnRvcCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci5oZWlnaHQsCiAgfTsKICBjb25zdCBzeiA9IHsKICAgIHdpZHRoOiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LndpZHRoIC0gb2Zmc2V0cy53aWR0aCksCiAgICBoZWlnaHQ6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3QuaGVpZ2h0IC0gb2Zmc2V0cy5oZWlnaHQpLAogICAgb2Zmc2V0cywKICB9OwogIHJldHVybiBzejsKfQoKLy8gQ3JlYXRlIHRoZSByZXNpemVPYnNlcnZlciB0byBtYWtlIHRoZSBwbG90IGV2ZW4gbW9yZSByZXNwb25zaXZlISA6bWFnaWM6CmNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7CiAgY29uc3Qgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpOwogIGNvbnN0IHtjb250YWluZXJfcmVjdCwgY29udGFpbmVyX3BhZH0gPSBzaXplRGF0YTsKICBsZXQgcGxvdF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICAvLyBXZSBzYXZlIHRoZSBoZWlnaHQgaW4gdGhlIFBMT1Qgb2JqZWN0CiAgUExPVC5jb250YWluZXJfaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0OwogIC8vIFdlIGRlYWwgd2l0aCBzb21lIHN0dWZmIGlmIHRoZSBjb250YWluZXIgaXMgcG9wcHBlZAogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSBjb250YWluZXJfcmVjdC53aWR0aCArICJweCI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gY29udGFpbmVyX3JlY3QubGVmdCArICJweCI7CiAgY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS5oZWlnaHQ7CiAgY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlID0gcGxvdF9zaXplLndpZHRoOwogIC8qIAoJCVRoZSBhZGRpdGlvbiBvZiB0aGUgaW52YWxpZCBhcmd1bWVudCBgcGx1dG9yZXNpemVgIHNlZW1zIHRvIGZpeCB0aGUgcHJvYmxlbSB3aXRoIGNhbGxpbmcgYHJlbGF5b3V0YCBzaW1wbHkgd2l0aCBge2F1dG9zaXplOiB0cnVlfWAgYXMgdXBkYXRlIGJyZWFraW5nIG1vdXNlIHJlbGF5b3V0IGV2ZW50cyB0cmFja2luZy4gCgkJU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wbG90bHkvcGxvdGx5LmpzL2lzc3Vlcy82MTU2IGZvciBkZXRhaWxzCgkJKi8KICBsZXQgY29uZmlnID0gewogICAgLy8gSWYgdGhpcyBpcyBwb3BwZWQgb3V0LCB3ZSBpZ25vcmUgdGhlIG9yaWdpbmFsIHdpZHRoL2hlaWdodAogICAgd2lkdGg6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX3dpZHRoKSA/PyBwbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX2hlaWdodCkgPz8gcGxvdF9zaXplLmhlaWdodCwKICAgIHBsdXRvcmVzaXplOiB0cnVlLAogIH07CiAgUGxvdGx5LnJlbGF5b3V0KFBMT1QsIGNvbmZpZykudGhlbigoKSA9PiB7CiAgICBpZiAocmVtb3ZlX2NvbnRhaW5lcl9zaXplICYmICFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBhdm9pZCB0aGUgZmlyc3QgcmVzaXplIHVwb24gcGxvdCBjcmVhdGlvbiB0byBhbHJlYWR5IGJlIHdpdGhvdXQgYSBmaXhlZCBoZWlnaHQKICAgICAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9ICIiOwogICAgICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICAgICAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmFsc2U7CiAgICB9CiAgfSk7Cn0pOwoKcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShDT05UQUlORVIpOwoKClBsb3RseS5yZWFjdChQTE9ULCBwbG90X29iaikudGhlbigoKSA9PiB7CgkvLyBBc3NpZ24gdGhlIFBsb3RseSBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhwbG90bHlfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1Qub24oa2V5LCBsaXN0ZW5lcikKCQl9Cgl9CgkvLyBBc3NpZ24gdGhlIEpTIGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKGpzX2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULmFkZEV2ZW50TGlzdGVuZXIoa2V5LCBsaXN0ZW5lciwgewoJCQkJc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbAoJCQl9KQoJCX0KCX0KfQopCgoKaW52YWxpZGF0aW9uLnRoZW4oKCkgPT4gewoJLy8gUmVtb3ZlIGFsbCBwbG90bHkgbGlzdGVuZXJzCglQTE9ULnJlbW92ZUFsbExpc3RlbmVycygpCgkvLyBSZW1vdmUgYWxsIEpTIGxpc3RlbmVycwoJY29udHJvbGxlci5hYm9ydCgpCgkvLyBSZW1vdmUgdGhlIHJlc2l6ZU9ic2VydmVyCglyZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCkKfSkKCgoKCQlyZXR1cm4gQ09OVEFJTkVSCgk8L3NjcmlwdD4KpG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv8gn+PXcsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SRkOTcxNWJjMS00OWNkLTRkZjgtOGRiZi1jMDZkZTQyYWQ1NTC5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc6NmhkgtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5HZNWVkMjdkZTFhLTgxZDktMTFlZi0zYjczLTFiMTE2MzEyZGFlNy9iMjJkZTk4Nzg0ODY3OTI4uGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYYqmcXVldWVkwqRsb2dz3ACGiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5Knbm90aGluZ6p0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5K0MC4wMDc1NzU3NTc1NzU3NTc1NzaqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OStDAuMDE1MTUxNTE1MTUxNTE1MTUyqnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrQwLjAyMjcyNzI3MjcyNzI3MjcyOKp0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5K0MC4wMzAzMDMwMzAzMDMwMzAzMDSqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSszAuMDM3ODc4Nzg3ODc4Nzg3ODiqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OStDAuMDQ1NDU0NTQ1NDU0NTQ1NDU2qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjA1MzAzMDMwMzAzMDMwMzAzqnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjA2MDYwNjA2MDYwNjA2MDYxqnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjA2ODE4MTgxODE4MTgxODE4qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjA3NTc1NzU3NTc1NzU3NTc2qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjA4MzMzMzMzMzMzMzMzMzMzqnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjA5MDkwOTA5MDkwOTA5MDkxqnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjA5ODQ4NDg0ODQ4NDg0ODQ4qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjEwNjA2MDYwNjA2MDYwNjA2qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjExMzYzNjM2MzYzNjM2MzYzqnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjEyMTIxMjEyMTIxMjEyMTIyqnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjEyODc4Nzg3ODc4Nzg3ODc4qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjEzNjM2MzYzNjM2MzYzNjM1qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjE0MzkzOTM5MzkzOTM5Mzk1qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjE1MTUxNTE1MTUxNTE1MTUyqnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjE1OTA5MDkwOTA5MDkwOTGqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSszAuMTY2NjY2NjY2NjY2NjY2NjaqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSszAuMTc0MjQyNDI0MjQyNDI0MjWqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSszAuMTgxODE4MTgxODE4MTgxODKqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuMTg5MzkzOTM5MzkzOTM5NKp0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KzMC4xOTY5Njk2OTY5Njk2OTY5Nqp0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KzMC4yMDQ1NDU0NTQ1NDU0NTQ1Nqp0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KzMC4yMTIxMjEyMTIxMjEyMTIxM6p0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC4yMTk2OTY5Njk2OTY5Njk3qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjIyNzI3MjcyNzI3MjcyNzI3qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjIzNDg0ODQ4NDg0ODQ4NDg2qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjI0MjQyNDI0MjQyNDI0MjQzqnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkqQwLjI1qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjI1NzU3NTc1NzU3NTc1NzU3qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjI2NTE1MTUxNTE1MTUxNTE0qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjI3MjcyNzI3MjcyNzI3MjeqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuMjgwMzAzMDMwMzAzMDMwM6p0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC4yODc4Nzg3ODc4Nzg3ODc5qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjI5NTQ1NDU0NTQ1NDU0NTQ3qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjMwMzAzMDMwMzAzMDMwMzA0qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjMxMDYwNjA2MDYwNjA2MDaqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuMzE4MTgxODE4MTgxODE4Mqp0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KzMC4zMjU3NTc1NzU3NTc1NzU3Nap0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC4zMzMzMzMzMzMzMzMzMzMzqnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjM0MDkwOTA5MDkwOTA5MDmqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuMzQ4NDg0ODQ4NDg0ODQ4Nap0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC4zNTYwNjA2MDYwNjA2MDYxqnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjM2MzYzNjM2MzYzNjM2MzY1qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjM3MTIxMjEyMTIxMjEyMTKqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuMzc4Nzg3ODc4Nzg3ODc4OKp0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KzMC4zODYzNjM2MzYzNjM2MzYzNap0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC4zOTM5MzkzOTM5MzkzOTM5qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjQwMTUxNTE1MTUxNTE1MTWqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuNDA5MDkwOTA5MDkwOTA5Map0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC40MTY2NjY2NjY2NjY2NjY3qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrMwLjQyNDI0MjQyNDI0MjQyNDI1qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjQzMTgxODE4MTgxODE4MTiqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuNDM5MzkzOTM5MzkzOTM5NKp0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KzMC40NDY5Njk2OTY5Njk2OTY5Nqp0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KzMC40NTQ1NDU0NTQ1NDU0NTQ1M6p0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC40NjIxMjEyMTIxMjEyMTIxqnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjQ2OTY5Njk2OTY5Njk2OTeqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuNDc3MjcyNzI3MjcyNzI3M6p0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KzMC40ODQ4NDg0ODQ4NDg0ODQ4Nqp0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KzMC40OTI0MjQyNDI0MjQyNDI0M6p0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KjMC41qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjUwNzU3NTc1NzU3NTc1NzaqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuNTE1MTUxNTE1MTUxNTE1Map0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC41MjI3MjcyNzI3MjcyNzI3qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjUzMDMwMzAzMDMwMzAzMDOqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuNTM3ODc4Nzg3ODc4Nzg3OKp0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC41NDU0NTQ1NDU0NTQ1NDU0qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrEwLjU1MzAzMDMwMzAzMDMwM6p0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC41NjA2MDYwNjA2MDYwNjA2qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjU2ODE4MTgxODE4MTgxODKqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuNTc1NzU3NTc1NzU3NTc1OKp0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC41ODMzMzMzMzMzMzMzMzM0qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjU5MDkwOTA5MDkwOTA5MDmqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuNTk4NDg0ODQ4NDg0ODQ4Nap0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC42MDYwNjA2MDYwNjA2MDYxqnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjYxMzYzNjM2MzYzNjM2MzaqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuNjIxMjEyMTIxMjEyMTIxMqp0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC42Mjg3ODc4Nzg3ODc4Nzg4qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjYzNjM2MzYzNjM2MzYzNjSqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuNjQzOTM5MzkzOTM5MzkzOap0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC42NTE1MTUxNTE1MTUxNTE1qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjY1OTA5MDkwOTA5MDkwOTGqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuNjY2NjY2NjY2NjY2NjY2Nqp0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC42NzQyNDI0MjQyNDI0MjQyqnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjY4MTgxODE4MTgxODE4MTiqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuNjg5MzkzOTM5MzkzOTM5NKp0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KxMC42OTY5Njk2OTY5Njk2OTeqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuNzA0NTQ1NDU0NTQ1NDU0Nqp0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC43MTIxMjEyMTIxMjEyMTIyqnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjcxOTY5Njk2OTY5Njk2OTeqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuNzI3MjcyNzI3MjcyNzI3M6p0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC43MzQ4NDg0ODQ4NDg0ODQ5qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjc0MjQyNDI0MjQyNDI0MjSqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSpDAuNzWqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuNzU3NTc1NzU3NTc1NzU3Nqp0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC43NjUxNTE1MTUxNTE1MTUxqnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjc3MjcyNzI3MjcyNzI3MjeqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuNzgwMzAzMDMwMzAzMDMwM6p0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC43ODc4Nzg3ODc4Nzg3ODc4qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjc5NTQ1NDU0NTQ1NDU0NTSqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsTAuODAzMDMwMzAzMDMwMzAzqnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjgxMDYwNjA2MDYwNjA2MDaqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuODE4MTgxODE4MTgxODE4Mqp0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC44MjU3NTc1NzU3NTc1NzU4qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjgzMzMzMzMzMzMzMzMzMzSqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuODQwOTA5MDkwOTA5MDkwOap0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC44NDg0ODQ4NDg0ODQ4NDg1qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjg1NjA2MDYwNjA2MDYwNjGqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuODYzNjM2MzYzNjM2MzYzNqp0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC44NzEyMTIxMjEyMTIxMjEyqnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjg3ODc4Nzg3ODc4Nzg3ODiqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuODg2MzYzNjM2MzYzNjM2NKp0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC44OTM5MzkzOTM5MzkzOTM5qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjkwMTUxNTE1MTUxNTE1MTWqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuOTA5MDkwOTA5MDkwOTA5Map0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC45MTY2NjY2NjY2NjY2NjY2qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjkyNDI0MjQyNDI0MjQyNDKqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuOTMxODE4MTgxODE4MTgxOKp0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC45MzkzOTM5MzkzOTM5Mzk0qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrEwLjk0Njk2OTY5Njk2OTY5N6p0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC45NTQ1NDU0NTQ1NDU0NTQ2qnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjk2MjEyMTIxMjEyMTIxMjKqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuOTY5Njk2OTY5Njk2OTY5N6p0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KyMC45NzcyNzI3MjcyNzI3MjczqnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkrIwLjk4NDg0ODQ4NDg0ODQ4NDmqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKYikbGluZf+jbXNnkqCqdGV4dC9wbGFpbqdjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGma3dhcmdzkZKocHJvZ3Jlc3OSsjAuOTkyNDI0MjQyNDI0MjQyNKp0ZXh0L3BsYWluomlk2SQ4OGY3OGQxOC04YzZiLTRiNjMtOGY5Yi1iYjM1NjNkYTBlZTikZmlsZdlJL2hvbWUvcnVubmVyLy5qdWxpYS9wYWNrYWdlcy9Qcm9ncmVzc0xvZ2dpbmcvNktYbHAvc3JjL1Byb2dyZXNzTG9nZ2luZy5qbKVncm91cK9Qcm9ncmVzc0xvZ2dpbmelbGV2ZWysTG9nTGV2ZWwoLTEpiKRsaW5l/6Ntc2eSoKp0ZXh0L3BsYWlup2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZrd2FyZ3ORkqhwcm9ncmVzc5KjMS4wqnRleHQvcGxhaW6iaWTZJDg4Zjc4ZDE4LThjNmItNGI2My04ZjliLWJiMzU2M2RhMGVlOKRmaWxl2UkvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1Byb2dyZXNzTG9nZ2luZy82S1hscC9zcmMvUHJvZ3Jlc3NMb2dnaW5nLmpspWdyb3Vwr1Byb2dyZXNzTG9nZ2luZ6VsZXZlbKxMb2dMZXZlbCgtMSmIpGxpbmX/o21zZ5KgqnRleHQvcGxhaW6nY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhpmt3YXJnc5GSqHByb2dyZXNzkqYiZG9uZSKqdGV4dC9wbGFpbqJpZNkkODhmNzhkMTgtOGM2Yi00YjYzLThmOWItYmIzNTYzZGEwZWU4pGZpbGXZSS9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUHJvZ3Jlc3NMb2dnaW5nLzZLWGxwL3NyYy9Qcm9ncmVzc0xvZ2dpbmcuamylZ3JvdXCvUHJvZ3Jlc3NMb2dnaW5npWxldmVsrExvZ0xldmVsKC0xKadydW5uaW5nwqZvdXRwdXSGpGJvZHmgpG1pbWWqdGV4dC9wbGFpbqxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b/IK+jMJbBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXPAAAAAjuO4U+1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQ5ZTM5NzQyNi1iNjBiLTRiOTgtYmU4Yi1mN2YxMjg2MjFjNDSKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52gEkU2Nhbm5lcgogIEIwOiBGbG9hdDY0IDAuNTUKICBCMTogRmxvYXQ2NCAxLjBlLTUKICBHbWF4OiBGbG9hdDY0IDAuMDQKICBTbWF4OiBGbG9hdDY0IDI1LjAKICBBRENfzpR0OiBGbG9hdDY0IDIuMGUtNgogIHNlcV/OlHQ6IEZsb2F0NjQgMS4wZS01CiAgR1JfzpR0OiBGbG9hdDY0IDEuMGUtNQogIFJGX86UdDogRmxvYXQ2NCAxLjBlLTYKICBSRl9yaW5nX2Rvd25fVDogRmxvYXQ2NCAyLjBlLTUKICBSRl9kZWFkX3RpbWVfVDogRmxvYXQ2NCAwLjAwMDEKICBBRENfZGVhZF90aW1lX1Q6IEZsb2F0NjQgMS4wZS01CqRtaW1lqnRleHQvcGxhaW6scm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/yB4Y0hiwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJDllMzk3NDI2LWI2MGItNGI5OC1iZThiLWY3ZjEyODYyMWM0NLlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzYwHtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkZDA1ZGNiYTctMmY0Mi00N2JmLWExNzItNjEyM2QwMTEzYjNmiqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9keYWmcHJlZml4sURpY3R7U3RyaW5nLCBBbnl9qGVsZW1lbnRzlZKSpSJncHUiqnRleHQvcGxhaW6SpWZhbHNlqnRleHQvcGxhaW6SkqoiTnRocmVhZHMiqnRleHQvcGxhaW6SoTGqdGV4dC9wbGFpbpKSrCJzaW1fbWV0aG9kIqp0ZXh0L3BsYWlukrdCbG9jaERpY3Qoc2F2ZV9Nej10cnVlKap0ZXh0L3BsYWlukpKtInJldHVybl90eXBlIqp0ZXh0L3BsYWlukqUibWF0Iqp0ZXh0L3BsYWlukpKoIs6UdF9yZiKqdGV4dC9wbGFpbpKmMC4wMDA1qnRleHQvcGxhaW6kdHlwZaREaWN0rHByZWZpeF9zaG9ydKREaWN0qG9iamVjdGlksDJlMmYwNTgzNzViMDAyM2GkbWltZdkhYXBwbGljYXRpb24vdm5kLnBsdXRvLnRyZWUrb2JqZWN0rHJvb3Rhc3NpZ25lZapzaW1fcGFyYW1zsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b/IHpi9y7BwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkZDA1ZGNiYTctMmY0Mi00N2JmLWExNzItNjEyM2QwMTEzYjNmuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXNxE21cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQzOWY0NDAyNS0yOTc0LTRjNGMtYjBjMi1lMjEzOTliYmRiMWaKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52gGHPGRpdiBjbGFzcz0ibWFya2Rvd24iPjxoMj4yLjEuIEZsaXAgYW5nbGUgb3B0aW1pemF0aW9uPC9oMj4KPHA+Rm9yIHRoZSBmaXJzdCBzaW11bGF0aW9uIGV4cGVyaW1lbnQsIFNOUiB3YXMgbWF4aW1pemVkIGJ5IHZhcnlpbmcgdGhlIGltYWdpbmcgZmxpcCBhbmdsZSAmIzQwO2JldHdlZW4gMjAgYW5kIDE4MCBkZWcmIzQxOy4gVG8gb3B0aW1pemUgU05SIGluZGVwZW5kZW50bHkgb2YgaGVhcnQgcmF0ZSwgbXVsdGlwbGUgaGVhcnQgcmF0ZXMgJiM0MDtiZXR3ZWVuIDU1IGFuZCA4NSBicG0mIzQxOyB3ZXJlIHNpbXVsYXRlZCBhbmQgdGhlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgb2J0YWluZWQgYmxvb2Qgc2lnbmFsIHdlcmUgY2FsY3VsYXRlZC48L3A+CjwvZGl2PqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b/H8YEQF7BwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkMzlmNDQwMjUtMjk3NC00YzRjLWIwYzItZTIxMzk5YmJkYjFmuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAAPu4rVwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDM3ZjdmZDdmLTVjYjEtNDhiNS1iODc3LWIyYmMyM2ExZTdkZIqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHmgpG1pbWWqdGV4dC9wbGFpbqxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b/IJKXOwLBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkMzdmN2ZkN2YtNWNiMS00OGI1LWI4NzctYjJiYzIzYTFlN2RkuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXPAAAABZ+2ZHe1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQ3NzE1M2U1Yy03MWJkLTQyZTMtYmFlOS1lNDgxMWZmYTdhM2SKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52bg8ZGl2IGNsYXNzPSJtYXJrZG93biI+PGgyPjEuMi4gU2Nhbm5lcjwvaDI+CjxwPldlIHN0YXJ0IGJ5IGRlZmluaW5nIHRoZSBoYXJkd2FyZSBjaGFyYWN0ZXJpc3RpY3MuIFRoZSA8Y29kZT5zeXMuQjA8L2NvZGU+IHdpbGwgYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIG9mZi1yZXNvbmFuY2Ugb2YgZmF0LjwvcD4KPC9kaXY+pG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv8fxgF5KsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQ3NzE1M2U1Yy03MWJkLTQyZTMtYmFlOS1lNDgxMWZmYTdhM2S5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4AA+mEtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkZDU0ZDY4MDctNDQ0Zi00ZTBlLThmZDYtODQ0NTc5NzQxMTVhiqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedl/PGRpdiBjbGFzcz0ibWFya2Rvd24iPjxwPkhlcmUgd2Ugc2hvdyB0aGUgbWFnbmV0aXphdGlvbiBkeW5hbWljcyBvZiB0aGUgbXlvY2FyZGl1bSwgYmxvb2QsIGFuZCBmYXQgc2lnbmFscyBhdCAwLjU1VC48L3A+CjwvZGl2PqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b/H8YDjP7BwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkZDU0ZDY4MDctNDQ0Zi00ZTBlLThmZDYtODQ0NTc5NzQxMTVhuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAALutbVwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDQ0YTMxMDU3LTdiMzQtNGM4MC1hMjczLTY2MjFjMDc3M2RjN4qmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnaaogJPHNjcmlwdCBpZD0ncGxvdF8xJz4KCQkvLyBXZSBzdGFydCBieSBwdXR0aW5nIGFsbCB0aGUgdmFyaWFibGUgaW50ZXJwb2xhdGlvbiBoZXJlIGF0IHRoZSBiZWdpbm5pbmcKCQkvLyBXZSBoYXZlIHRvIGNvbnZlcnQgYWxsIHR5cGVkYXJyYXlzIGluIHRoZSBsYXlvdXQgdG8gbm9ybWFsIGFycmF5cy4gU2VlIElzc3VlICMyNQoJCS8vIFdlIHVzZSBsb2Rhc2ggZm9yIHRoaXMgZm9yIGNvbXBhY3RuZXNzCgkJZnVuY3Rpb24gcmVtb3ZlVHlwZWRBcnJheShvKSB7CgkJCXJldHVybiBfLmlzVHlwZWRBcnJheShvKSA/IEFycmF5LmZyb20obykgOgoJCQlfLmlzUGxhaW5PYmplY3QobykgPyBfLm1hcFZhbHVlcyhvLCByZW1vdmVUeXBlZEFycmF5KSA6IAoJCQlvCgkJfQoKCQkvLyBQdWJsaXNoIHRoZSBwbG90IG9iamVjdCB0byBKUwoJCWxldCBwbG90X29iaiA9IF8udXBkYXRlKC8qIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgQWJzdHJhY3RQbHV0b0RpbmdldGplcy5EaXNwbGF5LnB1Ymxpc2hlZF90b19qcyAqLyBnZXRQdWJsaXNoZWRPYmplY3QoImVkMjdkZTFhLTgxZDktMTFlZi0zYjczLTFiMTE2MzEyZGFlNy81YTBlMzI0NjkyMzZhZWYiKSwgImxheW91dCIsIHJlbW92ZVR5cGVkQXJyYXkpCgkJLy8gR2V0IHRoZSBwbG90bHkgbGlzdGVuZXJzCgkJY29uc3QgcGxvdGx5X2xpc3RlbmVycyA9IHt9CgkJLy8gR2V0IHRoZSBKUyBsaXN0ZW5lcnMKCQljb25zdCBqc19saXN0ZW5lcnMgPSB7fQoJCS8vIERlYWwgd2l0aCBldmVudHVhbCBjdXN0b20gY2xhc3NlcwoJCWxldCBjdXN0b21fY2xhc3NsaXN0ID0gW10KCgoJCS8vIExvYWQgdGhlIHBsb3RseSBsaWJyYXJ5CgkJbGV0IFBsb3RseSA9IHVuZGVmaW5lZAoJCXRyeSB7CgkJCWxldCBfbW9kID0gYXdhaXQgaW1wb3J0KCIuL3Bsb3RseWpzL3Bsb3RseWpzLTIuMjYuMi5taW4uanMiKQoJCQlQbG90bHkgPSBfbW9kLmRlZmF1bHQKCQl9IGNhdGNoIChlKSB7CgkJCWNvbnNvbGUubG9nKCJMb2NhbCBsb2FkIGZhaWxlZCwgdHJ5aW5nIHdpdGggdGhlIHdlYiBlc20uc2ggdmVyc2lvbiIpCgkJCWxldCBfbW9kID0gYXdhaXQgaW1wb3J0KCJodHRwczovL2VzbS5zaC92MTM1L3Bsb3RseS5qcy1kaXN0LW1pbkAyLjI2LjIvZXNuZXh0L3Bsb3RseS5qcy1kaXN0LW1pbi5tanMiKQoJCQlQbG90bHkgPSBfbW9kLmRlZmF1bHQKCQl9CgoJCS8vIENoZWNrIGlmIHdlIGhhdmUgdG8gZm9yY2UgbG9jYWwgbWF0aGpheCBmb250IGNhY2hlCgkJaWYgKGZhbHNlICYmIHdpbmRvdz8uTWF0aEpheD8uY29uZmlnPy5zdmc/LmZvbnRDYWNoZSA9PT0gJ2dsb2JhbCcpIHsKCQkJd2luZG93Lk1hdGhKYXguY29uZmlnLnN2Zy5mb250Q2FjaGUgPSAnbG9jYWwnCgkJfQoKCQkvLyBGbGFnIHRvIGNoZWNrIGlmIHRoaXMgY2VsbCB3YXMgIG1hbnVhbGx5IHJhbiBvciByZWFjdGl2ZWx5IHJhbgpjb25zdCBmaXJzdFJ1biA9IHRoaXMgPyBmYWxzZSA6IHRydWUKY29uc3QgQ09OVEFJTkVSID0gdGhpcyA/PyBodG1sYDxkaXYgY2xhc3M9J3BsdXRvcGxvdGx5LWNvbnRhaW5lcic+YApjb25zdCBQTE9UID0gQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoJy5qcy1wbG90bHktcGxvdCcpID8/IENPTlRBSU5FUi5hcHBlbmRDaGlsZChodG1sYDxkaXY+YCkKY29uc3QgcGFyZW50ID0gQ09OVEFJTkVSLnBhcmVudEVsZW1lbnQKLy8gV2UgdXNlIGEgY29udHJvbGxlciB0byByZW1vdmUgZXZlbnQgbGlzdGVuZXJzIHVwb24gaW52YWxpZGF0aW9uCmNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCkKLy8gV2UgaGF2ZSB0byBhZGQgdGhpcyB0byBrZWVwIHN1cHBvcnRpbmcgQGJpbmQgd2l0aCB0aGUgb2xkIEFQSSB1c2luZyBQTE9UClBMT1QuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoZSkgPT4gewoJQ09OVEFJTkVSLnZhbHVlID0gUExPVC52YWx1ZQoJaWYgKGUuYnViYmxlcykgewoJCXJldHVybgoJfQoJQ09OVEFJTkVSLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdpbnB1dCcpKQp9LCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSkKCgkvLyBUaGlzIGNyZWF0ZSB0aGUgc3R5bGUgc3ViZGl2IG9uIGZpcnN0IHJ1bgoJZmlyc3RSdW4gJiYgQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgCgk8c3R5bGU+CgkucGx1dG9wbG90bHktY29udGFpbmVyIHsKCQl3aWR0aDogMTAwJTsKCQloZWlnaHQ6IDEwMCU7CgkJbWluLWhlaWdodDogMDsKCQltaW4td2lkdGg6IDA7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyIC5qcy1wbG90bHktcGxvdCAucGxvdGx5IGRpdiB7CgkJbWFyZ2luOiAwIGF1dG87IC8vIFRoaXMgY2VudGVycyB0aGUgcGxvdAoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5wb3BwZWQtb3V0IHsKCQlvdmVyZmxvdzogYXV0bzsKCQl6LWluZGV4OiAxMDAwOwoJCXBvc2l0aW9uOiBmaXhlZDsKCQlyZXNpemU6IGJvdGg7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwcHg7CgkJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDBweDsKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIHsKCQlkaXNwbGF5OiBmbGV4OwoJCWZsZXgtZmxvdzogcm93IHdyYXA7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMTJweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMTJweDsKCQlwb3NpdGlvbjogZml4ZWQ7CgkJei1pbmRleDogMTAwMTsKCQljdXJzb3I6IG1vdmU7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCAtMTAwJSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgc3BhbiB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCWZsZXg6IDEKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyLmhpZGRlbiB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3BhbiB7CgkJcG9zaXRpb246IHJlbGF0aXZlOwoJfQoJLmNsaXBib2FyZC12YWx1ZSB7CgkJcGFkZGluZy1yaWdodDogNXB4OwoJCXBhZGRpbmctbGVmdDogMnB4OwoJCWN1cnNvcjogdGV4dDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZmlsZW5hbWUgewoJCWZsZXg6IDAgMCAxMDAlOwoJCXRleHQtYWxpZ246IGNlbnRlcjsKCQlib3JkZXItdG9wOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJbWFyZ2luLXRvcDogNXB4OwoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5maWxlbmFtZSB7CgkJbWFyZ2luLWxlZnQ6IDNweDsKCQl0ZXh0LWFsaWduOiBsZWZ0OwoJCW1pbi13aWR0aDogbWluKDYwJSwgbWluLWNvbnRlbnQpOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5maWxlc2F2ZSAuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgLmxhYmVsIHsKCQlmbGV4OiAwIDAgMDsKCX0KCS5jbGlwYm9hcmQtdmFsdWUuZm9ybWF0IHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7CgkJZmxleDogMSAwIGF1dG87CgkJbWluLXdpZHRoOiAzMHB4OwoJCW1hcmdpbi1yaWdodDogMTBweDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyB7CgkJZGlzcGxheTogaW5saW5lLWZsZXg7CgkJZmxleC1mbG93OiBjb2x1bW47CgkJcG9zaXRpb246IGFic29sdXRlOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJcGFkZGluZy1sZWZ0OiAzcHg7CgkJei1pbmRleDogMjAwMDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9uczpob3ZlciB7CgkJY3Vyc29yOiBwb2ludGVyOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCXBhZGRpbmc6IDNweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtM3B4LCAtNnB4KTsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyAuZm9ybWF0LW9wdGlvbiB7CgkJZGlzcGxheTogbm9uZTsKCX0KCWRpdi5mb3JtYXQtb3B0aW9uczpob3ZlciAuZm9ybWF0LW9wdGlvbiB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246bm90KC5zZWxlY3RlZCkgewoJCW1hcmdpbi10b3A6IDNweDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyAuZm9ybWF0LW9wdGlvbi5zZWxlY3RlZCB7CgkJb3JkZXI6IC0xOwoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5mb3JtYXQtb3B0aW9uOmhvdmVyIHsKCQliYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCX0KCXNwYW4uY29uZmlnLXZhbHVlIHsKCQlmb250LXdlaWdodDogbm9ybWFsOwoJCWNvbG9yOiB2YXIoLS1wbHV0by1vdXRwdXQtY29sb3IpOwoJCWRpc3BsYXk6IG5vbmU7CgkJcG9zaXRpb246IGFic29sdXRlOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCBjYWxjKC0xMDAlIC0gMTBweCkpOwoJCXBhZGRpbmc6IDVweDsKCX0KCS5sYWJlbCB7CgkJdXNlci1zZWxlY3Q6IG5vbmU7Cgl9CgkubGFiZWw6aG92ZXIgc3Bhbi5jb25maWctdmFsdWUgewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQltaW4td2lkdGg6IDE1MHB4OwoJfQoJLmNsaXBib2FyZC1zcGFuLm1hdGNoaW5nLWNvbmZpZyAubGFiZWwgewoJCWNvbG9yOiB2YXIoLS1jbS1tYWNyby1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZGlmZmVyZW50LWNvbmZpZyAubGFiZWwgewoJCWNvbG9yOiB2YXIoLS1jbS10YWctY29sb3IpOwoJCWZvbnQtd2VpZ2h0OiBib2xkOwoJfQo8L3N0eWxlPgpgKQoKbGV0IG9yaWdpbmFsX2hlaWdodCA9IHBsb3Rfb2JqLmxheW91dC5oZWlnaHQKbGV0IG9yaWdpbmFsX3dpZHRoID0gcGxvdF9vYmoubGF5b3V0LndpZHRoCi8vIEZvciB0aGUgaGVpZ2h0IHdlIGhhdmUgdG8gYWxzbyBwdXQgYSBmaXhlZCB2YWx1ZSBpbiBjYXNlIHRoZSBwbG90IGlzIHB1dCBvbiBhIG5vbi1maXhlZC1zaXplIGNvbnRhaW5lciAobGlrZSB0aGUgZGVmYXVsdCB3cmFwcGVyKQovLyBXZSBkZWZpbmUgYSB2YXJpYWJsZSB0byBjaGVjayB3aGV0aGVyIHdlIHN0aWxsIGhhdmUgdG8gcmVtb3ZlIHRoZSBmaXhlZCBoZWlnaHQKbGV0IHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IGZpcnN0UnVuCmxldCBjb250YWluZXJfaGVpZ2h0ID0gb3JpZ2luYWxfaGVpZ2h0ID8/IFBMT1QuY29udGFpbmVyX2hlaWdodCA/PyA0MDAKQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9IGNvbnRhaW5lcl9oZWlnaHQgKyAncHgnCgovLyBXZSBjcmVhdGUgYSBQcm9taXNlIHZlcnNpb24gb2Ygc2V0VGltZW91dApmdW5jdGlvbiBkZWxheShtcykgewogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpOwp9CgovLyBXZSBpbXBvcnQgaW50ZXJhY3QgZm9yIGRyYWdnaW5nL3Jlc2l6aW5nCmNvbnN0IHsgZGVmYXVsdDogaW50ZXJhY3QgfSA9IGF3YWl0IGltcG9ydCgnaHR0cHM6Ly9lc20uc2gvaW50ZXJhY3Rqc0AxLjEwLjE5JykKCgpmdW5jdGlvbiBnZXRJbWFnZU9wdGlvbnMoKSB7CiAgY29uc3QgbyA9IHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICByZXR1cm4gewogICAgZm9ybWF0OiBvLmZvcm1hdCA/PyAicG5nIiwKICAgIHdpZHRoOiBvLndpZHRoID8/IG9yaWdpbmFsX3dpZHRoLAogICAgaGVpZ2h0OiBvLmhlaWdodCA/PyBvcmlnaW5hbF9oZWlnaHQsCiAgICBzY2FsZTogby5zY2FsZSA/PyAxLAogICAgZmlsZW5hbWU6IG8uZmlsZW5hbWUgPz8gIm5ld3Bsb3QiLAogIH07Cn0KCmNvbnN0IENMSVBCT0FSRF9IRUFERVIgPQogIENPTlRBSU5FUi5xdWVyeVNlbGVjdG9yKCIucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciIpID8/CiAgQ09OVEFJTkVSLmluc2VydEFkamFjZW50RWxlbWVudCgKICAgICJhZnRlcmJlZ2luIiwKICAgIGh0bWxgPGRpdiBjbGFzcz0icGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBoaWRkZW4iPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gZm9ybWF0IgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZvcm1hdDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBmb3JtYXQiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gd2lkdGgiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+V2lkdGg6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgd2lkdGgiPjwvc3Bhbj5weDwvc3BhbgogICAgICA+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBoZWlnaHQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+SGVpZ2h0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGhlaWdodCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHNjYWxlIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPlNjYWxlOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIHNjYWxlIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2V0Ij5TZXQ8L2J1dHRvbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gdW5zZXQiPlVuc2V0PC9idXR0b24+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmaWxlbmFtZSIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5GaWxlbmFtZTo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBmaWxlbmFtZSI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICA8L2Rpdj5gCiAgKTsKCmZ1bmN0aW9uIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpIHsKICBjb25zdCB2YWxpZF9jbGFzc2VzID0gWwogICAgIm1pc3NpbmctY29uZmlnIiwKICAgICJtYXRjaGluZy1jb25maWciLAogICAgImRpZmZlcmVudC1jb25maWciLAogIF07CiAgZnVuY3Rpb24gc2V0Q2xhc3MoY2wpIHsKICAgIGZvciAoY29uc3QgbmFtZSBvZiB2YWxpZF9jbGFzc2VzKSB7CiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKG5hbWUsIG5hbWUgPT0gY2wpOwogICAgfQogIH0KICAvLyBXZSB1c2UgdGhlIGN1c3RvbSBnZXR0ZXJzIHdlJ2xsIHNldCB1cCBpbiB0aGUgY29udGFpbmVyCiAgY29uc3QgeyB1aV92YWx1ZSwgY29uZmlnX3ZhbHVlLCBjb25maWdfc3Bhbiwga2V5IH0gPSBjb250YWluZXI7CiAgaWYgKGNvbmZpZ192YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICBzZXRDbGFzcygibWlzc2luZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaXMgbm90IHByZXNlbnQgaW4gdGhlIGNvbmZpZy5gOwogIH0gZWxzZSBpZiAodWlfdmFsdWUgPT0gY29uZmlnX3ZhbHVlKSB7CiAgICBzZXRDbGFzcygibWF0Y2hpbmctY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGhhcyB0aGUgc2FtZSB2YWx1ZSBpbiB0aGUgY29uZmlnIGFuZCBpbiB0aGUgaGVhZGVyLmA7CiAgfSBlbHNlIHsKICAgIHNldENsYXNzKCJkaWZmZXJlbnQtY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGhhcyBhIGRpZmZlcmVudCB2YWx1ZSAoPGVtPiR7Y29uZmlnX3ZhbHVlfTwvZW0+KSBpbiB0aGUgY29uZmlnLmA7CiAgfQogIC8vIEFkZCBpbmZvIGFib3V0IHNldHRpbmcgYW5kIHVuc2V0dGluZwogIGNvbmZpZ19zcGFuLmluc2VydEFkamFjZW50SFRNTCgKICAgICJiZWZvcmVlbmQiLAogICAgYDxicj5DbGljayBvbiB0aGUgbGFiZWwgPGVtPjxiPm9uY2U8L2I+PC9lbT4gdG8gc2V0IHRoZSBjdXJyZW50IFVJIHZhbHVlIGluIHRoZSBjb25maWcuYAogICk7CiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIDxlbT48Yj50d2ljZTwvYj48L2VtPiB0byByZW1vdmUgdGhpcyBrZXkgZnJvbSB0aGUgY29uZmlnLmAKICApOwp9Cgpjb25zdCB2YWxpZF9mb3JtYXRzID0gWyJwbmciLCAic3ZnIiwgIndlYnAiLCAianBlZyIsICJmdWxsLWpzb24iXTsKZnVuY3Rpb24gaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHNwYW4sIGtleSwgdmFsdWUpIHsKICBjb25zdCBjb250YWluZXIgPSBzcGFuLmNsb3Nlc3QoIi5jbGlwYm9hcmQtc3BhbiIpOwogIHNwYW4uY29udGVudEVkaXRhYmxlID0ga2V5ID09PSAiZm9ybWF0IiA/ICJmYWxzZSIgOiAidHJ1ZSI7CiAgbGV0IHBhcnNlID0gKHgpID0+IHg7CiAgbGV0IHVwZGF0ZSA9ICh4KSA9PiAoc3Bhbi50ZXh0Q29udGVudCA9IHgpOwogIGlmIChrZXkgPT09ICJ3aWR0aCIgfHwga2V5ID09PSAiaGVpZ2h0IikgewogICAgcGFyc2UgPSAoeCkgPT4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KHgpKTsKICB9IGVsc2UgaWYgKGtleSA9PT0gInNjYWxlIikgewogICAgcGFyc2UgPSBwYXJzZUZsb2F0OwogIH0gZWxzZSBpZiAoa2V5ID09PSAiZm9ybWF0IikgewogICAgLy8gV2UgcmVtb3ZlIGNvbnRlbnRFZGl0YWJsZQogICAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSAiZmFsc2UiOwogICAgLy8gSGVyZSB3ZSBmaXJzdCBhZGQgdGhlIHN1YnNwYW5zIGZvciBlYWNoIG9wdGlvbgogICAgY29uc3Qgb3B0c19kaXYgPSBzcGFuLmFwcGVuZENoaWxkKGh0bWxgPGRpdiBjbGFzcz0iZm9ybWF0LW9wdGlvbnMiPjwvZGl2PmApOwogICAgZm9yIChjb25zdCBmbXQgb2YgdmFsaWRfZm9ybWF0cykgewogICAgICBjb25zdCBvcHQgPSBvcHRzX2Rpdi5hcHBlbmRDaGlsZCgKICAgICAgICBodG1sYDxzcGFuIGNsYXNzPSJmb3JtYXQtb3B0aW9uICR7Zm10fSI+JHtmbXR9PC9zcGFuPmAKICAgICAgKTsKICAgICAgb3B0Lm9uY2xpY2sgPSAoZSkgPT4gewogICAgICAgIHNwYW4udmFsdWUgPSBvcHQudGV4dENvbnRlbnQ7CiAgICAgIH07CiAgICB9CiAgICBwYXJzZSA9ICh4KSA9PiB7CiAgICAgIHJldHVybiB2YWxpZF9mb3JtYXRzLmluY2x1ZGVzKHgpID8geCA6IGxvY2FsVmFsdWU7CiAgICB9OwogICAgdXBkYXRlID0gKHgpID0+IHsKICAgICAgZm9yIChjb25zdCBvcHQgb2Ygb3B0c19kaXYuY2hpbGRyZW4pIHsKICAgICAgICBvcHQuY2xhc3NMaXN0LnRvZ2dsZSgic2VsZWN0ZWQiLCBvcHQudGV4dENvbnRlbnQgPT09IHgpOwogICAgICB9CiAgICB9OwogIH0gZWxzZSB7CiAgICAvLyBXZSBvbmx5IGhhdmUgZmlsZW5hbWUgaGVyZQogIH0KICBsZXQgbG9jYWxWYWx1ZTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBsb2NhbFZhbHVlOwogICAgfSwKICAgIHNldDogKHZhbCkgPT4gewogICAgICBpZiAodmFsICE9PSAiIikgewogICAgICAgIGxvY2FsVmFsdWUgPSBwYXJzZSh2YWwpOwogICAgICB9CiAgICAgIHVwZGF0ZShsb2NhbFZhbHVlKTsKICAgICAgY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcik7CiAgICB9LAogIH0pOwogIC8vIFdlIGFsc28gYXNzaWduIGEgbGlzdGVuZXIgc28gdGhhdCB0aGUgZWRpdGFibGUgaXMgYmx1cnJlZCB3aGVuIGVudGVyIGlzIHByZXNzZWQKICBzcGFuLm9ua2V5ZG93biA9IChlKSA9PiB7CiAgICBpZiAoZS5rZXlDb2RlID09PSAxMykgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHNwYW4uYmx1cigpOwogICAgfQogIH07CiAgc3Bhbi52YWx1ZSA9IHZhbHVlOwp9CgpmdW5jdGlvbiBpbml0aWFsaXplQ29uZmlnVmFsdWVTcGFuKHNwYW4sIGtleSkgewogIC8vIEhlcmUgd2UgbW9zdGx5IHdhbnQgdG8gZGVmaW5lIHRoZSBzZXR0ZXIgYW5kIGdldHRlcgogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwYW4sICJ2YWx1ZSIsIHsKICAgIGdldDogKCkgPT4gewogICAgICByZXR1cm4gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV07CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIC8vIGlmIHVuZGVmaW5lZCBpcyBwYXNzZWQsIHdlIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgb3B0aW9ucwogICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsKICAgICAgICBkZWxldGUgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV0gPSB2YWw7CiAgICAgIH0KICAgICAgY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcik7CiAgICB9LAogIH0pOwp9Cgpjb25zdCBjb25maWdfc3BhbnMgPSB7fTsKZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZ2V0SW1hZ2VPcHRpb25zKCkpKSB7CiAgY29uc3QgY29udGFpbmVyID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKGAuY2xpcGJvYXJkLXNwYW4uJHtrZXl9YCk7CiAgY29uc3QgbGFiZWwgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmxhYmVsIik7CiAgLy8gV2UgZ2l2ZSB0aGUgbGFiZWwgYSBmdW5jdGlvbiB0aGF0IG9uIHNpbmdsZSBjbGljayB3aWxsIHNldCB0aGUgY3VycmVudCB2YWx1ZSBhbmQgd2l0aCBkb3VibGUgY2xpY2sgd2lsbCB1bnNldCBpdAogIGxhYmVsLm9uY2xpY2sgPSBEdWFsQ2xpY2soCiAgICAoKSA9PiB7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBjb250YWluZXIudWlfdmFsdWU7CiAgICB9LAogICAgKGUpID0+IHsKICAgICAgY29uc29sZS5sb2coImUiLCBlKTsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gdW5kZWZpbmVkOwogICAgfQogICk7CiAgY29uc3QgdWlfdmFsdWVfc3BhbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXZhbHVlIik7CiAgY29uc3QgY29uZmlnX3ZhbHVlX3NwYW4gPQogICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jb25maWctdmFsdWUiKSA/PwogICAgbGFiZWwuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgICAiYWZ0ZXJiZWdpbiIsCiAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImNvbmZpZy12YWx1ZSI+PC9zcGFuPmAKICAgICk7CiAgLy8gQXNzaW5nIHRoZSB0d28gc3BhbnMgYXMgcHJvcGVydGllcyBvZiB0aGUgY29udGFpbmluZyBzcGFuCiAgY29udGFpbmVyLnVpX3NwYW4gPSB1aV92YWx1ZV9zcGFuOwogIGNvbnRhaW5lci5jb25maWdfc3BhbiA9IGNvbmZpZ192YWx1ZV9zcGFuOwogIGNvbnRhaW5lci5rZXkgPSBrZXk7CiAgY29uZmlnX3NwYW5zW2tleV0gPSBjb250YWluZXI7CiAgaWYgKGZpcnN0UnVuKSB7CiAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPQogICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPz8ge307CiAgICAvLyBXZSBkbyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHZhbHVlIHNwYW4KICAgIGluaXRpYWxpemVVSVZhbHVlU3Bhbih1aV92YWx1ZV9zcGFuLCBrZXksIHZhbHVlKTsKICAgIC8vIFRoZW4gd2UgaW5pdGlhbGl6ZSB0aGUgY29uZmlnIHZhbHVlCiAgICBpbml0aWFsaXplQ29uZmlnVmFsdWVTcGFuKGNvbmZpZ192YWx1ZV9zcGFuLCBrZXkpOwogICAgLy8gV2UgcHV0IHNvbWUgY29udmVuaWVuY2UgZ2V0dGVycy9zZXR0ZXJzCiAgICAvLyB1aV92YWx1ZSBmb3J3YXJkCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAidWlfdmFsdWUiLCB7CiAgICAgIGdldDogKCkgPT4gdWlfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgdWlfdmFsdWVfc3Bhbi52YWx1ZSA9IHZhbDsKICAgICAgfSwKICAgIH0pOwogICAgLy8gY29uZmlnX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJjb25maWdfdmFsdWUiLCB7CiAgICAgIGdldDogKCkgPT4gY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUsCiAgICAgIHNldDogKHZhbCkgPT4gewogICAgICAgIGNvbmZpZ192YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgfQp9CgovLyBUaGVzZSBvYmplY3RzIHdpbGwgY29udGFpbiB0aGUgZGVmYXVsdCB2YWx1ZQoKLy8gVGhpcyBjb2RlIHVwZGF0ZXMgdGhlIGltYWdlIG9wdGlvbnMgaW4gdGhlIFBMT1QgY29uZmlnIHdpdGggdGhlIHByb3ZpZGVkIG9uZXMKZnVuY3Rpb24gc2V0SW1hZ2VPcHRpb25zKG8pIHsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IG9ba2V5XTsKICB9Cn0KZnVuY3Rpb24gdW5zZXRJbWFnZU9wdGlvbnMoKSB7CiAgc2V0SW1hZ2VPcHRpb25zKHt9KTsKfQoKY29uc3Qgc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnNldCIpOwpjb25zdCB1bnNldF9idXR0b24gPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtc3Bhbi51bnNldCIpOwppZiAoZmlyc3RSdW4pIHsKICBzZXRfYnV0dG9uLm9uY2xpY2sgPSAoZSkgPT4gewogICAgZm9yIChjb25zdCBjb250YWluZXIgb2YgT2JqZWN0LnZhbHVlcyhjb25maWdfc3BhbnMpKSB7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBjb250YWluZXIudWlfdmFsdWU7CiAgICB9CiAgfTsKICB1bnNldF9idXR0b24ub25jbGljayA9IHVuc2V0SW1hZ2VPcHRpb25zOwp9CgovLyBXZSBhZGQgYSBmdW5jdGlvbiB0byBjaGVjayBpZiB0aGUgY2xpcGJvYXJkIGlzIHBvcHBlZCBvdXQKQ09OVEFJTkVSLmlzUG9wcGVkT3V0ID0gKCkgPT4gewogIHJldHVybiBDT05UQUlORVIuY2xhc3NMaXN0LmNvbnRhaW5zKCJwb3BwZWQtb3V0Iik7Cn07CgpDTElQQk9BUkRfSEVBREVSLm9ubW91c2Vkb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgaWYgKGV2ZW50LnRhcmdldC5tYXRjaGVzKCJzcGFuLmNsaXBib2FyZC12YWx1ZSIpKSB7CiAgICBjb25zb2xlLmxvZygiV2UgZG9uJ3QgbW92ZSEiKTsKICAgIHJldHVybjsKICB9CiAgY29uc3Qgc3RhcnQgPSB7CiAgICBsZWZ0OiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS5sZWZ0KSwKICAgIHRvcDogcGFyc2VGbG9hdChDT05UQUlORVIuc3R5bGUudG9wKSwKICAgIFg6IGV2ZW50LnBhZ2VYLAogICAgWTogZXZlbnQucGFnZVksCiAgfTsKICBmdW5jdGlvbiBtb3ZlQXQoZXZlbnQsIHN0YXJ0KSB7CiAgICBjb25zdCB0b3AgPSBldmVudC5wYWdlWSAtIHN0YXJ0LlkgKyBzdGFydC50b3AgKyAicHgiOwogICAgY29uc3QgbGVmdCA9IGV2ZW50LnBhZ2VYIC0gc3RhcnQuWCArIHN0YXJ0LmxlZnQgKyAicHgiOwogICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gbGVmdDsKICAgIENPTlRBSU5FUi5zdHlsZS5sZWZ0ID0gbGVmdDsKICAgIENPTlRBSU5FUi5zdHlsZS50b3AgPSB0b3A7CiAgfQoKICAvLyBtb3ZlIG91ciBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYmFsbCB1bmRlciB0aGUgcG9pbnRlcgogIG1vdmVBdChldmVudCwgc3RhcnQpOwogIGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGV2ZW50KSB7CiAgICBtb3ZlQXQoZXZlbnQsIHN0YXJ0KTsKICB9CgogIC8vIFdlIHVzZSB0aGlzIHRvIHJlbW92ZSB0aGUgbW91c2Vtb3ZlIHdoZW4gY2xpY2tpbmcgb3V0c2lkZSBvZiB0aGUgY29udGFpbmVyCiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgLy8gbW92ZSB0aGUgY29udGFpbmVyIG9uIG1vdXNlbW92ZQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIG9uTW91c2VNb3ZlLCB7CiAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLAogIH0pOwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAibW91c2Vkb3duIiwKICAgIChlKSA9PiB7CiAgICAgIGlmIChlLnRhcmdldC5jbG9zZXN0KCIucGx1dG9wbG90bHktY29udGFpbmVyIikgIT09IENPTlRBSU5FUikgewogICAgICAgIGNsZWFuVXAoKTsKICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9LAogICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0KICApOwoKICBmdW5jdGlvbiBjbGVhblVwKCkgewogICAgY29uc29sZS5sb2coImNsZWFuaW5nIHVwIHRoZSBwbG90IG1vdmUgbGlzdGVuZXIiKTsKICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gbnVsbDsKICB9CgogIC8vICgzKSBkcm9wIHRoZSBiYWxsLCByZW1vdmUgdW5uZWVkZWQgaGFuZGxlcnMKICBDTElQQk9BUkRfSEVBREVSLm9ubW91c2V1cCA9IGNsZWFuVXA7Cn07CgpmdW5jdGlvbiBzZW5kVG9DbGlwYm9hcmQoYmxvYikgewogIGlmICghbmF2aWdhdG9yLmNsaXBib2FyZCkgewogICAgYWxlcnQoCiAgICAgICJUaGUgQ2xpcGJvYXJkIEFQSSBkb2VzIG5vdCBzZWVtIHRvIGJlIGF2YWlsYWJsZSwgbWFrZSBzdXJlIHRoZSBQbHV0byBub3RlYm9vayBpcyBiZWluZyB1c2VkIGZyb20gZWl0aGVyIGxvY2FsaG9zdCBvciBhbiBodHRwcyBzb3VyY2UuIgogICAgKTsKICB9CiAgbmF2aWdhdG9yLmNsaXBib2FyZAogICAgLndyaXRlKFsKICAgICAgbmV3IENsaXBib2FyZEl0ZW0oewogICAgICAgIC8vIFRoZSBrZXkgaXMgZGV0ZXJtaW5lZCBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgYmxvYidzIHR5cGUuCiAgICAgICAgW2Jsb2IudHlwZV06IGJsb2IsCiAgICAgIH0pLAogICAgXSkKICAgIC50aGVuKAogICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgY29uc29sZS5sb2coIkFzeW5jOiBDb3B5aW5nIHRvIGNsaXBib2FyZCB3YXMgc3VjY2Vzc2Z1bCEiKTsKICAgICAgfSwKICAgICAgZnVuY3Rpb24gKGVycikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkFzeW5jOiBDb3VsZCBub3QgY29weSB0ZXh0OiAiLCBlcnIpOwogICAgICB9CiAgICApOwp9CgpmdW5jdGlvbiBjb3B5SW1hZ2VUb0NsaXBib2FyZCgpIHsKICAvLyBXZSBleHRyYWN0IHRoZSBpbWFnZSBvcHRpb25zIGZyb20gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMgKGlmIHRoZXkgZXhpc3QpCiAgY29uc3QgY29uZmlnID0ge307CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGxldCB2YWwgPQogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID8/CiAgICAgIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IGNvbnRhaW5lci51aV92YWx1ZSA6IHVuZGVmaW5lZCk7CiAgICAvLyBJZiB3ZSBoYXZlIHVuZGVmaW5lZCB3ZSBkb24ndCBjcmVhdGUgdGhlIGtleS4gV2UgYWxzbyBpZ25vcmUgZm9ybWF0IGJlY2F1c2UgdGhlIGNsaXBib2FyZCBvbmx5IHN1cHBvcnRzIHBuZy4KICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS50b0ltYWdlKFBMT1QsIGNvbmZpZykudGhlbihmdW5jdGlvbiAoZGF0YVVybCkgewogICAgZmV0Y2goZGF0YVVybCkKICAgICAgLnRoZW4oKHJlcykgPT4gcmVzLmJsb2IoKSkKICAgICAgLnRoZW4oKGJsb2IpID0+IHsKICAgICAgICBjb25zdCBwYXN0ZV9yZWNlaXZlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3Bhc3RlLXJlY2VpdmVyLnBsdXRvcGxvdGx5JykKICAgICAgICBpZiAocGFzdGVfcmVjZWl2ZXIpIHsKICAgICAgICAgIHBhc3RlX3JlY2VpdmVyLmF0dGFjaEltYWdlKGRhdGFVcmwsIENPTlRBSU5FUikKICAgICAgICB9CiAgICAgICAgc2VuZFRvQ2xpcGJvYXJkKGJsb2IpCiAgICAgIH0pOwogIH0pOwp9CgpmdW5jdGlvbiBzYXZlSW1hZ2VUb0ZpbGUoKSB7CiAgY29uc3QgY29uZmlnID0ge307CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGxldCB2YWwgPQogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID8/CiAgICAgIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IGNvbnRhaW5lci51aV92YWx1ZSA6IHVuZGVmaW5lZCk7CiAgICAvLyBJZiB3ZSBoYXZlIHVuZGVmaW5lZCB3ZSBkb24ndCBjcmVhdGUgdGhlIGtleS4KICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbmZpZ1trZXldID0gdmFsOwogIH0KICBQbG90bHkuZG93bmxvYWRJbWFnZShQTE9ULCBjb25maWcpOwp9CgpsZXQgY29udGFpbmVyX3JlY3QgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAsIHRvcDogMCwgbGVmdDogMCB9OwpmdW5jdGlvbiB1bnBvcF9jb250YWluZXIoY2wpIHsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZSgicG9wcGVkLW91dCIsIGZhbHNlKTsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgZmFsc2UpOwogIC8vIFdlIGZpeCB0aGUgaGVpZ2h0IGJhY2sgdG8gdGhlIHZhbHVlIGl0IGhhZCBiZWZvcmUgcG9wb3V0LCBhbHNvIHNldHRpbmcgdGhlIGZsYWcgdG8gc2lnbmFsIHRoYXQgdXBvbiBmaXJzdCByZXNpemUgd2UgcmVtb3ZlIHRoZSBmaXhlZCBpbmxpbmUtc3R5bGUKICBDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0ICsgInB4IjsKICByZW1vdmVfY29udGFpbmVyX3NpemUgPSB0cnVlOwogIC8vIFdlIHNldCB0aGUgb3RoZXIgZml4ZWQgaW5saW5lLXN0eWxlcyB0byBudWxsCiAgQ09OVEFJTkVSLnN0eWxlLndpZHRoID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9ICIiOwogIENPTlRBSU5FUi5zdHlsZS5sZWZ0ID0gIiI7CiAgLy8gV2UgYWxzbyByZW1vdmUgdGhlIENMSVBCT0FSRF9IRUFERVIKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLndpZHRoID0gIiI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gIiI7CiAgLy8gRmluYWxseSB3ZSByZW1vdmUgdGhlIGhpZGRlbiBjbGFzcyB0byB0aGUgaGVhZGVyCiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCB0cnVlKTsKICByZXR1cm47Cn0KZnVuY3Rpb24gcG9wb3V0X2NvbnRhaW5lcihvcHRzKSB7CiAgY29uc3QgY2wgPSBvcHRzPy5jbDsKICBjb25zdCB0YXJnZXRfY29udGFpbmVyX3NpemUgPSBvcHRzPy50YXJnZXRfY29udGFpbmVyX3NpemUgPz8ge307CiAgY29uc3QgdGFyZ2V0X3Bsb3Rfc2l6ZSA9IG9wdHM/LnRhcmdldF9wbG90X3NpemUgPz8ge307CiAgaWYgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICByZXR1cm4gdW5wb3BfY29udGFpbmVyKGNsKTsKICB9CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoY2wsIGNsID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IHRydWUpOwogIC8vIFdlIGV4dHJhY3QgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgY29udGFpbmVyLCBzYXZlIHRoZW0gYW5kIGZpeCB0aGVtCiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfSA9IENPTlRBSU5FUi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICBjb250YWluZXJfcmVjdCA9IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH07CiAgLy8gV2Ugc2F2ZSB0aGUgY3VycmVudCBwbG90IHNpemUgYmVmb3JlIHdlIHBvcCBhcyBpdCB3aWxsIGZpbGwgdGhlIHNjcmVlbgogIGNvbnN0IGN1cnJlbnRfcGxvdF9zaXplID0gewogICAgd2lkdGg6IFBMT1QuX2Z1bGxMYXlvdXQud2lkdGgsCiAgICBoZWlnaHQ6IFBMT1QuX2Z1bGxMYXlvdXQuaGVpZ2h0LAogIH07CiAgLy8gV2UgaGF2ZSB0byBzYXZlIHRoZSBwYWQgZGF0YSBiZWZvcmUgcG9wcGluZyBzbyB3ZSBjYW4gcmVzaXplIHByZWNpc2VseQogIGNvbnN0IHBhZCA9IHt9OwogIHBhZC51bnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZSgicG9wcGVkLW91dCIsIHRydWUpOwogIHBhZC5wb3BwZWQgPSBnZXRTaXplRGF0YSgpLmNvbnRhaW5lcl9wYWQ7CiAgLy8gV2UgZG8gdG9wIGFuZCBsZWZ0IGJhc2VkIG9uIHRoZSBjdXJyZW50IHJlY3QKICBmb3IgKGNvbnN0IGtleSBvZiBbInRvcCIsICJsZWZ0Il0pIHsKICAgIGNvbnN0IHN0YXJ0X3ZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNvbnRhaW5lcl9yZWN0W2tleV07CiAgICBsZXQgb2Zmc2V0ID0gMDsKICAgIGZvciAoY29uc3Qga2luZCBvZiBbInBhZGRpbmciLCAiYm9yZGVyIl0pIHsKICAgICAgb2Zmc2V0ICs9IHBhZC5wb3BwZWRba2luZF1ba2V5XSAtIHBhZC51bnBvcHBlZFtraW5kXVtrZXldOwogICAgfQogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSBzdGFydF92YWwgLSBvZmZzZXQgKyAicHgiOwogICAgaWYgKGtleSA9PT0gImxlZnQiKSB7CiAgICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGVba2V5XSA9IENPTlRBSU5FUi5zdHlsZVtrZXldOwogICAgfQogIH0KICAvLyBXZSBjb21wdXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGRlcGVuZGluZyBvbiBldmVudHVhbCBjb25maWcgZGF0YQogIGNvbnN0IGNzeiA9IGNvbXB1dGVDb250YWluZXJTaXplKHsKICAgIHdpZHRoOgogICAgICB0YXJnZXRfcGxvdF9zaXplLndpZHRoID8/CiAgICAgIGNvbmZpZ19zcGFucy53aWR0aC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6CiAgICAgIHRhcmdldF9wbG90X3NpemUuaGVpZ2h0ID8/CiAgICAgIGNvbmZpZ19zcGFucy5oZWlnaHQuY29uZmlnX3ZhbHVlID8/CiAgICAgIGN1cnJlbnRfcGxvdF9zaXplLmhlaWdodCwKICB9KTsKICBmb3IgKGNvbnN0IGtleSBvZiBbIndpZHRoIiwgImhlaWdodCJdKSB7CiAgICBjb25zdCB2YWwgPSB0YXJnZXRfY29udGFpbmVyX3NpemVba2V5XSA/PyBjc3pba2V5XTsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gdmFsICsgInB4IjsKICAgIGlmIChrZXkgPT09ICJ3aWR0aCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIENMSVBCT0FSRF9IRUFERVIuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgZmFsc2UpOwogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CgogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAibW91c2Vkb3duIiwKICAgIChlKSA9PiB7CiAgICAgIGlmIChlLnRhcmdldC5jbG9zZXN0KCIucGx1dG9wbG90bHktY29udGFpbmVyIikgIT09IENPTlRBSU5FUikgewogICAgICAgIHVucG9wX2NvbnRhaW5lcigpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7Cn0KCkNPTlRBSU5FUi5wb3BPdXQgPSBwb3BvdXRfY29udGFpbmVyOwoKZnVuY3Rpb24gRHVhbENsaWNrKHNpbmdsZV9mdW5jLCBkYmxfZnVuYykgewogIGxldCBuY2xpY2tzID0gMDsKICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHsKICAgIG5jbGlja3MgKz0gMTsKICAgIGlmIChuY2xpY2tzID4gMSkgewogICAgICBkYmxfZnVuYyguLi5hcmdzKTsKICAgICAgbmNsaWNrcyA9IDA7CiAgICB9IGVsc2UgewogICAgICBkZWxheSgzMDApLnRoZW4oKCkgPT4gewogICAgICAgIGlmIChuY2xpY2tzID09IDEpIHsKICAgICAgICAgIHNpbmdsZV9mdW5jKC4uLmFyZ3MpOwogICAgICAgIH0KICAgICAgICBuY2xpY2tzID0gMDsKICAgICAgfSk7CiAgICB9CiAgfTsKfQoKLy8gV2UgcmVtb3ZlIHRoZSBkZWZhdWx0IGRvd25sb2FkIGltYWdlIGJ1dHRvbgpwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSA9IF8udW5pb24oCiAgcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9SZW1vdmUsCiAgWyJ0b0ltYWdlIl0KKTsKLy8gV2UgYWRkIHRoZSBjdXN0b20gYnV0dG9uIHRvIHRoZSBtb2RlYmFyCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb0FkZCwKICBbCiAgICB7CiAgICAgIG5hbWU6ICJDb3B5IFBORyB0byBDbGlwYm9hcmQiLAogICAgICBpY29uOiB7CiAgICAgICAgaGVpZ2h0OiA1MjAsCiAgICAgICAgd2lkdGg6IDUyMCwKICAgICAgICBwYXRoOiAiTTI4MCA2NGg0MGMzNS4zIDAgNjQgMjguNyA2NCA2NFY0NDhjMCAzNS4zLTI4LjcgNjQtNjQgNjRINjRjLTM1LjMgMC02NC0yOC43LTY0LTY0VjEyOEMwIDkyLjcgMjguNyA2NCA2NCA2NGg0MCA5LjZDMTIxIDI3LjUgMTUzLjMgMCAxOTIgMHM3MSAyNy41IDc4LjQgNjRIMjgwek02NCAxMTJjLTguOCAwLTE2IDcuMi0xNiAxNlY0NDhjMCA4LjggNy4yIDE2IDE2IDE2SDMyMGM4LjggMCAxNi03LjIgMTYtMTZWMTI4YzAtOC44LTcuMi0xNi0xNi0xNkgzMDR2MjRjMCAxMy4zLTEwLjcgMjQtMjQgMjRIMTkyIDEwNGMtMTMuMyAwLTI0LTEwLjctMjQtMjRWMTEySDY0em0xMjgtOGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6IiwKICAgICAgfSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKGNvcHlJbWFnZVRvQ2xpcGJvYXJkLCAoKSA9PiB7CiAgICAgICAgcG9wb3V0X2NvbnRhaW5lcigpOwogICAgICB9KSwKICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICJEb3dubG9hZCBJbWFnZSIsCiAgICAgIGljb246IFBsb3RseS5JY29ucy5jYW1lcmEsCiAgICAgIGRpcmVjdGlvbjogInVwIiwKICAgICAgY2xpY2s6IER1YWxDbGljayhzYXZlSW1hZ2VUb0ZpbGUsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKHsgY2w6ICJmaWxlc2F2ZSIgfSk7CiAgICAgIH0pLAogICAgfSwKICBdCik7CgpmdW5jdGlvbiBnZXRPZmZzZXREYXRhKGVsKSB7CiAgbGV0IGNzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwsIG51bGwpOwogIGNvbnN0IG9kYXRhID0gewogICAgcGFkZGluZzogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdMZWZ0KSwKICAgICAgcmlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1JpZ2h0KSwKICAgICAgdG9wOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdUb3ApLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MucGFkZGluZ0JvdHRvbSksCiAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdMZWZ0KSArIHBhcnNlRmxvYXQoY3MucGFkZGluZ1JpZ2h0KSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdUb3ApICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgIH0sCiAgICBib3JkZXI6IHsKICAgICAgbGVmdDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgdG9wOiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSwKICAgICAgYm90dG9tOiBwYXJzZUZsb2F0KGNzLmJvcmRlckJvdHRvbVdpZHRoKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MuYm9yZGVyTGVmdFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyUmlnaHRXaWR0aCksCiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChjcy5ib3JkZXJUb3BXaWR0aCkgKyBwYXJzZUZsb2F0KGNzLmJvcmRlckJvdHRvbVdpZHRoKSwKICAgIH0KICB9OwogIGlmIChlbCA9PT0gUExPVCkgewogICAgLy8gRm9yIHRoZSBQTE9UIHdlIGFsc28gd2FudCB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgb2Zmc2V0CiAgICBvZGF0YS5vZmZzZXQgPSB7CiAgICAgIHRvcDogUExPVC5vZmZzZXRQYXJlbnQgPT0gQ09OVEFJTkVSID8gUExPVC5vZmZzZXRUb3AgOiAwLAogICAgICBsZWZ0OiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldExlZnQgOiAwLAogICAgfQogIH0KICByZXR1cm4gb2RhdGE7Cn0KZnVuY3Rpb24gZ2V0U2l6ZURhdGEoKSB7CiAgY29uc3QgZGF0YSA9IHsKICAgIHBsb3RfcGFkOiBnZXRPZmZzZXREYXRhKFBMT1QpLAogICAgcGxvdF9yZWN0OiBQTE9ULmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogICAgY29udGFpbmVyX3BhZDogZ2V0T2Zmc2V0RGF0YShDT05UQUlORVIpLAogICAgY29udGFpbmVyX3JlY3Q6IENPTlRBSU5FUi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICB9OwogIHJldHVybiBkYXRhOwp9CmZ1bmN0aW9uIGNvbXB1dGVDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICBjb25zdCBjb21wdXRlZF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICBjb25zdCBvZmZzZXRzID0gY29tcHV0ZWRfc2l6ZS5vZmZzZXRzOwoKICBjb25zdCBwbG90X2RhdGEgPSB7CiAgICB3aWR0aDogd2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCwKICAgIGhlaWdodDogaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH07CgogIHJldHVybiB7CiAgICB3aWR0aDogKHdpZHRoID8/IGNvbXB1dGVkX3NpemUud2lkdGgpICsgb2Zmc2V0cy53aWR0aCwKICAgIGhlaWdodDogKGhlaWdodCA/PyBjb21wdXRlZF9zaXplLmhlaWdodCkgKyBvZmZzZXRzLmhlaWdodCwKICAgIG5vQ2hhbmdlOiB3aWR0aCA9PSBjb21wdXRlZF9zaXplLndpZHRoICYmIGhlaWdodCA9PSBjb21wdXRlZF9zaXplLmhlaWdodCwKICB9Cn0KCi8vIFRoaXMgZnVuY3Rpb24gd2lsbCBjaGFuZ2UgdGhlIGNvbnRhaW5lciBzaXplIHNvIHRoYXQgdGhlIHJlc3VsdGluZyBwbG90IHdpbGwgYmUgbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIHNwZWNzCmZ1bmN0aW9uIGNoYW5nZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGlmICghQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIGNvbnNvbGUubG9nKCJUcmllZCB0byBjaGFuZ2UgY29udGFpbmVyIHNpemUgd2hlbiBub3QgcG9wcGVkLCBpZ25vcmluZyIpOwogICAgcmV0dXJuOwogIH0KCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhKTsKCiAgaWYgKGNzei5ub0NoYW5nZSkgewogICAgY29uc29sZS5sb2coIlNpemUgaXMgdGhlIHNhbWUgYXMgY3VycmVudCwgaWdub3JpbmciKTsKICAgIHJldHVybgogIH0KICAvLyBXZSBhcmUgbm93IGdvaW5nIHRvIHNldCBoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBjb250YWluZXIKICBmb3IgKGNvbnN0IGtleSBvZiBbIndpZHRoIiwgImhlaWdodCJdKSB7CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IGNzeltrZXldICsgInB4IjsKICB9Cn0KLy8gV2Ugbm93IGNyZWF0ZSB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIHVwZGF0ZSB0aGUgcGxvdCBiYXNlZCBvbiB0aGUgdmFsdWVzIHNwZWNpZmllZApmdW5jdGlvbiB1cGRhdGVGcm9tSGVhZGVyKCkgewogIGNvbnN0IGhlYWRlcl9kYXRhID0gewogICAgaGVpZ2h0OiBjb25maWdfc3BhbnMuaGVpZ2h0LnVpX3ZhbHVlLAogICAgd2lkdGg6IGNvbmZpZ19zcGFucy53aWR0aC51aV92YWx1ZSwKICB9OwogIGNoYW5nZUNvbnRhaW5lclNpemUoaGVhZGVyX2RhdGEpOwp9Ci8vIFdlIGFzc2lnbiB0aGlzIGZ1bmN0aW9uIHRvIHRoZSBvbmJsdXIgZXZlbnQgb2Ygd2lkdGggYW5kIGhlaWdodAppZiAoZmlyc3RSdW4pIHsKICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGNvbnRhaW5lci51aV9zcGFuLm9uYmx1ciA9IChlKSA9PiB7CiAgICAgIGNvbnRhaW5lci51aV92YWx1ZSA9IGNvbnRhaW5lci51aV9zcGFuLnRleHRDb250ZW50OwogICAgICB1cGRhdGVGcm9tSGVhZGVyKCk7CiAgICB9OwogIH0KfQovLyBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBwbG90IHNpemUgdG8gdXNlIGZvciByZWxheW91dCBhcyBhIGZ1bmN0aW9uIG9mIHRoZSBjb250YWluZXIgc2l6ZQpmdW5jdGlvbiBjb21wdXRlUGxvdFNpemUoZGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICAvLyBSZW1vdmUgUGFkZGluZwogIGNvbnN0IHsgY29udGFpbmVyX3BhZCwgcGxvdF9wYWQsIGNvbnRhaW5lcl9yZWN0IH0gPSBkYXRhOwogIGNvbnN0IG9mZnNldHMgPSB7CiAgICB3aWR0aDoKICAgICAgcGxvdF9wYWQucGFkZGluZy53aWR0aCArCiAgICAgIHBsb3RfcGFkLmJvcmRlci53aWR0aCArCiAgICAgIHBsb3RfcGFkLm9mZnNldC5sZWZ0ICsKICAgICAgY29udGFpbmVyX3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgY29udGFpbmVyX3BhZC5ib3JkZXIud2lkdGgsCiAgICBoZWlnaHQ6CiAgICAgIHBsb3RfcGFkLnBhZGRpbmcuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLmhlaWdodCArCiAgICAgIHBsb3RfcGFkLm9mZnNldC50b3AgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcuaGVpZ2h0ICsKICAgICAgY29udGFpbmVyX3BhZC5ib3JkZXIuaGVpZ2h0LAogIH07CiAgY29uc3Qgc3ogPSB7CiAgICB3aWR0aDogTWF0aC5yb3VuZChjb250YWluZXJfcmVjdC53aWR0aCAtIG9mZnNldHMud2lkdGgpLAogICAgaGVpZ2h0OiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LmhlaWdodCAtIG9mZnNldHMuaGVpZ2h0KSwKICAgIG9mZnNldHMsCiAgfTsKICByZXR1cm4gc3o7Cn0KCi8vIENyZWF0ZSB0aGUgcmVzaXplT2JzZXJ2ZXIgdG8gbWFrZSB0aGUgcGxvdCBldmVuIG1vcmUgcmVzcG9uc2l2ZSEgOm1hZ2ljOgpjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4gewogIGNvbnN0IHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKTsKICBjb25zdCB7Y29udGFpbmVyX3JlY3QsIGNvbnRhaW5lcl9wYWR9ID0gc2l6ZURhdGE7CiAgbGV0IHBsb3Rfc2l6ZSA9IGNvbXB1dGVQbG90U2l6ZShzaXplRGF0YSk7CiAgLy8gV2Ugc2F2ZSB0aGUgaGVpZ2h0IGluIHRoZSBQTE9UIG9iamVjdAogIFBMT1QuY29udGFpbmVyX2hlaWdodCA9IGNvbnRhaW5lcl9yZWN0LmhlaWdodDsKICAvLyBXZSBkZWFsIHdpdGggc29tZSBzdHVmZiBpZiB0aGUgY29udGFpbmVyIGlzIHBvcHBwZWQKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLndpZHRoID0gY29udGFpbmVyX3JlY3Qud2lkdGggKyAicHgiOwogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9IGNvbnRhaW5lcl9yZWN0LmxlZnQgKyAicHgiOwogIGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUgPSBwbG90X3NpemUuaGVpZ2h0OwogIGNvbmZpZ19zcGFucy53aWR0aC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS53aWR0aDsKICAvKiAKCQlUaGUgYWRkaXRpb24gb2YgdGhlIGludmFsaWQgYXJndW1lbnQgYHBsdXRvcmVzaXplYCBzZWVtcyB0byBmaXggdGhlIHByb2JsZW0gd2l0aCBjYWxsaW5nIGByZWxheW91dGAgc2ltcGx5IHdpdGggYHthdXRvc2l6ZTogdHJ1ZX1gIGFzIHVwZGF0ZSBicmVha2luZyBtb3VzZSByZWxheW91dCBldmVudHMgdHJhY2tpbmcuIAoJCVNlZSBodHRwczovL2dpdGh1Yi5jb20vcGxvdGx5L3Bsb3RseS5qcy9pc3N1ZXMvNjE1NiBmb3IgZGV0YWlscwoJCSovCiAgbGV0IGNvbmZpZyA9IHsKICAgIC8vIElmIHRoaXMgaXMgcG9wcGVkIG91dCwgd2UgaWdub3JlIHRoZSBvcmlnaW5hbCB3aWR0aC9oZWlnaHQKICAgIHdpZHRoOiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyB1bmRlZmluZWQgOiBvcmlnaW5hbF93aWR0aCkgPz8gcGxvdF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyB1bmRlZmluZWQgOiBvcmlnaW5hbF9oZWlnaHQpID8/IHBsb3Rfc2l6ZS5oZWlnaHQsCiAgICBwbHV0b3Jlc2l6ZTogdHJ1ZSwKICB9OwogIFBsb3RseS5yZWxheW91dChQTE9ULCBjb25maWcpLnRoZW4oKCkgPT4gewogICAgaWYgKHJlbW92ZV9jb250YWluZXJfc2l6ZSAmJiAhQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgdGhlIGZpcnN0IHJlc2l6ZSB1cG9uIHBsb3QgY3JlYXRpb24gdG8gYWxyZWFkeSBiZSB3aXRob3V0IGEgZml4ZWQgaGVpZ2h0CiAgICAgIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSAiIjsKICAgICAgQ09OVEFJTkVSLnN0eWxlLndpZHRoID0gIiI7CiAgICAgIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IGZhbHNlOwogICAgfQogIH0pOwp9KTsKCnJlc2l6ZU9ic2VydmVyLm9ic2VydmUoQ09OVEFJTkVSKTsKCgpQbG90bHkucmVhY3QoUExPVCwgcGxvdF9vYmopLnRoZW4oKCkgPT4gewoJLy8gQXNzaWduIHRoZSBQbG90bHkgZXZlbnQgbGlzdGVuZXJzCglmb3IgKGNvbnN0IFtrZXksIGxpc3RlbmVyX3ZlY10gb2YgT2JqZWN0LmVudHJpZXMocGxvdGx5X2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULm9uKGtleSwgbGlzdGVuZXIpCgkJfQoJfQoJLy8gQXNzaWduIHRoZSBKUyBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhqc19saXN0ZW5lcnMpKSB7CgkJZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcl92ZWMpIHsKCQkJUExPVC5hZGRFdmVudExpc3RlbmVyKGtleSwgbGlzdGVuZXIsIHsKCQkJCXNpZ25hbDogY29udHJvbGxlci5zaWduYWwKCQkJfSkKCQl9Cgl9Cn0KKQoKCmludmFsaWRhdGlvbi50aGVuKCgpID0+IHsKCS8vIFJlbW92ZSBhbGwgcGxvdGx5IGxpc3RlbmVycwoJUExPVC5yZW1vdmVBbGxMaXN0ZW5lcnMoKQoJLy8gUmVtb3ZlIGFsbCBKUyBsaXN0ZW5lcnMKCWNvbnRyb2xsZXIuYWJvcnQoKQoJLy8gUmVtb3ZlIHRoZSByZXNpemVPYnNlcnZlcgoJcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpCn0pCgoKCgkJcmV0dXJuIENPTlRBSU5FUgoJPC9zY3JpcHQ+CqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b/ILS+78bBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkNDRhMzEwNTctN2IzNC00YzgwLWEyNzMtNjYyMWMwNzczZGM3uWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAvvdzLVwdWJsaXNoZWRfb2JqZWN0X2tleXOR2TRlZDI3ZGUxYS04MWQ5LTExZWYtM2I3My0xYjExNjMxMmRhZTcvNWEwZTMyNDY5MjM2YWVmuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJGNiNjU5MTE4LTlmMjItNDNjMy04MDFkLTQ5MjQxZGVlNGRmNoqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHmDqGVsZW1lbnRzmJKxZHVtbXlfaGVhcnRfYmVhdHOSoTOqdGV4dC9wbGFpbpKqaU5BVl9saW5lc5KhNqp0ZXh0L3BsYWlukqtpbV9zZWdtZW50c5KiMjCqdGV4dC9wbGFpbpKvaU5BVl9mbGlwX2FuZ2xlkqMzLjKqdGV4dC9wbGFpbpKtaW1fZmxpcF9hbmdsZZKjMTEwqnRleHQvcGxhaW6Sr1QycHJlcF9kdXJhdGlvbpKkMC4wNap0ZXh0L3BsYWlukrFGYXRTYXRfZmxpcF9hbmdsZZKjMTgwqnRleHQvcGxhaW6SolJSkqMxLjCqdGV4dC9wbGFpbqR0eXBlqk5hbWVkVHVwbGWob2JqZWN0aWSwYTkwODBiNTM4MzFjYzg2ZaRtaW1l2SFhcHBsaWNhdGlvbi92bmQucGx1dG8udHJlZStvYmplY3Sscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/yB45IdGwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJGNiNjU5MTE4LTlmMjItNDNjMy04MDFkLTQ5MjQxZGVlNGRmNrlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgABLta1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQ4ZGMxMTE3NS1lYmM4LTQwN2EtYWIwYi02ZDU0M2Y4NDlhNzKKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52Uo8ZGl2IGNsYXNzPSJtYXJrZG93biI+PHA+QXV4IGZ1bmN0aW9ucyAmIzQwO3Nob3cvaGlkZSBjb2RlJiM0MTs8L3A+CjwvZGl2PqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b/IK+k2drBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkOGRjMTExNzUtZWJjOC00MDdhLWFiMGItNmQ1NDNmODQ5YTcyuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOACt10LVwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJGY3MzA4MmZmLWE2ZDMtNDFmOC04Nzk2LTQxMTRmYTg5ZDJiYoqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnaaokJPHNjcmlwdCBpZD0ncGxvdF8xJz4KCQkvLyBXZSBzdGFydCBieSBwdXR0aW5nIGFsbCB0aGUgdmFyaWFibGUgaW50ZXJwb2xhdGlvbiBoZXJlIGF0IHRoZSBiZWdpbm5pbmcKCQkvLyBXZSBoYXZlIHRvIGNvbnZlcnQgYWxsIHR5cGVkYXJyYXlzIGluIHRoZSBsYXlvdXQgdG8gbm9ybWFsIGFycmF5cy4gU2VlIElzc3VlICMyNQoJCS8vIFdlIHVzZSBsb2Rhc2ggZm9yIHRoaXMgZm9yIGNvbXBhY3RuZXNzCgkJZnVuY3Rpb24gcmVtb3ZlVHlwZWRBcnJheShvKSB7CgkJCXJldHVybiBfLmlzVHlwZWRBcnJheShvKSA/IEFycmF5LmZyb20obykgOgoJCQlfLmlzUGxhaW5PYmplY3QobykgPyBfLm1hcFZhbHVlcyhvLCByZW1vdmVUeXBlZEFycmF5KSA6IAoJCQlvCgkJfQoKCQkvLyBQdWJsaXNoIHRoZSBwbG90IG9iamVjdCB0byBKUwoJCWxldCBwbG90X29iaiA9IF8udXBkYXRlKC8qIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgQWJzdHJhY3RQbHV0b0RpbmdldGplcy5EaXNwbGF5LnB1Ymxpc2hlZF90b19qcyAqLyBnZXRQdWJsaXNoZWRPYmplY3QoImVkMjdkZTFhLTgxZDktMTFlZi0zYjczLTFiMTE2MzEyZGFlNy9hMmY3NGIyOGNmOTk0OTZmIiksICJsYXlvdXQiLCByZW1vdmVUeXBlZEFycmF5KQoJCS8vIEdldCB0aGUgcGxvdGx5IGxpc3RlbmVycwoJCWNvbnN0IHBsb3RseV9saXN0ZW5lcnMgPSB7fQoJCS8vIEdldCB0aGUgSlMgbGlzdGVuZXJzCgkJY29uc3QganNfbGlzdGVuZXJzID0ge30KCQkvLyBEZWFsIHdpdGggZXZlbnR1YWwgY3VzdG9tIGNsYXNzZXMKCQlsZXQgY3VzdG9tX2NsYXNzbGlzdCA9IFtdCgoKCQkvLyBMb2FkIHRoZSBwbG90bHkgbGlicmFyeQoJCWxldCBQbG90bHkgPSB1bmRlZmluZWQKCQl0cnkgewoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiLi9wbG90bHlqcy9wbG90bHlqcy0yLjI2LjIubWluLmpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfSBjYXRjaCAoZSkgewoJCQljb25zb2xlLmxvZygiTG9jYWwgbG9hZCBmYWlsZWQsIHRyeWluZyB3aXRoIHRoZSB3ZWIgZXNtLnNoIHZlcnNpb24iKQoJCQlsZXQgX21vZCA9IGF3YWl0IGltcG9ydCgiaHR0cHM6Ly9lc20uc2gvdjEzNS9wbG90bHkuanMtZGlzdC1taW5AMi4yNi4yL2VzbmV4dC9wbG90bHkuanMtZGlzdC1taW4ubWpzIikKCQkJUGxvdGx5ID0gX21vZC5kZWZhdWx0CgkJfQoKCQkvLyBDaGVjayBpZiB3ZSBoYXZlIHRvIGZvcmNlIGxvY2FsIG1hdGhqYXggZm9udCBjYWNoZQoJCWlmIChmYWxzZSAmJiB3aW5kb3c/Lk1hdGhKYXg/LmNvbmZpZz8uc3ZnPy5mb250Q2FjaGUgPT09ICdnbG9iYWwnKSB7CgkJCXdpbmRvdy5NYXRoSmF4LmNvbmZpZy5zdmcuZm9udENhY2hlID0gJ2xvY2FsJwoJCX0KCgkJLy8gRmxhZyB0byBjaGVjayBpZiB0aGlzIGNlbGwgd2FzICBtYW51YWxseSByYW4gb3IgcmVhY3RpdmVseSByYW4KY29uc3QgZmlyc3RSdW4gPSB0aGlzID8gZmFsc2UgOiB0cnVlCmNvbnN0IENPTlRBSU5FUiA9IHRoaXMgPz8gaHRtbGA8ZGl2IGNsYXNzPSdwbHV0b3Bsb3RseS1jb250YWluZXInPmAKY29uc3QgUExPVCA9IENPTlRBSU5FUi5xdWVyeVNlbGVjdG9yKCcuanMtcGxvdGx5LXBsb3QnKSA/PyBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2PmApCmNvbnN0IHBhcmVudCA9IENPTlRBSU5FUi5wYXJlbnRFbGVtZW50Ci8vIFdlIHVzZSBhIGNvbnRyb2xsZXIgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVycyB1cG9uIGludmFsaWRhdGlvbgpjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpCi8vIFdlIGhhdmUgdG8gYWRkIHRoaXMgdG8ga2VlcCBzdXBwb3J0aW5nIEBiaW5kIHdpdGggdGhlIG9sZCBBUEkgdXNpbmcgUExPVApQTE9ULmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGUpID0+IHsKCUNPTlRBSU5FUi52YWx1ZSA9IFBMT1QudmFsdWUKCWlmIChlLmJ1YmJsZXMpIHsKCQlyZXR1cm4KCX0KCUNPTlRBSU5FUi5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnaW5wdXQnKSkKfSwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pCgoJLy8gVGhpcyBjcmVhdGUgdGhlIHN0eWxlIHN1YmRpdiBvbiBmaXJzdCBydW4KCWZpcnN0UnVuICYmIENPTlRBSU5FUi5hcHBlbmRDaGlsZChodG1sYAoJPHN0eWxlPgoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciB7CgkJd2lkdGg6IDEwMCU7CgkJaGVpZ2h0OiAxMDAlOwoJCW1pbi1oZWlnaHQ6IDA7CgkJbWluLXdpZHRoOiAwOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lciAuanMtcGxvdGx5LXBsb3QgLnBsb3RseSBkaXYgewoJCW1hcmdpbjogMCBhdXRvOyAvLyBUaGlzIGNlbnRlcnMgdGhlIHBsb3QKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIucG9wcGVkLW91dCB7CgkJb3ZlcmZsb3c6IGF1dG87CgkJei1pbmRleDogMTAwMDsKCQlwb3NpdGlvbjogZml4ZWQ7CgkJcmVzaXplOiBib3RoOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMHB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwcHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciB7CgkJZGlzcGxheTogZmxleDsKCQlmbGV4LWZsb3c6IHJvdyB3cmFwOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDEycHg7CgkJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDEycHg7CgkJcG9zaXRpb246IGZpeGVkOwoJCXotaW5kZXg6IDEwMDE7CgkJY3Vyc29yOiBtb3ZlOwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgLTEwMCUpOwoJCXBhZGRpbmc6IDVweDsKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIHNwYW4gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQlmbGV4OiAxCgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlci5oaWRkZW4gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuY2xpcGJvYXJkLXNwYW4gewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCX0KCS5jbGlwYm9hcmQtdmFsdWUgewoJCXBhZGRpbmctcmlnaHQ6IDVweDsKCQlwYWRkaW5nLWxlZnQ6IDJweDsKCQljdXJzb3I6IHRleHQ7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlmbGV4OiAwIDAgMTAwJTsKCQl0ZXh0LWFsaWduOiBjZW50ZXI7CgkJYm9yZGVyLXRvcDogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCW1hcmdpbi10b3A6IDVweDsKCQlkaXNwbGF5OiBub25lOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5maWxlc2F2ZSAuY2xpcGJvYXJkLXNwYW4uZmlsZW5hbWUgewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5jbGlwYm9hcmQtdmFsdWUuZmlsZW5hbWUgewoJCW1hcmdpbi1sZWZ0OiAzcHg7CgkJdGV4dC1hbGlnbjogbGVmdDsKCQltaW4td2lkdGg6IG1pbig2MCUsIG1pbi1jb250ZW50KTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogaW5saW5lLWZsZXg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IC5sYWJlbCB7CgkJZmxleDogMCAwIDA7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZvcm1hdCB7CgkJcG9zaXRpb246IHJlbGF0aXZlOwoJCWZsZXg6IDEgMCBhdXRvOwoJCW1pbi13aWR0aDogMzBweDsKCQltYXJnaW4tcmlnaHQ6IDEwcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJCWZsZXgtZmxvdzogY29sdW1uOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXBhZGRpbmctbGVmdDogM3B4OwoJCXotaW5kZXg6IDIwMDA7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgewoJCWN1cnNvcjogcG9pbnRlcjsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlwYWRkaW5nOiAzcHg7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTNweCwgLTZweCk7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IG5vbmU7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnM6aG92ZXIgLmZvcm1hdC1vcHRpb24gewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5mb3JtYXQtb3B0aW9uOm5vdCguc2VsZWN0ZWQpIHsKCQltYXJnaW4tdG9wOiAzcHg7Cgl9CglkaXYuZm9ybWF0LW9wdGlvbnMgLmZvcm1hdC1vcHRpb24uc2VsZWN0ZWQgewoJCW9yZGVyOiAtMTsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpob3ZlciB7CgkJYmFja2dyb3VuZC1jb2xvcjogdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7Cgl9CglzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZm9udC13ZWlnaHQ6IG5vcm1hbDsKCQljb2xvcjogdmFyKC0tcGx1dG8tb3V0cHV0LWNvbG9yKTsKCQlkaXNwbGF5OiBub25lOwoJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgY2FsYygtMTAwJSAtIDEwcHgpKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkubGFiZWwgewoJCXVzZXItc2VsZWN0OiBub25lOwoJfQoJLmxhYmVsOmhvdmVyIHNwYW4uY29uZmlnLXZhbHVlIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJbWluLXdpZHRoOiAxNTBweDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5tYXRjaGluZy1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tbWFjcm8tY29sb3IpOwoJCWZvbnQtd2VpZ2h0OiBib2xkOwoJfQoJLmNsaXBib2FyZC1zcGFuLmRpZmZlcmVudC1jb25maWcgLmxhYmVsIHsKCQljb2xvcjogdmFyKC0tY20tdGFnLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KPC9zdHlsZT4KYCkKCmxldCBvcmlnaW5hbF9oZWlnaHQgPSBwbG90X29iai5sYXlvdXQuaGVpZ2h0CmxldCBvcmlnaW5hbF93aWR0aCA9IHBsb3Rfb2JqLmxheW91dC53aWR0aAovLyBGb3IgdGhlIGhlaWdodCB3ZSBoYXZlIHRvIGFsc28gcHV0IGEgZml4ZWQgdmFsdWUgaW4gY2FzZSB0aGUgcGxvdCBpcyBwdXQgb24gYSBub24tZml4ZWQtc2l6ZSBjb250YWluZXIgKGxpa2UgdGhlIGRlZmF1bHQgd3JhcHBlcikKLy8gV2UgZGVmaW5lIGEgdmFyaWFibGUgdG8gY2hlY2sgd2hldGhlciB3ZSBzdGlsbCBoYXZlIHRvIHJlbW92ZSB0aGUgZml4ZWQgaGVpZ2h0CmxldCByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmaXJzdFJ1bgpsZXQgY29udGFpbmVyX2hlaWdodCA9IG9yaWdpbmFsX2hlaWdodCA/PyBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPz8gNDAwCkNPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfaGVpZ2h0ICsgJ3B4JwoKLy8gV2UgY3JlYXRlIGEgUHJvbWlzZSB2ZXJzaW9uIG9mIHNldFRpbWVvdXQKZnVuY3Rpb24gZGVsYXkobXMpIHsKICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTsKfQoKLy8gV2UgaW1wb3J0IGludGVyYWN0IGZvciBkcmFnZ2luZy9yZXNpemluZwpjb25zdCB7IGRlZmF1bHQ6IGludGVyYWN0IH0gPSBhd2FpdCBpbXBvcnQoJ2h0dHBzOi8vZXNtLnNoL2ludGVyYWN0anNAMS4xMC4xOScpCgoKZnVuY3Rpb24gZ2V0SW1hZ2VPcHRpb25zKCkgewogIGNvbnN0IG8gPSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPz8ge307CiAgcmV0dXJuIHsKICAgIGZvcm1hdDogby5mb3JtYXQgPz8gInBuZyIsCiAgICB3aWR0aDogby53aWR0aCA/PyBvcmlnaW5hbF93aWR0aCwKICAgIGhlaWdodDogby5oZWlnaHQgPz8gb3JpZ2luYWxfaGVpZ2h0LAogICAgc2NhbGU6IG8uc2NhbGUgPz8gMSwKICAgIGZpbGVuYW1lOiBvLmZpbGVuYW1lID8/ICJuZXdwbG90IiwKICB9Owp9Cgpjb25zdCBDTElQQk9BUkRfSEVBREVSID0KICBDT05UQUlORVIucXVlcnlTZWxlY3RvcigiLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIiKSA/PwogIENPTlRBSU5FUi5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAiYWZ0ZXJiZWdpbiIsCiAgICBodG1sYDxkaXYgY2xhc3M9InBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgaGlkZGVuIj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZvcm1hdCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5Gb3JtYXQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZm9ybWF0Ij48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHdpZHRoIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPldpZHRoOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIHdpZHRoIj48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gaGVpZ2h0IgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkhlaWdodDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBoZWlnaHQiPjwvc3Bhbj5weDwvc3BhbgogICAgICA+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzY2FsZSIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5TY2FsZTo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBzY2FsZSI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHNldCI+U2V0PC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHVuc2V0Ij5VbnNldDwvYnV0dG9uPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gZmlsZW5hbWUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+RmlsZW5hbWU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgZmlsZW5hbWUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgPC9kaXY+YAogICk7CgpmdW5jdGlvbiBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKSB7CiAgY29uc3QgdmFsaWRfY2xhc3NlcyA9IFsKICAgICJtaXNzaW5nLWNvbmZpZyIsCiAgICAibWF0Y2hpbmctY29uZmlnIiwKICAgICJkaWZmZXJlbnQtY29uZmlnIiwKICBdOwogIGZ1bmN0aW9uIHNldENsYXNzKGNsKSB7CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgdmFsaWRfY2xhc3NlcykgewogICAgICBjb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZShuYW1lLCBuYW1lID09IGNsKTsKICAgIH0KICB9CiAgLy8gV2UgdXNlIHRoZSBjdXN0b20gZ2V0dGVycyB3ZSdsbCBzZXQgdXAgaW4gdGhlIGNvbnRhaW5lcgogIGNvbnN0IHsgdWlfdmFsdWUsIGNvbmZpZ192YWx1ZSwgY29uZmlnX3NwYW4sIGtleSB9ID0gY29udGFpbmVyOwogIGlmIChjb25maWdfdmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgc2V0Q2xhc3MoIm1pc3NpbmctY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGlzIG5vdCBwcmVzZW50IGluIHRoZSBjb25maWcuYDsKICB9IGVsc2UgaWYgKHVpX3ZhbHVlID09IGNvbmZpZ192YWx1ZSkgewogICAgc2V0Q2xhc3MoIm1hdGNoaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgdGhlIHNhbWUgdmFsdWUgaW4gdGhlIGNvbmZpZyBhbmQgaW4gdGhlIGhlYWRlci5gOwogIH0gZWxzZSB7CiAgICBzZXRDbGFzcygiZGlmZmVyZW50LWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBoYXMgYSBkaWZmZXJlbnQgdmFsdWUgKDxlbT4ke2NvbmZpZ192YWx1ZX08L2VtPikgaW4gdGhlIGNvbmZpZy5gOwogIH0KICAvLyBBZGQgaW5mbyBhYm91dCBzZXR0aW5nIGFuZCB1bnNldHRpbmcKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgb24gdGhlIGxhYmVsIDxlbT48Yj5vbmNlPC9iPjwvZW0+IHRvIHNldCB0aGUgY3VycmVudCBVSSB2YWx1ZSBpbiB0aGUgY29uZmlnLmAKICApOwogIGNvbmZpZ19zcGFuLmluc2VydEFkamFjZW50SFRNTCgKICAgICJiZWZvcmVlbmQiLAogICAgYDxicj5DbGljayA8ZW0+PGI+dHdpY2U8L2I+PC9lbT4gdG8gcmVtb3ZlIHRoaXMga2V5IGZyb20gdGhlIGNvbmZpZy5gCiAgKTsKfQoKY29uc3QgdmFsaWRfZm9ybWF0cyA9IFsicG5nIiwgInN2ZyIsICJ3ZWJwIiwgImpwZWciLCAiZnVsbC1qc29uIl07CmZ1bmN0aW9uIGluaXRpYWxpemVVSVZhbHVlU3BhbihzcGFuLCBrZXksIHZhbHVlKSB7CiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9IGtleSA9PT0gImZvcm1hdCIgPyAiZmFsc2UiIDogInRydWUiOwogIGxldCBwYXJzZSA9ICh4KSA9PiB4OwogIGxldCB1cGRhdGUgPSAoeCkgPT4gKHNwYW4udGV4dENvbnRlbnQgPSB4KTsKICBpZiAoa2V5ID09PSAid2lkdGgiIHx8IGtleSA9PT0gImhlaWdodCIpIHsKICAgIHBhcnNlID0gKHgpID0+IE1hdGgucm91bmQocGFyc2VGbG9hdCh4KSk7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJzY2FsZSIpIHsKICAgIHBhcnNlID0gcGFyc2VGbG9hdDsKICB9IGVsc2UgaWYgKGtleSA9PT0gImZvcm1hdCIpIHsKICAgIC8vIFdlIHJlbW92ZSBjb250ZW50RWRpdGFibGUKICAgIHNwYW4uY29udGVudEVkaXRhYmxlID0gImZhbHNlIjsKICAgIC8vIEhlcmUgd2UgZmlyc3QgYWRkIHRoZSBzdWJzcGFucyBmb3IgZWFjaCBvcHRpb24KICAgIGNvbnN0IG9wdHNfZGl2ID0gc3Bhbi5hcHBlbmRDaGlsZChodG1sYDxkaXYgY2xhc3M9ImZvcm1hdC1vcHRpb25zIj48L2Rpdj5gKTsKICAgIGZvciAoY29uc3QgZm10IG9mIHZhbGlkX2Zvcm1hdHMpIHsKICAgICAgY29uc3Qgb3B0ID0gb3B0c19kaXYuYXBwZW5kQ2hpbGQoCiAgICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iZm9ybWF0LW9wdGlvbiAke2ZtdH0iPiR7Zm10fTwvc3Bhbj5gCiAgICAgICk7CiAgICAgIG9wdC5vbmNsaWNrID0gKGUpID0+IHsKICAgICAgICBzcGFuLnZhbHVlID0gb3B0LnRleHRDb250ZW50OwogICAgICB9OwogICAgfQogICAgcGFyc2UgPSAoeCkgPT4gewogICAgICByZXR1cm4gdmFsaWRfZm9ybWF0cy5pbmNsdWRlcyh4KSA/IHggOiBsb2NhbFZhbHVlOwogICAgfTsKICAgIHVwZGF0ZSA9ICh4KSA9PiB7CiAgICAgIGZvciAoY29uc3Qgb3B0IG9mIG9wdHNfZGl2LmNoaWxkcmVuKSB7CiAgICAgICAgb3B0LmNsYXNzTGlzdC50b2dnbGUoInNlbGVjdGVkIiwgb3B0LnRleHRDb250ZW50ID09PSB4KTsKICAgICAgfQogICAgfTsKICB9IGVsc2UgewogICAgLy8gV2Ugb25seSBoYXZlIGZpbGVuYW1lIGhlcmUKICB9CiAgbGV0IGxvY2FsVmFsdWU7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwYW4sICJ2YWx1ZSIsIHsKICAgIGdldDogKCkgPT4gewogICAgICByZXR1cm4gbG9jYWxWYWx1ZTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgaWYgKHZhbCAhPT0gIiIpIHsKICAgICAgICBsb2NhbFZhbHVlID0gcGFyc2UodmFsKTsKICAgICAgfQogICAgICB1cGRhdGUobG9jYWxWYWx1ZSk7CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKICAvLyBXZSBhbHNvIGFzc2lnbiBhIGxpc3RlbmVyIHNvIHRoYXQgdGhlIGVkaXRhYmxlIGlzIGJsdXJyZWQgd2hlbiBlbnRlciBpcyBwcmVzc2VkCiAgc3Bhbi5vbmtleWRvd24gPSAoZSkgPT4gewogICAgaWYgKGUua2V5Q29kZSA9PT0gMTMpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBzcGFuLmJsdXIoKTsKICAgIH0KICB9OwogIHNwYW4udmFsdWUgPSB2YWx1ZTsKfQoKZnVuY3Rpb24gaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3BhbihzcGFuLCBrZXkpIHsKICAvLyBIZXJlIHdlIG1vc3RseSB3YW50IHRvIGRlZmluZSB0aGUgc2V0dGVyIGFuZCBnZXR0ZXIKICBjb25zdCBjb250YWluZXIgPSBzcGFuLmNsb3Nlc3QoIi5jbGlwYm9hcmQtc3BhbiIpOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgfSwKICAgIHNldDogKHZhbCkgPT4gewogICAgICAvLyBpZiB1bmRlZmluZWQgaXMgcGFzc2VkLCB3ZSByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIG9wdGlvbnMKICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZGVsZXRlIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldOwogICAgICB9IGVsc2UgewogICAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9uc1trZXldID0gdmFsOwogICAgICB9CiAgICAgIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpOwogICAgfSwKICB9KTsKfQoKY29uc3QgY29uZmlnX3NwYW5zID0ge307CmZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGdldEltYWdlT3B0aW9ucygpKSkgewogIGNvbnN0IGNvbnRhaW5lciA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcihgLmNsaXBib2FyZC1zcGFuLiR7a2V5fWApOwogIGNvbnN0IGxhYmVsID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5sYWJlbCIpOwogIC8vIFdlIGdpdmUgdGhlIGxhYmVsIGEgZnVuY3Rpb24gdGhhdCBvbiBzaW5nbGUgY2xpY2sgd2lsbCBzZXQgdGhlIGN1cnJlbnQgdmFsdWUgYW5kIHdpdGggZG91YmxlIGNsaWNrIHdpbGwgdW5zZXQgaXQKICBsYWJlbC5vbmNsaWNrID0gRHVhbENsaWNrKAogICAgKCkgPT4gewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfSwKICAgIChlKSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJlIiwgZSk7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IHVuZGVmaW5lZDsKICAgIH0KICApOwogIGNvbnN0IHVpX3ZhbHVlX3NwYW4gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC12YWx1ZSIpOwogIGNvbnN0IGNvbmZpZ192YWx1ZV9zcGFuID0KICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuY29uZmlnLXZhbHVlIikgPz8KICAgIGxhYmVsLmluc2VydEFkamFjZW50RWxlbWVudCgKICAgICAgImFmdGVyYmVnaW4iLAogICAgICBodG1sYDxzcGFuIGNsYXNzPSJjb25maWctdmFsdWUiPjwvc3Bhbj5gCiAgICApOwogIC8vIEFzc2luZyB0aGUgdHdvIHNwYW5zIGFzIHByb3BlcnRpZXMgb2YgdGhlIGNvbnRhaW5pbmcgc3BhbgogIGNvbnRhaW5lci51aV9zcGFuID0gdWlfdmFsdWVfc3BhbjsKICBjb250YWluZXIuY29uZmlnX3NwYW4gPSBjb25maWdfdmFsdWVfc3BhbjsKICBjb250YWluZXIua2V5ID0ga2V5OwogIGNvbmZpZ19zcGFuc1trZXldID0gY29udGFpbmVyOwogIGlmIChmaXJzdFJ1bikgewogICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID0KICAgICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogICAgLy8gV2UgZG8gdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSB2YWx1ZSBzcGFuCiAgICBpbml0aWFsaXplVUlWYWx1ZVNwYW4odWlfdmFsdWVfc3Bhbiwga2V5LCB2YWx1ZSk7CiAgICAvLyBUaGVuIHdlIGluaXRpYWxpemUgdGhlIGNvbmZpZyB2YWx1ZQogICAgaW5pdGlhbGl6ZUNvbmZpZ1ZhbHVlU3Bhbihjb25maWdfdmFsdWVfc3Bhbiwga2V5KTsKICAgIC8vIFdlIHB1dCBzb21lIGNvbnZlbmllbmNlIGdldHRlcnMvc2V0dGVycwogICAgLy8gdWlfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgInVpX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IHVpX3ZhbHVlX3NwYW4udmFsdWUsCiAgICAgIHNldDogKHZhbCkgPT4gewogICAgICAgIHVpX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICAgIC8vIGNvbmZpZ192YWx1ZSBmb3J3YXJkCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAiY29uZmlnX3ZhbHVlIiwgewogICAgICBnZXQ6ICgpID0+IGNvbmZpZ192YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSA9IHZhbDsKICAgICAgfSwKICAgIH0pOwogIH0KfQoKLy8gVGhlc2Ugb2JqZWN0cyB3aWxsIGNvbnRhaW4gdGhlIGRlZmF1bHQgdmFsdWUKCi8vIFRoaXMgY29kZSB1cGRhdGVzIHRoZSBpbWFnZSBvcHRpb25zIGluIHRoZSBQTE9UIGNvbmZpZyB3aXRoIHRoZSBwcm92aWRlZCBvbmVzCmZ1bmN0aW9uIHNldEltYWdlT3B0aW9ucyhvKSB7CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBvW2tleV07CiAgfQp9CmZ1bmN0aW9uIHVuc2V0SW1hZ2VPcHRpb25zKCkgewogIHNldEltYWdlT3B0aW9ucyh7fSk7Cn0KCmNvbnN0IHNldF9idXR0b24gPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtc3Bhbi5zZXQiKTsKY29uc3QgdW5zZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4udW5zZXQiKTsKaWYgKGZpcnN0UnVuKSB7CiAgc2V0X2J1dHRvbi5vbmNsaWNrID0gKGUpID0+IHsKICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gY29udGFpbmVyLnVpX3ZhbHVlOwogICAgfQogIH07CiAgdW5zZXRfYnV0dG9uLm9uY2xpY2sgPSB1bnNldEltYWdlT3B0aW9uczsKfQoKLy8gV2UgYWRkIGEgZnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIGNsaXBib2FyZCBpcyBwb3BwZWQgb3V0CkNPTlRBSU5FUi5pc1BvcHBlZE91dCA9ICgpID0+IHsKICByZXR1cm4gQ09OVEFJTkVSLmNsYXNzTGlzdC5jb250YWlucygicG9wcGVkLW91dCIpOwp9OwoKQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNlZG93biA9IGZ1bmN0aW9uIChldmVudCkgewogIGlmIChldmVudC50YXJnZXQubWF0Y2hlcygic3Bhbi5jbGlwYm9hcmQtdmFsdWUiKSkgewogICAgY29uc29sZS5sb2coIldlIGRvbid0IG1vdmUhIik7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IHN0YXJ0ID0gewogICAgbGVmdDogcGFyc2VGbG9hdChDT05UQUlORVIuc3R5bGUubGVmdCksCiAgICB0b3A6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLnRvcCksCiAgICBYOiBldmVudC5wYWdlWCwKICAgIFk6IGV2ZW50LnBhZ2VZLAogIH07CiAgZnVuY3Rpb24gbW92ZUF0KGV2ZW50LCBzdGFydCkgewogICAgY29uc3QgdG9wID0gZXZlbnQucGFnZVkgLSBzdGFydC5ZICsgc3RhcnQudG9wICsgInB4IjsKICAgIGNvbnN0IGxlZnQgPSBldmVudC5wYWdlWCAtIHN0YXJ0LlggKyBzdGFydC5sZWZ0ICsgInB4IjsKICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUubGVmdCA9IGxlZnQ7CiAgICBDT05UQUlORVIuc3R5bGUudG9wID0gdG9wOwogIH0KCiAgLy8gbW92ZSBvdXIgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGJhbGwgdW5kZXIgdGhlIHBvaW50ZXIKICBtb3ZlQXQoZXZlbnQsIHN0YXJ0KTsKICBmdW5jdGlvbiBvbk1vdXNlTW92ZShldmVudCkgewogICAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgfQoKICAvLyBXZSB1c2UgdGhpcyB0byByZW1vdmUgdGhlIG1vdXNlbW92ZSB3aGVuIGNsaWNraW5nIG91dHNpZGUgb2YgdGhlIGNvbnRhaW5lcgogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CgogIC8vIG1vdmUgdGhlIGNvbnRhaW5lciBvbiBtb3VzZW1vdmUKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCBvbk1vdXNlTW92ZSwgewogICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCwKICB9KTsKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICBjbGVhblVwKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKCiAgZnVuY3Rpb24gY2xlYW5VcCgpIHsKICAgIGNvbnNvbGUubG9nKCJjbGVhbmluZyB1cCB0aGUgcGxvdCBtb3ZlIGxpc3RlbmVyIik7CiAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICBDTElQQk9BUkRfSEVBREVSLm9ubW91c2V1cCA9IG51bGw7CiAgfQoKICAvLyAoMykgZHJvcCB0aGUgYmFsbCwgcmVtb3ZlIHVubmVlZGVkIGhhbmRsZXJzCiAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBjbGVhblVwOwp9OwoKZnVuY3Rpb24gc2VuZFRvQ2xpcGJvYXJkKGJsb2IpIHsKICBpZiAoIW5hdmlnYXRvci5jbGlwYm9hcmQpIHsKICAgIGFsZXJ0KAogICAgICAiVGhlIENsaXBib2FyZCBBUEkgZG9lcyBub3Qgc2VlbSB0byBiZSBhdmFpbGFibGUsIG1ha2Ugc3VyZSB0aGUgUGx1dG8gbm90ZWJvb2sgaXMgYmVpbmcgdXNlZCBmcm9tIGVpdGhlciBsb2NhbGhvc3Qgb3IgYW4gaHR0cHMgc291cmNlLiIKICAgICk7CiAgfQogIG5hdmlnYXRvci5jbGlwYm9hcmQKICAgIC53cml0ZShbCiAgICAgIG5ldyBDbGlwYm9hcmRJdGVtKHsKICAgICAgICAvLyBUaGUga2V5IGlzIGRldGVybWluZWQgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIGJsb2IncyB0eXBlLgogICAgICAgIFtibG9iLnR5cGVdOiBibG9iLAogICAgICB9KSwKICAgIF0pCiAgICAudGhlbigKICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgIGNvbnNvbGUubG9nKCJBc3luYzogQ29weWluZyB0byBjbGlwYm9hcmQgd2FzIHN1Y2Nlc3NmdWwhIik7CiAgICAgIH0sCiAgICAgIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJBc3luYzogQ291bGQgbm90IGNvcHkgdGV4dDogIiwgZXJyKTsKICAgICAgfQogICAgKTsKfQoKZnVuY3Rpb24gY29weUltYWdlVG9DbGlwYm9hcmQoKSB7CiAgLy8gV2UgZXh0cmFjdCB0aGUgaW1hZ2Ugb3B0aW9ucyBmcm9tIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzIChpZiB0aGV5IGV4aXN0KQogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuIFdlIGFsc28gaWdub3JlIGZvcm1hdCBiZWNhdXNlIHRoZSBjbGlwYm9hcmQgb25seSBzdXBwb3J0cyBwbmcuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwga2V5ID09PSAiZm9ybWF0IikgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbmZpZ1trZXldID0gdmFsOwogIH0KICBQbG90bHkudG9JbWFnZShQTE9ULCBjb25maWcpLnRoZW4oZnVuY3Rpb24gKGRhdGFVcmwpIHsKICAgIGZldGNoKGRhdGFVcmwpCiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5ibG9iKCkpCiAgICAgIC50aGVuKChibG9iKSA9PiB7CiAgICAgICAgY29uc3QgcGFzdGVfcmVjZWl2ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdwYXN0ZS1yZWNlaXZlci5wbHV0b3Bsb3RseScpCiAgICAgICAgaWYgKHBhc3RlX3JlY2VpdmVyKSB7CiAgICAgICAgICBwYXN0ZV9yZWNlaXZlci5hdHRhY2hJbWFnZShkYXRhVXJsLCBDT05UQUlORVIpCiAgICAgICAgfQogICAgICAgIHNlbmRUb0NsaXBib2FyZChibG9iKQogICAgICB9KTsKICB9KTsKfQoKZnVuY3Rpb24gc2F2ZUltYWdlVG9GaWxlKCkgewogIGNvbnN0IGNvbmZpZyA9IHt9OwogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBsZXQgdmFsID0KICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA/PwogICAgICAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyBjb250YWluZXIudWlfdmFsdWUgOiB1bmRlZmluZWQpOwogICAgLy8gSWYgd2UgaGF2ZSB1bmRlZmluZWQgd2UgZG9uJ3QgY3JlYXRlIHRoZSBrZXkuCiAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LmRvd25sb2FkSW1hZ2UoUExPVCwgY29uZmlnKTsKfQoKbGV0IGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwLCB0b3A6IDAsIGxlZnQ6IDAgfTsKZnVuY3Rpb24gdW5wb3BfY29udGFpbmVyKGNsKSB7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCBmYWxzZSk7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoY2wsIGZhbHNlKTsKICAvLyBXZSBmaXggdGhlIGhlaWdodCBiYWNrIHRvIHRoZSB2YWx1ZSBpdCBoYWQgYmVmb3JlIHBvcG91dCwgYWxzbyBzZXR0aW5nIHRoZSBmbGFnIHRvIHNpZ25hbCB0aGF0IHVwb24gZmlyc3QgcmVzaXplIHdlIHJlbW92ZSB0aGUgZml4ZWQgaW5saW5lLXN0eWxlCiAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9IGNvbnRhaW5lcl9yZWN0LmhlaWdodCArICJweCI7CiAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gdHJ1ZTsKICAvLyBXZSBzZXQgdGhlIG90aGVyIGZpeGVkIGlubGluZS1zdHlsZXMgdG8gbnVsbAogIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogIENPTlRBSU5FUi5zdHlsZS50b3AgPSAiIjsKICBDT05UQUlORVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIFdlIGFsc28gcmVtb3ZlIHRoZSBDTElQQk9BUkRfSEVBREVSCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9ICIiOwogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9ICIiOwogIC8vIEZpbmFsbHkgd2UgcmVtb3ZlIHRoZSBoaWRkZW4gY2xhc3MgdG8gdGhlIGhlYWRlcgogIENMSVBCT0FSRF9IRUFERVIuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgdHJ1ZSk7CiAgcmV0dXJuOwp9CmZ1bmN0aW9uIHBvcG91dF9jb250YWluZXIob3B0cykgewogIGNvbnN0IGNsID0gb3B0cz8uY2w7CiAgY29uc3QgdGFyZ2V0X2NvbnRhaW5lcl9zaXplID0gb3B0cz8udGFyZ2V0X2NvbnRhaW5lcl9zaXplID8/IHt9OwogIGNvbnN0IHRhcmdldF9wbG90X3NpemUgPSBvcHRzPy50YXJnZXRfcGxvdF9zaXplID8/IHt9OwogIGlmIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgcmV0dXJuIHVucG9wX2NvbnRhaW5lcihjbCk7CiAgfQogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBjbCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0cnVlKTsKICAvLyBXZSBleHRyYWN0IHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNvbnRhaW5lciwgc2F2ZSB0aGVtIGFuZCBmaXggdGhlbQogIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH0gPSBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgY29udGFpbmVyX3JlY3QgPSB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9OwogIC8vIFdlIHNhdmUgdGhlIGN1cnJlbnQgcGxvdCBzaXplIGJlZm9yZSB3ZSBwb3AgYXMgaXQgd2lsbCBmaWxsIHRoZSBzY3JlZW4KICBjb25zdCBjdXJyZW50X3Bsb3Rfc2l6ZSA9IHsKICAgIHdpZHRoOiBQTE9ULl9mdWxsTGF5b3V0LndpZHRoLAogICAgaGVpZ2h0OiBQTE9ULl9mdWxsTGF5b3V0LmhlaWdodCwKICB9OwogIC8vIFdlIGhhdmUgdG8gc2F2ZSB0aGUgcGFkIGRhdGEgYmVmb3JlIHBvcHBpbmcgc28gd2UgY2FuIHJlc2l6ZSBwcmVjaXNlbHkKICBjb25zdCBwYWQgPSB7fTsKICBwYWQudW5wb3BwZWQgPSBnZXRTaXplRGF0YSgpLmNvbnRhaW5lcl9wYWQ7CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoInBvcHBlZC1vdXQiLCB0cnVlKTsKICBwYWQucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIC8vIFdlIGRvIHRvcCBhbmQgbGVmdCBiYXNlZCBvbiB0aGUgY3VycmVudCByZWN0CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ0b3AiLCAibGVmdCJdKSB7CiAgICBjb25zdCBzdGFydF92YWwgPSB0YXJnZXRfY29udGFpbmVyX3NpemVba2V5XSA/PyBjb250YWluZXJfcmVjdFtrZXldOwogICAgbGV0IG9mZnNldCA9IDA7CiAgICBmb3IgKGNvbnN0IGtpbmQgb2YgWyJwYWRkaW5nIiwgImJvcmRlciJdKSB7CiAgICAgIG9mZnNldCArPSBwYWQucG9wcGVkW2tpbmRdW2tleV0gLSBwYWQudW5wb3BwZWRba2luZF1ba2V5XTsKICAgIH0KICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gc3RhcnRfdmFsIC0gb2Zmc2V0ICsgInB4IjsKICAgIGlmIChrZXkgPT09ICJsZWZ0IikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgLy8gV2UgY29tcHV0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBkZXBlbmRpbmcgb24gZXZlbnR1YWwgY29uZmlnIGRhdGEKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7CiAgICB3aWR0aDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS53aWR0aCA/PwogICAgICBjb25maWdfc3BhbnMud2lkdGguY29uZmlnX3ZhbHVlID8/CiAgICAgIGN1cnJlbnRfcGxvdF9zaXplLndpZHRoLAogICAgaGVpZ2h0OgogICAgICB0YXJnZXRfcGxvdF9zaXplLmhlaWdodCA/PwogICAgICBjb25maWdfc3BhbnMuaGVpZ2h0LmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS5oZWlnaHQsCiAgfSk7CiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgY29uc3QgdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY3N6W2tleV07CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHZhbCArICJweCI7CiAgICBpZiAoa2V5ID09PSAid2lkdGgiKSB7CiAgICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGVba2V5XSA9IENPTlRBSU5FUi5zdHlsZVtrZXldOwogICAgfQogIH0KICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIGZhbHNlKTsKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgIm1vdXNlZG93biIsCiAgICAoZSkgPT4gewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgiLnBsdXRvcGxvdGx5LWNvbnRhaW5lciIpICE9PSBDT05UQUlORVIpIHsKICAgICAgICB1bnBvcF9jb250YWluZXIoKTsKICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9LAogICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0KICApOwp9CgpDT05UQUlORVIucG9wT3V0ID0gcG9wb3V0X2NvbnRhaW5lcjsKCmZ1bmN0aW9uIER1YWxDbGljayhzaW5nbGVfZnVuYywgZGJsX2Z1bmMpIHsKICBsZXQgbmNsaWNrcyA9IDA7CiAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7CiAgICBuY2xpY2tzICs9IDE7CiAgICBpZiAobmNsaWNrcyA+IDEpIHsKICAgICAgZGJsX2Z1bmMoLi4uYXJncyk7CiAgICAgIG5jbGlja3MgPSAwOwogICAgfSBlbHNlIHsKICAgICAgZGVsYXkoMzAwKS50aGVuKCgpID0+IHsKICAgICAgICBpZiAobmNsaWNrcyA9PSAxKSB7CiAgICAgICAgICBzaW5nbGVfZnVuYyguLi5hcmdzKTsKICAgICAgICB9CiAgICAgICAgbmNsaWNrcyA9IDA7CiAgICAgIH0pOwogICAgfQogIH07Cn0KCi8vIFdlIHJlbW92ZSB0aGUgZGVmYXVsdCBkb3dubG9hZCBpbWFnZSBidXR0b24KcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9SZW1vdmUgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlLAogIFsidG9JbWFnZSJdCik7Ci8vIFdlIGFkZCB0aGUgY3VzdG9tIGJ1dHRvbiB0byB0aGUgbW9kZWJhcgpwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb0FkZCA9IF8udW5pb24oCiAgcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQsCiAgWwogICAgewogICAgICBuYW1lOiAiQ29weSBQTkcgdG8gQ2xpcGJvYXJkIiwKICAgICAgaWNvbjogewogICAgICAgIGhlaWdodDogNTIwLAogICAgICAgIHdpZHRoOiA1MjAsCiAgICAgICAgcGF0aDogIk0yODAgNjRoNDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRWNDQ4YzAgMzUuMy0yOC43IDY0LTY0IDY0SDY0Yy0zNS4zIDAtNjQtMjguNy02NC02NFYxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRoNDAgOS42QzEyMSAyNy41IDE1My4zIDAgMTkyIDBzNzEgMjcuNSA3OC40IDY0SDI4MHpNNjQgMTEyYy04LjggMC0xNiA3LjItMTYgMTZWNDQ4YzAgOC44IDcuMiAxNiAxNiAxNkgzMjBjOC44IDAgMTYtNy4yIDE2LTE2VjEyOGMwLTguOC03LjItMTYtMTYtMTZIMzA0djI0YzAgMTMuMy0xMC43IDI0LTI0IDI0SDE5MiAxMDRjLTEzLjMgMC0yNC0xMC43LTI0LTI0VjExMkg2NHptMTI4LThhMjQgMjQgMCAxIDAgMC00OCAyNCAyNCAwIDEgMCAwIDQ4eiIsCiAgICAgIH0sCiAgICAgIGRpcmVjdGlvbjogInVwIiwKICAgICAgY2xpY2s6IER1YWxDbGljayhjb3B5SW1hZ2VUb0NsaXBib2FyZCwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoKTsKICAgICAgfSksCiAgICB9LAogICAgewogICAgICBuYW1lOiAiRG93bmxvYWQgSW1hZ2UiLAogICAgICBpY29uOiBQbG90bHkuSWNvbnMuY2FtZXJhLAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soc2F2ZUltYWdlVG9GaWxlLCAoKSA9PiB7CiAgICAgICAgcG9wb3V0X2NvbnRhaW5lcih7IGNsOiAiZmlsZXNhdmUiIH0pOwogICAgICB9KSwKICAgIH0sCiAgXQopOwoKZnVuY3Rpb24gZ2V0T2Zmc2V0RGF0YShlbCkgewogIGxldCBjcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsLCBudWxsKTsKICBjb25zdCBvZGF0YSA9IHsKICAgIHBhZGRpbmc6IHsKICAgICAgbGVmdDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSwKICAgICAgYm90dG9tOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdSaWdodCksCiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wKSArIHBhcnNlRmxvYXQoY3MucGFkZGluZ0JvdHRvbSksCiAgICB9LAogICAgYm9yZGVyOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyTGVmdFdpZHRoKSwKICAgICAgcmlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyUmlnaHRXaWR0aCksCiAgICAgIHRvcDogcGFyc2VGbG9hdChjcy5ib3JkZXJUb3BXaWR0aCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCkgKyBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCksCiAgICB9CiAgfTsKICBpZiAoZWwgPT09IFBMT1QpIHsKICAgIC8vIEZvciB0aGUgUExPVCB3ZSBhbHNvIHdhbnQgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIG9mZnNldAogICAgb2RhdGEub2Zmc2V0ID0gewogICAgICB0b3A6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0VG9wIDogMCwKICAgICAgbGVmdDogUExPVC5vZmZzZXRQYXJlbnQgPT0gQ09OVEFJTkVSID8gUExPVC5vZmZzZXRMZWZ0IDogMCwKICAgIH0KICB9CiAgcmV0dXJuIG9kYXRhOwp9CmZ1bmN0aW9uIGdldFNpemVEYXRhKCkgewogIGNvbnN0IGRhdGEgPSB7CiAgICBwbG90X3BhZDogZ2V0T2Zmc2V0RGF0YShQTE9UKSwKICAgIHBsb3RfcmVjdDogUExPVC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICAgIGNvbnRhaW5lcl9wYWQ6IGdldE9mZnNldERhdGEoQ09OVEFJTkVSKSwKICAgIGNvbnRhaW5lcl9yZWN0OiBDT05UQUlORVIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgfTsKICByZXR1cm4gZGF0YTsKfQpmdW5jdGlvbiBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgY29uc3QgY29tcHV0ZWRfc2l6ZSA9IGNvbXB1dGVQbG90U2l6ZShzaXplRGF0YSk7CiAgY29uc3Qgb2Zmc2V0cyA9IGNvbXB1dGVkX3NpemUub2Zmc2V0czsKCiAgY29uc3QgcGxvdF9kYXRhID0gewogICAgd2lkdGg6IHdpZHRoID8/IGNvbXB1dGVkX3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IGhlaWdodCA/PyBjb21wdXRlZF9zaXplLmhlaWdodCwKICB9OwoKICByZXR1cm4gewogICAgd2lkdGg6ICh3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoKSArIG9mZnNldHMud2lkdGgsCiAgICBoZWlnaHQ6IChoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQpICsgb2Zmc2V0cy5oZWlnaHQsCiAgICBub0NoYW5nZTogd2lkdGggPT0gY29tcHV0ZWRfc2l6ZS53aWR0aCAmJiBoZWlnaHQgPT0gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfQp9CgovLyBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hhbmdlIHRoZSBjb250YWluZXIgc2l6ZSBzbyB0aGF0IHRoZSByZXN1bHRpbmcgcGxvdCB3aWxsIGJlIG1hdGNoaW5nIHRoZSBwcm92aWRlZCBzcGVjcwpmdW5jdGlvbiBjaGFuZ2VDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICBpZiAoIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICBjb25zb2xlLmxvZygiVHJpZWQgdG8gY2hhbmdlIGNvbnRhaW5lciBzaXplIHdoZW4gbm90IHBvcHBlZCwgaWdub3JpbmciKTsKICAgIHJldHVybjsKICB9CgogIGNvbnN0IGNzeiA9IGNvbXB1dGVDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSk7CgogIGlmIChjc3oubm9DaGFuZ2UpIHsKICAgIGNvbnNvbGUubG9nKCJTaXplIGlzIHRoZSBzYW1lIGFzIGN1cnJlbnQsIGlnbm9yaW5nIik7CiAgICByZXR1cm4KICB9CiAgLy8gV2UgYXJlIG5vdyBnb2luZyB0byBzZXQgaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgY29udGFpbmVyCiAgZm9yIChjb25zdCBrZXkgb2YgWyJ3aWR0aCIsICJoZWlnaHQiXSkgewogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSBjc3pba2V5XSArICJweCI7CiAgfQp9Ci8vIFdlIG5vdyBjcmVhdGUgdGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCB1cGRhdGUgdGhlIHBsb3QgYmFzZWQgb24gdGhlIHZhbHVlcyBzcGVjaWZpZWQKZnVuY3Rpb24gdXBkYXRlRnJvbUhlYWRlcigpIHsKICBjb25zdCBoZWFkZXJfZGF0YSA9IHsKICAgIGhlaWdodDogY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSwKICAgIHdpZHRoOiBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUsCiAgfTsKICBjaGFuZ2VDb250YWluZXJTaXplKGhlYWRlcl9kYXRhKTsKfQovLyBXZSBhc3NpZ24gdGhpcyBmdW5jdGlvbiB0byB0aGUgb25ibHVyIGV2ZW50IG9mIHdpZHRoIGFuZCBoZWlnaHQKaWYgKGZpcnN0UnVuKSB7CiAgZm9yIChjb25zdCBjb250YWluZXIgb2YgT2JqZWN0LnZhbHVlcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIudWlfc3Bhbi5vbmJsdXIgPSAoZSkgPT4gewogICAgICBjb250YWluZXIudWlfdmFsdWUgPSBjb250YWluZXIudWlfc3Bhbi50ZXh0Q29udGVudDsKICAgICAgdXBkYXRlRnJvbUhlYWRlcigpOwogICAgfTsKICB9Cn0KLy8gVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgcGxvdCBzaXplIHRvIHVzZSBmb3IgcmVsYXlvdXQgYXMgYSBmdW5jdGlvbiBvZiB0aGUgY29udGFpbmVyIHNpemUKZnVuY3Rpb24gY29tcHV0ZVBsb3RTaXplKGRhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgLy8gUmVtb3ZlIFBhZGRpbmcKICBjb25zdCB7IGNvbnRhaW5lcl9wYWQsIHBsb3RfcGFkLCBjb250YWluZXJfcmVjdCB9ID0gZGF0YTsKICBjb25zdCBvZmZzZXRzID0gewogICAgd2lkdGg6CiAgICAgIHBsb3RfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBwbG90X3BhZC5ib3JkZXIud2lkdGggKwogICAgICBwbG90X3BhZC5vZmZzZXQubGVmdCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy53aWR0aCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLndpZHRoLAogICAgaGVpZ2h0OgogICAgICBwbG90X3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIHBsb3RfcGFkLmJvcmRlci5oZWlnaHQgKwogICAgICBwbG90X3BhZC5vZmZzZXQudG9wICsKICAgICAgY29udGFpbmVyX3BhZC5wYWRkaW5nLmhlaWdodCArCiAgICAgIGNvbnRhaW5lcl9wYWQuYm9yZGVyLmhlaWdodCwKICB9OwogIGNvbnN0IHN6ID0gewogICAgd2lkdGg6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3Qud2lkdGggLSBvZmZzZXRzLndpZHRoKSwKICAgIGhlaWdodDogTWF0aC5yb3VuZChjb250YWluZXJfcmVjdC5oZWlnaHQgLSBvZmZzZXRzLmhlaWdodCksCiAgICBvZmZzZXRzLAogIH07CiAgcmV0dXJuIHN6Owp9CgovLyBDcmVhdGUgdGhlIHJlc2l6ZU9ic2VydmVyIHRvIG1ha2UgdGhlIHBsb3QgZXZlbiBtb3JlIHJlc3BvbnNpdmUhIDptYWdpYzoKY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHsKICBjb25zdCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCk7CiAgY29uc3Qge2NvbnRhaW5lcl9yZWN0LCBjb250YWluZXJfcGFkfSA9IHNpemVEYXRhOwogIGxldCBwbG90X3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIC8vIFdlIHNhdmUgdGhlIGhlaWdodCBpbiB0aGUgUExPVCBvYmplY3QKICBQTE9ULmNvbnRhaW5lcl9oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQ7CiAgLy8gV2UgZGVhbCB3aXRoIHNvbWUgc3R1ZmYgaWYgdGhlIGNvbnRhaW5lciBpcyBwb3BwcGVkCiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS53aWR0aCA9IGNvbnRhaW5lcl9yZWN0LndpZHRoICsgInB4IjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBjb250YWluZXJfcmVjdC5sZWZ0ICsgInB4IjsKICBjb25maWdfc3BhbnMuaGVpZ2h0LnVpX3ZhbHVlID0gcGxvdF9zaXplLmhlaWdodDsKICBjb25maWdfc3BhbnMud2lkdGgudWlfdmFsdWUgPSBwbG90X3NpemUud2lkdGg7CiAgLyogCgkJVGhlIGFkZGl0aW9uIG9mIHRoZSBpbnZhbGlkIGFyZ3VtZW50IGBwbHV0b3Jlc2l6ZWAgc2VlbXMgdG8gZml4IHRoZSBwcm9ibGVtIHdpdGggY2FsbGluZyBgcmVsYXlvdXRgIHNpbXBseSB3aXRoIGB7YXV0b3NpemU6IHRydWV9YCBhcyB1cGRhdGUgYnJlYWtpbmcgbW91c2UgcmVsYXlvdXQgZXZlbnRzIHRyYWNraW5nLiAKCQlTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Bsb3RseS9wbG90bHkuanMvaXNzdWVzLzYxNTYgZm9yIGRldGFpbHMKCQkqLwogIGxldCBjb25maWcgPSB7CiAgICAvLyBJZiB0aGlzIGlzIHBvcHBlZCBvdXQsIHdlIGlnbm9yZSB0aGUgb3JpZ2luYWwgd2lkdGgvaGVpZ2h0CiAgICB3aWR0aDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfd2lkdGgpID8/IHBsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDogKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gdW5kZWZpbmVkIDogb3JpZ2luYWxfaGVpZ2h0KSA/PyBwbG90X3NpemUuaGVpZ2h0LAogICAgcGx1dG9yZXNpemU6IHRydWUsCiAgfTsKICBQbG90bHkucmVsYXlvdXQoUExPVCwgY29uZmlnKS50aGVuKCgpID0+IHsKICAgIGlmIChyZW1vdmVfY29udGFpbmVyX3NpemUgJiYgIUNPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIHRoZSBmaXJzdCByZXNpemUgdXBvbiBwbG90IGNyZWF0aW9uIHRvIGFscmVhZHkgYmUgd2l0aG91dCBhIGZpeGVkIGhlaWdodAogICAgICBDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gIiI7CiAgICAgIENPTlRBSU5FUi5zdHlsZS53aWR0aCA9ICIiOwogICAgICByZW1vdmVfY29udGFpbmVyX3NpemUgPSBmYWxzZTsKICAgIH0KICB9KTsKfSk7CgpyZXNpemVPYnNlcnZlci5vYnNlcnZlKENPTlRBSU5FUik7CgoKUGxvdGx5LnJlYWN0KFBMT1QsIHBsb3Rfb2JqKS50aGVuKCgpID0+IHsKCS8vIEFzc2lnbiB0aGUgUGxvdGx5IGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKHBsb3RseV9saXN0ZW5lcnMpKSB7CgkJZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcl92ZWMpIHsKCQkJUExPVC5vbihrZXksIGxpc3RlbmVyKQoJCX0KCX0KCS8vIEFzc2lnbiB0aGUgSlMgZXZlbnQgbGlzdGVuZXJzCglmb3IgKGNvbnN0IFtrZXksIGxpc3RlbmVyX3ZlY10gb2YgT2JqZWN0LmVudHJpZXMoanNfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1QuYWRkRXZlbnRMaXN0ZW5lcihrZXksIGxpc3RlbmVyLCB7CgkJCQlzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsCgkJCX0pCgkJfQoJfQp9CikKCgppbnZhbGlkYXRpb24udGhlbigoKSA9PiB7CgkvLyBSZW1vdmUgYWxsIHBsb3RseSBsaXN0ZW5lcnMKCVBMT1QucmVtb3ZlQWxsTGlzdGVuZXJzKCkKCS8vIFJlbW92ZSBhbGwgSlMgbGlzdGVuZXJzCgljb250cm9sbGVyLmFib3J0KCkKCS8vIFJlbW92ZSB0aGUgcmVzaXplT2JzZXJ2ZXIKCXJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKQp9KQoKCgoJCXJldHVybiBDT05UQUlORVIKCTwvc2NyaXB0PgqkbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/yC0rTmqwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJGY3MzA4MmZmLWE2ZDMtNDFmOC04Nzk2LTQxMTRmYTg5ZDJiYrlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzwAAAAEhFmqTtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5HZNWVkMjdkZTFhLTgxZDktMTFlZi0zYjczLTFiMTE2MzEyZGFlNy9hMmY3NGIyOGNmOTk0OTZmuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDcwZGJjMmJkLThiOTMtNDcxZC04MzQwLTA0ZDk4YTAwOGNhNoqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHmgpG1pbWWqdGV4dC9wbGFpbqxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b/IHUxEVrBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkNzBkYmMyYmQtOGI5My00NzFkLTgzNDAtMDRkOThhMDA4Y2E2uWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAWdrW7VwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJGFiZWEyYzQzLWQ4M2UtNDQzOC04Y2QzLTRiZTA2YjgxNzRiM4qmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnaASI8ZGl2IGNsYXNzPSJtYXJrZG93biI+PGgxPlJlcHJvZHVjaWJpbGl0eTwvaDE+CjxwPlRoaXMgPGEgaHJlZj0iaHR0cHM6Ly9wbHV0b2psLm9yZy8iPlBsdXRvIG5vdGVib29rPC9hPiBpcyByZXByb2R1Y2libGUgYnkgZGVmYXVsdCwgYXMgaXQgaGFzIGFuIGVtYmVkZGVkIDxjb2RlPlByb2plY3QudG9tbDwvY29kZT4gYW5kIDxjb2RlPk1hbmlmZXN0LnRvbWw8L2NvZGU+LCB0aGF0IHN0b3JlIHRoZSBleGFjdCBwYWNrYWdlIHZlcnNpb25zIHVzZWQgdG8gY3JlYXRlIHRoZSBub3RlYm9vay48L3A+CjwvZGl2PqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b/H8YFoQLBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkYWJlYTJjNDMtZDgzZS00NDM4LThjZDMtNGJlMDZiODE3NGIzuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAARwY7VwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJGFlNzJmZmM1LTdmOGUtNDkwNy1hOTllLThhZDdjYjhmZGRhYoqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnZcTxkaXYgY2xhc3M9Im1hcmtkb3duIj48cD5UaGUgQ01SQSBzZXF1ZW5jZSAmIzQwOzxjb2RlPkNNUkFfaU5BVl9iU1NGUF9jYXJkaWFjPC9jb2RlPiYjNDE7IGNvbnNpc3RzIG9mOjwvcD4KPC9kaXY+pG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv8fxgImUsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SRhZTcyZmZjNS03ZjhlLTQ5MDctYTk5ZS04YWQ3Y2I4ZmRkYWK5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4AAv5HtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkMGI3YTQwNWUtYmJiNS0xMWVlLTA1Y2EtNGIxYzg1NjczOThkiqZxdWV1ZWTCpGxvZ3ORiKRsaW5l/6Ntc2eS2StOZXcgS29tYU1SSVBsb3RzIGJhY2tlbmQgc2V0OiBQbHV0b1Bsb3RseS4KqnRleHQvcGxhaW6nY2VsbF9pZNkkMGI3YTQwNWUtYmJiNS0xMWVlLTA1Y2EtNGIxYzg1NjczOThkpmt3YXJnc5CiaWS1S29tYU1SSVBsb3RzX2Y3NmU0NjZhpGZpbGXZRi9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvS29tYU1SSVBsb3RzL2dkTUxnL3NyYy91aS9QbG90QmFja2VuZHMuamylZ3JvdXCsUGxvdEJhY2tlbmRzpWxldmVspEluZm+ncnVubmluZ8Kmb3V0cHV0hqRib2R5oKRtaW1lqnRleHQvcGxhaW6scm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/yB07vCewcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJDBiN2E0MDVlLWJiYjUtMTFlZS0wNWNhLTRiMWM4NTY3Mzk4ZLlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzudsvPu1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SRkYmYxNjY3Ni02NGYyLTRkOWItYmYxYi04ZGUwNmIwNDg2MDKKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52UQ8ZGl2IGNsYXNzPSJtYXJrZG93biI+PGgyPjEuMS4gTG9hZGluZyByZXF1aXJlZCBwYWNrYWdlczwvaDI+CjwvZGl2PqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b/H8YAv+bBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkZGJmMTY2NzYtNjRmMi00ZDliLWJmMWItOGRlMDZiMDQ4NjAyuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAALGPLVwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJGYyMWU5ZTU5LTI1YzMtNGYwNi04ZGU0LTc5MmNiMzA1ZWIwMYqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnZ7DxkaXYgY2xhc3M9Im1hcmtkb3duIj48aDE+Mi4gU2ltdWxhdGlvbjwvaDE+CjxwPlR3byBzaW11bGF0aW9uIGV4cGVyaW1lbnRzIHdlcmUgcGVyZm9ybWVkIHRvIG9wdGltaXplIHRoZSBzZXF1ZW5jZSBwYXJhbWV0ZXJzLCAmIzQwOzEmIzQxOyB0byBvcHRpbWl6ZSB0aGUgaW1hZ2luZyBmbGlwIGFuZ2xlLCBhbmQgJiM0MDsyJiM0MTsgdG8gb3B0aW1pemUgdGhlIEZhdFNhdCBmbGlwIGFuZ2xlLjwvcD4KPC9kaXY+pG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv8fxgLlJsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SRmMjFlOWU1OS0yNWMzLTRmMDYtOGRlNC03OTJjYjMwNWViMDG5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4AA6C7tXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkMGI2YzFmNzItYjA0MC00ODNjLTk2OWItODhiZmUwOWIzMmMziqZxdWV1ZWTCpGxvZ3ORiKRsaW5l/6Ntc2eS2SxEb3dubG9hZGluZyBhIGxvY2FsIHZlcnNpb24gb2YgcGxvdGx5QDIuMjYuMqp0ZXh0L3BsYWlup2NlbGxfaWTZJDBiNmMxZjcyLWIwNDAtNDgzYy05NjliLTg4YmZlMDliMzJjM6Zrd2FyZ3OQomlktFBsdXRvUGxvdGx5XzcwYTUwMWQ4pGZpbGXZSi9ob21lL3J1bm5lci8uanVsaWEvcGFja2FnZXMvUGx1dG9QbG90bHkvUGVjSlAvc3JjL2xvY2FsX3Bsb3RseV9saWJyYXJ5LmpspWdyb3VwtGxvY2FsX3Bsb3RseV9saWJyYXJ5pWxldmVspEluZm+ncnVubmluZ8Kmb3V0cHV0hqRib2R52mqJCTxzY3JpcHQgaWQ9J3Bsb3RfMSc+CgkJLy8gV2Ugc3RhcnQgYnkgcHV0dGluZyBhbGwgdGhlIHZhcmlhYmxlIGludGVycG9sYXRpb24gaGVyZSBhdCB0aGUgYmVnaW5uaW5nCgkJLy8gV2UgaGF2ZSB0byBjb252ZXJ0IGFsbCB0eXBlZGFycmF5cyBpbiB0aGUgbGF5b3V0IHRvIG5vcm1hbCBhcnJheXMuIFNlZSBJc3N1ZSAjMjUKCQkvLyBXZSB1c2UgbG9kYXNoIGZvciB0aGlzIGZvciBjb21wYWN0bmVzcwoJCWZ1bmN0aW9uIHJlbW92ZVR5cGVkQXJyYXkobykgewoJCQlyZXR1cm4gXy5pc1R5cGVkQXJyYXkobykgPyBBcnJheS5mcm9tKG8pIDoKCQkJXy5pc1BsYWluT2JqZWN0KG8pID8gXy5tYXBWYWx1ZXMobywgcmVtb3ZlVHlwZWRBcnJheSkgOiAKCQkJbwoJCX0KCgkJLy8gUHVibGlzaCB0aGUgcGxvdCBvYmplY3QgdG8gSlMKCQlsZXQgcGxvdF9vYmogPSBfLnVwZGF0ZSgvKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIEFic3RyYWN0UGx1dG9EaW5nZXRqZXMuRGlzcGxheS5wdWJsaXNoZWRfdG9fanMgKi8gZ2V0UHVibGlzaGVkT2JqZWN0KCJlZDI3ZGUxYS04MWQ5LTExZWYtM2I3My0xYjExNjMxMmRhZTcvZWIwNGJiMTkxNDExYjdjOSIpLCAibGF5b3V0IiwgcmVtb3ZlVHlwZWRBcnJheSkKCQkvLyBHZXQgdGhlIHBsb3RseSBsaXN0ZW5lcnMKCQljb25zdCBwbG90bHlfbGlzdGVuZXJzID0ge30KCQkvLyBHZXQgdGhlIEpTIGxpc3RlbmVycwoJCWNvbnN0IGpzX2xpc3RlbmVycyA9IHt9CgkJLy8gRGVhbCB3aXRoIGV2ZW50dWFsIGN1c3RvbSBjbGFzc2VzCgkJbGV0IGN1c3RvbV9jbGFzc2xpc3QgPSBbXQoKCgkJLy8gTG9hZCB0aGUgcGxvdGx5IGxpYnJhcnkKCQlsZXQgUGxvdGx5ID0gdW5kZWZpbmVkCgkJdHJ5IHsKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoIi4vcGxvdGx5anMvcGxvdGx5anMtMi4yNi4yLm1pbi5qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0gY2F0Y2ggKGUpIHsKCQkJY29uc29sZS5sb2coIkxvY2FsIGxvYWQgZmFpbGVkLCB0cnlpbmcgd2l0aCB0aGUgd2ViIGVzbS5zaCB2ZXJzaW9uIikKCQkJbGV0IF9tb2QgPSBhd2FpdCBpbXBvcnQoImh0dHBzOi8vZXNtLnNoL3YxMzUvcGxvdGx5LmpzLWRpc3QtbWluQDIuMjYuMi9lc25leHQvcGxvdGx5LmpzLWRpc3QtbWluLm1qcyIpCgkJCVBsb3RseSA9IF9tb2QuZGVmYXVsdAoJCX0KCgkJLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0byBmb3JjZSBsb2NhbCBtYXRoamF4IGZvbnQgY2FjaGUKCQlpZiAoZmFsc2UgJiYgd2luZG93Py5NYXRoSmF4Py5jb25maWc/LnN2Zz8uZm9udENhY2hlID09PSAnZ2xvYmFsJykgewoJCQl3aW5kb3cuTWF0aEpheC5jb25maWcuc3ZnLmZvbnRDYWNoZSA9ICdsb2NhbCcKCQl9CgoJCS8vIEZsYWcgdG8gY2hlY2sgaWYgdGhpcyBjZWxsIHdhcyAgbWFudWFsbHkgcmFuIG9yIHJlYWN0aXZlbHkgcmFuCmNvbnN0IGZpcnN0UnVuID0gdGhpcyA/IGZhbHNlIDogdHJ1ZQpjb25zdCBDT05UQUlORVIgPSB0aGlzID8/IGh0bWxgPGRpdiBjbGFzcz0ncGx1dG9wbG90bHktY29udGFpbmVyJz5gCmNvbnN0IFBMT1QgPSBDT05UQUlORVIucXVlcnlTZWxlY3RvcignLmpzLXBsb3RseS1wbG90JykgPz8gQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgPGRpdj5gKQpjb25zdCBwYXJlbnQgPSBDT05UQUlORVIucGFyZW50RWxlbWVudAovLyBXZSB1c2UgYSBjb250cm9sbGVyIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lcnMgdXBvbiBpbnZhbGlkYXRpb24KY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKQovLyBXZSBoYXZlIHRvIGFkZCB0aGlzIHRvIGtlZXAgc3VwcG9ydGluZyBAYmluZCB3aXRoIHRoZSBvbGQgQVBJIHVzaW5nIFBMT1QKUExPVC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChlKSA9PiB7CglDT05UQUlORVIudmFsdWUgPSBQTE9ULnZhbHVlCglpZiAoZS5idWJibGVzKSB7CgkJcmV0dXJuCgl9CglDT05UQUlORVIuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2lucHV0JykpCn0sIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KQoKCS8vIFRoaXMgY3JlYXRlIHRoZSBzdHlsZSBzdWJkaXYgb24gZmlyc3QgcnVuCglmaXJzdFJ1biAmJiBDT05UQUlORVIuYXBwZW5kQ2hpbGQoaHRtbGAKCTxzdHlsZT4KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgewoJCXdpZHRoOiAxMDAlOwoJCWhlaWdodDogMTAwJTsKCQltaW4taGVpZ2h0OiAwOwoJCW1pbi13aWR0aDogMDsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIgLmpzLXBsb3RseS1wbG90IC5wbG90bHkgZGl2IHsKCQltYXJnaW46IDAgYXV0bzsgLy8gVGhpcyBjZW50ZXJzIHRoZSBwbG90Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLnBvcHBlZC1vdXQgewoJCW92ZXJmbG93OiBhdXRvOwoJCXotaW5kZXg6IDEwMDA7CgkJcG9zaXRpb246IGZpeGVkOwoJCXJlc2l6ZTogYm90aDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDBweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMHB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgewoJCWRpc3BsYXk6IGZsZXg7CgkJZmxleC1mbG93OiByb3cgd3JhcDsKCQliYWNrZ3JvdW5kOiB2YXIoLS1tYWluLWJnLWNvbG9yKTsKCQlib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAxMnB4OwoJCWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAxMnB4OwoJCXBvc2l0aW9uOiBmaXhlZDsKCQl6LWluZGV4OiAxMDAxOwoJCWN1cnNvcjogbW92ZTsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIC0xMDAlKTsKCQlwYWRkaW5nOiA1cHg7Cgl9CgkucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBzcGFuIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJZmxleDogMQoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIuaGlkZGVuIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmNsaXBib2FyZC1zcGFuIHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlIHsKCQlwYWRkaW5nLXJpZ2h0OiA1cHg7CgkJcGFkZGluZy1sZWZ0OiAycHg7CgkJY3Vyc29yOiB0ZXh0OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZmxleDogMCAwIDEwMCU7CgkJdGV4dC1hbGlnbjogY2VudGVyOwoJCWJvcmRlci10b3A6IDNweCBzb2xpZCB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCQltYXJnaW4tdG9wOiA1cHg7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5wbHV0b3Bsb3RseS1jb250YWluZXIuZmlsZXNhdmUgLmNsaXBib2FyZC1zcGFuLmZpbGVuYW1lIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuY2xpcGJvYXJkLXZhbHVlLmZpbGVuYW1lIHsKCQltYXJnaW4tbGVmdDogM3B4OwoJCXRleHQtYWxpZ246IGxlZnQ7CgkJbWluLXdpZHRoOiBtaW4oNjAlLCBtaW4tY29udGVudCk7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IGlubGluZS1mbGV4OwoJfQoJLmNsaXBib2FyZC1zcGFuLmZvcm1hdCAubGFiZWwgewoJCWZsZXg6IDAgMCAwOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5mb3JtYXQgewoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCQlmbGV4OiAxIDAgYXV0bzsKCQltaW4td2lkdGg6IDMwcHg7CgkJbWFyZ2luLXJpZ2h0OiAxMHB4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCQlmbGV4LWZsb3c6IGNvbHVtbjsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlwYWRkaW5nLWxlZnQ6IDNweDsKCQl6LWluZGV4OiAyMDAwOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIHsKCQljdXJzb3I6IHBvaW50ZXI7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJcGFkZGluZzogM3B4OwoJCXRyYW5zZm9ybTogdHJhbnNsYXRlKC0zcHgsIC02cHgpOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zOmhvdmVyIC5mb3JtYXQtb3B0aW9uIHsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl9CgkuZm9ybWF0LW9wdGlvbjpub3QoLnNlbGVjdGVkKSB7CgkJbWFyZ2luLXRvcDogM3B4OwoJfQoJZGl2LmZvcm1hdC1vcHRpb25zIC5mb3JtYXQtb3B0aW9uLnNlbGVjdGVkIHsKCQlvcmRlcjogLTE7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246aG92ZXIgewoJCWJhY2tncm91bmQtY29sb3I6IHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJfQoJc3Bhbi5jb25maWctdmFsdWUgewoJCWZvbnQtd2VpZ2h0OiBub3JtYWw7CgkJY29sb3I6IHZhcigtLXBsdXRvLW91dHB1dC1jb2xvcik7CgkJZGlzcGxheTogbm9uZTsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIGNhbGMoLTEwMCUgLSAxMHB4KSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLmxhYmVsIHsKCQl1c2VyLXNlbGVjdDogbm9uZTsKCX0KCS5sYWJlbDpob3ZlciBzcGFuLmNvbmZpZy12YWx1ZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCW1pbi13aWR0aDogMTUwcHg7Cgl9CgkuY2xpcGJvYXJkLXNwYW4ubWF0Y2hpbmctY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLW1hY3JvLWNvbG9yKTsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5kaWZmZXJlbnQtY29uZmlnIC5sYWJlbCB7CgkJY29sb3I6IHZhcigtLWNtLXRhZy1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9Cjwvc3R5bGU+CmApCgpsZXQgb3JpZ2luYWxfaGVpZ2h0ID0gcGxvdF9vYmoubGF5b3V0LmhlaWdodApsZXQgb3JpZ2luYWxfd2lkdGggPSBwbG90X29iai5sYXlvdXQud2lkdGgKLy8gRm9yIHRoZSBoZWlnaHQgd2UgaGF2ZSB0byBhbHNvIHB1dCBhIGZpeGVkIHZhbHVlIGluIGNhc2UgdGhlIHBsb3QgaXMgcHV0IG9uIGEgbm9uLWZpeGVkLXNpemUgY29udGFpbmVyIChsaWtlIHRoZSBkZWZhdWx0IHdyYXBwZXIpCi8vIFdlIGRlZmluZSBhIHZhcmlhYmxlIHRvIGNoZWNrIHdoZXRoZXIgd2Ugc3RpbGwgaGF2ZSB0byByZW1vdmUgdGhlIGZpeGVkIGhlaWdodApsZXQgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmlyc3RSdW4KbGV0IGNvbnRhaW5lcl9oZWlnaHQgPSBvcmlnaW5hbF9oZWlnaHQgPz8gUExPVC5jb250YWluZXJfaGVpZ2h0ID8/IDQwMApDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX2hlaWdodCArICdweCcKCi8vIFdlIGNyZWF0ZSBhIFByb21pc2UgdmVyc2lvbiBvZiBzZXRUaW1lb3V0CmZ1bmN0aW9uIGRlbGF5KG1zKSB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7Cn0KCi8vIFdlIGltcG9ydCBpbnRlcmFjdCBmb3IgZHJhZ2dpbmcvcmVzaXppbmcKY29uc3QgeyBkZWZhdWx0OiBpbnRlcmFjdCB9ID0gYXdhaXQgaW1wb3J0KCdodHRwczovL2VzbS5zaC9pbnRlcmFjdGpzQDEuMTAuMTknKQoKCmZ1bmN0aW9uIGdldEltYWdlT3B0aW9ucygpIHsKICBjb25zdCBvID0gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zID8/IHt9OwogIHJldHVybiB7CiAgICBmb3JtYXQ6IG8uZm9ybWF0ID8/ICJwbmciLAogICAgd2lkdGg6IG8ud2lkdGggPz8gb3JpZ2luYWxfd2lkdGgsCiAgICBoZWlnaHQ6IG8uaGVpZ2h0ID8/IG9yaWdpbmFsX2hlaWdodCwKICAgIHNjYWxlOiBvLnNjYWxlID8/IDEsCiAgICBmaWxlbmFtZTogby5maWxlbmFtZSA/PyAibmV3cGxvdCIsCiAgfTsKfQoKY29uc3QgQ0xJUEJPQVJEX0hFQURFUiA9CiAgQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoIi5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIikgPz8KICBDT05UQUlORVIuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgImFmdGVyYmVnaW4iLAogICAgaHRtbGA8ZGl2IGNsYXNzPSJwbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIGhpZGRlbiI+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmb3JtYXQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+Rm9ybWF0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZvcm1hdCI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB3aWR0aCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5XaWR0aDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSB3aWR0aCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGhlaWdodCIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5IZWlnaHQ6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgaGVpZ2h0Ij48L3NwYW4+cHg8L3NwYW4KICAgICAgPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2NhbGUiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+U2NhbGU6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgc2NhbGUiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBzZXQiPlNldDwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiB1bnNldCI+VW5zZXQ8L2J1dHRvbj4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIGZpbGVuYW1lIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZpbGVuYW1lOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGZpbGVuYW1lIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgIDwvZGl2PmAKICApOwoKZnVuY3Rpb24gY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcikgewogIGNvbnN0IHZhbGlkX2NsYXNzZXMgPSBbCiAgICAibWlzc2luZy1jb25maWciLAogICAgIm1hdGNoaW5nLWNvbmZpZyIsCiAgICAiZGlmZmVyZW50LWNvbmZpZyIsCiAgXTsKICBmdW5jdGlvbiBzZXRDbGFzcyhjbCkgewogICAgZm9yIChjb25zdCBuYW1lIG9mIHZhbGlkX2NsYXNzZXMpIHsKICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUobmFtZSwgbmFtZSA9PSBjbCk7CiAgICB9CiAgfQogIC8vIFdlIHVzZSB0aGUgY3VzdG9tIGdldHRlcnMgd2UnbGwgc2V0IHVwIGluIHRoZSBjb250YWluZXIKICBjb25zdCB7IHVpX3ZhbHVlLCBjb25maWdfdmFsdWUsIGNvbmZpZ19zcGFuLCBrZXkgfSA9IGNvbnRhaW5lcjsKICBpZiAoY29uZmlnX3ZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgIHNldENsYXNzKCJtaXNzaW5nLWNvbmZpZyIpOwogICAgY29uZmlnX3NwYW4uaW5uZXJIVE1MID0gYFRoZSBrZXkgPGI+PGVtPiR7a2V5fTwvZW0+PC9iPiBpcyBub3QgcHJlc2VudCBpbiB0aGUgY29uZmlnLmA7CiAgfSBlbHNlIGlmICh1aV92YWx1ZSA9PSBjb25maWdfdmFsdWUpIHsKICAgIHNldENsYXNzKCJtYXRjaGluZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIHRoZSBzYW1lIHZhbHVlIGluIHRoZSBjb25maWcgYW5kIGluIHRoZSBoZWFkZXIuYDsKICB9IGVsc2UgewogICAgc2V0Q2xhc3MoImRpZmZlcmVudC1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaGFzIGEgZGlmZmVyZW50IHZhbHVlICg8ZW0+JHtjb25maWdfdmFsdWV9PC9lbT4pIGluIHRoZSBjb25maWcuYDsKICB9CiAgLy8gQWRkIGluZm8gYWJvdXQgc2V0dGluZyBhbmQgdW5zZXR0aW5nCiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIG9uIHRoZSBsYWJlbCA8ZW0+PGI+b25jZTwvYj48L2VtPiB0byBzZXQgdGhlIGN1cnJlbnQgVUkgdmFsdWUgaW4gdGhlIGNvbmZpZy5gCiAgKTsKICBjb25maWdfc3Bhbi5pbnNlcnRBZGphY2VudEhUTUwoCiAgICAiYmVmb3JlZW5kIiwKICAgIGA8YnI+Q2xpY2sgPGVtPjxiPnR3aWNlPC9iPjwvZW0+IHRvIHJlbW92ZSB0aGlzIGtleSBmcm9tIHRoZSBjb25maWcuYAogICk7Cn0KCmNvbnN0IHZhbGlkX2Zvcm1hdHMgPSBbInBuZyIsICJzdmciLCAid2VicCIsICJqcGVnIiwgImZ1bGwtanNvbiJdOwpmdW5jdGlvbiBpbml0aWFsaXplVUlWYWx1ZVNwYW4oc3Bhbiwga2V5LCB2YWx1ZSkgewogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSBrZXkgPT09ICJmb3JtYXQiID8gImZhbHNlIiA6ICJ0cnVlIjsKICBsZXQgcGFyc2UgPSAoeCkgPT4geDsKICBsZXQgdXBkYXRlID0gKHgpID0+IChzcGFuLnRleHRDb250ZW50ID0geCk7CiAgaWYgKGtleSA9PT0gIndpZHRoIiB8fCBrZXkgPT09ICJoZWlnaHQiKSB7CiAgICBwYXJzZSA9ICh4KSA9PiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoeCkpOwogIH0gZWxzZSBpZiAoa2V5ID09PSAic2NhbGUiKSB7CiAgICBwYXJzZSA9IHBhcnNlRmxvYXQ7CiAgfSBlbHNlIGlmIChrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAvLyBXZSByZW1vdmUgY29udGVudEVkaXRhYmxlCiAgICBzcGFuLmNvbnRlbnRFZGl0YWJsZSA9ICJmYWxzZSI7CiAgICAvLyBIZXJlIHdlIGZpcnN0IGFkZCB0aGUgc3Vic3BhbnMgZm9yIGVhY2ggb3B0aW9uCiAgICBjb25zdCBvcHRzX2RpdiA9IHNwYW4uYXBwZW5kQ2hpbGQoaHRtbGA8ZGl2IGNsYXNzPSJmb3JtYXQtb3B0aW9ucyI+PC9kaXY+YCk7CiAgICBmb3IgKGNvbnN0IGZtdCBvZiB2YWxpZF9mb3JtYXRzKSB7CiAgICAgIGNvbnN0IG9wdCA9IG9wdHNfZGl2LmFwcGVuZENoaWxkKAogICAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImZvcm1hdC1vcHRpb24gJHtmbXR9Ij4ke2ZtdH08L3NwYW4+YAogICAgICApOwogICAgICBvcHQub25jbGljayA9IChlKSA9PiB7CiAgICAgICAgc3Bhbi52YWx1ZSA9IG9wdC50ZXh0Q29udGVudDsKICAgICAgfTsKICAgIH0KICAgIHBhcnNlID0gKHgpID0+IHsKICAgICAgcmV0dXJuIHZhbGlkX2Zvcm1hdHMuaW5jbHVkZXMoeCkgPyB4IDogbG9jYWxWYWx1ZTsKICAgIH07CiAgICB1cGRhdGUgPSAoeCkgPT4gewogICAgICBmb3IgKGNvbnN0IG9wdCBvZiBvcHRzX2Rpdi5jaGlsZHJlbikgewogICAgICAgIG9wdC5jbGFzc0xpc3QudG9nZ2xlKCJzZWxlY3RlZCIsIG9wdC50ZXh0Q29udGVudCA9PT0geCk7CiAgICAgIH0KICAgIH07CiAgfSBlbHNlIHsKICAgIC8vIFdlIG9ubHkgaGF2ZSBmaWxlbmFtZSBoZXJlCiAgfQogIGxldCBsb2NhbFZhbHVlOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGFuLCAidmFsdWUiLCB7CiAgICBnZXQ6ICgpID0+IHsKICAgICAgcmV0dXJuIGxvY2FsVmFsdWU7CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIGlmICh2YWwgIT09ICIiKSB7CiAgICAgICAgbG9jYWxWYWx1ZSA9IHBhcnNlKHZhbCk7CiAgICAgIH0KICAgICAgdXBkYXRlKGxvY2FsVmFsdWUpOwogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7CiAgLy8gV2UgYWxzbyBhc3NpZ24gYSBsaXN0ZW5lciBzbyB0aGF0IHRoZSBlZGl0YWJsZSBpcyBibHVycmVkIHdoZW4gZW50ZXIgaXMgcHJlc3NlZAogIHNwYW4ub25rZXlkb3duID0gKGUpID0+IHsKICAgIGlmIChlLmtleUNvZGUgPT09IDEzKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgc3Bhbi5ibHVyKCk7CiAgICB9CiAgfTsKICBzcGFuLnZhbHVlID0gdmFsdWU7Cn0KCmZ1bmN0aW9uIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oc3Bhbiwga2V5KSB7CiAgLy8gSGVyZSB3ZSBtb3N0bHkgd2FudCB0byBkZWZpbmUgdGhlIHNldHRlciBhbmQgZ2V0dGVyCiAgY29uc3QgY29udGFpbmVyID0gc3Bhbi5jbG9zZXN0KCIuY2xpcGJvYXJkLXNwYW4iKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgIH0sCiAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgLy8gaWYgdW5kZWZpbmVkIGlzIHBhc3NlZCwgd2UgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBvcHRpb25zCiAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGRlbGV0ZSBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnNba2V5XSA9IHZhbDsKICAgICAgfQogICAgICBjaGVja0NvbmZpZ1N5bmMoY29udGFpbmVyKTsKICAgIH0sCiAgfSk7Cn0KCmNvbnN0IGNvbmZpZ19zcGFucyA9IHt9Owpmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhnZXRJbWFnZU9wdGlvbnMoKSkpIHsKICBjb25zdCBjb250YWluZXIgPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoYC5jbGlwYm9hcmQtc3Bhbi4ke2tleX1gKTsKICBjb25zdCBsYWJlbCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIubGFiZWwiKTsKICAvLyBXZSBnaXZlIHRoZSBsYWJlbCBhIGZ1bmN0aW9uIHRoYXQgb24gc2luZ2xlIGNsaWNrIHdpbGwgc2V0IHRoZSBjdXJyZW50IHZhbHVlIGFuZCB3aXRoIGRvdWJsZSBjbGljayB3aWxsIHVuc2V0IGl0CiAgbGFiZWwub25jbGljayA9IER1YWxDbGljaygKICAgICgpID0+IHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0sCiAgICAoZSkgPT4gewogICAgICBjb25zb2xlLmxvZygiZSIsIGUpOwogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSB1bmRlZmluZWQ7CiAgICB9CiAgKTsKICBjb25zdCB1aV92YWx1ZV9zcGFuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtdmFsdWUiKTsKICBjb25zdCBjb25maWdfdmFsdWVfc3BhbiA9CiAgICBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmNvbmZpZy12YWx1ZSIpID8/CiAgICBsYWJlbC5pbnNlcnRBZGphY2VudEVsZW1lbnQoCiAgICAgICJhZnRlcmJlZ2luIiwKICAgICAgaHRtbGA8c3BhbiBjbGFzcz0iY29uZmlnLXZhbHVlIj48L3NwYW4+YAogICAgKTsKICAvLyBBc3NpbmcgdGhlIHR3byBzcGFucyBhcyBwcm9wZXJ0aWVzIG9mIHRoZSBjb250YWluaW5nIHNwYW4KICBjb250YWluZXIudWlfc3BhbiA9IHVpX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmNvbmZpZ19zcGFuID0gY29uZmlnX3ZhbHVlX3NwYW47CiAgY29udGFpbmVyLmtleSA9IGtleTsKICBjb25maWdfc3BhbnNba2V5XSA9IGNvbnRhaW5lcjsKICBpZiAoZmlyc3RSdW4pIHsKICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA9CiAgICAgIHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICAgIC8vIFdlIGRvIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdmFsdWUgc3BhbgogICAgaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHVpX3ZhbHVlX3NwYW4sIGtleSwgdmFsdWUpOwogICAgLy8gVGhlbiB3ZSBpbml0aWFsaXplIHRoZSBjb25maWcgdmFsdWUKICAgIGluaXRpYWxpemVDb25maWdWYWx1ZVNwYW4oY29uZmlnX3ZhbHVlX3NwYW4sIGtleSk7CiAgICAvLyBXZSBwdXQgc29tZSBjb252ZW5pZW5jZSBnZXR0ZXJzL3NldHRlcnMKICAgIC8vIHVpX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJ1aV92YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiB1aV92YWx1ZV9zcGFuLnZhbHVlLAogICAgICBzZXQ6ICh2YWwpID0+IHsKICAgICAgICB1aV92YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgICAvLyBjb25maWdfdmFsdWUgZm9yd2FyZAogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgImNvbmZpZ192YWx1ZSIsIHsKICAgICAgZ2V0OiAoKSA9PiBjb25maWdfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUgPSB2YWw7CiAgICAgIH0sCiAgICB9KTsKICB9Cn0KCi8vIFRoZXNlIG9iamVjdHMgd2lsbCBjb250YWluIHRoZSBkZWZhdWx0IHZhbHVlCgovLyBUaGlzIGNvZGUgdXBkYXRlcyB0aGUgaW1hZ2Ugb3B0aW9ucyBpbiB0aGUgUExPVCBjb25maWcgd2l0aCB0aGUgcHJvdmlkZWQgb25lcwpmdW5jdGlvbiBzZXRJbWFnZU9wdGlvbnMobykgewogIGZvciAoY29uc3QgW2tleSwgY29udGFpbmVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdfc3BhbnMpKSB7CiAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gb1trZXldOwogIH0KfQpmdW5jdGlvbiB1bnNldEltYWdlT3B0aW9ucygpIHsKICBzZXRJbWFnZU9wdGlvbnMoe30pOwp9Cgpjb25zdCBzZXRfYnV0dG9uID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXNwYW4uc2V0Iik7CmNvbnN0IHVuc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnVuc2V0Iik7CmlmIChmaXJzdFJ1bikgewogIHNldF9idXR0b24ub25jbGljayA9IChlKSA9PiB7CiAgICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IGNvbnRhaW5lci51aV92YWx1ZTsKICAgIH0KICB9OwogIHVuc2V0X2J1dHRvbi5vbmNsaWNrID0gdW5zZXRJbWFnZU9wdGlvbnM7Cn0KCi8vIFdlIGFkZCBhIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBjbGlwYm9hcmQgaXMgcG9wcGVkIG91dApDT05UQUlORVIuaXNQb3BwZWRPdXQgPSAoKSA9PiB7CiAgcmV0dXJuIENPTlRBSU5FUi5jbGFzc0xpc3QuY29udGFpbnMoInBvcHBlZC1vdXQiKTsKfTsKCkNMSVBCT0FSRF9IRUFERVIub25tb3VzZWRvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHsKICBpZiAoZXZlbnQudGFyZ2V0Lm1hdGNoZXMoInNwYW4uY2xpcGJvYXJkLXZhbHVlIikpIHsKICAgIGNvbnNvbGUubG9nKCJXZSBkb24ndCBtb3ZlISIpOwogICAgcmV0dXJuOwogIH0KICBjb25zdCBzdGFydCA9IHsKICAgIGxlZnQ6IHBhcnNlRmxvYXQoQ09OVEFJTkVSLnN0eWxlLmxlZnQpLAogICAgdG9wOiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS50b3ApLAogICAgWDogZXZlbnQucGFnZVgsCiAgICBZOiBldmVudC5wYWdlWSwKICB9OwogIGZ1bmN0aW9uIG1vdmVBdChldmVudCwgc3RhcnQpIHsKICAgIGNvbnN0IHRvcCA9IGV2ZW50LnBhZ2VZIC0gc3RhcnQuWSArIHN0YXJ0LnRvcCArICJweCI7CiAgICBjb25zdCBsZWZ0ID0gZXZlbnQucGFnZVggLSBzdGFydC5YICsgc3RhcnQubGVmdCArICJweCI7CiAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSBsZWZ0OwogICAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9IHRvcDsKICB9CgogIC8vIG1vdmUgb3VyIGFic29sdXRlbHkgcG9zaXRpb25lZCBiYWxsIHVuZGVyIHRoZSBwb2ludGVyCiAgbW92ZUF0KGV2ZW50LCBzdGFydCk7CiAgZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQpIHsKICAgIG1vdmVBdChldmVudCwgc3RhcnQpOwogIH0KCiAgLy8gV2UgdXNlIHRoaXMgdG8gcmVtb3ZlIHRoZSBtb3VzZW1vdmUgd2hlbiBjbGlja2luZyBvdXRzaWRlIG9mIHRoZSBjb250YWluZXIKICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwoKICAvLyBtb3ZlIHRoZSBjb250YWluZXIgb24gbW91c2Vtb3ZlCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgb25Nb3VzZU1vdmUsIHsKICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsCiAgfSk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgY2xlYW5VcCgpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7CgogIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICBjb25zb2xlLmxvZygiY2xlYW5pbmcgdXAgdGhlIHBsb3QgbW92ZSBsaXN0ZW5lciIpOwogICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgQ0xJUEJPQVJEX0hFQURFUi5vbm1vdXNldXAgPSBudWxsOwogIH0KCiAgLy8gKDMpIGRyb3AgdGhlIGJhbGwsIHJlbW92ZSB1bm5lZWRlZCBoYW5kbGVycwogIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gY2xlYW5VcDsKfTsKCmZ1bmN0aW9uIHNlbmRUb0NsaXBib2FyZChibG9iKSB7CiAgaWYgKCFuYXZpZ2F0b3IuY2xpcGJvYXJkKSB7CiAgICBhbGVydCgKICAgICAgIlRoZSBDbGlwYm9hcmQgQVBJIGRvZXMgbm90IHNlZW0gdG8gYmUgYXZhaWxhYmxlLCBtYWtlIHN1cmUgdGhlIFBsdXRvIG5vdGVib29rIGlzIGJlaW5nIHVzZWQgZnJvbSBlaXRoZXIgbG9jYWxob3N0IG9yIGFuIGh0dHBzIHNvdXJjZS4iCiAgICApOwogIH0KICBuYXZpZ2F0b3IuY2xpcGJvYXJkCiAgICAud3JpdGUoWwogICAgICBuZXcgQ2xpcGJvYXJkSXRlbSh7CiAgICAgICAgLy8gVGhlIGtleSBpcyBkZXRlcm1pbmVkIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBibG9iJ3MgdHlwZS4KICAgICAgICBbYmxvYi50eXBlXTogYmxvYiwKICAgICAgfSksCiAgICBdKQogICAgLnRoZW4oCiAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICBjb25zb2xlLmxvZygiQXN5bmM6IENvcHlpbmcgdG8gY2xpcGJvYXJkIHdhcyBzdWNjZXNzZnVsISIpOwogICAgICB9LAogICAgICBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiQXN5bmM6IENvdWxkIG5vdCBjb3B5IHRleHQ6ICIsIGVycik7CiAgICAgIH0KICAgICk7Cn0KCmZ1bmN0aW9uIGNvcHlJbWFnZVRvQ2xpcGJvYXJkKCkgewogIC8vIFdlIGV4dHJhY3QgdGhlIGltYWdlIG9wdGlvbnMgZnJvbSB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycyAoaWYgdGhleSBleGlzdCkKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LiBXZSBhbHNvIGlnbm9yZSBmb3JtYXQgYmVjYXVzZSB0aGUgY2xpcGJvYXJkIG9ubHkgc3VwcG9ydHMgcG5nLgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gImZvcm1hdCIpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25maWdba2V5XSA9IHZhbDsKICB9CiAgUGxvdGx5LnRvSW1hZ2UoUExPVCwgY29uZmlnKS50aGVuKGZ1bmN0aW9uIChkYXRhVXJsKSB7CiAgICBmZXRjaChkYXRhVXJsKQogICAgICAudGhlbigocmVzKSA9PiByZXMuYmxvYigpKQogICAgICAudGhlbigoYmxvYikgPT4gewogICAgICAgIGNvbnN0IHBhc3RlX3JlY2VpdmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigncGFzdGUtcmVjZWl2ZXIucGx1dG9wbG90bHknKQogICAgICAgIGlmIChwYXN0ZV9yZWNlaXZlcikgewogICAgICAgICAgcGFzdGVfcmVjZWl2ZXIuYXR0YWNoSW1hZ2UoZGF0YVVybCwgQ09OVEFJTkVSKQogICAgICAgIH0KICAgICAgICBzZW5kVG9DbGlwYm9hcmQoYmxvYikKICAgICAgfSk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHNhdmVJbWFnZVRvRmlsZSgpIHsKICBjb25zdCBjb25maWcgPSB7fTsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgbGV0IHZhbCA9CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPz8KICAgICAgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpID8gY29udGFpbmVyLnVpX3ZhbHVlIDogdW5kZWZpbmVkKTsKICAgIC8vIElmIHdlIGhhdmUgdW5kZWZpbmVkIHdlIGRvbid0IGNyZWF0ZSB0aGUga2V5LgogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS5kb3dubG9hZEltYWdlKFBMT1QsIGNvbmZpZyk7Cn0KCmxldCBjb250YWluZXJfcmVjdCA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCwgdG9wOiAwLCBsZWZ0OiAwIH07CmZ1bmN0aW9uIHVucG9wX2NvbnRhaW5lcihjbCkgewogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgZmFsc2UpOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKGNsLCBmYWxzZSk7CiAgLy8gV2UgZml4IHRoZSBoZWlnaHQgYmFjayB0byB0aGUgdmFsdWUgaXQgaGFkIGJlZm9yZSBwb3BvdXQsIGFsc28gc2V0dGluZyB0aGUgZmxhZyB0byBzaWduYWwgdGhhdCB1cG9uIGZpcnN0IHJlc2l6ZSB3ZSByZW1vdmUgdGhlIGZpeGVkIGlubGluZS1zdHlsZQogIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSBjb250YWluZXJfcmVjdC5oZWlnaHQgKyAicHgiOwogIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IHRydWU7CiAgLy8gV2Ugc2V0IHRoZSBvdGhlciBmaXhlZCBpbmxpbmUtc3R5bGVzIHRvIG51bGwKICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICBDT05UQUlORVIuc3R5bGUudG9wID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBXZSBhbHNvIHJlbW92ZSB0aGUgQ0xJUEJPQVJEX0hFQURFUgogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSAiIjsKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLmxlZnQgPSAiIjsKICAvLyBGaW5hbGx5IHdlIHJlbW92ZSB0aGUgaGlkZGVuIGNsYXNzIHRvIHRoZSBoZWFkZXIKICBDTElQQk9BUkRfSEVBREVSLmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIHRydWUpOwogIHJldHVybjsKfQpmdW5jdGlvbiBwb3BvdXRfY29udGFpbmVyKG9wdHMpIHsKICBjb25zdCBjbCA9IG9wdHM/LmNsOwogIGNvbnN0IHRhcmdldF9jb250YWluZXJfc2l6ZSA9IG9wdHM/LnRhcmdldF9jb250YWluZXJfc2l6ZSA/PyB7fTsKICBjb25zdCB0YXJnZXRfcGxvdF9zaXplID0gb3B0cz8udGFyZ2V0X3Bsb3Rfc2l6ZSA/PyB7fTsKICBpZiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIHJldHVybiB1bnBvcF9jb250YWluZXIoY2wpOwogIH0KICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgY2wgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdHJ1ZSk7CiAgLy8gV2UgZXh0cmFjdCB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjb250YWluZXIsIHNhdmUgdGhlbSBhbmQgZml4IHRoZW0KICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9ID0gQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogIGNvbnRhaW5lcl9yZWN0ID0geyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfTsKICAvLyBXZSBzYXZlIHRoZSBjdXJyZW50IHBsb3Qgc2l6ZSBiZWZvcmUgd2UgcG9wIGFzIGl0IHdpbGwgZmlsbCB0aGUgc2NyZWVuCiAgY29uc3QgY3VycmVudF9wbG90X3NpemUgPSB7CiAgICB3aWR0aDogUExPVC5fZnVsbExheW91dC53aWR0aCwKICAgIGhlaWdodDogUExPVC5fZnVsbExheW91dC5oZWlnaHQsCiAgfTsKICAvLyBXZSBoYXZlIHRvIHNhdmUgdGhlIHBhZCBkYXRhIGJlZm9yZSBwb3BwaW5nIHNvIHdlIGNhbiByZXNpemUgcHJlY2lzZWx5CiAgY29uc3QgcGFkID0ge307CiAgcGFkLnVucG9wcGVkID0gZ2V0U2l6ZURhdGEoKS5jb250YWluZXJfcGFkOwogIENPTlRBSU5FUi5jbGFzc0xpc3QudG9nZ2xlKCJwb3BwZWQtb3V0IiwgdHJ1ZSk7CiAgcGFkLnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICAvLyBXZSBkbyB0b3AgYW5kIGxlZnQgYmFzZWQgb24gdGhlIGN1cnJlbnQgcmVjdAogIGZvciAoY29uc3Qga2V5IG9mIFsidG9wIiwgImxlZnQiXSkgewogICAgY29uc3Qgc3RhcnRfdmFsID0gdGFyZ2V0X2NvbnRhaW5lcl9zaXplW2tleV0gPz8gY29udGFpbmVyX3JlY3Rba2V5XTsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgZm9yIChjb25zdCBraW5kIG9mIFsicGFkZGluZyIsICJib3JkZXIiXSkgewogICAgICBvZmZzZXQgKz0gcGFkLnBvcHBlZFtraW5kXVtrZXldIC0gcGFkLnVucG9wcGVkW2tpbmRdW2tleV07CiAgICB9CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IHN0YXJ0X3ZhbCAtIG9mZnNldCArICJweCI7CiAgICBpZiAoa2V5ID09PSAibGVmdCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIC8vIFdlIGNvbXB1dGUgdGhlIHdpZHRoIGFuZCBoZWlnaHQgZGVwZW5kaW5nIG9uIGV2ZW50dWFsIGNvbmZpZyBkYXRhCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoewogICAgd2lkdGg6CiAgICAgIHRhcmdldF9wbG90X3NpemUud2lkdGggPz8KICAgICAgY29uZmlnX3NwYW5zLndpZHRoLmNvbmZpZ192YWx1ZSA/PwogICAgICBjdXJyZW50X3Bsb3Rfc2l6ZS53aWR0aCwKICAgIGhlaWdodDoKICAgICAgdGFyZ2V0X3Bsb3Rfc2l6ZS5oZWlnaHQgPz8KICAgICAgY29uZmlnX3NwYW5zLmhlaWdodC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUuaGVpZ2h0LAogIH0pOwogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIGNvbnN0IHZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNzeltrZXldOwogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSB2YWwgKyAicHgiOwogICAgaWYgKGtleSA9PT0gIndpZHRoIikgewogICAgICBDTElQQk9BUkRfSEVBREVSLnN0eWxlW2tleV0gPSBDT05UQUlORVIuc3R5bGVba2V5XTsKICAgIH0KICB9CiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCBmYWxzZSk7CiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICJtb3VzZWRvd24iLAogICAgKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoIi5wbHV0b3Bsb3RseS1jb250YWluZXIiKSAhPT0gQ09OVEFJTkVSKSB7CiAgICAgICAgdW5wb3BfY29udGFpbmVyKCk7CiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwKICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9CiAgKTsKfQoKQ09OVEFJTkVSLnBvcE91dCA9IHBvcG91dF9jb250YWluZXI7CgpmdW5jdGlvbiBEdWFsQ2xpY2soc2luZ2xlX2Z1bmMsIGRibF9mdW5jKSB7CiAgbGV0IG5jbGlja3MgPSAwOwogIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykgewogICAgbmNsaWNrcyArPSAxOwogICAgaWYgKG5jbGlja3MgPiAxKSB7CiAgICAgIGRibF9mdW5jKC4uLmFyZ3MpOwogICAgICBuY2xpY2tzID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIGRlbGF5KDMwMCkudGhlbigoKSA9PiB7CiAgICAgICAgaWYgKG5jbGlja3MgPT0gMSkgewogICAgICAgICAgc2luZ2xlX2Z1bmMoLi4uYXJncyk7CiAgICAgICAgfQogICAgICAgIG5jbGlja3MgPSAwOwogICAgICB9KTsKICAgIH0KICB9Owp9CgovLyBXZSByZW1vdmUgdGhlIGRlZmF1bHQgZG93bmxvYWQgaW1hZ2UgYnV0dG9uCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSwKICBbInRvSW1hZ2UiXQopOwovLyBXZSBhZGQgdGhlIGN1c3RvbSBidXR0b24gdG8gdGhlIG1vZGViYXIKcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9BZGQgPSBfLnVuaW9uKAogIHBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkLAogIFsKICAgIHsKICAgICAgbmFtZTogIkNvcHkgUE5HIHRvIENsaXBib2FyZCIsCiAgICAgIGljb246IHsKICAgICAgICBoZWlnaHQ6IDUyMCwKICAgICAgICB3aWR0aDogNTIwLAogICAgICAgIHBhdGg6ICJNMjgwIDY0aDQwYzM1LjMgMCA2NCAyOC43IDY0IDY0VjQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEg2NGMtMzUuMyAwLTY0LTI4LjctNjQtNjRWMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0aDQwIDkuNkMxMjEgMjcuNSAxNTMuMyAwIDE5MiAwczcxIDI3LjUgNzguNCA2NEgyODB6TTY0IDExMmMtOC44IDAtMTYgNy4yLTE2IDE2VjQ0OGMwIDguOCA3LjIgMTYgMTYgMTZIMzIwYzguOCAwIDE2LTcuMiAxNi0xNlYxMjhjMC04LjgtNy4yLTE2LTE2LTE2SDMwNHYyNGMwIDEzLjMtMTAuNyAyNC0yNCAyNEgxOTIgMTA0Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNFYxMTJINjR6bTEyOC04YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHoiLAogICAgICB9LAogICAgICBkaXJlY3Rpb246ICJ1cCIsCiAgICAgIGNsaWNrOiBEdWFsQ2xpY2soY29weUltYWdlVG9DbGlwYm9hcmQsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKCk7CiAgICAgIH0pLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIkRvd25sb2FkIEltYWdlIiwKICAgICAgaWNvbjogUGxvdGx5Lkljb25zLmNhbWVyYSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKHNhdmVJbWFnZVRvRmlsZSwgKCkgPT4gewogICAgICAgIHBvcG91dF9jb250YWluZXIoeyBjbDogImZpbGVzYXZlIiB9KTsKICAgICAgfSksCiAgICB9LAogIF0KKTsKCmZ1bmN0aW9uIGdldE9mZnNldERhdGEoZWwpIHsKICBsZXQgY3MgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgbnVsbCk7CiAgY29uc3Qgb2RhdGEgPSB7CiAgICBwYWRkaW5nOiB7CiAgICAgIGxlZnQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCksCiAgICAgIGJvdHRvbTogcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MucGFkZGluZ0xlZnQpICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQpLAogICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1RvcCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20pLAogICAgfSwKICAgIGJvcmRlcjogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCksCiAgICAgIHJpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclJpZ2h0V2lkdGgpLAogICAgICB0b3A6IHBhcnNlRmxvYXQoY3MuYm9yZGVyVG9wV2lkdGgpLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgICB3aWR0aDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpICsgcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGgpLAogICAgfQogIH07CiAgaWYgKGVsID09PSBQTE9UKSB7CiAgICAvLyBGb3IgdGhlIFBMT1Qgd2UgYWxzbyB3YW50IHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBvZmZzZXQKICAgIG9kYXRhLm9mZnNldCA9IHsKICAgICAgdG9wOiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldFRvcCA6IDAsCiAgICAgIGxlZnQ6IFBMT1Qub2Zmc2V0UGFyZW50ID09IENPTlRBSU5FUiA/IFBMT1Qub2Zmc2V0TGVmdCA6IDAsCiAgICB9CiAgfQogIHJldHVybiBvZGF0YTsKfQpmdW5jdGlvbiBnZXRTaXplRGF0YSgpIHsKICBjb25zdCBkYXRhID0gewogICAgcGxvdF9wYWQ6IGdldE9mZnNldERhdGEoUExPVCksCiAgICBwbG90X3JlY3Q6IFBMT1QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgICBjb250YWluZXJfcGFkOiBnZXRPZmZzZXREYXRhKENPTlRBSU5FUiksCiAgICBjb250YWluZXJfcmVjdDogQ09OVEFJTkVSLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogIH07CiAgcmV0dXJuIGRhdGE7Cn0KZnVuY3Rpb24gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGNvbnN0IGNvbXB1dGVkX3NpemUgPSBjb21wdXRlUGxvdFNpemUoc2l6ZURhdGEpOwogIGNvbnN0IG9mZnNldHMgPSBjb21wdXRlZF9zaXplLm9mZnNldHM7CgogIGNvbnN0IHBsb3RfZGF0YSA9IHsKICAgIHdpZHRoOiB3aWR0aCA/PyBjb21wdXRlZF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiBoZWlnaHQgPz8gY29tcHV0ZWRfc2l6ZS5oZWlnaHQsCiAgfTsKCiAgcmV0dXJuIHsKICAgIHdpZHRoOiAod2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCkgKyBvZmZzZXRzLndpZHRoLAogICAgaGVpZ2h0OiAoaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0KSArIG9mZnNldHMuaGVpZ2h0LAogICAgbm9DaGFuZ2U6IHdpZHRoID09IGNvbXB1dGVkX3NpemUud2lkdGggJiYgaGVpZ2h0ID09IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH0KfQoKLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGNoYW5nZSB0aGUgY29udGFpbmVyIHNpemUgc28gdGhhdCB0aGUgcmVzdWx0aW5nIHBsb3Qgd2lsbCBiZSBtYXRjaGluZyB0aGUgcHJvdmlkZWQgc3BlY3MKZnVuY3Rpb24gY2hhbmdlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpKSB7CiAgaWYgKCFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgY29uc29sZS5sb2coIlRyaWVkIHRvIGNoYW5nZSBjb250YWluZXIgc2l6ZSB3aGVuIG5vdCBwb3BwZWQsIGlnbm9yaW5nIik7CiAgICByZXR1cm47CiAgfQoKICBjb25zdCBjc3ogPSBjb21wdXRlQ29udGFpbmVyU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSwgc2l6ZURhdGEpOwoKICBpZiAoY3N6Lm5vQ2hhbmdlKSB7CiAgICBjb25zb2xlLmxvZygiU2l6ZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50LCBpZ25vcmluZyIpOwogICAgcmV0dXJuCiAgfQogIC8vIFdlIGFyZSBub3cgZ29pbmcgdG8gc2V0IGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGNvbnRhaW5lcgogIGZvciAoY29uc3Qga2V5IG9mIFsid2lkdGgiLCAiaGVpZ2h0Il0pIHsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gY3N6W2tleV0gKyAicHgiOwogIH0KfQovLyBXZSBub3cgY3JlYXRlIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgdXBkYXRlIHRoZSBwbG90IGJhc2VkIG9uIHRoZSB2YWx1ZXMgc3BlY2lmaWVkCmZ1bmN0aW9uIHVwZGF0ZUZyb21IZWFkZXIoKSB7CiAgY29uc3QgaGVhZGVyX2RhdGEgPSB7CiAgICBoZWlnaHQ6IGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUsCiAgICB3aWR0aDogY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlLAogIH07CiAgY2hhbmdlQ29udGFpbmVyU2l6ZShoZWFkZXJfZGF0YSk7Cn0KLy8gV2UgYXNzaWduIHRoaXMgZnVuY3Rpb24gdG8gdGhlIG9uYmx1ciBldmVudCBvZiB3aWR0aCBhbmQgaGVpZ2h0CmlmIChmaXJzdFJ1bikgewogIGZvciAoY29uc3QgY29udGFpbmVyIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLnVpX3NwYW4ub25ibHVyID0gKGUpID0+IHsKICAgICAgY29udGFpbmVyLnVpX3ZhbHVlID0gY29udGFpbmVyLnVpX3NwYW4udGV4dENvbnRlbnQ7CiAgICAgIHVwZGF0ZUZyb21IZWFkZXIoKTsKICAgIH07CiAgfQp9Ci8vIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIHBsb3Qgc2l6ZSB0byB1c2UgZm9yIHJlbGF5b3V0IGFzIGEgZnVuY3Rpb24gb2YgdGhlIGNvbnRhaW5lciBzaXplCmZ1bmN0aW9uIGNvbXB1dGVQbG90U2l6ZShkYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIC8vIFJlbW92ZSBQYWRkaW5nCiAgY29uc3QgeyBjb250YWluZXJfcGFkLCBwbG90X3BhZCwgY29udGFpbmVyX3JlY3QgfSA9IGRhdGE7CiAgY29uc3Qgb2Zmc2V0cyA9IHsKICAgIHdpZHRoOgogICAgICBwbG90X3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLndpZHRoICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LmxlZnQgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcud2lkdGggKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci53aWR0aCwKICAgIGhlaWdodDoKICAgICAgcGxvdF9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBwbG90X3BhZC5ib3JkZXIuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQub2Zmc2V0LnRvcCArCiAgICAgIGNvbnRhaW5lcl9wYWQucGFkZGluZy5oZWlnaHQgKwogICAgICBjb250YWluZXJfcGFkLmJvcmRlci5oZWlnaHQsCiAgfTsKICBjb25zdCBzeiA9IHsKICAgIHdpZHRoOiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LndpZHRoIC0gb2Zmc2V0cy53aWR0aCksCiAgICBoZWlnaHQ6IE1hdGgucm91bmQoY29udGFpbmVyX3JlY3QuaGVpZ2h0IC0gb2Zmc2V0cy5oZWlnaHQpLAogICAgb2Zmc2V0cywKICB9OwogIHJldHVybiBzejsKfQoKLy8gQ3JlYXRlIHRoZSByZXNpemVPYnNlcnZlciB0byBtYWtlIHRoZSBwbG90IGV2ZW4gbW9yZSByZXNwb25zaXZlISA6bWFnaWM6CmNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7CiAgY29uc3Qgc2l6ZURhdGEgPSBnZXRTaXplRGF0YSgpOwogIGNvbnN0IHtjb250YWluZXJfcmVjdCwgY29udGFpbmVyX3BhZH0gPSBzaXplRGF0YTsKICBsZXQgcGxvdF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICAvLyBXZSBzYXZlIHRoZSBoZWlnaHQgaW4gdGhlIFBMT1Qgb2JqZWN0CiAgUExPVC5jb250YWluZXJfaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0OwogIC8vIFdlIGRlYWwgd2l0aCBzb21lIHN0dWZmIGlmIHRoZSBjb250YWluZXIgaXMgcG9wcHBlZAogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUud2lkdGggPSBjb250YWluZXJfcmVjdC53aWR0aCArICJweCI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gY29udGFpbmVyX3JlY3QubGVmdCArICJweCI7CiAgY29uZmlnX3NwYW5zLmhlaWdodC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS5oZWlnaHQ7CiAgY29uZmlnX3NwYW5zLndpZHRoLnVpX3ZhbHVlID0gcGxvdF9zaXplLndpZHRoOwogIC8qIAoJCVRoZSBhZGRpdGlvbiBvZiB0aGUgaW52YWxpZCBhcmd1bWVudCBgcGx1dG9yZXNpemVgIHNlZW1zIHRvIGZpeCB0aGUgcHJvYmxlbSB3aXRoIGNhbGxpbmcgYHJlbGF5b3V0YCBzaW1wbHkgd2l0aCBge2F1dG9zaXplOiB0cnVlfWAgYXMgdXBkYXRlIGJyZWFraW5nIG1vdXNlIHJlbGF5b3V0IGV2ZW50cyB0cmFja2luZy4gCgkJU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wbG90bHkvcGxvdGx5LmpzL2lzc3Vlcy82MTU2IGZvciBkZXRhaWxzCgkJKi8KICBsZXQgY29uZmlnID0gewogICAgLy8gSWYgdGhpcyBpcyBwb3BwZWQgb3V0LCB3ZSBpZ25vcmUgdGhlIG9yaWdpbmFsIHdpZHRoL2hlaWdodAogICAgd2lkdGg6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX3dpZHRoKSA/PyBwbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6IChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsX2hlaWdodCkgPz8gcGxvdF9zaXplLmhlaWdodCwKICAgIHBsdXRvcmVzaXplOiB0cnVlLAogIH07CiAgUGxvdGx5LnJlbGF5b3V0KFBMT1QsIGNvbmZpZykudGhlbigoKSA9PiB7CiAgICBpZiAocmVtb3ZlX2NvbnRhaW5lcl9zaXplICYmICFDT05UQUlORVIuaXNQb3BwZWRPdXQoKSkgewogICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBhdm9pZCB0aGUgZmlyc3QgcmVzaXplIHVwb24gcGxvdCBjcmVhdGlvbiB0byBhbHJlYWR5IGJlIHdpdGhvdXQgYSBmaXhlZCBoZWlnaHQKICAgICAgQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9ICIiOwogICAgICBDT05UQUlORVIuc3R5bGUud2lkdGggPSAiIjsKICAgICAgcmVtb3ZlX2NvbnRhaW5lcl9zaXplID0gZmFsc2U7CiAgICB9CiAgfSk7Cn0pOwoKcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShDT05UQUlORVIpOwoKClBsb3RseS5yZWFjdChQTE9ULCBwbG90X29iaikudGhlbigoKSA9PiB7CgkvLyBBc3NpZ24gdGhlIFBsb3RseSBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhwbG90bHlfbGlzdGVuZXJzKSkgewoJCWZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJfdmVjKSB7CgkJCVBMT1Qub24oa2V5LCBsaXN0ZW5lcikKCQl9Cgl9CgkvLyBBc3NpZ24gdGhlIEpTIGV2ZW50IGxpc3RlbmVycwoJZm9yIChjb25zdCBba2V5LCBsaXN0ZW5lcl92ZWNdIG9mIE9iamVjdC5lbnRyaWVzKGpzX2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULmFkZEV2ZW50TGlzdGVuZXIoa2V5LCBsaXN0ZW5lciwgewoJCQkJc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbAoJCQl9KQoJCX0KCX0KfQopCgoKaW52YWxpZGF0aW9uLnRoZW4oKCkgPT4gewoJLy8gUmVtb3ZlIGFsbCBwbG90bHkgbGlzdGVuZXJzCglQTE9ULnJlbW92ZUFsbExpc3RlbmVycygpCgkvLyBSZW1vdmUgYWxsIEpTIGxpc3RlbmVycwoJY29udHJvbGxlci5hYm9ydCgpCgkvLyBSZW1vdmUgdGhlIHJlc2l6ZU9ic2VydmVyCglyZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCkKfSkKCgoKCQlyZXR1cm4gQ09OVEFJTkVSCgk8L3NjcmlwdD4KpG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv8gm8SN9sHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQwYjZjMWY3Mi1iMDQwLTQ4M2MtOTY5Yi04OGJmZTA5YjMyYzO5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc8AAAABL1RPx7VwdWJsaXNoZWRfb2JqZWN0X2tleXOR2TVlZDI3ZGUxYS04MWQ5LTExZWYtM2I3My0xYjExNjMxMmRhZTcvZWIwNGJiMTkxNDExYjdjObhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQ3ODkwZjgxZS1jYjE1LTQ4ZDItYTgwYy05ZDczZjk1MTYwNTaKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52gKtPGRpdiBjbGFzcz0ibWFya2Rvd24iPjx1bD4KPGxpPjxwPjxjb2RlPkNNUkE8L2NvZGU+ICYjNDA7c2hvdy9oaWRlIGNvZGUmIzQxOzwvcD4KPC9saT4KPC91bD4KPHByZT48Y29kZSBjbGFzcz0ibGFuZ3VhZ2UtanVsaWEiPiMgU2VxIGluaXQKc2VxICYjNjE7IFNlcXVlbmNlJiM0MDsmIzQxOwpmb3IgaGIgJiM2MTsgMSA6IGR1bW15X2hlYXJ0X2JlYXRzICYjNDM7IDEKCSMgR2VuZXJhdGluZyBzZXEgYmxvY2tzCgl0MnAgJiM2MTsgVDJwcmVwJiM0MDtUMnByZXBfZHVyYXRpb24mIzQxOwoJZmF0c2F0ICYjNjE7IEZhdFNhdCYjNDA7RmF0U2F0X2ZsaXBfYW5nbGUsIGZhdF9mcmVxJiM0MTsKCWJzc2ZwICYjNjE7IGJTU0ZQJiM0MDtpTkFWX2xpbmVzLCBpbV9zZWdtZW50cywgaU5BVl9mbGlwX2FuZ2xlLCBpbV9mbGlwX2FuZ2xlJiM0MTsKCSMgQ29uY2F0ZW5hdGluZyBzZXEgYmxvY2tzCglzZXEgJiM0MzsmIzYxOyB0MnAKCXNlcSAmIzQzOyYjNjE7IGZhdHNhdAoJc2VxICYjNDM7JiM2MTsgYnNzZnAKCSMgUlIgaW50ZXJ2YWwgY29uc2lkZXJhdGlvbgoJUlJkZWxheSAmIzYxOyBSUiAgLSBkdXImIzQwO2Jzc2ZwJiM0MTsgLSBkdXImIzQwO3QycCYjNDE7IC0gZHVyJiM0MDtmYXRzYXQmIzQxOwoJc2VxICYjNDM7JiM2MTsgRGVsYXkmIzQwO1JSZGVsYXkmIzQxOwplbmQ8L2NvZGU+PC9wcmU+CjwvZGl2PqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b/IHoASBrBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkNzg5MGY4MWUtY2IxNS00OGQyLWE4MGMtOWQ3M2Y5NTE2MDU2uWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAEZUlLVwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDFiYjNlNDliLTFhMTktNDM0My1hYzA5LWZiYWYxY2FlNGJhM4qmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnaTYw8c2NyaXB0PgoJCi8vIExvYWQgdGhlIGxpYnJhcnkgZm9yIGNvbnNpc3RlbnQgc21vb3RoIHNjcm9sbGluZwpjb25zdCB7ZGVmYXVsdDogc2Nyb2xsSW50b1ZpZXd9ID0gYXdhaXQgaW1wb3J0KCJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsZG1GeUlGRTlaVDArSW05aWFtVmpkQ0k5UFhSNWNHVnZaaUJsSmladWRXeHNJVDFsSmlZeFBUMDlaUzV1YjJSbFZIbHdaU3hWUFNobExIUXBQVDRvSVhSOGZDSm9hV1JrWlc0aUlUMDlaU2ttSmlKMmFYTnBZbXhsSWlFOVBXVW1KaUpqYkdsd0lpRTlQV1VzUVQwb1pTeDBLVDArZTJsbUtHVXVZMnhwWlc1MFNHVnBaMmgwUEdVdWMyTnliMnhzU0dWcFoyaDBmSHhsTG1Oc2FXVnVkRmRwWkhSb1BHVXVjMk55YjJ4c1YybGtkR2dwZTJ4bGRDQnNQV2RsZEVOdmJYQjFkR1ZrVTNSNWJHVW9aU3h1ZFd4c0tUdHlaWFIxY200Z1ZTaHNMbTkyWlhKbWJHOTNXU3gwS1h4OFZTaHNMbTkyWlhKbWJHOTNXQ3gwS1h4OEtHVTlQbnRzWlhRZ2REMG9aVDArZTJsbUtDRmxMbTkzYm1WeVJHOWpkVzFsYm5SOGZDRmxMbTkzYm1WeVJHOWpkVzFsYm5RdVpHVm1ZWFZzZEZacFpYY3BjbVYwZFhKdUlHNTFiR3c3ZEhKNWUzSmxkSFZ5YmlCbExtOTNibVZ5Ukc5amRXMWxiblF1WkdWbVlYVnNkRlpwWlhjdVpuSmhiV1ZGYkdWdFpXNTBmV05oZEdOb2UzSmxkSFZ5YmlCdWRXeHNmWDBwS0dVcE8zSmxkSFZ5YmlFaGRDWW1LSFF1WTJ4cFpXNTBTR1ZwWjJoMFBHVXVjMk55YjJ4c1NHVnBaMmgwZkh4MExtTnNhV1Z1ZEZkcFpIUm9QR1V1YzJOeWIyeHNWMmxrZEdncGZTa29aU2w5Y21WMGRYSnVJVEY5TEZnOUtHVXNkQ3hzTEc4c2JpeHlMR2tzY3lrOVBuSThaU1ltYVQ1MGZIeHlQbVVtSm1rOGREOHdPbkk4UFdVbUpuTThQV3g4ZkdrK1BYUW1Kbk0rUFd3L2NpMWxMVzg2YVQ1MEppWnpQR3g4ZkhJOFpTWW1jejVzUDJrdGRDdHVPakFzSkQxbFBUNWxMbkJoY21WdWRFVnNaVzFsYm5RL1B5aGxMbWRsZEZKdmIzUk9iMlJsS0NrdWFHOXpkSHg4Ym5Wc2JDa3NkSFE5S0dVc2RDazlQbnQyWVhJZ2JDeHZMRzRzY2p0cFppaDBlWEJsYjJZZ1pHOWpkVzFsYm5RK0luVWlLWEpsZEhWeWJsdGRPMnhsZEh0elkzSnZiR3hOYjJSbE9ta3NZbXh2WTJzNmN5eHBibXhwYm1VNllTeGliM1Z1WkdGeWVUcG9MSE5yYVhCUGRtVnlabXh2ZDBocFpHUmxia1ZzWlcxbGJuUnpPblY5UFhRc1p6MGlablZ1WTNScGIyNGlQVDEwZVhCbGIyWWdhRDlvT21VOVBtVWhQVDFvTzJsbUtDRlJLR1VwS1hSb2NtOTNJRlI1Y0dWRmNuSnZjaWdpU1c1MllXeHBaQ0IwWVhKblpYUWlLVHRzWlhRZ2RqMWtiMk4xYldWdWRDNXpZM0p2Ykd4cGJtZEZiR1Z0Wlc1MGZIeGtiMk4xYldWdWRDNWtiMk4xYldWdWRFVnNaVzFsYm5Rc2JUMWJYU3gzUFdVN1ptOXlLRHRSS0hjcEppWm5LSGNwT3lsN2FXWW9LSGM5SkNoM0tTazlQVDEyS1h0dExuQjFjMmdvZHlrN1luSmxZV3Q5Ym5Wc2JDRTlkeVltZHowOVBXUnZZM1Z0Wlc1MExtSnZaSGttSmtFb2R5a21KaUZCS0dSdlkzVnRaVzUwTG1SdlkzVnRaVzUwUld4bGJXVnVkQ2w4Zkc1MWJHd2hQWGNtSmtFb2R5eDFLU1ltYlM1d2RYTm9LSGNwZld4bGRDQlhQVzUxYkd3aFBTaHZQVzUxYkd3OVBTaHNQWGRwYm1SdmR5NTJhWE4xWVd4V2FXVjNjRzl5ZENrL2RtOXBaQ0F3T213dWQybGtkR2dwUDI4NmFXNXVaWEpYYVdSMGFDeElQVzUxYkd3aFBTaHlQVzUxYkd3OVBTaHVQWGRwYm1SdmR5NTJhWE4xWVd4V2FXVjNjRzl5ZENrL2RtOXBaQ0F3T200dWFHVnBaMmgwS1Q5eU9tbHVibVZ5U0dWcFoyaDBMSHR6WTNKdmJHeFlPbDhzYzJOeWIyeHNXVHA0ZlQxM2FXNWtiM2NzZTJobGFXZG9kRHBGTEhkcFpIUm9PbFFzZEc5d09rNHNjbWxuYUhRNlRDeGliM1IwYjIwNldTeHNaV1owT2tOOVBXVXVaMlYwUW05MWJtUnBibWREYkdsbGJuUlNaV04wS0Nrc1VqMGljM1JoY25RaVBUMDljM3g4SW01bFlYSmxjM1FpUFQwOWN6OU9PaUpsYm1RaVBUMDljejlaT2s0clJTOHlMRlk5SW1ObGJuUmxjaUk5UFQxaFAwTXJWQzh5T2lKbGJtUWlQVDA5WVQ5TU9rTXNRajFiWFR0bWIzSW9iR1YwSUVROU1EdEVQRzB1YkdWdVozUm9PMFFyS3lsN2JHVjBJRTg5YlZ0RVhTeDdhR1ZwWjJoME9tb3NkMmxrZEdnNlNTeDBiM0E2VXl4eWFXZG9kRHB4TEdKdmRIUnZiVHA2TEd4bFpuUTZSbjA5VHk1blpYUkNiM1Z1WkdsdVowTnNhV1Z1ZEZKbFkzUW9LVHRwWmlnaWFXWXRibVZsWkdWa0lqMDlQV2ttSms0K1BUQW1Ka00rUFRBbUpsazhQVWdtSmt3OFBWY21KazQrUFZNbUpsazhQWG9tSmtNK1BVWW1Ka3c4UFhFcFluSmxZV3M3YkdWMElFYzlaMlYwUTI5dGNIVjBaV1JUZEhsc1pTaFBLU3hLUFhCaGNuTmxTVzUwS0VjdVltOXlaR1Z5VEdWbWRGZHBaSFJvTERFd0tTeExQWEJoY25ObFNXNTBLRWN1WW05eVpHVnlWRzl3VjJsa2RHZ3NNVEFwTEZBOWNHRnljMlZKYm5Rb1J5NWliM0prWlhKU2FXZG9kRmRwWkhSb0xERXdLU3hhUFhCaGNuTmxTVzUwS0VjdVltOXlaR1Z5UW05MGRHOXRWMmxrZEdnc01UQXBMR1ZsUFRBc1pYUTlNQ3hsYkQwaWIyWm1jMlYwVjJsa2RHZ2lhVzRnVHo5UExtOW1abk5sZEZkcFpIUm9MVTh1WTJ4cFpXNTBWMmxrZEdndFNpMVFPakFzWlc4OUltOW1abk5sZEVobGFXZG9kQ0pwYmlCUFAwOHViMlptYzJWMFNHVnBaMmgwTFU4dVkyeHBaVzUwU0dWcFoyaDBMVXN0V2pvd0xHVnVQU0p2Wm1aelpYUlhhV1IwYUNKcGJpQlBQekE5UFQxUExtOW1abk5sZEZkcFpIUm9QekE2U1M5UExtOW1abk5sZEZkcFpIUm9PakFzWlhJOUltOW1abk5sZEVobGFXZG9kQ0pwYmlCUFB6QTlQVDFQTG05bVpuTmxkRWhsYVdkb2REOHdPbW92VHk1dlptWnpaWFJJWldsbmFIUTZNRHRwWmloMlBUMDlUeWxsWlQwaWMzUmhjblFpUFQwOWN6OVNPaUpsYm1RaVBUMDljejlTTFVnNkltNWxZWEpsYzNRaVBUMDljejlZS0hnc2VDdElMRWdzU3l4YUxIZ3JVaXg0SzFJclJTeEZLVHBTTFVndk1peGxkRDBpYzNSaGNuUWlQVDA5WVQ5V09pSmpaVzUwWlhJaVBUMDlZVDlXTFZjdk1qb2laVzVrSWowOVBXRS9WaTFYT2xnb1h5eGZLMWNzVnl4S0xGQXNYeXRXTEY4clZpdFVMRlFwTEdWbFBVMWhkR2d1YldGNEtEQXNaV1VyZUNrc1pYUTlUV0YwYUM1dFlYZ29NQ3hsZEN0ZktUdGxiSE5sZTJWbFBTSnpkR0Z5ZENJOVBUMXpQMUl0VXkxTE9pSmxibVFpUFQwOWN6OVNMWG9yV2l0bGJ6b2libVZoY21WemRDSTlQVDF6UDFnb1V5eDZMR29zU3l4YUsyVnZMRklzVWl0RkxFVXBPbEl0S0ZNcmFpOHlLU3RsYnk4eUxHVjBQU0p6ZEdGeWRDSTlQVDFoUDFZdFJpMUtPaUpqWlc1MFpYSWlQVDA5WVQ5V0xTaEdLMGt2TWlrclpXd3ZNam9pWlc1a0lqMDlQV0UvVmkxeEsxQXJaV3c2V0NoR0xIRXNTU3hLTEZBclpXd3NWaXhXSzFRc1ZDazdiR1YwZTNOamNtOXNiRXhsWm5RNlpXa3NjMk55YjJ4c1ZHOXdPbVZrZlQxUE8yVmxQVTFoZEdndWJXRjRLREFzVFdGMGFDNXRhVzRvWldRclpXVXZaWElzVHk1elkzSnZiR3hJWldsbmFIUXRhaTlsY2l0bGJ5a3BMR1YwUFUxaGRHZ3ViV0Y0S0RBc1RXRjBhQzV0YVc0b1pXa3JaWFF2Wlc0c1R5NXpZM0p2Ykd4WGFXUjBhQzFKTDJWdUsyVnNLU2tzVWlzOVpXUXRaV1VzVmlzOVpXa3RaWFI5UWk1d2RYTm9LSHRsYkRwUExIUnZjRHBsWlN4c1pXWjBPbVYwZlNsOWNtVjBkWEp1SUVKOUxHWTlaVDArZTNaaGNpQjBPM0psZEhWeWJpRXhQVDA5WlQ5N1lteHZZMnM2SW1WdVpDSXNhVzVzYVc1bE9pSnVaV0Z5WlhOMEluMDZLSFE5WlNrOVBUMVBZbXBsWTNRb2RDa21KakFoUFQxUFltcGxZM1F1YTJWNWN5aDBLUzVzWlc1bmRHZy9aVHA3WW14dlkyczZJbk4wWVhKMElpeHBibXhwYm1VNkltNWxZWEpsYzNRaWZYMDdablZ1WTNScGIyNGdZeWhsTEhRcGUzWmhjaUJzTzJsbUtDRmxMbWx6UTI5dWJtVmpkR1ZrZkh3aEtHVTlQbnRzWlhRZ2REMWxPMlp2Y2lnN2RDWW1kQzV3WVhKbGJuUk9iMlJsT3lsN2FXWW9kQzV3WVhKbGJuUk9iMlJsUFQwOVpHOWpkVzFsYm5RcGNtVjBkWEp1SVRBN2REMTBMbkJoY21WdWRFNXZaR1VnYVc1emRHRnVZMlZ2WmlCVGFHRmtiM2RTYjI5MFAzUXVjR0Z5Wlc1MFRtOWtaUzVvYjNOME9uUXVjR0Z5Wlc1MFRtOWtaWDF5WlhSMWNtNGhNWDBwS0dVcEtYSmxkSFZ5Ymp0cFppZ2liMkpxWldOMElqMDlkSGx3Wlc5bUtHdzlkQ2ttSmlKbWRXNWpkR2x2YmlJOVBYUjVjR1Z2WmlCc0xtSmxhR0YyYVc5eUtYSmxkSFZ5YmlCMExtSmxhR0YyYVc5eUtIUjBLR1VzZENrcE8yeGxkQ0J2UFNKaWIyOXNaV0Z1SWowOWRIbHdaVzltSUhSOGZHNTFiR3c5UFhRL2RtOXBaQ0F3T25RdVltVm9ZWFpwYjNJN1ptOXlLR3hsZEh0bGJEcHVMSFJ2Y0RweUxHeGxablE2YVgxdlppQjBkQ2hsTEdZb2RDa3BLVzR1YzJOeWIyeHNLSHQwYjNBNmNpeHNaV1owT21rc1ltVm9ZWFpwYjNJNmIzMHBmWFpoY2lCa0xIQTlLQ2s5UGloa2ZId29aRDBpY0dWeVptOXliV0Z1WTJVaWFXNGdkMmx1Wkc5M1AzQmxjbVp2Y20xaGJtTmxMbTV2ZHk1aWFXNWtLSEJsY21admNtMWhibU5sS1RwRVlYUmxMbTV2ZHlrc1pDZ3BLVHRtZFc1amRHbHZiaUJpS0dVcGUyeGxkQ0IwUFUxaGRHZ3ViV2x1S0Nod0tDa3RaUzV6ZEdGeWRGUnBiV1VwTDJVdVpIVnlZWFJwYjI0c01Ta3NiRDFsTG1WaGMyVW9kQ2tzYnoxbExuTjBZWEowV0Nzb1pTNTRMV1V1YzNSaGNuUllLU3BzTEc0OVpTNXpkR0Z5ZEZrcktHVXVlUzFsTG5OMFlYSjBXU2txYkR0bExtMWxkR2h2WkNodkxHNHNkQ3hzS1N4dklUMDlaUzU0Zkh4dUlUMDlaUzU1UDNKbGNYVmxjM1JCYm1sdFlYUnBiMjVHY21GdFpTZ29LVDArWWlobEtTazZaUzVqWWlncGZXWjFibU4wYVc5dUlIa29aU3gwTEd3cGUyeGxkQ0J2UFdGeVozVnRaVzUwY3k1c1pXNW5kR2crTXlZbWRtOXBaQ0F3SVQwOVlYSm5kVzFsYm5Seld6TmRQMkZ5WjNWdFpXNTBjMXN6WFRvMk1EQXNiajFoY21kMWJXVnVkSE11YkdWdVozUm9QalFtSm5admFXUWdNQ0U5UFdGeVozVnRaVzUwYzFzMFhUOWhjbWQxYldWdWRITmJORjA2WlQwK01Tc3RMV1VxWlNwbEttVXFaU3h5UFdGeVozVnRaVzUwY3k1c1pXNW5kR2crTlQ5aGNtZDFiV1Z1ZEhOYk5WMDZkbTlwWkNBd0xHazlZWEpuZFcxbGJuUnpMbXhsYm1kMGFENDJQMkZ5WjNWdFpXNTBjMXMyWFRwMmIybGtJREFzY3oxbExuTmpjbTlzYkV4bFpuUXNZVDFsTG5OamNtOXNiRlJ2Y0R0aUtIdHpZM0p2Ykd4aFlteGxPbVVzYldWMGFHOWtLSFFzYkN4dkxHNHBlMnhsZENCeVBVMWhkR2d1WTJWcGJDaDBLU3h6UFUxaGRHZ3VZMlZwYkNoc0tUdGxMbk5qY205c2JFeGxablE5Y2l4bExuTmpjbTlzYkZSdmNEMXpMR2svTGloN2RHRnlaMlYwT21Vc1pXeGhjSE5sWkRwdkxIWmhiSFZsT200c2JHVm1kRHB5TEhSdmNEcHpmU2w5TEhOMFlYSjBWR2x0WlRwd0tDa3NjM1JoY25SWU9uTXNjM1JoY25SWk9tRXNlRHAwTEhrNmJDeGtkWEpoZEdsdmJqcHZMR1ZoYzJVNmJpeGpZanB5ZlNsOWRtRnlJRTA5WlQwK1pTWW1JV1V1WW1Wb1lYWnBiM0o4ZkNKemJXOXZkR2dpUFQwOVpTNWlaV2hoZG1sdmNpeHJQV1oxYm1OMGFXOXVLR1VzZENsN2JHVjBJR3c5ZEh4OGUzMDdjbVYwZFhKdUlFMG9iQ2svWXlobExIdGliRzlqYXpwc0xtSnNiMk5yTEdsdWJHbHVaVHBzTG1sdWJHbHVaU3h6WTNKdmJHeE5iMlJsT213dWMyTnliMnhzVFc5a1pTeGliM1Z1WkdGeWVUcHNMbUp2ZFc1a1lYSjVMSE5yYVhCUGRtVnlabXh2ZDBocFpHUmxia1ZzWlcxbGJuUnpPbXd1YzJ0cGNFOTJaWEptYkc5M1NHbGtaR1Z1Uld4bGJXVnVkSE1zWW1Wb1lYWnBiM0k2WlQwK1VISnZiV2x6WlM1aGJHd29aUzV5WldSMVkyVW9LR1VzZENrOVBudHNaWFI3Wld3NmJ5eHNaV1owT200c2RHOXdPbko5UFhRc2FUMXZMbk5qY205c2JFeGxablFzY3oxdkxuTmpjbTlzYkZSdmNEdHlaWFIxY200Z2FUMDlQVzRtSm5NOVBUMXlQMlU2V3k0dUxtVXNibVYzSUZCeWIyMXBjMlVvWlQwK2VTaHZMRzRzY2l4c0xtUjFjbUYwYVc5dUxHd3VaV0Z6WlN3b0tUMCtaU2g3Wld3NmJ5eHNaV1owT2x0cExHNWRMSFJ2Y0RwYmN5eHlYWDBwTEd3dWIyNVRZM0p2Ykd4RGFHRnVaMlVwS1YxOUxGdGRLU2w5S1RwUWNtOXRhWE5sTG5KbGMyOXNkbVVvWXlobExIUXBLWDA3Wlhod2IzSjBlMnNnWVhNZ1pHVm1ZWFZzZEgwNyIpCgpjb25zdCBpbmRlbnQgPSB0cnVlCmNvbnN0IGFzaWRlID0gdHJ1ZQpjb25zdCB0aXRsZV90ZXh0ID0gIlRhYmxlIG9mIENvbnRlbnRzIgpjb25zdCBpbmNsdWRlX2RlZmluaXRpb25zID0gZmFsc2UKCgpjb25zdCB0b2NOb2RlID0gaHRtbGA8bmF2IGNsYXNzPSJwbHV0b3VpLXRvYyI+Cgk8aGVhZGVyPgoJIDxzcGFuIGNsYXNzPSJ0b2MtdG9nZ2xlIG9wZW4tdG9jIj48L3NwYW4+CgkgPHNwYW4gY2xhc3M9InRvYy10b2dnbGUgY2xvc2VkLXRvYyI+PC9zcGFuPgoJICR7dGl0bGVfdGV4dH0KCTwvaGVhZGVyPgoJPHNlY3Rpb24+PC9zZWN0aW9uPgo8L25hdj5gCgp0b2NOb2RlLmNsYXNzTGlzdC50b2dnbGUoImFzaWRlIiwgYXNpZGUpCnRvY05vZGUuY2xhc3NMaXN0LnRvZ2dsZSgiaW5kZW50IiwgaW5kZW50KQoKCmNvbnN0IGdldFBhcmVudENlbGwgPSBlbCA9PiBlbC5jbG9zZXN0KCJwbHV0by1jZWxsIikKCmNvbnN0IGdldEhlYWRlcnMgPSAoKSA9PiB7Cgljb25zdCBkZXB0aCA9IE1hdGgubWF4KDEsIE1hdGgubWluKDYsIDMpKSAvLyBzaG91bGQgYmUgaW4gcmFuZ2UgMTo2Cgljb25zdCByYW5nZSA9IEFycmF5LmZyb20oe2xlbmd0aDogZGVwdGh9LCAoeCwgaSkgPT4gaSsxKSAvLyBbMSwgLi4uLCBkZXB0aF0KCQoJY29uc3Qgc2VsZWN0b3IgPSBbCgkJLi4uKGluY2x1ZGVfZGVmaW5pdGlvbnMgPyBbCgkJCWBwbHV0by1ub3RlYm9vayBwbHV0by1jZWxsIC5wbHV0by1kb2NzLWJpbmRpbmdgLCAKCQkJYHBsdXRvLW5vdGVib29rIHBsdXRvLWNlbGwgYXNzaWduZWU6bm90KDplbXB0eSlgLCAKCQldIDogW10pLAoJCS4uLnJhbmdlLm1hcChpID0+IGBwbHV0by1ub3RlYm9vayBwbHV0by1jZWxsIGgke2l9YCkKCV0uam9pbigiLCIpCglyZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSkuZmlsdGVyKGVsID0+IAoJCS8vIGV4Y2x1ZGUgaGVhZGVycyBpbnNpZGUgb2YgYSBwbHV0by1kb2NzLWJpbmRpbmcgYmxvY2sKCQkhKGVsLm5vZGVOYW1lLnN0YXJ0c1dpdGgoIkgiKSAmJiBlbC5jbG9zZXN0KCIucGx1dG8tZG9jcy1iaW5kaW5nIikpCgkpCn0KCgpjb25zdCBkb2N1bWVudF9jbGlja19oYW5kbGVyID0gKGV2ZW50KSA9PiB7Cgljb25zdCBwYXRoID0gKGV2ZW50LnBhdGggfHwgZXZlbnQuY29tcG9zZWRQYXRoKCkpCgljb25zdCB0b2MgPSBwYXRoLmZpbmQoZWxlbSA9PiBlbGVtPy5jbGFzc0xpc3Q/LmNvbnRhaW5zPy4oInRvYy10b2dnbGUiKSkKCWlmICh0b2MpIHsKCQlldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKQoJCXRvYy5jbG9zZXN0KCIucGx1dG91aS10b2MiKS5jbGFzc0xpc3QudG9nZ2xlKCJoaWRlIikKCX0KfQoKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBkb2N1bWVudF9jbGlja19oYW5kbGVyKQoKCmNvbnN0IGhlYWRlcl90b19pbmRleF9lbnRyeV9tYXAgPSBuZXcgTWFwKCkKY29uc3QgY3VycmVudGx5X2hpZ2hsaWdodGVkX3NldCA9IG5ldyBTZXQoKQoKY29uc3QgbGFzdF90b2NfZWxlbWVudF9jbGlja190aW1lID0geyBjdXJyZW50OiAwIH0KCmNvbnN0IGludGVyc2VjdGlvbl9jYWxsYmFjayA9IChpeHMpID0+IHsKCWxldCBvbl90b3AgPSBpeHMuZmlsdGVyKGl4ID0+IGl4LmludGVyc2VjdGlvblJhdGlvID4gMCAmJiBpeC5pbnRlcnNlY3Rpb25SZWN0LnkgPCBpeC5yb290Qm91bmRzLmhlaWdodCAvIDIpCglpZihvbl90b3AubGVuZ3RoID4gMCl7CgkJY3VycmVudGx5X2hpZ2hsaWdodGVkX3NldC5mb3JFYWNoKGEgPT4gYS5jbGFzc0xpc3QucmVtb3ZlKCJpbi12aWV3IikpCgkJY3VycmVudGx5X2hpZ2hsaWdodGVkX3NldC5jbGVhcigpCgkJb25fdG9wLnNsaWNlKDAsMSkuZm9yRWFjaChpID0+IHsKCQkJbGV0IGRpdiA9IGhlYWRlcl90b19pbmRleF9lbnRyeV9tYXAuZ2V0KGkudGFyZ2V0KQoJCQlkaXYuY2xhc3NMaXN0LmFkZCgiaW4tdmlldyIpCgkJCWN1cnJlbnRseV9oaWdobGlnaHRlZF9zZXQuYWRkKGRpdikKCQkJCgkJCS8vLyBzY3JvbGwgaW50byB2aWV3CgkJCS8qCgkJCWNvbnN0IHRvY19oZWlnaHQgPSB0b2NOb2RlLm9mZnNldEhlaWdodAoJCQljb25zdCBkaXZfcG9zID0gZGl2Lm9mZnNldFRvcAoJCQljb25zdCBkaXZfaGVpZ2h0ID0gZGl2Lm9mZnNldEhlaWdodAoJCQljb25zdCBjdXJyZW50X3Njcm9sbCA9IHRvY05vZGUuc2Nyb2xsVG9wCgkJCWNvbnN0IGhlYWRlcl9oZWlnaHQgPSB0b2NOb2RlLnF1ZXJ5U2VsZWN0b3IoImhlYWRlciIpLm9mZnNldEhlaWdodAoJCQkKCQkJY29uc3Qgc2Nyb2xsX3RvX3RvcCA9IGRpdl9wb3MgLSBoZWFkZXJfaGVpZ2h0CgkJCWNvbnN0IHNjcm9sbF90b19ib3R0b20gPSBkaXZfcG9zICsgZGl2X2hlaWdodCAtIHRvY19oZWlnaHQKCQkJCgkJCS8vIGlmIHdlIHNldCBhIHNjcm9sbFRvcCwgdGhlbiB0aGUgYnJvd3NlciB3aWxsIHN0b3AgYW55IGN1cnJlbnRseSBvbmdvaW5nIHNtb290aHNjcm9sbCBhbmltYXRpb24uIFNvIGxldCdzIG9ubHkgZG8gdGhpcyBpZiB5b3UgYXJlIG5vdCBjdXJyZW50bHkgaW4gYSBzbW9vdGhzY3JvbGwuCgkJCWlmKERhdGUubm93KCkgLSBsYXN0X3RvY19lbGVtZW50X2NsaWNrX3RpbWUuY3VycmVudCA+PSAyMDAwKQoJCQkJaWYoY3VycmVudF9zY3JvbGwgPCBzY3JvbGxfdG9fYm90dG9tKXsKCQkJCQl0b2NOb2RlLnNjcm9sbFRvcCA9IHNjcm9sbF90b19ib3R0b20KCQkJCX0gZWxzZSBpZihjdXJyZW50X3Njcm9sbCA+IHNjcm9sbF90b190b3ApewoJCQkJCXRvY05vZGUuc2Nyb2xsVG9wID0gc2Nyb2xsX3RvX3RvcAoJCQkJfQoJCQkqLwoJCX0pCgl9Cn0KbGV0IGludGVyc2VjdGlvbl9vYnNlcnZlcl8xID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGludGVyc2VjdGlvbl9jYWxsYmFjaywgewoJcm9vdDogbnVsbCwgLy8gaS5lLiB0aGUgdmlld3BvcnQKICAJdGhyZXNob2xkOiAxLAoJcm9vdE1hcmdpbjogIi0xNXB4IiwgLy8gc2xpZ2h0bHkgc21hbGxlciB0aGFuIHRoZSB2aWV3cG9ydAoJLy8gZGVsYXk6IDEwMCwKfSkKbGV0IGludGVyc2VjdGlvbl9vYnNlcnZlcl8yID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGludGVyc2VjdGlvbl9jYWxsYmFjaywgewoJcm9vdDogbnVsbCwgLy8gaS5lLiB0aGUgdmlld3BvcnQKICAJdGhyZXNob2xkOiAxLAoJcm9vdE1hcmdpbjogIjE1cHgiLCAvLyBzbGlnaHRseSBsYXJnZXIgdGhhbiB0aGUgdmlld3BvcnQKCS8vIGRlbGF5OiAxMDAsCn0pCgpjb25zdCByZW5kZXIgPSAoZWxlbWVudHMpID0+IHsKCWhlYWRlcl90b19pbmRleF9lbnRyeV9tYXAuY2xlYXIoKQoJY3VycmVudGx5X2hpZ2hsaWdodGVkX3NldC5jbGVhcigpCglpbnRlcnNlY3Rpb25fb2JzZXJ2ZXJfMS5kaXNjb25uZWN0KCkKCWludGVyc2VjdGlvbl9vYnNlcnZlcl8yLmRpc2Nvbm5lY3QoKQoKCQlsZXQgbGFzdF9sZXZlbCA9IGBIMWAKCXJldHVybiBodG1sYCR7ZWxlbWVudHMubWFwKGggPT4gewoJY29uc3QgcGFyZW50X2NlbGwgPSBnZXRQYXJlbnRDZWxsKGgpCgoJCWxldCBbY2xhc3NOYW1lLCB0aXRsZV9lbF0gPSBoLm1hdGNoZXMoYC5wbHV0by1kb2NzLWJpbmRpbmdgKSA/IFsicGx1dG8tZG9jcy1iaW5kaW5nLWVsIiwgaC5maXJzdEVsZW1lbnRDaGlsZF0gOiBbaC5ub2RlTmFtZSwgaF0KCgljb25zdCBhID0gaHRtbGA8YSAKCQljbGFzcz0iJHtjbGFzc05hbWV9IiAKCQl0aXRsZT0iJHt0aXRsZV9lbC5pbm5lclRleHR9IgoJCWhyZWY9IiMke3BhcmVudF9jZWxsLmlkfSIKCT4ke3RpdGxlX2VsLmlubmVySFRNTH08L2E+YAoJLyogYS5vbm1vdXNlb3Zlcj0oKT0+ewoJCXBhcmVudF9jZWxsLmZpcnN0RWxlbWVudENoaWxkLmNsYXNzTGlzdC5hZGQoCgkJCSdoaWdobGlnaHQtcGx1dG8tY2VsbC1zaG91bGRlcicKCQkpCgl9CglhLm9ubW91c2VvdXQ9KCkgPT4gewoJCXBhcmVudF9jZWxsLmZpcnN0RWxlbWVudENoaWxkLmNsYXNzTGlzdC5yZW1vdmUoCgkJCSdoaWdobGlnaHQtcGx1dG8tY2VsbC1zaG91bGRlcicKCQkpCgl9ICovCgkJCgkJCglhLm9uY2xpY2s9KGUpID0+IHsKCQllLnByZXZlbnREZWZhdWx0KCk7CgkJbGFzdF90b2NfZWxlbWVudF9jbGlja190aW1lLmN1cnJlbnQgPSBEYXRlLm5vdygpCgkJc2Nyb2xsSW50b1ZpZXcoaCwgewoJCQliZWhhdmlvcjogJ3Ntb290aCcsIAoJCQlibG9jazogJ3N0YXJ0JywKCQl9KS50aGVuKCgpID0+IAoJCQkvLyBzb21ldGltZXMgaXQgZG9lc24ndCBzY3JvbGwgdG8gdGhlIHJpZ2h0IHBsYWNlCgkJCS8vIHNvbHV0aW9uOiB0cnkgYSBzZWNvbmQgdGltZSEKCQkJc2Nyb2xsSW50b1ZpZXcoaCwgewoJCQkJYmVoYXZpb3I6ICdzbW9vdGgnLCAKCQkJCWJsb2NrOiAnc3RhcnQnLAoJCQl9KQoJICAgKQoJfQoKCWNvbnN0IHJvdyA9ICBodG1sYDxkaXYgY2xhc3M9InRvYy1yb3cgJHtjbGFzc05hbWV9IGFmdGVyLSR7bGFzdF9sZXZlbH0iPiR7YX08L2Rpdj5gCgkJaW50ZXJzZWN0aW9uX29ic2VydmVyXzEub2JzZXJ2ZSh0aXRsZV9lbCkKCQlpbnRlcnNlY3Rpb25fb2JzZXJ2ZXJfMi5vYnNlcnZlKHRpdGxlX2VsKQoJCWhlYWRlcl90b19pbmRleF9lbnRyeV9tYXAuc2V0KHRpdGxlX2VsLCByb3cpCgoJaWYoY2xhc3NOYW1lLnN0YXJ0c1dpdGgoIkgiKSkKCQlsYXN0X2xldmVsID0gY2xhc3NOYW1lCgkJCglyZXR1cm4gcm93Cn0pfWAKfQoKY29uc3QgaW52YWxpZGF0ZWQgPSB7IGN1cnJlbnQ6IGZhbHNlIH0KCmNvbnN0IHVwZGF0ZUNhbGxiYWNrID0gKCkgPT4gewoJaWYgKCFpbnZhbGlkYXRlZC5jdXJyZW50KSB7CgkJdG9jTm9kZS5xdWVyeVNlbGVjdG9yKCJzZWN0aW9uIikucmVwbGFjZVdpdGgoCgkJCWh0bWxgPHNlY3Rpb24+JHtyZW5kZXIoZ2V0SGVhZGVycygpKX08L3NlY3Rpb24+YAoJCSkKCX0KfQp1cGRhdGVDYWxsYmFjaygpCnNldFRpbWVvdXQodXBkYXRlQ2FsbGJhY2ssIDEwMCkKc2V0VGltZW91dCh1cGRhdGVDYWxsYmFjaywgMTAwMCkKc2V0VGltZW91dCh1cGRhdGVDYWxsYmFjaywgNTAwMCkKCmNvbnN0IG5vdGVib29rID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigicGx1dG8tbm90ZWJvb2siKQoKCi8vIFdlIGhhdmUgYSBtdXRhdGlvbm9ic2VydmVyIGZvciBlYWNoIGNlbGw6CmNvbnN0IG11dF9vYnNlcnZlcnMgPSB7CgljdXJyZW50OiBbXSwKfQoKY29uc3QgY3JlYXRlQ2VsbE9ic2VydmVycyA9ICgpID0+IHsKCW11dF9vYnNlcnZlcnMuY3VycmVudC5mb3JFYWNoKChvKSA9PiBvLmRpc2Nvbm5lY3QoKSkKCW11dF9vYnNlcnZlcnMuY3VycmVudCA9IEFycmF5LmZyb20obm90ZWJvb2sucXVlcnlTZWxlY3RvckFsbCgicGx1dG8tY2VsbCIpKS5tYXAoZWwgPT4gewoJCWNvbnN0IG8gPSBuZXcgTXV0YXRpb25PYnNlcnZlcih1cGRhdGVDYWxsYmFjaykKCQlvLm9ic2VydmUoZWwsIHthdHRyaWJ1dGVGaWx0ZXI6IFsiY2xhc3MiXX0pCgkJcmV0dXJuIG8KCX0pCn0KY3JlYXRlQ2VsbE9ic2VydmVycygpCgovLyBBbmQgb25lIGZvciB0aGUgbm90ZWJvb2sncyBjaGlsZCBsaXN0LCB3aGljaCB1cGRhdGVzIG91ciBjZWxsIG9ic2VydmVyczoKY29uc3Qgbm90ZWJvb2tPYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsKCXVwZGF0ZUNhbGxiYWNrKCkKCWNyZWF0ZUNlbGxPYnNlcnZlcnMoKQp9KQpub3RlYm9va09ic2VydmVyLm9ic2VydmUobm90ZWJvb2ssIHtjaGlsZExpc3Q6IHRydWV9KQoKLy8gQW5kIGZpbmFsbHksIGFuIG9ic2VydmVyIGZvciB0aGUgZG9jdW1lbnQuYm9keSBjbGFzc0xpc3QsIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0b2MgYWxzbyB3b3JrcyB3aGVuIGl0IGlzIGxvYWRlZCBkdXJpbmcgbm90ZWJvb2sgaW5pdGlhbGl6YXRpb24KY29uc3QgYm9keUNsYXNzT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcih1cGRhdGVDYWxsYmFjaykKYm9keUNsYXNzT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7YXR0cmlidXRlRmlsdGVyOiBbImNsYXNzIl19KQoKLy8gSGlkZS9zaG93IHRoZSBUb0Mgd2hlbiB0aGUgc2NyZWVuIGdldHMgc21hbGwKbGV0IG1hdGNoX2xpc3RlbmVyID0gKCkgPT4gCgl0b2NOb2RlLmNsYXNzTGlzdC50b2dnbGUoImhpZGUiLCAodG9jTm9kZS5jbG9zZXN0KCJwbHV0by1lZGl0b3IiKSA/PyBkb2N1bWVudC5ib2R5KS5zY3JvbGxXaWR0aCA8IDEwMDApCmZvcihsZXQgcyBvZiBbMTAwMCwgMTEwMCwgMTIwMCwgMTMwMCwgMTQwMCwgMTUwMCwgMTYwMCwgMTcwMCwgMTgwMCwgMTkwMCwgMjAwMF0pIHsKCWxldCBtID0gbWF0Y2hNZWRpYShgKG1heC13aWR0aDogJHtzfXB4KWApCgltLmFkZExpc3RlbmVyKG1hdGNoX2xpc3RlbmVyKQoJaW52YWxpZGF0aW9uLnRoZW4oKCkgPT4gbS5yZW1vdmVMaXN0ZW5lcihtYXRjaF9saXN0ZW5lcikpCn0KbWF0Y2hfbGlzdGVuZXIoKQoKaW52YWxpZGF0aW9uLnRoZW4oKCkgPT4gewoJaW52YWxpZGF0ZWQuY3VycmVudCA9IHRydWUKCWludGVyc2VjdGlvbl9vYnNlcnZlcl8xLmRpc2Nvbm5lY3QoKQoJaW50ZXJzZWN0aW9uX29ic2VydmVyXzIuZGlzY29ubmVjdCgpCglub3RlYm9va09ic2VydmVyLmRpc2Nvbm5lY3QoKQoJYm9keUNsYXNzT2JzZXJ2ZXIuZGlzY29ubmVjdCgpCgltdXRfb2JzZXJ2ZXJzLmN1cnJlbnQuZm9yRWFjaCgobykgPT4gby5kaXNjb25uZWN0KCkpCglkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsIGRvY3VtZW50X2NsaWNrX2hhbmRsZXIpCn0pCgpyZXR1cm4gdG9jTm9kZQo8L3NjcmlwdD4KPHN0eWxlPgpAbWVkaWEgbm90IHByaW50IHsKCi5wbHV0b3VpLXRvYyB7Cglmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAiU2Vnb2UgVUkiLCBSb2JvdG8sIE94eWdlbi1TYW5zLCBDYW50YXJlbGwsICJBcHBsZSBDb2xvciBFbW9qaSIsCgkJIlNlZ29lIFVJIEVtb2ppIiwgIlNlZ29lIFVJIFN5bWJvbCIsIHN5c3RlbS11aSwgc2Fucy1zZXJpZjsKCS0tbWFpbi1iZy1jb2xvcjogI2ZhZmFmYTsKCS0tcGx1dG8tb3V0cHV0LWNvbG9yOiBoc2woMCwgMCUsIDM2JSk7CgktLXBsdXRvLW91dHB1dC1oLWNvbG9yOiBoc2woMCwgMCUsIDIxJSk7CgktLXNpZGViYXItbGktYWN0aXZlLWJnOiByZ2IoMjM1LCAyMzUsIDIzNSk7CgktLWljb24tZmlsdGVyOiB1bnNldDsKfQoKQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewoJLnBsdXRvdWktdG9jIHsKCQktLW1haW4tYmctY29sb3I6ICMzMDMwMzA7CgkJLS1wbHV0by1vdXRwdXQtY29sb3I6IGhzbCgwLCAwJSwgOTAlKTsKCQktLXBsdXRvLW91dHB1dC1oLWNvbG9yOiBoc2woMCwgMCUsIDk3JSk7CgkJLS1zaWRlYmFyLWxpLWFjdGl2ZS1iZzogcmdiKDgyLCA4MiwgODIpOwoJCS0taWNvbi1maWx0ZXI6IGludmVydCgxKTsKCX0KfQoKLnBsdXRvdWktdG9jLmFzaWRlIHsKCWNvbG9yOiB2YXIoLS1wbHV0by1vdXRwdXQtY29sb3IpOwoJcG9zaXRpb246IGZpeGVkOwoJcmlnaHQ6IDFyZW07Cgl0b3A6IDVyZW07Cgl3aWR0aDogbWluKDgwdncsIDMwMHB4KTsKCXBhZGRpbmc6IDAuNXJlbTsKCXBhZGRpbmctdG9wOiAwZW07CgkvKiBib3JkZXI6IDNweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTUpOyAqLwoJYm9yZGVyLXJhZGl1czogMTBweDsKCS8qIGJveC1zaGFkb3c6IDAgMCAxMXB4IDBweCAjMDAwMDAwMTA7ICovCgltYXgtaGVpZ2h0OiBjYWxjKDEwMHZoIC0gNXJlbSAtIDkwcHgpOwoJb3ZlcmZsb3c6IGF1dG87Cgl6LWluZGV4OiA0MDsKCWJhY2tncm91bmQtY29sb3I6IHZhcigtLW1haW4tYmctY29sb3IpOwoJdHJhbnNpdGlvbjogdHJhbnNmb3JtIDMwMG1zIGN1YmljLWJlemllcigwLjE4LCAwLjg5LCAwLjQ1LCAxLjEyKTsKfQoKLnBsdXRvdWktdG9jLmFzaWRlLmhpZGUgewoJdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMTAwJSAtIDI4cHgpKTsKfQoucGx1dG91aS10b2MuYXNpZGUuaGlkZSBzZWN0aW9uIHsKCWRpc3BsYXk6IG5vbmU7Cn0KLnBsdXRvdWktdG9jLmFzaWRlLmhpZGUgaGVhZGVyIHsKCW1hcmdpbi1ib3R0b206IDBlbTsKCXBhZGRpbmctYm90dG9tOiAwZW07Cglib3JkZXItYm90dG9tOiBub25lOwp9Cn0gIC8qIEVuZCBvZiBNZWRpYSBwcmludCBxdWVyeSAqLwoucGx1dG91aS10b2MuYXNpZGUuaGlkZSAub3Blbi10b2MsCi5wbHV0b3VpLXRvYy5hc2lkZTpub3QoLmhpZGUpIC5jbG9zZWQtdG9jLAoucGx1dG91aS10b2M6bm90KC5hc2lkZSkgLmNsb3NlZC10b2MgewoJZGlzcGxheTogbm9uZTsKfQoKQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uKSB7CiAgLnBsdXRvdWktdG9jLmFzaWRlIHsKCXRyYW5zaXRpb24tZHVyYXRpb246IDBzOwogIH0KfQoKLnRvYy10b2dnbGUgewoJY3Vyc29yOiBwb2ludGVyOwogICAgcGFkZGluZzogMWVtOwogICAgbWFyZ2luOiAtMWVtOwogICAgbWFyZ2luLXJpZ2h0OiAtMC43ZW07CiAgICBsaW5lLWhlaWdodDogMWVtOwogICAgZGlzcGxheTogZmxleDsKfQoKLnRvYy10b2dnbGU6OmJlZm9yZSB7CiAgICBjb250ZW50OiAiIjsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIGhlaWdodDogMWVtOwogICAgd2lkdGg6IDFlbTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL2lvbmljLXRlYW0vaW9uaWNvbnNANS41LjEvc3JjL3N2Zy9saXN0LW91dGxpbmUuc3ZnIik7CgkvKiBnZW5lcmF0ZWQgdXNpbmcgaHR0cHM6Ly9kb3BpYXphLm9yZy90b29scy9kYXRhdXJpL2luZGV4LnBocCAqLwogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTFNVElpSUdobGFXZG9kRDBpTlRFeUlpQjJhV1YzUW05NFBTSXdJREFnTlRFeUlEVXhNaUkrUEhScGRHeGxQbWx2Ym1samIyNXpMWFkxTFc4OEwzUnBkR3hsUGp4c2FXNWxJSGd4UFNJeE5qQWlJSGt4UFNJeE5EUWlJSGd5UFNJME5EZ2lJSGt5UFNJeE5EUWlJSE4wZVd4bFBTSm1hV3hzT201dmJtVTdjM1J5YjJ0bE9pTXdNREE3YzNSeWIydGxMV3hwYm1WallYQTZjbTkxYm1RN2MzUnliMnRsTFd4cGJtVnFiMmx1T25KdmRXNWtPM04wY205clpTMTNhV1IwYURvek1uQjRJaTgrUEd4cGJtVWdlREU5SWpFMk1DSWdlVEU5SWpJMU5pSWdlREk5SWpRME9DSWdlVEk5SWpJMU5pSWdjM1I1YkdVOUltWnBiR3c2Ym05dVpUdHpkSEp2YTJVNkl6QXdNRHR6ZEhKdmEyVXRiR2x1WldOaGNEcHliM1Z1WkR0emRISnZhMlV0YkdsdVpXcHZhVzQ2Y205MWJtUTdjM1J5YjJ0bExYZHBaSFJvT2pNeWNIZ2lMejQ4YkdsdVpTQjRNVDBpTVRZd0lpQjVNVDBpTXpZNElpQjRNajBpTkRRNElpQjVNajBpTXpZNElpQnpkSGxzWlQwaVptbHNiRHB1YjI1bE8zTjBjbTlyWlRvak1EQXdPM04wY205clpTMXNhVzVsWTJGd09uSnZkVzVrTzNOMGNtOXJaUzFzYVc1bGFtOXBianB5YjNWdVpEdHpkSEp2YTJVdGQybGtkR2c2TXpKd2VDSXZQanhqYVhKamJHVWdZM2c5SWpnd0lpQmplVDBpTVRRMElpQnlQU0l4TmlJZ2MzUjViR1U5SW1acGJHdzZibTl1WlR0emRISnZhMlU2SXpBd01EdHpkSEp2YTJVdGJHbHVaV05oY0RweWIzVnVaRHR6ZEhKdmEyVXRiR2x1WldwdmFXNDZjbTkxYm1RN2MzUnliMnRsTFhkcFpIUm9Pak15Y0hnaUx6NDhZMmx5WTJ4bElHTjRQU0k0TUNJZ1kzazlJakkxTmlJZ2NqMGlNVFlpSUhOMGVXeGxQU0ptYVd4c09tNXZibVU3YzNSeWIydGxPaU13TURBN2MzUnliMnRsTFd4cGJtVmpZWEE2Y205MWJtUTdjM1J5YjJ0bExXeHBibVZxYjJsdU9uSnZkVzVrTzNOMGNtOXJaUzEzYVdSMGFEb3pNbkI0SWk4K1BHTnBjbU5zWlNCamVEMGlPREFpSUdONVBTSXpOamdpSUhJOUlqRTJJaUJ6ZEhsc1pUMGlabWxzYkRwdWIyNWxPM04wY205clpUb2pNREF3TzNOMGNtOXJaUzFzYVc1bFkyRndPbkp2ZFc1a08zTjBjbTlyWlMxc2FXNWxhbTlwYmpweWIzVnVaRHR6ZEhKdmEyVXRkMmxrZEdnNk16SndlQ0l2UGp3dmMzWm5QZz09Iik7CiAgICBiYWNrZ3JvdW5kLXNpemU6IDFlbTsKCWZpbHRlcjogdmFyKC0taWNvbi1maWx0ZXIpOwp9CgouYXNpZGUgLnRvYy10b2dnbGUub3Blbi10b2M6aG92ZXI6OmJlZm9yZSB7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9naC9pb25pYy10ZWFtL2lvbmljb25zQDUuNS4xL3NyYy9zdmcvYXJyb3ctZm9yd2FyZC1vdXRsaW5lLnN2ZyIpOwoJLyogZ2VuZXJhdGVkIHVzaW5nIGh0dHBzOi8vZG9waWF6YS5vcmcvdG9vbHMvZGF0YXVyaS9pbmRleC5waHAgKi8KICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhkcFpIUm9QU0kxTVRJaUlHaGxhV2RvZEQwaU5URXlJaUIyYVdWM1FtOTRQU0l3SURBZ05URXlJRFV4TWlJK1BIUnBkR3hsUG1sdmJtbGpiMjV6TFhZMUxXRThMM1JwZEd4bFBqeHdiMng1YkdsdVpTQndiMmx1ZEhNOUlqSTJPQ0F4TVRJZ05ERXlJREkxTmlBeU5qZ2dOREF3SWlCemRIbHNaVDBpWm1sc2JEcHViMjVsTzNOMGNtOXJaVG9qTURBd08zTjBjbTlyWlMxc2FXNWxZMkZ3T25KdmRXNWtPM04wY205clpTMXNhVzVsYW05cGJqcHliM1Z1WkR0emRISnZhMlV0ZDJsa2RHZzZORGh3ZUNJdlBqeHNhVzVsSUhneFBTSXpPVElpSUhreFBTSXlOVFlpSUhneVBTSXhNREFpSUhreVBTSXlOVFlpSUhOMGVXeGxQU0ptYVd4c09tNXZibVU3YzNSeWIydGxPaU13TURBN2MzUnliMnRsTFd4cGJtVmpZWEE2Y205MWJtUTdjM1J5YjJ0bExXeHBibVZxYjJsdU9uSnZkVzVrTzNOMGNtOXJaUzEzYVdSMGFEbzBPSEI0SWk4K1BDOXpkbWMrIik7Cn0KLmFzaWRlIC50b2MtdG9nZ2xlLmNsb3NlZC10b2M6aG92ZXI6OmJlZm9yZSB7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9naC9pb25pYy10ZWFtL2lvbmljb25zQDUuNS4xL3NyYy9zdmcvYXJyb3ctYmFjay1vdXRsaW5lLnN2ZyIpOwoJLyogZ2VuZXJhdGVkIHVzaW5nIGh0dHBzOi8vZG9waWF6YS5vcmcvdG9vbHMvZGF0YXVyaS9pbmRleC5waHAgKi8KICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhkcFpIUm9QU0kxTVRJaUlHaGxhV2RvZEQwaU5URXlJaUIyYVdWM1FtOTRQU0l3SURBZ05URXlJRFV4TWlJK1BIUnBkR3hsUG1sdmJtbGpiMjV6TFhZMUxXRThMM1JwZEd4bFBqeHdiMng1YkdsdVpTQndiMmx1ZEhNOUlqSTBOQ0EwTURBZ01UQXdJREkxTmlBeU5EUWdNVEV5SWlCemRIbHNaVDBpWm1sc2JEcHViMjVsTzNOMGNtOXJaVG9qTURBd08zTjBjbTlyWlMxc2FXNWxZMkZ3T25KdmRXNWtPM04wY205clpTMXNhVzVsYW05cGJqcHliM1Z1WkR0emRISnZhMlV0ZDJsa2RHZzZORGh3ZUNJdlBqeHNhVzVsSUhneFBTSXhNakFpSUhreFBTSXlOVFlpSUhneVBTSTBNVElpSUhreVBTSXlOVFlpSUhOMGVXeGxQU0ptYVd4c09tNXZibVU3YzNSeWIydGxPaU13TURBN2MzUnliMnRsTFd4cGJtVmpZWEE2Y205MWJtUTdjM1J5YjJ0bExXeHBibVZxYjJsdU9uSnZkVzVrTzNOMGNtOXJaUzEzYVdSMGFEbzBPSEI0SWk4K1BDOXpkbWMrIik7Cn0KCgoKLnBsdXRvdWktdG9jIGhlYWRlciB7CglkaXNwbGF5OiBmbGV4OwoJYWxpZ24taXRlbXM6IGNlbnRlcjsKCWdhcDogLjNlbTsKCWZvbnQtc2l6ZTogMS41ZW07CgkvKiBtYXJnaW4tdG9wOiAtMC4xZW07ICovCgltYXJnaW4tYm90dG9tOiAwLjRlbTsKCXBhZGRpbmc6IDAuNXJlbTsKCW1hcmdpbi1sZWZ0OiAwOwoJbWFyZ2luLXJpZ2h0OiAwOwoJZm9udC13ZWlnaHQ6IGJvbGQ7CgkvKiBib3JkZXItYm90dG9tOiAycHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjE1KTsgKi8KCXBvc2l0aW9uOiBzdGlja3k7Cgl0b3A6IDBweDsKCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJei1pbmRleDogNDE7Cn0KLnBsdXRvdWktdG9jLmFzaWRlIGhlYWRlciB7CglwYWRkaW5nLWxlZnQ6IDA7CglwYWRkaW5nLXJpZ2h0OiAwOwp9CgoucGx1dG91aS10b2Mgc2VjdGlvbiAudG9jLXJvdyB7Cgl3aGl0ZS1zcGFjZTogbm93cmFwOwoJb3ZlcmZsb3c6IGhpZGRlbjsKCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJcGFkZGluZzogLjFlbTsKCWJvcmRlci1yYWRpdXM6IC4yZW07Cn0KCi5wbHV0b3VpLXRvYyBzZWN0aW9uIC50b2Mtcm93LkgxIHsKCW1hcmdpbi10b3A6IDFlbTsKfQoKCi5wbHV0b3VpLXRvYy5hc2lkZSBzZWN0aW9uIC50b2Mtcm93LmluLXZpZXcgewoJYmFja2dyb3VuZDogdmFyKC0tc2lkZWJhci1saS1hY3RpdmUtYmcpOwp9CgoKCQouaGlnaGxpZ2h0LXBsdXRvLWNlbGwtc2hvdWxkZXIgewoJYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA1KTsKCWJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7Cn0KCi5wbHV0b3VpLXRvYyBzZWN0aW9uIGEgewoJdGV4dC1kZWNvcmF0aW9uOiBub25lOwoJZm9udC13ZWlnaHQ6IG5vcm1hbDsKCWNvbG9yOiB2YXIoLS1wbHV0by1vdXRwdXQtY29sb3IpOwp9Ci5wbHV0b3VpLXRvYyBzZWN0aW9uIGE6aG92ZXIgewoJY29sb3I6IHZhcigtLXBsdXRvLW91dHB1dC1oLWNvbG9yKTsKfQoKLnBsdXRvdWktdG9jLmluZGVudCBzZWN0aW9uIGEuSDEgewoJZm9udC13ZWlnaHQ6IDcwMDsKCWxpbmUtaGVpZ2h0OiAxZW07Cn0KCi5wbHV0b3VpLXRvYy5pbmRlbnQgc2VjdGlvbiAuYWZ0ZXItSDIgYSB7IHBhZGRpbmctbGVmdDogMTBweDsgfQoucGx1dG91aS10b2MuaW5kZW50IHNlY3Rpb24gLmFmdGVyLUgzIGEgeyBwYWRkaW5nLWxlZnQ6IDIwcHg7IH0KLnBsdXRvdWktdG9jLmluZGVudCBzZWN0aW9uIC5hZnRlci1INCBhIHsgcGFkZGluZy1sZWZ0OiAzMHB4OyB9Ci5wbHV0b3VpLXRvYy5pbmRlbnQgc2VjdGlvbiAuYWZ0ZXItSDUgYSB7IHBhZGRpbmctbGVmdDogNDBweDsgfQoucGx1dG91aS10b2MuaW5kZW50IHNlY3Rpb24gLmFmdGVyLUg2IGEgeyBwYWRkaW5nLWxlZnQ6IDUwcHg7IH0KCi5wbHV0b3VpLXRvYy5pbmRlbnQgc2VjdGlvbiBhLkgxIHsgcGFkZGluZy1sZWZ0OiAwcHg7IH0KLnBsdXRvdWktdG9jLmluZGVudCBzZWN0aW9uIGEuSDIgeyBwYWRkaW5nLWxlZnQ6IDEwcHg7IH0KLnBsdXRvdWktdG9jLmluZGVudCBzZWN0aW9uIGEuSDMgeyBwYWRkaW5nLWxlZnQ6IDIwcHg7IH0KLnBsdXRvdWktdG9jLmluZGVudCBzZWN0aW9uIGEuSDQgeyBwYWRkaW5nLWxlZnQ6IDMwcHg7IH0KLnBsdXRvdWktdG9jLmluZGVudCBzZWN0aW9uIGEuSDUgeyBwYWRkaW5nLWxlZnQ6IDQwcHg7IH0KLnBsdXRvdWktdG9jLmluZGVudCBzZWN0aW9uIGEuSDYgeyBwYWRkaW5nLWxlZnQ6IDUwcHg7IH0KCgoucGx1dG91aS10b2MuaW5kZW50IHNlY3Rpb24gYS5wbHV0by1kb2NzLWJpbmRpbmctZWwsCi5wbHV0b3VpLXRvYy5pbmRlbnQgc2VjdGlvbiBhLkFTU0lHTkVFCgl7Cglmb250LWZhbWlseTogSnVsaWFNb25vLCBtb25vc3BhY2U7Cglmb250LXNpemU6IC44ZW07CgkvKiBiYWNrZ3JvdW5kOiBibGFjazsgKi8KCWZvbnQtd2VpZ2h0OiA3MDA7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cgljb2xvcjogdmFyKC0tY20tdmFyLWNvbG9yKTsgLyogdGhpcyBpcyBzdGVhbGluZyBhIHZhcmlhYmxlIGZyb20gUGx1dG8sIGJ1dCBpdCdzIGZpbmUgaWYgdGhhdCBkb2VzbnQgd29yayAqLwp9Ci5wbHV0b3VpLXRvYy5pbmRlbnQgc2VjdGlvbiBhLnBsdXRvLWRvY3MtYmluZGluZy1lbDo6YmVmb3JlLAoucGx1dG91aS10b2MuaW5kZW50IHNlY3Rpb24gYS5BU1NJR05FRTo6YmVmb3JlCgl7Cgljb250ZW50OiAiPiAiOwoJb3BhY2l0eTogLjM7Cn0KPC9zdHlsZT4KpG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv8geA3ZosHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQxYmIzZTQ5Yi0xYTE5LTQzNDMtYWMwOS1mYmFmMWNhZTRiYTO5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc0nubVwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJGVjZWIzMjZhLWNhYjYtNDY1ZS04ZTVjLWU4MzU4ODFiZDNiMIqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHnZQTxkaXYgY2xhc3M9Im1hcmtkb3duIj48aDI+Mi4wLiBNYWduZXRpemF0aW9uIGR5bmFtaWNzPC9oMj4KPC9kaXY+pG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv8fxgM42sHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SRlY2ViMzI2YS1jYWI2LTQ2NWUtOGU1Yy1lODM1ODgxYmQzYjC5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4AAvgstXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkMWE2MmFlNzEtNThkYi00OWVhLWFlNmEtOWFlYTY2MTQ1OTYziqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedpqiQk8c2NyaXB0IGlkPSdwbG90XzEnPgoJCS8vIFdlIHN0YXJ0IGJ5IHB1dHRpbmcgYWxsIHRoZSB2YXJpYWJsZSBpbnRlcnBvbGF0aW9uIGhlcmUgYXQgdGhlIGJlZ2lubmluZwoJCS8vIFdlIGhhdmUgdG8gY29udmVydCBhbGwgdHlwZWRhcnJheXMgaW4gdGhlIGxheW91dCB0byBub3JtYWwgYXJyYXlzLiBTZWUgSXNzdWUgIzI1CgkJLy8gV2UgdXNlIGxvZGFzaCBmb3IgdGhpcyBmb3IgY29tcGFjdG5lc3MKCQlmdW5jdGlvbiByZW1vdmVUeXBlZEFycmF5KG8pIHsKCQkJcmV0dXJuIF8uaXNUeXBlZEFycmF5KG8pID8gQXJyYXkuZnJvbShvKSA6CgkJCV8uaXNQbGFpbk9iamVjdChvKSA/IF8ubWFwVmFsdWVzKG8sIHJlbW92ZVR5cGVkQXJyYXkpIDogCgkJCW8KCQl9CgoJCS8vIFB1Ymxpc2ggdGhlIHBsb3Qgb2JqZWN0IHRvIEpTCgkJbGV0IHBsb3Rfb2JqID0gXy51cGRhdGUoLyogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBBYnN0cmFjdFBsdXRvRGluZ2V0amVzLkRpc3BsYXkucHVibGlzaGVkX3RvX2pzICovIGdldFB1Ymxpc2hlZE9iamVjdCgiZWQyN2RlMWEtODFkOS0xMWVmLTNiNzMtMWIxMTYzMTJkYWU3L2U0YjgxMjI2ODQ1Y2FlMjAiKSwgImxheW91dCIsIHJlbW92ZVR5cGVkQXJyYXkpCgkJLy8gR2V0IHRoZSBwbG90bHkgbGlzdGVuZXJzCgkJY29uc3QgcGxvdGx5X2xpc3RlbmVycyA9IHt9CgkJLy8gR2V0IHRoZSBKUyBsaXN0ZW5lcnMKCQljb25zdCBqc19saXN0ZW5lcnMgPSB7fQoJCS8vIERlYWwgd2l0aCBldmVudHVhbCBjdXN0b20gY2xhc3NlcwoJCWxldCBjdXN0b21fY2xhc3NsaXN0ID0gW10KCgoJCS8vIExvYWQgdGhlIHBsb3RseSBsaWJyYXJ5CgkJbGV0IFBsb3RseSA9IHVuZGVmaW5lZAoJCXRyeSB7CgkJCWxldCBfbW9kID0gYXdhaXQgaW1wb3J0KCIuL3Bsb3RseWpzL3Bsb3RseWpzLTIuMjYuMi5taW4uanMiKQoJCQlQbG90bHkgPSBfbW9kLmRlZmF1bHQKCQl9IGNhdGNoIChlKSB7CgkJCWNvbnNvbGUubG9nKCJMb2NhbCBsb2FkIGZhaWxlZCwgdHJ5aW5nIHdpdGggdGhlIHdlYiBlc20uc2ggdmVyc2lvbiIpCgkJCWxldCBfbW9kID0gYXdhaXQgaW1wb3J0KCJodHRwczovL2VzbS5zaC92MTM1L3Bsb3RseS5qcy1kaXN0LW1pbkAyLjI2LjIvZXNuZXh0L3Bsb3RseS5qcy1kaXN0LW1pbi5tanMiKQoJCQlQbG90bHkgPSBfbW9kLmRlZmF1bHQKCQl9CgoJCS8vIENoZWNrIGlmIHdlIGhhdmUgdG8gZm9yY2UgbG9jYWwgbWF0aGpheCBmb250IGNhY2hlCgkJaWYgKGZhbHNlICYmIHdpbmRvdz8uTWF0aEpheD8uY29uZmlnPy5zdmc/LmZvbnRDYWNoZSA9PT0gJ2dsb2JhbCcpIHsKCQkJd2luZG93Lk1hdGhKYXguY29uZmlnLnN2Zy5mb250Q2FjaGUgPSAnbG9jYWwnCgkJfQoKCQkvLyBGbGFnIHRvIGNoZWNrIGlmIHRoaXMgY2VsbCB3YXMgIG1hbnVhbGx5IHJhbiBvciByZWFjdGl2ZWx5IHJhbgpjb25zdCBmaXJzdFJ1biA9IHRoaXMgPyBmYWxzZSA6IHRydWUKY29uc3QgQ09OVEFJTkVSID0gdGhpcyA/PyBodG1sYDxkaXYgY2xhc3M9J3BsdXRvcGxvdGx5LWNvbnRhaW5lcic+YApjb25zdCBQTE9UID0gQ09OVEFJTkVSLnF1ZXJ5U2VsZWN0b3IoJy5qcy1wbG90bHktcGxvdCcpID8/IENPTlRBSU5FUi5hcHBlbmRDaGlsZChodG1sYDxkaXY+YCkKY29uc3QgcGFyZW50ID0gQ09OVEFJTkVSLnBhcmVudEVsZW1lbnQKLy8gV2UgdXNlIGEgY29udHJvbGxlciB0byByZW1vdmUgZXZlbnQgbGlzdGVuZXJzIHVwb24gaW52YWxpZGF0aW9uCmNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCkKLy8gV2UgaGF2ZSB0byBhZGQgdGhpcyB0byBrZWVwIHN1cHBvcnRpbmcgQGJpbmQgd2l0aCB0aGUgb2xkIEFQSSB1c2luZyBQTE9UClBMT1QuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoZSkgPT4gewoJQ09OVEFJTkVSLnZhbHVlID0gUExPVC52YWx1ZQoJaWYgKGUuYnViYmxlcykgewoJCXJldHVybgoJfQoJQ09OVEFJTkVSLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdpbnB1dCcpKQp9LCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSkKCgkvLyBUaGlzIGNyZWF0ZSB0aGUgc3R5bGUgc3ViZGl2IG9uIGZpcnN0IHJ1bgoJZmlyc3RSdW4gJiYgQ09OVEFJTkVSLmFwcGVuZENoaWxkKGh0bWxgCgk8c3R5bGU+CgkucGx1dG9wbG90bHktY29udGFpbmVyIHsKCQl3aWR0aDogMTAwJTsKCQloZWlnaHQ6IDEwMCU7CgkJbWluLWhlaWdodDogMDsKCQltaW4td2lkdGg6IDA7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyIC5qcy1wbG90bHktcGxvdCAucGxvdGx5IGRpdiB7CgkJbWFyZ2luOiAwIGF1dG87IC8vIFRoaXMgY2VudGVycyB0aGUgcGxvdAoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5wb3BwZWQtb3V0IHsKCQlvdmVyZmxvdzogYXV0bzsKCQl6LWluZGV4OiAxMDAwOwoJCXBvc2l0aW9uOiBmaXhlZDsKCQlyZXNpemU6IGJvdGg7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXJhZGl1czogMTJweDsKCQlib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwcHg7CgkJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDBweDsKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyIHsKCQlkaXNwbGF5OiBmbGV4OwoJCWZsZXgtZmxvdzogcm93IHdyYXA7CgkJYmFja2dyb3VuZDogdmFyKC0tbWFpbi1iZy1jb2xvcik7CgkJYm9yZGVyOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMTJweDsKCQlib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMTJweDsKCQlwb3NpdGlvbjogZml4ZWQ7CgkJei1pbmRleDogMTAwMTsKCQljdXJzb3I6IG1vdmU7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCAtMTAwJSk7CgkJcGFkZGluZzogNXB4OwoJfQoJLnBsdXRvcGxvdGx5LWNsaXBib2FyZC1oZWFkZXIgc3BhbiB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCWZsZXg6IDEKCX0KCS5wbHV0b3Bsb3RseS1jbGlwYm9hcmQtaGVhZGVyLmhpZGRlbiB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5jbGlwYm9hcmQtc3BhbiB7CgkJcG9zaXRpb246IHJlbGF0aXZlOwoJfQoJLmNsaXBib2FyZC12YWx1ZSB7CgkJcGFkZGluZy1yaWdodDogNXB4OwoJCXBhZGRpbmctbGVmdDogMnB4OwoJCWN1cnNvcjogdGV4dDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZmlsZW5hbWUgewoJCWZsZXg6IDAgMCAxMDAlOwoJCXRleHQtYWxpZ246IGNlbnRlcjsKCQlib3JkZXItdG9wOiAzcHggc29saWQgdmFyKC0ta2JkLWJvcmRlci1jb2xvcik7CgkJbWFyZ2luLXRvcDogNXB4OwoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkucGx1dG9wbG90bHktY29udGFpbmVyLmZpbGVzYXZlIC5jbGlwYm9hcmQtc3Bhbi5maWxlbmFtZSB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmNsaXBib2FyZC12YWx1ZS5maWxlbmFtZSB7CgkJbWFyZ2luLWxlZnQ6IDNweDsKCQl0ZXh0LWFsaWduOiBsZWZ0OwoJCW1pbi13aWR0aDogbWluKDYwJSwgbWluLWNvbnRlbnQpOwoJfQoJLnBsdXRvcGxvdGx5LWNvbnRhaW5lci5maWxlc2F2ZSAuY2xpcGJvYXJkLXNwYW4uZm9ybWF0IHsKCQlkaXNwbGF5OiBpbmxpbmUtZmxleDsKCX0KCS5jbGlwYm9hcmQtc3Bhbi5mb3JtYXQgLmxhYmVsIHsKCQlmbGV4OiAwIDAgMDsKCX0KCS5jbGlwYm9hcmQtdmFsdWUuZm9ybWF0IHsKCQlwb3NpdGlvbjogcmVsYXRpdmU7CgkJZmxleDogMSAwIGF1dG87CgkJbWluLXdpZHRoOiAzMHB4OwoJCW1hcmdpbi1yaWdodDogMTBweDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyB7CgkJZGlzcGxheTogaW5saW5lLWZsZXg7CgkJZmxleC1mbG93OiBjb2x1bW47CgkJcG9zaXRpb246IGFic29sdXRlOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJcGFkZGluZy1sZWZ0OiAzcHg7CgkJei1pbmRleDogMjAwMDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9uczpob3ZlciB7CgkJY3Vyc29yOiBwb2ludGVyOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCXBhZGRpbmc6IDNweDsKCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtM3B4LCAtNnB4KTsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyAuZm9ybWF0LW9wdGlvbiB7CgkJZGlzcGxheTogbm9uZTsKCX0KCWRpdi5mb3JtYXQtb3B0aW9uczpob3ZlciAuZm9ybWF0LW9wdGlvbiB7CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJfQoJLmZvcm1hdC1vcHRpb246bm90KC5zZWxlY3RlZCkgewoJCW1hcmdpbi10b3A6IDNweDsKCX0KCWRpdi5mb3JtYXQtb3B0aW9ucyAuZm9ybWF0LW9wdGlvbi5zZWxlY3RlZCB7CgkJb3JkZXI6IC0xOwoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCX0KCS5mb3JtYXQtb3B0aW9uOmhvdmVyIHsKCQliYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1rYmQtYm9yZGVyLWNvbG9yKTsKCX0KCXNwYW4uY29uZmlnLXZhbHVlIHsKCQlmb250LXdlaWdodDogbm9ybWFsOwoJCWNvbG9yOiB2YXIoLS1wbHV0by1vdXRwdXQtY29sb3IpOwoJCWRpc3BsYXk6IG5vbmU7CgkJcG9zaXRpb246IGFic29sdXRlOwoJCWJhY2tncm91bmQ6IHZhcigtLW1haW4tYmctY29sb3IpOwoJCWJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWtiZC1ib3JkZXItY29sb3IpOwoJCWJvcmRlci1yYWRpdXM6IDEycHg7CgkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCBjYWxjKC0xMDAlIC0gMTBweCkpOwoJCXBhZGRpbmc6IDVweDsKCX0KCS5sYWJlbCB7CgkJdXNlci1zZWxlY3Q6IG5vbmU7Cgl9CgkubGFiZWw6aG92ZXIgc3Bhbi5jb25maWctdmFsdWUgewoJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQltaW4td2lkdGg6IDE1MHB4OwoJfQoJLmNsaXBib2FyZC1zcGFuLm1hdGNoaW5nLWNvbmZpZyAubGFiZWwgewoJCWNvbG9yOiB2YXIoLS1jbS1tYWNyby1jb2xvcik7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9CgkuY2xpcGJvYXJkLXNwYW4uZGlmZmVyZW50LWNvbmZpZyAubGFiZWwgewoJCWNvbG9yOiB2YXIoLS1jbS10YWctY29sb3IpOwoJCWZvbnQtd2VpZ2h0OiBib2xkOwoJfQo8L3N0eWxlPgpgKQoKbGV0IG9yaWdpbmFsX2hlaWdodCA9IHBsb3Rfb2JqLmxheW91dC5oZWlnaHQKbGV0IG9yaWdpbmFsX3dpZHRoID0gcGxvdF9vYmoubGF5b3V0LndpZHRoCi8vIEZvciB0aGUgaGVpZ2h0IHdlIGhhdmUgdG8gYWxzbyBwdXQgYSBmaXhlZCB2YWx1ZSBpbiBjYXNlIHRoZSBwbG90IGlzIHB1dCBvbiBhIG5vbi1maXhlZC1zaXplIGNvbnRhaW5lciAobGlrZSB0aGUgZGVmYXVsdCB3cmFwcGVyKQovLyBXZSBkZWZpbmUgYSB2YXJpYWJsZSB0byBjaGVjayB3aGV0aGVyIHdlIHN0aWxsIGhhdmUgdG8gcmVtb3ZlIHRoZSBmaXhlZCBoZWlnaHQKbGV0IHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IGZpcnN0UnVuCmxldCBjb250YWluZXJfaGVpZ2h0ID0gb3JpZ2luYWxfaGVpZ2h0ID8/IFBMT1QuY29udGFpbmVyX2hlaWdodCA/PyA0MDAKQ09OVEFJTkVSLnN0eWxlLmhlaWdodCA9IGNvbnRhaW5lcl9oZWlnaHQgKyAncHgnCgovLyBXZSBjcmVhdGUgYSBQcm9taXNlIHZlcnNpb24gb2Ygc2V0VGltZW91dApmdW5jdGlvbiBkZWxheShtcykgewogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpOwp9CgovLyBXZSBpbXBvcnQgaW50ZXJhY3QgZm9yIGRyYWdnaW5nL3Jlc2l6aW5nCmNvbnN0IHsgZGVmYXVsdDogaW50ZXJhY3QgfSA9IGF3YWl0IGltcG9ydCgnaHR0cHM6Ly9lc20uc2gvaW50ZXJhY3Rqc0AxLjEwLjE5JykKCgpmdW5jdGlvbiBnZXRJbWFnZU9wdGlvbnMoKSB7CiAgY29uc3QgbyA9IHBsb3Rfb2JqLmNvbmZpZy50b0ltYWdlQnV0dG9uT3B0aW9ucyA/PyB7fTsKICByZXR1cm4gewogICAgZm9ybWF0OiBvLmZvcm1hdCA/PyAicG5nIiwKICAgIHdpZHRoOiBvLndpZHRoID8/IG9yaWdpbmFsX3dpZHRoLAogICAgaGVpZ2h0OiBvLmhlaWdodCA/PyBvcmlnaW5hbF9oZWlnaHQsCiAgICBzY2FsZTogby5zY2FsZSA/PyAxLAogICAgZmlsZW5hbWU6IG8uZmlsZW5hbWUgPz8gIm5ld3Bsb3QiLAogIH07Cn0KCmNvbnN0IENMSVBCT0FSRF9IRUFERVIgPQogIENPTlRBSU5FUi5xdWVyeVNlbGVjdG9yKCIucGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciIpID8/CiAgQ09OVEFJTkVSLmluc2VydEFkamFjZW50RWxlbWVudCgKICAgICJhZnRlcmJlZ2luIiwKICAgIGh0bWxgPGRpdiBjbGFzcz0icGx1dG9wbG90bHktY2xpcGJvYXJkLWhlYWRlciBoaWRkZW4iPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gZm9ybWF0IgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPkZvcm1hdDo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBmb3JtYXQiPjwvc3BhbgogICAgICA+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gd2lkdGgiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+V2lkdGg6PC9zcGFuCiAgICAgICAgPjxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtdmFsdWUgd2lkdGgiPjwvc3Bhbj5weDwvc3BhbgogICAgICA+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBoZWlnaHQiCiAgICAgICAgPjxzcGFuIGNsYXNzPSJsYWJlbCI+SGVpZ2h0Ojwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIGhlaWdodCI+PC9zcGFuPnB4PC9zcGFuCiAgICAgID4KICAgICAgPHNwYW4gY2xhc3M9ImNsaXBib2FyZC1zcGFuIHNjYWxlIgogICAgICAgID48c3BhbiBjbGFzcz0ibGFiZWwiPlNjYWxlOjwvc3BhbgogICAgICAgID48c3BhbiBjbGFzcz0iY2xpcGJvYXJkLXZhbHVlIHNjYWxlIj48L3NwYW4KICAgICAgPjwvc3Bhbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gc2V0Ij5TZXQ8L2J1dHRvbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xpcGJvYXJkLXNwYW4gdW5zZXQiPlVuc2V0PC9idXR0b24+CiAgICAgIDxzcGFuIGNsYXNzPSJjbGlwYm9hcmQtc3BhbiBmaWxlbmFtZSIKICAgICAgICA+PHNwYW4gY2xhc3M9ImxhYmVsIj5GaWxlbmFtZTo8L3NwYW4KICAgICAgICA+PHNwYW4gY2xhc3M9ImNsaXBib2FyZC12YWx1ZSBmaWxlbmFtZSI+PC9zcGFuCiAgICAgID48L3NwYW4+CiAgICA8L2Rpdj5gCiAgKTsKCmZ1bmN0aW9uIGNoZWNrQ29uZmlnU3luYyhjb250YWluZXIpIHsKICBjb25zdCB2YWxpZF9jbGFzc2VzID0gWwogICAgIm1pc3NpbmctY29uZmlnIiwKICAgICJtYXRjaGluZy1jb25maWciLAogICAgImRpZmZlcmVudC1jb25maWciLAogIF07CiAgZnVuY3Rpb24gc2V0Q2xhc3MoY2wpIHsKICAgIGZvciAoY29uc3QgbmFtZSBvZiB2YWxpZF9jbGFzc2VzKSB7CiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKG5hbWUsIG5hbWUgPT0gY2wpOwogICAgfQogIH0KICAvLyBXZSB1c2UgdGhlIGN1c3RvbSBnZXR0ZXJzIHdlJ2xsIHNldCB1cCBpbiB0aGUgY29udGFpbmVyCiAgY29uc3QgeyB1aV92YWx1ZSwgY29uZmlnX3ZhbHVlLCBjb25maWdfc3Bhbiwga2V5IH0gPSBjb250YWluZXI7CiAgaWYgKGNvbmZpZ192YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICBzZXRDbGFzcygibWlzc2luZy1jb25maWciKTsKICAgIGNvbmZpZ19zcGFuLmlubmVySFRNTCA9IGBUaGUga2V5IDxiPjxlbT4ke2tleX08L2VtPjwvYj4gaXMgbm90IHByZXNlbnQgaW4gdGhlIGNvbmZpZy5gOwogIH0gZWxzZSBpZiAodWlfdmFsdWUgPT0gY29uZmlnX3ZhbHVlKSB7CiAgICBzZXRDbGFzcygibWF0Y2hpbmctY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGhhcyB0aGUgc2FtZSB2YWx1ZSBpbiB0aGUgY29uZmlnIGFuZCBpbiB0aGUgaGVhZGVyLmA7CiAgfSBlbHNlIHsKICAgIHNldENsYXNzKCJkaWZmZXJlbnQtY29uZmlnIik7CiAgICBjb25maWdfc3Bhbi5pbm5lckhUTUwgPSBgVGhlIGtleSA8Yj48ZW0+JHtrZXl9PC9lbT48L2I+IGhhcyBhIGRpZmZlcmVudCB2YWx1ZSAoPGVtPiR7Y29uZmlnX3ZhbHVlfTwvZW0+KSBpbiB0aGUgY29uZmlnLmA7CiAgfQogIC8vIEFkZCBpbmZvIGFib3V0IHNldHRpbmcgYW5kIHVuc2V0dGluZwogIGNvbmZpZ19zcGFuLmluc2VydEFkamFjZW50SFRNTCgKICAgICJiZWZvcmVlbmQiLAogICAgYDxicj5DbGljayBvbiB0aGUgbGFiZWwgPGVtPjxiPm9uY2U8L2I+PC9lbT4gdG8gc2V0IHRoZSBjdXJyZW50IFVJIHZhbHVlIGluIHRoZSBjb25maWcuYAogICk7CiAgY29uZmlnX3NwYW4uaW5zZXJ0QWRqYWNlbnRIVE1MKAogICAgImJlZm9yZWVuZCIsCiAgICBgPGJyPkNsaWNrIDxlbT48Yj50d2ljZTwvYj48L2VtPiB0byByZW1vdmUgdGhpcyBrZXkgZnJvbSB0aGUgY29uZmlnLmAKICApOwp9Cgpjb25zdCB2YWxpZF9mb3JtYXRzID0gWyJwbmciLCAic3ZnIiwgIndlYnAiLCAianBlZyIsICJmdWxsLWpzb24iXTsKZnVuY3Rpb24gaW5pdGlhbGl6ZVVJVmFsdWVTcGFuKHNwYW4sIGtleSwgdmFsdWUpIHsKICBjb25zdCBjb250YWluZXIgPSBzcGFuLmNsb3Nlc3QoIi5jbGlwYm9hcmQtc3BhbiIpOwogIHNwYW4uY29udGVudEVkaXRhYmxlID0ga2V5ID09PSAiZm9ybWF0IiA/ICJmYWxzZSIgOiAidHJ1ZSI7CiAgbGV0IHBhcnNlID0gKHgpID0+IHg7CiAgbGV0IHVwZGF0ZSA9ICh4KSA9PiAoc3Bhbi50ZXh0Q29udGVudCA9IHgpOwogIGlmIChrZXkgPT09ICJ3aWR0aCIgfHwga2V5ID09PSAiaGVpZ2h0IikgewogICAgcGFyc2UgPSAoeCkgPT4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KHgpKTsKICB9IGVsc2UgaWYgKGtleSA9PT0gInNjYWxlIikgewogICAgcGFyc2UgPSBwYXJzZUZsb2F0OwogIH0gZWxzZSBpZiAoa2V5ID09PSAiZm9ybWF0IikgewogICAgLy8gV2UgcmVtb3ZlIGNvbnRlbnRFZGl0YWJsZQogICAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSAiZmFsc2UiOwogICAgLy8gSGVyZSB3ZSBmaXJzdCBhZGQgdGhlIHN1YnNwYW5zIGZvciBlYWNoIG9wdGlvbgogICAgY29uc3Qgb3B0c19kaXYgPSBzcGFuLmFwcGVuZENoaWxkKGh0bWxgPGRpdiBjbGFzcz0iZm9ybWF0LW9wdGlvbnMiPjwvZGl2PmApOwogICAgZm9yIChjb25zdCBmbXQgb2YgdmFsaWRfZm9ybWF0cykgewogICAgICBjb25zdCBvcHQgPSBvcHRzX2Rpdi5hcHBlbmRDaGlsZCgKICAgICAgICBodG1sYDxzcGFuIGNsYXNzPSJmb3JtYXQtb3B0aW9uICR7Zm10fSI+JHtmbXR9PC9zcGFuPmAKICAgICAgKTsKICAgICAgb3B0Lm9uY2xpY2sgPSAoZSkgPT4gewogICAgICAgIHNwYW4udmFsdWUgPSBvcHQudGV4dENvbnRlbnQ7CiAgICAgIH07CiAgICB9CiAgICBwYXJzZSA9ICh4KSA9PiB7CiAgICAgIHJldHVybiB2YWxpZF9mb3JtYXRzLmluY2x1ZGVzKHgpID8geCA6IGxvY2FsVmFsdWU7CiAgICB9OwogICAgdXBkYXRlID0gKHgpID0+IHsKICAgICAgZm9yIChjb25zdCBvcHQgb2Ygb3B0c19kaXYuY2hpbGRyZW4pIHsKICAgICAgICBvcHQuY2xhc3NMaXN0LnRvZ2dsZSgic2VsZWN0ZWQiLCBvcHQudGV4dENvbnRlbnQgPT09IHgpOwogICAgICB9CiAgICB9OwogIH0gZWxzZSB7CiAgICAvLyBXZSBvbmx5IGhhdmUgZmlsZW5hbWUgaGVyZQogIH0KICBsZXQgbG9jYWxWYWx1ZTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BhbiwgInZhbHVlIiwgewogICAgZ2V0OiAoKSA9PiB7CiAgICAgIHJldHVybiBsb2NhbFZhbHVlOwogICAgfSwKICAgIHNldDogKHZhbCkgPT4gewogICAgICBpZiAodmFsICE9PSAiIikgewogICAgICAgIGxvY2FsVmFsdWUgPSBwYXJzZSh2YWwpOwogICAgICB9CiAgICAgIHVwZGF0ZShsb2NhbFZhbHVlKTsKICAgICAgY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcik7CiAgICB9LAogIH0pOwogIC8vIFdlIGFsc28gYXNzaWduIGEgbGlzdGVuZXIgc28gdGhhdCB0aGUgZWRpdGFibGUgaXMgYmx1cnJlZCB3aGVuIGVudGVyIGlzIHByZXNzZWQKICBzcGFuLm9ua2V5ZG93biA9IChlKSA9PiB7CiAgICBpZiAoZS5rZXlDb2RlID09PSAxMykgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHNwYW4uYmx1cigpOwogICAgfQogIH07CiAgc3Bhbi52YWx1ZSA9IHZhbHVlOwp9CgpmdW5jdGlvbiBpbml0aWFsaXplQ29uZmlnVmFsdWVTcGFuKHNwYW4sIGtleSkgewogIC8vIEhlcmUgd2UgbW9zdGx5IHdhbnQgdG8gZGVmaW5lIHRoZSBzZXR0ZXIgYW5kIGdldHRlcgogIGNvbnN0IGNvbnRhaW5lciA9IHNwYW4uY2xvc2VzdCgiLmNsaXBib2FyZC1zcGFuIik7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwYW4sICJ2YWx1ZSIsIHsKICAgIGdldDogKCkgPT4gewogICAgICByZXR1cm4gcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV07CiAgICB9LAogICAgc2V0OiAodmFsKSA9PiB7CiAgICAgIC8vIGlmIHVuZGVmaW5lZCBpcyBwYXNzZWQsIHdlIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgb3B0aW9ucwogICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsKICAgICAgICBkZWxldGUgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGxvdF9vYmouY29uZmlnLnRvSW1hZ2VCdXR0b25PcHRpb25zW2tleV0gPSB2YWw7CiAgICAgIH0KICAgICAgY2hlY2tDb25maWdTeW5jKGNvbnRhaW5lcik7CiAgICB9LAogIH0pOwp9Cgpjb25zdCBjb25maWdfc3BhbnMgPSB7fTsKZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZ2V0SW1hZ2VPcHRpb25zKCkpKSB7CiAgY29uc3QgY29udGFpbmVyID0gQ0xJUEJPQVJEX0hFQURFUi5xdWVyeVNlbGVjdG9yKGAuY2xpcGJvYXJkLXNwYW4uJHtrZXl9YCk7CiAgY29uc3QgbGFiZWwgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmxhYmVsIik7CiAgLy8gV2UgZ2l2ZSB0aGUgbGFiZWwgYSBmdW5jdGlvbiB0aGF0IG9uIHNpbmdsZSBjbGljayB3aWxsIHNldCB0aGUgY3VycmVudCB2YWx1ZSBhbmQgd2l0aCBkb3VibGUgY2xpY2sgd2lsbCB1bnNldCBpdAogIGxhYmVsLm9uY2xpY2sgPSBEdWFsQ2xpY2soCiAgICAoKSA9PiB7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBjb250YWluZXIudWlfdmFsdWU7CiAgICB9LAogICAgKGUpID0+IHsKICAgICAgY29uc29sZS5sb2coImUiLCBlKTsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID0gdW5kZWZpbmVkOwogICAgfQogICk7CiAgY29uc3QgdWlfdmFsdWVfc3BhbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuY2xpcGJvYXJkLXZhbHVlIik7CiAgY29uc3QgY29uZmlnX3ZhbHVlX3NwYW4gPQogICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5jb25maWctdmFsdWUiKSA/PwogICAgbGFiZWwuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KAogICAgICAiYWZ0ZXJiZWdpbiIsCiAgICAgIGh0bWxgPHNwYW4gY2xhc3M9ImNvbmZpZy12YWx1ZSI+PC9zcGFuPmAKICAgICk7CiAgLy8gQXNzaW5nIHRoZSB0d28gc3BhbnMgYXMgcHJvcGVydGllcyBvZiB0aGUgY29udGFpbmluZyBzcGFuCiAgY29udGFpbmVyLnVpX3NwYW4gPSB1aV92YWx1ZV9zcGFuOwogIGNvbnRhaW5lci5jb25maWdfc3BhbiA9IGNvbmZpZ192YWx1ZV9zcGFuOwogIGNvbnRhaW5lci5rZXkgPSBrZXk7CiAgY29uZmlnX3NwYW5zW2tleV0gPSBjb250YWluZXI7CiAgaWYgKGZpcnN0UnVuKSB7CiAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPQogICAgICBwbG90X29iai5jb25maWcudG9JbWFnZUJ1dHRvbk9wdGlvbnMgPz8ge307CiAgICAvLyBXZSBkbyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHZhbHVlIHNwYW4KICAgIGluaXRpYWxpemVVSVZhbHVlU3Bhbih1aV92YWx1ZV9zcGFuLCBrZXksIHZhbHVlKTsKICAgIC8vIFRoZW4gd2UgaW5pdGlhbGl6ZSB0aGUgY29uZmlnIHZhbHVlCiAgICBpbml0aWFsaXplQ29uZmlnVmFsdWVTcGFuKGNvbmZpZ192YWx1ZV9zcGFuLCBrZXkpOwogICAgLy8gV2UgcHV0IHNvbWUgY29udmVuaWVuY2UgZ2V0dGVycy9zZXR0ZXJzCiAgICAvLyB1aV92YWx1ZSBmb3J3YXJkCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAidWlfdmFsdWUiLCB7CiAgICAgIGdldDogKCkgPT4gdWlfdmFsdWVfc3Bhbi52YWx1ZSwKICAgICAgc2V0OiAodmFsKSA9PiB7CiAgICAgICAgdWlfdmFsdWVfc3Bhbi52YWx1ZSA9IHZhbDsKICAgICAgfSwKICAgIH0pOwogICAgLy8gY29uZmlnX3ZhbHVlIGZvcndhcmQKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICJjb25maWdfdmFsdWUiLCB7CiAgICAgIGdldDogKCkgPT4gY29uZmlnX3ZhbHVlX3NwYW4udmFsdWUsCiAgICAgIHNldDogKHZhbCkgPT4gewogICAgICAgIGNvbmZpZ192YWx1ZV9zcGFuLnZhbHVlID0gdmFsOwogICAgICB9LAogICAgfSk7CiAgfQp9CgovLyBUaGVzZSBvYmplY3RzIHdpbGwgY29udGFpbiB0aGUgZGVmYXVsdCB2YWx1ZQoKLy8gVGhpcyBjb2RlIHVwZGF0ZXMgdGhlIGltYWdlIG9wdGlvbnMgaW4gdGhlIFBMT1QgY29uZmlnIHdpdGggdGhlIHByb3ZpZGVkIG9uZXMKZnVuY3Rpb24gc2V0SW1hZ2VPcHRpb25zKG8pIHsKICBmb3IgKGNvbnN0IFtrZXksIGNvbnRhaW5lcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnX3NwYW5zKSkgewogICAgY29udGFpbmVyLmNvbmZpZ192YWx1ZSA9IG9ba2V5XTsKICB9Cn0KZnVuY3Rpb24gdW5zZXRJbWFnZU9wdGlvbnMoKSB7CiAgc2V0SW1hZ2VPcHRpb25zKHt9KTsKfQoKY29uc3Qgc2V0X2J1dHRvbiA9IENMSVBCT0FSRF9IRUFERVIucXVlcnlTZWxlY3RvcigiLmNsaXBib2FyZC1zcGFuLnNldCIpOwpjb25zdCB1bnNldF9idXR0b24gPSBDTElQQk9BUkRfSEVBREVSLnF1ZXJ5U2VsZWN0b3IoIi5jbGlwYm9hcmQtc3Bhbi51bnNldCIpOwppZiAoZmlyc3RSdW4pIHsKICBzZXRfYnV0dG9uLm9uY2xpY2sgPSAoZSkgPT4gewogICAgZm9yIChjb25zdCBjb250YWluZXIgb2YgT2JqZWN0LnZhbHVlcyhjb25maWdfc3BhbnMpKSB7CiAgICAgIGNvbnRhaW5lci5jb25maWdfdmFsdWUgPSBjb250YWluZXIudWlfdmFsdWU7CiAgICB9CiAgfTsKICB1bnNldF9idXR0b24ub25jbGljayA9IHVuc2V0SW1hZ2VPcHRpb25zOwp9CgovLyBXZSBhZGQgYSBmdW5jdGlvbiB0byBjaGVjayBpZiB0aGUgY2xpcGJvYXJkIGlzIHBvcHBlZCBvdXQKQ09OVEFJTkVSLmlzUG9wcGVkT3V0ID0gKCkgPT4gewogIHJldHVybiBDT05UQUlORVIuY2xhc3NMaXN0LmNvbnRhaW5zKCJwb3BwZWQtb3V0Iik7Cn07CgpDTElQQk9BUkRfSEVBREVSLm9ubW91c2Vkb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgaWYgKGV2ZW50LnRhcmdldC5tYXRjaGVzKCJzcGFuLmNsaXBib2FyZC12YWx1ZSIpKSB7CiAgICBjb25zb2xlLmxvZygiV2UgZG9uJ3QgbW92ZSEiKTsKICAgIHJldHVybjsKICB9CiAgY29uc3Qgc3RhcnQgPSB7CiAgICBsZWZ0OiBwYXJzZUZsb2F0KENPTlRBSU5FUi5zdHlsZS5sZWZ0KSwKICAgIHRvcDogcGFyc2VGbG9hdChDT05UQUlORVIuc3R5bGUudG9wKSwKICAgIFg6IGV2ZW50LnBhZ2VYLAogICAgWTogZXZlbnQucGFnZVksCiAgfTsKICBmdW5jdGlvbiBtb3ZlQXQoZXZlbnQsIHN0YXJ0KSB7CiAgICBjb25zdCB0b3AgPSBldmVudC5wYWdlWSAtIHN0YXJ0LlkgKyBzdGFydC50b3AgKyAicHgiOwogICAgY29uc3QgbGVmdCA9IGV2ZW50LnBhZ2VYIC0gc3RhcnQuWCArIHN0YXJ0LmxlZnQgKyAicHgiOwogICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gbGVmdDsKICAgIENPTlRBSU5FUi5zdHlsZS5sZWZ0ID0gbGVmdDsKICAgIENPTlRBSU5FUi5zdHlsZS50b3AgPSB0b3A7CiAgfQoKICAvLyBtb3ZlIG91ciBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYmFsbCB1bmRlciB0aGUgcG9pbnRlcgogIG1vdmVBdChldmVudCwgc3RhcnQpOwogIGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGV2ZW50KSB7CiAgICBtb3ZlQXQoZXZlbnQsIHN0YXJ0KTsKICB9CgogIC8vIFdlIHVzZSB0aGlzIHRvIHJlbW92ZSB0aGUgbW91c2Vtb3ZlIHdoZW4gY2xpY2tpbmcgb3V0c2lkZSBvZiB0aGUgY29udGFpbmVyCiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKCiAgLy8gbW92ZSB0aGUgY29udGFpbmVyIG9uIG1vdXNlbW92ZQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIG9uTW91c2VNb3ZlLCB7CiAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLAogIH0pOwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAibW91c2Vkb3duIiwKICAgIChlKSA9PiB7CiAgICAgIGlmIChlLnRhcmdldC5jbG9zZXN0KCIucGx1dG9wbG90bHktY29udGFpbmVyIikgIT09IENPTlRBSU5FUikgewogICAgICAgIGNsZWFuVXAoKTsKICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9LAogICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0KICApOwoKICBmdW5jdGlvbiBjbGVhblVwKCkgewogICAgY29uc29sZS5sb2coImNsZWFuaW5nIHVwIHRoZSBwbG90IG1vdmUgbGlzdGVuZXIiKTsKICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgIENMSVBCT0FSRF9IRUFERVIub25tb3VzZXVwID0gbnVsbDsKICB9CgogIC8vICgzKSBkcm9wIHRoZSBiYWxsLCByZW1vdmUgdW5uZWVkZWQgaGFuZGxlcnMKICBDTElQQk9BUkRfSEVBREVSLm9ubW91c2V1cCA9IGNsZWFuVXA7Cn07CgpmdW5jdGlvbiBzZW5kVG9DbGlwYm9hcmQoYmxvYikgewogIGlmICghbmF2aWdhdG9yLmNsaXBib2FyZCkgewogICAgYWxlcnQoCiAgICAgICJUaGUgQ2xpcGJvYXJkIEFQSSBkb2VzIG5vdCBzZWVtIHRvIGJlIGF2YWlsYWJsZSwgbWFrZSBzdXJlIHRoZSBQbHV0byBub3RlYm9vayBpcyBiZWluZyB1c2VkIGZyb20gZWl0aGVyIGxvY2FsaG9zdCBvciBhbiBodHRwcyBzb3VyY2UuIgogICAgKTsKICB9CiAgbmF2aWdhdG9yLmNsaXBib2FyZAogICAgLndyaXRlKFsKICAgICAgbmV3IENsaXBib2FyZEl0ZW0oewogICAgICAgIC8vIFRoZSBrZXkgaXMgZGV0ZXJtaW5lZCBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgYmxvYidzIHR5cGUuCiAgICAgICAgW2Jsb2IudHlwZV06IGJsb2IsCiAgICAgIH0pLAogICAgXSkKICAgIC50aGVuKAogICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgY29uc29sZS5sb2coIkFzeW5jOiBDb3B5aW5nIHRvIGNsaXBib2FyZCB3YXMgc3VjY2Vzc2Z1bCEiKTsKICAgICAgfSwKICAgICAgZnVuY3Rpb24gKGVycikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkFzeW5jOiBDb3VsZCBub3QgY29weSB0ZXh0OiAiLCBlcnIpOwogICAgICB9CiAgICApOwp9CgpmdW5jdGlvbiBjb3B5SW1hZ2VUb0NsaXBib2FyZCgpIHsKICAvLyBXZSBleHRyYWN0IHRoZSBpbWFnZSBvcHRpb25zIGZyb20gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMgKGlmIHRoZXkgZXhpc3QpCiAgY29uc3QgY29uZmlnID0ge307CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGxldCB2YWwgPQogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID8/CiAgICAgIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IGNvbnRhaW5lci51aV92YWx1ZSA6IHVuZGVmaW5lZCk7CiAgICAvLyBJZiB3ZSBoYXZlIHVuZGVmaW5lZCB3ZSBkb24ndCBjcmVhdGUgdGhlIGtleS4gV2UgYWxzbyBpZ25vcmUgZm9ybWF0IGJlY2F1c2UgdGhlIGNsaXBib2FyZCBvbmx5IHN1cHBvcnRzIHBuZy4KICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09ICJmb3JtYXQiKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uZmlnW2tleV0gPSB2YWw7CiAgfQogIFBsb3RseS50b0ltYWdlKFBMT1QsIGNvbmZpZykudGhlbihmdW5jdGlvbiAoZGF0YVVybCkgewogICAgZmV0Y2goZGF0YVVybCkKICAgICAgLnRoZW4oKHJlcykgPT4gcmVzLmJsb2IoKSkKICAgICAgLnRoZW4oKGJsb2IpID0+IHsKICAgICAgICBjb25zdCBwYXN0ZV9yZWNlaXZlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3Bhc3RlLXJlY2VpdmVyLnBsdXRvcGxvdGx5JykKICAgICAgICBpZiAocGFzdGVfcmVjZWl2ZXIpIHsKICAgICAgICAgIHBhc3RlX3JlY2VpdmVyLmF0dGFjaEltYWdlKGRhdGFVcmwsIENPTlRBSU5FUikKICAgICAgICB9CiAgICAgICAgc2VuZFRvQ2xpcGJvYXJkKGJsb2IpCiAgICAgIH0pOwogIH0pOwp9CgpmdW5jdGlvbiBzYXZlSW1hZ2VUb0ZpbGUoKSB7CiAgY29uc3QgY29uZmlnID0ge307CiAgZm9yIChjb25zdCBba2V5LCBjb250YWluZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGxldCB2YWwgPQogICAgICBjb250YWluZXIuY29uZmlnX3ZhbHVlID8/CiAgICAgIChDT05UQUlORVIuaXNQb3BwZWRPdXQoKSA/IGNvbnRhaW5lci51aV92YWx1ZSA6IHVuZGVmaW5lZCk7CiAgICAvLyBJZiB3ZSBoYXZlIHVuZGVmaW5lZCB3ZSBkb24ndCBjcmVhdGUgdGhlIGtleS4KICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbmZpZ1trZXldID0gdmFsOwogIH0KICBQbG90bHkuZG93bmxvYWRJbWFnZShQTE9ULCBjb25maWcpOwp9CgpsZXQgY29udGFpbmVyX3JlY3QgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAsIHRvcDogMCwgbGVmdDogMCB9OwpmdW5jdGlvbiB1bnBvcF9jb250YWluZXIoY2wpIHsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZSgicG9wcGVkLW91dCIsIGZhbHNlKTsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZShjbCwgZmFsc2UpOwogIC8vIFdlIGZpeCB0aGUgaGVpZ2h0IGJhY2sgdG8gdGhlIHZhbHVlIGl0IGhhZCBiZWZvcmUgcG9wb3V0LCBhbHNvIHNldHRpbmcgdGhlIGZsYWcgdG8gc2lnbmFsIHRoYXQgdXBvbiBmaXJzdCByZXNpemUgd2UgcmVtb3ZlIHRoZSBmaXhlZCBpbmxpbmUtc3R5bGUKICBDT05UQUlORVIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyX3JlY3QuaGVpZ2h0ICsgInB4IjsKICByZW1vdmVfY29udGFpbmVyX3NpemUgPSB0cnVlOwogIC8vIFdlIHNldCB0aGUgb3RoZXIgZml4ZWQgaW5saW5lLXN0eWxlcyB0byBudWxsCiAgQ09OVEFJTkVSLnN0eWxlLndpZHRoID0gIiI7CiAgQ09OVEFJTkVSLnN0eWxlLnRvcCA9ICIiOwogIENPTlRBSU5FUi5zdHlsZS5sZWZ0ID0gIiI7CiAgLy8gV2UgYWxzbyByZW1vdmUgdGhlIENMSVBCT0FSRF9IRUFERVIKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLndpZHRoID0gIiI7CiAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZS5sZWZ0ID0gIiI7CiAgLy8gRmluYWxseSB3ZSByZW1vdmUgdGhlIGhpZGRlbiBjbGFzcyB0byB0aGUgaGVhZGVyCiAgQ0xJUEJPQVJEX0hFQURFUi5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iLCB0cnVlKTsKICByZXR1cm47Cn0KZnVuY3Rpb24gcG9wb3V0X2NvbnRhaW5lcihvcHRzKSB7CiAgY29uc3QgY2wgPSBvcHRzPy5jbDsKICBjb25zdCB0YXJnZXRfY29udGFpbmVyX3NpemUgPSBvcHRzPy50YXJnZXRfY29udGFpbmVyX3NpemUgPz8ge307CiAgY29uc3QgdGFyZ2V0X3Bsb3Rfc2l6ZSA9IG9wdHM/LnRhcmdldF9wbG90X3NpemUgPz8ge307CiAgaWYgKENPTlRBSU5FUi5pc1BvcHBlZE91dCgpKSB7CiAgICByZXR1cm4gdW5wb3BfY29udGFpbmVyKGNsKTsKICB9CiAgQ09OVEFJTkVSLmNsYXNzTGlzdC50b2dnbGUoY2wsIGNsID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IHRydWUpOwogIC8vIFdlIGV4dHJhY3QgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgY29udGFpbmVyLCBzYXZlIHRoZW0gYW5kIGZpeCB0aGVtCiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfSA9IENPTlRBSU5FUi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICBjb250YWluZXJfcmVjdCA9IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH07CiAgLy8gV2Ugc2F2ZSB0aGUgY3VycmVudCBwbG90IHNpemUgYmVmb3JlIHdlIHBvcCBhcyBpdCB3aWxsIGZpbGwgdGhlIHNjcmVlbgogIGNvbnN0IGN1cnJlbnRfcGxvdF9zaXplID0gewogICAgd2lkdGg6IFBMT1QuX2Z1bGxMYXlvdXQud2lkdGgsCiAgICBoZWlnaHQ6IFBMT1QuX2Z1bGxMYXlvdXQuaGVpZ2h0LAogIH07CiAgLy8gV2UgaGF2ZSB0byBzYXZlIHRoZSBwYWQgZGF0YSBiZWZvcmUgcG9wcGluZyBzbyB3ZSBjYW4gcmVzaXplIHByZWNpc2VseQogIGNvbnN0IHBhZCA9IHt9OwogIHBhZC51bnBvcHBlZCA9IGdldFNpemVEYXRhKCkuY29udGFpbmVyX3BhZDsKICBDT05UQUlORVIuY2xhc3NMaXN0LnRvZ2dsZSgicG9wcGVkLW91dCIsIHRydWUpOwogIHBhZC5wb3BwZWQgPSBnZXRTaXplRGF0YSgpLmNvbnRhaW5lcl9wYWQ7CiAgLy8gV2UgZG8gdG9wIGFuZCBsZWZ0IGJhc2VkIG9uIHRoZSBjdXJyZW50IHJlY3QKICBmb3IgKGNvbnN0IGtleSBvZiBbInRvcCIsICJsZWZ0Il0pIHsKICAgIGNvbnN0IHN0YXJ0X3ZhbCA9IHRhcmdldF9jb250YWluZXJfc2l6ZVtrZXldID8/IGNvbnRhaW5lcl9yZWN0W2tleV07CiAgICBsZXQgb2Zmc2V0ID0gMDsKICAgIGZvciAoY29uc3Qga2luZCBvZiBbInBhZGRpbmciLCAiYm9yZGVyIl0pIHsKICAgICAgb2Zmc2V0ICs9IHBhZC5wb3BwZWRba2luZF1ba2V5XSAtIHBhZC51bnBvcHBlZFtraW5kXVtrZXldOwogICAgfQogICAgQ09OVEFJTkVSLnN0eWxlW2tleV0gPSBzdGFydF92YWwgLSBvZmZzZXQgKyAicHgiOwogICAgaWYgKGtleSA9PT0gImxlZnQiKSB7CiAgICAgIENMSVBCT0FSRF9IRUFERVIuc3R5bGVba2V5XSA9IENPTlRBSU5FUi5zdHlsZVtrZXldOwogICAgfQogIH0KICAvLyBXZSBjb21wdXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGRlcGVuZGluZyBvbiBldmVudHVhbCBjb25maWcgZGF0YQogIGNvbnN0IGNzeiA9IGNvbXB1dGVDb250YWluZXJTaXplKHsKICAgIHdpZHRoOgogICAgICB0YXJnZXRfcGxvdF9zaXplLndpZHRoID8/CiAgICAgIGNvbmZpZ19zcGFucy53aWR0aC5jb25maWdfdmFsdWUgPz8KICAgICAgY3VycmVudF9wbG90X3NpemUud2lkdGgsCiAgICBoZWlnaHQ6CiAgICAgIHRhcmdldF9wbG90X3NpemUuaGVpZ2h0ID8/CiAgICAgIGNvbmZpZ19zcGFucy5oZWlnaHQuY29uZmlnX3ZhbHVlID8/CiAgICAgIGN1cnJlbnRfcGxvdF9zaXplLmhlaWdodCwKICB9KTsKICBmb3IgKGNvbnN0IGtleSBvZiBbIndpZHRoIiwgImhlaWdodCJdKSB7CiAgICBjb25zdCB2YWwgPSB0YXJnZXRfY29udGFpbmVyX3NpemVba2V5XSA/PyBjc3pba2V5XTsKICAgIENPTlRBSU5FUi5zdHlsZVtrZXldID0gdmFsICsgInB4IjsKICAgIGlmIChrZXkgPT09ICJ3aWR0aCIpIHsKICAgICAgQ0xJUEJPQVJEX0hFQURFUi5zdHlsZVtrZXldID0gQ09OVEFJTkVSLnN0eWxlW2tleV07CiAgICB9CiAgfQogIENMSVBCT0FSRF9IRUFERVIuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgZmFsc2UpOwogIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CgogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAibW91c2Vkb3duIiwKICAgIChlKSA9PiB7CiAgICAgIGlmIChlLnRhcmdldC5jbG9zZXN0KCIucGx1dG9wbG90bHktY29udGFpbmVyIikgIT09IENPTlRBSU5FUikgewogICAgICAgIHVucG9wX2NvbnRhaW5lcigpOwogICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sCiAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfQogICk7Cn0KCkNPTlRBSU5FUi5wb3BPdXQgPSBwb3BvdXRfY29udGFpbmVyOwoKZnVuY3Rpb24gRHVhbENsaWNrKHNpbmdsZV9mdW5jLCBkYmxfZnVuYykgewogIGxldCBuY2xpY2tzID0gMDsKICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHsKICAgIG5jbGlja3MgKz0gMTsKICAgIGlmIChuY2xpY2tzID4gMSkgewogICAgICBkYmxfZnVuYyguLi5hcmdzKTsKICAgICAgbmNsaWNrcyA9IDA7CiAgICB9IGVsc2UgewogICAgICBkZWxheSgzMDApLnRoZW4oKCkgPT4gewogICAgICAgIGlmIChuY2xpY2tzID09IDEpIHsKICAgICAgICAgIHNpbmdsZV9mdW5jKC4uLmFyZ3MpOwogICAgICAgIH0KICAgICAgICBuY2xpY2tzID0gMDsKICAgICAgfSk7CiAgICB9CiAgfTsKfQoKLy8gV2UgcmVtb3ZlIHRoZSBkZWZhdWx0IGRvd25sb2FkIGltYWdlIGJ1dHRvbgpwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb1JlbW92ZSA9IF8udW5pb24oCiAgcGxvdF9vYmouY29uZmlnLm1vZGVCYXJCdXR0b25zVG9SZW1vdmUsCiAgWyJ0b0ltYWdlIl0KKTsKLy8gV2UgYWRkIHRoZSBjdXN0b20gYnV0dG9uIHRvIHRoZSBtb2RlYmFyCnBsb3Rfb2JqLmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvQWRkID0gXy51bmlvbigKICBwbG90X29iai5jb25maWcubW9kZUJhckJ1dHRvbnNUb0FkZCwKICBbCiAgICB7CiAgICAgIG5hbWU6ICJDb3B5IFBORyB0byBDbGlwYm9hcmQiLAogICAgICBpY29uOiB7CiAgICAgICAgaGVpZ2h0OiA1MjAsCiAgICAgICAgd2lkdGg6IDUyMCwKICAgICAgICBwYXRoOiAiTTI4MCA2NGg0MGMzNS4zIDAgNjQgMjguNyA2NCA2NFY0NDhjMCAzNS4zLTI4LjcgNjQtNjQgNjRINjRjLTM1LjMgMC02NC0yOC43LTY0LTY0VjEyOEMwIDkyLjcgMjguNyA2NCA2NCA2NGg0MCA5LjZDMTIxIDI3LjUgMTUzLjMgMCAxOTIgMHM3MSAyNy41IDc4LjQgNjRIMjgwek02NCAxMTJjLTguOCAwLTE2IDcuMi0xNiAxNlY0NDhjMCA4LjggNy4yIDE2IDE2IDE2SDMyMGM4LjggMCAxNi03LjIgMTYtMTZWMTI4YzAtOC44LTcuMi0xNi0xNi0xNkgzMDR2MjRjMCAxMy4zLTEwLjcgMjQtMjQgMjRIMTkyIDEwNGMtMTMuMyAwLTI0LTEwLjctMjQtMjRWMTEySDY0em0xMjgtOGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6IiwKICAgICAgfSwKICAgICAgZGlyZWN0aW9uOiAidXAiLAogICAgICBjbGljazogRHVhbENsaWNrKGNvcHlJbWFnZVRvQ2xpcGJvYXJkLCAoKSA9PiB7CiAgICAgICAgcG9wb3V0X2NvbnRhaW5lcigpOwogICAgICB9KSwKICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICJEb3dubG9hZCBJbWFnZSIsCiAgICAgIGljb246IFBsb3RseS5JY29ucy5jYW1lcmEsCiAgICAgIGRpcmVjdGlvbjogInVwIiwKICAgICAgY2xpY2s6IER1YWxDbGljayhzYXZlSW1hZ2VUb0ZpbGUsICgpID0+IHsKICAgICAgICBwb3BvdXRfY29udGFpbmVyKHsgY2w6ICJmaWxlc2F2ZSIgfSk7CiAgICAgIH0pLAogICAgfSwKICBdCik7CgpmdW5jdGlvbiBnZXRPZmZzZXREYXRhKGVsKSB7CiAgbGV0IGNzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwsIG51bGwpOwogIGNvbnN0IG9kYXRhID0gewogICAgcGFkZGluZzogewogICAgICBsZWZ0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdMZWZ0KSwKICAgICAgcmlnaHQ6IHBhcnNlRmxvYXQoY3MucGFkZGluZ1JpZ2h0KSwKICAgICAgdG9wOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdUb3ApLAogICAgICBib3R0b206IHBhcnNlRmxvYXQoY3MucGFkZGluZ0JvdHRvbSksCiAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdMZWZ0KSArIHBhcnNlRmxvYXQoY3MucGFkZGluZ1JpZ2h0KSwKICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGNzLnBhZGRpbmdUb3ApICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tKSwKICAgIH0sCiAgICBib3JkZXI6IHsKICAgICAgbGVmdDogcGFyc2VGbG9hdChjcy5ib3JkZXJMZWZ0V2lkdGgpLAogICAgICByaWdodDogcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoKSwKICAgICAgdG9wOiBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoKSwKICAgICAgYm90dG9tOiBwYXJzZUZsb2F0KGNzLmJvcmRlckJvdHRvbVdpZHRoKSwKICAgICAgd2lkdGg6IHBhcnNlRmxvYXQoY3MuYm9yZGVyTGVmdFdpZHRoKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyUmlnaHRXaWR0aCksCiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChjcy5ib3JkZXJUb3BXaWR0aCkgKyBwYXJzZUZsb2F0KGNzLmJvcmRlckJvdHRvbVdpZHRoKSwKICAgIH0KICB9OwogIGlmIChlbCA9PT0gUExPVCkgewogICAgLy8gRm9yIHRoZSBQTE9UIHdlIGFsc28gd2FudCB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgb2Zmc2V0CiAgICBvZGF0YS5vZmZzZXQgPSB7CiAgICAgIHRvcDogUExPVC5vZmZzZXRQYXJlbnQgPT0gQ09OVEFJTkVSID8gUExPVC5vZmZzZXRUb3AgOiAwLAogICAgICBsZWZ0OiBQTE9ULm9mZnNldFBhcmVudCA9PSBDT05UQUlORVIgPyBQTE9ULm9mZnNldExlZnQgOiAwLAogICAgfQogIH0KICByZXR1cm4gb2RhdGE7Cn0KZnVuY3Rpb24gZ2V0U2l6ZURhdGEoKSB7CiAgY29uc3QgZGF0YSA9IHsKICAgIHBsb3RfcGFkOiBnZXRPZmZzZXREYXRhKFBMT1QpLAogICAgcGxvdF9yZWN0OiBQTE9ULmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogICAgY29udGFpbmVyX3BhZDogZ2V0T2Zmc2V0RGF0YShDT05UQUlORVIpLAogICAgY29udGFpbmVyX3JlY3Q6IENPTlRBSU5FUi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICB9OwogIHJldHVybiBkYXRhOwp9CmZ1bmN0aW9uIGNvbXB1dGVDb250YWluZXJTaXplKHsgd2lkdGgsIGhlaWdodCB9LCBzaXplRGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICBjb25zdCBjb21wdXRlZF9zaXplID0gY29tcHV0ZVBsb3RTaXplKHNpemVEYXRhKTsKICBjb25zdCBvZmZzZXRzID0gY29tcHV0ZWRfc2l6ZS5vZmZzZXRzOwoKICBjb25zdCBwbG90X2RhdGEgPSB7CiAgICB3aWR0aDogd2lkdGggPz8gY29tcHV0ZWRfc2l6ZS53aWR0aCwKICAgIGhlaWdodDogaGVpZ2h0ID8/IGNvbXB1dGVkX3NpemUuaGVpZ2h0LAogIH07CgogIHJldHVybiB7CiAgICB3aWR0aDogKHdpZHRoID8/IGNvbXB1dGVkX3NpemUud2lkdGgpICsgb2Zmc2V0cy53aWR0aCwKICAgIGhlaWdodDogKGhlaWdodCA/PyBjb21wdXRlZF9zaXplLmhlaWdodCkgKyBvZmZzZXRzLmhlaWdodCwKICAgIG5vQ2hhbmdlOiB3aWR0aCA9PSBjb21wdXRlZF9zaXplLndpZHRoICYmIGhlaWdodCA9PSBjb21wdXRlZF9zaXplLmhlaWdodCwKICB9Cn0KCi8vIFRoaXMgZnVuY3Rpb24gd2lsbCBjaGFuZ2UgdGhlIGNvbnRhaW5lciBzaXplIHNvIHRoYXQgdGhlIHJlc3VsdGluZyBwbG90IHdpbGwgYmUgbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIHNwZWNzCmZ1bmN0aW9uIGNoYW5nZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKSkgewogIGlmICghQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgIGNvbnNvbGUubG9nKCJUcmllZCB0byBjaGFuZ2UgY29udGFpbmVyIHNpemUgd2hlbiBub3QgcG9wcGVkLCBpZ25vcmluZyIpOwogICAgcmV0dXJuOwogIH0KCiAgY29uc3QgY3N6ID0gY29tcHV0ZUNvbnRhaW5lclNpemUoeyB3aWR0aCwgaGVpZ2h0IH0sIHNpemVEYXRhKTsKCiAgaWYgKGNzei5ub0NoYW5nZSkgewogICAgY29uc29sZS5sb2coIlNpemUgaXMgdGhlIHNhbWUgYXMgY3VycmVudCwgaWdub3JpbmciKTsKICAgIHJldHVybgogIH0KICAvLyBXZSBhcmUgbm93IGdvaW5nIHRvIHNldCBoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBjb250YWluZXIKICBmb3IgKGNvbnN0IGtleSBvZiBbIndpZHRoIiwgImhlaWdodCJdKSB7CiAgICBDT05UQUlORVIuc3R5bGVba2V5XSA9IGNzeltrZXldICsgInB4IjsKICB9Cn0KLy8gV2Ugbm93IGNyZWF0ZSB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIHVwZGF0ZSB0aGUgcGxvdCBiYXNlZCBvbiB0aGUgdmFsdWVzIHNwZWNpZmllZApmdW5jdGlvbiB1cGRhdGVGcm9tSGVhZGVyKCkgewogIGNvbnN0IGhlYWRlcl9kYXRhID0gewogICAgaGVpZ2h0OiBjb25maWdfc3BhbnMuaGVpZ2h0LnVpX3ZhbHVlLAogICAgd2lkdGg6IGNvbmZpZ19zcGFucy53aWR0aC51aV92YWx1ZSwKICB9OwogIGNoYW5nZUNvbnRhaW5lclNpemUoaGVhZGVyX2RhdGEpOwp9Ci8vIFdlIGFzc2lnbiB0aGlzIGZ1bmN0aW9uIHRvIHRoZSBvbmJsdXIgZXZlbnQgb2Ygd2lkdGggYW5kIGhlaWdodAppZiAoZmlyc3RSdW4pIHsKICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBPYmplY3QudmFsdWVzKGNvbmZpZ19zcGFucykpIHsKICAgIGNvbnRhaW5lci51aV9zcGFuLm9uYmx1ciA9IChlKSA9PiB7CiAgICAgIGNvbnRhaW5lci51aV92YWx1ZSA9IGNvbnRhaW5lci51aV9zcGFuLnRleHRDb250ZW50OwogICAgICB1cGRhdGVGcm9tSGVhZGVyKCk7CiAgICB9OwogIH0KfQovLyBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBwbG90IHNpemUgdG8gdXNlIGZvciByZWxheW91dCBhcyBhIGZ1bmN0aW9uIG9mIHRoZSBjb250YWluZXIgc2l6ZQpmdW5jdGlvbiBjb21wdXRlUGxvdFNpemUoZGF0YSA9IGdldFNpemVEYXRhKCkpIHsKICAvLyBSZW1vdmUgUGFkZGluZwogIGNvbnN0IHsgY29udGFpbmVyX3BhZCwgcGxvdF9wYWQsIGNvbnRhaW5lcl9yZWN0IH0gPSBkYXRhOwogIGNvbnN0IG9mZnNldHMgPSB7CiAgICB3aWR0aDoKICAgICAgcGxvdF9wYWQucGFkZGluZy53aWR0aCArCiAgICAgIHBsb3RfcGFkLmJvcmRlci53aWR0aCArCiAgICAgIHBsb3RfcGFkLm9mZnNldC5sZWZ0ICsKICAgICAgY29udGFpbmVyX3BhZC5wYWRkaW5nLndpZHRoICsKICAgICAgY29udGFpbmVyX3BhZC5ib3JkZXIud2lkdGgsCiAgICBoZWlnaHQ6CiAgICAgIHBsb3RfcGFkLnBhZGRpbmcuaGVpZ2h0ICsKICAgICAgcGxvdF9wYWQuYm9yZGVyLmhlaWdodCArCiAgICAgIHBsb3RfcGFkLm9mZnNldC50b3AgKwogICAgICBjb250YWluZXJfcGFkLnBhZGRpbmcuaGVpZ2h0ICsKICAgICAgY29udGFpbmVyX3BhZC5ib3JkZXIuaGVpZ2h0LAogIH07CiAgY29uc3Qgc3ogPSB7CiAgICB3aWR0aDogTWF0aC5yb3VuZChjb250YWluZXJfcmVjdC53aWR0aCAtIG9mZnNldHMud2lkdGgpLAogICAgaGVpZ2h0OiBNYXRoLnJvdW5kKGNvbnRhaW5lcl9yZWN0LmhlaWdodCAtIG9mZnNldHMuaGVpZ2h0KSwKICAgIG9mZnNldHMsCiAgfTsKICByZXR1cm4gc3o7Cn0KCi8vIENyZWF0ZSB0aGUgcmVzaXplT2JzZXJ2ZXIgdG8gbWFrZSB0aGUgcGxvdCBldmVuIG1vcmUgcmVzcG9uc2l2ZSEgOm1hZ2ljOgpjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4gewogIGNvbnN0IHNpemVEYXRhID0gZ2V0U2l6ZURhdGEoKTsKICBjb25zdCB7Y29udGFpbmVyX3JlY3QsIGNvbnRhaW5lcl9wYWR9ID0gc2l6ZURhdGE7CiAgbGV0IHBsb3Rfc2l6ZSA9IGNvbXB1dGVQbG90U2l6ZShzaXplRGF0YSk7CiAgLy8gV2Ugc2F2ZSB0aGUgaGVpZ2h0IGluIHRoZSBQTE9UIG9iamVjdAogIFBMT1QuY29udGFpbmVyX2hlaWdodCA9IGNvbnRhaW5lcl9yZWN0LmhlaWdodDsKICAvLyBXZSBkZWFsIHdpdGggc29tZSBzdHVmZiBpZiB0aGUgY29udGFpbmVyIGlzIHBvcHBwZWQKICBDTElQQk9BUkRfSEVBREVSLnN0eWxlLndpZHRoID0gY29udGFpbmVyX3JlY3Qud2lkdGggKyAicHgiOwogIENMSVBCT0FSRF9IRUFERVIuc3R5bGUubGVmdCA9IGNvbnRhaW5lcl9yZWN0LmxlZnQgKyAicHgiOwogIGNvbmZpZ19zcGFucy5oZWlnaHQudWlfdmFsdWUgPSBwbG90X3NpemUuaGVpZ2h0OwogIGNvbmZpZ19zcGFucy53aWR0aC51aV92YWx1ZSA9IHBsb3Rfc2l6ZS53aWR0aDsKICAvKiAKCQlUaGUgYWRkaXRpb24gb2YgdGhlIGludmFsaWQgYXJndW1lbnQgYHBsdXRvcmVzaXplYCBzZWVtcyB0byBmaXggdGhlIHByb2JsZW0gd2l0aCBjYWxsaW5nIGByZWxheW91dGAgc2ltcGx5IHdpdGggYHthdXRvc2l6ZTogdHJ1ZX1gIGFzIHVwZGF0ZSBicmVha2luZyBtb3VzZSByZWxheW91dCBldmVudHMgdHJhY2tpbmcuIAoJCVNlZSBodHRwczovL2dpdGh1Yi5jb20vcGxvdGx5L3Bsb3RseS5qcy9pc3N1ZXMvNjE1NiBmb3IgZGV0YWlscwoJCSovCiAgbGV0IGNvbmZpZyA9IHsKICAgIC8vIElmIHRoaXMgaXMgcG9wcGVkIG91dCwgd2UgaWdub3JlIHRoZSBvcmlnaW5hbCB3aWR0aC9oZWlnaHQKICAgIHdpZHRoOiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyB1bmRlZmluZWQgOiBvcmlnaW5hbF93aWR0aCkgPz8gcGxvdF9zaXplLndpZHRoLAogICAgaGVpZ2h0OiAoQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkgPyB1bmRlZmluZWQgOiBvcmlnaW5hbF9oZWlnaHQpID8/IHBsb3Rfc2l6ZS5oZWlnaHQsCiAgICBwbHV0b3Jlc2l6ZTogdHJ1ZSwKICB9OwogIFBsb3RseS5yZWxheW91dChQTE9ULCBjb25maWcpLnRoZW4oKCkgPT4gewogICAgaWYgKHJlbW92ZV9jb250YWluZXJfc2l6ZSAmJiAhQ09OVEFJTkVSLmlzUG9wcGVkT3V0KCkpIHsKICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgdGhlIGZpcnN0IHJlc2l6ZSB1cG9uIHBsb3QgY3JlYXRpb24gdG8gYWxyZWFkeSBiZSB3aXRob3V0IGEgZml4ZWQgaGVpZ2h0CiAgICAgIENPTlRBSU5FUi5zdHlsZS5oZWlnaHQgPSAiIjsKICAgICAgQ09OVEFJTkVSLnN0eWxlLndpZHRoID0gIiI7CiAgICAgIHJlbW92ZV9jb250YWluZXJfc2l6ZSA9IGZhbHNlOwogICAgfQogIH0pOwp9KTsKCnJlc2l6ZU9ic2VydmVyLm9ic2VydmUoQ09OVEFJTkVSKTsKCgpQbG90bHkucmVhY3QoUExPVCwgcGxvdF9vYmopLnRoZW4oKCkgPT4gewoJLy8gQXNzaWduIHRoZSBQbG90bHkgZXZlbnQgbGlzdGVuZXJzCglmb3IgKGNvbnN0IFtrZXksIGxpc3RlbmVyX3ZlY10gb2YgT2JqZWN0LmVudHJpZXMocGxvdGx5X2xpc3RlbmVycykpIHsKCQlmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVyX3ZlYykgewoJCQlQTE9ULm9uKGtleSwgbGlzdGVuZXIpCgkJfQoJfQoJLy8gQXNzaWduIHRoZSBKUyBldmVudCBsaXN0ZW5lcnMKCWZvciAoY29uc3QgW2tleSwgbGlzdGVuZXJfdmVjXSBvZiBPYmplY3QuZW50cmllcyhqc19saXN0ZW5lcnMpKSB7CgkJZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcl92ZWMpIHsKCQkJUExPVC5hZGRFdmVudExpc3RlbmVyKGtleSwgbGlzdGVuZXIsIHsKCQkJCXNpZ25hbDogY29udHJvbGxlci5zaWduYWwKCQkJfSkKCQl9Cgl9Cn0KKQoKCmludmFsaWRhdGlvbi50aGVuKCgpID0+IHsKCS8vIFJlbW92ZSBhbGwgcGxvdGx5IGxpc3RlbmVycwoJUExPVC5yZW1vdmVBbGxMaXN0ZW5lcnMoKQoJLy8gUmVtb3ZlIGFsbCBKUyBsaXN0ZW5lcnMKCWNvbnRyb2xsZXIuYWJvcnQoKQoJLy8gUmVtb3ZlIHRoZSByZXNpemVPYnNlcnZlcgoJcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpCn0pCgoKCgkJcmV0dXJuIENPTlRBSU5FUgoJPC9zY3JpcHQ+CqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2b/IJ1OeDrBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkMWE2MmFlNzEtNThkYi00OWVhLWFlNmEtOWFlYTY2MTQ1OTYzuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXONlimhbVwdWJsaXNoZWRfb2JqZWN0X2tleXOR2TVlZDI3ZGUxYS04MWQ5LTExZWYtM2I3My0xYjExNjMxMmRhZTcvZTRiODEyMjY4NDVjYWUyMLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SRmNTdhMmI2Yy1lYjRjLTQ1YmQtODA1OC00YTYwYjAzODkyNWSKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52WE8ZGl2IGNsYXNzPSJtYXJrZG93biI+PHVsPgo8bGk+PHA+Q2FyZGlhYyBwaGFudG9tICYjNDA7c2hvdy9oaWRlIGNvZGUmIzQxOzwvcD4KPC9saT4KPC91bD4KPC9kaXY+pG1pbWWpdGV4dC9odG1srHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv8gegIMbsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SRmNTdhMmI2Yy1lYjRjLTQ1YmQtODA1OC00YTYwYjAzODkyNWS5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4AMDebtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkOGRkNzA0YTQtYmY1MC00ZGRjLWE4MzItZDA3NGJkNTJhZDAxiqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9kedm5PGRpdiBjbGFzcz0ibWFya2Rvd24iPjxwPlRocmVlIGhlYXJ0YmVhdHMgd2VyZSBjb25zaWRlcmVkIHRvIGFjaGlldmUgc3RlYWR5LXN0YXRlIGFuZCB0aGUgZm91cnRoIGhlYXJ0YmVhdCB3YXMgdXNlZCB0byBtZWFzdXJlIHRoZSBtYWduZXRpemF0aW9uIHJlc3VsdHMgaW4gdGhlIG5leHQgc2VjdGlvbnMuPC9wPgo8L2Rpdj6kbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/x/GA+NOwcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJDhkZDcwNGE0LWJmNTAtNGRkYy1hODMyLWQwNzRiZDUyYWQwMblkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgADHlS1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQ2Yjg3MDQ0My03YmU1LTQyODctYjk1Ny1jYTVjMTRlZGE4OWOKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52ag8ZGl2IGNsYXNzPSJtYXJrZG93biI+PHVsPgo8bGk+PHA+U2VxdWVuY2UgYnVpbGRpbmcgYmxvY2tzOiA8Y29kZT5UMnByZXA8L2NvZGU+LCA8Y29kZT5GYXRTYXQ8L2NvZGU+LCA8Y29kZT5iU1NGUDwvY29kZT4gJiM0MDtzaG93L2hpZGUgY29kZSYjNDE7PC9wPgo8L2xpPgo8L3VsPgo8L2Rpdj6kbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdm/yB5+Nb2wcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJDZiODcwNDQzLTdiZTUtNDI4Ny1iOTU3LWNhNWMxNGVkYTg5Y7lkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgBtIOC1cHVibGlzaGVkX29iamVjdF9rZXlzkLhkZXBlbmRzX29uX3NraXBwZWRfY2VsbHPCp2Vycm9yZWTC2SQ3ZGVhZGQ1OC1iMjAyLTQ1MDgtYjRjNy02ODZmNzQyY2I3MTOKpnF1ZXVlZMKkbG9nc5GIpGxpbmX/o21zZ5LZWE9TIHg4Nl82NC1saW51eC1nbnUKSnVsaWEgMS4xMC41CktvbWFNUklQbG90cyAwLjguMwpLb21hTVJJQ29yZSAwLjguMwpLb21hTVJJQmFzZSAwLjguNAqqdGV4dC9wbGFpbqdjZWxsX2lk2SQ3ZGVhZGQ1OC1iMjAyLTQ1MDgtYjRjNy02ODZmNzQyY2I3MTOma3dhcmdzkKJpZLRQbHV0b1J1bm5lcl9kMWFjYjgxZaRmaWxl2VIvaG9tZS9ydW5uZXIvLmp1bGlhL3BhY2thZ2VzL1BsdXRvL1J2ZUdIL3NyYy9ydW5uZXIvUGx1dG9SdW5uZXIvc3JjL1BsdXRvUnVubmVyLmpspWdyb3Vwq1BsdXRvUnVubmVypWxldmVsrkxvZ0xldmVsKC01NTUpp3J1bm5pbmfCpm91dHB1dIakYm9keaCkbWltZap0ZXh0L3BsYWlurHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZv8gcMUcbsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQ3ZGVhZGQ1OC1iMjAyLTQ1MDgtYjRjNy02ODZmNzQyY2I3MTO5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4QSAeVtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwrFjZWxsX2RlcGVuZGVuY2llc94AJNkkZDAzNzdmOWEtNjgwZC00NTAxLTkwY2EtOWVhM2FiNjgxZGI0hLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkZDAzNzdmOWEtNjgwZC00NTAxLTkwY2EtOWVhM2FiNjgxZGI0tGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCp0BtZF9zdHKQqGdldGluZGV4kNkkZmM1ODY0MGItYzQ0Yy00YzI1LWE0ZmQtNWEwZTE3ZDdiZWNkhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkZmM1ODY0MGItYzQ0Yy00YzI1LWE0ZmQtNWEwZTE3ZDdiZWNktGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCp0BtZF9zdHKQqGdldGluZGV4kNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2hLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2tGRvd25zdHJlYW1fY2VsbHNfbWFwg6RtYWcxkdkkZjczMDgyZmYtYTZkMy00MWY4LTg3OTYtNDExNGZhODlkMmJio1JSc5HZJGY3MzA4MmZmLWE2ZDMtNDFmOC04Nzk2LTQxMTRmYTg5ZDJiYqNGQXOR2SRmNzMwODJmZi1hNmQzLTQxZjgtODc5Ni00MTE0ZmE4OWQyYmKydXBzdHJlYW1fY2VsbHNfbWFw3gA4oT6Qo3N5c5HZJDllMzk3NDI2LWI2MGItNGI5OC1iZThiLWY3ZjEyODYyMWM0NKZpc2xlc3OQ2SRTdXBwcmVzc29yLkJhc2UuQ29yZUxvZ2dpbmcuTG9nU3RhdGWQtFN1cHByZXNzb3IuQ29yZS5ldmFskKpTdXBwcmVzc29ykdkkNzBkYmMyYmQtOGI5My00NzFkLTgzNDAtMDRkOThhMDA4Y2E2r1N1cHByZXNzb3IuRXhwcpCvY2FyZGlhY19waGFudG9tkdkkZjU3YTJiNmMtZWI0Yy00NWJkLTgwNTgtNGE2MGIwMzg5MjVkpmxlbmd0aJCpQmFzZS5UYXNrkKE8kKpzaW1fcGFyYW1zkdkkZDA1ZGNiYTctMmY0Mi00N2JmLWExNzItNjEyM2QwMTEzYjNmqUJhc2UucHV0IZCqQ29tcGxleEY2NJCnbm90aGluZ5ChL5CxQmFzZS5pbnZva2VsYXRlc3SQsVN1cHByZXNzb3IudHlwZW9mkNknQmFzZS5Db3JlTG9nZ2luZy5CYXNlLmZpeHVwX3N0ZGxpYl9wYXRokLRCYXNlLkNvcmVMb2dnaW5nLj09PZC5U3VwcHJlc3Nvci5jdXJyZW50X2xvZ2dlcpCvU3VwcHJlc3Nvci5yZWFkkKV6ZXJvc5C6I19fX3RoaXNfcGx1dG9fbW9kdWxlX25hbWWQoj0+kKRCYXNlkK1TdXBwcmVzc29yLmlukLBTdXBwcmVzc29yLmNsb3NlkKlAc3VwcHJlc3OQtEJhc2UuQ29yZUxvZ2dpbmcuaXNhkKEtkKErkKEqkLNCYXNlLkNvcmVMb2dnaW5nLj49kKROaXNvkdkkZjBhODFjOWYtNTYxNi00NjYzLTk0OGYtYTQwODRlMTcxOWFmqUBwcm9ncmVzc5C6U3VwcHJlc3Nvci5yZWRpcmVjdF9zdGRvdXSQpERpY3SQq2ltX3NlZ21lbnRzkdkkY2I2NTkxMTgtOWYyMi00M2MzLTgwMWQtNDkyNDFkZWU0ZGY2qnNlcV9wYXJhbXOR2SRjYjY1OTExOC05ZjIyLTQzYzMtODAxZC00OTI0MWRlZTRkZjayQmFzZS5Db3JlTG9nZ2luZy4hkK1TdXBwcmVzc29yLj09kLhCYXNlLkNvcmVMb2dnaW5nLmNvbnZlcnSQulN1cHByZXNzb3IucmVkaXJlY3Rfc3RkZXJykKVtZXJnZZC9QmFzZS5Db3JlTG9nZ2luZy5pbnZva2VsYXRlc3SQoTqQpENNUkGR2SQ3ODkwZjgxZS1jYjE1LTQ4ZDItYTgwYy05ZDczZjk1MTYwNTaoc2ltdWxhdGWQo2VuZJC4U3VwcHJlc3Nvci5wcm9wZXJ0eW5hbWVzkK1CYXNlLnNjaGVkdWxlkKlCbG9jaERpY3SQqWVudW1lcmF0ZZCxIyNwcm9ncmVzc19pZCMyMjWQpWNjYWxskNkkOTIxOTRmY2ItNTgyYS00OWNlLWFhZDctMjBiMDE0NWQ0MGQzhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkOTIxOTRmY2ItNTgyYS00OWNlLWFhZDctMjBiMDE0NWQ0MGQztGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCp0BtZF9zdHKQqGdldGluZGV4kNkkZjQ5NjU1Y2MtNDYwZS00OTgxLTkyZWEtZGZkNjE0NzMwOGJmhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkZjQ5NjU1Y2MtNDYwZS00OTgxLTkyZWEtZGZkNjE0NzMwOGJmtGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCp0BtZF9zdHKQqGdldGluZGV4kNkkM2Q3ZTdkMjAtYTc3YS00OGIzLWFkMmUtNmI2MjEyMjdiZTE2hLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkM2Q3ZTdkMjAtYTc3YS00OGIzLWFkMmUtNmI2MjEyMjdiZTE2tGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCp0BtZF9zdHKQqGdldGluZGV4kNkkYTk5YzBjNDctMWI3MC00MzYyLWEyZjYtYTdlMzI1OTYwNmZhhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkYTk5YzBjNDctMWI3MC00MzYyLWEyZjYtYTdlMzI1OTYwNmZhtGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCp0BtZF9zdHKQqGdldGluZGV4kNkkYTE1ZDZiNjQtZjhlZS00ZWU0LTgxMmMtZDQ5Y2Y1ZWE3ODRkhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkYTE1ZDZiNjQtZjhlZS00ZWU0LTgxMmMtZDQ5Y2Y1ZWE3ODRktGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCp0BtZF9zdHKQqGdldGluZGV4kNkkZjBhODFjOWYtNTYxNi00NjYzLTk0OGYtYTQwODRlMTcxOWFmhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkZjBhODFjOWYtNTYxNi00NjYzLTk0OGYtYTQwODRlMTcxOWFmtGRvd25zdHJlYW1fY2VsbHNfbWFwhahmYXRfZnJlcZPZJDZiODcwNDQzLTdiZTUtNDI4Ny1iOTU3LWNhNWMxNGVkYTg5Y9kkNzg5MGY4MWUtY2IxNS00OGQyLWE4MGMtOWQ3M2Y5NTE2MDU22SRmNTdhMmI2Yy1lYjRjLTQ1YmQtODA1OC00YTYwYjAzODkyNWSnZmF0X3BwbZCkTmlzb5XZJGY1N2EyYjZjLWViNGMtNDViZC04MDU4LTRhNjBiMDM4OTI1ZNkkZDk3MTViYzEtNDljZC00ZGY4LThkYmYtYzA2ZGU0MmFkNTUw2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjbZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYdkkOGRjMTExNzUtZWJjOC00MDdhLWFiMGItNmQ1NDNmODQ5YTcyqc6UeF92b3hlbJCiZHiR2SRmNTdhMmI2Yy1lYjRjLTQ1YmQtODA1OC00YTYwYjAzODkyNWSydXBzdHJlYW1fY2VsbHNfbWFwiadAbWRfc3RykKLOs5ChLZClcmFuZ2WQoS+Qo3N5c5HZJDllMzk3NDI2LWI2MGItNGI5OC1iZThiLWY3ZjEyODYyMWM0NKEqkKVBcnJheZCoZ2V0aW5kZXiQ2SRkOTcxNWJjMS00OWNkLTRkZjgtOGRiZi1jMDZkZTQyYWQ1NTCEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SRkOTcxNWJjMS00OWNkLTRkZjgtOGRiZi1jMDZkZTQyYWQ1NTC0ZG93bnN0cmVhbV9jZWxsc19tYXCHo014eZChdJCkbGFic5CicDCQok16kKRjb2xzkKpzcGluX2dyb3VwkLJ1cHN0cmVhbV9jZWxsc19tYXDeABajc3VtkKlyZWxheW91dCGQp2Fkam9pbnSQpHJlYWyQpmxlbmd0aJCpZWFjaGluZGV4kKdzY2F0dGVykKEvkLFkdW1teV9oZWFydF9iZWF0c5HZJGNiNjU5MTE4LTlmMjItNDNjMy04MDFkLTQ5MjQxZGVlNGRmNqRjb25qkKNhYnOQqmFkZF90cmFjZSGQo3NlcZHZJDM3ZjdmZDdmLTVjYjEtNDhiNS1iODc3LWIyYmMyM2ExZTdkZKE6kK1tYWtlX3N1YnBsb3RzkKJSUpHZJGNiNjU5MTE4LTlmMjItNDNjMy04MDFkLTQ5MjQxZGVlNGRmNqErkKEqkKROaXNvkdkkZjBhODFjOWYtNTYxNi00NjYzLTk0OGYtYTQwODRlMTcxOWFmrW1hZ25ldGl6YXRpb26R2SQzN2Y3ZmQ3Zi01Y2IxLTQ4YjUtYjg3Ny1iMmJjMjNhMWU3ZGTZIktvbWFNUklDb3JlLmdldF9hZGNfc2FtcGxpbmdfdGltZXOQq0tvbWFNUklDb3JlkdkkMGI3YTQwNWUtYmJiNS0xMWVlLTA1Y2EtNGIxYzg1NjczOThk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGG0ZG93bnN0cmVhbV9jZWxsc19tYXCDpM6UZnOR2SQ0NGEzMTA1Ny03YjM0LTRjODAtYTI3My02NjIxYzA3NzNkYzekbWFnMpHZJDQ0YTMxMDU3LTdiMzQtNGM4MC1hMjczLTY2MjFjMDc3M2RjN6RGRkFzkdkkNDRhMzEwNTctN2IzNC00YzgwLWEyNzMtNjYyMWMwNzczZGM3snVwc3RyZWFtX2NlbGxzX21hcN4AOKE+kKNzeXOR2SQ5ZTM5NzQyNi1iNjBiLTRiOTgtYmU4Yi1mN2YxMjg2MjFjNDSmaXNsZXNzkNkkU3VwcHJlc3Nvci5CYXNlLkNvcmVMb2dnaW5nLkxvZ1N0YXRlkLRTdXBwcmVzc29yLkNvcmUuZXZhbJCqU3VwcHJlc3NvcpHZJDcwZGJjMmJkLThiOTMtNDcxZC04MzQwLTA0ZDk4YTAwOGNhNq9TdXBwcmVzc29yLkV4cHKQr2NhcmRpYWNfcGhhbnRvbZHZJGY1N2EyYjZjLWViNGMtNDViZC04MDU4LTRhNjBiMDM4OTI1ZKZsZW5ndGiQqUJhc2UuVGFza5ChPJCqc2ltX3BhcmFtc5HZJGQwNWRjYmE3LTJmNDItNDdiZi1hMTcyLTYxMjNkMDExM2IzZqlCYXNlLnB1dCGQqkNvbXBsZXhGNjSQp25vdGhpbmeQ2SdCYXNlLkNvcmVMb2dnaW5nLkJhc2UuZml4dXBfc3RkbGliX3BhdGiQsUJhc2UuaW52b2tlbGF0ZXN0kLFTdXBwcmVzc29yLnR5cGVvZpC0QmFzZS5Db3JlTG9nZ2luZy49PT2QuVN1cHByZXNzb3IuY3VycmVudF9sb2dnZXKQr1N1cHByZXNzb3IucmVhZJClemVyb3OQuiNfX190aGlzX3BsdXRvX21vZHVsZV9uYW1lkKI9PpCkQmFzZZCizrOQsFN1cHByZXNzb3IuY2xvc2WQqUBzdXBwcmVzc5C0QmFzZS5Db3JlTG9nZ2luZy5pc2GQrVN1cHByZXNzb3IuaW6QoS2QoSuQoSqQs0Jhc2UuQ29yZUxvZ2dpbmcuPj2QpE5pc2+R2SRmMGE4MWM5Zi01NjE2LTQ2NjMtOTQ4Zi1hNDA4NGUxNzE5YWapQHByb2dyZXNzkLpTdXBwcmVzc29yLnJlZGlyZWN0X3N0ZG91dJCkRGljdJCraW1fc2VnbWVudHOR2SRjYjY1OTExOC05ZjIyLTQzYzMtODAxZC00OTI0MWRlZTRkZjaqc2VxX3BhcmFtc5HZJGNiNjU5MTE4LTlmMjItNDNjMy04MDFkLTQ5MjQxZGVlNGRmNrJCYXNlLkNvcmVMb2dnaW5nLiGQrVN1cHByZXNzb3IuPT2QuEJhc2UuQ29yZUxvZ2dpbmcuY29udmVydJC6U3VwcHJlc3Nvci5yZWRpcmVjdF9zdGRlcnKQpW1lcmdlkL1CYXNlLkNvcmVMb2dnaW5nLmludm9rZWxhdGVzdJChOpCkQ01SQZHZJDc4OTBmODFlLWNiMTUtNDhkMi1hODBjLTlkNzNmOTUxNjA1NqhzaW11bGF0ZZCjZW5kkLhTdXBwcmVzc29yLnByb3BlcnR5bmFtZXOQrUJhc2Uuc2NoZWR1bGWQqUJsb2NoRGljdJCpZW51bWVyYXRlkLEjI3Byb2dyZXNzX2lkIzIyNZClY2NhbGyQ2SQ5ZTM5NzQyNi1iNjBiLTRiOTgtYmU4Yi1mN2YxMjg2MjFjNDSEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQ5ZTM5NzQyNi1iNjBiLTRiOTgtYmU4Yi1mN2YxMjg2MjFjNDS0ZG93bnN0cmVhbV9jZWxsc19tYXCBo3N5c5TZJGYwYTgxYzlmLTU2MTYtNDY2My05NDhmLWE0MDg0ZTE3MTlhZtkkMzdmN2ZkN2YtNWNiMS00OGI1LWI4NzctYjJiYzIzYTFlN2Rk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjbZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYbJ1cHN0cmVhbV9jZWxsc19tYXCBp1NjYW5uZXKQ2SRkMDVkY2JhNy0yZjQyLTQ3YmYtYTE3Mi02MTIzZDAxMTNiM2aEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SRkMDVkY2JhNy0yZjQyLTQ3YmYtYTE3Mi02MTIzZDAxMTNiM2a0ZG93bnN0cmVhbV9jZWxsc19tYXCBqnNpbV9wYXJhbXOT2SQzN2Y3ZmQ3Zi01Y2IxLTQ4YjUtYjg3Ny1iMmJjMjNhMWU3ZGTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNtkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhsnVwc3RyZWFtX2NlbGxzX21hcIakRGljdJCjVHJmkdkkY2I2NTkxMTgtOWYyMi00M2MzLTgwMWQtNDkyNDFkZWU0ZGY2qUJsb2NoRGljdJCmU3RyaW5nkKI9PpCjQW55kNkkMzlmNDQwMjUtMjk3NC00YzRjLWIwYzItZTIxMzk5YmJkYjFmhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkMzlmNDQwMjUtMjk3NC00YzRjLWIwYzItZTIxMzk5YmJkYjFmtGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCp0BtZF9zdHKQqGdldGluZGV4kNkkMzdmN2ZkN2YtNWNiMS00OGI1LWI4NzctYjJiYzIzYTFlN2RkhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkMzdmN2ZkN2YtNWNiMS00OGI1LWI4NzctYjJiYzIzYTFlN2RktGRvd25zdHJlYW1fY2VsbHNfbWFwj6wjNjc4I19sb2dnZXKQsSM2NzcjbmV3X2xvZ3N0YXRlkKNzZXGS2SQwYjZjMWY3Mi1iMDQwLTQ4M2MtOTY5Yi04OGJmZTA5YjMyYzPZJGQ5NzE1YmMxLTQ5Y2QtNGRmOC04ZGJmLWMwNmRlNDJhZDU1MLQjNjY3I29yaWdpbmFsX3N0ZG91dJCrIzY2OSNvdXRfd3KQqyM2NzYjbG9nZ2VykLQjNjcxI29yaWdpbmFsX3N0ZGVycpCjb2JqkdkkMWE2MmFlNzEtNThkYi00OWVhLWFlNmEtOWFlYTY2MTQ1OTYzryM2NzAjb3V0X3JlYWRlcpCvIzY3NCNlcnJfcmVhZGVykKsjNjcyI2Vycl9yZJCrIzY2OCNvdXRfcmSQrSM2NzUjbG9nc3RhdGWQqyM2NzMjZXJyX3dykK1tYWduZXRpemF0aW9ukdkkZDk3MTViYzEtNDljZC00ZGY4LThkYmYtYzA2ZGU0MmFkNTUwsnVwc3RyZWFtX2NlbGxzX21hcN4AHqNzeXOR2SQ5ZTM5NzQyNi1iNjBiLTRiOTgtYmU4Yi1mN2YxMjg2MjFjNDTZJFN1cHByZXNzb3IuQmFzZS5Db3JlTG9nZ2luZy5Mb2dTdGF0ZZC0U3VwcHJlc3Nvci5Db3JlLmV2YWyQqlN1cHByZXNzb3KR2SQ3MGRiYzJiZC04YjkzLTQ3MWQtODM0MC0wNGQ5OGEwMDhjYTaqc2VxX3BhcmFtc5HZJGNiNjU5MTE4LTlmMjItNDNjMy04MDFkLTQ5MjQxZGVlNGRmNq9TdXBwcmVzc29yLkV4cHKQr2NhcmRpYWNfcGhhbnRvbZHZJGY1N2EyYjZjLWViNGMtNDViZC04MDU4LTRhNjBiMDM4OTI1ZKlCYXNlLlRhc2uQrVN1cHByZXNzb3IuPT2Qp25vdGhpbmeQqnNpbV9wYXJhbXOR2SRkMDVkY2JhNy0yZjQyLTQ3YmYtYTE3Mi02MTIzZDAxMTNiM2apQmFzZS5wdXQhkLFTdXBwcmVzc29yLnR5cGVvZpCxZHVtbXlfaGVhcnRfYmVhdHOR2SRjYjY1OTExOC05ZjIyLTQzYzMtODAxZC00OTI0MWRlZTRkZja6U3VwcHJlc3Nvci5yZWRpcmVjdF9zdGRlcnKQuVN1cHByZXNzb3IuY3VycmVudF9sb2dnZXKQr1N1cHByZXNzb3IucmVhZJCkQ01SQZHZJDc4OTBmODFlLWNiMTUtNDhkMi1hODBjLTlkNzNmOTUxNjA1NqRvbmVzkKRCb29skKhzaW11bGF0ZZC4U3VwcHJlc3Nvci5wcm9wZXJ0eW5hbWVzkKRCYXNlkK1TdXBwcmVzc29yLmlukK1CYXNlLnNjaGVkdWxlkKlAc3VwcHJlc3OQsFN1cHByZXNzb3IuY2xvc2WQoSuQulN1cHByZXNzb3IucmVkaXJlY3Rfc3Rkb3V0kKVjY2FsbJDZJDc3MTUzZTVjLTcxYmQtNDJlMy1iYWU5LWU0ODExZmZhN2EzZIS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDc3MTUzZTVjLTcxYmQtNDJlMy1iYWU5LWU0ODExZmZhN2EzZLRkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwgqdAbWRfc3RykKhnZXRpbmRleJDZJGQ1NGQ2ODA3LTQ0NGYtNGUwZS04ZmQ2LTg0NDU3OTc0MTE1YYS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJGQ1NGQ2ODA3LTQ0NGYtNGUwZS04ZmQ2LTg0NDU3OTc0MTE1YbRkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwgqdAbWRfc3RykKhnZXRpbmRleJDZJDQ0YTMxMDU3LTdiMzQtNGM4MC1hMjczLTY2MjFjMDc3M2RjN4S0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDQ0YTMxMDU3LTdiMzQtNGM4MC1hMjczLTY2MjFjMDc3M2RjN7Rkb3duc3RyZWFtX2NlbGxzX21hcN4AFaxzaWduYWxfYmxvbzKQqHN0ZF9mYXQykKNzMTKQqm1lYW5fYmxvbzKQrHNpZ25hbF9teW9jMpCpbWVhbl9mYXQykKxzaWduYWxfZmF0MjKQpGZpZzKQo3M4MpCjczUykKNzNjKQo3M0MpCrc2lnbmFsX2ZhdDKQo3MzMpCjczcykKlzdGRfZmF0MjKQo3MyMpCqbWVhbl9mYXQyMpCpc3RkX215b2MykKptZWFuX215b2MykKlzdGRfYmxvbzKQsnVwc3RyZWFtX2NlbGxzX21hcN4AFKdyZXZlcnNlkKTOlGZzkdkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhoTqQpG1hZzKR2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGkRkZBc5HZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaZjb2xvcnOR2SQ4ZGMxMTE3NS1lYmM4LTQwN2EtYWIwYi02ZDU0M2Y4NDlhNzKpcmVsYXlvdXQhkKNlbmSQpmxlbmd0aJChLZCnc2NhdHRlcpCncmVzaGFwZZCkcGxvdJCmbGFiZWxzkdkkOGRjMTExNzUtZWJjOC00MDdhLWFiMGItNmQ1NDNmODQ5YTcyoSuQpGF0dHKQpXNwaW5zkdkkOGRjMTExNzUtZWJjOC00MDdhLWFiMGItNmQ1NDNmODQ5YTcypG1lYW6R2SQ4ZGMxMTE3NS1lYmM4LTQwN2EtYWIwYi02ZDU0M2Y4NDlhNzKjYWJzkKNzdGSR2SQ4ZGMxMTE3NS1lYmM4LTQwN2EtYWIwYi02ZDU0M2Y4NDlhNzLZJGNiNjU5MTE4LTlmMjItNDNjMy04MDFkLTQ5MjQxZGVlNGRmNoS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJGNiNjU5MTE4LTlmMjItNDNjMy04MDFkLTQ5MjQxZGVlNGRmNrRkb3duc3RyZWFtX2NlbGxzX21hcI+iVFKR2SQ2Yjg3MDQ0My03YmU1LTQyODctYjk1Ny1jYTVjMTRlZGE4OWOjVHJmktkkNmI4NzA0NDMtN2JlNS00Mjg3LWI5NTctY2E1YzE0ZWRhODlj2SRkMDVkY2JhNy0yZjQyLTQ3YmYtYTE3Mi02MTIzZDAxMTNiM2aiVEWR2SQ2Yjg3MDQ0My03YmU1LTQyODctYjk1Ny1jYTVjMTRlZGE4OWOraW1fc2VnbWVudHOS2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjbZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYa9pTkFWX2ZsaXBfYW5nbGWQokIxkdkkNmI4NzA0NDMtN2JlNS00Mjg3LWI5NTctY2E1YzE0ZWRhODljqnNlcV9wYXJhbXOT2SQzN2Y3ZmQ3Zi01Y2IxLTQ4YjUtYjg3Ny1iMmJjMjNhMWU3ZGTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNtkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhrWltX2ZsaXBfYW5nbGWQolJSkdkkZDk3MTViYzEtNDljZC00ZGY4LThkYmYtYzA2ZGU0MmFkNTUwr1QycHJlcF9kdXJhdGlvbpCnVGZhdHNhdJHZJDZiODcwNDQzLTdiZTUtNDI4Ny1iOTU3LWNhNWMxNGVkYTg5Y7FkdW1teV9oZWFydF9iZWF0c5LZJDM3ZjdmZDdmLTVjYjEtNDhiNS1iODc3LWIyYmMyM2ExZTdkZNkkZDk3MTViYzEtNDljZC00ZGY4LThkYmYtYzA2ZGU0MmFkNTUwpFRhZGOR2SQ2Yjg3MDQ0My03YmU1LTQyODctYjk1Ny1jYTVjMTRlZGE4OWOqaU5BVl9saW5lc5CxRmF0U2F0X2ZsaXBfYW5nbGWQsnVwc3RyZWFtX2NlbGxzX21hcIOizrOQoS+QoSqQ2SQ4ZGMxMTE3NS1lYmM4LTQwN2EtYWIwYi02ZDU0M2Y4NDlhNzKEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQ4ZGMxMTE3NS1lYmM4LTQwN2EtYWIwYi02ZDU0M2Y4NDlhNzK0ZG93bnN0cmVhbV9jZWxsc19tYXCFpmxhYmVsc5LZJGY3MzA4MmZmLWE2ZDMtNDFmOC04Nzk2LTQxMTRmYTg5ZDJiYtkkNDRhMzEwNTctN2IzNC00YzgwLWEyNzMtNjYyMWMwNzczZGM3pmNvbG9yc5LZJGY3MzA4MmZmLWE2ZDMtNDFmOC04Nzk2LTQxMTRmYTg5ZDJiYtkkNDRhMzEwNTctN2IzNC00YzgwLWEyNzMtNjYyMWMwNzczZGM3pXNwaW5zktkkZjczMDgyZmYtYTZkMy00MWY4LTg3OTYtNDExNGZhODlkMmJi2SQ0NGEzMTA1Ny03YjM0LTRjODAtYTI3My02NjIxYzA3NzNkYzekbWVhbpLZJGY3MzA4MmZmLWE2ZDMtNDFmOC04Nzk2LTQxMTRmYTg5ZDJiYtkkNDRhMzEwNTctN2IzNC00YzgwLWEyNzMtNjYyMWMwNzczZGM3o3N0ZJLZJGY3MzA4MmZmLWE2ZDMtNDFmOC04Nzk2LTQxMTRmYTg5ZDJiYtkkNDRhMzEwNTctN2IzNC00YzgwLWEyNzMtNjYyMWMwNzczZGM3snVwc3RyZWFtX2NlbGxzX21hcI+nQG1kX3N0cpChOpCjc3VtkKRzcXJ0kKRzaXplkKdhZGpvaW50kKEtkKEvkKFekKErkKROaXNvkdkkZjBhODFjOWYtNTYxNi00NjYzLTk0OGYtYTQwODRlMTcxOWFmoSqQpGNvbmqQo2Fic5CoZ2V0aW5kZXiQ2SRmNzMwODJmZi1hNmQzLTQxZjgtODc5Ni00MTE0ZmE4OWQyYmKEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SRmNzMwODJmZi1hNmQzLTQxZjgtODc5Ni00MTE0ZmE4OWQyYmK0ZG93bnN0cmVhbV9jZWxsc19tYXDeABCiczGQqW1lYW5fZGlmZpCiczWQqHN0ZF9teW9jkKJzMpCiczSQq3NpZ25hbF9teW9jkKltZWFuX2Jsb2+QqW1lYW5fbXlvY5CjZmlnkKtzaWduYWxfYmxvb5CiczaQqHN0ZF9kaWZmkK5kaWZmX2Jsb29fbXlvY5Coc3RkX2Jsb2+QonMzkLJ1cHN0cmVhbV9jZWxsc19tYXDeABSjRkFzkdkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2p3JldmVyc2WQoTqQpG1hZzGR2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjamY29sb3JzkdkkOGRjMTExNzUtZWJjOC00MDdhLWFiMGItNmQ1NDNmODQ5YTcyqXJlbGF5b3V0IZCjUlJzkdkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2o2VuZJCmbGVuZ3RokKEtkKdzY2F0dGVykKdyZXNoYXBlkKRwbG90kKZsYWJlbHOR2SQ4ZGMxMTE3NS1lYmM4LTQwN2EtYWIwYi02ZDU0M2Y4NDlhNzKhK5CkYXR0cpClc3BpbnOR2SQ4ZGMxMTE3NS1lYmM4LTQwN2EtYWIwYi02ZDU0M2Y4NDlhNzKkbWVhbpHZJDhkYzExMTc1LWViYzgtNDA3YS1hYjBiLTZkNTQzZjg0OWE3MqNhYnOQo3N0ZJHZJDhkYzExMTc1LWViYzgtNDA3YS1hYjBiLTZkNTQzZjg0OWE3MtkkNzBkYmMyYmQtOGI5My00NzFkLTgzNDAtMDRkOThhMDA4Y2E2hLRwcmVjZWRlbmNlX2hldXJpc3RpYwenY2VsbF9pZNkkNzBkYmMyYmQtOGI5My00NzFkLTgzNDAtMDRkOThhMDA4Y2E2tGRvd25zdHJlYW1fY2VsbHNfbWFwg69Qcm9ncmVzc0xvZ2dpbmeQp1BsdXRvVUmQqlN1cHByZXNzb3KT2SQzN2Y3ZmQ3Zi01Y2IxLTQ4YjUtYjg3Ny1iMmJjMjNhMWU3ZGTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNtkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhsnVwc3RyZWFtX2NlbGxzX21hcIDZJGFiZWEyYzQzLWQ4M2UtNDQzOC04Y2QzLTRiZTA2YjgxNzRiM4S0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJGFiZWEyYzQzLWQ4M2UtNDQzOC04Y2QzLTRiZTA2YjgxNzRiM7Rkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwgqdAbWRfc3RykKhnZXRpbmRleJDZJGFlNzJmZmM1LTdmOGUtNDkwNy1hOTllLThhZDdjYjhmZGRhYoS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJGFlNzJmZmM1LTdmOGUtNDkwNy1hOTllLThhZDdjYjhmZGRhYrRkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwgqdAbWRfc3RykKhnZXRpbmRleJDZJDBiN2E0MDVlLWJiYjUtMTFlZS0wNWNhLTRiMWM4NTY3Mzk4ZIS0cHJlY2VkZW5jZV9oZXVyaXN0aWMHp2NlbGxfaWTZJDBiN2E0MDVlLWJiYjUtMTFlZS0wNWNhLTRiMWM4NTY3Mzk4ZLRkb3duc3RyZWFtX2NlbGxzX21hcIOsS29tYU1SSVBsb3RzkKtQbHV0b1Bsb3RseZCrS29tYU1SSUNvcmWR2SRkOTcxNWJjMS00OWNkLTRkZjgtOGRiZi1jMDZkZTQyYWQ1NTCydXBzdHJlYW1fY2VsbHNfbWFwgNkkZGJmMTY2NzYtNjRmMi00ZDliLWJmMWItOGRlMDZiMDQ4NjAyhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkZGJmMTY2NzYtNjRmMi00ZDliLWJmMWItOGRlMDZiMDQ4NjAytGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCp0BtZF9zdHKQqGdldGluZGV4kNkkZjIxZTllNTktMjVjMy00ZjA2LThkZTQtNzkyY2IzMDVlYjAxhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkZjIxZTllNTktMjVjMy00ZjA2LThkZTQtNzkyY2IzMDVlYjAxtGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCp0BtZF9zdHKQqGdldGluZGV4kNkkMGI2YzFmNzItYjA0MC00ODNjLTk2OWItODhiZmUwOWIzMmMzhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkMGI2YzFmNzItYjA0MC00ODNjLTk2OWItODhiZmUwOWIzMmMztGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCo3NlcZHZJDM3ZjdmZDdmLTVjYjEtNDhiNS1iODc3LWIyYmMyM2ExZTdkZKhwbG90X3NlcZDZJDc4OTBmODFlLWNiMTUtNDhkMi1hODBjLTlkNzNmOTUxNjA1NoS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDc4OTBmODFlLWNiMTUtNDhkMi1hODBjLTlkNzNmOTUxNjA1NrRkb3duc3RyZWFtX2NlbGxzX21hcIGkQ01SQZPZJDM3ZjdmZDdmLTVjYjEtNDhiNS1iODc3LWIyYmMyM2ExZTdkZNkkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY22SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGydXBzdHJlYW1fY2VsbHNfbWFwj6dAbWRfc3RykKZGYXRTYXSR2SQ2Yjg3MDQ0My03YmU1LTQyODctYjk1Ny1jYTVjMTRlZGE4OWOoZmF0X2ZyZXGR2SRmMGE4MWM5Zi01NjE2LTQ2NjMtOTQ4Zi1hNDA4NGUxNzE5YWahOpClYlNTRlCR2SQ2Yjg3MDQ0My03YmU1LTQyODctYjk1Ny1jYTVjMTRlZGE4OWOlemVyb3OQpEJvb2yQo0FEQ5ChLZClRGVsYXmQo2R1cpChK5CmVDJwcmVwkdkkNmI4NzA0NDMtN2JlNS00Mjg3LWI5NTctY2E1YzE0ZWRhODljqFNlcXVlbmNlkKhnZXRpbmRleJDZJDFiYjNlNDliLTFhMTktNDM0My1hYzA5LWZiYWYxY2FlNGJhM4S0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDFiYjNlNDliLTFhMTktNDM0My1hYzA5LWZiYWYxY2FlNGJhM7Rkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwga9UYWJsZU9mQ29udGVudHOQ2SRlY2ViMzI2YS1jYWI2LTQ2NWUtOGU1Yy1lODM1ODgxYmQzYjCEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SRlY2ViMzI2YS1jYWI2LTQ2NWUtOGU1Yy1lODM1ODgxYmQzYjC0ZG93bnN0cmVhbV9jZWxsc19tYXCAsnVwc3RyZWFtX2NlbGxzX21hcIKnQG1kX3N0cpCoZ2V0aW5kZXiQ2SQxYTYyYWU3MS01OGRiLTQ5ZWEtYWU2YS05YWVhNjYxNDU5NjOEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQxYTYyYWU3MS01OGRiLTQ5ZWEtYWU2YS05YWVhNjYxNDU5NjO0ZG93bnN0cmVhbV9jZWxsc19tYXCCqnBoYW50b21fVDGQqnBoYW50b21fVDKQsnVwc3RyZWFtX2NlbGxzX21hcImmdW5pcXVlkKdzY2F0dGVykKNvYmqR2SQzN2Y3ZmQ3Zi01Y2IxLTQ4YjUtYjg3Ny1iMmJjMjNhMWU3ZGShL5CkcGxvdJCkYXR0cpCpcmVsYXlvdXQhkKEqkKdtYXhpbXVtkNkkZjU3YTJiNmMtZWI0Yy00NWJkLTgwNTgtNGE2MGIwMzg5MjVkhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkZjU3YTJiNmMtZWI0Yy00NWJkLTgwNTgtNGE2MGIwMzg5MjVktGRvd25zdHJlYW1fY2VsbHNfbWFwga9jYXJkaWFjX3BoYW50b22T2SQzN2Y3ZmQ3Zi01Y2IxLTQ4YjUtYjg3Ny1iMmJjMjNhMWU3ZGTZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNtkkZDc1MGNkNWEtM2M5MC00MWVhLTk5NDItNTcyM2EyMWRhNjBhsnVwc3RyZWFtX2NlbGxzX21hcIunQG1kX3N0cpCoZmF0X2ZyZXGR2SRmMGE4MWM5Zi01NjE2LTQ2NjMtOTQ4Zi1hNDA4NGUxNzE5YWanRmxvYXQ2NJCkb25lc5ChK5CnUGhhbnRvbZCiz4CQpE5pc2+R2SRmMGE4MWM5Zi01NjE2LTQ2NjMtOTQ4Zi1hNDA4NGUxNzE5YWaiZHiR2SRmMGE4MWM5Zi01NjE2LTQ2NjMtOTQ4Zi1hNDA4NGUxNzE5YWahKpCoZ2V0aW5kZXiQ2SQ4ZGQ3MDRhNC1iZjUwLTRkZGMtYTgzMi1kMDc0YmQ1MmFkMDGEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQ4ZGQ3MDRhNC1iZjUwLTRkZGMtYTgzMi1kMDc0YmQ1MmFkMDG0ZG93bnN0cmVhbV9jZWxsc19tYXCAsnVwc3RyZWFtX2NlbGxzX21hcIKnQG1kX3N0cpCoZ2V0aW5kZXiQ2SQ2Yjg3MDQ0My03YmU1LTQyODctYjk1Ny1jYTVjMTRlZGE4OWOEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQ2Yjg3MDQ0My03YmU1LTQyODctYjk1Ny1jYTVjMTRlZGE4OWO0ZG93bnN0cmVhbV9jZWxsc19tYXCDpkZhdFNhdJHZJDc4OTBmODFlLWNiMTUtNDhkMi1hODBjLTlkNzNmOTUxNjA1NqViU1NGUJHZJDc4OTBmODFlLWNiMTUtNDhkMi1hODBjLTlkNzNmOTUxNjA1NqZUMnByZXCR2SQ3ODkwZjgxZS1jYjE1LTQ4ZDItYTgwYy05ZDczZjk1MTYwNTaydXBzdHJlYW1fY2VsbHNfbWFw3gAhp0BtZF9zdHKQoSGQpHNxcnSQokIxkdkkY2I2NTkxMTgtOWYyMi00M2MzLTgwMWQtNDkyNDFkZWU0ZGY2pmlzbGVzc5ChPJCnVGZhdHNhdJHZJGNiNjU5MTE4LTlmMjItNDNjMy04MDFkLTQ5MjQxZGVlNGRmNqVyYW5nZZCjbWlukKEvkKVEZWxheZChXpCvZ2V0X2ZsaXBfYW5nbGVzkKhTZXF1ZW5jZZCkVGFkY5HZJGNiNjU5MTE4LTlmMjItNDNjMy04MDFkLTQ5MjQxZGVlNGRmNqJpbZCiPT2QqGdldGluZGV4kKJUUpHZJGNiNjU5MTE4LTlmMjItNDNjMy04MDFkLTQ5MjQxZGVlNGRmNqhmYXRfZnJlcZHZJGYwYTgxYzlmLTU2MTYtNDY2My05NDhmLWE0MDg0ZTE3MTlhZqNleHCQo1RyZpHZJGNiNjU5MTE4LTlmMjItNDNjMy04MDFkLTQ5MjQxZGVlNGRmNqJURZHZJGNiNjU5MTE4LTlmMjItNDNjMy04MDFkLTQ5MjQxZGVlNGRmNqIhPZCiz4CQoTqQo0FEQ5ChLZCjbG9nkKErkKEqkKRHcmFkkKJSRpDZJDdkZWFkZDU4LWIyMDItNDUwOC1iNGM3LTY4NmY3NDJjYjcxM4S0cHJlY2VkZW5jZV9oZXVyaXN0aWMBp2NlbGxfaWTZJDdkZWFkZDU4LWIyMDItNDUwOC1iNGM3LTY4NmY3NDJjYjcxM7Rkb3duc3RyZWFtX2NlbGxzX21hcIGjUGtnkdkkN2RlYWRkNTgtYjIwMi00NTA4LWI0YzctNjg2Zjc0MmNiNzEzsnVwc3RyZWFtX2NlbGxzX21hcIekQmFzZZCjUGtnkdkkN2RlYWRkNTgtYjIwMi00NTA4LWI0YzctNjg2Zjc0MmNiNzEzsFBrZy5kZXBlbmRlbmNpZXOQp1ZFUlNJT06QpmZpbHRlcpCncHJpbnRsbpCob2NjdXJzaW6QtGNlbGxfZXhlY3V0aW9uX29yZGVy3AAk2SQ3ZGVhZGQ1OC1iMjAyLTQ1MDgtYjRjNy02ODZmNzQyY2I3MTPZJDBiN2E0MDVlLWJiYjUtMTFlZS0wNWNhLTRiMWM4NTY3Mzk4ZNkkNzBkYmMyYmQtOGI5My00NzFkLTgzNDAtMDRkOThhMDA4Y2E22SRhOTljMGM0Ny0xYjcwLTQzNjItYTJmNi1hN2UzMjU5NjA2ZmHZJDFiYjNlNDliLTFhMTktNDM0My1hYzA5LWZiYWYxY2FlNGJhM9kkZmM1ODY0MGItYzQ0Yy00YzI1LWE0ZmQtNWEwZTE3ZDdiZWNk2SRkYmYxNjY3Ni02NGYyLTRkOWItYmYxYi04ZGUwNmIwNDg2MDLZJGY0OTY1NWNjLTQ2MGUtNDk4MS05MmVhLWRmZDYxNDczMDhiZtkkNzcxNTNlNWMtNzFiZC00MmUzLWJhZTktZTQ4MTFmZmE3YTNk2SQ5ZTM5NzQyNi1iNjBiLTRiOTgtYmU4Yi1mN2YxMjg2MjFjNDTZJDkyMTk0ZmNiLTU4MmEtNDljZS1hYWQ3LTIwYjAxNDVkNDBkM9kkYWU3MmZmYzUtN2Y4ZS00OTA3LWE5OWUtOGFkN2NiOGZkZGFi2SRjYjY1OTExOC05ZjIyLTQzYzMtODAxZC00OTI0MWRlZTRkZjbZJGExNWQ2YjY0LWY4ZWUtNGVlNC04MTJjLWQ0OWNmNWVhNzg0ZNkkZjBhODFjOWYtNTYxNi00NjYzLTk0OGYtYTQwODRlMTcxOWFm2SQ2Yjg3MDQ0My03YmU1LTQyODctYjk1Ny1jYTVjMTRlZGE4OWPZJDc4OTBmODFlLWNiMTUtNDhkMi1hODBjLTlkNzNmOTUxNjA1NtkkZjU3YTJiNmMtZWI0Yy00NWJkLTgwNTgtNGE2MGIwMzg5MjVk2SRmMjFlOWU1OS0yNWMzLTRmMDYtOGRlNC03OTJjYjMwNWViMDHZJGVjZWIzMjZhLWNhYjYtNDY1ZS04ZTVjLWU4MzU4ODFiZDNiMNkkZDU0ZDY4MDctNDQ0Zi00ZTBlLThmZDYtODQ0NTc5NzQxMTVh2SRkMDVkY2JhNy0yZjQyLTQ3YmYtYTE3Mi02MTIzZDAxMTNiM2bZJDM3ZjdmZDdmLTVjYjEtNDhiNS1iODc3LWIyYmMyM2ExZTdkZNkkMGI2YzFmNzItYjA0MC00ODNjLTk2OWItODhiZmUwOWIzMmMz2SQxYTYyYWU3MS01OGRiLTQ5ZWEtYWU2YS05YWVhNjYxNDU5NjPZJGQ5NzE1YmMxLTQ5Y2QtNGRmOC04ZGJmLWMwNmRlNDJhZDU1MNkkOGRkNzA0YTQtYmY1MC00ZGRjLWE4MzItZDA3NGJkNTJhZDAx2SQzOWY0NDAyNS0yOTc0LTRjNGMtYjBjMi1lMjEzOTliYmRiMWbZJDdiOWFlMzgxLWQwZmMtNGQxZC1iMWVlLWFkMzFhNjQ0NWZmNtkkZDAzNzdmOWEtNjgwZC00NTAxLTkwY2EtOWVhM2FiNjgxZGI02SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGHZJDhkYzExMTc1LWViYzgtNDA3YS1hYjBiLTZkNTQzZjg0OWE3MtkkZjczMDgyZmYtYTZkMy00MWY4LTg3OTYtNDExNGZhODlkMmJi2SQ0NGEzMTA1Ny03YjM0LTRjODAtYTI3My02NjIxYzA3NzNkYzfZJDNkN2U3ZDIwLWE3N2EtNDhiMy1hZDJlLTZiNjIxMjI3YmUxNtkkYWJlYTJjNDMtZDgzZS00NDM4LThjZDMtNGJlMDZiODE3NGIztGxhc3RfaG90X3JlbG9hZF90aW1lywAAAAAAAAAAqXNob3J0cGF0aNkhMDItbG93LWZpZWxkLWNtcmEtb3B0aW1pemF0aW9uLmpsrnByb2Nlc3Nfc3RhdHVzpXJlYWR5pHBhdGjZYS9ob21lL3J1bm5lci93b3JrL0tvbWFNUkkuamwvS29tYU1SSS5qbC9kb2NzL3NyYy90dXRvcmlhbC1wbHV0by8wMi1sb3ctZmllbGQtY21yYS1vcHRpbWl6YXRpb24uamytcGx1dG9fdmVyc2lvbqh2MC4xOS40Nq5sYXN0X3NhdmVfdGltZctB2b/H8XgISqpjZWxsX29yZGVy3AAk2SRhOTljMGM0Ny0xYjcwLTQzNjItYTJmNi1hN2UzMjU5NjA2ZmHZJDFiYjNlNDliLTFhMTktNDM0My1hYzA5LWZiYWYxY2FlNGJhM9kkZmM1ODY0MGItYzQ0Yy00YzI1LWE0ZmQtNWEwZTE3ZDdiZWNk2SRkYmYxNjY3Ni02NGYyLTRkOWItYmYxYi04ZGUwNmIwNDg2MDLZJGY0OTY1NWNjLTQ2MGUtNDk4MS05MmVhLWRmZDYxNDczMDhiZtkkMGI3YTQwNWUtYmJiNS0xMWVlLTA1Y2EtNGIxYzg1NjczOThk2SQ3MGRiYzJiZC04YjkzLTQ3MWQtODM0MC0wNGQ5OGEwMDhjYTbZJDc3MTUzZTVjLTcxYmQtNDJlMy1iYWU5LWU0ODExZmZhN2EzZNkkOWUzOTc0MjYtYjYwYi00Yjk4LWJlOGItZjdmMTI4NjIxYzQ02SQ5MjE5NGZjYi01ODJhLTQ5Y2UtYWFkNy0yMGIwMTQ1ZDQwZDPZJGFlNzJmZmM1LTdmOGUtNDkwNy1hOTllLThhZDdjYjhmZGRhYtkkNmI4NzA0NDMtN2JlNS00Mjg3LWI5NTctY2E1YzE0ZWRhODlj2SQ3ODkwZjgxZS1jYjE1LTQ4ZDItYTgwYy05ZDczZjk1MTYwNTbZJGNiNjU5MTE4LTlmMjItNDNjMy04MDFkLTQ5MjQxZGVlNGRmNtkkMGI2YzFmNzItYjA0MC00ODNjLTk2OWItODhiZmUwOWIzMmMz2SRhMTVkNmI2NC1mOGVlLTRlZTQtODEyYy1kNDljZjVlYTc4NGTZJGYwYTgxYzlmLTU2MTYtNDY2My05NDhmLWE0MDg0ZTE3MTlhZtkkZjU3YTJiNmMtZWI0Yy00NWJkLTgwNTgtNGE2MGIwMzg5MjVk2SQxYTYyYWU3MS01OGRiLTQ5ZWEtYWU2YS05YWVhNjYxNDU5NjPZJGYyMWU5ZTU5LTI1YzMtNGYwNi04ZGU0LTc5MmNiMzA1ZWIwMdkkZWNlYjMyNmEtY2FiNi00NjVlLThlNWMtZTgzNTg4MWJkM2Iw2SRkNTRkNjgwNy00NDRmLTRlMGUtOGZkNi04NDQ1Nzk3NDExNWHZJGQwNWRjYmE3LTJmNDItNDdiZi1hMTcyLTYxMjNkMDExM2IzZtkkMzdmN2ZkN2YtNWNiMS00OGI1LWI4NzctYjJiYzIzYTFlN2Rk2SRkOTcxNWJjMS00OWNkLTRkZjgtOGRiZi1jMDZkZTQyYWQ1NTDZJDhkZDcwNGE0LWJmNTAtNGRkYy1hODMyLWQwNzRiZDUyYWQwMdkkMzlmNDQwMjUtMjk3NC00YzRjLWIwYzItZTIxMzk5YmJkYjFm2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjbZJGY3MzA4MmZmLWE2ZDMtNDFmOC04Nzk2LTQxMTRmYTg5ZDJiYtkkZDAzNzdmOWEtNjgwZC00NTAxLTkwY2EtOWVhM2FiNjgxZGI02SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGHZJDQ0YTMxMDU3LTdiMzQtNGM4MC1hMjczLTY2MjFjMDc3M2RjN9kkOGRjMTExNzUtZWJjOC00MDdhLWFiMGItNmQ1NDNmODQ5YTcy2SQzZDdlN2QyMC1hNzdhLTQ4YjMtYWQyZS02YjYyMTIyN2JlMTbZJGFiZWEyYzQzLWQ4M2UtNDQzOC04Y2QzLTRiZTA2YjgxNzRiM9kkN2RlYWRkNTgtYjIwMi00NTA4LWI0YzctNjg2Zjc0MmNiNzEzsXB1Ymxpc2hlZF9vYmplY3Rzhdk0ZWQyN2RlMWEtODFkOS0xMWVmLTNiNzMtMWIxMTYzMTJkYWU3LzVhMGUzMjQ2OTIzNmFlZoSmbGF5b3V0iKV4YXhpc4WodGlja3ZhbHPHFBcAAKBBAAACQwAAFkMAADRDAABwQ6h0aWNrbW9kZaVhcnJheaV0aXRsZbdGYXRTYXQgZmxpcCBhbmdsZSBbZGVnXaVyYW5nZdcXAACgQQAAcEOpY29uc3RyYWlupmRvbWFpbqlob3Zlcm1vZGWpeCB1bmlmaWVkpGZvbnSEpmZhbWlsealDTVUgU2VyaWarc2NhbGVhbmNob3KheKpzY2FsZXJhdGlvyj+AAACkc2l6ZcpBgAAAqHRlbXBsYXRlgqZsYXlvdXTeABOpY29sb3JheGlzgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApXhheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Zalob3Zlcm1vZGWnY2xvc2VzdK1wYXBlcl9iZ2NvbG9ypXdoaXRlo2dlb4apc2hvd2xha2Vzw6hzaG93bGFuZMOpbGFuZGNvbG9ypyNFNUVDRjanYmdjb2xvcqV3aGl0ZaxzdWJ1bml0Y29sb3Kld2hpdGWpbGFrZWNvbG9ypXdoaXRlqmNvbG9yc2NhbGWDqnNlcXVlbnRpYWyaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGpZGl2ZXJnaW5nm5LKAAAAAKcjOGUwMTUykso9zMzNpyNjNTFiN2SSyj5MzM2nI2RlNzdhZZLKPpmZmqcjZjFiNmRhkso+zMzNpyNmZGUwZWaSyj8AAACnI2Y3ZjdmN5LKPxmZmqcjZTZmNWQwkso/MzMzpyNiOGUxODaSyj9MzM2nIzdmYmM0MZLKP2ZmZqcjNGQ5MjIxkso/gAAApyMyNzY0MTmvc2VxdWVudGlhbG1pbnVzmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxpXlheGlzh6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmV3aWR0aMpAAAAApXRpdGxlgahzdGFuZG9mZspBcAAApXRpY2tzoK16ZXJvbGluZWNvbG9ypXdoaXRlqmF1dG9tYXJnaW7DqWxpbmVjb2xvcqV3aGl0Za1zaGFwZWRlZmF1bHRzgaRsaW5lgaVjb2xvcqcjMmEzZjVmqmhvdmVybGFiZWyBpWFsaWdupGxlZnSmbWFwYm94gaVzdHlsZaVsaWdodKVwb2xhcoOrYW5ndWxhcmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqpyYWRpYWxheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0Za9hdXRvdHlwZW51bWJlcnOmc3RyaWN0pGZvbnSBpWNvbG9ypyMyYTNmNWandGVybmFyeYSlYWF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlp2JnY29sb3KnI0U1RUNGNqVjYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWlYmF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlsmFubm90YXRpb25kZWZhdWx0c4OpYXJyb3doZWFkygAAAACqYXJyb3d3aWR0aMo/gAAAqmFycm93Y29sb3KnIzJhM2Y1ZqxwbG90X2JnY29sb3KnI0U1RUNGNqV0aXRsZYGheMo9TMzNpXNjZW5lg6V4YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWlemF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXlheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0Zahjb2xvcndheZqnIzYzNmVmYacjRUY1NTNCpyMwMGNjOTanI2FiNjNmYacjRkZBMTVBpyMxOWQzZjOnI0ZGNjY5MqcjQjZFODgwpyNGRjk3RkanI0ZFQ0I1MqRkYXRh3gAZrnNjYXR0ZXJwb2xhcmdskYKkdHlwZa5zY2F0dGVycG9sYXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmY2FycGV0kYOlYmF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaR0eXBlpmNhcnBldKVhYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlrHNjYXR0ZXJwb2xhcpGCpHR5cGWsc2NhdHRlcnBvbGFypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKlwYXJjb29yZHORgqRsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpcGFyY29vcmRzp3NjYXR0ZXKRgqR0eXBlp3NjYXR0ZXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAsmhpc3RvZ3JhbTJkY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZbJoaXN0b2dyYW0yZGNvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMadjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2NvbnRvdXKqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVyY2FycGV0kYKkdHlwZa1zY2F0dGVyY2FycGV0pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZtZXNoM2SRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWmbWVzaDNkp3N1cmZhY2WRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnc3VyZmFjZapjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJtYXBib3iRgqR0eXBlrXNjYXR0ZXJtYXBib3imbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqnNjYXR0ZXJnZW+RgqR0eXBlqnNjYXR0ZXJnZW+mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqWhpc3RvZ3JhbZGCpHR5cGWpaGlzdG9ncmFtpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKNwaWWRgqR0eXBlo3BpZaphdXRvbWFyZ2luw6pjaG9yb3BsZXRokYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqmNob3JvcGxldGipaGVhdG1hcGdskYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqWhlYXRtYXBnbKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxo2JhcpGEpHR5cGWjYmFyp2Vycm9yX3mBpWNvbG9ypyMyYTNmNWanZXJyb3JfeIGlY29sb3KnIzJhM2Y1ZqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKdoZWF0bWFwkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp2hlYXRtYXCqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1jb250b3VyY2FycGV0kYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlrWNvbnRvdXJjYXJwZXSldGFibGWRg6R0eXBlpXRhYmxlpmhlYWRlcoKkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0M4RDRFM6VjZWxsc4KkbGluZYGlY29sb3Kld2hpdGWkZmlsbIGlY29sb3KnI0VCRjBGOKlzY2F0dGVyM2SRg6RsaW5lgahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpc2NhdHRlcjNkpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKhiYXJwb2xhcpGCpHR5cGWoYmFycG9sYXKmbWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACpc2NhdHRlcmdskYKkdHlwZalzY2F0dGVyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAq2hpc3RvZ3JhbTJkkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlq2hpc3RvZ3JhbTJkqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGuc2NhdHRlcnRlcm5hcnmRgqR0eXBlrnNjYXR0ZXJ0ZXJuYXJ5pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZoZWlnaHTKQ8gAAKZtYXJnaW6EoWzKQkgAAKFiykJIAAChcspCSAAAoXTKQnAAAKV5YXhpc4OodGlja21vZGWlYXJyYXmldGl0bGWtU2lnbmFsIFthLnUuXaVyYW5nZdcXAAAAAM3MzD6ld2lkdGjKRBYAAKZjb25maWeFqHNob3dMaW5rwqhlZGl0YWJsZcKqcmVzcG9uc2l2ZcOqc3RhdGljUGxvdMKqc2Nyb2xsWm9vbcOmZnJhbWVzkKRkYXRhmIakbGluZYGlY29sb3KkYmx1ZaF5xzAXtnfUPR/90z0tOtM9uUDSPcYl0T0N/s89xdrOPe/GzT2Cxcw9TtHLPdXdyj3Q2ck9pHR5cGWnc2NhdHRlcqRuYW1lqk15b2NhcmRpdW2rbGVnZW5kZ3JvdXCqTXlvY2FyZGl1baF4xzAXAACgQQAAIEIAAHBCAACgQgAAyEIAAPBCAAAMQwAAIEMAADRDAABIQwAAXEMAAHBDhqRsaW5lgaVjb2xvcqNyZWSheccwF8Ssjj5Jfo4+BzWOPsjcjT7hgo0+aDONPrj2jD6Mz4w+z7mMPhWrjD68k4w+kWGMPqR0eXBlp3NjYXR0ZXKkbmFtZaVCbG9vZKtsZWdlbmRncm91cKVCbG9vZKF4xzAXAACgQQAAIEIAAHBCAACgQgAAyEIAAPBCAAAMQwAAIEMAADRDAABIQwAAXEMAAHBDhqRsaW5lgaVjb2xvcqVncmVlbqF5xzAXkJihPu7okz4BdHw+QyxHPq2sED52i9E9+1q/PfWNyD2f8c89k97JPWFAuj2G87Q9pHR5cGWnc2NhdHRlcqRuYW1lsUZhdCAoVOKCgT0xODMgbXMpq2xlZ2VuZGdyb3VwsUZhdCAoVOKCgT0xODMgbXMpoXjHMBcAAKBBAAAgQgAAcEIAAKBCAADIQgAA8EIAAAxDAAAgQwAANEMAAEhDAABcQwAAcEOKqnNob3dsZWdlbmTCpGxpbmWBpWNvbG9yrXJnYmEoMCwwLDAsMCmpZmlsbGNvbG9ysXJnYmEoMCwwLDI1NSwwLjIpoXnHYBfhGNI9hYHRPWp30D01Cc897l7NPXKqyz01F8o9CsHIPcmvxz281sY9yBbGPZ9DxT0BcM494qTPPd/L0D0629E91MzSPVWe0z2oUdQ9nuzUPT141T3w/NU9unjWPYvW1j2kdHlwZadzY2F0dGVypG5hbWWqTXlvY2FyZGl1baRmaWxspnRvc2VsZqlob3ZlcmluZm+kbm9uZatsZWdlbmRncm91cKpNeW9jYXJkaXVtoXjHYBcAAKBBAAAgQgAAcEIAAKBCAADIQgAA8EIAAAxDAAAgQwAANEMAAEhDAABcQwAAcEMAAHBDAABcQwAASEMAADRDAAAgQwAADEMAAPBCAADIQgAAoEIAAHBCAAAgQgAAoEGGpGxpbmWCpWNvbG9ypWdyZWVupGRhc2ikZGFzaKF5xzAXNqCuPinOoT69bI0+lZNoPo1NND7Ltgg+AN/nPfif3z05Ed89gELbPdXE1z0vF+U9pHR5cGWnc2NhdHRlcqRuYW1lsUZhdCAoVOKCgT0xMzAgbXMpq2xlZ2VuZGdyb3VwsUZhdCAoVOKCgT0xMzAgbXMpoXjHMBcAAKBBAAAgQgAAcEIAAKBCAADIQgAA8EIAAAxDAAAgQwAANEMAAEhDAABcQwAAcEOKqnNob3dsZWdlbmTCpGxpbmWBpWNvbG9yrXJnYmEoMCwwLDAsMCmpZmlsbGNvbG9ysXJnYmEoMjU1LDAsMCwwLjIpoXnHYBcJpos+YnKLPjwXiz4vnoo+dBqKPsSkiT6AUok+yC2JPpUxiT7GSok+e12JPqxMiT52do8+/MmPPmQLkD4KQpA+T3GQPvGakD4LwpA+T+uQPmEbkT7TUpE+MIqRPn6zkT6kdHlwZadzY2F0dGVypG5hbWWlQmxvb2SkZmlsbKZ0b3NlbGapaG92ZXJpbmZvpG5vbmWrbGVnZW5kZ3JvdXClQmxvb2SheMdgFwAAoEEAACBCAABwQgAAoEIAAMhCAADwQgAADEMAACBDAAA0QwAASEMAAFxDAABwQwAAcEMAAFxDAABIQwAANEMAACBDAAAMQwAA8EIAAMhCAACgQgAAcEIAACBCAACgQYqqc2hvd2xlZ2VuZMKkbGluZYGlY29sb3KtcmdiYSgwLDAsMCwwKalmaWxsY29sb3KxcmdiYSgwLDI1NSwwLDAuMimhecdgF4vmeT5XIGE+EIM4Pj8PBT4POJ89OOw8PV2AaD0MBJI9MLyYPWcJkD33VmY9knsNPaKUET6kqgA+4NkBPoeTAz7eF/894zoFPmhQIj5TvVE+pKSEPnkyoD6xQbc+2z3GPqR0eXBlp3NjYXR0ZXKkbmFtZbFGYXQgKFTigoE9MTgzIG1zKaRmaWxspnRvc2VsZqlob3ZlcmluZm+kbm9uZatsZWdlbmRncm91cLFGYXQgKFTigoE9MTgzIG1zKaF4x2AXAACgQQAAIEIAAHBCAACgQgAAyEIAAPBCAAAMQwAAIEMAADRDAABIQwAAXEMAAHBDAABwQwAAXEMAAEhDAAA0QwAAIEMAAAxDAADwQgAAyEIAAKBCAABwQgAAIEIAAKBBiqpzaG93bGVnZW5kwqRsaW5lgaVjb2xvcq1yZ2JhKDAsMCwwLDApqWZpbGxjb2xvcrFyZ2JhKDAsMjU1LDAsMC4yKaF5x2AXEGF/PtDraD5+FUQ+B34VPiZuyD01HHc9rVtjPXL5hT1c14892d+EPWKJUD2zXhs9gj8+Pn2iIz6T0hg+iyUXPj+jHD4VCC8+iKZTPgQygj6S1J0+u864Pmkmzz7lj90+pHR5cGWnc2NhdHRlcqRuYW1lsUZhdCAoVOKCgT0xMzAgbXMppGZpbGymdG9zZWxmqWhvdmVyaW5mb6Rub25lq2xlZ2VuZGdyb3VwsUZhdCAoVOKCgT0xMzAgbXMpoXjHYBcAAKBBAAAgQgAAcEIAAKBCAADIQgAA8EIAAAxDAAAgQwAANEMAAEhDAABcQwAAcEMAAHBDAABcQwAASEMAADRDAAAgQwAADEMAAPBCAADIQgAAoEIAAHBCAAAgQgAAoEHZNWVkMjdkZTFhLTgxZDktMTFlZi0zYjczLTFiMTE2MzEyZGFlNy9hMmY3NGIyOGNmOTk0OTZmhKZsYXlvdXSIpXhheGlzhah0aWNrdmFsc8cUFwAAoEEAAKpCAADcQgAAAkMAADRDqHRpY2ttb2RlpWFycmF5pXRpdGxlsEZsaXAgYW5nbGUgW2RlZ12lcmFuZ2XXFwAAoEEAADRDqWNvbnN0cmFpbqZkb21haW6paG92ZXJtb2RlqXggdW5pZmllZKRmb250hKZmYW1pbHmpQ01VIFNlcmlmq3NjYWxlYW5jaG9yoXiqc2NhbGVyYXRpb8o/gAAApHNpemXKQYAAAKh0ZW1wbGF0ZYKmbGF5b3V03gATqWNvbG9yYXhpc4GoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKV4YXhpc4epZ3JpZGNvbG9ypXdoaXRlrXplcm9saW5ld2lkdGjKQAAAAKV0aXRsZYGoc3RhbmRvZmbKQXAAAKV0aWNrc6CtemVyb2xpbmVjb2xvcqV3aGl0ZaphdXRvbWFyZ2luw6lsaW5lY29sb3Kld2hpdGWpaG92ZXJtb2Rlp2Nsb3Nlc3StcGFwZXJfYmdjb2xvcqV3aGl0ZaNnZW+GqXNob3dsYWtlc8Ooc2hvd2xhbmTDqWxhbmRjb2xvcqcjRTVFQ0Y2p2JnY29sb3Kld2hpdGWsc3VidW5pdGNvbG9ypXdoaXRlqWxha2Vjb2xvcqV3aGl0Zapjb2xvcnNjYWxlg6pzZXF1ZW50aWFsmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxqWRpdmVyZ2luZ5uSygAAAACnIzhlMDE1MpLKPczMzacjYzUxYjdkkso+TMzNpyNkZTc3YWWSyj6ZmZqnI2YxYjZkYZLKPszMzacjZmRlMGVmkso/AAAApyNmN2Y3ZjeSyj8ZmZqnI2U2ZjVkMJLKPzMzM6cjYjhlMTg2kso/TMzNpyM3ZmJjNDGSyj9mZmanIzRkOTIyMZLKP4AAAKcjMjc2NDE5r3NlcXVlbnRpYWxtaW51c5qSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMaV5YXhpc4epZ3JpZGNvbG9ypXdoaXRlrXplcm9saW5ld2lkdGjKQAAAAKV0aXRsZYGoc3RhbmRvZmbKQXAAAKV0aWNrc6CtemVyb2xpbmVjb2xvcqV3aGl0ZaphdXRvbWFyZ2luw6lsaW5lY29sb3Kld2hpdGWtc2hhcGVkZWZhdWx0c4GkbGluZYGlY29sb3KnIzJhM2Y1Zqpob3ZlcmxhYmVsgaVhbGlnbqRsZWZ0pm1hcGJveIGlc3R5bGWlbGlnaHSlcG9sYXKDq2FuZ3VsYXJheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZadiZ2NvbG9ypyNFNUVDRjaqcmFkaWFsYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWvYXV0b3R5cGVudW1iZXJzpnN0cmljdKRmb250gaVjb2xvcqcjMmEzZjVmp3Rlcm5hcnmEpWFheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZadiZ2NvbG9ypyNFNUVDRjalY2F4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlpWJheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZbJhbm5vdGF0aW9uZGVmYXVsdHODqWFycm93aGVhZMoAAAAAqmFycm93d2lkdGjKP4AAAKphcnJvd2NvbG9ypyMyYTNmNWascGxvdF9iZ2NvbG9ypyNFNUVDRjaldGl0bGWBoXjKPUzMzaVzY2VuZYOleGF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXpheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0ZaV5YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWoY29sb3J3YXmapyM2MzZlZmGnI0VGNTUzQqcjMDBjYzk2pyNhYjYzZmGnI0ZGQTE1QacjMTlkM2YzpyNGRjY2OTKnI0I2RTg4MKcjRkY5N0ZGpyNGRUNCNTKkZGF0Yd4AGa5zY2F0dGVycG9sYXJnbJGCpHR5cGWuc2NhdHRlcnBvbGFyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApmNhcnBldJGDpWJheGlzhalncmlkY29sb3Kld2hpdGWsZW5kbGluZWNvbG9ypyMyYTNmNWaubWlub3JncmlkY29sb3Kld2hpdGWuc3RhcnRsaW5lY29sb3KnIzJhM2Y1ZqlsaW5lY29sb3Kld2hpdGWkdHlwZaZjYXJwZXSlYWF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaxzY2F0dGVycG9sYXKRgqR0eXBlrHNjYXR0ZXJwb2xhcqZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACpcGFyY29vcmRzkYKkbGluZYGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqXBhcmNvb3Jkc6dzY2F0dGVykYKkdHlwZadzY2F0dGVypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAALJoaXN0b2dyYW0yZGNvbnRvdXKRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWyaGlzdG9ncmFtMmRjb250b3VyqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGnY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadjb250b3VyqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtc2NhdHRlcmNhcnBldJGCpHR5cGWtc2NhdHRlcmNhcnBldKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmbWVzaDNkkYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlpm1lc2gzZKdzdXJmYWNlkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp3N1cmZhY2WqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVybWFwYm94kYKkdHlwZa1zY2F0dGVybWFwYm94pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKpzY2F0dGVyZ2VvkYKkdHlwZapzY2F0dGVyZ2Vvpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKloaXN0b2dyYW2RgqR0eXBlqWhpc3RvZ3JhbaZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACjcGllkYKkdHlwZaNwaWWqYXV0b21hcmdpbsOqY2hvcm9wbGV0aJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZapjaG9yb3BsZXRoqWhlYXRtYXBnbJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZaloZWF0bWFwZ2yqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMaNiYXKRhKR0eXBlo2JhcqdlcnJvcl95gaVjb2xvcqcjMmEzZjVmp2Vycm9yX3iBpWNvbG9ypyMyYTNmNWambWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACnaGVhdG1hcJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadoZWF0bWFwqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtY29udG91cmNhcnBldJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZa1jb250b3VyY2FycGV0pXRhYmxlkYOkdHlwZaV0YWJsZaZoZWFkZXKCpGxpbmWBpWNvbG9ypXdoaXRlpGZpbGyBpWNvbG9ypyNDOEQ0RTOlY2VsbHOCpGxpbmWBpWNvbG9ypXdoaXRlpGZpbGyBpWNvbG9ypyNFQkYwRjipc2NhdHRlcjNkkYOkbGluZYGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqXNjYXR0ZXIzZKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACoYmFycG9sYXKRgqR0eXBlqGJhcnBvbGFypm1hcmtlcoGkbGluZYKlY29sb3KnI0U1RUNGNqV3aWR0aMo/AAAAqXNjYXR0ZXJnbJGCpHR5cGWpc2NhdHRlcmdspm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKtoaXN0b2dyYW0yZJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZatoaXN0b2dyYW0yZKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrnNjYXR0ZXJ0ZXJuYXJ5kYKkdHlwZa5zY2F0dGVydGVybmFyeaZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmaGVpZ2h0ykPIAACmbWFyZ2luhKFsykJIAAChYspCSAAAoXLKQkgAAKF0ykJwAACleWF4aXODqHRpY2ttb2RlpWFycmF5pXRpdGxlrVNpZ25hbCBbYS51Ll2lcmFuZ2XXFwAAAACamZk+pXdpZHRoykQWAACmY29uZmlnhahzaG93TGlua8KoZWRpdGFibGXCqnJlc3BvbnNpdmXDqnN0YXRpY1Bsb3TCqnNjcm9sbFpvb23DpmZyYW1lc5CkZGF0YZaGpGxpbmWBpWNvbG9ypGJsdWWhecdEF+/PLz2Mwnk9lOuaPVp8sT0C2cA9rNLJPVp/zT3ZA809LXHJPZaywz3hh7w9vYa0PcYfrD0XpaM9iVCbPcJJkz3uqYs9pHR5cGWnc2NhdHRlcqRuYW1lqk15b2NhcmRpdW2rbGVnZW5kZ3JvdXCqTXlvY2FyZGl1baF4x0QXAACgQQAA8EEAACBCAABIQgAAcEIAAIxCAACgQgAAtEIAAMhCAADcQgAA8EIAAAJDAAAMQwAAFkMAACBDAAAqQwAANEOGpGxpbmWBpWNvbG9yo3JlZKF5x0QXLTa0PfGVAj4cLiY+NRtEPg0XXD5PTG4+PjV7Pji9gT6u6oM+L32EPs/Fgz5oCYI+t/9+Pk2qeD5PVXE+hDJpPkVkYD6kdHlwZadzY2F0dGVypG5hbWWlQmxvb2SrbGVnZW5kZ3JvdXClQmxvb2SheMdEFwAAoEEAAPBBAAAgQgAASEIAAHBCAACMQgAAoEIAALRCAADIQgAA3EIAAPBCAAACQwAADEMAABZDAAAgQwAAKkMAADRDhqRsaW5lgaVjb2xvcqZwdXJwbGWhecdEF2ycOD2cSog9pHCxPRC61j0YVfc9+WIJPpF1FD6D+Bw+xRwjPhMhJz6uRyk+cs8pPtTvKD7C1yY+Cq0jPqONHz5Ojxo+pHR5cGWnc2NhdHRlcqRuYW1lrHxCbG9vZC1NeW9jfKtsZWdlbmRncm91cKx8Qmxvb2QtTXlvY3yheMdEFwAAoEEAAPBBAAAgQgAASEIAAHBCAACMQgAAoEIAALRCAADIQgAA3EIAAPBCAAACQwAADEMAABZDAAAgQwAAKkMAADRDiqpzaG93bGVnZW5kwqRsaW5lgaVjb2xvcq1yZ2JhKDAsMCwwLDApqWZpbGxjb2xvcrFyZ2JhKDAsMCwyNTUsMC4yKaF5x4gXAJsnPXRMbT3XkpI92SSnPYK+tD2WRbw9r9i+PfSZvT3oj7k9QJezPU1grD1dcqQ9zTGcPQHnkz2SxIs9Fu2DPUHteD093Zo9b6aiPYHcqj0tY7M9vg28PR6bxD10r8w97c3TPXJS2T2+bdw9BSbcPcJf1z2B88w929O7PVFEoz1SHIM93gQ4PaR0eXBlp3NjYXR0ZXKkbmFtZapNeW9jYXJkaXVtpGZpbGymdG9zZWxmqWhvdmVyaW5mb6Rub25lq2xlZ2VuZGdyb3Vwqk15b2NhcmRpdW2heMeIFwAAoEEAAPBBAAAgQgAASEIAAHBCAACMQgAAoEIAALRCAADIQgAA3EIAAPBCAAACQwAADEMAABZDAAAgQwAAKkMAADRDAAA0QwAAKkMAACBDAAAWQwAADEMAAAJDAADwQgAA3EIAAMhCAAC0QgAAoEIAAIxCAABwQgAASEIAACBCAADwQQAAoEGKqnNob3dsZWdlbmTCpGxpbmWBpWNvbG9yrXJnYmEoMCwwLDAsMCmpZmlsbGNvbG9ysXJnYmEoMjU1LDAsMCwwLjIpoXnHiBfsiK49LcL7PawqHz6jWjo+QUFPPqwtXj49xGc+x9VsPus8bj6uxWw+LiBpPrXbYz5QZ10+CxZWPk0jTj5ruEU+Q+88PqTsgT5PVoY+qUOKPkifjT4PTJA+9iSSPof7kj6Il5I+57aQPowPjT4fU4c+8Wp+PtnsaD7H200+jDEtPstKBz5u47k9pHR5cGWnc2NhdHRlcqRuYW1lpUJsb29kpGZpbGymdG9zZWxmqWhvdmVyaW5mb6Rub25lq2xlZ2VuZGdyb3VwpUJsb29koXjHiBcAAKBBAADwQQAAIEIAAEhCAABwQgAAjEIAAKBCAAC0QgAAyEIAANxCAADwQgAAAkMAAAxDAAAWQwAAIEMAACpDAAA0QwAANEMAACpDAAAgQwAAFkMAAAxDAAACQwAA8EIAANxCAADIQgAAtEIAAKBCAACMQgAAcEIAAEhCAAAgQgAA8EEAAKBBiqpzaG93bGVnZW5kwqRsaW5lgaVjb2xvcq1yZ2JhKDAsMCwwLDApqWZpbGxjb2xvcrNyZ2JhKDI1NSwwLDI1NSwwLjIpoXnHiBc9djU9nhuFPS/Cqz0hkM09ucPpPb0KAD6/Vwg+nwgOPr10ET7F+RI+qe8SPg+iET7RTQ8+ziEMPh9ACD7PwAM+YmX9PeprNj54Wjs+9Rk/PraNQT7WkUI+1vxBPrKfPz5iSDs+zcQ0PmboKz5jkyA+NLsSPjtzAj7/4989GR+3PZp5iz2bwjs9pHR5cGWnc2NhdHRlcqRuYW1lrHxCbG9vZC1NeW9jfKRmaWxspnRvc2VsZqlob3ZlcmluZm+kbm9uZatsZWdlbmRncm91cKx8Qmxvb2QtTXlvY3yheMeIFwAAoEEAAPBBAAAgQgAASEIAAHBCAACMQgAAoEIAALRCAADIQgAA3EIAAPBCAAACQwAADEMAABZDAAAgQwAAKkMAADRDAAA0QwAAKkMAACBDAAAWQwAADEMAAAJDAADwQgAA3EIAAMhCAAC0QgAAoEIAAIxCAABwQgAASEIAACBCAADwQQAAoEHZNWVkMjdkZTFhLTgxZDktMTFlZi0zYjczLTFiMTE2MzEyZGFlNy9iMjJkZTk4Nzg0ODY3OTI4hKZsYXlvdXSHpXhheGlzha5zaG93dGlja2xhYmVsc8KlcmFuZ2XXFwAAQEAAAFBApmRvbWFpbpLKAAAAAMo/gAAAp21hdGNoZXOieDKmYW5jaG9yoXmmeGF4aXMygqZkb21haW6SygAAAADKP4AAAKZhbmNob3KieTKodGVtcGxhdGWCpmxheW91dN4AE6ljb2xvcmF4aXOBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACleGF4aXOHqWdyaWRjb2xvcqV3aGl0Za16ZXJvbGluZXdpZHRoykAAAACldGl0bGWBqHN0YW5kb2ZmykFwAACldGlja3OgrXplcm9saW5lY29sb3Kld2hpdGWqYXV0b21hcmdpbsOpbGluZWNvbG9ypXdoaXRlqWhvdmVybW9kZadjbG9zZXN0rXBhcGVyX2JnY29sb3Kld2hpdGWjZ2VvhqlzaG93bGFrZXPDqHNob3dsYW5kw6lsYW5kY29sb3KnI0U1RUNGNqdiZ2NvbG9ypXdoaXRlrHN1YnVuaXRjb2xvcqV3aGl0ZalsYWtlY29sb3Kld2hpdGWqY29sb3JzY2FsZYOqc2VxdWVudGlhbJqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMalkaXZlcmdpbmebksoAAAAApyM4ZTAxNTKSyj3MzM2nI2M1MWI3ZJLKPkzMzacjZGU3N2Flkso+mZmapyNmMWI2ZGGSyj7MzM2nI2ZkZTBlZpLKPwAAAKcjZjdmN2Y3kso/GZmapyNlNmY1ZDCSyj8zMzOnI2I4ZTE4NpLKP0zMzacjN2ZiYzQxkso/ZmZmpyM0ZDkyMjGSyj+AAACnIzI3NjQxOa9zZXF1ZW50aWFsbWludXOaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGleWF4aXOHqWdyaWRjb2xvcqV3aGl0Za16ZXJvbGluZXdpZHRoykAAAACldGl0bGWBqHN0YW5kb2ZmykFwAACldGlja3OgrXplcm9saW5lY29sb3Kld2hpdGWqYXV0b21hcmdpbsOpbGluZWNvbG9ypXdoaXRlrXNoYXBlZGVmYXVsdHOBpGxpbmWBpWNvbG9ypyMyYTNmNWaqaG92ZXJsYWJlbIGlYWxpZ26kbGVmdKZtYXBib3iBpXN0eWxlpWxpZ2h0pXBvbGFyg6thbmd1bGFyYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWnYmdjb2xvcqcjRTVFQ0Y2qnJhZGlhbGF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlr2F1dG90eXBlbnVtYmVyc6ZzdHJpY3SkZm9udIGlY29sb3KnIzJhM2Y1Zqd0ZXJuYXJ5hKVhYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWnYmdjb2xvcqcjRTVFQ0Y2pWNheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZaViYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWyYW5ub3RhdGlvbmRlZmF1bHRzg6lhcnJvd2hlYWTKAAAAAKphcnJvd3dpZHRoyj+AAACqYXJyb3djb2xvcqcjMmEzZjVmrHBsb3RfYmdjb2xvcqcjRTVFQ0Y2pXRpdGxlgaF4yj1MzM2lc2NlbmWDpXhheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0ZaV6YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWleWF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlqGNvbG9yd2F5mqcjNjM2ZWZhpyNFRjU1M0KnIzAwY2M5NqcjYWI2M2ZhpyNGRkExNUGnIzE5ZDNmM6cjRkY2NjkypyNCNkU4ODCnI0ZGOTdGRqcjRkVDQjUypGRhdGHeABmuc2NhdHRlcnBvbGFyZ2yRgqR0eXBlrnNjYXR0ZXJwb2xhcmdspm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZjYXJwZXSRg6ViYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlpHR5cGWmY2FycGV0pWFheGlzhalncmlkY29sb3Kld2hpdGWsZW5kbGluZWNvbG9ypyMyYTNmNWaubWlub3JncmlkY29sb3Kld2hpdGWuc3RhcnRsaW5lY29sb3KnIzJhM2Y1ZqlsaW5lY29sb3Kld2hpdGWsc2NhdHRlcnBvbGFykYKkdHlwZaxzY2F0dGVycG9sYXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqXBhcmNvb3Jkc5GCpGxpbmWBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZalwYXJjb29yZHOnc2NhdHRlcpGCpHR5cGWnc2NhdHRlcqZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACyaGlzdG9ncmFtMmRjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlsmhpc3RvZ3JhbTJkY29udG91cqpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxp2NvbnRvdXKRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnY29udG91cqpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJjYXJwZXSRgqR0eXBlrXNjYXR0ZXJjYXJwZXSmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApm1lc2gzZJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZaZtZXNoM2Snc3VyZmFjZZGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadzdXJmYWNlqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtc2NhdHRlcm1hcGJveJGCpHR5cGWtc2NhdHRlcm1hcGJveKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACqc2NhdHRlcmdlb5GCpHR5cGWqc2NhdHRlcmdlb6ZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACpaGlzdG9ncmFtkYKkdHlwZaloaXN0b2dyYW2mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAo3BpZZGCpHR5cGWjcGllqmF1dG9tYXJnaW7DqmNob3JvcGxldGiRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWqY2hvcm9wbGV0aKloZWF0bWFwZ2yRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpaGVhdG1hcGdsqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGjYmFykYSkdHlwZaNiYXKnZXJyb3JfeYGlY29sb3KnIzJhM2Y1ZqdlcnJvcl94gaVjb2xvcqcjMmEzZjVmpm1hcmtlcoGkbGluZYKlY29sb3KnI0U1RUNGNqV3aWR0aMo/AAAAp2hlYXRtYXCRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnaGVhdG1hcKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrWNvbnRvdXJjYXJwZXSRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWtY29udG91cmNhcnBldKV0YWJsZZGDpHR5cGWldGFibGWmaGVhZGVygqRsaW5lgaVjb2xvcqV3aGl0ZaRmaWxsgaVjb2xvcqcjQzhENEUzpWNlbGxzgqRsaW5lgaVjb2xvcqV3aGl0ZaRmaWxsgaVjb2xvcqcjRUJGMEY4qXNjYXR0ZXIzZJGDpGxpbmWBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZalzY2F0dGVyM2SmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqGJhcnBvbGFykYKkdHlwZahiYXJwb2xhcqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKlzY2F0dGVyZ2yRgqR0eXBlqXNjYXR0ZXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACraGlzdG9ncmFtMmSRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWraGlzdG9ncmFtMmSqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa5zY2F0dGVydGVybmFyeZGCpHR5cGWuc2NhdHRlcnRlcm5hcnmmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAq2Fubm90YXRpb25zkomneWFuY2hvcqZib3R0b22neGFuY2hvcqZjZW50ZXKheco/gAAApGZvbnSBpHNpemXKQYAAAKR5cmVmpXBhcGVyqXNob3dhcnJvd8KkdGV4dKNNeHmkeHJlZqVwYXBlcqF4yj8AAACJp3lhbmNob3KmYm90dG9tp3hhbmNob3KmY2VudGVyoXnKPuZmZqRmb250gaRzaXplykGAAACkeXJlZqVwYXBlcqlzaG93YXJyb3fCpHRleHSiTXqkeHJlZqVwYXBlcqF4yj8AAACmbWFyZ2luhKFsykJIAAChYspCSAAAoXLKQkgAAKF0ykJwAACleWF4aXODpXJhbmdl1xcAAAAAzczMPqZkb21haW6Syj8MzM3KP4AAAKZhbmNob3KheKZ5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dGF0aW9uoWiheMoAAAAAqWhvdmVybW9kZadjbG9zZXN0rXBhcGVyX2JnY29sb3KtcmdiYSgwLDAsMCwwKah0ZW1wbGF0ZYKmbGF5b3V03gATqWNvbG9yYXhpc4GoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKV4YXhpc4epZ3JpZGNvbG9ypXdoaXRlrXplcm9saW5ld2lkdGjKQAAAAKV0aXRsZYGoc3RhbmRvZmbKQXAAAKV0aWNrc6CtemVyb2xpbmVjb2xvcqV3aGl0ZaphdXRvbWFyZ2luw6lsaW5lY29sb3Kld2hpdGWpaG92ZXJtb2Rlp2Nsb3Nlc3StcGFwZXJfYmdjb2xvcqV3aGl0ZaNnZW+GqXNob3dsYWtlc8Ooc2hvd2xhbmTDqWxhbmRjb2xvcqcjRTVFQ0Y2p2JnY29sb3Kld2hpdGWsc3VidW5pdGNvbG9ypXdoaXRlqWxha2Vjb2xvcqV3aGl0Zapjb2xvcnNjYWxlg6pzZXF1ZW50aWFsmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxqWRpdmVyZ2luZ5uSygAAAACnIzhlMDE1MpLKPczMzacjYzUxYjdkkso+TMzNpyNkZTc3YWWSyj6ZmZqnI2YxYjZkYZLKPszMzacjZmRlMGVmkso/AAAApyNmN2Y3ZjeSyj8ZmZqnI2U2ZjVkMJLKPzMzM6cjYjhlMTg2kso/TMzNpyM3ZmJjNDGSyj9mZmanIzRkOTIyMZLKP4AAAKcjMjc2NDE5r3NlcXVlbnRpYWxtaW51c5qSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMaV5YXhpc4epZ3JpZGNvbG9ypXdoaXRlrXplcm9saW5ld2lkdGjKQAAAAKV0aXRsZYGoc3RhbmRvZmbKQXAAAKV0aWNrc6CtemVyb2xpbmVjb2xvcqV3aGl0ZaphdXRvbWFyZ2luw6lsaW5lY29sb3Kld2hpdGWtc2hhcGVkZWZhdWx0c4GkbGluZYGlY29sb3KnIzJhM2Y1Zqpob3ZlcmxhYmVsgaVhbGlnbqRsZWZ0pm1hcGJveIGlc3R5bGWlbGlnaHSlcG9sYXKDq2FuZ3VsYXJheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZadiZ2NvbG9ypyNFNUVDRjaqcmFkaWFsYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWvYXV0b3R5cGVudW1iZXJzpnN0cmljdKRmb250gaVjb2xvcqcjMmEzZjVmp3Rlcm5hcnmEpWFheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZadiZ2NvbG9ypyNFNUVDRjalY2F4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlpWJheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZbJhbm5vdGF0aW9uZGVmYXVsdHODqWFycm93aGVhZMoAAAAAqmFycm93d2lkdGjKP4AAAKphcnJvd2NvbG9ypyMyYTNmNWascGxvdF9iZ2NvbG9ypyNFNUVDRjaldGl0bGWBoXjKPUzMzaVzY2VuZYOleGF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlpXpheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0ZaV5YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWoY29sb3J3YXmapyM2MzZlZmGnI0VGNTUzQqcjMDBjYzk2pyNhYjYzZmGnI0ZGQTE1QacjMTlkM2YzpyNGRjY2OTKnI0I2RTg4MKcjRkY5N0ZGpyNGRUNCNTKkZGF0Yd4AGa5zY2F0dGVycG9sYXJnbJGCpHR5cGWuc2NhdHRlcnBvbGFyZ2ymbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApmNhcnBldJGDpWJheGlzhalncmlkY29sb3Kld2hpdGWsZW5kbGluZWNvbG9ypyMyYTNmNWaubWlub3JncmlkY29sb3Kld2hpdGWuc3RhcnRsaW5lY29sb3KnIzJhM2Y1ZqlsaW5lY29sb3Kld2hpdGWkdHlwZaZjYXJwZXSlYWF4aXOFqWdyaWRjb2xvcqV3aGl0ZaxlbmRsaW5lY29sb3KnIzJhM2Y1Zq5taW5vcmdyaWRjb2xvcqV3aGl0Za5zdGFydGxpbmVjb2xvcqcjMmEzZjVmqWxpbmVjb2xvcqV3aGl0ZaxzY2F0dGVycG9sYXKRgqR0eXBlrHNjYXR0ZXJwb2xhcqZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACpcGFyY29vcmRzkYKkbGluZYGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqXBhcmNvb3Jkc6dzY2F0dGVykYKkdHlwZadzY2F0dGVypm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAALJoaXN0b2dyYW0yZGNvbnRvdXKRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWyaGlzdG9ncmFtMmRjb250b3VyqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGnY29udG91cpGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadjb250b3VyqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtc2NhdHRlcmNhcnBldJGCpHR5cGWtc2NhdHRlcmNhcnBldKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmbWVzaDNkkYKoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlpm1lc2gzZKdzdXJmYWNlkYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlp3N1cmZhY2WqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa1zY2F0dGVybWFwYm94kYKkdHlwZa1zY2F0dGVybWFwYm94pm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKpzY2F0dGVyZ2VvkYKkdHlwZapzY2F0dGVyZ2Vvpm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKloaXN0b2dyYW2RgqR0eXBlqWhpc3RvZ3JhbaZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACjcGllkYKkdHlwZaNwaWWqYXV0b21hcmdpbsOqY2hvcm9wbGV0aJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZapjaG9yb3BsZXRoqWhlYXRtYXBnbJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZaloZWF0bWFwZ2yqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMaNiYXKRhKR0eXBlo2JhcqdlcnJvcl95gaVjb2xvcqcjMmEzZjVmp2Vycm9yX3iBpWNvbG9ypyMyYTNmNWambWFya2VygaRsaW5lgqVjb2xvcqcjRTVFQ0Y2pXdpZHRoyj8AAACnaGVhdG1hcJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadoZWF0bWFwqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtY29udG91cmNhcnBldJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZa1jb250b3VyY2FycGV0pXRhYmxlkYOkdHlwZaV0YWJsZaZoZWFkZXKCpGxpbmWBpWNvbG9ypXdoaXRlpGZpbGyBpWNvbG9ypyNDOEQ0RTOlY2VsbHOCpGxpbmWBpWNvbG9ypXdoaXRlpGZpbGyBpWNvbG9ypyNFQkYwRjipc2NhdHRlcjNkkYOkbGluZYGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlqXNjYXR0ZXIzZKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACoYmFycG9sYXKRgqR0eXBlqGJhcnBvbGFypm1hcmtlcoGkbGluZYKlY29sb3KnI0U1RUNGNqV3aWR0aMo/AAAAqXNjYXR0ZXJnbJGCpHR5cGWpc2NhdHRlcmdspm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKtoaXN0b2dyYW0yZJGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZatoaXN0b2dyYW0yZKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrnNjYXR0ZXJ0ZXJuYXJ5kYKkdHlwZa5zY2F0dGVydGVybmFyeaZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACmbGVnZW5khad5YW5jaG9ypmJvdHRvbad4YW5jaG9ypGxlZnSheco/gAAAq29yaWVudGF0aW9uoWiheMoAAAAApXlheGlzg6lncmlkY29sb3Kld2hpdGWtemVyb2xpbmVjb2xvcqV3aGl0ZapmaXhlZHJhbmdlwqRmb250gaVjb2xvcqRncmF5pXRpdGxloKxwbG90X2JnY29sb3KwcmdiKDIyOSwyMzYsMjQ2KaZtYXJnaW6EoWzKAAAAAKFiygAAAAChcsoAAAAAoXTKAAAAAKZjb25maWeItm1vZGVCYXJCdXR0b25zVG9SZW1vdmWapHpvb22oc2VsZWN0MmSnbGFzc28yZKlhdXRvU2NhbGWscmVzZXRTY2FsZTJko3Bhbq10YWJsZVJvdGF0aW9us3Jlc2V0Q2FtZXJhTGFzdFNhdmWmem9vbUlup3pvb21PdXSrZGlzcGxheWxvZ2/CtHRvSW1hZ2VCdXR0b25PcHRpb25zgaZmb3JtYXSjc3ZnqHNob3dMaW5rwqhlZGl0YWJsZcKqcmVzcG9uc2l2ZcOqc3RhdGljUGxvdMKqc2Nyb2xsWm9vbcOmZnJhbWVzkKRkYXRhl4qqc2hvd2xlZ2VuZMOmbWFya2VygaVjb2xvcqcjNjM2RUZBpXhheGlzoXihecgIEBcAAIB/AACAfwAAgH8AAIB/AACAfwAAAAAAAABBAAAAQQAAAAAAAIB/AACAfwAAAAAAAADBAAAAwQAAAAAAAIB/AACAfwAAgH8AAAAAAAAAQQAAAEEAAAAAAACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAAAAAAABBAAAAQQAAAAAAAIB/AACAfwAAAAAAAADBAAAAwQAAAAAAAIB/AACAfwAAgH8AAAAAAAAAQQAAAEEAAAAAAACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAAAAAAABBAAAAQQAAAAAAAIB/AACAfwAAAAAAAADBAAAAwQAAAAAAAIB/AACAfwAAgH8AAAAAAAAAQQAAAEEAAAAAAACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAAAAAAABBAAAAQQAAAAAAAIB/AACAfwAAAAAAAADBAAAAwQAAAAAAAIB/AACAfwAAgH8AAAAAAAAAQQAAAEEAAAAAAACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH+kdHlwZadzY2F0dGVypG5hbWWiR3ileWF4aXOheatsZWdlbmRncm91cKJHeK1ob3ZlcnRlbXBsYXRlvCgle3g6LjRmfSBtcywgJXt5Oi4yZn0gbVQvbSmheMgIEBcAAIB/AACAfwAAgH8AAIB/AACAfwAASkJmZkxCZmZkQs3MZkIAAIB/AACAf9PNZkLTzWhC0810QtPNdkIAAIB/AACAfwAAgH/pprBC6aaxQummt0LpprhCAACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwBQg0QzY4NEMyOERGY2hEQAAIB/AACAf282hERvRoREb6aERG+2hEQAAIB/AACAfwAAgH9vCohEbxqIRG96iERviohEAACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAoAEWaMQBFmpEARTObAEUAAIB/AACAfzebAEU3owBFN9MARTfbAEUAAIB/AACAfwAAgH83hQJFN40CRTe9AkU3xQJFAACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwCoPkWasT5FmhE/RTMbP0UAAIB/AACAfzcbP0U3Iz9FN1M/RTdbP0UAAIB/AACAfwAAgH83BUFFNw1BRTc9QUU3RUFFAACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH+KqnNob3dsZWdlbmTDpm1hcmtlcoGlY29sb3KnI0VGNTUzQqV4YXhpc6F4oXnIB1AXAACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/pHR5cGWnc2NhdHRlcqRuYW1lokd5pXlheGlzoXmrbGVnZW5kZ3JvdXCiR3mtaG92ZXJ0ZW1wbGF0ZbwoJXt4Oi40Zn0gbXMsICV7eTouMmZ9IG1UL20poXjIB1AXAACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/iqpzaG93bGVnZW5kw6ZtYXJrZXKBpWNvbG9ypyMwMENDOTaleGF4aXOheKF5yAdQFwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAf6R0eXBlp3NjYXR0ZXKkbmFtZaJHeqV5YXhpc6F5q2xlZ2VuZGdyb3Vwokd6rWhvdmVydGVtcGxhdGW8KCV7eDouNGZ9IG1zLCAle3k6LjJmfSBtVC9tKaF4yAdQFwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8AAIB/AACAfwAAgH8A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gH8AAIB/O41JRTuNSUU7lUlFO5VJRQAAgH8AAIB/AACAfwAAgH8AAIB/jKpzaG93bGVnZW5kw6V4YXhpc6F4p3Zpc2libGWqbGVnZW5kb25seaRuYW1lqOKIoEIxX0FNpHRleHTIErAXAACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD+leWF4aXOheatsZWdlbmRncm91cKjiiKBCMV9BTaZtYXJrZXKBpWNvbG9ypyNGRkExNUGhecgSsBcAAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAAAA2w/JP9sPyT8AAAAAAACAfwAAgH8AAAAA2w9JQNsPSUAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAADbD0lA2w9JQAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAA2w9JQNsPSUAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAANsPSUDbD0lAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAADbD0lA2w9JQAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAA2w9JQNsPSUAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAANsPSUDbD0lAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAADbD0lA2w9JQAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAA2w9JQNsPSUAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAANsPSUDbD0lAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAADbD0lA2w9JQAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAA2w9JQNsPSUAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAANsPSUDbD0lAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAADbD0lA2w9JQAAAAAAAAIB/AACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAAADbD8k/2w/JPwAAAAAAAIB/AACAfwAAAADbD0lA2w9JQAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAANsPSUDbD0lAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAADbD0lA2w9JQAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAA2w9JQNsPSUAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAANsPSUDbD0lAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAADbD0lA2w9JQAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAA2w9JQNsPSUAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAANsPSUDbD0lAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAADbD0lA2w9JQAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAA2w9JQNsPSUAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAANsPSUDbD0lAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAADbD0lA2w9JQAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAA2w9JQNsPSUAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAANsPSUDbD0lAAAAAAAAAgH8AAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AAAAANsPyT/bD8k/AAAAAAAAgH8AAIB/AAAAANsPSUDbD0lAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAA2w9JQNsPSUAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAANsPSUDbD0lAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAADbD0lA2w9JQAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAA2w9JQNsPSUAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAANsPSUDbD0lAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAADbD0lA2w9JQAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAA2w9JQNsPSUAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAANsPSUDbD0lAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAADbD0lA2w9JQAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAA2w9JQNsPSUAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAANsPSUDbD0lAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAADbD0lA2w9JQAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAA2w9JQNsPSUAAAAAAAACAfwAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAAAA2w/JP9sPyT8AAAAAAACAfwAAgH8AAAAA2w9JQNsPSUAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAADbD0lA2w9JQAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAA2w9JQNsP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7UdFAACAfwAAgH8AAIB/AACAfwg6SEUIOkhFCEJIRQhCSEUAAIB/AACAfwAAgH8AAIB/1Y5IRdWOSEXVlkhF1ZZIRQAAgH8AAIB/AACAfwAAgH+i40hFouNIRaLrSEWi60hFAACAfwAAgH8AAIB/AACAf284SUVvOElFb0BJRW9ASUUAAIB/AACAfwAAgH8AAIB/O41JRTuNSUU7lUlFO5VJRQAAgH8AAIB/AACAfwAAgH8AAIB/japzaG93bGVnZW5kw6V4YXhpc6F4p3Zpc2libGWqbGVnZW5kb25seaRuYW1lpUIxX0ZNpHRleHTIDtAXAACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/pXlheGlzoXmrbGVnZW5kZ3JvdXClQjFfRk2mbWFya2VygaVjb2xvcqcjQUI2M0ZBpGxpbmWBpGRhc2ijZG90oXnIDtAXAAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAvg+jvb4Po70AAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAvg+jvb4Po70AAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAvg+jvb4Po70AAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAvg+jvb4Po70AAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAAAAAAAAAAgH8AAIB/AACAfwAAgH8AAAAAAAAAAAAAAAAAAAAAAACAfwAAgH8AAIB/AACAfwAAAAAAAAAAAAAAAAAAAAAAAIB/AACAfwAAgH8AAIB/AAAAAAAAAAAAAAAA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RW9ASUUAAIB/AACAfwAAgH8AAIB/O41JRTuNSUU7lUlFO5VJRQAAgH8AAIB/AACAfwAAgH8AAIB/i6pzaG93bGVnZW5kw6Rtb2Rlp21hcmtlcnOleGF4aXOheKRuYW1lo0FEQ6V5YXhpc6F5q2xlZ2VuZGdyb3Vwo0FEQ6ZtYXJrZXKBpWNvbG9ypyMxOUQzRjOhecgQoBcAAIB/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIB/AACAfwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAfwAAgH8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgH8AAIB/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIB/AACAfwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAfwAAgH8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgH8AAIB/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIB/AACAfwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgH8AAIB/AACAPwAAgH8AAIB/AACAfwAAgH8AAIA/AACAfwAAgH8AAIB/AACAfwAAgD8AAIB/AACAfwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAf6R0eXBlp3NjYXR0ZXKtaG92ZXJ0ZW1wbGF0ZbUoJXt4Oi40Zn0gbXMsICV7eTppfSmheMgQoBcAAIB/AAAAP1Fe4z9RXkNAvYaKQFFes0DlNdxAvYYCQYfyFkFR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b3KieDGodGVtcGxhdGWCpmxheW91dN4AE6ljb2xvcmF4aXOBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACleGF4aXOHqWdyaWRjb2xvcqV3aGl0Za16ZXJvbGluZXdpZHRoykAAAACldGl0bGWBqHN0YW5kb2ZmykFwAACldGlja3OgrXplcm9saW5lY29sb3Kld2hpdGWqYXV0b21hcmdpbsOpbGluZWNvbG9ypXdoaXRlqWhvdmVybW9kZadjbG9zZXN0rXBhcGVyX2JnY29sb3Kld2hpdGWjZ2VvhqlzaG93bGFrZXPDqHNob3dsYW5kw6lsYW5kY29sb3KnI0U1RUNGNqdiZ2NvbG9ypXdoaXRlrHN1YnVuaXRjb2xvcqV3aGl0ZalsYWtlY29sb3Kld2hpdGWqY29sb3JzY2FsZYOqc2VxdWVudGlhbJqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMalkaXZlcmdpbmebksoAAAAApyM4ZTAxNTKSyj3MzM2nI2M1MWI3ZJLKPkzMzacjZGU3N2Flkso+mZmapyNmMWI2ZGGSyj7MzM2nI2ZkZTBlZpLKPwAAAKcjZjdmN2Y3kso/GZmapyNlNmY1ZDCSyj8zMzOnI2I4ZTE4NpLKP0zMzacjN2ZiYzQxkso/ZmZmpyM0ZDkyMjGSyj+AAACnIzI3NjQxOa9zZXF1ZW50aWFsbWludXOaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGleWF4aXOHqWdyaWRjb2xvcqV3aGl0Za16ZXJvbGluZXdpZHRoykAAAACldGl0bGWBqHN0YW5kb2ZmykFwAACldGlja3OgrXplcm9saW5lY29sb3Kld2hpdGWqYXV0b21hcmdpbsOpbGluZWNvbG9ypXdoaXRlrXNoYXBlZGVmYXVsdHOBpGxpbmWBpWNvbG9ypyMyYTNmNWaqaG92ZXJsYWJlbIGlYWxpZ26kbGVmdKZtYXBib3iBpXN0eWxlpWxpZ2h0pXBvbGFyg6thbmd1bGFyYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWnYmdjb2xvcqcjRTVFQ0Y2qnJhZGlhbGF4aXODqWdyaWRjb2xvcqV3aGl0ZaV0aWNrc6CpbGluZWNvbG9ypXdoaXRlr2F1dG90eXBlbnVtYmVyc6ZzdHJpY3SkZm9udIGlY29sb3KnIzJhM2Y1Zqd0ZXJuYXJ5hKVhYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWnYmdjb2xvcqcjRTVFQ0Y2pWNheGlzg6lncmlkY29sb3Kld2hpdGWldGlja3OgqWxpbmVjb2xvcqV3aGl0ZaViYXhpc4OpZ3JpZGNvbG9ypXdoaXRlpXRpY2tzoKlsaW5lY29sb3Kld2hpdGWyYW5ub3RhdGlvbmRlZmF1bHRzg6lhcnJvd2hlYWTKAAAAAKphcnJvd3dpZHRoyj+AAACqYXJyb3djb2xvcqcjMmEzZjVmrHBsb3RfYmdjb2xvcqcjRTVFQ0Y2pXRpdGxlgaF4yj1MzM2lc2NlbmWDpXhheGlzh6lncmlkY29sb3Kld2hpdGWpZ3JpZHdpZHRoykAAAACvYmFja2dyb3VuZGNvbG9ypyNFNUVDRjaldGlja3OgrnNob3diYWNrZ3JvdW5kw616ZXJvbGluZWNvbG9ypXdoaXRlqWxpbmVjb2xvcqV3aGl0ZaV6YXhpc4epZ3JpZGNvbG9ypXdoaXRlqWdyaWR3aWR0aMpAAAAAr2JhY2tncm91bmRjb2xvcqcjRTVFQ0Y2pXRpY2tzoK5zaG93YmFja2dyb3VuZMOtemVyb2xpbmVjb2xvcqV3aGl0ZalsaW5lY29sb3Kld2hpdGWleWF4aXOHqWdyaWRjb2xvcqV3aGl0Zalncmlkd2lkdGjKQAAAAK9iYWNrZ3JvdW5kY29sb3KnI0U1RUNGNqV0aWNrc6Cuc2hvd2JhY2tncm91bmTDrXplcm9saW5lY29sb3Kld2hpdGWpbGluZWNvbG9ypXdoaXRlqGNvbG9yd2F5mqcjNjM2ZWZhpyNFRjU1M0KnIzAwY2M5NqcjYWI2M2ZhpyNGRkExNUGnIzE5ZDNmM6cjRkY2NjkypyNCNkU4ODCnI0ZGOTdGRqcjRkVDQjUypGRhdGHeABmuc2NhdHRlcnBvbGFyZ2yRgqR0eXBlrnNjYXR0ZXJwb2xhcmdspm1hcmtlcoGoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKZjYXJwZXSRg6ViYXhpc4WpZ3JpZGNvbG9ypXdoaXRlrGVuZGxpbmVjb2xvcqcjMmEzZjVmrm1pbm9yZ3JpZGNvbG9ypXdoaXRlrnN0YXJ0bGluZWNvbG9ypyMyYTNmNWapbGluZWNvbG9ypXdoaXRlpHR5cGWmY2FycGV0pWFheGlzhalncmlkY29sb3Kld2hpdGWsZW5kbGluZWNvbG9ypyMyYTNmNWaubWlub3JncmlkY29sb3Kld2hpdGWuc3RhcnRsaW5lY29sb3KnIzJhM2Y1ZqlsaW5lY29sb3Kld2hpdGWsc2NhdHRlcnBvbGFykYKkdHlwZaxzY2F0dGVycG9sYXKmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqXBhcmNvb3Jkc5GCpGxpbmWBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZalwYXJjb29yZHOnc2NhdHRlcpGCpHR5cGWnc2NhdHRlcqZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACyaGlzdG9ncmFtMmRjb250b3VykYOoY29sb3JiYXKCpXRpY2tzoKxvdXRsaW5ld2lkdGjKAAAAAKR0eXBlsmhpc3RvZ3JhbTJkY29udG91cqpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxp2NvbnRvdXKRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnY29udG91cqpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrXNjYXR0ZXJjYXJwZXSRgqR0eXBlrXNjYXR0ZXJjYXJwZXSmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApm1lc2gzZJGCqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZaZtZXNoM2Snc3VyZmFjZZGDqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZadzdXJmYWNlqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGtc2NhdHRlcm1hcGJveJGCpHR5cGWtc2NhdHRlcm1hcGJveKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACqc2NhdHRlcmdlb5GCpHR5cGWqc2NhdHRlcmdlb6ZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACpaGlzdG9ncmFtkYKkdHlwZaloaXN0b2dyYW2mbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAo3BpZZGCpHR5cGWjcGllqmF1dG9tYXJnaW7DqmNob3JvcGxldGiRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWqY2hvcm9wbGV0aKloZWF0bWFwZ2yRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWpaGVhdG1hcGdsqmNvbG9yc2NhbGWaksoAAAAApyMwZDA4ODeSyj3jjjmnIzQ2MDM5ZpLKPmOOOacjNzIwMWE4kso+qqqrpyM5YzE3OWWSyj7jjjmnI2JkMzc4NpLKPw445KcjZDg1NzZikso/KqqrpyNlZDc5NTOSyj9HHHKnI2ZiOWYzYZLKP2OOOacjZmRjYTI2kso/gAAApyNmMGY5MjGjYmFykYSkdHlwZaNiYXKnZXJyb3JfeYGlY29sb3KnIzJhM2Y1ZqdlcnJvcl94gaVjb2xvcqcjMmEzZjVmpm1hcmtlcoGkbGluZYKlY29sb3KnI0U1RUNGNqV3aWR0aMo/AAAAp2hlYXRtYXCRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWnaGVhdG1hcKpjb2xvcnNjYWxlmpLKAAAAAKcjMGQwODg3kso94445pyM0NjAzOWaSyj5jjjmnIzcyMDFhOJLKPqqqq6cjOWMxNzllkso+4445pyNiZDM3ODaSyj8OOOSnI2Q4NTc2YpLKPyqqq6cjZWQ3OTUzkso/RxxypyNmYjlmM2GSyj9jjjmnI2ZkY2EyNpLKP4AAAKcjZjBmOTIxrWNvbnRvdXJjYXJwZXSRgqhjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWtY29udG91cmNhcnBldKV0YWJsZZGDpHR5cGWldGFibGWmaGVhZGVygqRsaW5lgaVjb2xvcqV3aGl0ZaRmaWxsgaVjb2xvcqcjQzhENEUzpWNlbGxzgqRsaW5lgaVjb2xvcqV3aGl0ZaRmaWxsgaVjb2xvcqcjRUJGMEY4qXNjYXR0ZXIzZJGDpGxpbmWBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACkdHlwZalzY2F0dGVyM2SmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAAqGJhcnBvbGFykYKkdHlwZahiYXJwb2xhcqZtYXJrZXKBpGxpbmWCpWNvbG9ypyNFNUVDRjald2lkdGjKPwAAAKlzY2F0dGVyZ2yRgqR0eXBlqXNjYXR0ZXJnbKZtYXJrZXKBqGNvbG9yYmFygqV0aWNrc6Csb3V0bGluZXdpZHRoygAAAACraGlzdG9ncmFtMmSRg6hjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApHR5cGWraGlzdG9ncmFtMmSqY29sb3JzY2FsZZqSygAAAACnIzBkMDg4N5LKPeOOOacjNDYwMzlmkso+Y445pyM3MjAxYTiSyj6qqqunIzljMTc5ZZLKPuOOOacjYmQzNzg2kso/DjjkpyNkODU3NmKSyj8qqqunI2VkNzk1M5LKP0cccqcjZmI5ZjNhkso/Y445pyNmZGNhMjaSyj+AAACnI2YwZjkyMa5zY2F0dGVydGVybmFyeZGCpHR5cGWuc2NhdHRlcnRlcm5hcnmmbWFya2Vygahjb2xvcmJhcoKldGlja3OgrG91dGxpbmV3aWR0aMoAAAAApnhheGlzMoaodGlja3ZhbHPHDBcAAEC/AAAAAAAAQD+odGlja21vZGWlYXJyYXmldGl0bGWBpHRleHSmeCBbbW1dpmRvbWFpbtcXzcwMPwAAgD+lcmFuZ2XXFwAAwL8AAMA/pmFuY2hvcqJ5MqZtYXJnaW6EoWzKQkgAAKFiykJIAAChcspCSAAAoXTKQnAAAKZ5YXhpczKGqHRpY2t2YWxzxwwXAABoQgCAg0MAALpCqHRpY2ttb2RlpWFycmF5pXRpdGxlgaR0ZXh0p1QyIFttc12mZG9tYWlu1xcAAAAAAACAP6VyYW5nZdcXAAAAAAAAlkOmYW5jaG9yongyq2Fubm90YXRpb25zkomneWFuY2hvcqZib3R0b22neGFuY2hvcqZjZW50ZXKheco/gAAApGZvbnSBpHNpemXKQYAAAKlzaG93YXJyb3fCpHlyZWalcGFwZXKkdGV4dLRUMSBtYXAgb2YgMUQgUGhhbnRvbaR4cmVmpXBhcGVyoXjKPmZmZomneWFuY2hvcqZib3R0b22neGFuY2hvcqZjZW50ZXKheco/gAAApGZvbnSBpHNpemXKQYAAAKlzaG93YXJyb3fCpHlyZWalcGFwZXKkdGV4dLRUMiBtYXAgb2YgMUQgUGhhbnRvbaR4cmVmpXBhcGVyoXjKP0ZmZqZjb25maWeFqHNob3dMaW5rwqhlZGl0YWJsZcKqcmVzcG9uc2l2ZcOqc3RhdGljUGxvdMKqc2Nyb2xsWm9vbcOmZnJhbWVzkKRkYXRhkoiqc2hvd2xlZ2VuZMKkbW9kZadtYXJrZXJzpXhheGlzongxoXjIDIAXAABA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QC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQ6R0eXBlp3NjYXR0ZXKleWF4aXOieTGmbWFya2VyhqVjb2xvcsgMgBcAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAL0QAQC9EAEAvRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAECMRABAjEQAQIxEAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAADdDAAA3QwAAN0MAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQwAAAkMAAAJDAAACQ6hjb2xvcmJhcoKldGl0bGWiVDGqdGlja3N1ZmZpeKJtc6RjbWluygAAAACqY29sb3JzY2FsZZSSygAAAAClYmxhY2uSyj4nBBulZ3JlZW6Syj8f8WakYmx1ZZLKP4AAAKNyZWSkY21heMpEjEAAqXNob3dzY2FsZcKIqnNob3dsZWdlbmTCpG1vZGWnbWFya2Vyc6V4YXhpc6J4MqF4yAyAFwAAQL8DEj6/BSQ8vwg2Or8KSDi/DVo2vw9sNL8SfjK/FZAwvxeiLr8atCy/HMYqvx/YKL8h6ia/JPwkvycOI78pICG/LDIfvy5EHb8xVhu/M2gZvzZ6F785jBW/O54T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AGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukKkdHlwZadzY2F0dGVypXlheGlzonkypm1hcmtlcoalY29sb3LIDIAXAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAAGhCAABoQgAAaEIAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwCAg0MAgINDAICDQwAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukIAALpCAAC6QgAAukKoY29sb3JiYXKCpXRpdGxlolQyqnRpY2tzdWZmaXiibXOkY21pbsoAAAAAqmNvbG9yc2NhbGWUksoAAAAApWJsYWNrkso+YdM5pGJsdWWSyj61DKelZ3JlZW6Syj+AAACjcmVkpGNtYXjKQ4OAAKlzaG93c2NhbGXCpW5icGtniq9pbnN0YWxsX3RpbWVfbnPPAAAAJolcEFqsaW5zdGFudGlhdGVkw7JpbnN0YWxsZWRfdmVyc2lvbnOHo1BrZ6ZzdGRsaWKvUHJvZ3Jlc3NMb2dnaW5npTAuMS40rEtvbWFNUklQbG90c6UwLjguM6dQbHV0b1VJpjAuNy41OapTdXBwcmVzc29ypTAuMi43q1BsdXRvUGxvdGx5pTAuNC42q0tvbWFNUklDb3JlpTAuOC4zsHRlcm1pbmFsX291dHB1dHOIo1BrZ9oc5wobWzBtG1sxbUluc3RhbnRpYXRpbmcuLi4bWzIybQobWzkwbT09PRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gUGxvdGx5S2FsZWlkbyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjIuMi40CiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQWNjZXNzb3JzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xLjM2ICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIE1SSUJhc2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjQuMyAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgT2Zmc2V0QXJyYXlzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4xNC4wICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIElubGluZVN0cmluZ3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjQuMQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIExMVk1Mb29wSW5mbyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMC4wICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBTdGF0aWNBcnJheXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjkuNQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIENvbmN1cnJlbnRVdGlsaXRpZXMg4pSA4pSA4pSA4pSAIHYyLjQuMSAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQkZsb2F0MTZzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC41LjAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIFByb2dyZXNzTWV0ZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjEwLjAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTlZUWF9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYzLjEuMCsyCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgSW52ZXJ0ZWRJbmRpY2VzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4zLjAgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBEYXRhRnJhbWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS42LjEKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBHUFVBcnJheXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxMC4yLjAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENVREFfUnVudGltZV9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjE0LjArMQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFBsdXRvVUkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjcuNTkKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBSYW5kb21OdW1iZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS41LjMKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBJbnRlbE9wZW5NUF9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYyMDI0LjEuMCswICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEh3bG9jX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjIuMTAuMCswCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQ1VEQV9Ecml2ZXJfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC45LjArMCAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBUcmlja3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjEuOAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEZ1bmN0b3JzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC40LjExChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTExWTSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjcuMi4xChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gU2VudGluZWxBcnJheXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjQuMwobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENVREFfUnVudGltZV9EaXNjb3Zlcnkg4pSAIHYwLjMuNAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIFVuc2FmZUF0b21pY3NMTFZNIOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xLjQgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBCdWZmZXJlZFN0cmVhbXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjIuMQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEJhbmdCYW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC40LjIKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBUcmFuc2NvZGluZ1N0cmVhbXMg4pSA4pSA4pSA4pSA4pSAIHYwLjEwLjkKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBDb2xvclNjaGVtZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYzLjI1LjAKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBTaW1wbGVCdWZmZXJTdHJlYW0g4pSA4pSA4pSA4pSA4pSAIHYxLjEuMCAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIE1QSUNIX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjQuMi4xKzEgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQ29kZWNabGliIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC43LjQgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBDb21wYXQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHY0LjE1LjAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBSYW5kb20xMjMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjcuMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIE11c3RhY2hlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4wLjE5CiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgUHJldHR5VGFibGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2Mi4zLjIgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBQbG90bHlKUyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMTguMTMKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBQb29sZWRBcnJheXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjQuMwobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEtvbWFNUklDb3JlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC44LjMKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBPcGVuTVBJX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjUuMC4zKzAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTUtMX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjIwMjQuMS4wKzAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBKTExXcmFwcGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNS4wCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQ29uc3RydWN0aW9uQmFzZSDilIDilIDilIDilIDilIDilIDilIAgdjEuNS41ICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gRkZUV19qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYzLjMuMTArMAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIExMVk1FeHRyYV9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjAuMjkrMCAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIE5WVFgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjMuNAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEtlcm5lbEFic3RyYWN0aW9ucyDilIDilIDilIDilIDilIAgdjAuOS4yMQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEludmVyc2VGdW5jdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjEuMTQgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENoYWluUnVsZXNDb3JlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4yNC4wChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gS29tYU1SSUJhc2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjguNAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENyYXlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHY0LjEuMQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEdQVUFycmF5c0NvcmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjEuNiAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIE9wZW5TU0xfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2My4wLjE0KzAKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBMTFZNT3Blbk1QX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjE1LjAuNyswICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gU3VwcHJlc3NvciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMi43ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gVGFibGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4xMS4xChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gSnVsaWFOVlRYQ2FsbGJhY2tzX2psbCDilIAgdjAuMi4xKzAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBHUFVDb21waWxlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMjYuNQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIE1QSXRyYW1wb2xpbmVfamxsIOKUgOKUgOKUgOKUgOKUgOKUgCB2NS40LjArMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFBsdXRvUGxvdGx5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC40LjYKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBTdHJpbmdNYW5pcHVsYXRpb24g4pSA4pSA4pSA4pSA4pSAIHYwLjMuNAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEtvbWFNUklQbG90cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuOC4zICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ1VEQSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjUuNC4yCiAgICAgICAgICAgICBCdWlsZGluZyAgICAgICAgICAgUGxvdGx5SlMg4oaSIGB+Ly5qdWxpYS9zY3JhdGNoc3BhY2VzLzQ0Y2ZlOTVhLTFlYjItNTJlYS1iNjcyLWUyYWZkZjY5Yjc4Zi9lNjJkODg2ZDMzYjgxYzM3MWM5ZDRlMmY3MDY2M2MwNjM3ZjE5NDU5L2J1aWxkLmxvZ2AKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgChtbMG0bWzFtUmVzb2x2aW5nLi4uG1syMm0KG1s5MG09PT0bWzM5bQobWzMybRtbMW0gIE5vIENoYW5nZXMbWzIybRtbMzltIHRvIGAvdG1wL2psX1A0Zk92ZS9Qcm9qZWN0LnRvbWxgChtbMzJtG1sxbSAgICBVcGRhdGluZxtbMjJtG1szOW0gYC90bXAvamxfUDRmT3ZlL01hbmlmZXN0LnRvbWxgCiAgG1s5MG1bOGU4NTBiOTBdIBtbMzltG1s5M23ihpEgbGliYmxhc3RyYW1wb2xpbmVfamxsIHY1LjguMCsxIOKHkiB2NS4xMS4wKzAbWzM5bQoKG1swbRtbMW1QcmVjb21waWxpbmcuLi4bWzIybQobWzkwbT09PRtbMzltChtbMzJtG1sxbSAgQWN0aXZhdGluZxtbMjJtG1szOW0gcHJvamVjdCBhdCBgL3RtcC9qbF9QNGZPdmVgChtbMzJtG1sxbVByZWNvbXBpbGluZxtbMjJtG1szOW0gcHJvamVjdC4uLgogIDExMCBkZXBlbmRlbmNpZXMgc3VjY2Vzc2Z1bGx5IHByZWNvbXBpbGVkIGluIDE1MiBzZWNvbmRzLiA3NCBhbHJlYWR5IHByZWNvbXBpbGVkLgogIBtbMzNtMhtbMzltIGRlcGVuZGVuY2llcyBoYWQgb3V0cHV0IGR1cmluZyBwcmVjb21waWxhdGlvbjobWzMzbQrilIwgG1szOW1NS0xfamxsG1szM20K4pSCICAbWzM5bURvd25sb2FkaW5nIGFydGlmYWN0OiBNS0wbWzMzbQrilJQgIBtbMzltG1szM20K4pSMIBtbMzltQ1VEQV9Ecml2ZXJfamxsG1szM20K4pSCICAbWzM5bURvd25sb2FkaW5nIGFydGlmYWN0OiBDVURBX0RyaXZlchtbMzNtCuKUlCAgG1szOW2qbmJwa2dfc3luY9oc5wobWzBtG1sxbUluc3RhbnRpYXRpbmcuLi4bWzIybQobWzkwbT09PRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gUGxvdGx5S2FsZWlkbyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjIuMi40CiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQWNjZXNzb3JzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xLjM2ICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIE1SSUJhc2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjQuMyAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgT2Zmc2V0QXJyYXlzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4xNC4wICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIElubGluZVN0cmluZ3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjQuMQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIExMVk1Mb29wSW5mbyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMC4wICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBTdGF0aWNBcnJheXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjkuNQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIENvbmN1cnJlbnRVdGlsaXRpZXMg4pSA4pSA4pSA4pSAIHYyLjQuMSAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQkZsb2F0MTZzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC41LjAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIFByb2dyZXNzTWV0ZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjEwLjAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTlZUWF9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYzLjEuMCsyCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgSW52ZXJ0ZWRJbmRpY2VzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4zLjAgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBEYXRhRnJhbWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS42LjEKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBHUFVBcnJheXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxMC4yLjAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENVREFfUnVudGltZV9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjE0LjArMQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFBsdXRvVUkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjcuNTkKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBSYW5kb21OdW1iZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS41LjMKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBJbnRlbE9wZW5NUF9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYyMDI0LjEuMCswICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEh3bG9jX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjIuMTAuMCswCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQ1VEQV9Ecml2ZXJfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC45LjArMCAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBUcmlja3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjEuOAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEZ1bmN0b3JzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC40LjExChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTExWTSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjcuMi4xChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gU2VudGluZWxBcnJheXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjQuMwobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENVREFfUnVudGltZV9EaXNjb3Zlcnkg4pSAIHYwLjMuNAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIFVuc2FmZUF0b21pY3NMTFZNIOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xLjQgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBCdWZmZXJlZFN0cmVhbXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjIuMQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEJhbmdCYW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC40LjIKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBUcmFuc2NvZGluZ1N0cmVhbXMg4pSA4pSA4pSA4pSA4pSAIHYwLjEwLjkKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBDb2xvclNjaGVtZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYzLjI1LjAKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBTaW1wbGVCdWZmZXJTdHJlYW0g4pSA4pSA4pSA4pSA4pSAIHYxLjEuMCAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIE1QSUNIX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjQuMi4xKzEgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQ29kZWNabGliIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC43LjQgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBDb21wYXQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHY0LjE1LjAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBSYW5kb20xMjMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjcuMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIE11c3RhY2hlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4wLjE5CiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgUHJldHR5VGFibGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2Mi4zLjIgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBQbG90bHlKUyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMTguMTMKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBQb29sZWRBcnJheXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjQuMwobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEtvbWFNUklDb3JlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC44LjMKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBPcGVuTVBJX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjUuMC4zKzAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTUtMX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjIwMjQuMS4wKzAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBKTExXcmFwcGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNS4wCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQ29uc3RydWN0aW9uQmFzZSDilIDilIDilIDilIDilIDilIDilIAgdjEuNS41ICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gRkZUV19qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYzLjMuMTArMAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIExMVk1FeHRyYV9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjAuMjkrMCAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIE5WVFgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjMuNAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEtlcm5lbEFic3RyYWN0aW9ucyDilIDilIDilIDilIDilIAgdjAuOS4yMQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEludmVyc2VGdW5jdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjEuMTQgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENoYWluUnVsZXNDb3JlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4yNC4wChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gS29tYU1SSUJhc2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjguNAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENyYXlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHY0LjEuMQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEdQVUFycmF5c0NvcmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjEuNiAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIE9wZW5TU0xfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2My4wLjE0KzAKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBMTFZNT3Blbk1QX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjE1LjAuNyswICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gU3VwcHJlc3NvciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMi43ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gVGFibGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4xMS4xChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gSnVsaWFOVlRYQ2FsbGJhY2tzX2psbCDilIAgdjAuMi4xKzAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBHUFVDb21waWxlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMjYuNQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIE1QSXRyYW1wb2xpbmVfamxsIOKUgOKUgOKUgOKUgOKUgOKUgCB2NS40LjArMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFBsdXRvUGxvdGx5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ICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gSW5saW5lU3RyaW5ncyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNC4xCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgTExWTUxvb3BJbmZvIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4wLjAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFN0YXRpY0FycmF5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuOS41CiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQ29uY3VycmVudFV0aWxpdGllcyDilIDilIDilIDilIAgdjIuNC4xICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBCRmxvYXQxNnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjUuMCAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgUHJvZ3Jlc3NNZXRlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMTAuMCAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBOVlRYX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjMuMS4wKzIKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBJbnZlcnRlZEluZGljZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjMuMCAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIERhdGFGcmFtZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjYuMQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEdQVUFycmF5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEwLjIuMCAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ1VEQV9SdW50aW1lX2psbCDilIDilIDilIDilIDilIDilIDilIAgdjAuMTQuMCsxChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gUGx1dG9VSSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNy41OQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFJhbmRvbU51bWJlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjUuMwogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEludGVsT3Blbk1QX2psbCDilIDilIDilIDilIDilIDilIDilIDilIAgdjIwMjQuMS4wKzAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gSHdsb2NfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2Mi4xMC4wKzAKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBDVURBX0RyaXZlcl9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjkuMCswICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFRyaWNrcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMS44ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gRnVuY3RvcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjQuMTEKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBMTFZNIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2Ny4yLjEKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBTZW50aW5lbEFycmF5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNC4zChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ1VEQV9SdW50aW1lX0Rpc2NvdmVyeSDilIAgdjAuMy40CiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgVW5zYWZlQXRvbWljc0xMVk0g4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjEuNCAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEJ1ZmZlcmVkU3RyZWFtcyDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMi4xChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQmFuZ0Jhbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjQuMgobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFRyYW5zY29kaW5nU3RyZWFtcyDilIDilIDilIDilIDilIAgdjAuMTAuOQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENvbG9yU2NoZW1lcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjMuMjUuMAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIFNpbXBsZUJ1ZmZlclN0cmVhbSDilIDilIDilIDilIDilIAgdjEuMS4wICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgTVBJQ0hfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2NC4yLjErMSAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBDb2RlY1psaWIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjcuNCAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENvbXBhdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjQuMTUuMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFJhbmRvbTEyMyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNy4wChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTXVzdGFjaGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjAuMTkKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBQcmV0dHlUYWJsZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYyLjMuMiAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFBsb3RseUpTIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xOC4xMwobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFBvb2xlZEFycmF5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNC4zChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gS29tYU1SSUNvcmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjguMwogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIE9wZW5NUElfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2NS4wLjMrMCAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBNS0xfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MjAyNC4xLjArMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEpMTFdyYXBwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS41LjAKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBDb25zdHJ1Y3Rpb25CYXNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS41LjUgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBGRlRXX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjMuMy4xMCswCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgTExWTUV4dHJhX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMC4yOSswICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTlZUWCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMy40ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gS2VybmVsQWJzdHJhY3Rpb25zIOKUgOKUgOKUgOKUgOKUgCB2MC45LjIxCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgSW52ZXJzZUZ1bmN0aW9ucyDilIDilIDilIDilIDilIDilIDilIAgdjAuMS4xNCAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ2hhaW5SdWxlc0NvcmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjI0LjAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBLb21hTVJJQmFzZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuOC40ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ3JheW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjQuMS4xCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgR1BVQXJyYXlzQ29yZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMS42ICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gT3BlblNTTF9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYzLjAuMTQrMAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIExMVk1PcGVuTVBfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MTUuMC43KzAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBTdXBwcmVzc29yIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4yLjcKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBUYWJsZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjExLjEKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBKdWxpYU5WVFhDYWxsYmFja3NfamxsIOKUgCB2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ZCAgICAgICAgICAgTVJJQmFzZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNC4zICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBPZmZzZXRBcnJheXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjE0LjAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gSW5saW5lU3RyaW5ncyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNC4xCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgTExWTUxvb3BJbmZvIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4wLjAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFN0YXRpY0FycmF5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuOS41CiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQ29uY3VycmVudFV0aWxpdGllcyDilIDilIDilIDilIAgdjIuNC4xICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBCRmxvYXQxNnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjUuMCAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgUHJvZ3Jlc3NNZXRlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMTAuMCAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBOVlRYX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjMuMS4wKzIKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBJbnZlcnRlZEluZGljZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjMuMCAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIERhdGFGcmFtZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjYuMQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEdQVUFycmF5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEwLjIuMCAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ1VEQV9SdW50aW1lX2psbCDilIDilIDilIDilIDilIDilIDilIAgdjAuMTQuMCsxChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gUGx1dG9VSSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNy41OQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFJhbmRvbU51bWJlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjUuMwogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEludGVsT3Blbk1QX2psbCDilIDilIDilIDilIDilIDilIDilIDilIAgdjIwMjQuMS4wKzAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gSHdsb2NfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2Mi4xMC4wKzAKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBDVURBX0RyaXZlcl9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjkuMCswICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFRyaWNrcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMS44ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gRnVuY3RvcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjQuMTEKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBMTFZNIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2Ny4yLjEKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBTZW50aW5lbEFycmF5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNC4zChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ1VEQV9SdW50aW1lX0Rpc2NvdmVyeSDilIAgdjAuMy40CiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgVW5zYWZlQXRvbWljc0xMVk0g4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjEuNCAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEJ1ZmZlcmVkU3RyZWFtcyDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMi4xChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQmFuZ0Jhbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjQuMgobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFRyYW5zY29kaW5nU3RyZWFtcyDilIDilIDilIDilIDilIAgdjAuMTAuOQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENvbG9yU2NoZW1lcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjMuMjUuMAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIFNpbXBsZUJ1ZmZlclN0cmVhbSDilIDilIDilIDilIDilIAgdjEuMS4wICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgTVBJQ0hfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2NC4yLjErMSAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBDb2RlY1psaWIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjcuNCAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENvbXBhdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjQuMTUuMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFJhbmRvbTEyMyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNy4wChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTXVzdGFjaGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjAuMTkKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBQcmV0dHlUYWJsZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYyLjMuMiAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFBsb3RseUpTIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xOC4xMwobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFBvb2xlZEFycmF5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNC4zChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gS29tYU1SSUNvcmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjguMwogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIE9wZW5NUElfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2NS4wLjMrMCAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBNS0xfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MjAyNC4xLjArMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEpMTFdyYXBwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS41LjAKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBDb25zdHJ1Y3Rpb25CYXNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS41LjUgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBGRlRXX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjMuMy4xMCswCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgTExWTUV4dHJhX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMC4yOSswICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTlZUWCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMy40ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gS2VybmVsQWJzdHJhY3Rpb25zIOKUgOKUgOKUgOKUgOKUgCB2MC45LjIxCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgSW52ZXJzZUZ1bmN0aW9ucyDilIDilIDilIDilIDilIDilIDilIAgdjAuMS4xNCAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ2hhaW5SdWxlc0NvcmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjI0LjAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBLb21hTVJJQmFzZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuOC40ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ3JheW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjQuMS4xCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgR1BVQXJyYXlzQ29yZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMS42ICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gT3BlblNTTF9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYzLjAuMTQrMAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIExMVk1PcGVuTVBfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MTUuMC43KzAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBTdXBwcmVzc29yIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4yLjcKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBUYWJsZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjExLjEKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBKdWxpYU5WVFhDYWxsYmFja3NfamxsIOKUgCB2MC4yLjErMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEdQVUNvbXBpbGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4yNi41ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTVBJdHJhbXBvbGluZV9qbGwg4pSA4pSA4pSA4pSA4pSA4pSAIHY1LjQuMCswChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gUGx1dG9QbG90bHkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjQuNgobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFN0cmluZ01hbmlwdWxhdGlvbiDilIDilIDilIDilIDilIAgdjAuMy40CiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgS29tYU1SSVBsb3RzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC44LjMgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBDVURBIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2NS40LjIKICAgICAgICAgICAgIEJ1aWxkaW5nICAgICAgICAgICBQbG90bHlKUyDihpIgYH4vLmp1bGlhL3NjcmF0Y2hzcGFjZXMvNDRjZmU5NWEtMWViMi01MmVhLWI2NzItZTJhZmRmNjliNzhmL2U2MmQ4ODZkMzNiODFjMzcxYzlkNGUyZjcwNjYzYzA2MzdmMTk0NTkvYnVpbGQubG9nYAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKG1swbRtbMW1SZXNvbHZpbmcuLi4bWzIybQobWzkwbT09PRtbMzltChtbMzJtG1sxbSAgTm8gQ2hhbmdlcxtbMjJtG1szOW0gdG8gYC90bXAvamxfUDRmT3ZlL1Byb2plY3QudG9tbGAKG1szMm0bWzFtICAgIFVwZGF0aW5nG1syMm0bWzM5bSBgL3RtcC9qbF9QNGZPdmUvTWFuaWZlc3QudG9tbGAKICAbWzkwbVs4ZTg1MGI5MF0gG1szOW0bWzkzbeKGkSBsaWJibGFzdHJhbXBvbGluZV9qbGwgdjUuOC4wKzEg4oeSIHY1LjExLjArMBtbMzltCgobWzBtG1sxbVByZWNvbXBpbGluZy4uLhtbMjJtChtbOTBtPT09G1szOW0KG1szMm0bWzFtICBBY3RpdmF0aW5nG1syMm0bWzM5bSBwcm9qZWN0IGF0IGAvdG1wL2psX1A0Zk92ZWAKG1szMm0bWzFtUHJlY29tcGlsaW5nG1syMm0bWzM5bSBwcm9qZWN0Li4uCiAgMTEwIGRlcGVuZGVuY2llcyBzdWNjZXNzZnVsbHkgcHJlY29tcGlsZWQgaW4gMTUyIHNlY29uZHMuIDc0IGFscmVhZHkgcHJlY29tcGlsZWQuCiAgG1szM20yG1szOW0gZGVwZW5kZW5jaWVzIGhhZCBvdXRwdXQgZHVyaW5nIHByZWNvbXBpbGF0aW9uOhtbMzNtCuKUjCAbWzM5bU1LTF9qbGwbWzMzbQrilIIgIBtbMzltRG93bmxvYWRpbmcgYXJ0aWZhY3Q6IE1LTBtbMzNtCuKUlCAgG1szOW0bWzMzbQrilIwgG1szOW1DVURBX0RyaXZlcl9qbGwbWzMzbQrilIIgIBtbMzltRG93bmxvYWRpbmcgYXJ0aWZhY3Q6IENVREFfRHJpdmVyG1szM20K4pSUICAbWzM5baxLb21hTVJJUGxvdHPaHOcKG1swbRtbMW1JbnN0YW50aWF0aW5nLi4uG1syMm0KG1s5MG09PT0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFBsb3RseUthbGVpZG8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYyLjIuNAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEFjY2Vzc29ycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMS4zNiAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBNUklCYXNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC40LjMgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIE9mZnNldEFycmF5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMTQuMCAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBJbmxpbmVTdHJpbmdzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS40LjEKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBMTFZNTG9vcEluZm8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjAuMCAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gU3RhdGljQXJyYXlzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS45LjUKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBDb25jdXJyZW50VXRpbGl0aWVzIOKUgOKUgOKUgOKUgCB2Mi40LjEgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEJGbG9hdDE2cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNS4wICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBQcm9ncmVzc01ldGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4xMC4wICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIE5WVFhfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2My4xLjArMgogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEludmVydGVkSW5kaWNlcyDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMy4wICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gRGF0YUZyYW1lcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNi4xCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgR1BVQXJyYXlzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MTAuMi4wICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBDVURBX1J1bnRpbWVfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xNC4wKzEKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBQbHV0b1VJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC43LjU5ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gUmFuZG9tTnVtYmVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNS4zCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgSW50ZWxPcGVuTVBfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MjAyNC4xLjArMCAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBId2xvY19qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYyLjEwLjArMAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIENVREFfRHJpdmVyX2psbCDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuOS4wKzAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gVHJpY2tzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xLjgKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBGdW5jdG9ycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNC4xMQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIExMVk0g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHY3LjIuMQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFNlbnRpbmVsQXJyYXlzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS40LjMKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBDVURBX1J1bnRpbWVfRGlzY292ZXJ5IOKUgCB2MC4zLjQKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBVbnNhZmVBdG9taWNzTExWTSDilIDilIDilIDilIDilIDilIAgdjAuMS40ICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQnVmZmVyZWRTdHJlYW1zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4yLjEKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBCYW5nQmFuZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNC4yChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gVHJhbnNjb2RpbmdTdHJlYW1zIOKUgOKUgOKUgOKUgOKUgCB2MC4xMC45ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ29sb3JTY2hlbWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2My4yNS4wCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgU2ltcGxlQnVmZmVyU3RyZWFtIOKUgOKUgOKUgOKUgOKUgCB2MS4xLjAgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBNUElDSF9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHY0LjIuMSsxICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIENvZGVjWmxpYiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNy40ICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ29tcGF0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2NC4xNS4wChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gUmFuZG9tMTIzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS43LjAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBNdXN0YWNoZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMC4xOQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIFByZXR0eVRhYmxlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjIuMy4yICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gUGxvdGx5SlMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjE4LjEzChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gUG9vbGVkQXJyYXlzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS40LjMKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBLb21hTVJJQ29yZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuOC4zCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgT3Blbk1QSV9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHY1LjAuMyswICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIE1LTF9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYyMDI0LjEuMCswChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gSkxMV3JhcHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjUuMAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIENvbnN0cnVjdGlvbkJhc2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjUuNSAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEZGVFdfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2My4zLjEwKzAKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBMTFZNRXh0cmFfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4wLjI5KzAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBOVlRYIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4zLjQKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBLZXJuZWxBYnN0cmFjdGlvbnMg4pSA4pSA4pSA4pSA4pSAIHYwLjkuMjEKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBJbnZlcnNlRnVuY3Rpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xLjE0ICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBDaGFpblJ1bGVzQ29yZSDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMjQuMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEtvbWFNUklCYXNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC44LjQKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBDcmF5b25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2NC4xLjEKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBHUFVBcnJheXNDb3JlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xLjYgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBPcGVuU1NMX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjMuMC4xNCswCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgTExWTU9wZW5NUF9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxNS4wLjcrMCAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFN1cHByZXNzb3Ig4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjIuNwobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFRhYmxlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMTEuMQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEp1bGlhTlZUWENhbGxiYWNrc19qbGwg4pSAIHYwLjIuMSswChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gR1BVQ29tcGlsZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjI2LjUKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBNUEl0cmFtcG9saW5lX2psbCDilIDilIDilIDilIDilIDilIAgdjUuNC4wKzAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBQbHV0b1Bsb3RseSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNC42ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gU3RyaW5nTWFuaXB1bGF0aW9uIOKUgOKUgOKUgOKUgOKUgCB2MC4zLjQKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBLb21hTVJJUGxvdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjguMyAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENVREEg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHY1LjQuMgogICAgICAgICAgICAgQnVpbGRpbmcgICAgICAgICAgIFBsb3RseUpTIOKGkiBgfi8uanVsaWEvc2NyYXRjaHNwYWNlcy80NGNmZTk1YS0xZWIyLTUyZWEtYjY3Mi1lMmFmZGY2OWI3OGYvZTYyZDg4NmQzM2I4MWMzNzFjOWQ0ZTJmNzA2NjNjMDYzN2YxOTQ1OS9idWlsZC5sb2dgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAobWzBtG1sxbVJlc29sdmluZy4uLhtbMjJtChtbOTBtPT09G1szOW0KG1szMm0bWzFtICBObyBDaGFuZ2VzG1syMm0bWzM5bSB0byBgL3RtcC9qbF9QNGZPdmUvUHJvamVjdC50b21sYAobWzMybRtbMW0gICAgVXBkYXRpbmcbWzIybRtbMzltIGAvdG1wL2psX1A0Zk92ZS9NYW5pZmVzdC50b21sYAogIBtbOTBtWzhlODUwYjkwXSAbWzM5bRtbOTNt4oaRIGxpYmJsYXN0cmFtcG9saW5lX2psbCB2NS44LjArMSDih5IgdjUuMTEuMCswG1szOW0KChtbMG0bWzFtUHJlY29tcGlsaW5nLi4uG1syMm0KG1s5MG09PT0bWzM5bQobWzMybRtbMW0gIEFjdGl2YXRpbmcbWzIybRtbMzltIHByb2plY3QgYXQgYC90bXAvamxfUDRmT3ZlYAobWzMybRtbMW1QcmVjb21waWxpbmcbWzIybRtbMzltIHByb2plY3QuLi4KICAxMTAgZGVwZW5kZW5jaWVzIHN1Y2Nlc3NmdWxseSBwcmVjb21waWxlZCBpbiAxNTIgc2Vjb25kcy4gNzQgYWxyZWFkeSBwcmVjb21waWxlZC4KICAbWzMzbTIbWzM5bSBkZXBlbmRlbmNpZXMgaGFkIG91dHB1dCBkdXJpbmcgcHJlY29tcGlsYXRpb246G1szM20K4pSMIBtbMzltTUtMX2psbBtbMzNtCuKUgiAgG1szOW1Eb3dubG9hZGluZyBhcnRpZmFjdDogTUtMG1szM20K4pSUICAbWzM5bRtbMzNtCuKUjCAbWzM5bUNVREFfRHJpdmVyX2psbBtbMzNtCuKUgiAgG1szOW1Eb3dubG9hZGluZyBhcnRpZmFjdDogQ1VEQV9Ecml2ZXIbWzMzbQrilJQgIBtbMzltqlN1cHByZXNzb3LaHOcKG1swbRtbMW1JbnN0YW50aWF0aW5nLi4uG1syMm0KG1s5MG09PT0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFBsb3RseUthbGVpZG8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYyLjIuNAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEFjY2Vzc29ycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMS4zNiAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBNUklCYXNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC40LjMgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIE9mZnNldEFycmF5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMTQuMCAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBJbmxpbmVTdHJpbmdzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS40LjEKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBMTFZNTG9vcEluZm8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjAuMCAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gU3RhdGljQXJyYXlzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS45LjUKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBDb25jdXJyZW50VXRpbGl0aWVzIOKUgOKUgOKUgOKUgCB2Mi40LjEgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEJGbG9hdDE2cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNS4wICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBQcm9ncmVzc01ldGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4xMC4wICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIE5WVFhfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2My4xLjArMgogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEludmVydGVkSW5kaWNlcyDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMy4wICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gRGF0YUZyYW1lcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNi4xCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgR1BVQXJyYXlzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MTAuMi4wICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBDVURBX1J1bnRpbWVfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xNC4wKzEKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBQbHV0b1VJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC43LjU5ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gUmFuZG9tTnVtYmVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNS4zCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgSW50ZWxPcGVuTVBfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MjAyNC4xLjArMCAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBId2xvY19qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYyLjEwLjArMAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIENVREFfRHJpdmVyX2psbCDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuOS4wKzAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gVHJpY2tzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xLjgKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBGdW5jdG9ycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNC4xMQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIExMVk0g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHY3LjIuMQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFNlbnRpbmVsQXJyYXlzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS40LjMKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBDVURBX1J1bnRpbWVfRGlzY292ZXJ5IOKUgCB2MC4zLjQKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBVbnNhZmVBdG9taWNzTExWTSDilIDilIDilIDilIDilIDilIAgdjAuMS40ICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQnVmZmVyZWRTdHJlYW1zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4yLjEKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBCYW5nQmFuZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNC4yChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gVHJhbnNjb2RpbmdTdHJlYW1zIOKUgOKUgOKUgOKUgOKUgCB2MC4xMC45ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ29sb3JTY2hlbWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2My4yNS4wCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgU2ltcGxlQnVmZmVyU3RyZWFtIOKUgOKUgOKUgOKUgOKUgCB2MS4xLjAgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBNUElDSF9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHY0LjIuMSsxICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIENvZGVjWmxpYiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNy40ICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ29tcGF0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2NC4xNS4wChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gUmFuZG9tMTIzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS43LjAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBNdXN0YWNoZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMC4xOQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIFByZXR0eVRhYmxlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjIuMy4yICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gUGxvdGx5SlMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjE4LjEzChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gUG9vbGVkQXJyYXlzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS40LjMKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBLb21hTVJJQ29yZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuOC4zCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgT3Blbk1QSV9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHY1LjAuMyswICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIE1LTF9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYyMDI0LjEuMCswChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gSkxMV3JhcHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjUuMAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIENvbnN0cnVjdGlvbkJhc2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjUuNSAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEZGVFdfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2My4zLjEwKzAKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBMTFZNRXh0cmFfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4wLjI5KzAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBOVlRYIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4zLjQKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBLZXJuZWxBYnN0cmFjdGlvbnMg4pSA4pSA4pSA4pSA4pSAIHYwLjkuMjEKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBJbnZlcnNlRnVuY3Rpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xLjE0ICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBDaGFpblJ1bGVzQ29yZSDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMjQuMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEtvbWFNUklCYXNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC44LjQKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBDcmF5b25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2NC4xLjEKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBHUFVBcnJheXNDb3JlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xLjYgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBPcGVuU1NMX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjMuMC4xNCswCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgTExWTU9wZW5NUF9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxNS4wLjcrMCAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFN1cHByZXNzb3Ig4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjIuNwobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFRhYmxlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMTEuMQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEp1bGlhTlZUWENhbGxiYWNrc19qbGwg4pSAIHYwLjIuMSswChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gR1BVQ29tcGlsZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjI2LjUKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBNUEl0cmFtcG9saW5lX2psbCDilIDilIDilIDilIDilIDilIAgdjUuNC4wKzAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBQbHV0b1Bsb3RseSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNC42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G1szOW0gSW5saW5lU3RyaW5ncyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNC4xCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgTExWTUxvb3BJbmZvIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4wLjAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFN0YXRpY0FycmF5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuOS41CiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQ29uY3VycmVudFV0aWxpdGllcyDilIDilIDilIDilIAgdjIuNC4xICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBCRmxvYXQxNnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjUuMCAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgUHJvZ3Jlc3NNZXRlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMTAuMCAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBOVlRYX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjMuMS4wKzIKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBJbnZlcnRlZEluZGljZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjMuMCAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIERhdGFGcmFtZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjYuMQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEdQVUFycmF5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEwLjIuMCAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ1VEQV9SdW50aW1lX2psbCDilIDilIDilIDilIDilIDilIDilIAgdjAuMTQuMCsxChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gUGx1dG9VSSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuNy41OQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFJhbmRvbU51bWJlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjUuMwogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEludGVsT3Blbk1QX2psbCDilIDilIDilIDilIDilIDilIDilIDilIAgdjIwMjQuMS4wKzAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gSHdsb2NfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2Mi4xMC4wKzAKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBDVURBX0RyaXZlcl9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjkuMCswICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFRyaWNrcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMS44ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gRnVuY3RvcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjQuMTEKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBMTFZNIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2Ny4yLjEKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBTZW50aW5lbEFycmF5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNC4zChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ1VEQV9SdW50aW1lX0Rpc2NvdmVyeSDilIAgdjAuMy40CiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgVW5zYWZlQXRvbWljc0xMVk0g4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjEuNCAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEJ1ZmZlcmVkU3RyZWFtcyDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMi4xChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQmFuZ0Jhbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjQuMgobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFRyYW5zY29kaW5nU3RyZWFtcyDilIDilIDilIDilIDilIAgdjAuMTAuOQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENvbG9yU2NoZW1lcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjMuMjUuMAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIFNpbXBsZUJ1ZmZlclN0cmVhbSDilIDilIDilIDilIDilIAgdjEuMS4wICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgTVBJQ0hfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2NC4yLjErMSAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBDb2RlY1psaWIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjcuNCAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENvbXBhdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjQuMTUuMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFJhbmRvbTEyMyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNy4wChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTXVzdGFjaGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjAuMTkKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBQcmV0dHlUYWJsZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYyLjMuMiAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFBsb3RseUpTIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xOC4xMwobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFBvb2xlZEFycmF5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNC4zChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gS29tYU1SSUNvcmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjguMwogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIE9wZW5NUElfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2NS4wLjMrMCAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBNS0xfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MjAyNC4xLjArMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEpMTFdyYXBwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS41LjAKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBDb25zdHJ1Y3Rpb25CYXNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS41LjUgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBGRlRXX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjMuMy4xMCswCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgTExWTUV4dHJhX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMC4yOSswICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTlZUWCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMy40ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gS2VybmVsQWJzdHJhY3Rpb25zIOKUgOKUgOKUgOKUgOKUgCB2MC45LjIxCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgSW52ZXJzZUZ1bmN0aW9ucyDilIDilIDilIDilIDilIDilIDilIAgdjAuMS4xNCAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ2hhaW5SdWxlc0NvcmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjI0LjAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBLb21hTVJJQmFzZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuOC40ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ3JheW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjQuMS4xCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgR1BVQXJyYXlzQ29yZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMS42ICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gT3BlblNTTF9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYzLjAuMTQrMAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIExMVk1PcGVuTVBfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MTUuMC43KzAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBTdXBwcmVzc29yIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4yLjcKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBUYWJsZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjExLjEKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBKdWxpYU5WVFhDYWxsYmFja3NfamxsIOKUgCB2MC4yLjErMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEdQVUNvbXBp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4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjQuMyAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgT2Zmc2V0QXJyYXlzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4xNC4wICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIElubGluZVN0cmluZ3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjQuMQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIExMVk1Mb29wSW5mbyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuMC4wICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBTdGF0aWNBcnJheXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjkuNQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIENvbmN1cnJlbnRVdGlsaXRpZXMg4pSA4pSA4pSA4pSAIHYyLjQuMSAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQkZsb2F0MTZzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC41LjAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIFByb2dyZXNzTWV0ZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjEwLjAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTlZUWF9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYzLjEuMCsyCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgSW52ZXJ0ZWRJbmRpY2VzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4zLjAgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBEYXRhRnJhbWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS42LjEKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBHUFVBcnJheXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxMC4yLjAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENVREFfUnVudGltZV9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjE0LjArMQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFBsdXRvVUkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjcuNTkKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBSYW5kb21OdW1iZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS41LjMKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBJbnRlbE9wZW5NUF9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYyMDI0LjEuMCswICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEh3bG9jX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjIuMTAuMCswCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQ1VEQV9Ecml2ZXJfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC45LjArMCAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBUcmlja3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjEuOAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEZ1bmN0b3JzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC40LjExChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTExWTSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjcuMi4xChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gU2VudGluZWxBcnJheXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjQuMwobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENVREFfUnVudGltZV9EaXNjb3Zlcnkg4pSAIHYwLjMuNAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIFVuc2FmZUF0b21pY3NMTFZNIOKUgOKUgOKUgOKUgOKUgOKUgCB2MC4xLjQgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBCdWZmZXJlZFN0cmVhbXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjIuMQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEJhbmdCYW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC40LjIKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBUcmFuc2NvZGluZ1N0cmVhbXMg4pSA4pSA4pSA4pSA4pSAIHYwLjEwLjkKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBDb2xvclNjaGVtZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYzLjI1LjAKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBTaW1wbGVCdWZmZXJTdHJlYW0g4pSA4pSA4pSA4pSA4pSAIHYxLjEuMCAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIE1QSUNIX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjQuMi4xKzEgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQ29kZWNabGliIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC43LjQgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBDb21wYXQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHY0LjE1LjAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBSYW5kb20xMjMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjcuMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIE11c3RhY2hlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4wLjE5CiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgUHJldHR5VGFibGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2Mi4zLjIgICAgICAgICAgICAgICAgIBtbMzJtG1sxbRtbMjJtG1szOW0KG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBQbG90bHlKUyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMTguMTMKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBQb29sZWRBcnJheXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYxLjQuMwobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEtvbWFNUklDb3JlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC44LjMKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBPcGVuTVBJX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjUuMC4zKzAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gTUtMX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjIwMjQuMS4wKzAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBKTExXcmFwcGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjEuNS4wCiAgICAgICAgICAgIEluc3RhbGxlZCAgICAgICAgICAgQ29uc3RydWN0aW9uQmFzZSDilIDilIDilIDilIDilIDilIDilIAgdjEuNS41ICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gRkZUV19qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYzLjMuMTArMAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIExMVk1FeHRyYV9qbGwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjAuMjkrMCAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIE5WVFgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjMuNAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIEtlcm5lbEFic3RyYWN0aW9ucyDilIDilIDilIDilIDilIAgdjAuOS4yMQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEludmVyc2VGdW5jdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjEuMTQgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENoYWluUnVsZXNDb3JlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4yNC4wChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gS29tYU1SSUJhc2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjguNAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIENyYXlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHY0LjEuMQogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEdQVUFycmF5c0NvcmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHYwLjEuNiAgICAgICAgICAgICAgICAgG1szMm0bWzFtG1syMm0bWzM5bQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIE9wZW5TU0xfamxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2My4wLjE0KzAKICAgICAgICAgICAgSW5zdGFsbGVkICAgICAgICAgICBMTFZNT3Blbk1QX2psbCDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjE1LjAuNyswICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gU3VwcHJlc3NvciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMi43ChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gVGFibGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MS4xMS4xChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gSnVsaWFOVlRYQ2FsbGJhY2tzX2psbCDilIAgdjAuMi4xKzAKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBHUFVDb21waWxlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuMjYuNQobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIE1QSXRyYW1wb2xpbmVfamxsIOKUgOKUgOKUgOKUgOKUgOKUgCB2NS40LjArMAobWzMybRtbMW0gICBJbnN0YWxsZWQbWzIybRtbMzltIFBsdXRvUGxvdGx5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCB2MC40LjYKG1szMm0bWzFtICAgSW5zdGFsbGVkG1syMm0bWzM5bSBTdHJpbmdNYW5pcHVsYXRpb24g4pSA4pSA4pSA4pSA4pSAIHYwLjMuNAogICAgICAgICAgICBJbnN0YWxsZWQgICAgICAgICAgIEtvbWFNUklQbG90cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjAuOC4zICAgICAgICAgICAgICAgICAbWzMybRtbMW0bWzIybRtbMzltChtbMzJtG1sxbSAgIEluc3RhbGxlZBtbMjJtG1szOW0gQ1VEQSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgdjUuNC4yCiAgICAgICAgICAgICBCdWlsZGluZyAgICAgICAgICAgUGxvdGx5SlMg4oaSIGB+Ly5qdWxpYS9zY3JhdGNoc3BhY2VzLzQ0Y2ZlOTVhLTFlYjItNTJlYS1iNjcyLWUyYWZkZjY5Yjc4Zi9lNjJkODg2ZDMzYjgxYzM3MWM5ZDRlMmY3MDY2M2MwNjM3ZjE5NDU5L2J1aWxkLmxvZ2AKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgChtbMG0bWzFtUmVzb2x2aW5nLi4uG1syMm0KG1s5MG09PT0bWzM5bQobWzMybRtbMW0gIE5vIENoYW5nZXMbWzIybRtbMzltIHRvIGAvdG1wL2psX1A0Zk92ZS9Qcm9qZWN0LnRvbWxgChtbMzJtG1sxbSAgICBVcGRhdGluZxtbMjJtG1szOW0gYC90bXAvamxfUDRmT3ZlL01hbmlmZXN0LnRvbWxgCiAgG1s5MG1bOGU4NTBiOTBdIBtbMzltG1s5M23ihpEgbGliYmxhc3RyYW1wb2xpbmVfamxsIHY1LjguMCsxIOKHkiB2NS4xMS4wKzAbWzM5bQoKG1swbRtbMW1QcmVjb21waWxpbmcuLi4bWzIybQobWzkwbT09PRtbMzltChtbMzJtG1sxbSAgQWN0aXZhdGluZxtbMjJtG1szOW0gcHJvamVjdCBhdCBgL3RtcC9qbF9QNGZPdmVgChtbMzJtG1sxbVByZWNvbXBpbGluZxtbMjJtG1szOW0gcHJvamVjdC4uLgogIDExMCBkZXBlbmRlbmNpZXMgc3VjY2Vzc2Z1bGx5IHByZWNvbXBpbGVkIGluIDE1MiBzZWNvbmRzLiA3NCBhbHJlYWR5IHByZWNvbXBpbGVkLgogIBtbMzNtMhtbMzltIGRlcGVuZGVuY2llcyBoYWQgb3V0cHV0IGR1cmluZyBwcmVjb21waWxhdGlvbjobWzMzbQrilIwgG1szOW1NS0xfamxsG1szM20K4pSCICAbWzM5bURvd25sb2FkaW5nIGFydGlmYWN0OiBNS0wbWzMzbQrilJQgIBtbMzltG1szM20K4pSMIBtbMzltQ1VEQV9Ecml2ZXJfamxsG1szM20K4pSCICAbWzM5bURvd25sb2FkaW5nIGFydGlmYWN0OiBDVURBX0RyaXZlchtbMzNtCuKUlCAgG1szOW2nZW5hYmxlZMO3cmVzdGFydF9yZWNvbW1lbmRlZF9tc2fAtHJlc3RhcnRfcmVxdWlyZWRfbXNnwK1idXN5X3BhY2thZ2VzkLZ3YWl0aW5nX2Zvcl9wZXJtaXNzaW9uwtksd2FpdGluZ19mb3JfcGVybWlzc2lvbl9idXRfcHJvYmFibHlfZGlzYWJsZWTCq2NlbGxfaW5wdXRz3gAk2SRkMDM3N2Y5YS02ODBkLTQ1MDEtOTBjYS05ZWEzYWI2ODFkYjSEp2NlbGxfaWTZJGQwMzc3ZjlhLTY4MGQtNDUwMS05MGNhLTllYTNhYjY4MWRiNKRjb2Rl2gIPbWQiIiIjIyAyLjIuIEZhdFNhdCBmbGlwIGFuZ2xlIG9wdGltaXphdGlvbgoKRm9yIHRoZSBzZWNvbmQgc2ltdWxhdGlvbiBleHBlcmltZW50LCB0aGUgZmF0IHNpZ25hbCB3YXMgbWluaW1pemVkIGJ5IHZhcnlpbmcgdGhlIEZhdFNhdCBmbGlwIGFuZ2xlIChiZXR3ZWVuIDIwIGFuZCAyNTAgZGVnKSB1c2luZyBzaXggaU5BViByZWFkb3V0cyAoaWRlbnRpZmllZCBleHBlcmltZW50YWxseSB0byByZXN1bHQgaW4gZ29vZCBmYXQgc3VwcHJlc3Npb24pLiBUbyBiZSByb2J1c3QgdG8gJEJfMCQgaW5ob21vZ2VuZWl0aWVzLCBtdWx0aXBsZSBzaW11bGF0aW9ucyB3aXRoIHRpc3N1ZSBmcmVxdWVuY3kgc2hpZnRzIChiZXR3ZWVuICQtMSQgYW5kICQxXCxcbWF0aHJte3BwbX0kLCB0d2ljZSBvZiB3aGF0IHdhcyByZXBvcnRlZCBieSBSZXN0aXZvIGV0IGFsLikgd2VyZSBwZXJmb3JtZWQsIGFuZCB0aGUgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBvYnRhaW5lZCBmYXQgc2lnbmFsIHdlcmUgY2FsY3VsYXRlZC4iIiKobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMPZJGZjNTg2NDBiLWM0NGMtNGMyNS1hNGZkLTVhMGUxN2Q3YmVjZISnY2VsbF9pZNkkZmM1ODY0MGItYzQ0Yy00YzI1LWE0ZmQtNWEwZTE3ZDdiZWNkpGNvZGW5bWQiIyAxLiBTaW11bGF0aW9uIHNldHVwIqhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw9kkN2I5YWUzODEtZDBmYy00ZDFkLWIxZWUtYWQzMWE2NDQ1ZmY2hKdjZWxsX2lk2SQ3YjlhZTM4MS1kMGZjLTRkMWQtYjFlZS1hZDMxYTY0NDVmZjakY29kZdoCS2JlZ2luCiAgICBGQXMgPSAyMDoxMDoxODAgCQkjIGZsaXAgYW5nbGUgW2RlZ10KCVJScyA9IDYwIC4vICg1NToxMDo4NSkgICMgUlIgW3NdCiAgICBtYWcxID0gemVyb3MoQ29tcGxleEY2NCwgaW1fc2VnbWVudHMsIE5pc28qNCwgbGVuZ3RoKEZBcyksIGxlbmd0aChSUnMpKQogICAgQHByb2dyZXNzIGZvciAobSwgUlIpID0gZW51bWVyYXRlKFJScyksIChuLCBpbV9mbGlwX2FuZ2xlKSA9IGVudW1lcmF0ZShGQXMpCgkJc2VxX3BhcmFtczEgPSBtZXJnZShzZXFfcGFyYW1zLCAoOyBpbV9mbGlwX2FuZ2xlLCBSUikpCgkJc2ltX3BhcmFtczEgPSBtZXJnZShzaW1fcGFyYW1zLCBEaWN0KCJzaW1fbWV0aG9kIj0+QmxvY2hEaWN0KCkpKQoJCXNlcTEgICAgICAgID0gQ01SQShzZXFfcGFyYW1zMS4uLikKCQlvYmoxICAgICAgICA9IGNhcmRpYWNfcGhhbnRvbSgwKQoJCW1hZ2F1eCA9IEBzdXBwcmVzcyBzaW11bGF0ZShvYmoxLCBzZXExLCBzeXM7IHNpbV9wYXJhbXM9c2ltX3BhcmFtczEpCgkJbWFnMVs6LCA6LCBuLCBtXSAuPSBtYWdhdXhbZW5kLWltX3NlZ21lbnRzKzE6ZW5kLCA6XSAjIExhc3QgaGVhcnRiZWF0CiAgICBlbmQKZW5kqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTC2SQ5MjE5NGZjYi01ODJhLTQ5Y2UtYWFkNy0yMGIwMTQ1ZDQwZDOEp2NlbGxfaWTZJDkyMTk0ZmNiLTU4MmEtNDljZS1hYWQ3LTIwYjAxNDVkNDBkM6Rjb2RltG1kIiMjIDEuMy4gU2VxdWVuY2UiqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTD2SRmNDk2NTVjYy00NjBlLTQ5ODEtOTJlYS1kZmQ2MTQ3MzA4YmaEp2NlbGxfaWTZJGY0OTY1NWNjLTQ2MGUtNDk4MS05MmVhLWRmZDYxNDczMDhiZqRjb2Rl2W9tZCJCbG9jaCBzaW11bGF0aW9ucyB3ZXJlIHBlcmZvcm1lZCB1c2luZyAqKktvbWFNUkkuamwqKiB0byBvcHRpbWl6ZSB0aGUgcHJvcG9zZWQgd2hvbGUtaGVhcnQgQ01SQSBwYXJhbWV0ZXJzLiKobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMPZJDNkN2U3ZDIwLWE3N2EtNDhiMy1hZDJlLTZiNjIxMjI3YmUxNoSnY2VsbF9pZNkkM2Q3ZTdkMjAtYTc3YS00OGIzLWFkMmUtNmI2MjEyMjdiZTE2pGNvZGXaA2VtZCIiIiMgUmVmZXJlbmNlcwogLSAqKkNhc3RpbGxvLVBhc3NpIEMqKiwgQ29yb25hZG8gUiwgVmFyZWxhLU1hdHRhdGFsbCBHLCBBbGJlcm9sYS1Mw7NwZXogQywgQm90bmFyIFIsIElyYXJyYXphdmFsIFAuIEtvbWFNUkkuamw6IEFuIG9wZW4tc291cmNlIGZyYW1ld29yayBmb3IgZ2VuZXJhbCBNUkkgc2ltdWxhdGlvbnMgd2l0aCBHUFUgYWNjZWxlcmF0aW9uLiBNYWduZXRpYyBSZXNvbmFuY2UgaW4gTWVkaWNpbmUuIDIwMjM7OTAoMSk6MzI5LTM0Mi4gW2RvaToxMC4xMDAyL21ybS4yOTYzNV0oZG9pOjEwLjEwMDIvbXJtLjI5NjM1KQogLSAqKkNhbXBiZWxsLVdhc2hidXJuIEFFKiosIFJhbWFzYXdteSBSLCBSZXN0aXZvIE1DLCBldCBhbC4gT3Bwb3J0dW5pdGllcyBpbiBJbnRlcnZlbnRpb25hbCBhbmQgRGlhZ25vc3RpYyBJbWFnaW5nIGJ5IFVzaW5nIEhpZ2gtUGVyZm9ybWFuY2UgTG93LUZpZWxkLVN0cmVuZ3RoIE1SSS4gUmFkaW9sb2d5LiAyMDE5OzI5MygyKTozODQtMzkzLiBbZG9pOjEwLjExNDgvcmFkaW9sLjIwMTkxOTA0NTJdKGRvaToxMC4xMTQ4L3JhZGlvbC4yMDE5MTkwNDUyKQotICoqUmVzdGl2byBNQyoqLCBSYW1hc2F3bXkgUiwgQmFuZGV0dGluaSBXUCwgSGVyemthIERBLCBDYW1wYmVsbC1XYXNoYnVybiBBRS4gRWZmaWNpZW50IHNwaXJhbCBpbi1vdXQgYW5kIEVQSSBiYWxhbmNlZCBzdGVhZHktc3RhdGUgZnJlZSBwcmVjZXNzaW9uIGNpbmUgaW1hZ2luZyB1c2luZyBhIGhpZ2gtcGVyZm9ybWFuY2UgMC41NVQgTVJJLiBNYWduZXRpYyBSZXNvbmFuY2UgaW4gTWVkaWNpbmUuIDIwMjA7ODQoNSk6MjM2NC0yMzc1LiBbZG9pOjEwLjEwMDIvbXJtLjI4Mjc4XShkb2k6MTAuMTAwMi9tcm0uMjgyNzgpCiIiIqhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw9kkYTk5YzBjNDctMWI3MC00MzYyLWEyZjYtYTdlMzI1OTYwNmZhhKdjZWxsX2lk2SRhOTljMGM0Ny0xYjcwLTQzNjItYTJmNi1hN2UzMjU5NjA2ZmGkY29kZdoBoW1kIiIiIyBMb3ctRmllbGQgQ01SQSBPcHRpbWl6YXRpb24KClRoaXMgbm90ZWJvb2sgcmVwcm9kdWNlcyB0aGUgc2ltdWxhdGlvbiBleHBlcmltZW50cyBwZXJmb3JtZWQgaW4gb3VyIG1hbnVzY3JpcHQ6Cgo+ICoqIkhpZ2hseSBFZmZpY2llbnQgaU5BVi1iYXNlZCAzRCBXaG9sZS1IZWFydCBDTVJBIGF0IDAuNTVUIioqCj4KPiAqKkNhcmxvcyBDYXN0aWxsby1QYXNzaSoqLCBLYXJsIFAuIEt1bnplLCBNaWNoYWVsIEcuIENyYWJiLCBDYW1pbGEgTXXDsW96LCBBbmFzdGFzaWEgRm90YWtpLCBSYWRob3VlbmUgTmVqaSwgUGFibG8gSXJhcnJhemF2YWwsIENsYXVkaWEgUHJpZXRvLCBhbmQgUmVuw6kgTS4gQm90bmFyCj4KPiAoMjAyNCkKClN1Ym1pdHRlZCB0byBNYWduZXRpYyBSZXNvbmFuY2UgaW4gTWVkaWNpbmUgKE1STSkuCiIiIqhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw9kkYTE1ZDZiNjQtZjhlZS00ZWU0LTgxMmMtZDQ5Y2Y1ZWE3ODRkhKdjZWxsX2lk2SRhMTVkNmI2NC1mOGVlLTRlZTQtODEyYy1kNDljZjVlYTc4NGSkY29kZdoCHG1kIiIiCiMjIDEuNC4gUGhhbnRvbQpFYWNoIHRpc3N1ZSB3YXMgcmVwcmVzZW50ZWQgd2l0aCAyMDAgaXNvY2hyb21hdHMgZGlzdHJpYnV0ZWQgYWxvbmcgdGhlICR6JC1heGlzIHRvIHNpbXVsYXRlIGdyYWRpZW50IHNwb2lsaW5nIGVmZmVjdHMuIFRoZSBpc29jaHJvbWF0cyBmb3IgZWFjaCB0aXNzdWUgd2VyZSBpbnNpZGUgYSAxRCB2b3hlbCBvZiBzaXplICQxLjVcLFxtYXRocm17bW19JC4gVGhlIHZhbHVlcyBmb3IgJFRfMSQgYW5kICRUXzIkIGZvciBibG9vZCwgbXlvY2FyZGlhbCBtdXNjbGUsIGFuZCBmYXQgYXQgMC41NVQgd2VyZSBvYnRhaW5lZCBmcm9tIHRoZSB3b3JrIG9mIENhbXBiZWxsLVdhc2hidXJuLCBldCBhbC4gRmF0IHNwaW5zIHdlcmUgc2ltdWxhdGVkIHVzaW5nIGEgY2hlbWljYWwgc2hpZnQgb2YgJC0zLjRcLFxtYXRocm17cHBtfSQsIHNpbXVsYXRpbmcgcmVndWxhciBmYXQgd2l0aCAkVF8xPTE4M1wsXG1hdGhybXttc30kLCBhbmQgZmFzdC1yZWNvdmVyaW5nIGZhdCB3aXRoICRUXzE9MTMwXCxcbWF0aHJte21zfSQuCiIiIqhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw9kkZjBhODFjOWYtNTYxNi00NjYzLTk0OGYtYTQwODRlMTcxOWFmhKdjZWxsX2lk2SRmMGE4MWM5Zi01NjE2LTQ2NjMtOTQ4Zi1hNDA4NGUxNzE5YWakY29kZdoBOWJlZ2luCiAgICBmYXRfcHBtID0gLTMuNGUtNiAJCQkjIC0zLjRwcG0gZmF0LXdhdGVyIGZyZXF1ZW5jeSBzaGlmdAogICAgTmlzbyA9IDIwMCAgICAgICAgCQkJIyAyMDAgaXNvY2hyb21hdHMgaW4gc3BvaWxlciBkaXJlY3Rpb24KICAgIM6UeF92b3hlbCA9IDEuNWUtMyAJCQkjIDEuNSBbbW1dCiAgICBmYXRfZnJlcSA9IM6zKnN5cy5CMCpmYXRfcHBtICMgLTgwIFtIel0KICAgIGR4ID0gQXJyYXkocmFuZ2UoLc6UeF92b3hlbC8yLCDOlHhfdm94ZWwvMiwgTmlzbykpCgltZCItIFBoYW50b20gcGFyYW1ldGVycyAoc2hvdy9oaWRlIGNvZGUpIgplbmSobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMPZJGQ5NzE1YmMxLTQ5Y2QtNGRmOC04ZGJmLWMwNmRlNDJhZDU1MISnY2VsbF9pZNkkZDk3MTViYzEtNDljZC00ZGY4LThkYmYtYzA2ZGU0MmFkNTUwpGNvZGXaBAZiZWdpbgogICAgIyBQcmVwIHBsb3RzCiAgICBsYWJzID0gWyJNeW9jYXJkaXVtIiwgIkJsb29kIiwgIkZhdCJdCgljb2xzID0gWyJibHVlIiwgInJlZCIsICJncmVlbiJdCiAgICBzcGluX2dyb3VwID0gWygxOk5pc28pJywgKE5pc28rMToyTmlzbyknLCAoMk5pc28rMTozTmlzbyknXQogICAgdCA9IEtvbWFNUklDb3JlLmdldF9hZGNfc2FtcGxpbmdfdGltZXMoc2VxKQogICAgTXh5KGkpID0gYWJzLihzdW0obWFnbmV0aXphdGlvbls6LHNwaW5fZ3JvdXBbaV0sMSwxXVs6LDEsOl0sZGltcz0yKVs6XS9sZW5ndGgoc3Bpbl9ncm91cFtpXSkpCiAgICBNeihpKSA9IHJlYWwuKHN1bShtYWduZXRpemF0aW9uWzosc3Bpbl9ncm91cFtpXSwyLDFdWzosMSw6XSxkaW1zPTIpWzpdL2xlbmd0aChzcGluX2dyb3VwW2ldKSkKCiAgICAjIFBsb3QKICAgIHAwID0gbWFrZV9zdWJwbG90cygKCQlyb3dzPTIsCgkJY29scz0xLAoJCXN1YnBsb3RfdGl0bGVzPVsiTXh5IiAiTXoiICJTZXF1ZW5jZSJdLAoJCXNoYXJlZF94YXhlcz10cnVlLAoJCXZlcnRpY2FsX3NwYWNpbmc9MC4xCgkpCiAgICBmb3IgaT1lYWNoaW5kZXgoc3Bpbl9ncm91cCkKICAgICAgICBwMSA9IHNjYXR0ZXIoCgkJCXg9dCwgeT1NeHkoaSksCgkJCW5hbWU9bGFic1tpXSwKCQkJbGVnZW5kZ3JvdXA9bGFic1tpXSwKCQkJbWFya2VyX2NvbG9yPWNvbHNbaV0KCQkpCiAgICAgICAgcDIgPSBzY2F0dGVyKAoJCQl4PXQsCgkJCXk9TXooaSksCgkJCW5hbWU9bGFic1tpXSwKCQkJbGVnZW5kZ3JvdXA9bGFic1tpXSwKCQkJc2hvd2xlZ2VuZD1mYWxzZSwKCQkJbWFya2VyX2NvbG9yPWNvbHNbaV0KCQkpCiAgICAgICAgYWRkX3RyYWNlIShwMCwgcDEsIHJvdz0xLCBjb2w9MSkKICAgICAgICBhZGRfdHJhY2UhKHAwLCBwMiwgcm93PTIsIGNvbD0xKQogICAgZW5kCglyZWxheW91dCEocDAsCgkJeWF4aXNfcmFuZ2U9WzAsIDAuNF0sCgkJeGF4aXNfcmFuZ2U9W1JSKmR1bW15X2hlYXJ0X2JlYXRzLCBSUipkdW1teV9oZWFydF9iZWF0cysuMjUwXQoJKQogICAgcDAKZW5kqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTD2SRkNzUwY2Q1YS0zYzkwLTQxZWEtOTk0Mi01NzIzYTIxZGE2MGGEp2NlbGxfaWTZJGQ3NTBjZDVhLTNjOTAtNDFlYS05OTQyLTU3MjNhMjFkYTYwYaRjb2Rl2gJ+YmVnaW4KICAgIEZGQXMgPSAyMDoyMDoyNTAgCQkJCQkJICMgZmxpcCBhbmdsZSBbZGVnXQoJzpRmcyA9ICgtMTowLjI6MSkgLiogKM6zICogc3lzLkIwICogMWUtNikgICMgb2ZmLXJlc29uYW5jZSDOlGYgW3NdCiAgICBtYWcyID0gemVyb3MoQ29tcGxleEY2NCwgaW1fc2VnbWVudHMsIE5pc28qNCwgbGVuZ3RoKEZGQXMpLCBsZW5ndGgozpRmcykpCiAgICBAcHJvZ3Jlc3MgZm9yIChtLCDOlGYpID0gZW51bWVyYXRlKM6UZnMpLCAobiwgRmF0U2F0X2ZsaXBfYW5nbGUpID0gZW51bWVyYXRlKEZGQXMpCgkJc2VxX3BhcmFtczIgPSBtZXJnZShzZXFfcGFyYW1zLCAoOyBGYXRTYXRfZmxpcF9hbmdsZSkpCgkJc2ltX3BhcmFtczIgPSBtZXJnZShzaW1fcGFyYW1zLCBEaWN0KCJzaW1fbWV0aG9kIj0+QmxvY2hEaWN0KCkpKQoJCXNlcTIgICAgICAgID0gQ01SQShzZXFfcGFyYW1zMi4uLikKCQlvYmoyICAgICAgICA9IGNhcmRpYWNfcGhhbnRvbSjOlGYpCgkJbWFnYXV4ID0gQHN1cHByZXNzIHNpbXVsYXRlKG9iajIsIHNlcTIsIHN5czsgc2ltX3BhcmFtcz1zaW1fcGFyYW1zMikKCQltYWcyWzosIDosIG4sIG1dIC49IG1hZ2F1eFtlbmQtaW1fc2VnbWVudHMrMTplbmQsIDpdICMgTGFzdCBoZWFydGJlYXQKICAgIGVuZAplbmSobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMLZJDllMzk3NDI2LWI2MGItNGI5OC1iZThiLWY3ZjEyODYyMWM0NISnY2VsbF9pZNkkOWUzOTc0MjYtYjYwYi00Yjk4LWJlOGItZjdmMTI4NjIxYzQ0pGNvZGXZU2JlZ2luCglzeXMgPSBTY2FubmVyKCkKCXN5cy5CMCA9IDAuNTUKCXN5cy5HbWF4ID0gNDAuMGUtMwoJc3lzLlNtYXggPSAyNS4wCglzeXMKZW5kqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTD2SRkMDVkY2JhNy0yZjQyLTQ3YmYtYTE3Mi02MTIzZDAxMTNiM2aEp2NlbGxfaWTZJGQwNWRjYmE3LTJmNDItNDdiZi1hMTcyLTYxMjNkMDExM2IzZqRjb2Rl2Y1zaW1fcGFyYW1zID0gRGljdHtTdHJpbmcsQW55fSgKCSJyZXR1cm5fdHlwZSI9PiJtYXQiLAoJInNpbV9tZXRob2QiPT5CbG9jaERpY3Qoc2F2ZV9Nej10cnVlKSwKCSLOlHRfcmYiPT5UcmYsCgkiZ3B1Ij0+ZmFsc2UsCgkiTnRocmVhZHMiPT4xCimobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMPZJDM5ZjQ0MDI1LTI5NzQtNGM0Yy1iMGMyLWUyMTM5OWJiZGIxZoSnY2VsbF9pZNkkMzlmNDQwMjUtMjk3NC00YzRjLWIwYzItZTIxMzk5YmJkYjFmpGNvZGXaAVhtZCIiIgojIyAyLjEuIEZsaXAgYW5nbGUgb3B0aW1pemF0aW9uCgpGb3IgdGhlIGZpcnN0IHNpbXVsYXRpb24gZXhwZXJpbWVudCwgU05SIHdhcyBtYXhpbWl6ZWQgYnkgdmFyeWluZyB0aGUgaW1hZ2luZyBmbGlwIGFuZ2xlIChiZXR3ZWVuIDIwIGFuZCAxODAgZGVnKS4gVG8gb3B0aW1pemUgU05SIGluZGVwZW5kZW50bHkgb2YgaGVhcnQgcmF0ZSwgbXVsdGlwbGUgaGVhcnQgcmF0ZXMgKGJldHdlZW4gNTUgYW5kIDg1IGJwbSkgd2VyZSBzaW11bGF0ZWQgYW5kIHRoZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG9idGFpbmVkIGJsb29kIHNpZ25hbCB3ZXJlIGNhbGN1bGF0ZWQuCiIiIqhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw9kkMzdmN2ZkN2YtNWNiMS00OGI1LWI4NzctYjJiYzIzYTFlN2RkhKdjZWxsX2lk2SQzN2Y3ZmQ3Zi01Y2IxLTQ4YjUtYjg3Ny1iMmJjMjNhMWU3ZGSkY29kZdnLYmVnaW4KICAgIHNlcSA9IENNUkEoc2VxX3BhcmFtcy4uLjsgc2FtcGxlX3JlY292ZXJ5PW9uZXMoQm9vbCwgZHVtbXlfaGVhcnRfYmVhdHMrMSkpCglvYmogPSBjYXJkaWFjX3BoYW50b20oMCkKICAgIG1hZ25ldGl6YXRpb24gPSBAc3VwcHJlc3Mgc2ltdWxhdGUob2JqLCBzZXEsIHN5czsgc2ltX3BhcmFtcykKCW5vdGhpbmcgIyBoaWRlIG91dHB1dAplbmSobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMLZJDc3MTUzZTVjLTcxYmQtNDJlMy1iYWU5LWU0ODExZmZhN2EzZISnY2VsbF9pZNkkNzcxNTNlNWMtNzFiZC00MmUzLWJhZTktZTQ4MTFmZmE3YTNkpGNvZGXZjG1kIiIiIyMgMS4yLiBTY2FubmVyCgpXZSBzdGFydCBieSBkZWZpbmluZyB0aGUgaGFyZHdhcmUgY2hhcmFjdGVyaXN0aWNzLiBUaGUgYHN5cy5CMGAgd2lsbCBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgb2ZmLXJlc29uYW5jZSBvZiBmYXQuIiIiqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTD2SRkNTRkNjgwNy00NDRmLTRlMGUtOGZkNi04NDQ1Nzk3NDExNWGEp2NlbGxfaWTZJGQ1NGQ2ODA3LTQ0NGYtNGUwZS04ZmQ2LTg0NDU3OTc0MTE1YaRjb2Rl2V9tZCJIZXJlIHdlIHNob3cgdGhlIG1hZ25ldGl6YXRpb24gZHluYW1pY3Mgb2YgdGhlIG15b2NhcmRpdW0sIGJsb29kLCBhbmQgZmF0IHNpZ25hbHMgYXQgMC41NVQuIqhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw9kkNDRhMzEwNTctN2IzNC00YzgwLWEyNzMtNjYyMWMwNzczZGM3hKdjZWxsX2lk2SQ0NGEzMTA1Ny03YjM0LTRjODAtYTI3My02NjIxYzA3NzNkYzekY29kZdoMUmJlZ2luCgkjIyBDYWxjdWxhdGluZyByZXN1bHRzCglzaWduYWxfbXlvYzIgPSByZXNoYXBlKAoJICAgIG1lYW4oYWJzLihtZWFuKG1hZzJbOiwgc3BpbnNbMV0sIDosIDpdLCAzKSksIDEpLCBsZW5ndGgoRkZBcyksIGxlbmd0aCjOlGZzKQoJKQoJc2lnbmFsX2Jsb28yID0gcmVzaGFwZSgKCSAgICBtZWFuKGFicy4obWVhbihtYWcyWzosIHNwaW5zWzJdLCA6LCA6XSwgMykpLCAxKSwgbGVuZ3RoKEZGQXMpLCBsZW5ndGgozpRmcykKCSkKCXNpZ25hbF9mYXQyID0gcmVzaGFwZSgKCSAgICBtZWFuKGFicy4obWVhbihtYWcyWzosIHNwaW5zWzNdLCA6LCA6XSwgMykpLCAxKSwgbGVuZ3RoKEZGQXMpLCBsZW5ndGgozpRmcykKCSkKCXNpZ25hbF9mYXQyMiA9IHJlc2hhcGUoCgkgICAgbWVhbihhYnMuKG1lYW4obWFnMls6LCBzcGluc1s0XSwgOiwgOl0sIDMpKSwgMSksIGxlbmd0aChGRkFzKSwgbGVuZ3RoKM6UZnMpCgkpCgltZWFuX215b2MyID0gbWVhbihzaWduYWxfbXlvYzIsIDIpCgltZWFuX2Jsb28yID0gbWVhbihzaWduYWxfYmxvbzIsIDIpCgltZWFuX2ZhdDIgID0gbWVhbihzaWduYWxfZmF0MiwgMikKCW1lYW5fZmF0MjIgPSBtZWFuKHNpZ25hbF9mYXQyMiwgMikKCXN0ZF9teW9jMiAgPSBzdGQoc2lnbmFsX215b2MyLCAyKQoJc3RkX2Jsb28yICA9IHN0ZChzaWduYWxfYmxvbzIsIDIpCglzdGRfZmF0MiAgID0gc3RkKHNpZ25hbF9mYXQyLCAyKQoJc3RkX2ZhdDIyICA9IHN0ZChzaWduYWxfZmF0MjIsIDIpCgkjIFBsb3R0aW5nIHJlc3VsdHMKCSMgTWVhbgoJczEyID0gc2NhdHRlcig7CgkgICAgeD1GRkFzLAoJICAgIHk9bWVhbl9teW9jMls6XSwKCSAgICBuYW1lPWxhYmVsc1sxXSwKCSAgICBsZWdlbmRncm91cD1sYWJlbHNbMV0sCgkgICAgbGluZT1hdHRyKDsgY29sb3I9Y29sb3JzWzFdKSwKCSkKCXMyMiA9IHNjYXR0ZXIoOwoJICAgIHg9RkZBcywKCSAgICB5PW1lYW5fYmxvbzJbOl0sCgkgICAgbmFtZT1sYWJlbHNbMl0sCgkgICAgbGVnZW5kZ3JvdXA9bGFiZWxzWzJdLAoJICAgIGxpbmU9YXR0cig7IGNvbG9yPWNvbG9yc1syXSksCgkpCglzMzIgPSBzY2F0dGVyKDsKCSAgICB4PUZGQXMsCgkgICAgeT1tZWFuX2ZhdDJbOl0sCgkgICAgbmFtZT1sYWJlbHNbM10sCgkgICAgbGVnZW5kZ3JvdXA9bGFiZWxzWzNdLAoJICAgIGxpbmU9YXR0cig7IGNvbG9yPWNvbG9yc1szXSksCgkpCglzNTIgPSBzY2F0dGVyKDsKCSAgICB4PUZGQXMsCgkgICAgeT1tZWFuX2ZhdDIyWzpdLAoJICAgIG5hbWU9bGFiZWxzWzRdLAoJICAgIGxlZ2VuZGdyb3VwPWxhYmVsc1s0XSwKCSAgICBsaW5lPWF0dHIoOyBjb2xvcj1jb2xvcnNbM10sIGRhc2g9ImRhc2giKSwKCSkKCSMgU3RkCglzNDIgPSBzY2F0dGVyKDsKCSAgICB4PVtGRkFzOyByZXZlcnNlKEZGQXMpXSwKCSAgICB5PVsobWVhbl9teW9jMiAuLSBzdGRfbXlvYzIpWzpdOyByZXZlcnNlKChtZWFuX215b2MyIC4rIHN0ZF9teW9jMilbOl0pXSwKCSAgICBuYW1lPWxhYmVsc1sxXSwKCSAgICBsZWdlbmRncm91cD1sYWJlbHNbMV0sCgkgICAgc2hvd2xlZ2VuZD1mYWxzZSwKCSAgICBmaWxsPSJ0b3NlbGYiLAoJICAgIGZpbGxjb2xvcj0icmdiYSgwLDAsMjU1LDAuMikiLAoJICAgIGxpbmU9YXR0cig7IGNvbG9yPSJyZ2JhKDAsMCwwLDApIiksCgkJaG92ZXJpbmZvPSJub25lIiwKCSkKCXM2MiA9IHNjYXR0ZXIoOwoJICAgIHg9W0ZGQXM7IHJldmVyc2UoRkZBcyldLAoJICAgIHk9WyhtZWFuX2Jsb28yIC4tIHN0ZF9ibG9vMilbOl07IHJldmVyc2UoKG1lYW5fYmxvbzIgLisgc3RkX2Jsb28yKVs6XSldLAoJICAgIG5hbWU9bGFiZWxzWzJdLAoJICAgIGxlZ2VuZGdyb3VwPWxhYmVsc1syXSwKCSAgICBzaG93bGVnZW5kPWZhbHNlLAoJICAgIGZpbGw9InRvc2VsZiIsCgkgICAgZmlsbGNvbG9yPSJyZ2JhKDI1NSwwLDAsMC4yKSIsCgkgICAgbGluZT1hdHRyKDsgY29sb3I9InJnYmEoMCwwLDAsMCkiKSwKCQlob3ZlcmluZm89Im5vbmUiLAoJKQoJczcyID0gc2NhdHRlcig7CgkgICAgeD1bRkZBczsgcmV2ZXJzZShGRkFzKV0sCgkgICAgeT1bKG1lYW5fZmF0MiAuLSBzdGRfZmF0MilbOl07IHJldmVyc2UoKG1lYW5fZmF0MiAuKyBzdGRfZmF0MilbOl0pXSwKCSAgICBuYW1lPWxhYmVsc1szXSwKCSAgICBsZWdlbmRncm91cD1sYWJlbHNbM10sCgkgICAgc2hvd2xlZ2VuZD1mYWxzZSwKCSAgICBmaWxsPSJ0b3NlbGYiLAoJICAgIGZpbGxjb2xvcj0icmdiYSgwLDI1NSwwLDAuMikiLAoJICAgIGxpbmU9YXR0cig7IGNvbG9yPSJyZ2JhKDAsMCwwLDApIiksCgkJaG92ZXJpbmZvPSJub25lIiwKCSkKCXM4MiA9IHNjYXR0ZXIoOwoJICAgIHg9W0ZGQXM7IHJldmVyc2UoRkZBcyldLAoJICAgIHk9WyhtZWFuX2ZhdDIyIC4tIHN0ZF9mYXQyMilbOl07IHJldmVyc2UoKG1lYW5fZmF0MjIgLisgc3RkX2ZhdDIyKVs6XSldLAoJICAgIG5hbWU9bGFiZWxzWzRdLAoJICAgIGxlZ2VuZGdyb3VwPWxhYmVsc1s0XSwKCSAgICBzaG93bGVnZW5kPWZhbHNlLAoJICAgIGZpbGw9InRvc2VsZiIsCgkgICAgZmlsbGNvbG9yPSJyZ2JhKDAsMjU1LDAsMC4yKSIsCgkgICAgbGluZT1hdHRyKDsgY29sb3I9InJnYmEoMCwwLDAsMCkiKSwKCQlob3ZlcmluZm89Im5vbmUiLAoJKQoJIyBQbG90cwoJZmlnMiA9IHBsb3QoW3MxMiwgczIyLCBzMzIsIHM0MiwgczUyLCBzNjIsIHM3MiwgczgyXSkKCXJlbGF5b3V0ISgKCSAgICBmaWcyOwoJICAgIHlheGlzPWF0dHIoOyB0aXRsZT0iU2lnbmFsIFthLnUuXSIsIHRpY2ttb2RlPSJhcnJheSIpLAoJICAgIHhheGlzPWF0dHIoOwoJICAgICAgICB0aXRsZT0iRmF0U2F0IGZsaXAgYW5nbGUgW2RlZ10iLAoJICAgICAgICB0aWNrbW9kZT0iYXJyYXkiLAoJICAgICAgICB0aWNrdmFscz1bRkZBc1sxXSwgMTMwLCAxNTAsIDE4MCwgRkZBc1tlbmRdXSwKCSAgICAgICAgY29uc3RyYWluPSJkb21haW4iLAoJICAgICksCgkgICAgZm9udD1hdHRyKDsgZmFtaWx5PSJDTVUgU2VyaWYiLCBzaXplPTE2LCBzY2FsZWFuY2hvcj0ieCIsIHNjYWxlcmF0aW89MSksCgkgICAgeWF4aXNfcmFuZ2U9WzAsIDAuNF0sCgkJeGF4aXNfcmFuZ2U9W0ZGQXNbMV0sIEZGQXNbZW5kXV0sCgkgICAgd2lkdGg9NjAwLAoJICAgIGhlaWdodD00MDAsCgkgICAgaG92ZXJtb2RlPSJ4IHVuaWZpZWQiLAoJKQoJZmlnMgplbmSobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMPZJGNiNjU5MTE4LTlmMjItNDNjMy04MDFkLTQ5MjQxZGVlNGRmNoSnY2VsbF9pZNkkY2I2NTkxMTgtOWYyMi00M2MzLTgwMWQtNDkyNDFkZWU0ZGY2pGNvZGXaAyFiZWdpbgoJIyBHZW5lcmFsIHNlcXVlbmNlIHBhcmFtZXRlcnMKCVRyZiA9IDUwMGUtNiAgCQkJIyA1MDAgW21zXQoJQjEgPSAxIC8gKDM2MCrOsypUcmYpICAgICMgQjEgYW1wbGl0dWRlIFt1VF0KCVRhZGMgPSAxZS02IAkJCSMgMXVzCgoJIyBQcmVwdWxzZXMKCVRmYXRzYXQgPSAyNi42MjRlLTMgICAgICMgMjYuNiBbbXNdCglUMnByZXBfZHVyYXRpb24gPSA1MGUtMyAjIDUwIFttc10KCgkjIEFjcXVpc2l0aW9uCglSUiA9IDEuMCAJCQkJIyAxIFtzXQoJZHVtbXlfaGVhcnRfYmVhdHMgPSAzIAkjIFN0ZWFkeS1zdGF0ZQoJVFIgPSA1LjNlLTMgICAgICAgICAgICAgIyA1LjMgW21zXSBSRiBMb3cgU0FSCglURSA9IFRSIC8gMiAJCQkjIGJTU0ZQIGNvbmRpdGlvbgoJaU5BVl9saW5lcyA9IDYgICAgICAgICAgIyBGYXRTYXQtQWNxIGRlbGF5OiBpTkFWX2xpbmVzICogVFIKCWlOQVZfZmxpcF9hbmdsZSA9IDMuMiAgICMgMy4yIFtkZWddCglpbV9zZWdtZW50cyA9IDIwICAgICAgICAjIEFjcXVpc2l0aW5vIHdpbmRvdzogaW1fc2VnbWVudHMgKiBUUgoKCSMgVG8gYmUgb3B0aW1pemVkCglpbV9mbGlwX2FuZ2xlID0gMTEwICAgICMgMTEwIFtkZWddCglGYXRTYXRfZmxpcF9hbmdsZSA9IDE4MCAjIDE4MCBbZGVnXQoKCXNlcV9wYXJhbXMgPSAoOwoJCWR1bW15X2hlYXJ0X2JlYXRzLAoJCWlOQVZfbGluZXMsCgkJaW1fc2VnbWVudHMsCgkJaU5BVl9mbGlwX2FuZ2xlLAoJCWltX2ZsaXBfYW5nbGUsCgkJVDJwcmVwX2R1cmF0aW9uLAoJCUZhdFNhdF9mbGlwX2FuZ2xlLAoJCVJSCgkpCgoJc2VxX3BhcmFtcwplbmSobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMPZJDhkYzExMTc1LWViYzgtNDA3YS1hYjBiLTZkNTQzZjg0OWE3MoSnY2VsbF9pZNkkOGRjMTExNzUtZWJjOC00MDdhLWFiMGItNmQ1NDNmODQ5YTcypGNvZGXaAZpiZWdpbgoJIyBMYWJlbHMKCWxhYmVscyA9IFsiTXlvY2FyZGl1bSIsICJCbG9vZCIsICJGYXQgKFTigoE9MTgzIG1zKSIsICJGYXQgKFTigoE9MTMwIG1zKSJdCgljb2xvcnMgPSBbImJsdWUiLCAicmVkIiwgImdyZWVuIiwgInB1cnBsZSJdCglzcGlucyA9IFsoMTpOaXNvKScsICgoTmlzbyArIDEpOigyTmlzbykpJywgKCgyTmlzbyArIDEpOigzTmlzbykpJywgKCgzTmlzbyArIDEpOig0TmlzbykpJ10KCW1lYW4oeCwgZGltKSA9IHN1bSh4OyBkaW1zPWRpbSkgLyBzaXplKHgsIGRpbSkKCXN0ZCh4LCBkaW07IG11PW1lYW4oeCwgZGltKSkgPSBzcXJ0LihzdW0oYWJzLih4IC4tIG11KSAuXiAyOyBkaW1zPWRpbSkgLyAoc2l6ZSh4LCBkaW0pIC0gMSkpCgltZCJBdXggZnVuY3Rpb25zIChzaG93L2hpZGUgY29kZSkiCmVuZKhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw9kkZjczMDgyZmYtYTZkMy00MWY4LTg3OTYtNDExNGZhODlkMmJihKdjZWxsX2lk2SRmNzMwODJmZi1hNmQzLTQxZjgtODc5Ni00MTE0ZmE4OWQyYmKkY29kZdoJQ2JlZ2luCgkjIFJlZHVjaW5nIHRpc3N1ZXMncyBzaWduYWwKCXNpZ25hbF9teW9jID0gcmVzaGFwZSgKCSAgICBtZWFuKGFicy4obWVhbihtYWcxWzosIHNwaW5zWzFdLCA6LCA6XSwgMykpLCAxKSwgbGVuZ3RoKEZBcyksIGxlbmd0aChSUnMpCgkpCglzaWduYWxfYmxvbyA9IHJlc2hhcGUoCgkgICAgbWVhbihhYnMuKG1lYW4obWFnMVs6LCBzcGluc1syXSwgOiwgOl0sIDMpKSwgMSksIGxlbmd0aChGQXMpLCBsZW5ndGgoUlJzKQoJKQoJZGlmZl9ibG9vX215b2MgPSBhYnMuKHNpZ25hbF9ibG9vIC4tIHNpZ25hbF9teW9jKQoJIyBNZWFuCgltZWFuX215b2MgPSBtZWFuKHNpZ25hbF9teW9jLCAyKQoJbWVhbl9ibG9vID0gbWVhbihzaWduYWxfYmxvbywgMikKCW1lYW5fZGlmZiA9IG1lYW4oZGlmZl9ibG9vX215b2MsMikKCSMgU3RkCglzdGRfbXlvYyAgPSBzdGQoc2lnbmFsX215b2MsIDIpCglzdGRfYmxvbyAgPSBzdGQoc2lnbmFsX2Jsb28sIDIpCglzdGRfZGlmZiA9IHN0ZChkaWZmX2Jsb29fbXlvYywyKQoJIyBQbG90dGluZyByZXN1bHRzCgkjIE1lYW4KCXMxID0gc2NhdHRlcig7CgkgICAgeD1GQXMsCgkgICAgeT1tZWFuX215b2NbOl0sCgkgICAgbmFtZT1sYWJlbHNbMV0sCgkgICAgbGVnZW5kZ3JvdXA9bGFiZWxzWzFdLAoJICAgIGxpbmU9YXR0cig7IGNvbG9yPWNvbG9yc1sxXSksCgkpCglzMiA9IHNjYXR0ZXIoOwoJICAgIHg9RkFzLAoJICAgIHk9bWVhbl9ibG9vWzpdLAoJICAgIG5hbWU9bGFiZWxzWzJdLAoJICAgIGxlZ2VuZGdyb3VwPWxhYmVsc1syXSwKCSAgICBsaW5lPWF0dHIoOyBjb2xvcj1jb2xvcnNbMl0pLAoJKQoJczMgPSBzY2F0dGVyKDsKCQl4PUZBcywKCQl5PW1lYW5fZGlmZls6XSwKCQluYW1lPSJ8Qmxvb2QtTXlvY3wiLAoJCWxlZ2VuZGdyb3VwPSJ8Qmxvb2QtTXlvY3wiLAoJCWxpbmU9YXR0cihjb2xvcj1jb2xvcnNbNF0pCgkpCgkjIFN0ZAoJczQgPSBzY2F0dGVyKDsKCSAgICB4PVtGQXM7IHJldmVyc2UoRkFzKV0sCgkgICAgeT1bKG1lYW5fbXlvYyAuLSBzdGRfbXlvYylbOl07IHJldmVyc2UoKG1lYW5fbXlvYyAuKyBzdGRfbXlvYylbOl0pXSwKCSAgICBuYW1lPWxhYmVsc1sxXSwKCSAgICBsZWdlbmRncm91cD1sYWJlbHNbMV0sCgkgICAgc2hvd2xlZ2VuZD1mYWxzZSwKCSAgICBmaWxsPSJ0b3NlbGYiLAoJICAgIGZpbGxjb2xvcj0icmdiYSgwLDAsMjU1LDAuMikiLAoJICAgIGxpbmU9YXR0cig7IGNvbG9yPSJyZ2JhKDAsMCwwLDApIiksCgkJaG92ZXJpbmZvPSJub25lIgoJKQoJczUgPSBzY2F0dGVyKDsKCSAgICB4PVtGQXM7IHJldmVyc2UoRkFzKV0sCgkgICAgeT1bKG1lYW5fYmxvbyAuLSBzdGRfYmxvbylbOl07IHJldmVyc2UoKG1lYW5fYmxvbyAuKyBzdGRfYmxvbylbOl0pXSwKCSAgICBuYW1lPWxhYmVsc1syXSwKCSAgICBsZWdlbmRncm91cD1sYWJlbHNbMl0sCgkgICAgc2hvd2xlZ2VuZD1mYWxzZSwKCSAgICBmaWxsPSJ0b3NlbGYiLAoJICAgIGZpbGxjb2xvcj0icmdiYSgyNTUsMCwwLDAuMikiLAoJICAgIGxpbmU9YXR0cig7IGNvbG9yPSJyZ2JhKDAsMCwwLDApIiksCgkJaG92ZXJpbmZvPSJub25lIgoJKQoJczYgPSBzY2F0dGVyKDsKCQl4PVtGQXM7IHJldmVyc2UoRkFzKV0sCgkJeT1bKG1lYW5fZGlmZiAuLSBzdGRfZGlmZilbOl07IHJldmVyc2UoKG1lYW5fZGlmZiAuKyBzdGRfZGlmZilbOl0pXSwKCQluYW1lPSJ8Qmxvb2QtTXlvY3wiLGxlZ2VuZGdyb3VwPSJ8Qmxvb2QtTXlvY3wiLAoJCXNob3dsZWdlbmQ9ZmFsc2UsCgkJZmlsbD0idG9zZWxmIiwKCQlmaWxsY29sb3I9InJnYmEoMjU1LDAsMjU1LDAuMikiLAoJCWxpbmU9YXR0cihjb2xvcj0icmdiYSgwLDAsMCwwKSIpLAoJCWhvdmVyaW5mbz0ibm9uZSIKCSkKCSMgUGxvdHMKCWZpZyA9IHBsb3QoW3MxLCBzMiwgczMsIHM0LCBzNSwgczZdKQoJcmVsYXlvdXQhKAoJICAgIGZpZzsKCSAgICB5YXhpcz1hdHRyKDsgdGl0bGU9IlNpZ25hbCBbYS51Ll0iLCB0aWNrbW9kZT0iYXJyYXkiKSwKCSAgICB4YXhpcz1hdHRyKDsKCSAgICAgICAgdGl0bGU9IkZsaXAgYW5nbGUgW2RlZ10iLAoJICAgICAgICB0aWNrbW9kZT0iYXJyYXkiLAoJICAgICAgICB0aWNrdmFscz1bRkFzWzFdLCA4NSwgMTEwLCAxMzAsIEZBc1tlbmRdXSwKCSAgICAgICAgY29uc3RyYWluPSJkb21haW4iLAoJICAgICksCgkgICAgZm9udD1hdHRyKDsgZmFtaWx5PSJDTVUgU2VyaWYiLCBzaXplPTE2LCBzY2FsZWFuY2hvcj0ieCIsIHNjYWxlcmF0aW89MSksCgkgICAgeWF4aXNfcmFuZ2U9WzAsIDAuM10sCgkJeGF4aXNfcmFuZ2U9W0ZBc1sxXSwgRkFzW2VuZF1dLAoJICAgIHdpZHRoPTYwMCwKCSAgICBoZWlnaHQ9NDAwLAoJICAgIGhvdmVybW9kZT0ieCB1bmlmaWVkIiwKCSkKCWZpZwplbmSobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMPZJDcwZGJjMmJkLThiOTMtNDcxZC04MzQwLTA0ZDk4YTAwOGNhNoSnY2VsbF9pZNkkNzBkYmMyYmQtOGI5My00NzFkLTgzNDAtMDRkOThhMDA4Y2E2pGNvZGXZM3VzaW5nIFN1cHByZXNzb3IsIFBsdXRvVUksIFByb2dyZXNzTG9nZ2luZyAjIEV4dHJhc6htZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkYWJlYTJjNDMtZDgzZS00NDM4LThjZDMtNGJlMDZiODE3NGIzhKdjZWxsX2lk2SRhYmVhMmM0My1kODNlLTQ0MzgtOGNkMy00YmUwNmI4MTc0YjOkY29kZdnfbWQiIiIjIFJlcHJvZHVjaWJpbGl0eQoKVGhpcyBbUGx1dG8gbm90ZWJvb2tdKGh0dHBzOi8vcGx1dG9qbC5vcmcvKSBpcyByZXByb2R1Y2libGUgYnkgZGVmYXVsdCwgYXMgaXQgaGFzIGFuIGVtYmVkZGVkIGBQcm9qZWN0LnRvbWxgIGFuZCBgTWFuaWZlc3QudG9tbGAsIHRoYXQgc3RvcmUgdGhlIGV4YWN0IHBhY2thZ2UgdmVyc2lvbnMgdXNlZCB0byBjcmVhdGUgdGhlIG5vdGVib29rLiIiIqhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw9kkYWU3MmZmYzUtN2Y4ZS00OTA3LWE5OWUtOGFkN2NiOGZkZGFihKdjZWxsX2lk2SRhZTcyZmZjNS03ZjhlLTQ5MDctYTk5ZS04YWQ3Y2I4ZmRkYWKkY29kZdlEbWQiIiIKVGhlIENNUkEgc2VxdWVuY2UgKGBDTVJBX2lOQVZfYlNTRlBfY2FyZGlhY2ApIGNvbnNpc3RzIG9mOgoiIiKobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMPZJDBiN2E0MDVlLWJiYjUtMTFlZS0wNWNhLTRiMWM4NTY3Mzk4ZISnY2VsbF9pZNkkMGI3YTQwNWUtYmJiNS0xMWVlLTA1Y2EtNGIxYzg1NjczOThkpGNvZGXZOXVzaW5nIEtvbWFNUklDb3JlLCBLb21hTVJJUGxvdHMsIFBsdXRvUGxvdGx5ICMgRXNzZW50aWFsc6htZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwtkkZGJmMTY2NzYtNjRmMi00ZDliLWJmMWItOGRlMDZiMDQ4NjAyhKdjZWxsX2lk2SRkYmYxNjY3Ni02NGYyLTRkOWItYmYxYi04ZGUwNmIwNDg2MDKkY29kZdklbWQiIyMgMS4xLiBMb2FkaW5nIHJlcXVpcmVkIHBhY2thZ2VzIqhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw9kkZjIxZTllNTktMjVjMy00ZjA2LThkZTQtNzkyY2IzMDVlYjAxhKdjZWxsX2lk2SRmMjFlOWU1OS0yNWMzLTRmMDYtOGRlNC03OTJjYjMwNWViMDGkY29kZdm8bWQiIiIjIDIuIFNpbXVsYXRpb24KClR3byBzaW11bGF0aW9uIGV4cGVyaW1lbnRzIHdlcmUgcGVyZm9ybWVkIHRvIG9wdGltaXplIHRoZSBzZXF1ZW5jZSBwYXJhbWV0ZXJzLCAoMSkgdG8gb3B0aW1pemUgdGhlIGltYWdpbmcgZmxpcCBhbmdsZSwgYW5kICgyKSB0byBvcHRpbWl6ZSB0aGUgRmF0U2F0IGZsaXAgYW5nbGUuCgoiIiKobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMPZJDBiNmMxZjcyLWIwNDAtNDgzYy05NjliLTg4YmZlMDliMzJjM4SnY2VsbF9pZNkkMGI2YzFmNzItYjA0MC00ODNjLTk2OWItODhiZmUwOWIzMmMzpGNvZGXZPXBsb3Rfc2VxKHNlcTsgc2hvd19hZGM9dHJ1ZSwgcmFuZ2U9WzI5MDAsIDMzMjVdLCBzbGlkZXI9dHJ1ZSmobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMLZJDc4OTBmODFlLWNiMTUtNDhkMi1hODBjLTlkNzNmOTUxNjA1NoSnY2VsbF9pZNkkNzg5MGY4MWUtY2IxNS00OGQyLWE4MGMtOWQ3M2Y5NTE2MDU2pGNvZGXaBVhiZWdpbgoJZnVuY3Rpb24gQ01SQSgKCQkJCWR1bW15X2hlYXJ0X2JlYXRzLAoJCQkJaU5BVl9saW5lcywKCQkJCWltX3NlZ21lbnRzLAoJCQkJaU5BVl9mbGlwX2FuZ2xlLAoJCQkJaW1fZmxpcF9hbmdsZSwKCQkJCVQycHJlcF9kdXJhdGlvbj01MGUtMywKCQkJCUZhdFNhdF9mbGlwX2FuZ2xlPTE4MCwKCQkJCVJSPTEuMDsKCQkJCXNhbXBsZV9yZWNvdmVyeT16ZXJvcyhCb29sLCBkdW1teV9oZWFydF9iZWF0cysxKQoJCQkJKQoJCSMgU2VxIGluaXQKCSAgICBzZXEgPSBTZXF1ZW5jZSgpCgkgICAgZm9yIGhiID0gMSA6IGR1bW15X2hlYXJ0X2JlYXRzICsgMQoJCQlzYW1wbGUgPSBzYW1wbGVfcmVjb3ZlcnlbaGJdICMgU2FtcGxpbmcgcmVjb3ZlcnkgY3VydmUgZm9yIGhiCgkJCSMgR2VuZXJhdGluZyBzZXEgYmxvY2tzCgkgICAgICAgIHQycCA9IFQycHJlcChUMnByZXBfZHVyYXRpb247IHNhbXBsZSkKCSAgICAgICAgZmF0c2F0ID0gRmF0U2F0KEZhdFNhdF9mbGlwX2FuZ2xlLCBmYXRfZnJlcTsgc2FtcGxlKQoJICAgICAgICBic3NmcCA9IGJTU0ZQKGlOQVZfbGluZXMsIGltX3NlZ21lbnRzLCBpTkFWX2ZsaXBfYW5nbGUsIGltX2ZsaXBfYW5nbGU7IHNhbXBsZSkKCSAgICAgICAgIyBDb25jYXRlbmF0aW5nIHNlcSBibG9ja3MKCSAgICAgICAgc2VxICs9IHQycAoJICAgICAgICBzZXEgKz0gZmF0c2F0CgkgICAgICAgIHNlcSArPSBic3NmcAoJCQkjIFJSIGludGVydmFsIGNvbnNpZGVyYXRpb24KCQkJUlJkZWxheSA9IFJSICAtIGR1cihic3NmcCkgLSBkdXIodDJwKSAtIGR1cihmYXRzYXQpCgkgICAgICAgIHNlcSArPSBzYW1wbGUgPyBBREMoODAsIFJSZGVsYXkpIDogRGVsYXkoUlJkZWxheSkKCSAgICBlbmQKCSAgICByZXR1cm4gc2VxCgllbmQKCgltZCIiIi0gYENNUkFgIChzaG93L2hpZGUgY29kZSkKCglgYGBqdWxpYQoJIyBTZXEgaW5pdAoJc2VxID0gU2VxdWVuY2UoKQoJZm9yIGhiID0gMSA6IGR1bW15X2hlYXJ0X2JlYXRzICsgMQoJCSMgR2VuZXJhdGluZyBzZXEgYmxvY2tzCgkJdDJwID0gVDJwcmVwKFQycHJlcF9kdXJhdGlvbikKCQlmYXRzYXQgPSBGYXRTYXQoRmF0U2F0X2ZsaXBfYW5nbGUsIGZhdF9mcmVxKQoJCWJzc2ZwID0gYlNTRlAoaU5BVl9saW5lcywgaW1fc2VnbWVudHMsIGlOQVZfZmxpcF9hbmdsZSwgaW1fZmxpcF9hbmdsZSkKCQkjIENvbmNhdGVuYXRpbmcgc2VxIGJsb2NrcwoJCXNlcSArPSB0MnAKCQlzZXEgKz0gZmF0c2F0CgkJc2VxICs9IGJzc2ZwCgkJIyBSUiBpbnRlcnZhbCBjb25zaWRlcmF0aW9uCgkJUlJkZWxheSA9IFJSICAtIGR1cihic3NmcCkgLSBkdXIodDJwKSAtIGR1cihmYXRzYXQpCgkJc2VxICs9IERlbGF5KFJSZGVsYXkpCgllbmQKCWBgYCIiIgplbmSobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMPZJDFiYjNlNDliLTFhMTktNDM0My1hYzA5LWZiYWYxY2FlNGJhM4SnY2VsbF9pZNkkMWJiM2U0OWItMWExOS00MzQzLWFjMDktZmJhZjFjYWU0YmEzpGNvZGWxVGFibGVPZkNvbnRlbnRzKCmobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMPZJGVjZWIzMjZhLWNhYjYtNDY1ZS04ZTVjLWU4MzU4ODFiZDNiMISnY2VsbF9pZNkkZWNlYjMyNmEtY2FiNi00NjVlLThlNWMtZTgzNTg4MWJkM2IwpGNvZGXZKG1kIiIiCiMjIDIuMC4gTWFnbmV0aXphdGlvbiBkeW5hbWljcwoiIiKobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMPZJDFhNjJhZTcxLTU4ZGItNDllYS1hZTZhLTlhZWE2NjE0NTk2M4SnY2VsbF9pZNkkMWE2MmFlNzEtNThkYi00OWVhLWFlNmEtOWFlYTY2MTQ1OTYzpGNvZGXaBd9iZWdpbgoJcGhhbnRvbV9UMSA9IHBsb3QoCgkJc2NhdHRlcigKCQkJeD1vYmoueCAqIDFlMywKCQkJeT1vYmouVDEgKiAxZTMsCgkJCW1vZGU9Im1hcmtlcnMiLAoJCQltYXJrZXI9YXR0cig7CgkJCQljb2xvcj1vYmouVDEgKiAxZTMsCgkJCQljb2xvcnNjYWxlPVsKCQkJCQlbMC4wLCAiYmxhY2siXSwKCQkJCQlbMTgzLjAvbWF4aW11bShvYmouVDEgLiogMWUzKSwgImdyZWVuIl0sCgkJCQkJWzcwMS4wL21heGltdW0ob2JqLlQxIC4qIDFlMyksICJibHVlIl0sCgkJCQkJWzExMjIuMC9tYXhpbXVtKG9iai5UMSAuKiAxZTMpLCAicmVkIl0sCgkJCQldLAoJCQkJY21pbj0wLjAsCgkJCQljbWF4PTExMjIuMCwKCQkJCWNvbG9yYmFyPWF0dHIoO3RpY2tzdWZmaXg9Im1zIiwgdGl0bGU9IlQxIiksCgkJCQlzaG93c2NhbGU9ZmFsc2UKCQkJKSwKCQkJc2hvd2xlZ2VuZD1mYWxzZQoJCSkKCSkKCXJlbGF5b3V0ISgKCQlwaGFudG9tX1QxLAoJCXlheGlzX3RpdGxlPSJUMSBbbXNdIiwKCQl4YXhpc190aXRsZT0ieCBbbW1dIiwKCQl4YXhpc190aWNrbW9kZT0iYXJyYXkiLAoJCXhheGlzX3RpY2t2YWxzPVstMS41LzIsIDAuMCwgMS41LzJdLAoJCXlheGlzX3RpY2ttb2RlPSJhcnJheSIsCgkJeWF4aXNfdGlja3ZhbHM9dW5pcXVlKG9iai5UMSAqIDFlMyksCgkJeGF4aXNfcmFuZ2U9Wy0xLjUsIDEuNV0sCgkJeWF4aXNfcmFuZ2U9WzAuMCwgMTIwMC4wXSwKCQl0aXRsZT0iVDEgbWFwIG9mIDFEIFBoYW50b20iCgkpCglwaGFudG9tX1QyID0gcGxvdCgKCQlzY2F0dGVyKAoJCQl4PW9iai54ICogMWUzLAoJCQl5PW9iai5UMiAqIDFlMywKCQkJbW9kZT0ibWFya2VycyIsCgkJCW1hcmtlcj1hdHRyKDsKCQkJCWNvbG9yPW9iai5UMiAqIDFlMywKCQkJCWNvbG9yc2NhbGU9WwoJCQkJCVswLjAsICJibGFjayJdLAoJCQkJCVs1OC4wL21heGltdW0ob2JqLlQyIC4qIDFlMyksICJibHVlIl0sCgkJCQkJWzkzLjAvbWF4aW11bShvYmouVDIgLiogMWUzKSwgImdyZWVuIl0sCgkJCQkJWzI2My4wL21heGltdW0ob2JqLlQyIC4qIDFlMyksICJyZWQiXSwKCQkJCV0sCgkJCQljbWluPTAuMCwKCQkJCWNtYXg9MjYzLjAsCgkJCQljb2xvcmJhcj1hdHRyKDt0aWNrc3VmZml4PSJtcyIsIHRpdGxlPSJUMiIpLAoJCQkJc2hvd3NjYWxlPWZhbHNlCgkJCSksCgkJCXNob3dsZWdlbmQ9ZmFsc2UKCQkpCgkpCglyZWxheW91dCEoCgkJcGhhbnRvbV9UMiwKCQl5YXhpc190aXRsZT0iVDIgW21zXSIsCgkJeGF4aXNfdGl0bGU9InggW21tXSIsCgkJeGF4aXNfdGlja21vZGU9ImFycmF5IiwKCQl4YXhpc190aWNrdmFscz1bLTEuNS8yLCAwLjAsIDEuNS8yXSwKCQl5YXhpc190aWNrbW9kZT0iYXJyYXkiLAoJCXlheGlzX3RpY2t2YWxzPXVuaXF1ZShvYmouVDIgKiAxZTMpLAoJCXhheGlzX3JhbmdlPVstMS41LCAxLjVdLAoJCXlheGlzX3JhbmdlPVswLjAsIDMwMC4wXSwKCQl0aXRsZT0iVDIgbWFwIG9mIDFEIFBoYW50b20iCgkpCglbcGhhbnRvbV9UMSBwaGFudG9tX1QyXQplbmSobWV0YWRhdGGDqXNob3dfbG9nc8OoZGlzYWJsZWTCrnNraXBfYXNfc2NyaXB0wqtjb2RlX2ZvbGRlZMPZJGY1N2EyYjZjLWViNGMtNDViZC04MDU4LTRhNjBiMDM4OTI1ZISnY2VsbF9pZNkkZjU3YTJiNmMtZWI0Yy00NWJkLTgwNTgtNGE2MGIwMzg5MjVkpGNvZGXaAzViZWdpbgoJZnVuY3Rpb24gY2FyZGlhY19waGFudG9tKG9mZjsgb2ZmX2ZhdD1mYXRfZnJlcSkKCSAgICBteW9jYXJkID0gUGhhbnRvbXtGbG9hdDY0fSh4PWR4LCDPgT0wLjYqb25lcyhOaXNvKSwgVDE9NzAxZS0zKm9uZXMoTmlzbyksCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDI9NThlLTMqb25lcyhOaXNvKSwgICAgzpR3PTLPgCpvZmYqb25lcyhOaXNvKSkKCSAgICBibG9vZCA9ICAgUGhhbnRvbXtGbG9hdDY0fSh4PWR4LCDPgT0wLjcqb25lcyhOaXNvKSwgVDE9MTEyMmUtMypvbmVzKE5pc28pLAoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQyPTI2M2UtMypvbmVzKE5pc28pLCAgIM6Udz0yz4Aqb2ZmKm9uZXMoTmlzbykpCgkgICAgZmF0MSA9ICAgIFBoYW50b217RmxvYXQ2NH0oeD1keCwgz4E9MS4wKm9uZXMoTmlzbyksIFQxPTE4M2UtMypvbmVzKE5pc28pLAoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQyPTkzZS0zKm9uZXMoTmlzbyksICAgIM6Udz0yz4AqKG9mZl9mYXQgKyBvZmYpKm9uZXMoTmlzbykpCgkgICAgZmF0MiA9ICAgIFBoYW50b217RmxvYXQ2NH0oeD1keCwgz4E9MS4wKm9uZXMoTmlzbyksIFQxPTEzMGUtMypvbmVzKE5pc28pLAoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQyPTkzZS0zKm9uZXMoTmlzbyksICAgIM6Udz0yz4AqKG9mZl9mYXQgKyBvZmYpKm9uZXMoTmlzbykpCgkgICAgb2JqID0gbXlvY2FyZCArIGJsb29kICsgZmF0MSArIGZhdDIKCSAgICByZXR1cm4gb2JqCgllbmQKCW1kIi0gQ2FyZGlhYyBwaGFudG9tIChzaG93L2hpZGUgY29kZSkiCmVuZKhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw9kkOGRkNzA0YTQtYmY1MC00ZGRjLWE4MzItZDA3NGJkNTJhZDAxhKdjZWxsX2lk2SQ4ZGQ3MDRhNC1iZjUwLTRkZGMtYTgzMi1kMDc0YmQ1MmFkMDGkY29kZdmZbWQiVGhyZWUgaGVhcnRiZWF0cyB3ZXJlIGNvbnNpZGVyZWQgdG8gYWNoaWV2ZSBzdGVhZHktc3RhdGUgYW5kIHRoZSBmb3VydGggaGVhcnRiZWF0IHdhcyB1c2VkIHRvIG1lYXN1cmUgdGhlIG1hZ25ldGl6YXRpb24gcmVzdWx0cyBpbiB0aGUgbmV4dCBzZWN0aW9ucy4iqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTD2SQ2Yjg3MDQ0My03YmU1LTQyODctYjk1Ny1jYTVjMTRlZGE4OWOEp2NlbGxfaWTZJDZiODcwNDQzLTdiZTUtNDI4Ny1iOTU3LWNhNWMxNGVkYTg5Y6Rjb2Rl2geYYmVnaW4KCWZ1bmN0aW9uIEZhdFNhdCjOsSwgzpRmOyBzYW1wbGU9ZmFsc2UpCgkgICAgIyBGYXRTYXQgZGVzaWduCgkJIyBjdXRvZmZfZnJlcSA9IHNxcnQobG9nKDIpIC8gMikgLyBhIHdoZXJlIEIxKHQpID0gZXhwKC0oz4AgdCAvIGEpXjIpCgkJY3V0b2ZmID0gZmF0X2ZyZXEgLyDPgCAJCQkgICAgICAjIGN1dG9mZiBbSHpdID0+IOKJiDEvMTAgUkYgcG93ZXIgdG8gd2F0ZXIKCQlhID0gc3FydChsb2coMikgLyAyKSAvIGN1dG9mZiAgICAgICAgICMgYSBbc10KCQnPhCA9IHJhbmdlKC1UZmF0c2F0LzIsIFRmYXRzYXQvMiwgNjQpICMgdGltZSBbc10KCQlnYXVzc19wdWxzZSA9IGV4cC4oLSjPgCAqIM+EIC8gYSkgLl4gMikgIyBCMSh0KSBbVF0KCQkjIEZhdFNhdCBwcmVwdWxzZQoJICAgIHNlcSA9IFNlcXVlbmNlKCkKCSAgICBzZXEgKz0gR3JhZCgtOGUtMywgMzAwMGUtNiwgNTAwZS02KSAjU3BvaWxlcjEKCSAgICBzZXEgKz0gUkYoZ2F1c3NfcHVsc2UsIFRmYXRzYXQsIM6UZikKCSAgICDOsV9yZWYgPSBnZXRfZmxpcF9hbmdsZXMoc2VxKVsyXQoJICAgIHNlcSAqPSAozrEvzrFfcmVmKzBpbSkKCSAgICBpZiBzYW1wbGUKCSAgICAgICAgc2VxICs9IEFEQygxLCAxZS02KQoJICAgIGVuZAoJICAgIHNlcSArPSBHcmFkKDhlLTMsIDMwMDBlLTYsIDUwMGUtNikgI1Nwb2lsZXIyCgkgICAgaWYgc2FtcGxlCgkgICAgICAgIHNlcSArPSBBREMoMSwgMWUtNikKCSAgICBlbmQKCSAgICByZXR1cm4gc2VxCgllbmQKCglmdW5jdGlvbiBUMnByZXAoVEU7IHNhbXBsZT1mYWxzZSkKCSAgICBzZXEgPSBTZXF1ZW5jZSgpCgkgICAgc2VxICs9IFJGKDkwICogQjEsIFRyZikKCSAgICBzZXEgKz0gc2FtcGxlID8gQURDKDIwLCBURS8yIC0gMS41VHJmKSA6IERlbGF5KFRFLzIgLSAxLjVUcmYpCgkgICAgc2VxICs9IFJGKDE4MGltICogQjEgLyAyLCBUcmYqMikKCSAgICBzZXEgKz0gc2FtcGxlID8gQURDKDIwLCBURS8yIC0gMS41VHJmKSA6IERlbGF5KFRFLzIgLSAxLjVUcmYpCgkgICAgc2VxICs9IFJGKC05MCAqIEIxLCBUcmYpCgkgICAgc2VxICs9IEdyYWQoOGUtMywgNjAwMGUtNiwgNjAwZS02KQoJICAgIGlmIHNhbXBsZQoJICAgICAgICBzZXEgKz0gQURDKDEsIDFlLTYpCgkgICAgZW5kCgkgICAgcmV0dXJuIHNlcQoJZW5kCgoJZnVuY3Rpb24gYlNTRlAoaU5BVl9saW5lcywgaW1fc2VnbWVudHMsIGlOQVZfZmxpcF9hbmdsZSwgaW1fZmxpcF9hbmdsZTsgc2FtcGxlPWZhbHNlKQoJICAgIGsgPSAwCgkgICAgc2VxID0gU2VxdWVuY2UoKQoJICAgIGZvciBpID0gMCA6IGlOQVZfbGluZXMgKyBpbV9zZWdtZW50cyAtIDEKCSAgICAgICAgaWYgaU5BVl9saW5lcyAhPSAwCgkgICAgICAgICAgICBtID0gKGltX2ZsaXBfYW5nbGUgLSBpTkFWX2ZsaXBfYW5nbGUpIC8gaU5BVl9saW5lcwoJICAgICAgICAgICAgzrEgPSBtaW4oIG0gKiBpICsgaU5BVl9mbGlwX2FuZ2xlLCBpbV9mbGlwX2FuZ2xlICkgKiAoLTEpXmsKCSAgICAgICAgZWxzZQoJICAgICAgICAgICAgzrEgPSBpbV9mbGlwX2FuZ2xlICogKC0xKV5rCgkgICAgICAgIGVuZAoJICAgICAgICBzZXEgKz0gUkYozrEgKiBCMSwgVHJmKQoJICAgICAgICBpZiBpIDwgaU5BVl9saW5lcyAmJiAhc2FtcGxlCgkgICAgICAgICAgICBzZXEgKz0gRGVsYXkoVFIgLSBUcmYpCgkgICAgICAgIGVsc2UKCSAgICAgICAgICAgIHNlcSArPSBEZWxheShURSAtIFRyZi8yIC0gVGFkYy8yKQoJICAgICAgICAgICAgc2VxICs9IEFEQygxLCBUYWRjKQoJICAgICAgICAgICAgc2VxICs9IERlbGF5KFRSIC0gVEUgLSBUYWRjLzIgLSBUcmYvMikKCSAgICAgICAgZW5kCgkgICAgICAgIGsgKz0gMQoJICAgIGVuZAoJICAgIHJldHVybiBzZXEKCWVuZAoKCW1kIi0gU2VxdWVuY2UgYnVpbGRpbmcgYmxvY2tzOiBgVDJwcmVwYCwgYEZhdFNhdGAsIGBiU1NGUGAgKHNob3cvaGlkZSBjb2RlKSIKZW5kqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTD2SQ3ZGVhZGQ1OC1iMjAyLTQ1MDgtYjRjNy02ODZmNzQyY2I3MTOEp2NlbGxfaWTZJDdkZWFkZDU4LWIyMDItNDUwOC1iNGM3LTY4NmY3NDJjYjcxM6Rjb2Rl2gE/YmVnaW4KCWJlZ2luCgkJdXNpbmcgUGtnCgkJYmVnaW4KCQkgIHByaW50bG4oIk9TICQoQmFzZS5TeXMuTUFDSElORSkiKSAgICAjIE9TCgkJICBwcmludGxuKCJKdWxpYSAkVkVSU0lPTiIpICAgICAgICAgICAgIyBKdWxpYSB2ZXJzaW9uCgkJICAjIEtvbWEgc3ViLXBhY2thZ2VzCgkJICBmb3IgKF8sIHBrZykgaW4gZmlsdGVyKCgoXywgcGtnKSwpIC0+IG9jY3Vyc2luKCJLb21hTVJJIiwgcGtnLm5hbWUpLCBQa2cuZGVwZW5kZW5jaWVzKCkpCgkJICAgIHByaW50bG4oIiQocGtnLm5hbWUpICQocGtnLnZlcnNpb24pIikKCQkgIGVuZAoJCWVuZAoJZW5kCmVuZKhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkw6tub3RlYm9va19pZNkkZWQyN2RlMWEtODFkOS0xMWVmLTNiNzMtMWIxMTYzMTJkYWU3q2luX3RlbXBfZGlywqhtZXRhZGF0YYGrZnJvbnRtYXR0ZXKGpmF1dGhvcpGCpG5hbWW1Q2FybG9zIENhc3RpbGxvIFBhc3Npo3VybNlkaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzU5NTcxMzQ/cz00MDAmdT1mZTYyYTJhODk5Y2VkMThlOGI4ODJjZWJkZTZiMWVlZmU2YTEyMjJjJnY9NKVpbWFnZdlGaHR0cHM6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy9hL2EwL1RleHRmb3JtYXR0aW5nLnN2Z6V0aXRsZbtMb3ctRmllbGQgQ01SQSBPcHRpbWl6YXRpb26kdGFnc5OkQ01SQalMb3cgRmllbGSsT3B0aW1pemF0aW9upGRhdGWqMjAyNC0wNC0xNqtkZXNjcmlwdGlvbtk2T3B0aW1pemluZyBzZXF1ZW5jZSB0byBpbXByb3ZlIFNOUiBhbmQgZmF0IHN1cHJlc3Npb24u";
window.pluto_preamble_html = undefined;
diff --git a/dev/tutorial-pluto/02-low-field-cmra-optimization/index.html b/dev/tutorial-pluto/02-low-field-cmra-optimization/index.html
index 1aad75648..cbdd85f21 100644
--- a/dev/tutorial-pluto/02-low-field-cmra-optimization/index.html
+++ b/dev/tutorial-pluto/02-low-field-cmra-optimization/index.html
@@ -1,2 +1,2 @@
-Low-Field CMRA Optimization · KomaMRI.jl
Theme
Automatic (OS) documenter-light documenter-dark catppuccin-latte catppuccin-frappe catppuccin-macchiato catppuccin-mocha
This document was generated with Documenter.jl version 1.7.0 on Thursday 3 October 2024 . Using Julia version 1.10.5.
+Low-Field CMRA Optimization · KomaMRI.jl
Theme
Automatic (OS) documenter-light documenter-dark catppuccin-latte catppuccin-frappe catppuccin-macchiato catppuccin-mocha
This document was generated with Documenter.jl version 1.7.0 on Thursday 3 October 2024 . Using Julia version 1.10.5.
diff --git a/dev/tutorial-pluto/03-low-field-boost-optimization.html b/dev/tutorial-pluto/03-low-field-boost-optimization.html
new file mode 100644
index 000000000..7cc58d405
--- /dev/null
+++ b/dev/tutorial-pluto/03-low-field-boost-optimization.html
@@ -0,0 +1,26 @@
+Low-Field CMRA Optimization
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/dev/tutorial-pluto/03-low-field-boost-optimization.jl b/dev/tutorial-pluto/03-low-field-boost-optimization.jl
new file mode 100644
index 000000000..5397af1de
--- /dev/null
+++ b/dev/tutorial-pluto/03-low-field-boost-optimization.jl
@@ -0,0 +1,2384 @@
+### A Pluto.jl notebook ###
+# v0.19.46
+
+#> [frontmatter]
+#> image = "https://upload.wikimedia.org/wikipedia/commons/a/a0/Textformatting.svg"
+#> title = "Low-Field CMRA Optimization"
+#> tags = ["CMRA", "Low Field", "Optimization"]
+#> date = "2024-04-16"
+#> description = "Optimizing sequence to improve SNR and fat supression."
+#>
+#> [[frontmatter.author]]
+#> name = "Carlos Castillo Passi"
+#> url = "https://avatars.githubusercontent.com/u/5957134?s=400&u=fe62a2a899ced18e8b882cebde6b1eefe6a1222c&v=4"
+
+using Markdown
+using InteractiveUtils
+
+# ╔═╡ 7deadd58-b202-4508-b4c7-686f742cb713
+begin
+ begin
+ using Pkg
+ begin
+ println("OS $(Base.Sys.MACHINE)") # OS
+ println("Julia $VERSION") # Julia version
+ # Koma sub-packages
+ for (_, pkg) in filter(((_, pkg),) -> occursin("KomaMRI", pkg.name), Pkg.dependencies())
+ println("$(pkg.name) $(pkg.version)")
+ end
+ end
+ end
+end
+
+# ╔═╡ 0b7a405e-bbb5-11ee-05ca-4b1c8567398d
+using KomaMRICore, KomaMRIPlots, PlutoPlotly # Essentials
+
+# ╔═╡ 70dbc2bd-8b93-471d-8340-04d98a008ca6
+using Suppressor, PlutoUI, ProgressLogging # Extras
+
+# ╔═╡ a99c0c47-1b70-4362-a2f6-a7e3259606fa
+md"""# Low-Field BOOST Optimization
+
+This notebook reproduces the simulation experiments performed in our manuscript:
+
+> **"Simultaneous iNAV-Based 3D Whole-Heart Bright-Blood and Black-Blood Imaging at 0.55T"**
+>
+> **Carlos Castillo-Passi**, Karl P. Kunze, Michael G. Crabb, Camila Muñoz, Anastasia Fotaki, Radhouene Neji, Pablo Irarrazaval, Claudia Prieto, and René M. Botnar
+>
+> (2024)
+
+Submitted to Magnetic Resonance in Medicine (MRM).
+"""
+
+# ╔═╡ 1bb3e49b-1a19-4343-ac09-fbaf1cae4ba3
+TableOfContents()
+
+# ╔═╡ fc58640b-c44c-4c25-a4fd-5a0e17d7becd
+md"# 1. Simulation setup"
+
+# ╔═╡ dbf16676-64f2-4d9b-bf1b-8de06b048602
+md"## 1.1. Loading required packages"
+
+# ╔═╡ f49655cc-460e-4981-92ea-dfd6147308bf
+md"Bloch simulations were performed using **KomaMRI.jl** to optimize the proposed whole-heart BOOST parameters."
+
+# ╔═╡ 77153e5c-71bd-42e3-bae9-e4811ffa7a3d
+md"""## 1.2. Scanner
+
+We start by defining the hardware characteristics. The `sys.B0` will be used to calculate the off-resonance of fat."""
+
+# ╔═╡ 9e397426-b60b-4b98-be8b-f7f128621c44
+begin
+ sys = Scanner()
+ sys.B0 = 0.55
+ sys.Gmax = 40.0e-3
+ sys.Smax = 25.0
+ sys
+end
+
+# ╔═╡ 92194fcb-582a-49ce-aad7-20b0145d40d3
+md"## 1.3. Sequence"
+
+# ╔═╡ ae72ffc5-7f8e-4907-a99e-8ad7cb8fddab
+md"""
+The BOOST sequence (`BOOST`) consists of:
+"""
+
+# ╔═╡ cb659118-9f22-43c3-801d-49241dee4df6
+begin
+ # General sequence parameters
+ Trf = 500e-6 # 500 [ms]
+ B1 = 1 / (360*γ*Trf) # B1 amplitude [uT]
+ Tadc = 1e-6 # 1us
+
+ # Prepulses
+ Tfatsat = 26.624e-3 # 26.6 [ms]
+ T2prep_duration = 50e-3 # 50 [ms]
+
+ # Acquisition
+ RR = 1.0 # 1 [s]
+ dummy_heart_beats = 3 # Steady-state
+ TR = 5.3e-3 # 5.3 [ms] RF Low SAR
+ TE = TR / 2 # bSSFP condition
+ iNAV_lines = 6 # FatSat-Acq delay: iNAV_lines * TR
+ iNAV_flip_angle = 3.2 # 3.2 [deg]
+ im_segments = 20 # Acquisitino window: im_segments * TR
+
+ # To be optimized
+ im_flip_angle = [110, 80] # 80 [deg]
+ FatSat_flip_angle = 180 # 180 [deg]
+ IR_inversion_time = 90e-3 # 90 [ms]
+
+ seq_params = (;
+ dummy_heart_beats,
+ iNAV_lines,
+ im_segments,
+ iNAV_flip_angle,
+ im_flip_angle,
+ T2prep_duration,
+ IR_inversion_time,
+ FatSat_flip_angle,
+ RR
+ )
+
+ seq_params
+end
+
+# ╔═╡ 42417eba-46e0-400e-a874-299533362c41
+md"Below we are showing the **bright-blood contrast** (containing a T2p-IR pulse):"
+
+# ╔═╡ 4aab8a6f-d2ba-46f0-a1bf-ddc0dcf8437f
+md"and **reference contrast** (only containing a FatSat pulse), later used to obtain the black-blood contrast by subtracting the bright-blood contrast. Note that this contrast has a different flip angle."
+
+# ╔═╡ a15d6b64-f8ee-4ee4-812c-d49cf5ea784d
+md"""
+## 1.4. Phantom
+Each tissue was represented with 200 isochromats distributed along the $z$-axis to simulate gradient spoiling effects. The isochromats for each tissue were inside a 1D voxel of size $1.5\,\mathrm{mm}$. The values for $T_1$ and $T_2$ for blood, myocardial muscle, and fat at 0.55T were obtained from the work of Campbell-Washburn, et al. Fat spins were simulated using a chemical shift of $-3.4\,\mathrm{ppm}$, simulating regular fat with $T_1=183\,\mathrm{ms}$, and fast-recovering fat with $T_1=130\,\mathrm{ms}$.
+"""
+
+# ╔═╡ f0a81c9f-5616-4663-948f-a4084e1719af
+begin
+ fat_ppm = -3.4e-6 # -3.4ppm fat-water frequency shift
+ Niso = 200 # 200 isochromats in spoiler direction
+ Δx_voxel = 1.5e-3 # 1.5 [mm]
+ fat_freq = γ*sys.B0*fat_ppm # -80 [Hz]
+ dx = Array(range(-Δx_voxel/2, Δx_voxel/2, Niso))
+ md"- Phantom parameters (show/hide code)"
+end
+
+# ╔═╡ 6b870443-7be5-4287-b957-ca5c14eda89c
+begin
+ function FatSat(α, Δf; sample=false)
+ # FatSat design
+ # cutoff_freq = sqrt(log(2) / 2) / a where B1(t) = exp(-(π t / a)^2)
+ cutoff = fat_freq / π # cutoff [Hz] => ≈1/10 RF power to water
+ a = sqrt(log(2) / 2) / cutoff # a [s]
+ τ = range(-Tfatsat/2, Tfatsat/2, 64) # time [s]
+ gauss_pulse = exp.(-(π * τ / a) .^ 2) # B1(t) [T]
+ # FatSat prepulse
+ seq = Sequence()
+ seq += Grad(-8e-3, 3000e-6, 500e-6) #Spoiler1
+ seq += RF(gauss_pulse, Tfatsat, Δf)
+ α_ref = get_flip_angles(seq)[2]
+ seq *= (α/α_ref+0im)
+ if sample
+ seq += ADC(1, 1e-6)
+ end
+ seq += Grad(8e-3, 3000e-6, 500e-6) #Spoiler2
+ if sample
+ seq += ADC(1, 1e-6)
+ end
+ return seq
+ end
+
+ function T2prep(TE; sample=false)
+ seq = Sequence()
+ seq += RF(90 * B1, Trf)
+ seq += sample ? ADC(20, TE/2 - 1.5Trf) : Delay(TE/2 - 1.5Trf)
+ seq += RF(180im * B1 / 2, Trf*2)
+ seq += sample ? ADC(20, TE/2 - 1.5Trf) : Delay(TE/2 - 1.5Trf)
+ seq += RF(-90 * B1, Trf)
+ seq += Grad(8e-3, 6000e-6, 600e-6) #Spoiler3
+ if sample
+ seq += ADC(1, 1e-6)
+ end
+ return seq
+ end
+
+ function IR(IR_delay; sample=false)
+ # Generating HS pulse
+ # Based on: https://onlinelibrary.wiley.com/doi/epdf/10.1002/jmri.26021
+ # Params
+ flip_angle = 900; # Peak amplitude (deg)
+ Trf = 10240e-6; # Pulse duration (ms)
+ β = 6.7e2; # frequency modulation param (rad/s)
+ μ = 5; # phase modulation parameter (dimensionless)
+ fmax = μ * β / (2π); # 2fmax = BW
+ # RF pulse
+ t = range(-Trf/2, Trf/2, 201);
+ B1 = sech.(β .* t);
+ Δf = fmax .* tanh.(β .* t);
+ # Spoiler length
+ spoiler_time = 6000e-6
+ spoiler_rise_fall = 600e-6
+ # Prepulse
+ seq = Sequence()
+ seq += RF(B1, Trf, Δf) # FM modulated pulse
+ seq = (flip_angle / get_flip_angles(seq)[1] + 0.0im) * seq # RF scaling
+ seq += Grad(8e-3, spoiler_time, spoiler_rise_fall) #Spoiler3
+ if sample
+ seq += ADC(11, IR_delay - spoiler_time - 2spoiler_rise_fall)
+ else
+ seq += Delay(IR_delay - spoiler_time - 2spoiler_rise_fall)
+ end
+ return seq
+ end
+
+ function bSSFP(iNAV_lines, im_segments, iNAV_flip_angle, im_flip_angle; sample=false)
+ k = 0
+ seq = Sequence()
+ for i = 0 : iNAV_lines + im_segments - 1
+ if iNAV_lines != 0
+ m = (im_flip_angle - iNAV_flip_angle) / iNAV_lines
+ α = min( m * i + iNAV_flip_angle, im_flip_angle ) * (-1)^k
+ else
+ α = im_flip_angle * (-1)^k
+ end
+ seq += RF(α * B1, Trf)
+ if i < iNAV_lines && !sample
+ seq += Delay(TR - Trf)
+ else
+ seq += Delay(TE - Trf/2 - Tadc/2)
+ seq += ADC(1, Tadc)
+ seq += Delay(TR - TE - Tadc/2 - Trf/2)
+ end
+ k += 1
+ end
+ return seq
+ end
+
+ md"- Sequence building blocks: `T2prep`, `IR`, `FatSat`, `bSSFP` (show/hide code)"
+end
+
+# ╔═╡ 7890f81e-cb15-48d2-a80c-9d73f9516056
+begin
+ function BOOST(
+ dummy_heart_beats,
+ iNAV_lines,
+ im_segments,
+ iNAV_flip_angle,
+ im_flip_angle,
+ T2prep_duration=50e-3,
+ IR_inversion_time=90e-3,
+ FatSat_flip_angle=180,
+ RR=1.0;
+ sample_recovery=zeros(Bool, dummy_heart_beats+1)
+ )
+ # Seq init
+ seq = Sequence()
+ for hb = 1 : dummy_heart_beats + 1
+ sample = sample_recovery[hb] # Sampling recovery curve for hb
+ # Generating seq blocks
+ t2p = T2prep(T2prep_duration; sample)
+ ir = IR(IR_inversion_time - iNAV_lines * TR - Trf - TE; sample)
+ fatsat = FatSat(FatSat_flip_angle, fat_freq; sample)
+ # Magnetization preparations
+ for contrast = 1:2
+ preps = Sequence()
+ if contrast == 1 # Bright-blood contrast
+ preps += t2p
+ preps += ir
+ else # Reference contrast
+ preps += fatsat
+ end
+ # Contrst dependant flip angle
+ bssfp = bSSFP(iNAV_lines, im_segments, iNAV_flip_angle,
+ im_flip_angle[contrast]; sample)
+ # Concatenating seq blocks
+ seq += preps
+ seq += bssfp
+ # RR interval consideration
+ RRdelay = RR - dur(bssfp) - dur(preps)
+ seq += sample ? ADC(80, RRdelay) : Delay(RRdelay)
+ end
+ end
+ return seq
+ end
+
+ md"""- `BOOST` (show/hide code)
+
+ ```julia
+ # Seq init
+ seq = Sequence()
+ for hb = 1 : dummy_heart_beats + 1
+ # Generating seq blocks
+ t2p = T2prep(T2prep_duration)
+ ir = IR(IR_inversion_time)
+ fatsat = FatSat(FatSat_flip_angle, fat_freq)
+ # Magnetization preparations
+ for contrast = 1:2
+ preps = Sequence()
+ if contrast == 1 # Bright-blood contrast
+ preps += t2p
+ preps += ir
+ else # Reference contrast
+ preps += fatsat
+ end
+ # Contrst dependant flip angle
+ bssfp = bSSFP(iNAV_lines, im_segments, iNAV_flip_angle,
+ im_flip_angle[contrast]; sample)
+ # Concatenating seq blocks
+ seq += preps
+ seq += bssfp
+ # RR interval consideration
+ RRdelay = RR - dur(bssfp) - dur(preps)
+ seq += Delay(RRdelay)
+ end
+ end
+ ```"""
+end
+
+# ╔═╡ f57a2b6c-eb4c-45bd-8058-4a60b038925d
+begin
+ function cardiac_phantom(off; off_fat=fat_freq)
+ myocard = Phantom{Float64}(x=dx, ρ=0.6*ones(Niso), T1=701e-3*ones(Niso),
+ T2=58e-3*ones(Niso), Δw=2π*off*ones(Niso))
+ blood = Phantom{Float64}(x=dx, ρ=0.7*ones(Niso), T1=1122e-3*ones(Niso),
+ T2=263e-3*ones(Niso), Δw=2π*off*ones(Niso))
+ fat1 = Phantom{Float64}(x=dx, ρ=1.0*ones(Niso), T1=183e-3*ones(Niso),
+ T2=93e-3*ones(Niso), Δw=2π*(off_fat + off)*ones(Niso))
+ fat2 = Phantom{Float64}(x=dx, ρ=1.0*ones(Niso), T1=130e-3*ones(Niso),
+ T2=93e-3*ones(Niso), Δw=2π*(off_fat + off)*ones(Niso))
+ obj = myocard + blood + fat1 + fat2
+ return obj
+ end
+ md"- Cardiac phantom (show/hide code)"
+end
+
+# ╔═╡ f21e9e59-25c3-4f06-8de4-792cb305eb01
+md"""# 2. Simulation
+
+Two simulation experiments were performed to optimize the sequence parameters, (1) to optimize the imaging flip angle, and (2) to optimize the FatSat flip angle.
+
+"""
+
+# ╔═╡ eceb326a-cab6-465e-8e5c-e835881bd3b0
+md"""
+## 2.0. Magnetization dynamics
+"""
+
+# ╔═╡ d54d6807-444f-4e0e-8fd6-84457974115a
+md"Here we show the magnetization dynamics of the myocardium, blood, and fat signals at 0.55T."
+
+# ╔═╡ d05dcba7-2f42-47bf-a172-6123d0113b3f
+sim_params = Dict{String,Any}(
+ "return_type"=>"mat",
+ "sim_method"=>BlochDict(save_Mz=true),
+ "Δt_rf"=>Trf,
+ "gpu"=>false,
+ "Nthreads"=>1
+)
+
+# ╔═╡ 37f7fd7f-5cb1-48b5-b877-b2bc23a1e7dd
+begin
+ seq = BOOST(seq_params...; sample_recovery=ones(Bool, dummy_heart_beats+1))
+ obj = cardiac_phantom(0)
+ magnetization = @suppress simulate(obj, seq, sys; sim_params)
+ nothing # hide output
+end
+
+# ╔═╡ 0b6c1f72-b040-483c-969b-88bfe09b32c3
+plot_seq(seq; range=[5990, 6280], slider=true)
+
+# ╔═╡ 88eb41a5-d8c2-4f0e-b379-a8b05a341a82
+plot_seq(seq; range=[6900, 7190], slider=true)
+
+# ╔═╡ 1a62ae71-58db-49ea-ae6a-9aea66145963
+begin
+ phantom_T1 = plot(
+ scatter(
+ x=obj.x * 1e3,
+ y=obj.T1 * 1e3,
+ mode="markers",
+ marker=attr(;
+ color=obj.T1 * 1e3,
+ colorscale=[
+ [0.0, "black"],
+ [183.0/maximum(obj.T1 .* 1e3), "green"],
+ [701.0/maximum(obj.T1 .* 1e3), "blue"],
+ [1122.0/maximum(obj.T1 .* 1e3), "red"],
+ ],
+ cmin=0.0,
+ cmax=1122.0,
+ colorbar=attr(;ticksuffix="ms", title="T1"),
+ showscale=false
+ ),
+ showlegend=false
+ )
+ )
+ relayout!(
+ phantom_T1,
+ yaxis_title="T1 [ms]",
+ xaxis_title="x [mm]",
+ xaxis_tickmode="array",
+ xaxis_tickvals=[-1.5/2, 0.0, 1.5/2],
+ yaxis_tickmode="array",
+ yaxis_tickvals=unique(obj.T1 * 1e3),
+ xaxis_range=[-1.5, 1.5],
+ yaxis_range=[0.0, 1200.0],
+ title="T1 map of 1D Phantom"
+ )
+ phantom_T2 = plot(
+ scatter(
+ x=obj.x * 1e3,
+ y=obj.T2 * 1e3,
+ mode="markers",
+ marker=attr(;
+ color=obj.T2 * 1e3,
+ colorscale=[
+ [0.0, "black"],
+ [58.0/maximum(obj.T2 .* 1e3), "blue"],
+ [93.0/maximum(obj.T2 .* 1e3), "green"],
+ [263.0/maximum(obj.T2 .* 1e3), "red"],
+ ],
+ cmin=0.0,
+ cmax=263.0,
+ colorbar=attr(;ticksuffix="ms", title="T2"),
+ showscale=false
+ ),
+ showlegend=false
+ )
+ )
+ relayout!(
+ phantom_T2,
+ yaxis_title="T2 [ms]",
+ xaxis_title="x [mm]",
+ xaxis_tickmode="array",
+ xaxis_tickvals=[-1.5/2, 0.0, 1.5/2],
+ yaxis_tickmode="array",
+ yaxis_tickvals=unique(obj.T2 * 1e3),
+ xaxis_range=[-1.5, 1.5],
+ yaxis_range=[0.0, 300.0],
+ title="T2 map of 1D Phantom"
+ )
+ [phantom_T1 phantom_T2]
+end
+
+# ╔═╡ d9715bc1-49cd-4df8-8dbf-c06de42ad550
+begin
+ # Prep plots
+ labs = ["Myocardium", "Blood", "Fat"]
+ cols = ["blue", "red", "green"]
+ spin_group = [(1:Niso)', (Niso+1:2Niso)', (2Niso+1:3Niso)']
+ t = KomaMRICore.get_adc_sampling_times(seq)
+ Mxy(i) = abs.(sum(magnetization[:,spin_group[i],1,1][:,1,:],dims=2)[:]/length(spin_group[i]))
+ Mz(i) = real.(sum(magnetization[:,spin_group[i],2,1][:,1,:],dims=2)[:]/length(spin_group[i]))
+
+ # Plot
+ p0 = make_subplots(
+ rows=2,
+ cols=1,
+ subplot_titles=["Mxy" "Mz" "Sequence"],
+ shared_xaxes=true,
+ vertical_spacing=0.1
+ )
+ for i=eachindex(spin_group)
+ p1 = scatter(
+ x=t, y=Mxy(i),
+ name=labs[i],
+ legendgroup=labs[i],
+ marker_color=cols[i]
+ )
+ p2 = scatter(
+ x=t,
+ y=Mz(i),
+ name=labs[i],
+ legendgroup=labs[i],
+ showlegend=false,
+ marker_color=cols[i]
+ )
+ add_trace!(p0, p1, row=1, col=1)
+ add_trace!(p0, p2, row=2, col=1)
+ end
+ relayout!(p0,
+ yaxis_range=[0, 0.4],
+ xaxis_range=[RR*dummy_heart_beats, RR*dummy_heart_beats+.250]
+ )
+ p0
+end
+
+# ╔═╡ 8dd704a4-bf50-4ddc-a832-d074bd52ad01
+md"Three heartbeats per contrast were considered to achieve steady-state and the fourth heartbeat for each contrast was used to measure the magnetization results in the next sections."
+
+# ╔═╡ 39f44025-2974-4c4c-b0c2-e21399bbdb1f
+md"""
+## 2.1. Reference contrast SNR: Flip angle optimization
+
+For the first simulation experiment, SNR was maximized by varying the imaging flip angle (between 20 and 180 deg). To optimize SNR independently of heart rate, multiple heart rates (between 55 and 85 bpm) were simulated and the mean and standard deviation of the obtained blood signal were calculated.
+"""
+
+# ╔═╡ 7b9ae381-d0fc-4d1d-b1ee-ad31a6445ff6
+begin
+ FAs = 20:10:180 # flip angle [deg]
+ RRs = 60 ./ (55:10:85) # RR [s]
+ mag1 = zeros(ComplexF64, im_segments, Niso*4, length(FAs), length(RRs))
+ @progress for (m, RR) = enumerate(RRs), (n, α) = enumerate(FAs)
+ seq_params1 = merge(seq_params, (; im_flip_angle=[110, α], RR))
+ sim_params1 = merge(sim_params, Dict("sim_method"=>BlochDict()))
+ seq1 = BOOST(seq_params1...)
+ obj1 = cardiac_phantom(0)
+ magaux = @suppress simulate(obj1, seq1, sys; sim_params=sim_params1)
+ mag1[:, :, n, m] .= magaux[end-im_segments+1:end, :] # Last heartbeat
+ end
+end
+
+# ╔═╡ d0377f9a-680d-4501-90ca-9ea3ab681db4
+md"""## 2.2. Reference contrast fat: FatSat flip angle optimization
+
+For the second simulation experiment, the fat signal was minimized by varying the FatSat flip angle (between 20 and 250 deg) using six iNAV readouts (identified experimentally to result in good fat suppression). To be robust to $B_0$ inhomogeneities, multiple simulations with tissue frequency shifts (between $-1$ and $1\,\mathrm{ppm}$, twice of what was reported by Restivo et al.) were performed, and the mean and standard deviation of the obtained fat signal were calculated."""
+
+# ╔═╡ d750cd5a-3c90-41ea-9942-5723a21da60a
+begin
+ FFAs = 20:20:250 # flip angle [deg]
+ Δfs = (-1:0.2:1) .* (γ * sys.B0 * 1e-6) # off-resonance Δf [s]
+ mag2 = zeros(ComplexF64, im_segments, Niso*4, length(FFAs), length(Δfs))
+ @progress for (m, Δf) = enumerate(Δfs), (n, FatSat_flip_angle) = enumerate(FFAs)
+ seq_params2 = merge(seq_params, (; FatSat_flip_angle))
+ sim_params2 = merge(sim_params, Dict("sim_method"=>BlochDict()))
+ seq2 = BOOST(seq_params2...)
+ obj2 = cardiac_phantom(Δf)
+ magaux = @suppress simulate(obj2, seq2, sys; sim_params=sim_params2)
+ mag2[:, :, n, m] .= magaux[end-im_segments+1:end, :] # Last heartbeat
+ end
+end
+
+# ╔═╡ b0b53632-e6b8-47e9-8d3e-79f1e599315a
+md" ## 2.3. Bright-blood SNR:"
+
+# ╔═╡ 14cf6859-a4b9-4671-b022-659781c55144
+begin
+ mag4 = zeros(ComplexF64, im_segments, Niso*4, length(FAs), length(RRs))
+ @progress for (m, RR) = enumerate(RRs), (n, α) = enumerate(FAs)
+ seq_params4 = merge(seq_params, (; im_flip_angle=[α, 80], RR))
+ sim_params4 = merge(sim_params, Dict("sim_method"=>BlochDict()))
+ seq4 = BOOST(seq_params4...)
+ obj4 = cardiac_phantom(0)
+ magaux = @suppress simulate(obj4, seq4, sys; sim_params=sim_params4)
+ mag4[:, :, n, m] .= magaux[end-2im_segments+1:end-im_segments, :] # Bright-Blood
+ end
+end
+
+# ╔═╡ c64d38cb-2433-4b90-abbf-1fc938f70584
+md"## 2.4. Bright-Blood fat: Inversion delay"
+
+# ╔═╡ c952ecf1-25ef-4b48-9c8f-e53ded302629
+begin
+ TIs = (50:10:130) # Inversion delay [ms]
+ mag3 = zeros(ComplexF64, im_segments, Niso*4, length(TIs), length(Δfs))
+ @progress for (m, Δf) = enumerate(Δfs), (n, TI) = enumerate(TIs)
+ seq_params3 = merge(seq_params, (; IR_inversion_time=TI * 1e-3, RR))
+ sim_params3 = merge(sim_params, Dict("sim_method"=>BlochDict()))
+ seq3 = BOOST(seq_params3...)
+ obj3 = cardiac_phantom(Δf)
+ magaux = @suppress simulate(obj3, seq3, sys; sim_params=sim_params3)
+ mag3[:, :, n, m] .= magaux[end-2im_segments+1:end-im_segments, :] # Bright-Blood
+ end
+end
+
+# ╔═╡ 85834365-238b-4193-a0c0-d1859416ab6c
+md" ## 2.5. Bright-blood contrast: T2prep duration"
+
+# ╔═╡ 50b551d8-a212-4319-b25b-1f8ecdd2a491
+begin
+ T2ps = (20:10:80) # T2prep duration [ms]
+ mag5bb = zeros(ComplexF64, im_segments, Niso*4, length(T2ps), length(RRs))
+ mag5rf = zeros(ComplexF64, im_segments, Niso*4, length(T2ps), length(RRs))
+ @progress for (m, RR) = enumerate(RRs), (n, T2p) = enumerate(T2ps)
+ seq_params5 = merge(seq_params, (; T2prep_duration=T2p * 1e-3, RR))
+ sim_params5 = merge(sim_params, Dict("sim_method"=>BlochDict()))
+ seq5 = BOOST(seq_params5...)
+ obj5 = cardiac_phantom(0)
+ magaux = @suppress simulate(obj5, seq5, sys; sim_params=sim_params5)
+ # Bright-Blood
+ mag5bb[:, :, n, m] .= magaux[end-2im_segments+1:end-im_segments, :]
+ # Reference contrast
+ mag5rf[:, :, n, m] .= magaux[end-im_segments+1:end, :]
+ end
+end
+
+# ╔═╡ 4b1dc8bf-feb1-42b4-94f7-1b27975d944c
+md"## 2.6. Black-blood contrast: T2prep duration"
+
+# ╔═╡ 8dc11175-ebc8-407a-ab0b-6d543f849a72
+begin
+ # Labels
+ labels = ["Myocardium", "Blood", "Fat (T₁=183 ms)", "Fat (T₁=130 ms)"]
+ colors = ["blue", "red", "green", "purple"]
+ spins = [(1:Niso)', ((Niso + 1):(2Niso))', ((2Niso + 1):(3Niso))', ((3Niso + 1):(4Niso))']
+ mean(x, dim) = sum(x; dims=dim) / size(x, dim)
+ std(x, dim; mu=mean(x, dim)) = sqrt.(sum(abs.(x .- mu) .^ 2; dims=dim) / (size(x, dim) - 1))
+ md"Aux functions (show/hide code)"
+end
+
+# ╔═╡ f73082ff-a6d3-41f8-8796-4114fa89d2bb
+begin
+ # Reducing tissues's signal
+ signal_myoc = reshape(
+ mean(abs.(mean(mag1[:, spins[1], :, :], 3)), 1), length(FAs), length(RRs)
+ )
+ signal_bloo = reshape(
+ mean(abs.(mean(mag1[:, spins[2], :, :], 3)), 1), length(FAs), length(RRs)
+ )
+ diff_bloo_myoc = abs.(signal_bloo .- signal_myoc)
+ # Mean
+ mean_myoc = mean(signal_myoc, 2)
+ mean_bloo = mean(signal_bloo, 2)
+ mean_diff = mean(diff_bloo_myoc,2)
+ # Std
+ std_myoc = std(signal_myoc, 2)
+ std_bloo = std(signal_bloo, 2)
+ std_diff = std(diff_bloo_myoc,2)
+ # Plotting results
+ # Mean
+ s1 = scatter(;
+ x=FAs,
+ y=mean_myoc[:],
+ name=labels[1],
+ legendgroup=labels[1],
+ line=attr(; color=colors[1]),
+ )
+ s2 = scatter(;
+ x=FAs,
+ y=mean_bloo[:],
+ name=labels[2],
+ legendgroup=labels[2],
+ line=attr(; color=colors[2]),
+ )
+ s3 = scatter(;
+ x=FAs,
+ y=mean_diff[:],
+ name="|Blood-Myoc|",
+ legendgroup="|Blood-Myoc|",
+ line=attr(color=colors[4])
+ )
+ # Std
+ s4 = scatter(;
+ x=[FAs; reverse(FAs)],
+ y=[(mean_myoc .- std_myoc)[:]; reverse((mean_myoc .+ std_myoc)[:])],
+ name=labels[1],
+ legendgroup=labels[1],
+ showlegend=false,
+ fill="toself",
+ fillcolor="rgba(0,0,255,0.2)",
+ line=attr(; color="rgba(0,0,0,0)"),
+ hoverinfo="none"
+ )
+ s5 = scatter(;
+ x=[FAs; reverse(FAs)],
+ y=[(mean_bloo .- std_bloo)[:]; reverse((mean_bloo .+ std_bloo)[:])],
+ name=labels[2],
+ legendgroup=labels[2],
+ showlegend=false,
+ fill="toself",
+ fillcolor="rgba(255,0,0,0.2)",
+ line=attr(; color="rgba(0,0,0,0)"),
+ hoverinfo="none"
+ )
+ s6 = scatter(;
+ x=[FAs; reverse(FAs)],
+ y=[(mean_diff .- std_diff)[:]; reverse((mean_diff .+ std_diff)[:])],
+ name="|Blood-Myoc|",legendgroup="|Blood-Myoc|",
+ showlegend=false,
+ fill="toself",
+ fillcolor="rgba(255,0,255,0.2)",
+ line=attr(color="rgba(0,0,0,0)"),
+ hoverinfo="none"
+ )
+ # Plots
+ fig = plot([s1, s2, s3, s4, s5, s6])
+ relayout!(
+ fig;
+ yaxis=attr(; title="Signal [a.u.]", tickmode="array"),
+ xaxis=attr(;
+ title="Flip angle [deg]",
+ tickmode="array",
+ tickvals=[FAs[1], 80, 110, 130, FAs[end]],
+ constrain="domain",
+ ),
+ font=attr(; family="CMU Serif", size=16, scaleanchor="x", scaleratio=1),
+ yaxis_range=[0, 0.3],
+ xaxis_range=[FAs[1], FAs[end]],
+ width=600,
+ height=400,
+ hovermode="x unified",
+ )
+ fig
+end
+
+# ╔═╡ 44a31057-7b34-4c80-a273-6621c0773dc7
+begin
+ ## Calculating results
+ signal_myoc2 = reshape(
+ mean(abs.(mean(mag2[:, spins[1], :, :], 3)), 1), length(FFAs), length(Δfs)
+ )
+ signal_bloo2 = reshape(
+ mean(abs.(mean(mag2[:, spins[2], :, :], 3)), 1), length(FFAs), length(Δfs)
+ )
+ signal_fat2 = reshape(
+ mean(abs.(mean(mag2[:, spins[3], :, :], 3)), 1), length(FFAs), length(Δfs)
+ )
+ signal_fat22 = reshape(
+ mean(abs.(mean(mag2[:, spins[4], :, :], 3)), 1), length(FFAs), length(Δfs)
+ )
+ mean_myoc2 = mean(signal_myoc2, 2)
+ mean_bloo2 = mean(signal_bloo2, 2)
+ mean_fat2 = mean(signal_fat2, 2)
+ mean_fat22 = mean(signal_fat22, 2)
+ std_myoc2 = std(signal_myoc2, 2)
+ std_bloo2 = std(signal_bloo2, 2)
+ std_fat2 = std(signal_fat2, 2)
+ std_fat22 = std(signal_fat22, 2)
+ # Plotting results
+ # Mean
+ s12 = scatter(;
+ x=FFAs,
+ y=mean_myoc2[:],
+ name=labels[1],
+ legendgroup=labels[1],
+ line=attr(; color=colors[1]),
+ )
+ s22 = scatter(;
+ x=FFAs,
+ y=mean_bloo2[:],
+ name=labels[2],
+ legendgroup=labels[2],
+ line=attr(; color=colors[2]),
+ )
+ s32 = scatter(;
+ x=FFAs,
+ y=mean_fat2[:],
+ name=labels[3],
+ legendgroup=labels[3],
+ line=attr(; color=colors[3]),
+ )
+ s52 = scatter(;
+ x=FFAs,
+ y=mean_fat22[:],
+ name=labels[4],
+ legendgroup=labels[4],
+ line=attr(; color=colors[3], dash="dash"),
+ )
+ # Std
+ s42 = scatter(;
+ x=[FFAs; reverse(FFAs)],
+ y=[(mean_myoc2 .- std_myoc2)[:]; reverse((mean_myoc2 .+ std_myoc2)[:])],
+ name=labels[1],
+ legendgroup=labels[1],
+ showlegend=false,
+ fill="toself",
+ fillcolor="rgba(0,0,255,0.2)",
+ line=attr(; color="rgba(0,0,0,0)"),
+ hoverinfo="none",
+ )
+ s62 = scatter(;
+ x=[FFAs; reverse(FFAs)],
+ y=[(mean_bloo2 .- std_bloo2)[:]; reverse((mean_bloo2 .+ std_bloo2)[:])],
+ name=labels[2],
+ legendgroup=labels[2],
+ showlegend=false,
+ fill="toself",
+ fillcolor="rgba(255,0,0,0.2)",
+ line=attr(; color="rgba(0,0,0,0)"),
+ hoverinfo="none",
+ )
+ s72 = scatter(;
+ x=[FFAs; reverse(FFAs)],
+ y=[(mean_fat2 .- std_fat2)[:]; reverse((mean_fat2 .+ std_fat2)[:])],
+ name=labels[3],
+ legendgroup=labels[3],
+ showlegend=false,
+ fill="toself",
+ fillcolor="rgba(0,255,0,0.2)",
+ line=attr(; color="rgba(0,0,0,0)"),
+ hoverinfo="none",
+ )
+ s82 = scatter(;
+ x=[FFAs; reverse(FFAs)],
+ y=[(mean_fat22 .- std_fat22)[:]; reverse((mean_fat22 .+ std_fat22)[:])],
+ name=labels[4],
+ legendgroup=labels[4],
+ showlegend=false,
+ fill="toself",
+ fillcolor="rgba(0,255,0,0.2)",
+ line=attr(; color="rgba(0,0,0,0)"),
+ hoverinfo="none",
+ )
+ # Plots
+ fig2 = plot([s12, s22, s32, s42, s52, s62, s72, s82])
+ relayout!(
+ fig2;
+ yaxis=attr(; title="Signal [a.u.]", tickmode="array"),
+ xaxis=attr(;
+ title="FatSat flip angle [deg]",
+ tickmode="array",
+ tickvals=[FFAs[1], 130, 150, 180, FFAs[end]],
+ constrain="domain",
+ ),
+ font=attr(; family="CMU Serif", size=16, scaleanchor="x", scaleratio=1),
+ yaxis_range=[0, 0.4],
+ xaxis_range=[FFAs[1], FFAs[end]],
+ width=600,
+ height=400,
+ hovermode="x unified",
+ )
+ fig2
+end
+
+# ╔═╡ 6649f46e-3565-4cd6-86a5-9b03d00cc3db
+begin
+ # Reducing tissues's signal
+ signal_myoc4 = reshape(
+ mean(abs.(mean(mag4[:, spins[1], :, :], 3)), 1), length(FAs), length(RRs)
+ )
+ signal_bloo4 = reshape(
+ mean(abs.(mean(mag4[:, spins[2], :, :], 3)), 1), length(FAs), length(RRs)
+ )
+ diff_bloo_myoc4 = abs.(signal_bloo4 .- signal_myoc4)
+ # Mean
+ mean_myoc4 = mean(signal_myoc4, 2)
+ mean_bloo4 = mean(signal_bloo4, 2)
+ mean_diff4 = mean(diff_bloo_myoc4,2)
+ # Std
+ std_myoc4 = std(signal_myoc4, 2)
+ std_bloo4 = std(signal_bloo4, 2)
+ std_diff4 = std(diff_bloo_myoc4,2)
+ # Plotting results
+ # Mean
+ s14 = scatter(;
+ x=FAs,
+ y=mean_myoc4[:],
+ name=labels[1],
+ legendgroup=labels[1],
+ line=attr(; color=colors[1]),
+ )
+ s24 = scatter(;
+ x=FAs,
+ y=mean_bloo4[:],
+ name=labels[2],
+ legendgroup=labels[2],
+ line=attr(; color=colors[2]),
+ )
+ s34 = scatter(;
+ x=FAs,
+ y=mean_diff4[:],
+ name="|Blood-Myoc|",
+ legendgroup="|Blood-Myoc|",
+ line=attr(color=colors[4])
+ )
+ # Std
+ s44 = scatter(;
+ x=[FAs; reverse(FAs)],
+ y=[(mean_myoc4 .- std_myoc4)[:]; reverse((mean_myoc4 .+ std_myoc4)[:])],
+ name=labels[1],
+ legendgroup=labels[1],
+ showlegend=false,
+ fill="toself",
+ fillcolor="rgba(0,0,255,0.2)",
+ line=attr(; color="rgba(0,0,0,0)"),
+ hoverinfo="none"
+ )
+ s54 = scatter(;
+ x=[FAs; reverse(FAs)],
+ y=[(mean_bloo4 .- std_bloo4)[:]; reverse((mean_bloo4 .+ std_bloo4)[:])],
+ name=labels[2],
+ legendgroup=labels[2],
+ showlegend=false,
+ fill="toself",
+ fillcolor="rgba(255,0,0,0.2)",
+ line=attr(; color="rgba(0,0,0,0)"),
+ hoverinfo="none"
+ )
+ s64 = scatter(;
+ x=[FAs; reverse(FAs)],
+ y=[(mean_diff4 .- std_diff4)[:]; reverse((mean_diff4 .+ std_diff4)[:])],
+ name="|Blood-Myoc|",legendgroup="|Blood-Myoc|",
+ showlegend=false,
+ fill="toself",
+ fillcolor="rgba(255,0,255,0.2)",
+ line=attr(color="rgba(0,0,0,0)"),
+ hoverinfo="none"
+ )
+ # Plots
+ fig4 = plot([s14, s24, s34, s44, s54, s64])
+ relayout!(
+ fig4;
+ yaxis=attr(; title="Signal [a.u.]", tickmode="array"),
+ xaxis=attr(;
+ title="Flip angle [deg]",
+ tickmode="array",
+ tickvals=[FAs[1], 110, FAs[end]],
+ constrain="domain",
+ ),
+ font=attr(; family="CMU Serif", size=16, scaleanchor="x", scaleratio=1),
+ yaxis_range=[0, 0.3],
+ xaxis_range=[FAs[1], FAs[end]],
+ width=600,
+ height=400,
+ hovermode="x unified",
+ )
+ fig4
+end
+
+# ╔═╡ a8751a97-c131-407b-b211-573660452142
+begin
+ ## Calculating results
+ signal_myoc3 = reshape(
+ mean(abs.(mean(mag3[:, spins[1], :, :], 3)), 1), length(TIs), length(Δfs)
+ )
+ signal_bloo3 = reshape(
+ mean(abs.(mean(mag3[:, spins[2], :, :], 3)), 1), length(TIs), length(Δfs)
+ )
+ signal_fat3 = reshape(
+ mean(abs.(mean(mag3[:, spins[3], :, :], 3)), 1), length(TIs), length(Δfs)
+ )
+ signal_fat33 = reshape(
+ mean(abs.(mean(mag3[:, spins[4], :, :], 3)), 1), length(TIs), length(Δfs)
+ )
+ mean_myoc3 = mean(signal_myoc3, 2)
+ mean_bloo3 = mean(signal_bloo3, 2)
+ mean_fat3 = mean(signal_fat3, 2)
+ mean_fat33 = mean(signal_fat33, 2)
+ std_myoc3 = std(signal_myoc3, 2)
+ std_bloo3 = std(signal_bloo3, 2)
+ std_fat3 = std(signal_fat3, 2)
+ std_fat33 = std(signal_fat33, 2)
+ # Plotting results
+ # Mean
+ s13 = scatter(;
+ x=TIs,
+ y=mean_myoc3[:],
+ name=labels[1],
+ legendgroup=labels[1],
+ line=attr(; color=colors[1]),
+ )
+ s23 = scatter(;
+ x=TIs,
+ y=mean_bloo3[:],
+ name=labels[2],
+ legendgroup=labels[2],
+ line=attr(; color=colors[2]),
+ )
+ s33 = scatter(;
+ x=TIs,
+ y=mean_fat3[:],
+ name=labels[3],
+ legendgroup=labels[3],
+ line=attr(; color=colors[3]),
+ )
+ s53 = scatter(;
+ x=TIs,
+ y=mean_fat33[:],
+ name=labels[4],
+ legendgroup=labels[4],
+ line=attr(; color=colors[3], dash="dash"),
+ )
+ # Std
+ s43 = scatter(;
+ x=[TIs; reverse(TIs)],
+ y=[(mean_myoc3 .- std_myoc3)[:]; reverse((mean_myoc3 .+ std_myoc3)[:])],
+ name=labels[1],
+ legendgroup=labels[1],
+ showlegend=false,
+ fill="toself",
+ fillcolor="rgba(0,0,255,0.2)",
+ line=attr(; color="rgba(0,0,0,0)"),
+ hoverinfo="none",
+ )
+ s63 = scatter(;
+ x=[TIs; reverse(TIs)],
+ y=[(mean_bloo3 .- std_bloo3)[:]; reverse((mean_bloo3 .+ std_bloo3)[:])],
+ name=labels[2],
+ legendgroup=labels[2],
+ showlegend=false,
+ fill="toself",
+ fillcolor="rgba(255,0,0,0.2)",
+ line=attr(; color="rgba(0,0,0,0)"),
+ hoverinfo="none",
+ )
+ s73 = scatter(;
+ x=[TIs; reverse(TIs)],
+ y=[(mean_fat3 .- std_fat3)[:]; reverse((mean_fat3 .+ std_fat3)[:])],
+ name=labels[3],
+ legendgroup=labels[3],
+ showlegend=false,
+ fill="toself",
+ fillcolor="rgba(0,255,0,0.2)",
+ line=attr(; color="rgba(0,0,0,0)"),
+ hoverinfo="none",
+ )
+ s83 = scatter(;
+ x=[TIs; reverse(TIs)],
+ y=[(mean_fat33 .- std_fat33)[:]; reverse((mean_fat33 .+ std_fat33)[:])],
+ name=labels[4],
+ legendgroup=labels[4],
+ showlegend=false,
+ fill="toself",
+ fillcolor="rgba(0,255,0,0.2)",
+ line=attr(; color="rgba(0,0,0,0)"),
+ hoverinfo="none",
+ )
+ # Plots
+ fig3 = plot([s13, s23, s33, s43, s53, s63, s73, s83])
+ relayout!(
+ fig3;
+ yaxis=attr(; title="Signal [a.u.]", tickmode="array"),
+ xaxis=attr(;
+ title="Inversion Time [ms]",
+ tickmode="array",
+ tickvals=[TIs[1], 70, 90, TIs[end]],
+ constrain="domain",
+ ),
+ font=attr(; family="CMU Serif", size=16, scaleanchor="x", scaleratio=1),
+ yaxis_range=[0, 0.3],
+ xaxis_range=[TIs[1], TIs[end]],
+ width=600,
+ height=400,
+ hovermode="x unified",
+ )
+ fig3
+end
+
+
+# ╔═╡ eb0f1e07-24a1-4aa4-b3ef-b63caa97de34
+begin
+ # Reducing tissues's signal
+ signal_myoc5 = reshape(
+ mean(abs.(mean(mag5bb[:, spins[1], :, :], 3)), 1), length(T2ps), length(RRs)
+ )
+ signal_bloo5 = reshape(
+ mean(abs.(mean(mag5bb[:, spins[2], :, :], 3)), 1), length(T2ps), length(RRs)
+ )
+ diff_bloo_myoc5 = abs.(signal_bloo5 .- signal_myoc5)
+ # Mean
+ mean_myoc5 = mean(signal_myoc5, 2)
+ mean_bloo5 = mean(signal_bloo5, 2)
+ mean_diff5 = mean(diff_bloo_myoc5,2)
+ # Std
+ std_myoc5 = std(signal_myoc5, 2)
+ std_bloo5 = std(signal_bloo5, 2)
+ std_diff5 = std(diff_bloo_myoc5,2)
+ # Plotting results
+ # Mean
+ s15 = scatter(;
+ x=T2ps,
+ y=mean_myoc5[:],
+ name=labels[1],
+ legendgroup=labels[1],
+ line=attr(; color=colors[1]),
+ )
+ s25 = scatter(;
+ x=T2ps,
+ y=mean_bloo5[:],
+ name=labels[2],
+ legendgroup=labels[2],
+ line=attr(; color=colors[2]),
+ )
+ s35 = scatter(;
+ x=T2ps,
+ y=mean_diff5[:],
+ name="|Blood-Myoc|",
+ legendgroup="|Blood-Myoc|",
+ line=attr(color=colors[4])
+ )
+ # Std
+ s45 = scatter(;
+ x=[T2ps; reverse(T2ps)],
+ y=[(mean_myoc5 .- std_myoc5)[:]; reverse((mean_myoc5 .+ std_myoc5)[:])],
+ name=labels[1],
+ legendgroup=labels[1],
+ showlegend=false,
+ fill="toself",
+ fillcolor="rgba(0,0,255,0.2)",
+ line=attr(; color="rgba(0,0,0,0)"),
+ hoverinfo="none"
+ )
+ s55 = scatter(;
+ x=[T2ps; reverse(T2ps)],
+ y=[(mean_bloo5 .- std_bloo5)[:]; reverse((mean_bloo5 .+ std_bloo5)[:])],
+ name=labels[2],
+ legendgroup=labels[2],
+ showlegend=false,
+ fill="toself",
+ fillcolor="rgba(255,0,0,0.2)",
+ line=attr(; color="rgba(0,0,0,0)"),
+ hoverinfo="none"
+ )
+ s65 = scatter(;
+ x=[T2ps; reverse(T2ps)],
+ y=[(mean_diff5 .- std_diff5)[:]; reverse((mean_diff5 .+ std_diff5)[:])],
+ name="|Blood-Myoc|",legendgroup="|Blood-Myoc|",
+ showlegend=false,
+ fill="toself",
+ fillcolor="rgba(255,0,255,0.2)",
+ line=attr(color="rgba(0,0,0,0)"),
+ hoverinfo="none"
+ )
+ # Plots
+ fig5 = plot([s15, s25, s35, s45, s55, s65])
+ relayout!(
+ fig5;
+ yaxis=attr(; title="Signal [a.u.]", tickmode="array"),
+ xaxis=attr(;
+ title="T2prep duration [ms]",
+ tickmode="array",
+ tickvals=[T2ps[1], 50, 70, T2ps[end]],
+ constrain="domain",
+ ),
+ font=attr(; family="CMU Serif", size=16, scaleanchor="x", scaleratio=1),
+ yaxis_range=[0, 0.2],
+ xaxis_range=[T2ps[1], T2ps[end]],
+ width=600,
+ height=400,
+ hovermode="x unified",
+ )
+ fig5
+end
+
+# ╔═╡ 10e68e25-9f68-46c0-b1b0-e9b124706b67
+begin
+ # Reducing tissues's signal
+ signal_myocbb = reshape(
+ mean(abs.(mean(mag5bb[:, spins[1], :, :], 3)), 1), length(T2ps), length(RRs)
+ )
+ signal_bloodbb = reshape(
+ mean(abs.(mean(mag5bb[:, spins[2], :, :], 3)), 1), length(T2ps), length(RRs)
+ )
+ signal_myocrf = reshape(
+ mean(abs.(mean(mag5rf[:, spins[1], :, :], 3)), 1), length(T2ps), length(RRs)
+ )
+ signal_bloodrf = reshape(
+ mean(abs.(mean(mag5rf[:, spins[2], :, :], 3)), 1), length(T2ps), length(RRs)
+ )
+ # Substracted
+ signal_myoc6 = abs.(signal_myocrf .- signal_myocbb)
+ signal_bloo6 = abs.(signal_bloodrf .- signal_bloodbb)
+ diff_bloo_myoc6 = abs.(signal_bloo6 .- signal_myoc6)
+ # Mean
+ mean_myoc6 = mean(signal_myoc6, 2)
+ mean_bloo6 = mean(signal_bloo6, 2)
+ mean_diff6 = mean(diff_bloo_myoc6,2)
+ # Std
+ std_myoc6 = std(signal_myoc6, 2)
+ std_bloo6 = std(signal_bloo6, 2)
+ std_diff6 = std(diff_bloo_myoc6,2)
+ # Plotting results
+ # Mean
+ s16 = scatter(;
+ x=T2ps,
+ y=mean_myoc6[:],
+ name="Substracted "*labels[1],
+ legendgroup=labels[1],
+ line=attr(; color=colors[1]),
+ )
+ s26 = scatter(;
+ x=T2ps,
+ y=mean_bloo6[:],
+ name="Substracted "*labels[2],
+ legendgroup=labels[2],
+ line=attr(; color=colors[2]),
+ )
+ s36 = scatter(;
+ x=T2ps,
+ y=mean_diff6[:],
+ name="|Sub. Blood - Sub. Myoc|",
+ legendgroup="|Blood-Myoc|",
+ line=attr(color=colors[4])
+ )
+ # Std
+ s46 = scatter(;
+ x=[T2ps; reverse(T2ps)],
+ y=[(mean_myoc6 .- std_myoc6)[:]; reverse((mean_myoc6 .+ std_myoc6)[:])],
+ name="Substracted "*labels[1],
+ legendgroup=labels[1],
+ showlegend=false,
+ fill="toself",
+ fillcolor="rgba(0,0,255,0.2)",
+ line=attr(; color="rgba(0,0,0,0)"),
+ hoverinfo="none"
+ )
+ s56 = scatter(;
+ x=[T2ps; reverse(T2ps)],
+ y=[(mean_bloo6 .- std_bloo6)[:]; reverse((mean_bloo6 .+ std_bloo6)[:])],
+ name="Substracted "*labels[2],
+ legendgroup=labels[2],
+ showlegend=false,
+ fill="toself",
+ fillcolor="rgba(255,0,0,0.2)",
+ line=attr(; color="rgba(0,0,0,0)"),
+ hoverinfo="none"
+ )
+ s66 = scatter(;
+ x=[T2ps; reverse(T2ps)],
+ y=[(mean_diff6 .- std_diff6)[:]; reverse((mean_diff6 .+ std_diff6)[:])],
+ name="|Sub. Blood - Sub. Myoc|",legendgroup="|Blood-Myoc|",
+ showlegend=false,
+ fill="toself",
+ fillcolor="rgba(255,0,255,0.2)",
+ line=attr(color="rgba(0,0,0,0)"),
+ hoverinfo="none"
+ )
+ # Plots
+ fig6 = plot([s16, s26, s36, s46, s56, s66])
+ relayout!(
+ fig6;
+ yaxis=attr(; title="Signal [a.u.]", tickmode="array"),
+ xaxis=attr(;
+ title="T2prep duration [deg]",
+ tickmode="array",
+ tickvals=[T2ps[1], 50, 70, T2ps[end]],
+ constrain="domain",
+ ),
+ font=attr(; family="CMU Serif", size=16, scaleanchor="x", scaleratio=1),
+ yaxis_range=[0, 0.2],
+ xaxis_range=[T2ps[1], T2ps[end]],
+ width=600,
+ height=400,
+ hovermode="x unified",
+ )
+ fig6
+end
+
+
+# ╔═╡ 3d7e7d20-a77a-48b3-ad2e-6b621227be16
+md"""# References
+ - **Castillo-Passi C**, Coronado R, Varela-Mattatall G, Alberola-López C, Botnar R, Irarrazaval P. KomaMRI.jl: An open-source framework for general MRI simulations with GPU acceleration. Magnetic Resonance in Medicine. 2023;90(1):329-342. [doi:10.1002/mrm.29635](doi:10.1002/mrm.29635)
+ - **Campbell-Washburn AE**, Ramasawmy R, Restivo MC, et al. Opportunities in Interventional and Diagnostic Imaging by Using High-Performance Low-Field-Strength MRI. Radiology. 2019;293(2):384-393. [doi:10.1148/radiol.2019190452](doi:10.1148/radiol.2019190452)
+- **Restivo MC**, Ramasawmy R, Bandettini WP, Herzka DA, Campbell-Washburn AE. Efficient spiral in-out and EPI balanced steady-state free precession cine imaging using a high-performance 0.55T MRI. Magnetic Resonance in Medicine. 2020;84(5):2364-2375. [doi:10.1002/mrm.28278](doi:10.1002/mrm.28278)
+"""
+
+# ╔═╡ abea2c43-d83e-4438-8cd3-4be06b8174b3
+md"""# Reproducibility
+
+This [Pluto notebook](https://plutojl.org/) is reproducible by default, as it has an embedded `Project.toml` and `Manifest.toml`, that store the exact package versions used to create the notebook."""
+
+# ╔═╡ 00000000-0000-0000-0000-000000000001
+PLUTO_PROJECT_TOML_CONTENTS = """
+[deps]
+KomaMRICore = "4baa4f4d-2ae9-40db-8331-a7d1080e3f4e"
+KomaMRIPlots = "76db0263-63f3-4d26-bb9a-5dba378db904"
+Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f"
+PlutoPlotly = "8e989ff0-3d88-8e9f-f020-2b208a939ff0"
+PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8"
+ProgressLogging = "33c8b6b6-d38a-422a-b730-caa89a2f386c"
+Suppressor = "fd094767-a336-5f1f-9728-57cf17d0bbfb"
+
+[compat]
+PlutoUI = "~0.7.58"
+ProgressLogging = "~0.1.4"
+Suppressor = "~0.2.7"
+"""
+
+# ╔═╡ 00000000-0000-0000-0000-000000000002
+PLUTO_MANIFEST_TOML_CONTENTS = """
+# This file is machine-generated - editing it directly is not advised
+
+julia_version = "1.10.5"
+manifest_format = "2.0"
+project_hash = "9b71b5fa18cd815278316446dec81dab9113a167"
+
+[[deps.AbstractFFTs]]
+deps = ["LinearAlgebra"]
+git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef"
+uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c"
+version = "1.5.0"
+weakdeps = ["ChainRulesCore", "Test"]
+
+ [deps.AbstractFFTs.extensions]
+ AbstractFFTsChainRulesCoreExt = "ChainRulesCore"
+ AbstractFFTsTestExt = "Test"
+
+[[deps.AbstractNFFTs]]
+deps = ["LinearAlgebra", "Printf"]
+git-tree-sha1 = "292e21e99dedb8621c15f185b8fdb4260bb3c429"
+uuid = "7f219486-4aa7-41d6-80a7-e08ef20ceed7"
+version = "0.8.2"
+
+[[deps.AbstractPlutoDingetjes]]
+deps = ["Pkg"]
+git-tree-sha1 = "6e1d2a35f2f90a4bc7c2ed98079b2ba09c35b83a"
+uuid = "6e696c72-6542-2067-7265-42206c756150"
+version = "1.3.2"
+
+[[deps.Accessors]]
+deps = ["CompositionsBase", "ConstructionBase", "InverseFunctions", "LinearAlgebra", "MacroTools", "Markdown"]
+git-tree-sha1 = "b392ede862e506d451fc1616e79aa6f4c673dab8"
+uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697"
+version = "0.1.38"
+
+ [deps.Accessors.extensions]
+ AccessorsAxisKeysExt = "AxisKeys"
+ AccessorsDatesExt = "Dates"
+ AccessorsIntervalSetsExt = "IntervalSets"
+ AccessorsStaticArraysExt = "StaticArrays"
+ AccessorsStructArraysExt = "StructArrays"
+ AccessorsTestExt = "Test"
+ AccessorsUnitfulExt = "Unitful"
+
+ [deps.Accessors.weakdeps]
+ AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5"
+ Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
+ IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953"
+ Requires = "ae029012-a4dd-5104-9daa-d747884805df"
+ StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
+ StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a"
+ Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
+ Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
+
+[[deps.Adapt]]
+deps = ["LinearAlgebra", "Requires"]
+git-tree-sha1 = "6a55b747d1812e699320963ffde36f1ebdda4099"
+uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"
+version = "4.0.4"
+weakdeps = ["StaticArrays"]
+
+ [deps.Adapt.extensions]
+ AdaptStaticArraysExt = "StaticArrays"
+
+[[deps.ArgCheck]]
+git-tree-sha1 = "a3a402a35a2f7e0b87828ccabbd5ebfbebe356b4"
+uuid = "dce04be8-c92d-5529-be00-80e4d2c0e197"
+version = "2.3.0"
+
+[[deps.ArgTools]]
+uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f"
+version = "1.1.1"
+
+[[deps.Artifacts]]
+uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33"
+
+[[deps.AssetRegistry]]
+deps = ["Distributed", "JSON", "Pidfile", "SHA", "Test"]
+git-tree-sha1 = "b25e88db7944f98789130d7b503276bc34bc098e"
+uuid = "bf4720bc-e11a-5d0c-854e-bdca1663c893"
+version = "0.1.0"
+
+[[deps.Atomix]]
+deps = ["UnsafeAtomics"]
+git-tree-sha1 = "c06a868224ecba914baa6942988e2f2aade419be"
+uuid = "a9b6321e-bd34-4604-b9c9-b65b8de01458"
+version = "0.1.0"
+
+[[deps.AxisAlgorithms]]
+deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"]
+git-tree-sha1 = "01b8ccb13d68535d73d2b0c23e39bd23155fb712"
+uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950"
+version = "1.1.0"
+
+[[deps.BangBang]]
+deps = ["Accessors", "ConstructionBase", "InitialValues", "LinearAlgebra", "Requires"]
+git-tree-sha1 = "e2144b631226d9eeab2d746ca8880b7ccff504ae"
+uuid = "198e06fe-97b7-11e9-32a5-e1d131e6ad66"
+version = "0.4.3"
+
+ [deps.BangBang.extensions]
+ BangBangChainRulesCoreExt = "ChainRulesCore"
+ BangBangDataFramesExt = "DataFrames"
+ BangBangStaticArraysExt = "StaticArrays"
+ BangBangStructArraysExt = "StructArrays"
+ BangBangTablesExt = "Tables"
+ BangBangTypedTablesExt = "TypedTables"
+
+ [deps.BangBang.weakdeps]
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+ DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
+ StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
+ StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a"
+ Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
+ TypedTables = "9d95f2ec-7b3d-5a63-8d20-e2491e220bb9"
+
+[[deps.Base64]]
+uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"
+
+[[deps.BaseDirs]]
+git-tree-sha1 = "cb25e4b105cc927052c2314f8291854ea59bf70a"
+uuid = "18cc8868-cbac-4acf-b575-c8ff214dc66f"
+version = "1.2.4"
+
+[[deps.Baselet]]
+git-tree-sha1 = "aebf55e6d7795e02ca500a689d326ac979aaf89e"
+uuid = "9718e550-a3fa-408a-8086-8db961cd8217"
+version = "0.1.1"
+
+[[deps.BitFlags]]
+git-tree-sha1 = "0691e34b3bb8be9307330f88d1a3c3f25466c24d"
+uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35"
+version = "0.1.9"
+
+[[deps.Blink]]
+deps = ["Base64", "Distributed", "HTTP", "JSExpr", "JSON", "Lazy", "Logging", "MacroTools", "Mustache", "Mux", "Pkg", "Reexport", "Sockets", "WebIO"]
+git-tree-sha1 = "bc93511973d1f949d45b0ea17878e6cb0ad484a1"
+uuid = "ad839575-38b3-5650-b840-f874b8c74a25"
+version = "0.12.9"
+
+[[deps.BufferedStreams]]
+git-tree-sha1 = "6863c5b7fc997eadcabdbaf6c5f201dc30032643"
+uuid = "e1450e63-4bb3-523b-b2a4-4ffa8c0fd77d"
+version = "1.2.2"
+
+[[deps.CEnum]]
+git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc"
+uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82"
+version = "0.5.0"
+
+[[deps.ChainRulesCore]]
+deps = ["Compat", "LinearAlgebra"]
+git-tree-sha1 = "3e4b134270b372f2ed4d4d0e936aabaefc1802bc"
+uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+version = "1.25.0"
+weakdeps = ["SparseArrays"]
+
+ [deps.ChainRulesCore.extensions]
+ ChainRulesCoreSparseArraysExt = "SparseArrays"
+
+[[deps.CodecZlib]]
+deps = ["TranscodingStreams", "Zlib_jll"]
+git-tree-sha1 = "bce6804e5e6044c6daab27bb533d1295e4a2e759"
+uuid = "944b1d66-785c-5afd-91f1-9de20f533193"
+version = "0.7.6"
+
+[[deps.ColorSchemes]]
+deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"]
+git-tree-sha1 = "b5278586822443594ff615963b0c09755771b3e0"
+uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4"
+version = "3.26.0"
+
+[[deps.ColorTypes]]
+deps = ["FixedPointNumbers", "Random"]
+git-tree-sha1 = "b10d0b65641d57b8b4d5e234446582de5047050d"
+uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f"
+version = "0.11.5"
+
+[[deps.ColorVectorSpace]]
+deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"]
+git-tree-sha1 = "a1f44953f2382ebb937d60dafbe2deea4bd23249"
+uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4"
+version = "0.10.0"
+
+ [deps.ColorVectorSpace.extensions]
+ SpecialFunctionsExt = "SpecialFunctions"
+
+ [deps.ColorVectorSpace.weakdeps]
+ SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b"
+
+[[deps.Colors]]
+deps = ["ColorTypes", "FixedPointNumbers", "Reexport"]
+git-tree-sha1 = "362a287c3aa50601b0bc359053d5c2468f0e7ce0"
+uuid = "5ae59095-9a9b-59fe-a467-6f913c188581"
+version = "0.12.11"
+
+[[deps.Compat]]
+deps = ["TOML", "UUIDs"]
+git-tree-sha1 = "8ae8d32e09f0dcf42a36b90d4e17f5dd2e4c4215"
+uuid = "34da2185-b29b-5c13-b0c7-acf172513d20"
+version = "4.16.0"
+weakdeps = ["Dates", "LinearAlgebra"]
+
+ [deps.Compat.extensions]
+ CompatLinearAlgebraExt = "LinearAlgebra"
+
+[[deps.CompilerSupportLibraries_jll]]
+deps = ["Artifacts", "Libdl"]
+uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae"
+version = "1.1.1+0"
+
+[[deps.CompositionsBase]]
+git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad"
+uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b"
+version = "0.1.2"
+weakdeps = ["InverseFunctions"]
+
+ [deps.CompositionsBase.extensions]
+ CompositionsBaseInverseFunctionsExt = "InverseFunctions"
+
+[[deps.ConcurrentUtilities]]
+deps = ["Serialization", "Sockets"]
+git-tree-sha1 = "ea32b83ca4fefa1768dc84e504cc0a94fb1ab8d1"
+uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb"
+version = "2.4.2"
+
+[[deps.ConstructionBase]]
+git-tree-sha1 = "76219f1ed5771adbb096743bff43fb5fdd4c1157"
+uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9"
+version = "1.5.8"
+
+ [deps.ConstructionBase.extensions]
+ ConstructionBaseIntervalSetsExt = "IntervalSets"
+ ConstructionBaseLinearAlgebraExt = "LinearAlgebra"
+ ConstructionBaseStaticArraysExt = "StaticArrays"
+
+ [deps.ConstructionBase.weakdeps]
+ IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953"
+ LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
+ StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
+
+[[deps.DataAPI]]
+git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe"
+uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a"
+version = "1.16.0"
+
+[[deps.DataValueInterfaces]]
+git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6"
+uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464"
+version = "1.0.0"
+
+[[deps.Dates]]
+deps = ["Printf"]
+uuid = "ade2ca70-3891-5945-98fb-dc099432e06a"
+
+[[deps.DefineSingletons]]
+git-tree-sha1 = "0fba8b706d0178b4dc7fd44a96a92382c9065c2c"
+uuid = "244e2a9f-e319-4986-a169-4d1fe445cd52"
+version = "0.1.2"
+
+[[deps.DelimitedFiles]]
+deps = ["Mmap"]
+git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae"
+uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab"
+version = "1.9.1"
+
+[[deps.Distributed]]
+deps = ["Random", "Serialization", "Sockets"]
+uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b"
+
+[[deps.DocStringExtensions]]
+deps = ["LibGit2"]
+git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d"
+uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae"
+version = "0.9.3"
+
+[[deps.Downloads]]
+deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"]
+uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6"
+version = "1.6.0"
+
+[[deps.ExceptionUnwrapping]]
+deps = ["Test"]
+git-tree-sha1 = "dcb08a0d93ec0b1cdc4af184b26b591e9695423a"
+uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4"
+version = "0.1.10"
+
+[[deps.FFTW]]
+deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"]
+git-tree-sha1 = "4820348781ae578893311153d69049a93d05f39d"
+uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341"
+version = "1.8.0"
+
+[[deps.FFTW_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
+git-tree-sha1 = "4d81ed14783ec49ce9f2e168208a12ce1815aa25"
+uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a"
+version = "3.3.10+1"
+
+[[deps.FileWatching]]
+uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee"
+
+[[deps.FixedPointNumbers]]
+deps = ["Statistics"]
+git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172"
+uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93"
+version = "0.8.5"
+
+[[deps.FunctionalCollections]]
+deps = ["Test"]
+git-tree-sha1 = "04cb9cfaa6ba5311973994fe3496ddec19b6292a"
+uuid = "de31a74c-ac4f-5751-b3fd-e18cd04993ca"
+version = "0.5.0"
+
+[[deps.Functors]]
+deps = ["LinearAlgebra"]
+git-tree-sha1 = "64d8e93700c7a3f28f717d265382d52fac9fa1c1"
+uuid = "d9f16b24-f501-4c13-a1f2-28368ffc5196"
+version = "0.4.12"
+
+[[deps.Future]]
+deps = ["Random"]
+uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820"
+
+[[deps.HDF5]]
+deps = ["Compat", "HDF5_jll", "Libdl", "MPIPreferences", "Mmap", "Preferences", "Printf", "Random", "Requires", "UUIDs"]
+git-tree-sha1 = "e856eef26cf5bf2b0f95f8f4fc37553c72c8641c"
+uuid = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f"
+version = "0.17.2"
+
+ [deps.HDF5.extensions]
+ MPIExt = "MPI"
+
+ [deps.HDF5.weakdeps]
+ MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195"
+
+[[deps.HDF5_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "LibCURL_jll", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "OpenSSL_jll", "TOML", "Zlib_jll", "libaec_jll"]
+git-tree-sha1 = "82a471768b513dc39e471540fdadc84ff80ff997"
+uuid = "0234f1f7-429e-5d53-9886-15a909be8d59"
+version = "1.14.3+3"
+
+[[deps.HTTP]]
+deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"]
+git-tree-sha1 = "d1d712be3164d61d1fb98e7ce9bcbc6cc06b45ed"
+uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3"
+version = "1.10.8"
+
+[[deps.Hiccup]]
+deps = ["MacroTools", "Test"]
+git-tree-sha1 = "6187bb2d5fcbb2007c39e7ac53308b0d371124bd"
+uuid = "9fb69e20-1954-56bb-a84f-559cc56a8ff7"
+version = "0.2.2"
+
+[[deps.Hwloc_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "dd3b49277ec2bb2c6b94eb1604d4d0616016f7a6"
+uuid = "e33a78d0-f292-5ffc-b300-72abe9b543c8"
+version = "2.11.2+0"
+
+[[deps.Hyperscript]]
+deps = ["Test"]
+git-tree-sha1 = "179267cfa5e712760cd43dcae385d7ea90cc25a4"
+uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91"
+version = "0.0.5"
+
+[[deps.HypertextLiteral]]
+deps = ["Tricks"]
+git-tree-sha1 = "7134810b1afce04bbc1045ca1985fbe81ce17653"
+uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2"
+version = "0.9.5"
+
+[[deps.IOCapture]]
+deps = ["Logging", "Random"]
+git-tree-sha1 = "b6d6bfdd7ce25b0f9b2f6b3dd56b2673a66c8770"
+uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89"
+version = "0.2.5"
+
+[[deps.InitialValues]]
+git-tree-sha1 = "4da0f88e9a39111c2fa3add390ab15f3a44f3ca3"
+uuid = "22cec73e-a1b8-11e9-2c92-598750a2cf9c"
+version = "0.3.1"
+
+[[deps.IntelOpenMP_jll]]
+deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"]
+git-tree-sha1 = "10bd689145d2c3b2a9844005d01087cc1194e79e"
+uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0"
+version = "2024.2.1+0"
+
+[[deps.InteractiveUtils]]
+deps = ["Markdown"]
+uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240"
+
+[[deps.Interpolations]]
+deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"]
+git-tree-sha1 = "88a101217d7cb38a7b481ccd50d21876e1d1b0e0"
+uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59"
+version = "0.15.1"
+
+ [deps.Interpolations.extensions]
+ InterpolationsUnitfulExt = "Unitful"
+
+ [deps.Interpolations.weakdeps]
+ Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
+
+[[deps.InverseFunctions]]
+git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb"
+uuid = "3587e190-3f89-42d0-90ee-14403ec27112"
+version = "0.1.17"
+weakdeps = ["Dates", "Test"]
+
+ [deps.InverseFunctions.extensions]
+ InverseFunctionsDatesExt = "Dates"
+ InverseFunctionsTestExt = "Test"
+
+[[deps.IteratorInterfaceExtensions]]
+git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856"
+uuid = "82899510-4779-5014-852e-03e436cf321d"
+version = "1.0.0"
+
+[[deps.JLLWrappers]]
+deps = ["Artifacts", "Preferences"]
+git-tree-sha1 = "f389674c99bfcde17dc57454011aa44d5a260a40"
+uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210"
+version = "1.6.0"
+
+[[deps.JSExpr]]
+deps = ["JSON", "MacroTools", "Observables", "WebIO"]
+git-tree-sha1 = "b413a73785b98474d8af24fd4c8a975e31df3658"
+uuid = "97c1335a-c9c5-57fe-bc5d-ec35cebe8660"
+version = "0.5.4"
+
+[[deps.JSON]]
+deps = ["Dates", "Mmap", "Parsers", "Unicode"]
+git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a"
+uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6"
+version = "0.21.4"
+
+[[deps.Kaleido_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
+git-tree-sha1 = "2ef87eeaa28713cb010f9fb0be288b6c1a4ecd53"
+uuid = "f7e6163d-2fa5-5f23-b69c-1db539e41963"
+version = "0.1.0+0"
+
+[[deps.KernelAbstractions]]
+deps = ["Adapt", "Atomix", "InteractiveUtils", "MacroTools", "PrecompileTools", "Requires", "StaticArrays", "UUIDs", "UnsafeAtomics", "UnsafeAtomicsLLVM"]
+git-tree-sha1 = "5126765c5847f74758c411c994312052eb7117ef"
+uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c"
+version = "0.9.27"
+
+ [deps.KernelAbstractions.extensions]
+ EnzymeExt = "EnzymeCore"
+ LinearAlgebraExt = "LinearAlgebra"
+ SparseArraysExt = "SparseArrays"
+
+ [deps.KernelAbstractions.weakdeps]
+ EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869"
+ LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
+ SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
+
+[[deps.KomaMRIBase]]
+deps = ["Interpolations", "MAT", "MRIBase", "Parameters", "Reexport"]
+git-tree-sha1 = "640eaa85cedeeabbc4809295f27693ab414f9530"
+uuid = "d0bc0b20-b151-4d03-b2a4-6ca51751cb9c"
+version = "0.9.0"
+
+[[deps.KomaMRICore]]
+deps = ["Adapt", "Functors", "KernelAbstractions", "KomaMRIBase", "ProgressMeter", "Reexport", "ThreadsX"]
+git-tree-sha1 = "728828e5110ce74a96a0f9780a0ba46640357dfc"
+uuid = "4baa4f4d-2ae9-40db-8331-a7d1080e3f4e"
+version = "0.9.0"
+
+ [deps.KomaMRICore.extensions]
+ KomaAMDGPUExt = "AMDGPU"
+ KomaCUDAExt = "CUDA"
+ KomaMetalExt = "Metal"
+ KomaoneAPIExt = "oneAPI"
+
+ [deps.KomaMRICore.weakdeps]
+ AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e"
+ CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba"
+ Metal = "dde4c033-4e86-420c-a63e-0dd931031962"
+ oneAPI = "8f75cd03-7ff8-4ecb-9b8f-daf728133b1b"
+
+[[deps.KomaMRIPlots]]
+deps = ["Interpolations", "Kaleido_jll", "KomaMRIBase", "MAT", "PlotlyJS", "Reexport"]
+git-tree-sha1 = "83270cba62a2660dc49e3f7e704418b3d57f3125"
+uuid = "76db0263-63f3-4d26-bb9a-5dba378db904"
+version = "0.9.0"
+weakdeps = ["PlutoPlotly"]
+
+ [deps.KomaMRIPlots.extensions]
+ KomaPlotsPlutoPlotlyExt = "PlutoPlotly"
+
+[[deps.LLVM]]
+deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Preferences", "Printf", "Requires", "Unicode"]
+git-tree-sha1 = "4ad43cb0a4bb5e5b1506e1d1f48646d7e0c80363"
+uuid = "929cbde3-209d-540e-8aea-75f648917ca0"
+version = "9.1.2"
+
+ [deps.LLVM.extensions]
+ BFloat16sExt = "BFloat16s"
+
+ [deps.LLVM.weakdeps]
+ BFloat16s = "ab4f0b2a-ad5b-11e8-123f-65d77653426b"
+
+[[deps.LLVMExtra_jll]]
+deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"]
+git-tree-sha1 = "05a8bd5a42309a9ec82f700876903abce1017dd3"
+uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab"
+version = "0.0.34+0"
+
+[[deps.LaTeXStrings]]
+git-tree-sha1 = "50901ebc375ed41dbf8058da26f9de442febbbec"
+uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f"
+version = "1.3.1"
+
+[[deps.Lazy]]
+deps = ["MacroTools"]
+git-tree-sha1 = "1370f8202dac30758f3c345f9909b97f53d87d3f"
+uuid = "50d2b5c4-7a5e-59d5-8109-a42b560f39c0"
+version = "0.15.1"
+
+[[deps.LazyArtifacts]]
+deps = ["Artifacts", "Pkg"]
+uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3"
+
+[[deps.LibCURL]]
+deps = ["LibCURL_jll", "MozillaCACerts_jll"]
+uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21"
+version = "0.6.4"
+
+[[deps.LibCURL_jll]]
+deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"]
+uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0"
+version = "8.4.0+0"
+
+[[deps.LibGit2]]
+deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"]
+uuid = "76f85450-5226-5b5a-8eaa-529ad045b433"
+
+[[deps.LibGit2_jll]]
+deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"]
+uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5"
+version = "1.6.4+0"
+
+[[deps.LibSSH2_jll]]
+deps = ["Artifacts", "Libdl", "MbedTLS_jll"]
+uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8"
+version = "1.11.0+1"
+
+[[deps.Libdl]]
+uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb"
+
+[[deps.LinearAlgebra]]
+deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"]
+uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
+
+[[deps.Logging]]
+uuid = "56ddb016-857b-54e1-b83d-db4d58db5568"
+
+[[deps.LoggingExtras]]
+deps = ["Dates", "Logging"]
+git-tree-sha1 = "c1dd6d7978c12545b4179fb6153b9250c96b0075"
+uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36"
+version = "1.0.3"
+
+[[deps.MAT]]
+deps = ["BufferedStreams", "CodecZlib", "HDF5", "SparseArrays"]
+git-tree-sha1 = "1d2dd9b186742b0f317f2530ddcbf00eebb18e96"
+uuid = "23992714-dd62-5051-b70f-ba57cb901cac"
+version = "0.10.7"
+
+[[deps.MIMEs]]
+git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb"
+uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65"
+version = "0.1.4"
+
+[[deps.MKL_jll]]
+deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"]
+git-tree-sha1 = "f046ccd0c6db2832a9f639e2c669c6fe867e5f4f"
+uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7"
+version = "2024.2.0+0"
+
+[[deps.MPICH_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"]
+git-tree-sha1 = "19d4bd098928a3263693991500d05d74dbdc2004"
+uuid = "7cb0a576-ebde-5e09-9194-50597f1243b4"
+version = "4.2.2+0"
+
+[[deps.MPIPreferences]]
+deps = ["Libdl", "Preferences"]
+git-tree-sha1 = "c105fe467859e7f6e9a852cb15cb4301126fac07"
+uuid = "3da0fdf6-3ccc-4f1b-acd9-58baa6c99267"
+version = "0.1.11"
+
+[[deps.MPItrampoline_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"]
+git-tree-sha1 = "fde81c9f9c94fe5fbeaed7b3f1330305cf9a327c"
+uuid = "f1f71cc9-e9ae-5b93-9b94-4fe0e1ad3748"
+version = "5.5.0+0"
+
+[[deps.MRIBase]]
+deps = ["AbstractNFFTs", "LinearAlgebra", "NFFTTools"]
+git-tree-sha1 = "57979500dbdd130fc92359f1ecd6714051ed78eb"
+uuid = "f7771a9a-6e57-4e71-863b-6e4b6a2f17df"
+version = "0.4.4"
+
+[[deps.MacroTools]]
+deps = ["Markdown", "Random"]
+git-tree-sha1 = "2fa9ee3e63fd3a4f7a9a4f4744a52f4856de82df"
+uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09"
+version = "0.5.13"
+
+[[deps.Markdown]]
+deps = ["Base64"]
+uuid = "d6f4376e-aef5-505a-96c1-9c027394607a"
+
+[[deps.MbedTLS]]
+deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"]
+git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf"
+uuid = "739be429-bea8-5141-9913-cc70e7f3736d"
+version = "1.1.9"
+
+[[deps.MbedTLS_jll]]
+deps = ["Artifacts", "Libdl"]
+uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1"
+version = "2.28.2+1"
+
+[[deps.MicroCollections]]
+deps = ["Accessors", "BangBang", "InitialValues"]
+git-tree-sha1 = "44d32db644e84c75dab479f1bc15ee76a1a3618f"
+uuid = "128add7d-3638-4c79-886c-908ea0c25c34"
+version = "0.2.0"
+
+[[deps.MicrosoftMPI_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
+git-tree-sha1 = "f12a29c4400ba812841c6ace3f4efbb6dbb3ba01"
+uuid = "9237b28f-5490-5468-be7b-bb81f5f5e6cf"
+version = "10.1.4+2"
+
+[[deps.Mmap]]
+uuid = "a63ad114-7e13-5084-954f-fe012c677804"
+
+[[deps.MozillaCACerts_jll]]
+uuid = "14a3606d-f60d-562e-9121-12d972cd8159"
+version = "2023.1.10"
+
+[[deps.Mustache]]
+deps = ["Printf", "Tables"]
+git-tree-sha1 = "3b2db451a872b20519ebb0cec759d3d81a1c6bcb"
+uuid = "ffc61752-8dc7-55ee-8c37-f3e9cdd09e70"
+version = "1.0.20"
+
+[[deps.Mux]]
+deps = ["AssetRegistry", "Base64", "HTTP", "Hiccup", "MbedTLS", "Pkg", "Sockets"]
+git-tree-sha1 = "7295d849103ac4fcbe3b2e439f229c5cc77b9b69"
+uuid = "a975b10e-0019-58db-a62f-e48ff68538c9"
+version = "1.0.2"
+
+[[deps.NFFTTools]]
+deps = ["AbstractFFTs", "AbstractNFFTs", "FFTW", "LinearAlgebra"]
+git-tree-sha1 = "d6a68b7ffbd50b4c99e514a1a6fb8ce84f6e247e"
+uuid = "7424e34d-94f7-41d6-98a0-85abaf1b6c91"
+version = "0.2.6"
+
+[[deps.NetworkOptions]]
+uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908"
+version = "1.2.0"
+
+[[deps.Observables]]
+git-tree-sha1 = "7438a59546cf62428fc9d1bc94729146d37a7225"
+uuid = "510215fc-4207-5dde-b226-833fc4488ee2"
+version = "0.5.5"
+
+[[deps.OffsetArrays]]
+git-tree-sha1 = "1a27764e945a152f7ca7efa04de513d473e9542e"
+uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881"
+version = "1.14.1"
+weakdeps = ["Adapt"]
+
+ [deps.OffsetArrays.extensions]
+ OffsetArraysAdaptExt = "Adapt"
+
+[[deps.OpenBLAS_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"]
+uuid = "4536629a-c528-5b80-bd46-f80d51c5b363"
+version = "0.3.23+4"
+
+[[deps.OpenMPI_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"]
+git-tree-sha1 = "e25c1778a98e34219a00455d6e4384e017ea9762"
+uuid = "fe0851c0-eecd-5654-98d4-656369965a5c"
+version = "4.1.6+0"
+
+[[deps.OpenSSL]]
+deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"]
+git-tree-sha1 = "38cb508d080d21dc1128f7fb04f20387ed4c0af4"
+uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c"
+version = "1.4.3"
+
+[[deps.OpenSSL_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "7493f61f55a6cce7325f197443aa80d32554ba10"
+uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95"
+version = "3.0.15+1"
+
+[[deps.OrderedCollections]]
+git-tree-sha1 = "dfdf5519f235516220579f949664f1bf44e741c5"
+uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d"
+version = "1.6.3"
+
+[[deps.Parameters]]
+deps = ["OrderedCollections", "UnPack"]
+git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe"
+uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a"
+version = "0.12.3"
+
+[[deps.Parsers]]
+deps = ["Dates", "PrecompileTools", "UUIDs"]
+git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821"
+uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0"
+version = "2.8.1"
+
+[[deps.Pidfile]]
+deps = ["FileWatching", "Test"]
+git-tree-sha1 = "2d8aaf8ee10df53d0dfb9b8ee44ae7c04ced2b03"
+uuid = "fa939f87-e72e-5be4-a000-7fc836dbe307"
+version = "1.3.0"
+
+[[deps.Pkg]]
+deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"]
+uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f"
+version = "1.10.0"
+
+[[deps.PlotlyBase]]
+deps = ["ColorSchemes", "Dates", "DelimitedFiles", "DocStringExtensions", "JSON", "LaTeXStrings", "Logging", "Parameters", "Pkg", "REPL", "Requires", "Statistics", "UUIDs"]
+git-tree-sha1 = "56baf69781fc5e61607c3e46227ab17f7040ffa2"
+uuid = "a03496cd-edff-5a9b-9e67-9cda94a718b5"
+version = "0.8.19"
+
+[[deps.PlotlyJS]]
+deps = ["Base64", "Blink", "DelimitedFiles", "JSExpr", "JSON", "Kaleido_jll", "Markdown", "Pkg", "PlotlyBase", "PlotlyKaleido", "REPL", "Reexport", "Requires", "WebIO"]
+git-tree-sha1 = "f198c8a80c08987a2915156e6e6131e5d73b97f4"
+uuid = "f0f68f2c-4968-5e81-91da-67840de0976a"
+version = "0.18.14"
+
+ [deps.PlotlyJS.extensions]
+ CSVExt = "CSV"
+ DataFramesExt = ["DataFrames", "CSV"]
+ IJuliaExt = "IJulia"
+ JSON3Ext = "JSON3"
+
+ [deps.PlotlyJS.weakdeps]
+ CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b"
+ DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
+ IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a"
+ JSON3 = "0f8b85d8-7281-11e9-16c2-39a750bddbf1"
+
+[[deps.PlotlyKaleido]]
+deps = ["Base64", "JSON", "Kaleido_jll"]
+git-tree-sha1 = "3210de4d88af7ca5de9e26305758a59aabc48aac"
+uuid = "f2990250-8cf9-495f-b13a-cce12b45703c"
+version = "2.2.5"
+
+[[deps.PlutoPlotly]]
+deps = ["AbstractPlutoDingetjes", "Artifacts", "BaseDirs", "Colors", "Dates", "Downloads", "HypertextLiteral", "InteractiveUtils", "LaTeXStrings", "Markdown", "Pkg", "PlotlyBase", "Reexport", "TOML"]
+git-tree-sha1 = "653b48f9c4170343c43c2ea0267e451b68d69051"
+uuid = "8e989ff0-3d88-8e9f-f020-2b208a939ff0"
+version = "0.5.0"
+
+ [deps.PlutoPlotly.extensions]
+ PlotlyKaleidoExt = "PlotlyKaleido"
+ UnitfulExt = "Unitful"
+
+ [deps.PlutoPlotly.weakdeps]
+ PlotlyKaleido = "f2990250-8cf9-495f-b13a-cce12b45703c"
+ Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
+
+[[deps.PlutoUI]]
+deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"]
+git-tree-sha1 = "eba4810d5e6a01f612b948c9fa94f905b49087b0"
+uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8"
+version = "0.7.60"
+
+[[deps.PrecompileTools]]
+deps = ["Preferences"]
+git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f"
+uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a"
+version = "1.2.1"
+
+[[deps.Preferences]]
+deps = ["TOML"]
+git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6"
+uuid = "21216c6a-2e73-6563-6e65-726566657250"
+version = "1.4.3"
+
+[[deps.Printf]]
+deps = ["Unicode"]
+uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7"
+
+[[deps.ProgressLogging]]
+deps = ["Logging", "SHA", "UUIDs"]
+git-tree-sha1 = "80d919dee55b9c50e8d9e2da5eeafff3fe58b539"
+uuid = "33c8b6b6-d38a-422a-b730-caa89a2f386c"
+version = "0.1.4"
+
+[[deps.ProgressMeter]]
+deps = ["Distributed", "Printf"]
+git-tree-sha1 = "8f6bc219586aef8baf0ff9a5fe16ee9c70cb65e4"
+uuid = "92933f4c-e287-5a05-a399-4b506db050ca"
+version = "1.10.2"
+
+[[deps.REPL]]
+deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"]
+uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb"
+
+[[deps.Random]]
+deps = ["SHA"]
+uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
+
+[[deps.Ratios]]
+deps = ["Requires"]
+git-tree-sha1 = "1342a47bf3260ee108163042310d26f2be5ec90b"
+uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439"
+version = "0.4.5"
+weakdeps = ["FixedPointNumbers"]
+
+ [deps.Ratios.extensions]
+ RatiosFixedPointNumbersExt = "FixedPointNumbers"
+
+[[deps.Reexport]]
+git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b"
+uuid = "189a3867-3050-52da-a836-e630ba90ab69"
+version = "1.2.2"
+
+[[deps.Referenceables]]
+deps = ["Adapt"]
+git-tree-sha1 = "02d31ad62838181c1a3a5fd23a1ce5914a643601"
+uuid = "42d2dcc6-99eb-4e98-b66c-637b7d73030e"
+version = "0.1.3"
+
+[[deps.Requires]]
+deps = ["UUIDs"]
+git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7"
+uuid = "ae029012-a4dd-5104-9daa-d747884805df"
+version = "1.3.0"
+
+[[deps.SHA]]
+uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce"
+version = "0.7.0"
+
+[[deps.Serialization]]
+uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b"
+
+[[deps.Setfield]]
+deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"]
+git-tree-sha1 = "e2cc6d8c88613c05e1defb55170bf5ff211fbeac"
+uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46"
+version = "1.1.1"
+
+[[deps.SharedArrays]]
+deps = ["Distributed", "Mmap", "Random", "Serialization"]
+uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383"
+
+[[deps.SimpleBufferStream]]
+git-tree-sha1 = "f305871d2f381d21527c770d4788c06c097c9bc1"
+uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7"
+version = "1.2.0"
+
+[[deps.Sockets]]
+uuid = "6462fe0b-24de-5631-8697-dd941f90decc"
+
+[[deps.SparseArrays]]
+deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"]
+uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
+version = "1.10.0"
+
+[[deps.SplittablesBase]]
+deps = ["Setfield", "Test"]
+git-tree-sha1 = "e08a62abc517eb79667d0a29dc08a3b589516bb5"
+uuid = "171d559e-b47b-412a-8079-5efa626c420e"
+version = "0.1.15"
+
+[[deps.StaticArrays]]
+deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"]
+git-tree-sha1 = "eeafab08ae20c62c44c8399ccb9354a04b80db50"
+uuid = "90137ffa-7385-5640-81b9-e52037218182"
+version = "1.9.7"
+weakdeps = ["ChainRulesCore", "Statistics"]
+
+ [deps.StaticArrays.extensions]
+ StaticArraysChainRulesCoreExt = "ChainRulesCore"
+ StaticArraysStatisticsExt = "Statistics"
+
+[[deps.StaticArraysCore]]
+git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682"
+uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c"
+version = "1.4.3"
+
+[[deps.Statistics]]
+deps = ["LinearAlgebra", "SparseArrays"]
+uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
+version = "1.10.0"
+
+[[deps.SuiteSparse_jll]]
+deps = ["Artifacts", "Libdl", "libblastrampoline_jll"]
+uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c"
+version = "7.2.1+1"
+
+[[deps.Suppressor]]
+deps = ["Logging"]
+git-tree-sha1 = "6dbb5b635c5437c68c28c2ac9e39b87138f37c0a"
+uuid = "fd094767-a336-5f1f-9728-57cf17d0bbfb"
+version = "0.2.8"
+
+[[deps.TOML]]
+deps = ["Dates"]
+uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76"
+version = "1.0.3"
+
+[[deps.TableTraits]]
+deps = ["IteratorInterfaceExtensions"]
+git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39"
+uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c"
+version = "1.0.1"
+
+[[deps.Tables]]
+deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"]
+git-tree-sha1 = "598cd7c1f68d1e205689b1c2fe65a9f85846f297"
+uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
+version = "1.12.0"
+
+[[deps.Tar]]
+deps = ["ArgTools", "SHA"]
+uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e"
+version = "1.10.0"
+
+[[deps.TensorCore]]
+deps = ["LinearAlgebra"]
+git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6"
+uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50"
+version = "0.1.1"
+
+[[deps.Test]]
+deps = ["InteractiveUtils", "Logging", "Random", "Serialization"]
+uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
+
+[[deps.ThreadsX]]
+deps = ["Accessors", "ArgCheck", "BangBang", "ConstructionBase", "InitialValues", "MicroCollections", "Referenceables", "SplittablesBase", "Transducers"]
+git-tree-sha1 = "70bd8244f4834d46c3d68bd09e7792d8f571ef04"
+uuid = "ac1d9e8a-700a-412c-b207-f0111f4b6c0d"
+version = "0.1.12"
+
+[[deps.TranscodingStreams]]
+git-tree-sha1 = "e84b3a11b9bece70d14cce63406bbc79ed3464d2"
+uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa"
+version = "0.11.2"
+
+[[deps.Transducers]]
+deps = ["Accessors", "Adapt", "ArgCheck", "BangBang", "Baselet", "CompositionsBase", "ConstructionBase", "DefineSingletons", "Distributed", "InitialValues", "Logging", "Markdown", "MicroCollections", "Requires", "SplittablesBase", "Tables"]
+git-tree-sha1 = "5215a069867476fc8e3469602006b9670e68da23"
+uuid = "28d57a85-8fef-5791-bfe6-a80928e7c999"
+version = "0.4.82"
+
+ [deps.Transducers.extensions]
+ TransducersBlockArraysExt = "BlockArrays"
+ TransducersDataFramesExt = "DataFrames"
+ TransducersLazyArraysExt = "LazyArrays"
+ TransducersOnlineStatsBaseExt = "OnlineStatsBase"
+ TransducersReferenceablesExt = "Referenceables"
+
+ [deps.Transducers.weakdeps]
+ BlockArrays = "8e7c35d0-a365-5155-bbbb-fb81a777f24e"
+ DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
+ LazyArrays = "5078a376-72f3-5289-bfd5-ec5146d43c02"
+ OnlineStatsBase = "925886fa-5bf2-5e8e-b522-a9147a512338"
+ Referenceables = "42d2dcc6-99eb-4e98-b66c-637b7d73030e"
+
+[[deps.Tricks]]
+git-tree-sha1 = "7822b97e99a1672bfb1b49b668a6d46d58d8cbcb"
+uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775"
+version = "0.1.9"
+
+[[deps.URIs]]
+git-tree-sha1 = "67db6cc7b3821e19ebe75791a9dd19c9b1188f2b"
+uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4"
+version = "1.5.1"
+
+[[deps.UUIDs]]
+deps = ["Random", "SHA"]
+uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4"
+
+[[deps.UnPack]]
+git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b"
+uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed"
+version = "1.0.2"
+
+[[deps.Unicode]]
+uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5"
+
+[[deps.UnsafeAtomics]]
+git-tree-sha1 = "6331ac3440856ea1988316b46045303bef658278"
+uuid = "013be700-e6cd-48c3-b4a1-df204f14c38f"
+version = "0.2.1"
+
+[[deps.UnsafeAtomicsLLVM]]
+deps = ["LLVM", "UnsafeAtomics"]
+git-tree-sha1 = "2d17fabcd17e67d7625ce9c531fb9f40b7c42ce4"
+uuid = "d80eeb9a-aca5-4d75-85e5-170c8b632249"
+version = "0.2.1"
+
+[[deps.WebIO]]
+deps = ["AssetRegistry", "Base64", "Distributed", "FunctionalCollections", "JSON", "Logging", "Observables", "Pkg", "Random", "Requires", "Sockets", "UUIDs", "WebSockets", "Widgets"]
+git-tree-sha1 = "0eef0765186f7452e52236fa42ca8c9b3c11c6e3"
+uuid = "0f1e0344-ec1d-5b48-a673-e5cf874b6c29"
+version = "0.8.21"
+
+[[deps.WebSockets]]
+deps = ["Base64", "Dates", "HTTP", "Logging", "Sockets"]
+git-tree-sha1 = "4162e95e05e79922e44b9952ccbc262832e4ad07"
+uuid = "104b5d7c-a370-577a-8038-80a2059c5097"
+version = "1.6.0"
+
+[[deps.Widgets]]
+deps = ["Colors", "Dates", "Observables", "OrderedCollections"]
+git-tree-sha1 = "fcdae142c1cfc7d89de2d11e08721d0f2f86c98a"
+uuid = "cc8bc4a8-27d6-5769-a93b-9d913e69aa62"
+version = "0.6.6"
+
+[[deps.WoodburyMatrices]]
+deps = ["LinearAlgebra", "SparseArrays"]
+git-tree-sha1 = "c1a7aa6219628fcd757dede0ca95e245c5cd9511"
+uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6"
+version = "1.0.0"
+
+[[deps.Zlib_jll]]
+deps = ["Libdl"]
+uuid = "83775a58-1f1d-513f-b197-d71354ab007a"
+version = "1.2.13+1"
+
+[[deps.libaec_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "46bf7be2917b59b761247be3f317ddf75e50e997"
+uuid = "477f73a3-ac25-53e9-8cc3-50b2fa2566f0"
+version = "1.1.2+0"
+
+[[deps.libblastrampoline_jll]]
+deps = ["Artifacts", "Libdl"]
+uuid = "8e850b90-86db-534c-a0d3-1478176c7d93"
+version = "5.11.0+0"
+
+[[deps.nghttp2_jll]]
+deps = ["Artifacts", "Libdl"]
+uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d"
+version = "1.52.0+1"
+
+[[deps.oneTBB_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "7d0ea0f4895ef2f5cb83645fa689e52cb55cf493"
+uuid = "1317d2d5-d96f-522e-a858-c73665f53c3e"
+version = "2021.12.0+0"
+
+[[deps.p7zip_jll]]
+deps = ["Artifacts", "Libdl"]
+uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0"
+version = "17.4.0+2"
+"""
+
+# ╔═╡ Cell order:
+# ╟─a99c0c47-1b70-4362-a2f6-a7e3259606fa
+# ╟─1bb3e49b-1a19-4343-ac09-fbaf1cae4ba3
+# ╟─fc58640b-c44c-4c25-a4fd-5a0e17d7becd
+# ╟─dbf16676-64f2-4d9b-bf1b-8de06b048602
+# ╟─f49655cc-460e-4981-92ea-dfd6147308bf
+# ╠═0b7a405e-bbb5-11ee-05ca-4b1c8567398d
+# ╠═70dbc2bd-8b93-471d-8340-04d98a008ca6
+# ╟─77153e5c-71bd-42e3-bae9-e4811ffa7a3d
+# ╟─9e397426-b60b-4b98-be8b-f7f128621c44
+# ╟─92194fcb-582a-49ce-aad7-20b0145d40d3
+# ╟─ae72ffc5-7f8e-4907-a99e-8ad7cb8fddab
+# ╟─6b870443-7be5-4287-b957-ca5c14eda89c
+# ╟─7890f81e-cb15-48d2-a80c-9d73f9516056
+# ╟─cb659118-9f22-43c3-801d-49241dee4df6
+# ╟─42417eba-46e0-400e-a874-299533362c41
+# ╠═0b6c1f72-b040-483c-969b-88bfe09b32c3
+# ╟─4aab8a6f-d2ba-46f0-a1bf-ddc0dcf8437f
+# ╠═88eb41a5-d8c2-4f0e-b379-a8b05a341a82
+# ╟─a15d6b64-f8ee-4ee4-812c-d49cf5ea784d
+# ╟─f0a81c9f-5616-4663-948f-a4084e1719af
+# ╟─f57a2b6c-eb4c-45bd-8058-4a60b038925d
+# ╟─1a62ae71-58db-49ea-ae6a-9aea66145963
+# ╟─f21e9e59-25c3-4f06-8de4-792cb305eb01
+# ╟─eceb326a-cab6-465e-8e5c-e835881bd3b0
+# ╟─d54d6807-444f-4e0e-8fd6-84457974115a
+# ╟─d05dcba7-2f42-47bf-a172-6123d0113b3f
+# ╠═37f7fd7f-5cb1-48b5-b877-b2bc23a1e7dd
+# ╟─d9715bc1-49cd-4df8-8dbf-c06de42ad550
+# ╟─8dd704a4-bf50-4ddc-a832-d074bd52ad01
+# ╟─39f44025-2974-4c4c-b0c2-e21399bbdb1f
+# ╠═7b9ae381-d0fc-4d1d-b1ee-ad31a6445ff6
+# ╟─f73082ff-a6d3-41f8-8796-4114fa89d2bb
+# ╟─d0377f9a-680d-4501-90ca-9ea3ab681db4
+# ╠═d750cd5a-3c90-41ea-9942-5723a21da60a
+# ╟─44a31057-7b34-4c80-a273-6621c0773dc7
+# ╟─b0b53632-e6b8-47e9-8d3e-79f1e599315a
+# ╠═14cf6859-a4b9-4671-b022-659781c55144
+# ╟─6649f46e-3565-4cd6-86a5-9b03d00cc3db
+# ╟─c64d38cb-2433-4b90-abbf-1fc938f70584
+# ╠═c952ecf1-25ef-4b48-9c8f-e53ded302629
+# ╟─a8751a97-c131-407b-b211-573660452142
+# ╟─85834365-238b-4193-a0c0-d1859416ab6c
+# ╠═50b551d8-a212-4319-b25b-1f8ecdd2a491
+# ╟─eb0f1e07-24a1-4aa4-b3ef-b63caa97de34
+# ╟─4b1dc8bf-feb1-42b4-94f7-1b27975d944c
+# ╟─10e68e25-9f68-46c0-b1b0-e9b124706b67
+# ╟─8dc11175-ebc8-407a-ab0b-6d543f849a72
+# ╟─3d7e7d20-a77a-48b3-ad2e-6b621227be16
+# ╟─abea2c43-d83e-4438-8cd3-4be06b8174b3
+# ╟─7deadd58-b202-4508-b4c7-686f742cb713
+# ╟─00000000-0000-0000-0000-000000000001
+# ╟─00000000-0000-0000-0000-000000000002
diff --git a/dev/tutorial-pluto/03-low-field-boost-optimization/index.html b/dev/tutorial-pluto/03-low-field-boost-optimization/index.html
new file mode 100644
index 000000000..a3f5bc420
--- /dev/null
+++ b/dev/tutorial-pluto/03-low-field-boost-optimization/index.html
@@ -0,0 +1,2 @@
+
+Low-Field CMRA Optimization · KomaMRI.jl
Theme
Automatic (OS) documenter-light documenter-dark catppuccin-latte catppuccin-frappe catppuccin-macchiato catppuccin-mocha
This document was generated with Documenter.jl version 1.7.0 on Thursday 3 October 2024 . Using Julia version 1.10.5.
diff --git a/dev/tutorial-pluto/README/index.html b/dev/tutorial-pluto/README/index.html
index 442abc090..6c69dd0ec 100644
--- a/dev/tutorial-pluto/README/index.html
+++ b/dev/tutorial-pluto/README/index.html
@@ -1,2 +1,2 @@
-- · KomaMRI.jl This folder is intentionally left empty. It will be filled by docs/make.jl
in the gh-pages
branch.
Files matching the pluto-*.jl
pattern anywhere in examples/4.reproducible_notebooks
will be included.
All files included in this folder will be ignored.
Theme
Automatic (OS) documenter-light documenter-dark catppuccin-latte catppuccin-frappe catppuccin-macchiato catppuccin-mocha
This document was generated with Documenter.jl version 1.7.0 on Thursday 3 October 2024 . Using Julia version 1.10.5.
+- · KomaMRI.jl This folder is intentionally left empty. It will be filled by docs/make.jl
in the gh-pages
branch.
Files matching the pluto-*.jl
pattern anywhere in examples/4.reproducible_notebooks
will be included.
All files included in this folder will be ignored.
Theme
Automatic (OS) documenter-light documenter-dark catppuccin-latte catppuccin-frappe catppuccin-macchiato catppuccin-mocha
This document was generated with Documenter.jl version 1.7.0 on Thursday 3 October 2024 . Using Julia version 1.10.5.
diff --git a/dev/tutorial-pluto/index.html b/dev/tutorial-pluto/index.html
index be9faa577..f4b92ffe9 100644
--- a/dev/tutorial-pluto/index.html
+++ b/dev/tutorial-pluto/index.html
@@ -17,7 +17,7 @@
Notebooks