@jsenv/terminal-recorder 1.5.23 → 1.5.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/jsenv_terminal_recorder_node_modules.js +19 -15
- package/package.json +6 -6
- package/src/.jsenv/chrome@136.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.js.map +434 -1
- package/src/.jsenv/chrome@136.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-webgl/lib/addon-webgl.js.map +1134 -1
- package/src/.jsenv/chrome@136.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/xterm/lib/xterm.js.map +2558 -1
- package/src/.jsenv/chrome@136.00/@fs/Users/dmail/Documents/dev/jsenv/core/src/plugins/drop_to_open/client/drop_to_open.js +49 -0
- package/src/.jsenv/chrome@136.00/xterm.html +7 -0
- package/src/.jsenv/chrome@139.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-fit/lib/addon-fit.js +2 -0
- package/src/.jsenv/chrome@139.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-fit/lib/addon-fit.js.map +64 -0
- package/src/.jsenv/chrome@139.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.js +2 -0
- package/src/.jsenv/chrome@139.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.js.map +434 -0
- package/src/.jsenv/chrome@139.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.mjs.map +477 -0
- package/src/.jsenv/chrome@139.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-serialize/lib/addon-serialize7as_js_module=.mjs +749 -0
- package/src/.jsenv/chrome@139.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-webgl/lib/addon-webgl.js +2 -0
- package/src/.jsenv/chrome@139.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-webgl/lib/addon-webgl.js.map +1134 -0
- package/src/.jsenv/chrome@139.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/xterm/css/xterm.css +204 -0
- package/src/.jsenv/chrome@139.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/xterm/lib/xterm.js +2 -0
- package/src/.jsenv/chrome@139.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/xterm/lib/xterm.js.map +1 -0
- package/src/.jsenv/chrome@139.00/@fs/Users/dmail/Documents/dev/jsenv/core/packages/backend/server/src/services/autoreload_on_server_restart/client/autoreload_on_server_restart.js +133 -0
- package/src/.jsenv/chrome@139.00/@fs/Users/dmail/Documents/dev/jsenv/core/packages/internal/plugin-supervisor/src/client/supervisor.js +1410 -0
- package/src/.jsenv/chrome@139.00/@fs/Users/dmail/Documents/dev/jsenv/core/src/plugins/drop_to_open/client/drop_to_open.js +49 -0
- package/src/.jsenv/chrome@139.00/gif_encoder.js +400 -0
- package/src/.jsenv/chrome@139.00/gif_encoder.js.map +11 -0
- package/src/.jsenv/chrome@139.00/lzw_encoder.js +253 -0
- package/src/.jsenv/chrome@139.00/neuquant.js +498 -0
- package/src/.jsenv/chrome@139.00/terminal_recorder.js +389 -0
- package/src/.jsenv/chrome@139.00/terminal_recorder.js.map +11 -0
- package/src/.jsenv/chrome@139.00/xterm.html +59 -0
- package/src/.jsenv/chrome@139.00/xterm.html@L14C5-L18C14.js +5 -0
- package/src/.jsenv/chrome@139.00/xterm.html@L19C5-L24C14.js +7 -0
- package/src/.jsenv/chrome@139.00/xterm.html@L19C5-L24C14.js.map +11 -0
- package/src/.jsenv/chrome@141.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-fit/lib/addon-fit.js +2 -0
- package/src/.jsenv/chrome@141.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-fit/lib/addon-fit.js.map +64 -0
- package/src/.jsenv/chrome@141.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.js +2 -0
- package/src/.jsenv/chrome@141.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.js.map +434 -0
- package/src/.jsenv/chrome@141.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.mjs.map +477 -0
- package/src/.jsenv/chrome@141.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-serialize/lib/addon-serialize7as_js_module=.mjs +749 -0
- package/src/.jsenv/chrome@141.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-webgl/lib/addon-webgl.js +2 -0
- package/src/.jsenv/chrome@141.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-webgl/lib/addon-webgl.js.map +1134 -0
- package/src/.jsenv/chrome@141.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/xterm/css/xterm.css +204 -0
- package/src/.jsenv/chrome@141.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/xterm/lib/xterm.js +2 -0
- package/src/.jsenv/chrome@141.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/xterm/lib/xterm.js.map +2558 -0
- package/src/.jsenv/chrome@141.00/@fs/Users/dmail/Documents/dev/jsenv/core/packages/backend/server/src/services/autoreload_on_server_restart/client/autoreload_on_server_restart.js +133 -0
- package/src/.jsenv/chrome@141.00/@fs/Users/dmail/Documents/dev/jsenv/core/packages/internal/plugin-supervisor/src/client/supervisor.js +1410 -0
- package/src/.jsenv/chrome@141.00/@fs/Users/dmail/Documents/dev/jsenv/core/src/plugins/drop_to_open/client/drop_to_open.js +49 -0
- package/src/.jsenv/chrome@141.00/gif_encoder.js +400 -0
- package/src/.jsenv/chrome@141.00/gif_encoder.js.map +11 -0
- package/src/.jsenv/chrome@141.00/lzw_encoder.js +253 -0
- package/src/.jsenv/chrome@141.00/neuquant.js +498 -0
- package/src/.jsenv/chrome@141.00/terminal_recorder.js +389 -0
- package/src/.jsenv/chrome@141.00/terminal_recorder.js.map +11 -0
- package/src/.jsenv/chrome@141.00/xterm.html +59 -0
- package/src/.jsenv/chrome@141.00/xterm.html@L14C5-L18C14.js +5 -0
- package/src/.jsenv/chrome@141.00/xterm.html@L19C5-L24C14.js +7 -0
- package/src/.jsenv/chrome@141.00/xterm.html@L19C5-L24C14.js.map +11 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.WebglAddon=t():e.WebglAddon=t()}(self,(()=>(()=>{"use strict";var e={965:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GlyphRenderer=void 0;const s=i(374),r=i(509),o=i(855),n=i(859),a=i(381),h=11,l=h*Float32Array.BYTES_PER_ELEMENT;let c,d=0,_=0,u=0;class g extends n.Disposable{constructor(e,t,i,o){super(),this._terminal=e,this._gl=t,this._dimensions=i,this._optionsService=o,this._activeBuffer=0,this._vertices={count:0,attributes:new Float32Array(0),attributesBuffers:[new Float32Array(0),new Float32Array(0)]};const h=this._gl;void 0===r.TextureAtlas.maxAtlasPages&&(r.TextureAtlas.maxAtlasPages=Math.min(32,(0,s.throwIfFalsy)(h.getParameter(h.MAX_TEXTURE_IMAGE_UNITS))),r.TextureAtlas.maxTextureSize=(0,s.throwIfFalsy)(h.getParameter(h.MAX_TEXTURE_SIZE))),this._program=(0,s.throwIfFalsy)((0,a.createProgram)(h,"#version 300 es\nlayout (location = 0) in vec2 a_unitquad;\nlayout (location = 1) in vec2 a_cellpos;\nlayout (location = 2) in vec2 a_offset;\nlayout (location = 3) in vec2 a_size;\nlayout (location = 4) in float a_texpage;\nlayout (location = 5) in vec2 a_texcoord;\nlayout (location = 6) in vec2 a_texsize;\n\nuniform mat4 u_projection;\nuniform vec2 u_resolution;\n\nout vec2 v_texcoord;\nflat out int v_texpage;\n\nvoid main() {\n vec2 zeroToOne = (a_offset / u_resolution) + a_cellpos + (a_unitquad * a_size);\n gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n v_texpage = int(a_texpage);\n v_texcoord = a_texcoord + a_unitquad * a_texsize;\n}",function(e){let t="";for(let i=1;i<e;i++)t+=` else if (v_texpage == ${i}) { outColor = texture(u_texture[${i}], v_texcoord); }`;return`#version 300 es\nprecision lowp float;\n\nin vec2 v_texcoord;\nflat in int v_texpage;\n\nuniform sampler2D u_texture[${e}];\n\nout vec4 outColor;\n\nvoid main() {\n if (v_texpage == 0) {\n outColor = texture(u_texture[0], v_texcoord);\n } ${t}\n}`}(r.TextureAtlas.maxAtlasPages))),this.register((0,n.toDisposable)((()=>h.deleteProgram(this._program)))),this._projectionLocation=(0,s.throwIfFalsy)(h.getUniformLocation(this._program,"u_projection")),this._resolutionLocation=(0,s.throwIfFalsy)(h.getUniformLocation(this._program,"u_resolution")),this._textureLocation=(0,s.throwIfFalsy)(h.getUniformLocation(this._program,"u_texture")),this._vertexArrayObject=h.createVertexArray(),h.bindVertexArray(this._vertexArrayObject);const c=new Float32Array([0,0,1,0,0,1,1,1]),d=h.createBuffer();this.register((0,n.toDisposable)((()=>h.deleteBuffer(d)))),h.bindBuffer(h.ARRAY_BUFFER,d),h.bufferData(h.ARRAY_BUFFER,c,h.STATIC_DRAW),h.enableVertexAttribArray(0),h.vertexAttribPointer(0,2,this._gl.FLOAT,!1,0,0);const _=new Uint8Array([0,1,2,3]),u=h.createBuffer();this.register((0,n.toDisposable)((()=>h.deleteBuffer(u)))),h.bindBuffer(h.ELEMENT_ARRAY_BUFFER,u),h.bufferData(h.ELEMENT_ARRAY_BUFFER,_,h.STATIC_DRAW),this._attributesBuffer=(0,s.throwIfFalsy)(h.createBuffer()),this.register((0,n.toDisposable)((()=>h.deleteBuffer(this._attributesBuffer)))),h.bindBuffer(h.ARRAY_BUFFER,this._attributesBuffer),h.enableVertexAttribArray(2),h.vertexAttribPointer(2,2,h.FLOAT,!1,l,0),h.vertexAttribDivisor(2,1),h.enableVertexAttribArray(3),h.vertexAttribPointer(3,2,h.FLOAT,!1,l,2*Float32Array.BYTES_PER_ELEMENT),h.vertexAttribDivisor(3,1),h.enableVertexAttribArray(4),h.vertexAttribPointer(4,1,h.FLOAT,!1,l,4*Float32Array.BYTES_PER_ELEMENT),h.vertexAttribDivisor(4,1),h.enableVertexAttribArray(5),h.vertexAttribPointer(5,2,h.FLOAT,!1,l,5*Float32Array.BYTES_PER_ELEMENT),h.vertexAttribDivisor(5,1),h.enableVertexAttribArray(6),h.vertexAttribPointer(6,2,h.FLOAT,!1,l,7*Float32Array.BYTES_PER_ELEMENT),h.vertexAttribDivisor(6,1),h.enableVertexAttribArray(1),h.vertexAttribPointer(1,2,h.FLOAT,!1,l,9*Float32Array.BYTES_PER_ELEMENT),h.vertexAttribDivisor(1,1),h.useProgram(this._program);const g=new Int32Array(r.TextureAtlas.maxAtlasPages);for(let e=0;e<r.TextureAtlas.maxAtlasPages;e++)g[e]=e;h.uniform1iv(this._textureLocation,g),h.uniformMatrix4fv(this._projectionLocation,!1,a.PROJECTION_MATRIX),this._atlasTextures=[];for(let e=0;e<r.TextureAtlas.maxAtlasPages;e++){const t=new a.GLTexture((0,s.throwIfFalsy)(h.createTexture()));this.register((0,n.toDisposable)((()=>h.deleteTexture(t.texture)))),h.activeTexture(h.TEXTURE0+e),h.bindTexture(h.TEXTURE_2D,t.texture),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_WRAP_S,h.CLAMP_TO_EDGE),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_WRAP_T,h.CLAMP_TO_EDGE),h.texImage2D(h.TEXTURE_2D,0,h.RGBA,1,1,0,h.RGBA,h.UNSIGNED_BYTE,new Uint8Array([255,0,0,255])),this._atlasTextures[e]=t}h.enable(h.BLEND),h.blendFunc(h.SRC_ALPHA,h.ONE_MINUS_SRC_ALPHA),this.handleResize()}beginFrame(){return!this._atlas||this._atlas.beginFrame()}updateCell(e,t,i,s,r,o,n,a,h){this._updateCell(this._vertices.attributes,e,t,i,s,r,o,n,a,h)}_updateCell(e,t,i,r,n,a,l,g,v,f){d=(i*this._terminal.cols+t)*h,r!==o.NULL_CELL_CODE&&void 0!==r?this._atlas&&(c=g&&g.length>1?this._atlas.getRasterizedGlyphCombinedChar(g,n,a,l,!1):this._atlas.getRasterizedGlyph(r,n,a,l,!1),_=Math.floor((this._dimensions.device.cell.width-this._dimensions.device.char.width)/2),n!==f&&c.offset.x>_?(u=c.offset.x-_,e[d]=-(c.offset.x-u)+this._dimensions.device.char.left,e[d+1]=-c.offset.y+this._dimensions.device.char.top,e[d+2]=(c.size.x-u)/this._dimensions.device.canvas.width,e[d+3]=c.size.y/this._dimensions.device.canvas.height,e[d+4]=c.texturePage,e[d+5]=c.texturePositionClipSpace.x+u/this._atlas.pages[c.texturePage].canvas.width,e[d+6]=c.texturePositionClipSpace.y,e[d+7]=c.sizeClipSpace.x-u/this._atlas.pages[c.texturePage].canvas.width,e[d+8]=c.sizeClipSpace.y):(e[d]=-c.offset.x+this._dimensions.device.char.left,e[d+1]=-c.offset.y+this._dimensions.device.char.top,e[d+2]=c.size.x/this._dimensions.device.canvas.width,e[d+3]=c.size.y/this._dimensions.device.canvas.height,e[d+4]=c.texturePage,e[d+5]=c.texturePositionClipSpace.x,e[d+6]=c.texturePositionClipSpace.y,e[d+7]=c.sizeClipSpace.x,e[d+8]=c.sizeClipSpace.y),this._optionsService.rawOptions.rescaleOverlappingGlyphs&&(0,s.allowRescaling)(r,v,c.size.x,this._dimensions.device.cell.width)&&(e[d+2]=(this._dimensions.device.cell.width-1)/this._dimensions.device.canvas.width)):e.fill(0,d,d+h-1-2)}clear(){const e=this._terminal,t=e.cols*e.rows*h;this._vertices.count!==t?this._vertices.attributes=new Float32Array(t):this._vertices.attributes.fill(0);let i=0;for(;i<this._vertices.attributesBuffers.length;i++)this._vertices.count!==t?this._vertices.attributesBuffers[i]=new Float32Array(t):this._vertices.attributesBuffers[i].fill(0);this._vertices.count=t,i=0;for(let t=0;t<e.rows;t++)for(let s=0;s<e.cols;s++)this._vertices.attributes[i+9]=s/e.cols,this._vertices.attributes[i+10]=t/e.rows,i+=h}handleResize(){const e=this._gl;e.useProgram(this._program),e.viewport(0,0,e.canvas.width,e.canvas.height),e.uniform2f(this._resolutionLocation,e.canvas.width,e.canvas.height),this.clear()}render(e){if(!this._atlas)return;const t=this._gl;t.useProgram(this._program),t.bindVertexArray(this._vertexArrayObject),this._activeBuffer=(this._activeBuffer+1)%2;const i=this._vertices.attributesBuffers[this._activeBuffer];let s=0;for(let t=0;t<e.lineLengths.length;t++){const r=t*this._terminal.cols*h,o=this._vertices.attributes.subarray(r,r+e.lineLengths[t]*h);i.set(o,s),s+=o.length}t.bindBuffer(t.ARRAY_BUFFER,this._attributesBuffer),t.bufferData(t.ARRAY_BUFFER,i.subarray(0,s),t.STREAM_DRAW);for(let e=0;e<this._atlas.pages.length;e++)this._atlas.pages[e].version!==this._atlasTextures[e].version&&this._bindAtlasPageTexture(t,this._atlas,e);t.drawElementsInstanced(t.TRIANGLE_STRIP,4,t.UNSIGNED_BYTE,0,s/h)}setAtlas(e){this._atlas=e;for(const e of this._atlasTextures)e.version=-1}_bindAtlasPageTexture(e,t,i){e.activeTexture(e.TEXTURE0+i),e.bindTexture(e.TEXTURE_2D,this._atlasTextures[i].texture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.pages[i].canvas),e.generateMipmap(e.TEXTURE_2D),this._atlasTextures[i].version=t.pages[i].version}setDimensions(e){this._dimensions=e}}t.GlyphRenderer=g},742:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RectangleRenderer=void 0;const s=i(374),r=i(859),o=i(310),n=i(381),a=8*Float32Array.BYTES_PER_ELEMENT;class h{constructor(){this.attributes=new Float32Array(160),this.count=0}}let l=0,c=0,d=0,_=0,u=0,g=0,v=0;class f extends r.Disposable{constructor(e,t,i,o){super(),this._terminal=e,this._gl=t,this._dimensions=i,this._themeService=o,this._vertices=new h,this._verticesCursor=new h;const l=this._gl;this._program=(0,s.throwIfFalsy)((0,n.createProgram)(l,"#version 300 es\nlayout (location = 0) in vec2 a_position;\nlayout (location = 1) in vec2 a_size;\nlayout (location = 2) in vec4 a_color;\nlayout (location = 3) in vec2 a_unitquad;\n\nuniform mat4 u_projection;\n\nout vec4 v_color;\n\nvoid main() {\n vec2 zeroToOne = a_position + (a_unitquad * a_size);\n gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n v_color = a_color;\n}","#version 300 es\nprecision lowp float;\n\nin vec4 v_color;\n\nout vec4 outColor;\n\nvoid main() {\n outColor = v_color;\n}")),this.register((0,r.toDisposable)((()=>l.deleteProgram(this._program)))),this._projectionLocation=(0,s.throwIfFalsy)(l.getUniformLocation(this._program,"u_projection")),this._vertexArrayObject=l.createVertexArray(),l.bindVertexArray(this._vertexArrayObject);const c=new Float32Array([0,0,1,0,0,1,1,1]),d=l.createBuffer();this.register((0,r.toDisposable)((()=>l.deleteBuffer(d)))),l.bindBuffer(l.ARRAY_BUFFER,d),l.bufferData(l.ARRAY_BUFFER,c,l.STATIC_DRAW),l.enableVertexAttribArray(3),l.vertexAttribPointer(3,2,this._gl.FLOAT,!1,0,0);const _=new Uint8Array([0,1,2,3]),u=l.createBuffer();this.register((0,r.toDisposable)((()=>l.deleteBuffer(u)))),l.bindBuffer(l.ELEMENT_ARRAY_BUFFER,u),l.bufferData(l.ELEMENT_ARRAY_BUFFER,_,l.STATIC_DRAW),this._attributesBuffer=(0,s.throwIfFalsy)(l.createBuffer()),this.register((0,r.toDisposable)((()=>l.deleteBuffer(this._attributesBuffer)))),l.bindBuffer(l.ARRAY_BUFFER,this._attributesBuffer),l.enableVertexAttribArray(0),l.vertexAttribPointer(0,2,l.FLOAT,!1,a,0),l.vertexAttribDivisor(0,1),l.enableVertexAttribArray(1),l.vertexAttribPointer(1,2,l.FLOAT,!1,a,2*Float32Array.BYTES_PER_ELEMENT),l.vertexAttribDivisor(1,1),l.enableVertexAttribArray(2),l.vertexAttribPointer(2,4,l.FLOAT,!1,a,4*Float32Array.BYTES_PER_ELEMENT),l.vertexAttribDivisor(2,1),this._updateCachedColors(o.colors),this.register(this._themeService.onChangeColors((e=>{this._updateCachedColors(e),this._updateViewportRectangle()})))}renderBackgrounds(){this._renderVertices(this._vertices)}renderCursor(){this._renderVertices(this._verticesCursor)}_renderVertices(e){const t=this._gl;t.useProgram(this._program),t.bindVertexArray(this._vertexArrayObject),t.uniformMatrix4fv(this._projectionLocation,!1,n.PROJECTION_MATRIX),t.bindBuffer(t.ARRAY_BUFFER,this._attributesBuffer),t.bufferData(t.ARRAY_BUFFER,e.attributes,t.DYNAMIC_DRAW),t.drawElementsInstanced(this._gl.TRIANGLE_STRIP,4,t.UNSIGNED_BYTE,0,e.count)}handleResize(){this._updateViewportRectangle()}setDimensions(e){this._dimensions=e}_updateCachedColors(e){this._bgFloat=this._colorToFloat32Array(e.background),this._cursorFloat=this._colorToFloat32Array(e.cursor)}_updateViewportRectangle(){this._addRectangleFloat(this._vertices.attributes,0,0,0,this._terminal.cols*this._dimensions.device.cell.width,this._terminal.rows*this._dimensions.device.cell.height,this._bgFloat)}updateBackgrounds(e){const t=this._terminal,i=this._vertices;let s,r,n,a,h,l,c,d,_,u,g,v=1;for(s=0;s<t.rows;s++){for(n=-1,a=0,h=0,l=!1,r=0;r<t.cols;r++)c=(s*t.cols+r)*o.RENDER_MODEL_INDICIES_PER_CELL,d=e.cells[c+o.RENDER_MODEL_BG_OFFSET],_=e.cells[c+o.RENDER_MODEL_FG_OFFSET],u=!!(67108864&_),(d!==a||_!==h&&(l||u))&&((0!==a||l&&0!==h)&&(g=8*v++,this._updateRectangle(i,g,h,a,n,r,s)),n=r,a=d,h=_,l=u);(0!==a||l&&0!==h)&&(g=8*v++,this._updateRectangle(i,g,h,a,n,t.cols,s))}i.count=v}updateCursor(e){const t=this._verticesCursor,i=e.cursor;if(!i||"block"===i.style)return void(t.count=0);let s,r=0;"bar"!==i.style&&"outline"!==i.style||(s=8*r++,this._addRectangleFloat(t.attributes,s,i.x*this._dimensions.device.cell.width,i.y*this._dimensions.device.cell.height,"bar"===i.style?i.dpr*i.cursorWidth:i.dpr,this._dimensions.device.cell.height,this._cursorFloat)),"underline"!==i.style&&"outline"!==i.style||(s=8*r++,this._addRectangleFloat(t.attributes,s,i.x*this._dimensions.device.cell.width,(i.y+1)*this._dimensions.device.cell.height-i.dpr,i.width*this._dimensions.device.cell.width,i.dpr,this._cursorFloat)),"outline"===i.style&&(s=8*r++,this._addRectangleFloat(t.attributes,s,i.x*this._dimensions.device.cell.width,i.y*this._dimensions.device.cell.height,i.width*this._dimensions.device.cell.width,i.dpr,this._cursorFloat),s=8*r++,this._addRectangleFloat(t.attributes,s,(i.x+i.width)*this._dimensions.device.cell.width-i.dpr,i.y*this._dimensions.device.cell.height,i.dpr,this._dimensions.device.cell.height,this._cursorFloat)),t.count=r}_updateRectangle(e,t,i,s,r,o,a){if(67108864&i)switch(50331648&i){case 16777216:case 33554432:l=this._themeService.colors.ansi[255&i].rgba;break;case 50331648:l=(16777215&i)<<8;break;default:l=this._themeService.colors.foreground.rgba}else switch(50331648&s){case 16777216:case 33554432:l=this._themeService.colors.ansi[255&s].rgba;break;case 50331648:l=(16777215&s)<<8;break;default:l=this._themeService.colors.background.rgba}e.attributes.length<t+4&&(e.attributes=(0,n.expandFloat32Array)(e.attributes,this._terminal.rows*this._terminal.cols*8)),c=r*this._dimensions.device.cell.width,d=a*this._dimensions.device.cell.height,_=(l>>24&255)/255,u=(l>>16&255)/255,g=(l>>8&255)/255,v=1,this._addRectangle(e.attributes,t,c,d,(o-r)*this._dimensions.device.cell.width,this._dimensions.device.cell.height,_,u,g,v)}_addRectangle(e,t,i,s,r,o,n,a,h,l){e[t]=i/this._dimensions.device.canvas.width,e[t+1]=s/this._dimensions.device.canvas.height,e[t+2]=r/this._dimensions.device.canvas.width,e[t+3]=o/this._dimensions.device.canvas.height,e[t+4]=n,e[t+5]=a,e[t+6]=h,e[t+7]=l}_addRectangleFloat(e,t,i,s,r,o,n){e[t]=i/this._dimensions.device.canvas.width,e[t+1]=s/this._dimensions.device.canvas.height,e[t+2]=r/this._dimensions.device.canvas.width,e[t+3]=o/this._dimensions.device.canvas.height,e[t+4]=n[0],e[t+5]=n[1],e[t+6]=n[2],e[t+7]=n[3]}_colorToFloat32Array(e){return new Float32Array([(e.rgba>>24&255)/255,(e.rgba>>16&255)/255,(e.rgba>>8&255)/255,(255&e.rgba)/255])}}t.RectangleRenderer=f},310:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RenderModel=t.COMBINED_CHAR_BIT_MASK=t.RENDER_MODEL_EXT_OFFSET=t.RENDER_MODEL_FG_OFFSET=t.RENDER_MODEL_BG_OFFSET=t.RENDER_MODEL_INDICIES_PER_CELL=void 0;const s=i(296);t.RENDER_MODEL_INDICIES_PER_CELL=4,t.RENDER_MODEL_BG_OFFSET=1,t.RENDER_MODEL_FG_OFFSET=2,t.RENDER_MODEL_EXT_OFFSET=3,t.COMBINED_CHAR_BIT_MASK=2147483648,t.RenderModel=class{constructor(){this.cells=new Uint32Array(0),this.lineLengths=new Uint32Array(0),this.selection=(0,s.createSelectionRenderModel)()}resize(e,i){const s=e*i*t.RENDER_MODEL_INDICIES_PER_CELL;s!==this.cells.length&&(this.cells=new Uint32Array(s),this.lineLengths=new Uint32Array(i))}clear(){this.cells.fill(0,0),this.lineLengths.fill(0,0)}}},666:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.JoinedCellData=t.WebglRenderer=void 0;const s=i(820),r=i(274),o=i(627),n=i(457),a=i(56),h=i(374),l=i(345),c=i(859),d=i(147),_=i(782),u=i(855),g=i(965),v=i(742),f=i(310),p=i(733);class C extends c.Disposable{constructor(e,t,i,n,d,u,g,v,C){super(),this._terminal=e,this._characterJoinerService=t,this._charSizeService=i,this._coreBrowserService=n,this._coreService=d,this._decorationService=u,this._optionsService=g,this._themeService=v,this._cursorBlinkStateManager=new c.MutableDisposable,this._charAtlasDisposable=this.register(new c.MutableDisposable),this._observerDisposable=this.register(new c.MutableDisposable),this._model=new f.RenderModel,this._workCell=new _.CellData,this._workCell2=new _.CellData,this._rectangleRenderer=this.register(new c.MutableDisposable),this._glyphRenderer=this.register(new c.MutableDisposable),this._onChangeTextureAtlas=this.register(new l.EventEmitter),this.onChangeTextureAtlas=this._onChangeTextureAtlas.event,this._onAddTextureAtlasCanvas=this.register(new l.EventEmitter),this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event,this._onRemoveTextureAtlasCanvas=this.register(new l.EventEmitter),this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event,this._onRequestRedraw=this.register(new l.EventEmitter),this.onRequestRedraw=this._onRequestRedraw.event,this._onContextLoss=this.register(new l.EventEmitter),this.onContextLoss=this._onContextLoss.event,this.register(this._themeService.onChangeColors((()=>this._handleColorChange()))),this._cellColorResolver=new r.CellColorResolver(this._terminal,this._optionsService,this._model.selection,this._decorationService,this._coreBrowserService,this._themeService),this._core=this._terminal._core,this._renderLayers=[new p.LinkRenderLayer(this._core.screenElement,2,this._terminal,this._core.linkifier,this._coreBrowserService,g,this._themeService)],this.dimensions=(0,h.createRenderDimensions)(),this._devicePixelRatio=this._coreBrowserService.dpr,this._updateDimensions(),this._updateCursorBlink(),this.register(g.onOptionChange((()=>this._handleOptionsChanged()))),this._canvas=this._coreBrowserService.mainDocument.createElement("canvas");const m={antialias:!1,depth:!1,preserveDrawingBuffer:C};if(this._gl=this._canvas.getContext("webgl2",m),!this._gl)throw new Error("WebGL2 not supported "+this._gl);this.register((0,s.addDisposableDomListener)(this._canvas,"webglcontextlost",(e=>{console.log("webglcontextlost event received"),e.preventDefault(),this._contextRestorationTimeout=setTimeout((()=>{this._contextRestorationTimeout=void 0,console.warn("webgl context not restored; firing onContextLoss"),this._onContextLoss.fire(e)}),3e3)}))),this.register((0,s.addDisposableDomListener)(this._canvas,"webglcontextrestored",(e=>{console.warn("webglcontextrestored event received"),clearTimeout(this._contextRestorationTimeout),this._contextRestorationTimeout=void 0,(0,o.removeTerminalFromCache)(this._terminal),this._initializeWebGLState(),this._requestRedrawViewport()}))),this._observerDisposable.value=(0,a.observeDevicePixelDimensions)(this._canvas,this._coreBrowserService.window,((e,t)=>this._setCanvasDevicePixelDimensions(e,t))),this.register(this._coreBrowserService.onWindowChange((e=>{this._observerDisposable.value=(0,a.observeDevicePixelDimensions)(this._canvas,e,((e,t)=>this._setCanvasDevicePixelDimensions(e,t)))}))),this._core.screenElement.appendChild(this._canvas),[this._rectangleRenderer.value,this._glyphRenderer.value]=this._initializeWebGLState(),this._isAttached=this._coreBrowserService.window.document.body.contains(this._core.screenElement),this.register((0,c.toDisposable)((()=>{for(const e of this._renderLayers)e.dispose();this._canvas.parentElement?.removeChild(this._canvas),(0,o.removeTerminalFromCache)(this._terminal)})))}get textureAtlas(){return this._charAtlas?.pages[0].canvas}_handleColorChange(){this._refreshCharAtlas(),this._clearModel(!0)}handleDevicePixelRatioChange(){this._devicePixelRatio!==this._coreBrowserService.dpr&&(this._devicePixelRatio=this._coreBrowserService.dpr,this.handleResize(this._terminal.cols,this._terminal.rows))}handleResize(e,t){this._updateDimensions(),this._model.resize(this._terminal.cols,this._terminal.rows);for(const e of this._renderLayers)e.resize(this._terminal,this.dimensions);this._canvas.width=this.dimensions.device.canvas.width,this._canvas.height=this.dimensions.device.canvas.height,this._canvas.style.width=`${this.dimensions.css.canvas.width}px`,this._canvas.style.height=`${this.dimensions.css.canvas.height}px`,this._core.screenElement.style.width=`${this.dimensions.css.canvas.width}px`,this._core.screenElement.style.height=`${this.dimensions.css.canvas.height}px`,this._rectangleRenderer.value?.setDimensions(this.dimensions),this._rectangleRenderer.value?.handleResize(),this._glyphRenderer.value?.setDimensions(this.dimensions),this._glyphRenderer.value?.handleResize(),this._refreshCharAtlas(),this._clearModel(!1)}handleCharSizeChanged(){this.handleResize(this._terminal.cols,this._terminal.rows)}handleBlur(){for(const e of this._renderLayers)e.handleBlur(this._terminal);this._cursorBlinkStateManager.value?.pause(),this._requestRedrawViewport()}handleFocus(){for(const e of this._renderLayers)e.handleFocus(this._terminal);this._cursorBlinkStateManager.value?.resume(),this._requestRedrawViewport()}handleSelectionChanged(e,t,i){for(const s of this._renderLayers)s.handleSelectionChanged(this._terminal,e,t,i);this._model.selection.update(this._core,e,t,i),this._requestRedrawViewport()}handleCursorMove(){for(const e of this._renderLayers)e.handleCursorMove(this._terminal);this._cursorBlinkStateManager.value?.restartBlinkAnimation()}_handleOptionsChanged(){this._updateDimensions(),this._refreshCharAtlas(),this._updateCursorBlink()}_initializeWebGLState(){return this._rectangleRenderer.value=new v.RectangleRenderer(this._terminal,this._gl,this.dimensions,this._themeService),this._glyphRenderer.value=new g.GlyphRenderer(this._terminal,this._gl,this.dimensions,this._optionsService),this.handleCharSizeChanged(),[this._rectangleRenderer.value,this._glyphRenderer.value]}_refreshCharAtlas(){if(this.dimensions.device.char.width<=0&&this.dimensions.device.char.height<=0)return void(this._isAttached=!1);const e=(0,o.acquireTextureAtlas)(this._terminal,this._optionsService.rawOptions,this._themeService.colors,this.dimensions.device.cell.width,this.dimensions.device.cell.height,this.dimensions.device.char.width,this.dimensions.device.char.height,this._coreBrowserService.dpr);this._charAtlas!==e&&(this._onChangeTextureAtlas.fire(e.pages[0].canvas),this._charAtlasDisposable.value=(0,c.getDisposeArrayDisposable)([(0,l.forwardEvent)(e.onAddTextureAtlasCanvas,this._onAddTextureAtlasCanvas),(0,l.forwardEvent)(e.onRemoveTextureAtlasCanvas,this._onRemoveTextureAtlasCanvas)])),this._charAtlas=e,this._charAtlas.warmUp(),this._glyphRenderer.value?.setAtlas(this._charAtlas)}_clearModel(e){this._model.clear(),e&&this._glyphRenderer.value?.clear()}clearTextureAtlas(){this._charAtlas?.clearTexture(),this._clearModel(!0),this._requestRedrawViewport()}clear(){this._clearModel(!0);for(const e of this._renderLayers)e.reset(this._terminal);this._cursorBlinkStateManager.value?.restartBlinkAnimation(),this._updateCursorBlink()}registerCharacterJoiner(e){return-1}deregisterCharacterJoiner(e){return!1}renderRows(e,t){if(!this._isAttached){if(!(this._coreBrowserService.window.document.body.contains(this._core.screenElement)&&this._charSizeService.width&&this._charSizeService.height))return;this._updateDimensions(),this._refreshCharAtlas(),this._isAttached=!0}for(const i of this._renderLayers)i.handleGridChanged(this._terminal,e,t);this._glyphRenderer.value&&this._rectangleRenderer.value&&(this._glyphRenderer.value.beginFrame()?(this._clearModel(!0),this._updateModel(0,this._terminal.rows-1)):this._updateModel(e,t),this._rectangleRenderer.value.renderBackgrounds(),this._glyphRenderer.value.render(this._model),this._cursorBlinkStateManager.value&&!this._cursorBlinkStateManager.value.isCursorVisible||this._rectangleRenderer.value.renderCursor())}_updateCursorBlink(){this._terminal.options.cursorBlink?this._cursorBlinkStateManager.value=new n.CursorBlinkStateManager((()=>{this._requestRedrawCursor()}),this._coreBrowserService):this._cursorBlinkStateManager.clear(),this._requestRedrawCursor()}_updateModel(e,t){const i=this._core;let s,r,o,n,a,h,l,c,d,_,g,v,p,C,x=this._workCell;e=L(e,i.rows-1,0),t=L(t,i.rows-1,0);const w=this._terminal.buffer.active.baseY+this._terminal.buffer.active.cursorY,b=w-i.buffer.ydisp,M=Math.min(this._terminal.buffer.active.cursorX,i.cols-1);let R=-1;const y=this._coreService.isCursorInitialized&&!this._coreService.isCursorHidden&&(!this._cursorBlinkStateManager.value||this._cursorBlinkStateManager.value.isCursorVisible);this._model.cursor=void 0;let A=!1;for(r=e;r<=t;r++)for(o=r+i.buffer.ydisp,n=i.buffer.lines.get(o),this._model.lineLengths[r]=0,a=this._characterJoinerService.getJoinedCharacters(o),p=0;p<i.cols;p++)if(s=this._cellColorResolver.result.bg,n.loadCell(p,x),0===p&&(s=this._cellColorResolver.result.bg),h=!1,l=p,a.length>0&&p===a[0][0]&&(h=!0,c=a.shift(),x=new m(x,n.translateToString(!0,c[0],c[1]),c[1]-c[0]),l=c[1]-1),d=x.getChars(),_=x.getCode(),v=(r*i.cols+p)*f.RENDER_MODEL_INDICIES_PER_CELL,this._cellColorResolver.resolve(x,p,o,this.dimensions.device.cell.width),y&&o===w&&(p===M&&(this._model.cursor={x:M,y:b,width:x.getWidth(),style:this._coreBrowserService.isFocused?i.options.cursorStyle||"block":i.options.cursorInactiveStyle,cursorWidth:i.options.cursorWidth,dpr:this._devicePixelRatio},R=M+x.getWidth()-1),p>=M&&p<=R&&(this._coreBrowserService.isFocused&&"block"===(i.options.cursorStyle||"block")||!1===this._coreBrowserService.isFocused&&"block"===i.options.cursorInactiveStyle)&&(this._cellColorResolver.result.fg=50331648|this._themeService.colors.cursorAccent.rgba>>8&16777215,this._cellColorResolver.result.bg=50331648|this._themeService.colors.cursor.rgba>>8&16777215)),_!==u.NULL_CELL_CODE&&(this._model.lineLengths[r]=p+1),(this._model.cells[v]!==_||this._model.cells[v+f.RENDER_MODEL_BG_OFFSET]!==this._cellColorResolver.result.bg||this._model.cells[v+f.RENDER_MODEL_FG_OFFSET]!==this._cellColorResolver.result.fg||this._model.cells[v+f.RENDER_MODEL_EXT_OFFSET]!==this._cellColorResolver.result.ext)&&(A=!0,d.length>1&&(_|=f.COMBINED_CHAR_BIT_MASK),this._model.cells[v]=_,this._model.cells[v+f.RENDER_MODEL_BG_OFFSET]=this._cellColorResolver.result.bg,this._model.cells[v+f.RENDER_MODEL_FG_OFFSET]=this._cellColorResolver.result.fg,this._model.cells[v+f.RENDER_MODEL_EXT_OFFSET]=this._cellColorResolver.result.ext,g=x.getWidth(),this._glyphRenderer.value.updateCell(p,r,_,this._cellColorResolver.result.bg,this._cellColorResolver.result.fg,this._cellColorResolver.result.ext,d,g,s),h))for(x=this._workCell,p++;p<l;p++)C=(r*i.cols+p)*f.RENDER_MODEL_INDICIES_PER_CELL,this._glyphRenderer.value.updateCell(p,r,u.NULL_CELL_CODE,0,0,0,u.NULL_CELL_CHAR,0,0),this._model.cells[C]=u.NULL_CELL_CODE,this._model.cells[C+f.RENDER_MODEL_BG_OFFSET]=this._cellColorResolver.result.bg,this._model.cells[C+f.RENDER_MODEL_FG_OFFSET]=this._cellColorResolver.result.fg,this._model.cells[C+f.RENDER_MODEL_EXT_OFFSET]=this._cellColorResolver.result.ext;A&&this._rectangleRenderer.value.updateBackgrounds(this._model),this._rectangleRenderer.value.updateCursor(this._model)}_updateDimensions(){this._charSizeService.width&&this._charSizeService.height&&(this.dimensions.device.char.width=Math.floor(this._charSizeService.width*this._devicePixelRatio),this.dimensions.device.char.height=Math.ceil(this._charSizeService.height*this._devicePixelRatio),this.dimensions.device.cell.height=Math.floor(this.dimensions.device.char.height*this._optionsService.rawOptions.lineHeight),this.dimensions.device.char.top=1===this._optionsService.rawOptions.lineHeight?0:Math.round((this.dimensions.device.cell.height-this.dimensions.device.char.height)/2),this.dimensions.device.cell.width=this.dimensions.device.char.width+Math.round(this._optionsService.rawOptions.letterSpacing),this.dimensions.device.char.left=Math.floor(this._optionsService.rawOptions.letterSpacing/2),this.dimensions.device.canvas.height=this._terminal.rows*this.dimensions.device.cell.height,this.dimensions.device.canvas.width=this._terminal.cols*this.dimensions.device.cell.width,this.dimensions.css.canvas.height=Math.round(this.dimensions.device.canvas.height/this._devicePixelRatio),this.dimensions.css.canvas.width=Math.round(this.dimensions.device.canvas.width/this._devicePixelRatio),this.dimensions.css.cell.height=this.dimensions.device.cell.height/this._devicePixelRatio,this.dimensions.css.cell.width=this.dimensions.device.cell.width/this._devicePixelRatio)}_setCanvasDevicePixelDimensions(e,t){this._canvas.width===e&&this._canvas.height===t||(this._canvas.width=e,this._canvas.height=t,this._requestRedrawViewport())}_requestRedrawViewport(){this._onRequestRedraw.fire({start:0,end:this._terminal.rows-1})}_requestRedrawCursor(){const e=this._terminal.buffer.active.cursorY;this._onRequestRedraw.fire({start:e,end:e})}}t.WebglRenderer=C;class m extends d.AttributeData{constructor(e,t,i){super(),this.content=0,this.combinedData="",this.fg=e.fg,this.bg=e.bg,this.combinedData=t,this._width=i}isCombined(){return 2097152}getWidth(){return this._width}getChars(){return this.combinedData}getCode(){return 2097151}setFromCharData(e){throw new Error("not implemented")}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}}function L(e,t,i=0){return Math.max(Math.min(e,t),i)}t.JoinedCellData=m},381:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GLTexture=t.expandFloat32Array=t.createShader=t.createProgram=t.PROJECTION_MATRIX=void 0;const s=i(374);function r(e,t,i){const r=(0,s.throwIfFalsy)(e.createShader(t));if(e.shaderSource(r,i),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS))return r;console.error(e.getShaderInfoLog(r)),e.deleteShader(r)}t.PROJECTION_MATRIX=new Float32Array([2,0,0,0,0,-2,0,0,0,0,1,0,-1,1,0,1]),t.createProgram=function(e,t,i){const o=(0,s.throwIfFalsy)(e.createProgram());if(e.attachShader(o,(0,s.throwIfFalsy)(r(e,e.VERTEX_SHADER,t))),e.attachShader(o,(0,s.throwIfFalsy)(r(e,e.FRAGMENT_SHADER,i))),e.linkProgram(o),e.getProgramParameter(o,e.LINK_STATUS))return o;console.error(e.getProgramInfoLog(o)),e.deleteProgram(o)},t.createShader=r,t.expandFloat32Array=function(e,t){const i=Math.min(2*e.length,t),s=new Float32Array(i);for(let t=0;t<e.length;t++)s[t]=e[t];return s},t.GLTexture=class{constructor(e){this.texture=e,this.version=-1}}},592:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BaseRenderLayer=void 0;const s=i(627),r=i(237),o=i(374),n=i(859);class a extends n.Disposable{constructor(e,t,i,s,r,o,a,h){super(),this._container=t,this._alpha=r,this._coreBrowserService=o,this._optionsService=a,this._themeService=h,this._deviceCharWidth=0,this._deviceCharHeight=0,this._deviceCellWidth=0,this._deviceCellHeight=0,this._deviceCharLeft=0,this._deviceCharTop=0,this._canvas=this._coreBrowserService.mainDocument.createElement("canvas"),this._canvas.classList.add(`xterm-${i}-layer`),this._canvas.style.zIndex=s.toString(),this._initCanvas(),this._container.appendChild(this._canvas),this.register(this._themeService.onChangeColors((t=>{this._refreshCharAtlas(e,t),this.reset(e)}))),this.register((0,n.toDisposable)((()=>{this._canvas.remove()})))}_initCanvas(){this._ctx=(0,o.throwIfFalsy)(this._canvas.getContext("2d",{alpha:this._alpha})),this._alpha||this._clearAll()}handleBlur(e){}handleFocus(e){}handleCursorMove(e){}handleGridChanged(e,t,i){}handleSelectionChanged(e,t,i,s=!1){}_setTransparency(e,t){if(t===this._alpha)return;const i=this._canvas;this._alpha=t,this._canvas=this._canvas.cloneNode(),this._initCanvas(),this._container.replaceChild(this._canvas,i),this._refreshCharAtlas(e,this._themeService.colors),this.handleGridChanged(e,0,e.rows-1)}_refreshCharAtlas(e,t){this._deviceCharWidth<=0&&this._deviceCharHeight<=0||(this._charAtlas=(0,s.acquireTextureAtlas)(e,this._optionsService.rawOptions,t,this._deviceCellWidth,this._deviceCellHeight,this._deviceCharWidth,this._deviceCharHeight,this._coreBrowserService.dpr),this._charAtlas.warmUp())}resize(e,t){this._deviceCellWidth=t.device.cell.width,this._deviceCellHeight=t.device.cell.height,this._deviceCharWidth=t.device.char.width,this._deviceCharHeight=t.device.char.height,this._deviceCharLeft=t.device.char.left,this._deviceCharTop=t.device.char.top,this._canvas.width=t.device.canvas.width,this._canvas.height=t.device.canvas.height,this._canvas.style.width=`${t.css.canvas.width}px`,this._canvas.style.height=`${t.css.canvas.height}px`,this._alpha||this._clearAll(),this._refreshCharAtlas(e,this._themeService.colors)}_fillBottomLineAtCells(e,t,i=1){this._ctx.fillRect(e*this._deviceCellWidth,(t+1)*this._deviceCellHeight-this._coreBrowserService.dpr-1,i*this._deviceCellWidth,this._coreBrowserService.dpr)}_clearAll(){this._alpha?this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height):(this._ctx.fillStyle=this._themeService.colors.background.css,this._ctx.fillRect(0,0,this._canvas.width,this._canvas.height))}_clearCells(e,t,i,s){this._alpha?this._ctx.clearRect(e*this._deviceCellWidth,t*this._deviceCellHeight,i*this._deviceCellWidth,s*this._deviceCellHeight):(this._ctx.fillStyle=this._themeService.colors.background.css,this._ctx.fillRect(e*this._deviceCellWidth,t*this._deviceCellHeight,i*this._deviceCellWidth,s*this._deviceCellHeight))}_fillCharTrueColor(e,t,i,s){this._ctx.font=this._getFont(e,!1,!1),this._ctx.textBaseline=r.TEXT_BASELINE,this._clipCell(i,s,t.getWidth()),this._ctx.fillText(t.getChars(),i*this._deviceCellWidth+this._deviceCharLeft,s*this._deviceCellHeight+this._deviceCharTop+this._deviceCharHeight)}_clipCell(e,t,i){this._ctx.beginPath(),this._ctx.rect(e*this._deviceCellWidth,t*this._deviceCellHeight,i*this._deviceCellWidth,this._deviceCellHeight),this._ctx.clip()}_getFont(e,t,i){return`${i?"italic":""} ${t?e.options.fontWeightBold:e.options.fontWeight} ${e.options.fontSize*this._coreBrowserService.dpr}px ${e.options.fontFamily}`}}t.BaseRenderLayer=a},733:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LinkRenderLayer=void 0;const s=i(197),r=i(237),o=i(592);class n extends o.BaseRenderLayer{constructor(e,t,i,s,r,o,n){super(i,e,"link",t,!0,r,o,n),this.register(s.onShowLinkUnderline((e=>this._handleShowLinkUnderline(e)))),this.register(s.onHideLinkUnderline((e=>this._handleHideLinkUnderline(e))))}resize(e,t){super.resize(e,t),this._state=void 0}reset(e){this._clearCurrentLink()}_clearCurrentLink(){if(this._state){this._clearCells(this._state.x1,this._state.y1,this._state.cols-this._state.x1,1);const e=this._state.y2-this._state.y1-1;e>0&&this._clearCells(0,this._state.y1+1,this._state.cols,e),this._clearCells(0,this._state.y2,this._state.x2,1),this._state=void 0}}_handleShowLinkUnderline(e){if(e.fg===r.INVERTED_DEFAULT_COLOR?this._ctx.fillStyle=this._themeService.colors.background.css:void 0!==e.fg&&(0,s.is256Color)(e.fg)?this._ctx.fillStyle=this._themeService.colors.ansi[e.fg].css:this._ctx.fillStyle=this._themeService.colors.foreground.css,e.y1===e.y2)this._fillBottomLineAtCells(e.x1,e.y1,e.x2-e.x1);else{this._fillBottomLineAtCells(e.x1,e.y1,e.cols-e.x1);for(let t=e.y1+1;t<e.y2;t++)this._fillBottomLineAtCells(0,t,e.cols);this._fillBottomLineAtCells(0,e.y2,e.x2)}this._state=e}_handleHideLinkUnderline(e){this._clearCurrentLink()}}t.LinkRenderLayer=n},820:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.addDisposableDomListener=void 0,t.addDisposableDomListener=function(e,t,i,s){e.addEventListener(t,i,s);let r=!1;return{dispose:()=>{r||(r=!0,e.removeEventListener(t,i,s))}}}},274:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CellColorResolver=void 0;const s=i(855),r=i(160),o=i(374);let n,a=0,h=0,l=!1,c=!1,d=!1,_=0;t.CellColorResolver=class{constructor(e,t,i,s,r,o){this._terminal=e,this._optionService=t,this._selectionRenderModel=i,this._decorationService=s,this._coreBrowserService=r,this._themeService=o,this.result={fg:0,bg:0,ext:0}}resolve(e,t,i,u){if(this.result.bg=e.bg,this.result.fg=e.fg,this.result.ext=268435456&e.bg?e.extended.ext:0,h=0,a=0,c=!1,l=!1,d=!1,n=this._themeService.colors,_=0,e.getCode()!==s.NULL_CELL_CODE&&4===e.extended.underlineStyle){const e=Math.max(1,Math.floor(this._optionService.rawOptions.fontSize*this._coreBrowserService.dpr/15));_=t*u%(2*Math.round(e))}if(this._decorationService.forEachDecorationAtCell(t,i,"bottom",(e=>{e.backgroundColorRGB&&(h=e.backgroundColorRGB.rgba>>8&16777215,c=!0),e.foregroundColorRGB&&(a=e.foregroundColorRGB.rgba>>8&16777215,l=!0)})),d=this._selectionRenderModel.isCellSelected(this._terminal,t,i),d){if(67108864&this.result.fg||0!=(50331648&this.result.bg)){if(67108864&this.result.fg)switch(50331648&this.result.fg){case 16777216:case 33554432:h=this._themeService.colors.ansi[255&this.result.fg].rgba;break;case 50331648:h=(16777215&this.result.fg)<<8|255;break;default:h=this._themeService.colors.foreground.rgba}else switch(50331648&this.result.bg){case 16777216:case 33554432:h=this._themeService.colors.ansi[255&this.result.bg].rgba;break;case 50331648:h=(16777215&this.result.bg)<<8|255}h=r.rgba.blend(h,4294967040&(this._coreBrowserService.isFocused?n.selectionBackgroundOpaque:n.selectionInactiveBackgroundOpaque).rgba|128)>>8&16777215}else h=(this._coreBrowserService.isFocused?n.selectionBackgroundOpaque:n.selectionInactiveBackgroundOpaque).rgba>>8&16777215;if(c=!0,n.selectionForeground&&(a=n.selectionForeground.rgba>>8&16777215,l=!0),(0,o.treatGlyphAsBackgroundColor)(e.getCode())){if(67108864&this.result.fg&&0==(50331648&this.result.bg))a=(this._coreBrowserService.isFocused?n.selectionBackgroundOpaque:n.selectionInactiveBackgroundOpaque).rgba>>8&16777215;else{if(67108864&this.result.fg)switch(50331648&this.result.bg){case 16777216:case 33554432:a=this._themeService.colors.ansi[255&this.result.bg].rgba;break;case 50331648:a=(16777215&this.result.bg)<<8|255}else switch(50331648&this.result.fg){case 16777216:case 33554432:a=this._themeService.colors.ansi[255&this.result.fg].rgba;break;case 50331648:a=(16777215&this.result.fg)<<8|255;break;default:a=this._themeService.colors.foreground.rgba}a=r.rgba.blend(a,4294967040&(this._coreBrowserService.isFocused?n.selectionBackgroundOpaque:n.selectionInactiveBackgroundOpaque).rgba|128)>>8&16777215}l=!0}}this._decorationService.forEachDecorationAtCell(t,i,"top",(e=>{e.backgroundColorRGB&&(h=e.backgroundColorRGB.rgba>>8&16777215,c=!0),e.foregroundColorRGB&&(a=e.foregroundColorRGB.rgba>>8&16777215,l=!0)})),c&&(h=d?-16777216&e.bg&-134217729|h|50331648:-16777216&e.bg|h|50331648),l&&(a=-16777216&e.fg&-67108865|a|50331648),67108864&this.result.fg&&(c&&!l&&(a=0==(50331648&this.result.bg)?-134217728&this.result.fg|16777215&n.background.rgba>>8|50331648:-134217728&this.result.fg|67108863&this.result.bg,l=!0),!c&&l&&(h=0==(50331648&this.result.fg)?-67108864&this.result.bg|16777215&n.foreground.rgba>>8|50331648:-67108864&this.result.bg|67108863&this.result.fg,c=!0)),n=void 0,this.result.bg=c?h:this.result.bg,this.result.fg=l?a:this.result.fg,this.result.ext&=536870911,this.result.ext|=_<<29&3758096384}}},627:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.removeTerminalFromCache=t.acquireTextureAtlas=void 0;const s=i(509),r=i(197),o=[];t.acquireTextureAtlas=function(e,t,i,n,a,h,l,c){const d=(0,r.generateConfig)(n,a,h,l,t,i,c);for(let t=0;t<o.length;t++){const i=o[t],s=i.ownedBy.indexOf(e);if(s>=0){if((0,r.configEquals)(i.config,d))return i.atlas;1===i.ownedBy.length?(i.atlas.dispose(),o.splice(t,1)):i.ownedBy.splice(s,1);break}}for(let t=0;t<o.length;t++){const i=o[t];if((0,r.configEquals)(i.config,d))return i.ownedBy.push(e),i.atlas}const _=e._core,u={atlas:new s.TextureAtlas(document,d,_.unicodeService),config:d,ownedBy:[e]};return o.push(u),u.atlas},t.removeTerminalFromCache=function(e){for(let t=0;t<o.length;t++){const i=o[t].ownedBy.indexOf(e);if(-1!==i){1===o[t].ownedBy.length?(o[t].atlas.dispose(),o.splice(t,1)):o[t].ownedBy.splice(i,1);break}}}},197:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.is256Color=t.configEquals=t.generateConfig=void 0;const s=i(160);t.generateConfig=function(e,t,i,r,o,n,a){const h={foreground:n.foreground,background:n.background,cursor:s.NULL_COLOR,cursorAccent:s.NULL_COLOR,selectionForeground:s.NULL_COLOR,selectionBackgroundTransparent:s.NULL_COLOR,selectionBackgroundOpaque:s.NULL_COLOR,selectionInactiveBackgroundTransparent:s.NULL_COLOR,selectionInactiveBackgroundOpaque:s.NULL_COLOR,ansi:n.ansi.slice(),contrastCache:n.contrastCache,halfContrastCache:n.halfContrastCache};return{customGlyphs:o.customGlyphs,devicePixelRatio:a,letterSpacing:o.letterSpacing,lineHeight:o.lineHeight,deviceCellWidth:e,deviceCellHeight:t,deviceCharWidth:i,deviceCharHeight:r,fontFamily:o.fontFamily,fontSize:o.fontSize,fontWeight:o.fontWeight,fontWeightBold:o.fontWeightBold,allowTransparency:o.allowTransparency,drawBoldTextInBrightColors:o.drawBoldTextInBrightColors,minimumContrastRatio:o.minimumContrastRatio,colors:h}},t.configEquals=function(e,t){for(let i=0;i<e.colors.ansi.length;i++)if(e.colors.ansi[i].rgba!==t.colors.ansi[i].rgba)return!1;return e.devicePixelRatio===t.devicePixelRatio&&e.customGlyphs===t.customGlyphs&&e.lineHeight===t.lineHeight&&e.letterSpacing===t.letterSpacing&&e.fontFamily===t.fontFamily&&e.fontSize===t.fontSize&&e.fontWeight===t.fontWeight&&e.fontWeightBold===t.fontWeightBold&&e.allowTransparency===t.allowTransparency&&e.deviceCharWidth===t.deviceCharWidth&&e.deviceCharHeight===t.deviceCharHeight&&e.drawBoldTextInBrightColors===t.drawBoldTextInBrightColors&&e.minimumContrastRatio===t.minimumContrastRatio&&e.colors.foreground.rgba===t.colors.foreground.rgba&&e.colors.background.rgba===t.colors.background.rgba},t.is256Color=function(e){return 16777216==(50331648&e)||33554432==(50331648&e)}},237:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TEXT_BASELINE=t.DIM_OPACITY=t.INVERTED_DEFAULT_COLOR=void 0;const s=i(399);t.INVERTED_DEFAULT_COLOR=257,t.DIM_OPACITY=.5,t.TEXT_BASELINE=s.isFirefox||s.isLegacyEdge?"bottom":"ideographic"},457:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CursorBlinkStateManager=void 0;t.CursorBlinkStateManager=class{constructor(e,t){this._renderCallback=e,this._coreBrowserService=t,this.isCursorVisible=!0,this._coreBrowserService.isFocused&&this._restartInterval()}get isPaused(){return!(this._blinkStartTimeout||this._blinkInterval)}dispose(){this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout&&(this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout),this._blinkStartTimeout=void 0),this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)}restartBlinkAnimation(){this.isPaused||(this._animationTimeRestarted=Date.now(),this.isCursorVisible=!0,this._animationFrame||(this._animationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>{this._renderCallback(),this._animationFrame=void 0}))))}_restartInterval(e=600){this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout=this._coreBrowserService.window.setTimeout((()=>{if(this._animationTimeRestarted){const e=600-(Date.now()-this._animationTimeRestarted);if(this._animationTimeRestarted=void 0,e>0)return void this._restartInterval(e)}this.isCursorVisible=!1,this._animationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>{this._renderCallback(),this._animationFrame=void 0})),this._blinkInterval=this._coreBrowserService.window.setInterval((()=>{if(this._animationTimeRestarted){const e=600-(Date.now()-this._animationTimeRestarted);return this._animationTimeRestarted=void 0,void this._restartInterval(e)}this.isCursorVisible=!this.isCursorVisible,this._animationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>{this._renderCallback(),this._animationFrame=void 0}))}),600)}),e)}pause(){this.isCursorVisible=!0,this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout&&(this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout),this._blinkStartTimeout=void 0),this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)}resume(){this.pause(),this._animationTimeRestarted=void 0,this._restartInterval(),this.restartBlinkAnimation()}}},860:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.tryDrawCustomChar=t.powerlineDefinitions=t.boxDrawingDefinitions=t.blockElementDefinitions=void 0;const s=i(374);t.blockElementDefinitions={"▀":[{x:0,y:0,w:8,h:4}],"▁":[{x:0,y:7,w:8,h:1}],"▂":[{x:0,y:6,w:8,h:2}],"▃":[{x:0,y:5,w:8,h:3}],"▄":[{x:0,y:4,w:8,h:4}],"▅":[{x:0,y:3,w:8,h:5}],"▆":[{x:0,y:2,w:8,h:6}],"▇":[{x:0,y:1,w:8,h:7}],"█":[{x:0,y:0,w:8,h:8}],"▉":[{x:0,y:0,w:7,h:8}],"▊":[{x:0,y:0,w:6,h:8}],"▋":[{x:0,y:0,w:5,h:8}],"▌":[{x:0,y:0,w:4,h:8}],"▍":[{x:0,y:0,w:3,h:8}],"▎":[{x:0,y:0,w:2,h:8}],"▏":[{x:0,y:0,w:1,h:8}],"▐":[{x:4,y:0,w:4,h:8}],"▔":[{x:0,y:0,w:8,h:1}],"▕":[{x:7,y:0,w:1,h:8}],"▖":[{x:0,y:4,w:4,h:4}],"▗":[{x:4,y:4,w:4,h:4}],"▘":[{x:0,y:0,w:4,h:4}],"▙":[{x:0,y:0,w:4,h:8},{x:0,y:4,w:8,h:4}],"▚":[{x:0,y:0,w:4,h:4},{x:4,y:4,w:4,h:4}],"▛":[{x:0,y:0,w:4,h:8},{x:4,y:0,w:4,h:4}],"▜":[{x:0,y:0,w:8,h:4},{x:4,y:0,w:4,h:8}],"▝":[{x:4,y:0,w:4,h:4}],"▞":[{x:4,y:0,w:4,h:4},{x:0,y:4,w:4,h:4}],"▟":[{x:4,y:0,w:4,h:8},{x:0,y:4,w:8,h:4}],"🭰":[{x:1,y:0,w:1,h:8}],"🭱":[{x:2,y:0,w:1,h:8}],"🭲":[{x:3,y:0,w:1,h:8}],"🭳":[{x:4,y:0,w:1,h:8}],"🭴":[{x:5,y:0,w:1,h:8}],"🭵":[{x:6,y:0,w:1,h:8}],"🭶":[{x:0,y:1,w:8,h:1}],"🭷":[{x:0,y:2,w:8,h:1}],"🭸":[{x:0,y:3,w:8,h:1}],"🭹":[{x:0,y:4,w:8,h:1}],"🭺":[{x:0,y:5,w:8,h:1}],"🭻":[{x:0,y:6,w:8,h:1}],"🭼":[{x:0,y:0,w:1,h:8},{x:0,y:7,w:8,h:1}],"🭽":[{x:0,y:0,w:1,h:8},{x:0,y:0,w:8,h:1}],"🭾":[{x:7,y:0,w:1,h:8},{x:0,y:0,w:8,h:1}],"🭿":[{x:7,y:0,w:1,h:8},{x:0,y:7,w:8,h:1}],"🮀":[{x:0,y:0,w:8,h:1},{x:0,y:7,w:8,h:1}],"🮁":[{x:0,y:0,w:8,h:1},{x:0,y:2,w:8,h:1},{x:0,y:4,w:8,h:1},{x:0,y:7,w:8,h:1}],"🮂":[{x:0,y:0,w:8,h:2}],"🮃":[{x:0,y:0,w:8,h:3}],"🮄":[{x:0,y:0,w:8,h:5}],"🮅":[{x:0,y:0,w:8,h:6}],"🮆":[{x:0,y:0,w:8,h:7}],"🮇":[{x:6,y:0,w:2,h:8}],"🮈":[{x:5,y:0,w:3,h:8}],"🮉":[{x:3,y:0,w:5,h:8}],"🮊":[{x:2,y:0,w:6,h:8}],"🮋":[{x:1,y:0,w:7,h:8}],"🮕":[{x:0,y:0,w:2,h:2},{x:4,y:0,w:2,h:2},{x:2,y:2,w:2,h:2},{x:6,y:2,w:2,h:2},{x:0,y:4,w:2,h:2},{x:4,y:4,w:2,h:2},{x:2,y:6,w:2,h:2},{x:6,y:6,w:2,h:2}],"🮖":[{x:2,y:0,w:2,h:2},{x:6,y:0,w:2,h:2},{x:0,y:2,w:2,h:2},{x:4,y:2,w:2,h:2},{x:2,y:4,w:2,h:2},{x:6,y:4,w:2,h:2},{x:0,y:6,w:2,h:2},{x:4,y:6,w:2,h:2}],"🮗":[{x:0,y:2,w:8,h:2},{x:0,y:6,w:8,h:2}]};const r={"░":[[1,0,0,0],[0,0,0,0],[0,0,1,0],[0,0,0,0]],"▒":[[1,0],[0,0],[0,1],[0,0]],"▓":[[0,1],[1,1],[1,0],[1,1]]};t.boxDrawingDefinitions={"─":{1:"M0,.5 L1,.5"},"━":{3:"M0,.5 L1,.5"},"│":{1:"M.5,0 L.5,1"},"┃":{3:"M.5,0 L.5,1"},"┌":{1:"M0.5,1 L.5,.5 L1,.5"},"┏":{3:"M0.5,1 L.5,.5 L1,.5"},"┐":{1:"M0,.5 L.5,.5 L.5,1"},"┓":{3:"M0,.5 L.5,.5 L.5,1"},"└":{1:"M.5,0 L.5,.5 L1,.5"},"┗":{3:"M.5,0 L.5,.5 L1,.5"},"┘":{1:"M.5,0 L.5,.5 L0,.5"},"┛":{3:"M.5,0 L.5,.5 L0,.5"},"├":{1:"M.5,0 L.5,1 M.5,.5 L1,.5"},"┣":{3:"M.5,0 L.5,1 M.5,.5 L1,.5"},"┤":{1:"M.5,0 L.5,1 M.5,.5 L0,.5"},"┫":{3:"M.5,0 L.5,1 M.5,.5 L0,.5"},"┬":{1:"M0,.5 L1,.5 M.5,.5 L.5,1"},"┳":{3:"M0,.5 L1,.5 M.5,.5 L.5,1"},"┴":{1:"M0,.5 L1,.5 M.5,.5 L.5,0"},"┻":{3:"M0,.5 L1,.5 M.5,.5 L.5,0"},"┼":{1:"M0,.5 L1,.5 M.5,0 L.5,1"},"╋":{3:"M0,.5 L1,.5 M.5,0 L.5,1"},"╴":{1:"M.5,.5 L0,.5"},"╸":{3:"M.5,.5 L0,.5"},"╵":{1:"M.5,.5 L.5,0"},"╹":{3:"M.5,.5 L.5,0"},"╶":{1:"M.5,.5 L1,.5"},"╺":{3:"M.5,.5 L1,.5"},"╷":{1:"M.5,.5 L.5,1"},"╻":{3:"M.5,.5 L.5,1"},"═":{1:(e,t)=>`M0,${.5-t} L1,${.5-t} M0,${.5+t} L1,${.5+t}`},"║":{1:(e,t)=>`M${.5-e},0 L${.5-e},1 M${.5+e},0 L${.5+e},1`},"╒":{1:(e,t)=>`M.5,1 L.5,${.5-t} L1,${.5-t} M.5,${.5+t} L1,${.5+t}`},"╓":{1:(e,t)=>`M${.5-e},1 L${.5-e},.5 L1,.5 M${.5+e},.5 L${.5+e},1`},"╔":{1:(e,t)=>`M1,${.5-t} L${.5-e},${.5-t} L${.5-e},1 M1,${.5+t} L${.5+e},${.5+t} L${.5+e},1`},"╕":{1:(e,t)=>`M0,${.5-t} L.5,${.5-t} L.5,1 M0,${.5+t} L.5,${.5+t}`},"╖":{1:(e,t)=>`M${.5+e},1 L${.5+e},.5 L0,.5 M${.5-e},.5 L${.5-e},1`},"╗":{1:(e,t)=>`M0,${.5+t} L${.5-e},${.5+t} L${.5-e},1 M0,${.5-t} L${.5+e},${.5-t} L${.5+e},1`},"╘":{1:(e,t)=>`M.5,0 L.5,${.5+t} L1,${.5+t} M.5,${.5-t} L1,${.5-t}`},"╙":{1:(e,t)=>`M1,.5 L${.5-e},.5 L${.5-e},0 M${.5+e},.5 L${.5+e},0`},"╚":{1:(e,t)=>`M1,${.5-t} L${.5+e},${.5-t} L${.5+e},0 M1,${.5+t} L${.5-e},${.5+t} L${.5-e},0`},"╛":{1:(e,t)=>`M0,${.5+t} L.5,${.5+t} L.5,0 M0,${.5-t} L.5,${.5-t}`},"╜":{1:(e,t)=>`M0,.5 L${.5+e},.5 L${.5+e},0 M${.5-e},.5 L${.5-e},0`},"╝":{1:(e,t)=>`M0,${.5-t} L${.5-e},${.5-t} L${.5-e},0 M0,${.5+t} L${.5+e},${.5+t} L${.5+e},0`},"╞":{1:(e,t)=>`M.5,0 L.5,1 M.5,${.5-t} L1,${.5-t} M.5,${.5+t} L1,${.5+t}`},"╟":{1:(e,t)=>`M${.5-e},0 L${.5-e},1 M${.5+e},0 L${.5+e},1 M${.5+e},.5 L1,.5`},"╠":{1:(e,t)=>`M${.5-e},0 L${.5-e},1 M1,${.5+t} L${.5+e},${.5+t} L${.5+e},1 M1,${.5-t} L${.5+e},${.5-t} L${.5+e},0`},"╡":{1:(e,t)=>`M.5,0 L.5,1 M0,${.5-t} L.5,${.5-t} M0,${.5+t} L.5,${.5+t}`},"╢":{1:(e,t)=>`M0,.5 L${.5-e},.5 M${.5-e},0 L${.5-e},1 M${.5+e},0 L${.5+e},1`},"╣":{1:(e,t)=>`M${.5+e},0 L${.5+e},1 M0,${.5+t} L${.5-e},${.5+t} L${.5-e},1 M0,${.5-t} L${.5-e},${.5-t} L${.5-e},0`},"╤":{1:(e,t)=>`M0,${.5-t} L1,${.5-t} M0,${.5+t} L1,${.5+t} M.5,${.5+t} L.5,1`},"╥":{1:(e,t)=>`M0,.5 L1,.5 M${.5-e},.5 L${.5-e},1 M${.5+e},.5 L${.5+e},1`},"╦":{1:(e,t)=>`M0,${.5-t} L1,${.5-t} M0,${.5+t} L${.5-e},${.5+t} L${.5-e},1 M1,${.5+t} L${.5+e},${.5+t} L${.5+e},1`},"╧":{1:(e,t)=>`M.5,0 L.5,${.5-t} M0,${.5-t} L1,${.5-t} M0,${.5+t} L1,${.5+t}`},"╨":{1:(e,t)=>`M0,.5 L1,.5 M${.5-e},.5 L${.5-e},0 M${.5+e},.5 L${.5+e},0`},"╩":{1:(e,t)=>`M0,${.5+t} L1,${.5+t} M0,${.5-t} L${.5-e},${.5-t} L${.5-e},0 M1,${.5-t} L${.5+e},${.5-t} L${.5+e},0`},"╪":{1:(e,t)=>`M.5,0 L.5,1 M0,${.5-t} L1,${.5-t} M0,${.5+t} L1,${.5+t}`},"╫":{1:(e,t)=>`M0,.5 L1,.5 M${.5-e},0 L${.5-e},1 M${.5+e},0 L${.5+e},1`},"╬":{1:(e,t)=>`M0,${.5+t} L${.5-e},${.5+t} L${.5-e},1 M1,${.5+t} L${.5+e},${.5+t} L${.5+e},1 M0,${.5-t} L${.5-e},${.5-t} L${.5-e},0 M1,${.5-t} L${.5+e},${.5-t} L${.5+e},0`},"╱":{1:"M1,0 L0,1"},"╲":{1:"M0,0 L1,1"},"╳":{1:"M1,0 L0,1 M0,0 L1,1"},"╼":{1:"M.5,.5 L0,.5",3:"M.5,.5 L1,.5"},"╽":{1:"M.5,.5 L.5,0",3:"M.5,.5 L.5,1"},"╾":{1:"M.5,.5 L1,.5",3:"M.5,.5 L0,.5"},"╿":{1:"M.5,.5 L.5,1",3:"M.5,.5 L.5,0"},"┍":{1:"M.5,.5 L.5,1",3:"M.5,.5 L1,.5"},"┎":{1:"M.5,.5 L1,.5",3:"M.5,.5 L.5,1"},"┑":{1:"M.5,.5 L.5,1",3:"M.5,.5 L0,.5"},"┒":{1:"M.5,.5 L0,.5",3:"M.5,.5 L.5,1"},"┕":{1:"M.5,.5 L.5,0",3:"M.5,.5 L1,.5"},"┖":{1:"M.5,.5 L1,.5",3:"M.5,.5 L.5,0"},"┙":{1:"M.5,.5 L.5,0",3:"M.5,.5 L0,.5"},"┚":{1:"M.5,.5 L0,.5",3:"M.5,.5 L.5,0"},"┝":{1:"M.5,0 L.5,1",3:"M.5,.5 L1,.5"},"┞":{1:"M0.5,1 L.5,.5 L1,.5",3:"M.5,.5 L.5,0"},"┟":{1:"M.5,0 L.5,.5 L1,.5",3:"M.5,.5 L.5,1"},"┠":{1:"M.5,.5 L1,.5",3:"M.5,0 L.5,1"},"┡":{1:"M.5,.5 L.5,1",3:"M.5,0 L.5,.5 L1,.5"},"┢":{1:"M.5,.5 L.5,0",3:"M0.5,1 L.5,.5 L1,.5"},"┥":{1:"M.5,0 L.5,1",3:"M.5,.5 L0,.5"},"┦":{1:"M0,.5 L.5,.5 L.5,1",3:"M.5,.5 L.5,0"},"┧":{1:"M.5,0 L.5,.5 L0,.5",3:"M.5,.5 L.5,1"},"┨":{1:"M.5,.5 L0,.5",3:"M.5,0 L.5,1"},"┩":{1:"M.5,.5 L.5,1",3:"M.5,0 L.5,.5 L0,.5"},"┪":{1:"M.5,.5 L.5,0",3:"M0,.5 L.5,.5 L.5,1"},"┭":{1:"M0.5,1 L.5,.5 L1,.5",3:"M.5,.5 L0,.5"},"┮":{1:"M0,.5 L.5,.5 L.5,1",3:"M.5,.5 L1,.5"},"┯":{1:"M.5,.5 L.5,1",3:"M0,.5 L1,.5"},"┰":{1:"M0,.5 L1,.5",3:"M.5,.5 L.5,1"},"┱":{1:"M.5,.5 L1,.5",3:"M0,.5 L.5,.5 L.5,1"},"┲":{1:"M.5,.5 L0,.5",3:"M0.5,1 L.5,.5 L1,.5"},"┵":{1:"M.5,0 L.5,.5 L1,.5",3:"M.5,.5 L0,.5"},"┶":{1:"M.5,0 L.5,.5 L0,.5",3:"M.5,.5 L1,.5"},"┷":{1:"M.5,.5 L.5,0",3:"M0,.5 L1,.5"},"┸":{1:"M0,.5 L1,.5",3:"M.5,.5 L.5,0"},"┹":{1:"M.5,.5 L1,.5",3:"M.5,0 L.5,.5 L0,.5"},"┺":{1:"M.5,.5 L0,.5",3:"M.5,0 L.5,.5 L1,.5"},"┽":{1:"M.5,0 L.5,1 M.5,.5 L1,.5",3:"M.5,.5 L0,.5"},"┾":{1:"M.5,0 L.5,1 M.5,.5 L0,.5",3:"M.5,.5 L1,.5"},"┿":{1:"M.5,0 L.5,1",3:"M0,.5 L1,.5"},"╀":{1:"M0,.5 L1,.5 M.5,.5 L.5,1",3:"M.5,.5 L.5,0"},"╁":{1:"M.5,.5 L.5,0 M0,.5 L1,.5",3:"M.5,.5 L.5,1"},"╂":{1:"M0,.5 L1,.5",3:"M.5,0 L.5,1"},"╃":{1:"M0.5,1 L.5,.5 L1,.5",3:"M.5,0 L.5,.5 L0,.5"},"╄":{1:"M0,.5 L.5,.5 L.5,1",3:"M.5,0 L.5,.5 L1,.5"},"╅":{1:"M.5,0 L.5,.5 L1,.5",3:"M0,.5 L.5,.5 L.5,1"},"╆":{1:"M.5,0 L.5,.5 L0,.5",3:"M0.5,1 L.5,.5 L1,.5"},"╇":{1:"M.5,.5 L.5,1",3:"M.5,.5 L.5,0 M0,.5 L1,.5"},"╈":{1:"M.5,.5 L.5,0",3:"M0,.5 L1,.5 M.5,.5 L.5,1"},"╉":{1:"M.5,.5 L1,.5",3:"M.5,0 L.5,1 M.5,.5 L0,.5"},"╊":{1:"M.5,.5 L0,.5",3:"M.5,0 L.5,1 M.5,.5 L1,.5"},"╌":{1:"M.1,.5 L.4,.5 M.6,.5 L.9,.5"},"╍":{3:"M.1,.5 L.4,.5 M.6,.5 L.9,.5"},"┄":{1:"M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5"},"┅":{3:"M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5"},"┈":{1:"M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5"},"┉":{3:"M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5"},"╎":{1:"M.5,.1 L.5,.4 M.5,.6 L.5,.9"},"╏":{3:"M.5,.1 L.5,.4 M.5,.6 L.5,.9"},"┆":{1:"M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333"},"┇":{3:"M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333"},"┊":{1:"M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95"},"┋":{3:"M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95"},"╭":{1:(e,t)=>`M.5,1 L.5,${.5+t/.15*.5} C.5,${.5+t/.15*.5},.5,.5,1,.5`},"╮":{1:(e,t)=>`M.5,1 L.5,${.5+t/.15*.5} C.5,${.5+t/.15*.5},.5,.5,0,.5`},"╯":{1:(e,t)=>`M.5,0 L.5,${.5-t/.15*.5} C.5,${.5-t/.15*.5},.5,.5,0,.5`},"╰":{1:(e,t)=>`M.5,0 L.5,${.5-t/.15*.5} C.5,${.5-t/.15*.5},.5,.5,1,.5`}},t.powerlineDefinitions={"":{d:"M0,0 L1,.5 L0,1",type:0,rightPadding:2},"":{d:"M-1,-.5 L1,.5 L-1,1.5",type:1,leftPadding:1,rightPadding:1},"":{d:"M1,0 L0,.5 L1,1",type:0,leftPadding:2},"":{d:"M2,-.5 L0,.5 L2,1.5",type:1,leftPadding:1,rightPadding:1},"":{d:"M0,0 L0,1 C0.552,1,1,0.776,1,.5 C1,0.224,0.552,0,0,0",type:0,rightPadding:1},"":{d:"M.2,1 C.422,1,.8,.826,.78,.5 C.8,.174,0.422,0,.2,0",type:1,rightPadding:1},"":{d:"M1,0 L1,1 C0.448,1,0,0.776,0,.5 C0,0.224,0.448,0,1,0",type:0,leftPadding:1},"":{d:"M.8,1 C0.578,1,0.2,.826,.22,.5 C0.2,0.174,0.578,0,0.8,0",type:1,leftPadding:1},"":{d:"M-.5,-.5 L1.5,1.5 L-.5,1.5",type:0},"":{d:"M-.5,-.5 L1.5,1.5",type:1,leftPadding:1,rightPadding:1},"":{d:"M1.5,-.5 L-.5,1.5 L1.5,1.5",type:0},"":{d:"M1.5,-.5 L-.5,1.5 L-.5,-.5",type:0},"":{d:"M1.5,-.5 L-.5,1.5",type:1,leftPadding:1,rightPadding:1},"":{d:"M-.5,-.5 L1.5,1.5 L1.5,-.5",type:0}},t.powerlineDefinitions[""]=t.powerlineDefinitions[""],t.powerlineDefinitions[""]=t.powerlineDefinitions[""],t.tryDrawCustomChar=function(e,i,n,l,c,d,_,u){const g=t.blockElementDefinitions[i];if(g)return function(e,t,i,s,r,o){for(let n=0;n<t.length;n++){const a=t[n],h=r/8,l=o/8;e.fillRect(i+a.x*h,s+a.y*l,a.w*h,a.h*l)}}(e,g,n,l,c,d),!0;const v=r[i];if(v)return function(e,t,i,r,n,a){let h=o.get(t);h||(h=new Map,o.set(t,h));const l=e.fillStyle;if("string"!=typeof l)throw new Error(`Unexpected fillStyle type "${l}"`);let c=h.get(l);if(!c){const i=t[0].length,r=t.length,o=e.canvas.ownerDocument.createElement("canvas");o.width=i,o.height=r;const n=(0,s.throwIfFalsy)(o.getContext("2d")),a=new ImageData(i,r);let d,_,u,g;if(l.startsWith("#"))d=parseInt(l.slice(1,3),16),_=parseInt(l.slice(3,5),16),u=parseInt(l.slice(5,7),16),g=l.length>7&&parseInt(l.slice(7,9),16)||1;else{if(!l.startsWith("rgba"))throw new Error(`Unexpected fillStyle color format "${l}" when drawing pattern glyph`);[d,_,u,g]=l.substring(5,l.length-1).split(",").map((e=>parseFloat(e)))}for(let e=0;e<r;e++)for(let s=0;s<i;s++)a.data[4*(e*i+s)]=d,a.data[4*(e*i+s)+1]=_,a.data[4*(e*i+s)+2]=u,a.data[4*(e*i+s)+3]=t[e][s]*(255*g);n.putImageData(a,0,0),c=(0,s.throwIfFalsy)(e.createPattern(o,null)),h.set(l,c)}e.fillStyle=c,e.fillRect(i,r,n,a)}(e,v,n,l,c,d),!0;const f=t.boxDrawingDefinitions[i];if(f)return function(e,t,i,s,r,o,n){e.strokeStyle=e.fillStyle;for(const[l,c]of Object.entries(t)){let t;e.beginPath(),e.lineWidth=n*Number.parseInt(l),t="function"==typeof c?c(.15,.15/o*r):c;for(const l of t.split(" ")){const t=l[0],c=a[t];if(!c){console.error(`Could not find drawing instructions for "${t}"`);continue}const d=l.substring(1).split(",");d[0]&&d[1]&&c(e,h(d,r,o,i,s,!0,n))}e.stroke(),e.closePath()}}(e,f,n,l,c,d,u),!0;const p=t.powerlineDefinitions[i];return!!p&&(function(e,t,i,s,r,o,n,l){const c=new Path2D;c.rect(i,s,r,o),e.clip(c),e.beginPath();const d=n/12;e.lineWidth=l*d;for(const n of t.d.split(" ")){const c=n[0],_=a[c];if(!_){console.error(`Could not find drawing instructions for "${c}"`);continue}const u=n.substring(1).split(",");u[0]&&u[1]&&_(e,h(u,r,o,i,s,!1,l,(t.leftPadding??0)*(d/2),(t.rightPadding??0)*(d/2)))}1===t.type?(e.strokeStyle=e.fillStyle,e.stroke()):e.fill(),e.closePath()}(e,p,n,l,c,d,_,u),!0)};const o=new Map;function n(e,t,i=0){return Math.max(Math.min(e,t),i)}const a={C:(e,t)=>e.bezierCurveTo(t[0],t[1],t[2],t[3],t[4],t[5]),L:(e,t)=>e.lineTo(t[0],t[1]),M:(e,t)=>e.moveTo(t[0],t[1])};function h(e,t,i,s,r,o,a,h=0,l=0){const c=e.map((e=>parseFloat(e)||parseInt(e)));if(c.length<2)throw new Error("Too few arguments for instruction");for(let e=0;e<c.length;e+=2)c[e]*=t-h*a-l*a,o&&0!==c[e]&&(c[e]=n(Math.round(c[e]+.5)-.5,t,0)),c[e]+=s+h*a;for(let e=1;e<c.length;e+=2)c[e]*=i,o&&0!==c[e]&&(c[e]=n(Math.round(c[e]+.5)-.5,i,0)),c[e]+=r;return c}},56:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.observeDevicePixelDimensions=void 0;const s=i(859);t.observeDevicePixelDimensions=function(e,t,i){let r=new t.ResizeObserver((t=>{const s=t.find((t=>t.target===e));if(!s)return;if(!("devicePixelContentBoxSize"in s))return r?.disconnect(),void(r=void 0);const o=s.devicePixelContentBoxSize[0].inlineSize,n=s.devicePixelContentBoxSize[0].blockSize;o>0&&n>0&&i(o,n)}));try{r.observe(e,{box:["device-pixel-content-box"]})}catch{r.disconnect(),r=void 0}return(0,s.toDisposable)((()=>r?.disconnect()))}},374:(e,t)=>{function i(e){return 57508<=e&&e<=57558}function s(e){return e>=128512&&e<=128591||e>=127744&&e<=128511||e>=128640&&e<=128767||e>=9728&&e<=9983||e>=9984&&e<=10175||e>=65024&&e<=65039||e>=129280&&e<=129535||e>=127462&&e<=127487}Object.defineProperty(t,"__esModule",{value:!0}),t.computeNextVariantOffset=t.createRenderDimensions=t.treatGlyphAsBackgroundColor=t.allowRescaling=t.isEmoji=t.isRestrictedPowerlineGlyph=t.isPowerlineGlyph=t.throwIfFalsy=void 0,t.throwIfFalsy=function(e){if(!e)throw new Error("value must not be falsy");return e},t.isPowerlineGlyph=i,t.isRestrictedPowerlineGlyph=function(e){return 57520<=e&&e<=57527},t.isEmoji=s,t.allowRescaling=function(e,t,r,o){return 1===t&&r>Math.ceil(1.5*o)&&void 0!==e&&e>255&&!s(e)&&!i(e)&&!function(e){return 57344<=e&&e<=63743}(e)},t.treatGlyphAsBackgroundColor=function(e){return i(e)||function(e){return 9472<=e&&e<=9631}(e)},t.createRenderDimensions=function(){return{css:{canvas:{width:0,height:0},cell:{width:0,height:0}},device:{canvas:{width:0,height:0},cell:{width:0,height:0},char:{width:0,height:0,left:0,top:0}}}},t.computeNextVariantOffset=function(e,t,i=0){return(e-(2*Math.round(t)-i))%(2*Math.round(t))}},296:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.createSelectionRenderModel=void 0;class i{constructor(){this.clear()}clear(){this.hasSelection=!1,this.columnSelectMode=!1,this.viewportStartRow=0,this.viewportEndRow=0,this.viewportCappedStartRow=0,this.viewportCappedEndRow=0,this.startCol=0,this.endCol=0,this.selectionStart=void 0,this.selectionEnd=void 0}update(e,t,i,s=!1){if(this.selectionStart=t,this.selectionEnd=i,!t||!i||t[0]===i[0]&&t[1]===i[1])return void this.clear();const r=e.buffers.active.ydisp,o=t[1]-r,n=i[1]-r,a=Math.max(o,0),h=Math.min(n,e.rows-1);a>=e.rows||h<0?this.clear():(this.hasSelection=!0,this.columnSelectMode=s,this.viewportStartRow=o,this.viewportEndRow=n,this.viewportCappedStartRow=a,this.viewportCappedEndRow=h,this.startCol=t[0],this.endCol=i[0])}isCellSelected(e,t,i){return!!this.hasSelection&&(i-=e.buffer.active.viewportY,this.columnSelectMode?this.startCol<=this.endCol?t>=this.startCol&&i>=this.viewportCappedStartRow&&t<this.endCol&&i<=this.viewportCappedEndRow:t<this.startCol&&i>=this.viewportCappedStartRow&&t>=this.endCol&&i<=this.viewportCappedEndRow:i>this.viewportStartRow&&i<this.viewportEndRow||this.viewportStartRow===this.viewportEndRow&&i===this.viewportStartRow&&t>=this.startCol&&t<this.endCol||this.viewportStartRow<this.viewportEndRow&&i===this.viewportEndRow&&t<this.endCol||this.viewportStartRow<this.viewportEndRow&&i===this.viewportStartRow&&t>=this.startCol)}}t.createSelectionRenderModel=function(){return new i}},509:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TextureAtlas=void 0;const s=i(237),r=i(860),o=i(374),n=i(160),a=i(345),h=i(485),l=i(385),c=i(147),d=i(855),_={texturePage:0,texturePosition:{x:0,y:0},texturePositionClipSpace:{x:0,y:0},offset:{x:0,y:0},size:{x:0,y:0},sizeClipSpace:{x:0,y:0}};let u;class g{get pages(){return this._pages}constructor(e,t,i){this._document=e,this._config=t,this._unicodeService=i,this._didWarmUp=!1,this._cacheMap=new h.FourKeyMap,this._cacheMapCombined=new h.FourKeyMap,this._pages=[],this._activePages=[],this._workBoundingBox={top:0,left:0,bottom:0,right:0},this._workAttributeData=new c.AttributeData,this._textureSize=512,this._onAddTextureAtlasCanvas=new a.EventEmitter,this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event,this._onRemoveTextureAtlasCanvas=new a.EventEmitter,this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event,this._requestClearModel=!1,this._createNewPage(),this._tmpCanvas=p(e,4*this._config.deviceCellWidth+4,this._config.deviceCellHeight+4),this._tmpCtx=(0,o.throwIfFalsy)(this._tmpCanvas.getContext("2d",{alpha:this._config.allowTransparency,willReadFrequently:!0}))}dispose(){for(const e of this.pages)e.canvas.remove();this._onAddTextureAtlasCanvas.dispose()}warmUp(){this._didWarmUp||(this._doWarmUp(),this._didWarmUp=!0)}_doWarmUp(){const e=new l.IdleTaskQueue;for(let t=33;t<126;t++)e.enqueue((()=>{if(!this._cacheMap.get(t,d.DEFAULT_COLOR,d.DEFAULT_COLOR,d.DEFAULT_EXT)){const e=this._drawToCache(t,d.DEFAULT_COLOR,d.DEFAULT_COLOR,d.DEFAULT_EXT);this._cacheMap.set(t,d.DEFAULT_COLOR,d.DEFAULT_COLOR,d.DEFAULT_EXT,e)}}))}beginFrame(){return this._requestClearModel}clearTexture(){if(0!==this._pages[0].currentRow.x||0!==this._pages[0].currentRow.y){for(const e of this._pages)e.clear();this._cacheMap.clear(),this._cacheMapCombined.clear(),this._didWarmUp=!1}}_createNewPage(){if(g.maxAtlasPages&&this._pages.length>=Math.max(4,g.maxAtlasPages)){const e=this._pages.filter((e=>2*e.canvas.width<=(g.maxTextureSize||4096))).sort(((e,t)=>t.canvas.width!==e.canvas.width?t.canvas.width-e.canvas.width:t.percentageUsed-e.percentageUsed));let t=-1,i=0;for(let s=0;s<e.length;s++)if(e[s].canvas.width!==i)t=s,i=e[s].canvas.width;else if(s-t==3)break;const s=e.slice(t,t+4),r=s.map((e=>e.glyphs[0].texturePage)).sort(((e,t)=>e>t?1:-1)),o=this.pages.length-s.length,n=this._mergePages(s,o);n.version++;for(let e=r.length-1;e>=0;e--)this._deletePage(r[e]);this.pages.push(n),this._requestClearModel=!0,this._onAddTextureAtlasCanvas.fire(n.canvas)}const e=new v(this._document,this._textureSize);return this._pages.push(e),this._activePages.push(e),this._onAddTextureAtlasCanvas.fire(e.canvas),e}_mergePages(e,t){const i=2*e[0].canvas.width,s=new v(this._document,i,e);for(const[r,o]of e.entries()){const e=r*o.canvas.width%i,n=Math.floor(r/2)*o.canvas.height;s.ctx.drawImage(o.canvas,e,n);for(const s of o.glyphs)s.texturePage=t,s.sizeClipSpace.x=s.size.x/i,s.sizeClipSpace.y=s.size.y/i,s.texturePosition.x+=e,s.texturePosition.y+=n,s.texturePositionClipSpace.x=s.texturePosition.x/i,s.texturePositionClipSpace.y=s.texturePosition.y/i;this._onRemoveTextureAtlasCanvas.fire(o.canvas);const a=this._activePages.indexOf(o);-1!==a&&this._activePages.splice(a,1)}return s}_deletePage(e){this._pages.splice(e,1);for(let t=e;t<this._pages.length;t++){const e=this._pages[t];for(const t of e.glyphs)t.texturePage--;e.version++}}getRasterizedGlyphCombinedChar(e,t,i,s,r){return this._getFromCacheMap(this._cacheMapCombined,e,t,i,s,r)}getRasterizedGlyph(e,t,i,s,r){return this._getFromCacheMap(this._cacheMap,e,t,i,s,r)}_getFromCacheMap(e,t,i,s,r,o=!1){return u=e.get(t,i,s,r),u||(u=this._drawToCache(t,i,s,r,o),e.set(t,i,s,r,u)),u}_getColorFromAnsiIndex(e){if(e>=this._config.colors.ansi.length)throw new Error("No color found for idx "+e);return this._config.colors.ansi[e]}_getBackgroundColor(e,t,i,s){if(this._config.allowTransparency)return n.NULL_COLOR;let r;switch(e){case 16777216:case 33554432:r=this._getColorFromAnsiIndex(t);break;case 50331648:const e=c.AttributeData.toColorRGB(t);r=n.channels.toColor(e[0],e[1],e[2]);break;default:r=i?n.color.opaque(this._config.colors.foreground):this._config.colors.background}return r}_getForegroundColor(e,t,i,r,o,a,h,l,d,_){const u=this._getMinimumContrastColor(e,t,i,r,o,a,h,d,l,_);if(u)return u;let g;switch(o){case 16777216:case 33554432:this._config.drawBoldTextInBrightColors&&d&&a<8&&(a+=8),g=this._getColorFromAnsiIndex(a);break;case 50331648:const e=c.AttributeData.toColorRGB(a);g=n.channels.toColor(e[0],e[1],e[2]);break;default:g=h?this._config.colors.background:this._config.colors.foreground}return this._config.allowTransparency&&(g=n.color.opaque(g)),l&&(g=n.color.multiplyOpacity(g,s.DIM_OPACITY)),g}_resolveBackgroundRgba(e,t,i){switch(e){case 16777216:case 33554432:return this._getColorFromAnsiIndex(t).rgba;case 50331648:return t<<8;default:return i?this._config.colors.foreground.rgba:this._config.colors.background.rgba}}_resolveForegroundRgba(e,t,i,s){switch(e){case 16777216:case 33554432:return this._config.drawBoldTextInBrightColors&&s&&t<8&&(t+=8),this._getColorFromAnsiIndex(t).rgba;case 50331648:return t<<8;default:return i?this._config.colors.background.rgba:this._config.colors.foreground.rgba}}_getMinimumContrastColor(e,t,i,s,r,o,a,h,l,c){if(1===this._config.minimumContrastRatio||c)return;const d=this._getContrastCache(l),_=d.getColor(e,s);if(void 0!==_)return _||void 0;const u=this._resolveBackgroundRgba(t,i,a),g=this._resolveForegroundRgba(r,o,a,h),v=n.rgba.ensureContrastRatio(u,g,this._config.minimumContrastRatio/(l?2:1));if(!v)return void d.setColor(e,s,null);const f=n.channels.toColor(v>>24&255,v>>16&255,v>>8&255);return d.setColor(e,s,f),f}_getContrastCache(e){return e?this._config.colors.halfContrastCache:this._config.colors.contrastCache}_drawToCache(e,t,i,n,a=!1){const h="number"==typeof e?String.fromCharCode(e):e,l=Math.min(this._config.deviceCellWidth*Math.max(h.length,2)+4,this._textureSize);this._tmpCanvas.width<l&&(this._tmpCanvas.width=l);const d=Math.min(this._config.deviceCellHeight+8,this._textureSize);if(this._tmpCanvas.height<d&&(this._tmpCanvas.height=d),this._tmpCtx.save(),this._workAttributeData.fg=i,this._workAttributeData.bg=t,this._workAttributeData.extended.ext=n,this._workAttributeData.isInvisible())return _;const u=!!this._workAttributeData.isBold(),v=!!this._workAttributeData.isInverse(),p=!!this._workAttributeData.isDim(),C=!!this._workAttributeData.isItalic(),m=!!this._workAttributeData.isUnderline(),L=!!this._workAttributeData.isStrikethrough(),x=!!this._workAttributeData.isOverline();let w=this._workAttributeData.getFgColor(),b=this._workAttributeData.getFgColorMode(),M=this._workAttributeData.getBgColor(),R=this._workAttributeData.getBgColorMode();if(v){const e=w;w=M,M=e;const t=b;b=R,R=t}const y=this._getBackgroundColor(R,M,v,p);this._tmpCtx.globalCompositeOperation="copy",this._tmpCtx.fillStyle=y.css,this._tmpCtx.fillRect(0,0,this._tmpCanvas.width,this._tmpCanvas.height),this._tmpCtx.globalCompositeOperation="source-over";const A=u?this._config.fontWeightBold:this._config.fontWeight,E=C?"italic":"";this._tmpCtx.font=`${E} ${A} ${this._config.fontSize*this._config.devicePixelRatio}px ${this._config.fontFamily}`,this._tmpCtx.textBaseline=s.TEXT_BASELINE;const S=1===h.length&&(0,o.isPowerlineGlyph)(h.charCodeAt(0)),T=1===h.length&&(0,o.isRestrictedPowerlineGlyph)(h.charCodeAt(0)),D=this._getForegroundColor(t,R,M,i,b,w,v,p,u,(0,o.treatGlyphAsBackgroundColor)(h.charCodeAt(0)));this._tmpCtx.fillStyle=D.css;const B=T?0:4;let F=!1;!1!==this._config.customGlyphs&&(F=(0,r.tryDrawCustomChar)(this._tmpCtx,h,B,B,this._config.deviceCellWidth,this._config.deviceCellHeight,this._config.fontSize,this._config.devicePixelRatio));let P,I=!S;if(P="number"==typeof e?this._unicodeService.wcwidth(e):this._unicodeService.getStringCellWidth(e),m){this._tmpCtx.save();const e=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/15)),t=e%2==1?.5:0;if(this._tmpCtx.lineWidth=e,this._workAttributeData.isUnderlineColorDefault())this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle;else if(this._workAttributeData.isUnderlineColorRGB())I=!1,this._tmpCtx.strokeStyle=`rgb(${c.AttributeData.toColorRGB(this._workAttributeData.getUnderlineColor()).join(",")})`;else{I=!1;let e=this._workAttributeData.getUnderlineColor();this._config.drawBoldTextInBrightColors&&this._workAttributeData.isBold()&&e<8&&(e+=8),this._tmpCtx.strokeStyle=this._getColorFromAnsiIndex(e).css}this._tmpCtx.beginPath();const i=B,s=Math.ceil(B+this._config.deviceCharHeight)-t-(a?2*e:0),r=s+e,n=s+2*e;let l=this._workAttributeData.getUnderlineVariantOffset();for(let a=0;a<P;a++){this._tmpCtx.save();const h=i+a*this._config.deviceCellWidth,c=i+(a+1)*this._config.deviceCellWidth,d=h+this._config.deviceCellWidth/2;switch(this._workAttributeData.extended.underlineStyle){case 2:this._tmpCtx.moveTo(h,s),this._tmpCtx.lineTo(c,s),this._tmpCtx.moveTo(h,n),this._tmpCtx.lineTo(c,n);break;case 3:const i=e<=1?n:Math.ceil(B+this._config.deviceCharHeight-e/2)-t,a=e<=1?s:Math.ceil(B+this._config.deviceCharHeight+e/2)-t,_=new Path2D;_.rect(h,s,this._config.deviceCellWidth,n-s),this._tmpCtx.clip(_),this._tmpCtx.moveTo(h-this._config.deviceCellWidth/2,r),this._tmpCtx.bezierCurveTo(h-this._config.deviceCellWidth/2,a,h,a,h,r),this._tmpCtx.bezierCurveTo(h,i,d,i,d,r),this._tmpCtx.bezierCurveTo(d,a,c,a,c,r),this._tmpCtx.bezierCurveTo(c,i,c+this._config.deviceCellWidth/2,i,c+this._config.deviceCellWidth/2,r);break;case 4:const u=0===l?0:l>=e?2*e-l:e-l;!1==!(l>=e)||0===u?(this._tmpCtx.setLineDash([Math.round(e),Math.round(e)]),this._tmpCtx.moveTo(h+u,s),this._tmpCtx.lineTo(c,s)):(this._tmpCtx.setLineDash([Math.round(e),Math.round(e)]),this._tmpCtx.moveTo(h,s),this._tmpCtx.lineTo(h+u,s),this._tmpCtx.moveTo(h+u+e,s),this._tmpCtx.lineTo(c,s)),l=(0,o.computeNextVariantOffset)(c-h,e,l);break;case 5:const g=.6,v=.3,f=c-h,p=Math.floor(g*f),C=Math.floor(v*f),m=f-p-C;this._tmpCtx.setLineDash([p,C,m]),this._tmpCtx.moveTo(h,s),this._tmpCtx.lineTo(c,s);break;default:this._tmpCtx.moveTo(h,s),this._tmpCtx.lineTo(c,s)}this._tmpCtx.stroke(),this._tmpCtx.restore()}if(this._tmpCtx.restore(),!F&&this._config.fontSize>=12&&!this._config.allowTransparency&&" "!==h){this._tmpCtx.save(),this._tmpCtx.textBaseline="alphabetic";const t=this._tmpCtx.measureText(h);if(this._tmpCtx.restore(),"actualBoundingBoxDescent"in t&&t.actualBoundingBoxDescent>0){this._tmpCtx.save();const t=new Path2D;t.rect(i,s-Math.ceil(e/2),this._config.deviceCellWidth*P,n-s+Math.ceil(e/2)),this._tmpCtx.clip(t),this._tmpCtx.lineWidth=3*this._config.devicePixelRatio,this._tmpCtx.strokeStyle=y.css,this._tmpCtx.strokeText(h,B,B+this._config.deviceCharHeight),this._tmpCtx.restore()}}}if(x){const e=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/15)),t=e%2==1?.5:0;this._tmpCtx.lineWidth=e,this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle,this._tmpCtx.beginPath(),this._tmpCtx.moveTo(B,B+t),this._tmpCtx.lineTo(B+this._config.deviceCharWidth*P,B+t),this._tmpCtx.stroke()}if(F||this._tmpCtx.fillText(h,B,B+this._config.deviceCharHeight),"_"===h&&!this._config.allowTransparency){let e=f(this._tmpCtx.getImageData(B,B,this._config.deviceCellWidth,this._config.deviceCellHeight),y,D,I);if(e)for(let t=1;t<=5&&(this._tmpCtx.save(),this._tmpCtx.fillStyle=y.css,this._tmpCtx.fillRect(0,0,this._tmpCanvas.width,this._tmpCanvas.height),this._tmpCtx.restore(),this._tmpCtx.fillText(h,B,B+this._config.deviceCharHeight-t),e=f(this._tmpCtx.getImageData(B,B,this._config.deviceCellWidth,this._config.deviceCellHeight),y,D,I),e);t++);}if(L){const e=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/10)),t=this._tmpCtx.lineWidth%2==1?.5:0;this._tmpCtx.lineWidth=e,this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle,this._tmpCtx.beginPath(),this._tmpCtx.moveTo(B,B+Math.floor(this._config.deviceCharHeight/2)-t),this._tmpCtx.lineTo(B+this._config.deviceCharWidth*P,B+Math.floor(this._config.deviceCharHeight/2)-t),this._tmpCtx.stroke()}this._tmpCtx.restore();const O=this._tmpCtx.getImageData(0,0,this._tmpCanvas.width,this._tmpCanvas.height);let k;if(k=this._config.allowTransparency?function(e){for(let t=0;t<e.data.length;t+=4)if(e.data[t+3]>0)return!1;return!0}(O):f(O,y,D,I),k)return _;const $=this._findGlyphBoundingBox(O,this._workBoundingBox,l,T,F,B);let U,N;for(;;){if(0===this._activePages.length){const e=this._createNewPage();U=e,N=e.currentRow,N.height=$.size.y;break}U=this._activePages[this._activePages.length-1],N=U.currentRow;for(const e of this._activePages)$.size.y<=e.currentRow.height&&(U=e,N=e.currentRow);for(let e=this._activePages.length-1;e>=0;e--)for(const t of this._activePages[e].fixedRows)t.height<=N.height&&$.size.y<=t.height&&(U=this._activePages[e],N=t);if(N.y+$.size.y>=U.canvas.height||N.height>$.size.y+2){let e=!1;if(U.currentRow.y+U.currentRow.height+$.size.y>=U.canvas.height){let t;for(const e of this._activePages)if(e.currentRow.y+e.currentRow.height+$.size.y<e.canvas.height){t=e;break}if(t)U=t;else if(g.maxAtlasPages&&this._pages.length>=g.maxAtlasPages&&N.y+$.size.y<=U.canvas.height&&N.height>=$.size.y&&N.x+$.size.x<=U.canvas.width)e=!0;else{const t=this._createNewPage();U=t,N=t.currentRow,N.height=$.size.y,e=!0}}e||(U.currentRow.height>0&&U.fixedRows.push(U.currentRow),N={x:0,y:U.currentRow.y+U.currentRow.height,height:$.size.y},U.fixedRows.push(N),U.currentRow={x:0,y:N.y+N.height,height:0})}if(N.x+$.size.x<=U.canvas.width)break;N===U.currentRow?(N.x=0,N.y+=N.height,N.height=0):U.fixedRows.splice(U.fixedRows.indexOf(N),1)}return $.texturePage=this._pages.indexOf(U),$.texturePosition.x=N.x,$.texturePosition.y=N.y,$.texturePositionClipSpace.x=N.x/U.canvas.width,$.texturePositionClipSpace.y=N.y/U.canvas.height,$.sizeClipSpace.x/=U.canvas.width,$.sizeClipSpace.y/=U.canvas.height,N.height=Math.max(N.height,$.size.y),N.x+=$.size.x,U.ctx.putImageData(O,$.texturePosition.x-this._workBoundingBox.left,$.texturePosition.y-this._workBoundingBox.top,this._workBoundingBox.left,this._workBoundingBox.top,$.size.x,$.size.y),U.addGlyph($),U.version++,$}_findGlyphBoundingBox(e,t,i,s,r,o){t.top=0;const n=s?this._config.deviceCellHeight:this._tmpCanvas.height,a=s?this._config.deviceCellWidth:i;let h=!1;for(let i=0;i<n;i++){for(let s=0;s<a;s++){const r=i*this._tmpCanvas.width*4+4*s+3;if(0!==e.data[r]){t.top=i,h=!0;break}}if(h)break}t.left=0,h=!1;for(let i=0;i<o+a;i++){for(let s=0;s<n;s++){const r=s*this._tmpCanvas.width*4+4*i+3;if(0!==e.data[r]){t.left=i,h=!0;break}}if(h)break}t.right=a,h=!1;for(let i=o+a-1;i>=o;i--){for(let s=0;s<n;s++){const r=s*this._tmpCanvas.width*4+4*i+3;if(0!==e.data[r]){t.right=i,h=!0;break}}if(h)break}t.bottom=n,h=!1;for(let i=n-1;i>=0;i--){for(let s=0;s<a;s++){const r=i*this._tmpCanvas.width*4+4*s+3;if(0!==e.data[r]){t.bottom=i,h=!0;break}}if(h)break}return{texturePage:0,texturePosition:{x:0,y:0},texturePositionClipSpace:{x:0,y:0},size:{x:t.right-t.left+1,y:t.bottom-t.top+1},sizeClipSpace:{x:t.right-t.left+1,y:t.bottom-t.top+1},offset:{x:-t.left+o+(s||r?Math.floor((this._config.deviceCellWidth-this._config.deviceCharWidth)/2):0),y:-t.top+o+(s||r?1===this._config.lineHeight?0:Math.round((this._config.deviceCellHeight-this._config.deviceCharHeight)/2):0)}}}}t.TextureAtlas=g;class v{get percentageUsed(){return this._usedPixels/(this.canvas.width*this.canvas.height)}get glyphs(){return this._glyphs}addGlyph(e){this._glyphs.push(e),this._usedPixels+=e.size.x*e.size.y}constructor(e,t,i){if(this._usedPixels=0,this._glyphs=[],this.version=0,this.currentRow={x:0,y:0,height:0},this.fixedRows=[],i)for(const e of i)this._glyphs.push(...e.glyphs),this._usedPixels+=e._usedPixels;this.canvas=p(e,t,t),this.ctx=(0,o.throwIfFalsy)(this.canvas.getContext("2d",{alpha:!0}))}clear(){this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.currentRow.x=0,this.currentRow.y=0,this.currentRow.height=0,this.fixedRows.length=0,this.version++}}function f(e,t,i,s){const r=t.rgba>>>24,o=t.rgba>>>16&255,n=t.rgba>>>8&255,a=i.rgba>>>24,h=i.rgba>>>16&255,l=i.rgba>>>8&255,c=Math.floor((Math.abs(r-a)+Math.abs(o-h)+Math.abs(n-l))/12);let d=!0;for(let t=0;t<e.data.length;t+=4)e.data[t]===r&&e.data[t+1]===o&&e.data[t+2]===n||s&&Math.abs(e.data[t]-r)+Math.abs(e.data[t+1]-o)+Math.abs(e.data[t+2]-n)<c?e.data[t+3]=0:d=!1;return d}function p(e,t,i){const s=e.createElement("canvas");return s.width=t,s.height=i,s}},160:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.contrastRatio=t.toPaddedHex=t.rgba=t.rgb=t.css=t.color=t.channels=t.NULL_COLOR=void 0;let i=0,s=0,r=0,o=0;var n,a,h,l,c;function d(e){const t=e.toString(16);return t.length<2?"0"+t:t}function _(e,t){return e<t?(t+.05)/(e+.05):(e+.05)/(t+.05)}t.NULL_COLOR={css:"#00000000",rgba:0},function(e){e.toCss=function(e,t,i,s){return void 0!==s?`#${d(e)}${d(t)}${d(i)}${d(s)}`:`#${d(e)}${d(t)}${d(i)}`},e.toRgba=function(e,t,i,s=255){return(e<<24|t<<16|i<<8|s)>>>0},e.toColor=function(t,i,s,r){return{css:e.toCss(t,i,s,r),rgba:e.toRgba(t,i,s,r)}}}(n||(t.channels=n={})),function(e){function t(e,t){return o=Math.round(255*t),[i,s,r]=c.toChannels(e.rgba),{css:n.toCss(i,s,r,o),rgba:n.toRgba(i,s,r,o)}}e.blend=function(e,t){if(o=(255&t.rgba)/255,1===o)return{css:t.css,rgba:t.rgba};const a=t.rgba>>24&255,h=t.rgba>>16&255,l=t.rgba>>8&255,c=e.rgba>>24&255,d=e.rgba>>16&255,_=e.rgba>>8&255;return i=c+Math.round((a-c)*o),s=d+Math.round((h-d)*o),r=_+Math.round((l-_)*o),{css:n.toCss(i,s,r),rgba:n.toRgba(i,s,r)}},e.isOpaque=function(e){return 255==(255&e.rgba)},e.ensureContrastRatio=function(e,t,i){const s=c.ensureContrastRatio(e.rgba,t.rgba,i);if(s)return n.toColor(s>>24&255,s>>16&255,s>>8&255)},e.opaque=function(e){const t=(255|e.rgba)>>>0;return[i,s,r]=c.toChannels(t),{css:n.toCss(i,s,r),rgba:t}},e.opacity=t,e.multiplyOpacity=function(e,i){return o=255&e.rgba,t(e,o*i/255)},e.toColorRGB=function(e){return[e.rgba>>24&255,e.rgba>>16&255,e.rgba>>8&255]}}(a||(t.color=a={})),function(e){let t,a;try{const e=document.createElement("canvas");e.width=1,e.height=1;const i=e.getContext("2d",{willReadFrequently:!0});i&&(t=i,t.globalCompositeOperation="copy",a=t.createLinearGradient(0,0,1,1))}catch{}e.toColor=function(e){if(e.match(/#[\da-f]{3,8}/i))switch(e.length){case 4:return i=parseInt(e.slice(1,2).repeat(2),16),s=parseInt(e.slice(2,3).repeat(2),16),r=parseInt(e.slice(3,4).repeat(2),16),n.toColor(i,s,r);case 5:return i=parseInt(e.slice(1,2).repeat(2),16),s=parseInt(e.slice(2,3).repeat(2),16),r=parseInt(e.slice(3,4).repeat(2),16),o=parseInt(e.slice(4,5).repeat(2),16),n.toColor(i,s,r,o);case 7:return{css:e,rgba:(parseInt(e.slice(1),16)<<8|255)>>>0};case 9:return{css:e,rgba:parseInt(e.slice(1),16)>>>0}}const h=e.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(h)return i=parseInt(h[1]),s=parseInt(h[2]),r=parseInt(h[3]),o=Math.round(255*(void 0===h[5]?1:parseFloat(h[5]))),n.toColor(i,s,r,o);if(!t||!a)throw new Error("css.toColor: Unsupported css format");if(t.fillStyle=a,t.fillStyle=e,"string"!=typeof t.fillStyle)throw new Error("css.toColor: Unsupported css format");if(t.fillRect(0,0,1,1),[i,s,r,o]=t.getImageData(0,0,1,1).data,255!==o)throw new Error("css.toColor: Unsupported css format");return{rgba:n.toRgba(i,s,r,o),css:e}}}(h||(t.css=h={})),function(e){function t(e,t,i){const s=e/255,r=t/255,o=i/255;return.2126*(s<=.03928?s/12.92:Math.pow((s+.055)/1.055,2.4))+.7152*(r<=.03928?r/12.92:Math.pow((r+.055)/1.055,2.4))+.0722*(o<=.03928?o/12.92:Math.pow((o+.055)/1.055,2.4))}e.relativeLuminance=function(e){return t(e>>16&255,e>>8&255,255&e)},e.relativeLuminance2=t}(l||(t.rgb=l={})),function(e){function t(e,t,i){const s=e>>24&255,r=e>>16&255,o=e>>8&255;let n=t>>24&255,a=t>>16&255,h=t>>8&255,c=_(l.relativeLuminance2(n,a,h),l.relativeLuminance2(s,r,o));for(;c<i&&(n>0||a>0||h>0);)n-=Math.max(0,Math.ceil(.1*n)),a-=Math.max(0,Math.ceil(.1*a)),h-=Math.max(0,Math.ceil(.1*h)),c=_(l.relativeLuminance2(n,a,h),l.relativeLuminance2(s,r,o));return(n<<24|a<<16|h<<8|255)>>>0}function a(e,t,i){const s=e>>24&255,r=e>>16&255,o=e>>8&255;let n=t>>24&255,a=t>>16&255,h=t>>8&255,c=_(l.relativeLuminance2(n,a,h),l.relativeLuminance2(s,r,o));for(;c<i&&(n<255||a<255||h<255);)n=Math.min(255,n+Math.ceil(.1*(255-n))),a=Math.min(255,a+Math.ceil(.1*(255-a))),h=Math.min(255,h+Math.ceil(.1*(255-h))),c=_(l.relativeLuminance2(n,a,h),l.relativeLuminance2(s,r,o));return(n<<24|a<<16|h<<8|255)>>>0}e.blend=function(e,t){if(o=(255&t)/255,1===o)return t;const a=t>>24&255,h=t>>16&255,l=t>>8&255,c=e>>24&255,d=e>>16&255,_=e>>8&255;return i=c+Math.round((a-c)*o),s=d+Math.round((h-d)*o),r=_+Math.round((l-_)*o),n.toRgba(i,s,r)},e.ensureContrastRatio=function(e,i,s){const r=l.relativeLuminance(e>>8),o=l.relativeLuminance(i>>8);if(_(r,o)<s){if(o<r){const o=t(e,i,s),n=_(r,l.relativeLuminance(o>>8));if(n<s){const t=a(e,i,s);return n>_(r,l.relativeLuminance(t>>8))?o:t}return o}const n=a(e,i,s),h=_(r,l.relativeLuminance(n>>8));if(h<s){const o=t(e,i,s);return h>_(r,l.relativeLuminance(o>>8))?n:o}return n}},e.reduceLuminance=t,e.increaseLuminance=a,e.toChannels=function(e){return[e>>24&255,e>>16&255,e>>8&255,255&e]}}(c||(t.rgba=c={})),t.toPaddedHex=d,t.contrastRatio=_},345:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.runAndSubscribe=t.forwardEvent=t.EventEmitter=void 0,t.EventEmitter=class{constructor(){this._listeners=[],this._disposed=!1}get event(){return this._event||(this._event=e=>(this._listeners.push(e),{dispose:()=>{if(!this._disposed)for(let t=0;t<this._listeners.length;t++)if(this._listeners[t]===e)return void this._listeners.splice(t,1)}})),this._event}fire(e,t){const i=[];for(let e=0;e<this._listeners.length;e++)i.push(this._listeners[e]);for(let s=0;s<i.length;s++)i[s].call(void 0,e,t)}dispose(){this.clearListeners(),this._disposed=!0}clearListeners(){this._listeners&&(this._listeners.length=0)}},t.forwardEvent=function(e,t){return e((e=>t.fire(e)))},t.runAndSubscribe=function(e,t){return t(void 0),e((e=>t(e)))}},859:(e,t)=>{function i(e){for(const t of e)t.dispose();e.length=0}Object.defineProperty(t,"__esModule",{value:!0}),t.getDisposeArrayDisposable=t.disposeArray=t.toDisposable=t.MutableDisposable=t.Disposable=void 0,t.Disposable=class{constructor(){this._disposables=[],this._isDisposed=!1}dispose(){this._isDisposed=!0;for(const e of this._disposables)e.dispose();this._disposables.length=0}register(e){return this._disposables.push(e),e}unregister(e){const t=this._disposables.indexOf(e);-1!==t&&this._disposables.splice(t,1)}},t.MutableDisposable=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(e){this._isDisposed||e===this._value||(this._value?.dispose(),this._value=e)}clear(){this.value=void 0}dispose(){this._isDisposed=!0,this._value?.dispose(),this._value=void 0}},t.toDisposable=function(e){return{dispose:e}},t.disposeArray=i,t.getDisposeArrayDisposable=function(e){return{dispose:()=>i(e)}}},485:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.FourKeyMap=t.TwoKeyMap=void 0;class i{constructor(){this._data={}}set(e,t,i){this._data[e]||(this._data[e]={}),this._data[e][t]=i}get(e,t){return this._data[e]?this._data[e][t]:void 0}clear(){this._data={}}}t.TwoKeyMap=i,t.FourKeyMap=class{constructor(){this._data=new i}set(e,t,s,r,o){this._data.get(e,t)||this._data.set(e,t,new i),this._data.get(e,t).set(s,r,o)}get(e,t,i,s){return this._data.get(e,t)?.get(i,s)}clear(){this._data.clear()}}},399:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isChromeOS=t.isLinux=t.isWindows=t.isIphone=t.isIpad=t.isMac=t.getSafariVersion=t.isSafari=t.isLegacyEdge=t.isFirefox=t.isNode=void 0,t.isNode="undefined"!=typeof process&&"title"in process;const i=t.isNode?"node":navigator.userAgent,s=t.isNode?"node":navigator.platform;t.isFirefox=i.includes("Firefox"),t.isLegacyEdge=i.includes("Edge"),t.isSafari=/^((?!chrome|android).)*safari/i.test(i),t.getSafariVersion=function(){if(!t.isSafari)return 0;const e=i.match(/Version\/(\d+)/);return null===e||e.length<2?0:parseInt(e[1])},t.isMac=["Macintosh","MacIntel","MacPPC","Mac68K"].includes(s),t.isIpad="iPad"===s,t.isIphone="iPhone"===s,t.isWindows=["Windows","Win16","Win32","WinCE"].includes(s),t.isLinux=s.indexOf("Linux")>=0,t.isChromeOS=/\bCrOS\b/.test(i)},385:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DebouncedIdleTask=t.IdleTaskQueue=t.PriorityTaskQueue=void 0;const s=i(399);class r{constructor(){this._tasks=[],this._i=0}enqueue(e){this._tasks.push(e),this._start()}flush(){for(;this._i<this._tasks.length;)this._tasks[this._i]()||this._i++;this.clear()}clear(){this._idleCallback&&(this._cancelCallback(this._idleCallback),this._idleCallback=void 0),this._i=0,this._tasks.length=0}_start(){this._idleCallback||(this._idleCallback=this._requestCallback(this._process.bind(this)))}_process(e){this._idleCallback=void 0;let t=0,i=0,s=e.timeRemaining(),r=0;for(;this._i<this._tasks.length;){if(t=Date.now(),this._tasks[this._i]()||this._i++,t=Math.max(1,Date.now()-t),i=Math.max(t,i),r=e.timeRemaining(),1.5*i>r)return s-t<-20&&console.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(s-t))}ms`),void this._start();s=r}this.clear()}}class o extends r{_requestCallback(e){return setTimeout((()=>e(this._createDeadline(16))))}_cancelCallback(e){clearTimeout(e)}_createDeadline(e){const t=Date.now()+e;return{timeRemaining:()=>Math.max(0,t-Date.now())}}}t.PriorityTaskQueue=o,t.IdleTaskQueue=!s.isNode&&"requestIdleCallback"in window?class extends r{_requestCallback(e){return requestIdleCallback(e)}_cancelCallback(e){cancelIdleCallback(e)}}:o,t.DebouncedIdleTask=class{constructor(){this._queue=new t.IdleTaskQueue}set(e){this._queue.clear(),this._queue.enqueue(e)}flush(){this._queue.flush()}}},147:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ExtendedAttrs=t.AttributeData=void 0;class i{constructor(){this.fg=0,this.bg=0,this.extended=new s}static toColorRGB(e){return[e>>>16&255,e>>>8&255,255&e]}static fromColorRGB(e){return(255&e[0])<<16|(255&e[1])<<8|255&e[2]}clone(){const e=new i;return e.fg=this.fg,e.bg=this.bg,e.extended=this.extended.clone(),e}isInverse(){return 67108864&this.fg}isBold(){return 134217728&this.fg}isUnderline(){return this.hasExtendedAttrs()&&0!==this.extended.underlineStyle?1:268435456&this.fg}isBlink(){return 536870912&this.fg}isInvisible(){return 1073741824&this.fg}isItalic(){return 67108864&this.bg}isDim(){return 134217728&this.bg}isStrikethrough(){return 2147483648&this.fg}isProtected(){return 536870912&this.bg}isOverline(){return 1073741824&this.bg}getFgColorMode(){return 50331648&this.fg}getBgColorMode(){return 50331648&this.bg}isFgRGB(){return 50331648==(50331648&this.fg)}isBgRGB(){return 50331648==(50331648&this.bg)}isFgPalette(){return 16777216==(50331648&this.fg)||33554432==(50331648&this.fg)}isBgPalette(){return 16777216==(50331648&this.bg)||33554432==(50331648&this.bg)}isFgDefault(){return 0==(50331648&this.fg)}isBgDefault(){return 0==(50331648&this.bg)}isAttributeDefault(){return 0===this.fg&&0===this.bg}getFgColor(){switch(50331648&this.fg){case 16777216:case 33554432:return 255&this.fg;case 50331648:return 16777215&this.fg;default:return-1}}getBgColor(){switch(50331648&this.bg){case 16777216:case 33554432:return 255&this.bg;case 50331648:return 16777215&this.bg;default:return-1}}hasExtendedAttrs(){return 268435456&this.bg}updateExtended(){this.extended.isEmpty()?this.bg&=-268435457:this.bg|=268435456}getUnderlineColor(){if(268435456&this.bg&&~this.extended.underlineColor)switch(50331648&this.extended.underlineColor){case 16777216:case 33554432:return 255&this.extended.underlineColor;case 50331648:return 16777215&this.extended.underlineColor;default:return this.getFgColor()}return this.getFgColor()}getUnderlineColorMode(){return 268435456&this.bg&&~this.extended.underlineColor?50331648&this.extended.underlineColor:this.getFgColorMode()}isUnderlineColorRGB(){return 268435456&this.bg&&~this.extended.underlineColor?50331648==(50331648&this.extended.underlineColor):this.isFgRGB()}isUnderlineColorPalette(){return 268435456&this.bg&&~this.extended.underlineColor?16777216==(50331648&this.extended.underlineColor)||33554432==(50331648&this.extended.underlineColor):this.isFgPalette()}isUnderlineColorDefault(){return 268435456&this.bg&&~this.extended.underlineColor?0==(50331648&this.extended.underlineColor):this.isFgDefault()}getUnderlineStyle(){return 268435456&this.fg?268435456&this.bg?this.extended.underlineStyle:1:0}getUnderlineVariantOffset(){return this.extended.underlineVariantOffset}}t.AttributeData=i;class s{get ext(){return this._urlId?-469762049&this._ext|this.underlineStyle<<26:this._ext}set ext(e){this._ext=e}get underlineStyle(){return this._urlId?5:(469762048&this._ext)>>26}set underlineStyle(e){this._ext&=-469762049,this._ext|=e<<26&469762048}get underlineColor(){return 67108863&this._ext}set underlineColor(e){this._ext&=-67108864,this._ext|=67108863&e}get urlId(){return this._urlId}set urlId(e){this._urlId=e}get underlineVariantOffset(){const e=(3758096384&this._ext)>>29;return e<0?4294967288^e:e}set underlineVariantOffset(e){this._ext&=536870911,this._ext|=e<<29&3758096384}constructor(e=0,t=0){this._ext=0,this._urlId=0,this._ext=e,this._urlId=t}clone(){return new s(this._ext,this._urlId)}isEmpty(){return 0===this.underlineStyle&&0===this._urlId}}t.ExtendedAttrs=s},782:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CellData=void 0;const s=i(133),r=i(855),o=i(147);class n extends o.AttributeData{constructor(){super(...arguments),this.content=0,this.fg=0,this.bg=0,this.extended=new o.ExtendedAttrs,this.combinedData=""}static fromCharData(e){const t=new n;return t.setFromCharData(e),t}isCombined(){return 2097152&this.content}getWidth(){return this.content>>22}getChars(){return 2097152&this.content?this.combinedData:2097151&this.content?(0,s.stringFromCodePoint)(2097151&this.content):""}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):2097151&this.content}setFromCharData(e){this.fg=e[r.CHAR_DATA_ATTR_INDEX],this.bg=0;let t=!1;if(e[r.CHAR_DATA_CHAR_INDEX].length>2)t=!0;else if(2===e[r.CHAR_DATA_CHAR_INDEX].length){const i=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0);if(55296<=i&&i<=56319){const s=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(1);56320<=s&&s<=57343?this.content=1024*(i-55296)+s-56320+65536|e[r.CHAR_DATA_WIDTH_INDEX]<<22:t=!0}else t=!0}else this.content=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|e[r.CHAR_DATA_WIDTH_INDEX]<<22;t&&(this.combinedData=e[r.CHAR_DATA_CHAR_INDEX],this.content=2097152|e[r.CHAR_DATA_WIDTH_INDEX]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}}t.CellData=n},855:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.WHITESPACE_CELL_CODE=t.WHITESPACE_CELL_WIDTH=t.WHITESPACE_CELL_CHAR=t.NULL_CELL_CODE=t.NULL_CELL_WIDTH=t.NULL_CELL_CHAR=t.CHAR_DATA_CODE_INDEX=t.CHAR_DATA_WIDTH_INDEX=t.CHAR_DATA_CHAR_INDEX=t.CHAR_DATA_ATTR_INDEX=t.DEFAULT_EXT=t.DEFAULT_ATTR=t.DEFAULT_COLOR=void 0,t.DEFAULT_COLOR=0,t.DEFAULT_ATTR=256|t.DEFAULT_COLOR<<9,t.DEFAULT_EXT=0,t.CHAR_DATA_ATTR_INDEX=0,t.CHAR_DATA_CHAR_INDEX=1,t.CHAR_DATA_WIDTH_INDEX=2,t.CHAR_DATA_CODE_INDEX=3,t.NULL_CELL_CHAR="",t.NULL_CELL_WIDTH=1,t.NULL_CELL_CODE=0,t.WHITESPACE_CELL_CHAR=" ",t.WHITESPACE_CELL_WIDTH=1,t.WHITESPACE_CELL_CODE=32},133:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Utf8ToUtf32=t.StringToUtf32=t.utf32ToString=t.stringFromCodePoint=void 0,t.stringFromCodePoint=function(e){return e>65535?(e-=65536,String.fromCharCode(55296+(e>>10))+String.fromCharCode(e%1024+56320)):String.fromCharCode(e)},t.utf32ToString=function(e,t=0,i=e.length){let s="";for(let r=t;r<i;++r){let t=e[r];t>65535?(t-=65536,s+=String.fromCharCode(55296+(t>>10))+String.fromCharCode(t%1024+56320)):s+=String.fromCharCode(t)}return s},t.StringToUtf32=class{constructor(){this._interim=0}clear(){this._interim=0}decode(e,t){const i=e.length;if(!i)return 0;let s=0,r=0;if(this._interim){const i=e.charCodeAt(r++);56320<=i&&i<=57343?t[s++]=1024*(this._interim-55296)+i-56320+65536:(t[s++]=this._interim,t[s++]=i),this._interim=0}for(let o=r;o<i;++o){const r=e.charCodeAt(o);if(55296<=r&&r<=56319){if(++o>=i)return this._interim=r,s;const n=e.charCodeAt(o);56320<=n&&n<=57343?t[s++]=1024*(r-55296)+n-56320+65536:(t[s++]=r,t[s++]=n)}else 65279!==r&&(t[s++]=r)}return s}},t.Utf8ToUtf32=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(e,t){const i=e.length;if(!i)return 0;let s,r,o,n,a=0,h=0,l=0;if(this.interim[0]){let s=!1,r=this.interim[0];r&=192==(224&r)?31:224==(240&r)?15:7;let o,n=0;for(;(o=63&this.interim[++n])&&n<4;)r<<=6,r|=o;const h=192==(224&this.interim[0])?2:224==(240&this.interim[0])?3:4,c=h-n;for(;l<c;){if(l>=i)return 0;if(o=e[l++],128!=(192&o)){l--,s=!0;break}this.interim[n++]=o,r<<=6,r|=63&o}s||(2===h?r<128?l--:t[a++]=r:3===h?r<2048||r>=55296&&r<=57343||65279===r||(t[a++]=r):r<65536||r>1114111||(t[a++]=r)),this.interim.fill(0)}const c=i-4;let d=l;for(;d<i;){for(;!(!(d<c)||128&(s=e[d])||128&(r=e[d+1])||128&(o=e[d+2])||128&(n=e[d+3]));)t[a++]=s,t[a++]=r,t[a++]=o,t[a++]=n,d+=4;if(s=e[d++],s<128)t[a++]=s;else if(192==(224&s)){if(d>=i)return this.interim[0]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(h=(31&s)<<6|63&r,h<128){d--;continue}t[a++]=h}else if(224==(240&s)){if(d>=i)return this.interim[0]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,a;if(o=e[d++],128!=(192&o)){d--;continue}if(h=(15&s)<<12|(63&r)<<6|63&o,h<2048||h>=55296&&h<=57343||65279===h)continue;t[a++]=h}else if(240==(248&s)){if(d>=i)return this.interim[0]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,a;if(o=e[d++],128!=(192&o)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,this.interim[2]=o,a;if(n=e[d++],128!=(192&n)){d--;continue}if(h=(7&s)<<18|(63&r)<<12|(63&o)<<6|63&n,h<65536||h>1114111)continue;t[a++]=h}}return a}}},776:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.traceCall=t.setTraceLogger=t.LogService=void 0;const o=i(859),n=i(97),a={trace:n.LogLevelEnum.TRACE,debug:n.LogLevelEnum.DEBUG,info:n.LogLevelEnum.INFO,warn:n.LogLevelEnum.WARN,error:n.LogLevelEnum.ERROR,off:n.LogLevelEnum.OFF};let h,l=t.LogService=class extends o.Disposable{get logLevel(){return this._logLevel}constructor(e){super(),this._optionsService=e,this._logLevel=n.LogLevelEnum.OFF,this._updateLogLevel(),this.register(this._optionsService.onSpecificOptionChange("logLevel",(()=>this._updateLogLevel()))),h=this}_updateLogLevel(){this._logLevel=a[this._optionsService.rawOptions.logLevel]}_evalLazyOptionalParams(e){for(let t=0;t<e.length;t++)"function"==typeof e[t]&&(e[t]=e[t]())}_log(e,t,i){this._evalLazyOptionalParams(i),e.call(console,(this._optionsService.options.logger?"":"xterm.js: ")+t,...i)}trace(e,...t){this._logLevel<=n.LogLevelEnum.TRACE&&this._log(this._optionsService.options.logger?.trace.bind(this._optionsService.options.logger)??console.log,e,t)}debug(e,...t){this._logLevel<=n.LogLevelEnum.DEBUG&&this._log(this._optionsService.options.logger?.debug.bind(this._optionsService.options.logger)??console.log,e,t)}info(e,...t){this._logLevel<=n.LogLevelEnum.INFO&&this._log(this._optionsService.options.logger?.info.bind(this._optionsService.options.logger)??console.info,e,t)}warn(e,...t){this._logLevel<=n.LogLevelEnum.WARN&&this._log(this._optionsService.options.logger?.warn.bind(this._optionsService.options.logger)??console.warn,e,t)}error(e,...t){this._logLevel<=n.LogLevelEnum.ERROR&&this._log(this._optionsService.options.logger?.error.bind(this._optionsService.options.logger)??console.error,e,t)}};t.LogService=l=s([r(0,n.IOptionsService)],l),t.setTraceLogger=function(e){h=e},t.traceCall=function(e,t,i){if("function"!=typeof i.value)throw new Error("not supported");const s=i.value;i.value=function(...e){if(h.logLevel!==n.LogLevelEnum.TRACE)return s.apply(this,e);h.trace(`GlyphRenderer#${s.name}(${e.map((e=>JSON.stringify(e))).join(", ")})`);const t=s.apply(this,e);return h.trace(`GlyphRenderer#${s.name} return`,t),t}}},726:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.createDecorator=t.getServiceDependencies=t.serviceRegistry=void 0;const i="di$target",s="di$dependencies";t.serviceRegistry=new Map,t.getServiceDependencies=function(e){return e[s]||[]},t.createDecorator=function(e){if(t.serviceRegistry.has(e))return t.serviceRegistry.get(e);const r=function(e,t,o){if(3!==arguments.length)throw new Error("@IServiceName-decorator can only be used to decorate a parameter");!function(e,t,r){t[i]===t?t[s].push({id:e,index:r}):(t[s]=[{id:e,index:r}],t[i]=t)}(r,e,o)};return r.toString=()=>e,t.serviceRegistry.set(e,r),r}},97:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.IDecorationService=t.IUnicodeService=t.IOscLinkService=t.IOptionsService=t.ILogService=t.LogLevelEnum=t.IInstantiationService=t.ICharsetService=t.ICoreService=t.ICoreMouseService=t.IBufferService=void 0;const s=i(726);var r;t.IBufferService=(0,s.createDecorator)("BufferService"),t.ICoreMouseService=(0,s.createDecorator)("CoreMouseService"),t.ICoreService=(0,s.createDecorator)("CoreService"),t.ICharsetService=(0,s.createDecorator)("CharsetService"),t.IInstantiationService=(0,s.createDecorator)("InstantiationService"),function(e){e[e.TRACE=0]="TRACE",e[e.DEBUG=1]="DEBUG",e[e.INFO=2]="INFO",e[e.WARN=3]="WARN",e[e.ERROR=4]="ERROR",e[e.OFF=5]="OFF"}(r||(t.LogLevelEnum=r={})),t.ILogService=(0,s.createDecorator)("LogService"),t.IOptionsService=(0,s.createDecorator)("OptionsService"),t.IOscLinkService=(0,s.createDecorator)("OscLinkService"),t.IUnicodeService=(0,s.createDecorator)("UnicodeService"),t.IDecorationService=(0,s.createDecorator)("DecorationService")}},t={};function i(s){var r=t[s];if(void 0!==r)return r.exports;var o=t[s]={exports:{}};return e[s].call(o.exports,o,o.exports,i),o.exports}var s={};return(()=>{var e=s;Object.defineProperty(e,"__esModule",{value:!0}),e.WebglAddon=void 0;const t=i(345),r=i(859),o=i(399),n=i(666),a=i(776);class h extends r.Disposable{constructor(e){if(o.isSafari&&(0,o.getSafariVersion)()<16){const e={antialias:!1,depth:!1,preserveDrawingBuffer:!0};if(!document.createElement("canvas").getContext("webgl2",e))throw new Error("Webgl2 is only supported on Safari 16 and above")}super(),this._preserveDrawingBuffer=e,this._onChangeTextureAtlas=this.register(new t.EventEmitter),this.onChangeTextureAtlas=this._onChangeTextureAtlas.event,this._onAddTextureAtlasCanvas=this.register(new t.EventEmitter),this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event,this._onRemoveTextureAtlasCanvas=this.register(new t.EventEmitter),this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event,this._onContextLoss=this.register(new t.EventEmitter),this.onContextLoss=this._onContextLoss.event}activate(e){const i=e._core;if(!e.element)return void this.register(i.onWillOpen((()=>this.activate(e))));this._terminal=e;const s=i.coreService,o=i.optionsService,h=i,l=h._renderService,c=h._characterJoinerService,d=h._charSizeService,_=h._coreBrowserService,u=h._decorationService,g=h._logService,v=h._themeService;(0,a.setTraceLogger)(g),this._renderer=this.register(new n.WebglRenderer(e,c,d,_,s,u,o,v,this._preserveDrawingBuffer)),this.register((0,t.forwardEvent)(this._renderer.onContextLoss,this._onContextLoss)),this.register((0,t.forwardEvent)(this._renderer.onChangeTextureAtlas,this._onChangeTextureAtlas)),this.register((0,t.forwardEvent)(this._renderer.onAddTextureAtlasCanvas,this._onAddTextureAtlasCanvas)),this.register((0,t.forwardEvent)(this._renderer.onRemoveTextureAtlasCanvas,this._onRemoveTextureAtlasCanvas)),l.setRenderer(this._renderer),this.register((0,r.toDisposable)((()=>{const t=this._terminal._core._renderService;t.setRenderer(this._terminal._core._createRenderer()),t.handleResize(e.cols,e.rows)})))}get textureAtlas(){return this._renderer?.textureAtlas}clearTextureAtlas(){this._renderer?.clearTextureAtlas()}}e.WebglAddon=h})(),s})()));
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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bE0sRUFBRyxFQUFHQyxFQUFHLEVBQUdnTSxFQUFHLEVBQUdDLEVBQUcsSUFDN0IsSUFBSyxDQUFDLENBQUVsTSxFQUFHLEVBQUdDLEVBQUcsRUFBR2dNLEVBQUcsRUFBR0MsRUFBRyxJQUM3QixJQUFLLENBQUMsQ0FBRWxNLEVBQUcsRUFBR0MsRUFBRyxFQUFHZ00sRUFBRyxFQUFHQyxFQUFHLElBQzdCLElBQUssQ0FBQyxDQUFFbE0sRUFBRyxFQUFHQyxFQUFHLEVBQUdnTSxFQUFHLEVBQUdDLEVBQUcsSUFDN0IsSUFBSyxDQUFDLENBQUVsTSxFQUFHLEVBQUdDLEVBQUcsRUFBR2dNLEVBQUcsRUFBR0MsRUFBRyxJQUM3QixJQUFLLENBQUMsQ0FBRWxNLEVBQUcsRUFBR0MsRUFBRyxFQUFHZ00sRUFBRyxFQUFHQyxFQUFHLElBQzdCLElBQUssQ0FBQyxDQUFFbE0sRUFBRyxFQUFHQyxFQUFHLEVBQUdnTSxFQUFHLEVBQUdDLEVBQUcsSUFDN0IsSUFBSyxDQUFDLENBQUVsTSxFQUFHLEVBQUdDLEVBQUcsRUFBR2dNLEVBQUcsRUFBR0MsRUFBRyxJQUM3QixJQUFLLENBQUMsQ0FBRWxNLEVBQUcsRUFBR0MsRUFBRyxFQUFHZ00sRUFBRyxFQUFHQyxFQUFHLElBQzdCLElBQUssQ0FBQyxDQUFFbE0sRUFBRyxFQUFHQyxFQUFHLEVBQUdnTSxFQUFHLEVBQUdDLEVBQUcsSUFDN0IsSUFBSyxDQUFDLENBQUVsTSxFQUFHLEVBQUdDLEVBQUcsRUFBR2dNLEVBQUcsRUFBR0MsRUFBRyxJQUM3QixJQUFLLENBQUMsQ0FBRWxNLEVBQUcsRUFBR0MsRUFBRyxFQUFHZ00sRUFBRyxFQUFHQyxFQUFHLElBQzdCLElBQUssQ0FBQyxDQUFFbE0sRUFBRyxFQUFHQyxFQUFHLEVBQUdnTSxFQUFHLEVBQUdDLEVBQUcsSUFHN0IsSUFBSyxDQUFDLENBQUVsTSxFQUFHLEVBQUdDLEVBQUcsRUFBR2dNLEVBQUcsRUFBR0MsRUFBRyxJQUM3QixJQUFLLENBQUMsQ0FBRWxNLEVBQUcsRUFBR0MsRUFBRyxFQUFHZ00sRUFBRyxFQUFHQyxFQUFHLElBRzdCLElBQUssQ0FBQyxDQUFFbE0sRUFBRyxFQUFHQyxFQUFHLEVBQUdnTSxFQUFHLEVBQUdDLEVBQUcsSUFDN0IsSUFBSyxDQUFDLENBQUVsTSxFQUFHLEVBQUdDLEVBQUcsRUFBR2dNLEVBQUcsRUFBR0MsRUFBRyxJQUM3QixJQUFLLENBQUMsQ0FBRWxNLEVBQUcsRUFBR0MsRUFBRyxFQUFHZ00sRUFBRyxFQUFHQyxFQUFHLElBQzdCLElBQUssQ0FBQyxDQUFFbE0sRUFBRyxFQUFHQyxFQUFHLEVBQUdnTSxFQUFHLEVBQUdDLEVBQUcsR0FBSyxDQUFFbE0sRUFBRyxFQUFHQyxFQUFHLEVBQUdnTSxFQUFHLEVBQUdDLEVBQUcsSUFDekQsSUFBSyxDQUFDLENBQUVsTSxFQUFHLEVBQUdDLEVBQUcsRUFBR2dNLEVBQUcsRUFBR0MsRUFBRyxHQUFLLENBQUVsTSxFQUFHLEVBQUdDLEVBQUcsRUFBR2dNLEVBQUcsRUFBR0MsRUFBRyxJQUN6RCxJQUFLLENBQUMsQ0FBRWxNLEVBQUcsRUFBR0MsRUFBRyxFQUFHZ00sRUFBRyxFQUFHQyxFQUFHLEdBQUssQ0FBRWxNLEVBQUcsRUFBR0MsRUFBRyxFQUFHZ00sRUFBRyxFQUFHQyxFQUFHLElBQ3pELElBQUssQ0FBQyxDQUFFbE0sRUFBRyxFQUFHQyxFQUFHLEVBQUdnTSxFQUFHLEVBQUdDLEVBQUcsR0FBSyxDQUFFbE0sRUFBRyxFQUFHQyxFQUFHLEVBQUdnTSxFQUFHLEVBQUdDLEVBQUcsSUFDekQsSUFBSyxDQUFDLENBQUVsTSxFQUFHLEVBQUdDLEVBQUcsRUFBR2dNLEVBQUcsRUFBR0MsRUFBRyxJQUM3QixJQUFLLENBQUMsQ0FBRWxNLEVBQUcsRUFBR0MsRUFBRyxFQUFHZ00sRUFBRyxFQUFHQyxFQUFHLEdBQUssQ0FBRWxNLEVBQUcsRUFBR0MsRUFBRyxFQUFHZ00sRUFBRyxFQUFHQyxFQUFHLElBQ3pELElBQUssQ0FBQyxDQUFFbE0sRUFBRyxFQUFHQyxFQUFHLEVBQUdnTSxFQUFHLEVBQUdDLEVBQUcsR0FBSyxDQUFFbE0sRUFBRyxFQUFHQyxFQUFHLEVBQUdnTSxFQUFHLEVBQUdDLEVBQUcsSUFHekQsS0FBYSxDQUFDLENBQUVsTSxFQUFHLEVBQUdDLEVBQUcsRUFBR2dNLEVBQUcsRUFBR0MsRUFBRyxJQUNyQyxLQUFhLENBQUMsQ0FBRWxNLEVBQUcsRUFBR0MsRUFBRyxFQUFHZ00sRUFBRyxFQUFHQyxFQUFHLElBQ3JDLEtBQWEsQ0FBQyxDQUFFbE0sRUFBRyxFQUFHQyxFQUFHLEVBQUdnTSxFQUFHLEVBQUdDLEVBQUcsSUFDckMsS0FBYSxDQUFDLENBQUVsTSxFQUFHLEVBQUdDLEVBQUcsRUFBR2dNLEVBQUcsRUFBR0MsRUFBRyxJQUNyQyxLQUFhLENBQUMsQ0FBRWxNLEVBQUcsRUFBR0MsRUFBRyxFQUFHZ00sRUFBRyxFQUFHQyxFQUFHLElBQ3JDLEtBQWEsQ0FBQyxDQUFFbE0sRUFBRyxFQUFHQyxFQUFHLEVBQUdnTSxFQUFHLEVBQUdDLEVBQUcsSUFHckMsS0FBYSxDQUFDLENBQUVsTSxFQUFHLEVBQUdDLEVBQUcsRUFBR2dNLEVBQUcsRUFBR0MsRUFBRyxJQUNyQyxLQUFhLENBQUMsQ0FBRWxNLEVBQUcsRUFBR0MsRUFBRyxFQUFHZ00sRUFBRyxFQUFHQyxFQUFHLElBQ3JDLEtBQWEsQ0FBQyxDQUFFbE0sRUFBRyxFQUFHQyxFQUFHLEVBQUdnTSxFQUFHLEVBQUdDLEVBQUcsSUFDckMsS0FBYSxDQUFDLENBQUVsTSxFQUFHLEVBQUdDLEVBQUcsRUFBR2dNLEVBQUcsRUFBR0MsRUFBRyxJQUNyQyxLQUFhLENBQUMsQ0FBRWxNLEVBQUcsRUFBR0MsRUFBRyxFQUFHZ00sRUFBRyxFQUFHQyxFQUFHLElBQ3JDLEtBQWEsQ0FBQyxDQUFFbE0sRUFBRyxFQUFHQyxFQUFHLEVBQUdnTSxFQUFHLEVBQUdDLEVBQUcsSUFHckMsS0FBYSxDQUFDLENBQUVsTSxFQUFHLEVBQUdDLEVBQUcsRUFBR2dNLEVBQUcsRUFBR0MsRUFBRyxHQUFLLENBQUVsTSxFQUFHLEVBQUdDLEVBQUcsRUFBR2dNLEVBQUcsRUFBR0MsRUFBRyxJQUVqRSxLQUFhLENBQUMsQ0FBRWxNLEVBQUcsRUFBR0MsRUFBRyxFQUFHZ00sRUFBRyxFQUFHQyxFQUFHLEdBQUssQ0FBRWxNLEVBQUcsRUFBR0MsRUFBRyxFQUFHZ00sRUFBRyxFQUFHQyxFQUFHLElBRWpFLEtBQWEsQ0FBQyxDQUFFbE0sRUFBRyxFQUFHQyxFQUFHLEVBQUdnTSxFQUFHLEVBQUdDLEVBQUcsR0FBSyxDQUFFbE0sRUFBRyxFQUFHQyxFQUFHLEVBQUdnTSxFQUFHLEVBQUdDLEVBQUcsSUFFakUsS0FBYSxDQUFDLENBQUVsTSxFQUFHLEVBQUdDLEVBQUcsRUFBR2dNLEVBQUcsRUFBR0MsRUFBRyxHQUFLLENBQUVsTSxFQUFHLEVBQUdDLEVBQUcsRUFBR2dNLEVBQUcsRUFBR0MsRUFBRyxJQUVqRSxLQUFhLENBQUMsQ0FBRWxNLEVBQUcsRUFBR0MsRUFBRyxFQUFHZ00sRUFBRyxFQUFHQyxFQUFHLEdBQUssQ0FBRWxNLEVBQUcsRUFBR0MsRUFBRyxFQUFHZ00sRUFBRyxFQUFHQyxFQUFHLElBRWpFLEtBQWEsQ0FBQyxDQUFFbE0sRUFBRyxFQUFHQyxFQUFHLEVBQUdnTSxFQUFHLEVBQUdDLEVBQUcsR0FBSyxDQUFFbE0sRUFBRyxFQUFHQyxFQUFHLEVBQUdnTSxFQUFHLEVBQUdDLEVBQUcsR0FBSyxDQUFFbE0sRUFBRyxFQUFHQyxFQUFHLEVBQUdnTSxFQUFHLEVBQUdDLEVBQUcsR0FBSyxDQUFFbE0sRUFBRyxFQUFHQyxFQUFHLEVBQUdnTSxFQUFHLEVBQUdDLEVBQUcsSUFHekgsS0FBYSxDQUFDLENBQUVsTSxFQUFHLEVBQUdDLEVBQUcsRUFBR2dNLEVBQUcsRUFBR0MsRUFBRyxJQUVyQyxLQUFhLENBQUMsQ0FBRWxNLEVBQUcsRUFBR0MsRUFBRyxFQUFHZ00sRUFBRyxFQUFHQyxFQUFHLElBRXJDLEtBQWEsQ0FBQyxDQUFFbE0sRUFBRyxFQUFHQyxFQUFHLEVBQUdnTSxFQUFHLEVBQUdDLEVBQUcsSUFFckMsS0FBYSxDQUFDLENBQUVsTSxFQUFHLEVBQUdDLEVBQUcsRUFBR2dNLEVBQUcsRUFBR0MsRUFBRyxJQUVyQyxLQUFhLENBQUMsQ0FBRWxNLEVBQUcsRUFBR0MsRUFBRyxFQUFHZ00sRUFBRyxFQUFHQyxFQUFHLElBR3JDLEtBQWEsQ0FBQyxDQUFFbE0sRUFBRyxFQUFHQyxFQUFHLEVBQUdnTSxFQUFHLEVBQUdDLEVBQUcsSUFFckMsS0FBYSxDQUFDLENBQUVsTSxFQUFHLEVBQUdDLEVBQUcsRUFBR2dNLEVBQUcsRUFBR0MsRUFBRyxJQUVyQyxLQUFhLENBQUMsQ0FBRWxNLEVBQUcsRUFBR0MsRUFBRyxFQUFHZ00sRUFBRyxFQUFHQyxFQUFHLElBRXJDLEtBQWEsQ0FBQyxDQUFFbE0sRUFBRyxFQUFHQyxFQUFHLEVBQUdnTSxFQUFHLEVBQUdDLEVBQUcsSUFFckMsS0FBYSxDQUFDLENBQUVsTSxFQUFHLEVBQUdDLEVBQUcsRUFBR2dNLEVBQUcsRUFBR0MsRUFBRyxJQUdyQyxLQUFhLENBQ1gsQ0FBRWxNLEVBQUcsRUFBR0MsRUFBRyxFQUFHZ00sRUFBRyxFQUFHQyxFQUFHLEdBQUssQ0FBRWxNLEVBQUcsRUFBR0MsRUFBRyxFQUFHZ00sRUFBRyxFQUFHQyxFQUFHLEdBQ25ELENBQUVsTSxFQUFHLEVBQUdDLEVBQUcsRUFBR2dNLEVBQUcsRUFBR0MsRUFBRyxHQUFLLENBQUVsTSxFQUFHLEVBQUdDLEVBQUcsRUFBR2dNLEVBQUcsRUFBR0MsRUFBRyxHQUNuRCxDQUFFbE0sRUFBRyxFQUFHQyxFQUFHLEVBQUdnTSxFQUFHLEVBQUdDLEVBQUcsR0FBSyxDQUFFbE0sRUFBRyxFQUFHQyxFQUFHLEVBQUdnTSxFQUFHLEVBQUdDLEVBQUcsR0FDbkQsQ0FBRWxNLEVBQUcsRUFBR0MsRUFBRyxFQUFHZ00sRUFBRyxFQUFHQyxFQUFHLEdBQUssQ0FBRWxNLEVBQUcsRUFBR0MsRUFBRyxFQUFHZ00sRUFBRyxFQUFHQyxFQUFHLElBR3JELEtBQWEsQ0FDWCxDQUFFbE0sRUFBRyxFQUFHQyxFQUFHLEVBQUdnTSxFQUFHLEVBQUdDLEVBQUcsR0FBSyxDQUFFbE0sRUFBRyxFQUFHQyxFQUFHLEVBQUdnTSxFQUFHLEVBQUdDLEVBQUcsR0FDbkQsQ0FBRWxNLEVBQUcsRUFBR0MsRUFBRyxFQUFHZ00sRUFBRyxFQUFHQyxFQUFHLEdBQUssQ0FBRWxNLEVBQUcsRUFBR0MsRUFBRyxFQUFHZ00sRUFBRyxFQUFHQyxFQUFHLEdBQ25ELENBQUVsTSxFQUFHLEVBQUdDLEVBQUcsRUFBR2dNLEVBQUcsRUFBR0MsRUFBRyxHQUFLLENBQUVsTSxFQUFHLEVBQUdDLEVBQUcsRUFBR2dNLEVBQUcsRUFBR0MsRUFBRyxHQUNuRCxDQUFFbE0sRUFBRyxFQUFHQyxFQUFHLEVBQUdnTSxFQUFHLEVBQUdDLEVBQUcsR0FBSyxDQUFFbE0sRUFBRyxFQUFHQyxFQUFHLEVBQUdnTSxFQUFHLEVBQUdDLEVBQUcsSUFHckQsS0FBYSxDQUFDLENBQUVsTSxFQUFHLEVBQUdDLEVBQUcsRUFBR2dNLEVBQUcsRUFBR0MsRUFBRyxHQUFLLENBQUVsTSxFQUFHLEVBQUdDLEVBQUcsRUFBR2dNLEVBQUcsRUFBR0MsRUFBRyxLQVNuRSxNQUFNd1EsRUFBZ0YsQ0FFcEYsSUFBSyxDQUNILENBQUMsRUFBRyxFQUFHLEVBQUcsR0FDVixDQUFDLEVBQUcsRUFBRyxFQUFHLEdBQ1YsQ0FBQyxFQUFHLEVBQUcsRUFBRyxHQUNWLENBQUMsRUFBRyxFQUFHLEVBQUcsSUFFWixJQUFLLENBQ0gsQ0FBQyxFQUFHLEdBQ0osQ0FBQyxFQUFHLEdBQ0osQ0FBQyxFQUFHLEdBQ0osQ0FBQyxFQUFHLElBRU4sSUFBSyxDQUNILENBQUMsRUFBRyxHQUNKLENBQUMsRUFBRyxHQUNKLENBQUMsRUFBRyxHQUNKLENBQUMsRUFBRyxLQWdESyxFQUFBQyxzQkFBd0gsQ0FFbkksSUFBSyxDQUFFLEVBQWdCLGVBQ3ZCLElBQUssQ0FBRSxFQUFjLGVBQ3JCLElBQUssQ0FBRSxFQUFnQixlQUN2QixJQUFLLENBQUUsRUFBYyxlQUNyQixJQUFLLENBQUUsRUFBZ0IsdUJBQ3ZCLElBQUssQ0FBRSxFQUFjLHVCQUNyQixJQUFLLENBQUUsRUFBZ0Isc0JBQ3ZCLElBQUssQ0FBRSxFQUFjLHNCQUNyQixJQUFLLENBQUUsRUFBZ0Isc0JBQ3ZCLElBQUssQ0FBRSxFQUFjLHNCQUNyQixJQUFLLENBQUUsRUFBZ0Isc0JBQ3ZCLElBQUssQ0FBRSxFQUFjLHNCQUNyQixJQUFLLENBQUUsRUFBZ0IsNEJBQ3ZCLElBQUssQ0FBRSxFQUFjLDRCQUNyQixJQUFLLENBQUUsRUFBZ0IsNEJBQ3ZCLElBQUssQ0FBRSxFQUFjLDRCQUNyQixJQUFLLENBQUUsRUFBZ0IsNEJBQ3ZCLElBQUssQ0FBRSxFQUFjLDRCQUNyQixJQUFLLENBQUUsRUFBZ0IsNEJBQ3ZCLElBQUssQ0FBRSxFQUFjLDRCQUNyQixJQUFLLENBQUUsRUFBZ0IsMkJBQ3ZCLElBQUssQ0FBRSxFQUFjLDJCQUNyQixJQUFLLENBQUUsRUFBZ0IsZ0JBQ3ZCLElBQUssQ0FBRSxFQUFjLGdCQUNyQixJQUFLLENBQUUsRUFBZ0IsZ0JBQ3ZCLElBQUssQ0FBRSxFQUFjLGdCQUNyQixJQUFLLENBQUUsRUFBZ0IsZ0JBQ3ZCLElBQUssQ0FBRSxFQUFjLGdCQUNyQixJQUFLLENBQUUsRUFBZ0IsZ0JBQ3ZCLElBQUssQ0FBRSxFQUFjLGdCQUdyQixJQUFLLENBQUUsRUFBZ0IsQ0FBQ0MsRUFBSUMsSUFBTyxNQUFNLEdBQUtBLFFBQVMsR0FBS0EsUUFBUyxHQUFLQSxRQUFTLEdBQUtBLEtBQ3hGLElBQUssQ0FBRSxFQUFnQixDQUFDRCxFQUFJQyxJQUFPLElBQUksR0FBS0QsUUFBUyxHQUFLQSxRQUFTLEdBQUtBLFFBQVMsR0FBS0EsT0FDdEYsSUFBSyxDQUFFLEVBQWdCLENBQUNBLEVBQUlDLElBQU8sYUFBYSxHQUFLQSxRQUFTLEdBQUtBLFNBQVUsR0FBS0EsUUFBUyxHQUFLQSxLQUNoRyxJQUFLLENBQUUsRUFBZ0IsQ0FBQ0QsRUFBSUMsSUFBTyxJQUFJLEdBQUtELFFBQVMsR0FBS0EsZUFBZ0IsR0FBS0EsU0FBVSxHQUFLQSxPQUM5RixJQUFLLENBQUUsRUFBZ0IsQ0FBQ0EsRUFBSUMsSUFBTyxNQUFNLEdBQUtBLE1BQU8sR0FBS0QsS0FBTSxHQUFLQyxNQUFPLEdBQUtELFVBQVcsR0FBS0MsTUFBTyxHQUFLRCxLQUFNLEdBQUtDLE1BQU8sR0FBS0QsT0FDcEksSUFBSyxDQUFFLEVBQWdCLENBQUNBLEVBQUlDLElBQU8sTUFBTSxHQUFLQSxTQUFVLEdBQUtBLGNBQWUsR0FBS0EsU0FBVSxHQUFLQSxLQUNoRyxJQUFLLENBQUUsRUFBZ0IsQ0FBQ0QsRUFBSUMsSUFBTyxJQUFJLEdBQUtELFFBQVMsR0FBS0EsZUFBZ0IsR0FBS0EsU0FBVSxHQUFLQSxPQUM5RixJQUFLLENBQUUsRUFBZ0IsQ0FBQ0EsRUFBSUMsSUFBTyxNQUFNLEdBQUtBLE1BQU8sR0FBS0QsS0FBTSxHQUFLQyxNQUFPLEdBQUtELFVBQVcsR0FBS0MsTUFBTyxHQUFLRCxLQUFNLEdBQUtDLE1BQU8sR0FBS0QsT0FDcEksSUFBSyxDQUFFLEVBQWdCLENBQUNBLEVBQUlDLElBQU8sYUFBYSxHQUFLQSxRQUFTLEdBQUtBLFNBQVUsR0FBS0EsUUFBUyxHQUFLQSxLQUNoRyxJQUFLLENBQUUsRUFBZ0IsQ0FBQ0QsRUFBSUMsSUFBTyxVQUFVLEdBQUtELFNBQVUsR0FBS0EsUUFBUyxHQUFLQSxTQUFVLEdBQUtBLE9BQzlGLElBQUssQ0FBRSxFQUFnQixDQUFDQSxFQUFJQyxJQUFPLE1BQU0sR0FBS0EsTUFBTyxHQUFLRCxLQUFNLEdBQUtDLE1BQU8sR0FBS0QsVUFBVyxHQUFLQyxNQUFPLEdBQUtELEtBQU0sR0FBS0MsTUFBTyxHQUFLRCxPQUNwSSxJQUFLLENBQUUsRUFBZ0IsQ0FBQ0EsRUFBSUMsSUFBTyxNQUFNLEdBQUtBLFNBQVUsR0FBS0EsY0FBZSxHQUFLQSxTQUFVLEdBQUtBLEtBQ2hHLElBQUssQ0FBRSxFQUFnQixDQUFDRCxFQUFJQyxJQUFPLFVBQVUsR0FBS0QsU0FBVSxHQUFLQSxRQUFTLEdBQUtBLFNBQVUsR0FBS0EsT0FDOUYsSUFBSyxDQUFFLEVBQWdCLENBQUNBLEVBQUlDLElBQU8sTUFBTSxHQUFLQSxNQUFPLEdBQUtELEtBQU0sR0FBS0MsTUFBTyxHQUFLRCxVQUFXLEdBQUtDLE1BQU8sR0FBS0QsS0FBTSxHQUFLQyxNQUFPLEdBQUtELE9BQ3BJLElBQUssQ0FBRSxFQUFnQixDQUFDQSxFQUFJQyxJQUFPLG1CQUErQixHQUFLQSxRQUFTLEdBQUtBLFNBQVUsR0FBS0EsUUFBUyxHQUFLQSxLQUNsSCxJQUFLLENBQUUsRUFBZ0IsQ0FBQ0QsRUFBSUMsSUFBTyxJQUFJLEdBQUtELFFBQVMsR0FBS0EsUUFBUyxHQUFLQSxRQUFTLEdBQUtBLFFBQVMsR0FBS0EsY0FDcEcsSUFBSyxDQUFFLEVBQWdCLENBQUNBLEVBQUlDLElBQU8sSUFBSSxHQUFLRCxRQUFTLEdBQUtBLFVBQVcsR0FBS0MsTUFBTyxHQUFLRCxLQUFNLEdBQUtDLE1BQU8sR0FBS0QsVUFBVyxHQUFLQyxNQUFPLEdBQUtELEtBQU0sR0FBS0MsTUFBTyxHQUFLRCxPQUNoSyxJQUFLLENBQUUsRUFBZ0IsQ0FBQ0EsRUFBSUMsSUFBTyxrQkFBOEIsR0FBS0EsU0FBVSxHQUFLQSxRQUFTLEdBQUtBLFNBQVUsR0FBS0EsS0FDbEgsSUFBSyxDQUFFLEVBQWdCLENBQUNELEVBQUlDLElBQU8sVUFBVSxHQUFLRCxTQUFVLEdBQUtBLFFBQVMsR0FBS0EsUUFBUyxHQUFLQSxRQUFTLEdBQUtBLE9BQzNHLElBQUssQ0FBRSxFQUFnQixDQUFDQSxFQUFJQyxJQUFPLElBQUksR0FBS0QsUUFBUyxHQUFLQSxVQUFXLEdBQUtDLE1BQU8sR0FBS0QsS0FBTSxHQUFLQyxNQUFPLEdBQUtELFVBQVcsR0FBS0MsTUFBTyxHQUFLRCxLQUFNLEdBQUtDLE1BQU8sR0FBS0QsT0FDaEssSUFBSyxDQUFFLEVBQWdCLENBQUNBLEVBQUlDLElBQU8sTUFBTSxHQUFLQSxRQUFTLEdBQUtBLFFBQVMsR0FBS0EsUUFBUyxHQUFLQSxTQUFVLEdBQUtBLFdBQ3ZHLElBQUssQ0FBRSxFQUFnQixDQUFDRCxFQUFJQyxJQUFPLGdCQUE0QixHQUFLRCxTQUFVLEdBQUtBLFFBQVMsR0FBS0EsU0FBVSxHQUFLQSxPQUNoSCxJQUFLLENBQUUsRUFBZ0IsQ0FBQ0EsRUFBSUMsSUFBTyxNQUFNLEdBQUtBLFFBQVMsR0FBS0EsUUFBUyxHQUFLQSxNQUFPLEdBQUtELEtBQU0sR0FBS0MsTUFBTyxHQUFLRCxVQUFXLEdBQUtDLE1BQU8sR0FBS0QsS0FBTSxHQUFLQyxNQUFPLEdBQUtELE9BQ2hLLElBQUssQ0FBRSxFQUFnQixDQUFDQSxFQUFJQyxJQUFPLGFBQWEsR0FBS0EsUUFBUyxHQUFLQSxRQUFTLEdBQUtBLFFBQVMsR0FBS0EsUUFBUyxHQUFLQSxLQUM3RyxJQUFLLENBQUUsRUFBZ0IsQ0FBQ0QsRUFBSUMsSUFBTyxnQkFBNEIsR0FBS0QsU0FBVSxHQUFLQSxRQUFTLEdBQUtBLFNBQVUsR0FBS0EsT0FDaEgsSUFBSyxDQUFFLEVBQWdCLENBQUNBLEVBQUlDLElBQU8sTUFBTSxHQUFLQSxRQUFTLEdBQUtBLFFBQVMsR0FBS0EsTUFBTyxHQUFLRCxLQUFNLEdBQUtDLE1BQU8sR0FBS0QsVUFBVyxHQUFLQyxNQUFPLEdBQUtELEtBQU0sR0FBS0MsTUFBTyxHQUFLRCxPQUNoSyxJQUFLLENBQUUsRUFBZ0IsQ0FBQ0EsRUFBSUMsSUFBTyxrQkFBOEIsR0FBS0EsUUFBUyxHQUFLQSxRQUFTLEdBQUtBLFFBQVMsR0FBS0EsS0FDaEgsSUFBSyxDQUFFLEVBQWdCLENBQUNELEVBQUlDLElBQU8sZ0JBQTRCLEdBQUtELFFBQVMsR0FBS0EsUUFBUyxHQUFLQSxRQUFTLEdBQUtBLE9BQzlHLElBQUssQ0FBRSxFQUFnQixDQUFDQSxFQUFJQyxJQUFPLE1BQU0sR0FBS0EsTUFBTyxHQUFLRCxLQUFNLEdBQUtDLE1BQU8sR0FBS0QsVUFBVyxHQUFLQyxNQUFPLEdBQUtELEtBQU0sR0FBS0MsTUFBTyxHQUFLRCxVQUFXLEdBQUtDLE1BQU8sR0FBS0QsS0FBTSxHQUFLQyxNQUFPLEdBQUtELFVBQVcsR0FBS0MsTUFBTyxHQUFLRCxLQUFNLEdBQUtDLE1BQU8sR0FBS0QsT0FHMU8sSUFBSyxDQUFFLEVBQWdCLGFBQ3ZCLElBQUssQ0FBRSxFQUFnQixhQUN2QixJQUFLLENBQUUsRUFBZ0IsdUJBR3ZCLElBQUssQ0FBRSxFQUFnQixlQUFzRCxFQUFjLGdCQUMzRixJQUFLLENBQUUsRUFBZ0IsZUFBc0QsRUFBYyxnQkFDM0YsSUFBSyxDQUFFLEVBQWdCLGVBQXNELEVBQWMsZ0JBQzNGLElBQUssQ0FBRSxFQUFnQixlQUFzRCxFQUFjLGdCQUMzRixJQUFLLENBQUUsRUFBZ0IsZUFBc0QsRUFBYyxnQkFDM0YsSUFBSyxDQUFFLEVBQWdCLGVBQXNELEVBQWMsZ0JBQzNGLElBQUssQ0FBRSxFQUFnQixlQUFzRCxFQUFjLGdCQUMzRixJQUFLLENBQUUsRUFBZ0IsZUFBc0QsRUFBYyxnQkFDM0YsSUFBSyxDQUFFLEVBQWdCLGVBQXNELEVBQWMsZ0JBQzNGLElBQUssQ0FBRSxFQUFnQixlQUFzRCxFQUFjLGdCQUMzRixJQUFLLENBQUUsRUFBZ0IsZUFBc0QsRUFBYyxnQkFDM0YsSUFBSyxDQUFFLEVBQWdCLGVBQXNELEVBQWMsZ0JBQzNGLElBQUssQ0FBRSxFQUFnQixjQUFzRCxFQUFjLGdCQUMzRixJQUFLLENBQUUsRUFBZ0Isc0JBQXNELEVBQWMsZ0JBQzNGLElBQUssQ0FBRSxFQUFnQixxQkFBc0QsRUFBYyxnQkFDM0YsSUFBSyxDQUFFLEVBQWdCLGVBQXNELEVBQWMsZUFDM0YsSUFBSyxDQUFFLEVBQWdCLGVBQXNELEVBQWMsc0JBQzNGLElBQUssQ0FBRSxFQUFnQixlQUFzRCxFQUFjLHVCQUMzRixJQUFLLENBQUUsRUFBZ0IsY0FBc0QsRUFBYyxnQkFDM0YsSUFBSyxDQUFFLEVBQWdCLHFCQUFzRCxFQUFjLGdCQUMzRixJQUFLLENBQUUsRUFBZ0IscUJBQXNELEVBQWMsZ0JBQzNGLElBQUssQ0FBRSxFQUFnQixlQUFzRCxFQUFjLGVBQzNGLElBQUssQ0FBRSxFQUFnQixlQUFzRCxFQUFjLHNCQUMzRixJQUFLLENBQUUsRUFBZ0IsZUFBc0QsRUFBYyxzQkFDM0YsSUFBSyxDQUFFLEVBQWdCLHNCQUFzRCxFQUFjLGdCQUMzRixJQUFLLENBQUUsRUFBZ0IscUJBQXNELEVBQWMsZ0JBQzNGLElBQUssQ0FBRSxFQUFnQixlQUFzRCxFQUFjLGVBQzNGLElBQUssQ0FBRSxFQUFnQixjQUFzRCxFQUFjLGdCQUMzRixJQUFLLENBQUUsRUFBZ0IsZUFBc0QsRUFBYyxzQkFDM0YsSUFBSyxDQUFFLEVBQWdCLGVBQXNELEVBQWMsdUJBQzNGLElBQUssQ0FBRSxFQUFnQixxQkFBc0QsRUFBYyxnQkFDM0YsSUFBSyxDQUFFLEVBQWdCLHFCQUFzRCxFQUFjLGdCQUMzRixJQUFLLENBQUUsRUFBZ0IsZUFBc0QsRUFBYyxlQUMzRixJQUFLLENBQUUsRUFBZ0IsY0FBc0QsRUFBYyxnQkFDM0YsSUFBSyxDQUFFLEVBQWdCLGVBQXNELEVBQWMsc0JBQzNGLElBQUssQ0FBRSxFQUFnQixlQUFzRCxFQUFjLHNCQUMzRixJQUFLLENBQUUsRUFBZ0IsMkJBQXNELEVBQWMsZ0JBQzNGLElBQUssQ0FBRSxFQUFnQiwyQkFBc0QsRUFBYyxnQkFDM0YsSUFBSyxDQUFFLEVBQWdCLGNBQXNELEVBQWMsZUFDM0YsSUFBSyxDQUFFLEVBQWdCLDJCQUFzRCxFQUFjLGdCQUMzRixJQUFLLENBQUUsRUFBZ0IsMkJBQXNELEVBQWMsZ0JBQzNGLElBQUssQ0FBRSxFQUFnQixjQUFzRCxFQUFjLGVBQzNGLElBQUssQ0FBRSxFQUFnQixzQkFBc0QsRUFBYyxzQkFDM0YsSUFBSyxDQUFFLEVBQWdCLHFCQUFzRCxFQUFjLHNCQUMzRixJQUFLLENBQUUsRUFBZ0IscUJBQXNELEVBQWMsc0JBQzNGLElBQUssQ0FBRSxFQUFnQixxQkFBc0QsRUFBYyx1QkFDM0YsSUFBSyxDQUFFLEVBQWdCLGVBQXNELEVBQWMsNEJBQzNGLElBQUssQ0FBRSxFQUFnQixlQUFzRCxFQUFjLDRCQUMzRixJQUFLLENBQUUsRUFBZ0IsZUFBc0QsRUFBYyw0QkFDM0YsSUFBSyxDQUFFLEVBQWdCLGVBQXNELEVBQWMsNEJBRzNGLElBQUssQ0FBRSxFQUFnQiwrQkFDdkIsSUFBSyxDQUFFLEVBQWMsK0JBQ3JCLElBQUssQ0FBRSxFQUFnQix5REFDdkIsSUFBSyxDQUFFLEVBQWMseURBQ3JCLElBQUssQ0FBRSxFQUFnQiwrREFDdkIsSUFBSyxDQUFFLEVBQWMsK0RBQ3JCLElBQUssQ0FBRSxFQUFnQiwrQkFDdkIsSUFBSyxDQUFFLEVBQWMsK0JBQ3JCLElBQUssQ0FBRSxFQUFnQix5REFDdkIsSUFBSyxDQUFFLEVBQWMseURBQ3JCLElBQUssQ0FBRSxFQUFnQix3REFDdkIsSUFBSyxDQUFFLEVBQWMsd0RBR3JCLElBQUssQ0FBRSxFQUFnQixDQUFDQSxFQUFJQyxJQUFPLGFBQWEsR0FBTUEsRUFBSyxJQUFNLFVBQVcsR0FBTUEsRUFBSyxJQUFNLGlCQUM3RixJQUFLLENBQUUsRUFBZ0IsQ0FBQ0QsRUFBSUMsSUFBTyxhQUFhLEdBQU1BLEVBQUssSUFBTSxVQUFXLEdBQU1BLEVBQUssSUFBTSxpQkFDN0YsSUFBSyxDQUFFLEVBQWdCLENBQUNELEVBQUlDLElBQU8sYUFBYSxHQUFNQSxFQUFLLElBQU0sVUFBVyxHQUFNQSxFQUFLLElBQU0saUJBQzdGLElBQUssQ0FBRSxFQUFnQixDQUFDRCxFQUFJQyxJQUFPLGFBQWEsR0FBTUEsRUFBSyxJQUFNLFVBQVcsR0FBTUEsRUFBSyxJQUFNLGtCQTBCbEYsRUFBQUMscUJBQTBELENBRXJFLElBQVksQ0FBRWhFLEVBQUcsa0JBQW1CeEcsS0FBTSxFQUFpQnlLLGFBQWMsR0FFekUsSUFBWSxDQUFFakUsRUFBRyx3QkFBeUJ4RyxLQUFNLEVBQW1CMEssWUFBYSxFQUFHRCxhQUFjLEdBRWpHLElBQVksQ0FBRWpFLEVBQUcsa0JBQW1CeEcsS0FBTSxFQUFpQjBLLFlBQWEsR0FFeEUsSUFBWSxDQUFFbEUsRUFBRyxzQkFBdUJ4RyxLQUFNLEVBQW1CMEssWUFBYSxFQUFHRCxhQUFjLEdBRS9GLElBQVksQ0FBRWpFLEVBQUcsdURBQXdEeEcsS0FBTSxFQUFpQnlLLGFBQWMsR0FFOUcsSUFBWSxDQUFFakUsRUFBRyxxREFBc0R4RyxLQUFNLEVBQW1CeUssYUFBYyxHQUU5RyxJQUFZLENBQUVqRSxFQUFHLHVEQUF3RHhHLEtBQU0sRUFBaUIwSyxZQUFhLEdBRTdHLElBQVksQ0FBRWxFLEVBQUcsMERBQTJEeEcsS0FBTSxFQUFtQjBLLFlBQWEsR0FFbEgsSUFBWSxDQUFFbEUsRUFBRyw2QkFBOEJ4RyxLQUFNLEdBRXJELElBQVksQ0FBRXdHLEVBQUcsb0JBQXFCeEcsS0FBTSxFQUFtQjBLLFlBQWEsRUFBR0QsYUFBYyxHQUU3RixJQUFZLENBQUVqRSxFQUFHLDZCQUE4QnhHLEtBQU0sR0FFckQsSUFBWSxDQUFFd0csRUFBRyw2QkFBOEJ4RyxLQUFNLEdBRXJELElBQVksQ0FBRXdHLEVBQUcsb0JBQXFCeEcsS0FBTSxFQUFtQjBLLFlBQWEsRUFBR0QsYUFBYyxHQUU3RixJQUFZLENBQUVqRSxFQUFHLDZCQUE4QnhHLEtBQU0sSUFHdkQsRUFBQXdLLHFCQUFBLEtBQW1DLEVBQUFBLHFCQUFxQixLQUV4RCxFQUFBQSxxQkFBQSxLQUFtQyxFQUFBQSxxQkFBcUIsS0FNeEQsNkJBQ0VHLEVBQ0FDLEVBQ0FDLEVBQ0FDLEVBQ0EzRSxFQUNBZSxFQUNBOUMsRUFDQWlELEdBRUEsTUFBTTBELEVBQXlCLEVBQUFaLHdCQUF3QlMsR0FDdkQsR0FBSUcsRUFFRixPQXdCSixTQUNFSixFQUNBSyxFQUNBSCxFQUNBQyxFQUNBM0UsRUFDQWUsR0FFQSxJQUFLLElBQUlyZCxFQUFJLEVBQUdBLEVBQUltaEIsRUFBZXpjLE9BQVExRSxJQUFLLENBQzlDLE1BQU1vaEIsRUFBTUQsRUFBZW5oQixHQUNyQnFoQixFQUFVL0UsRUFBa0IsRUFDNUJnRixFQUFVakUsRUFBbUIsRUFDbkN5RCxFQUFJekgsU0FDRjJILEVBQVVJLEVBQUl2ZCxFQUFJd2QsRUFDbEJKLEVBQVVHLEVBQUl0ZCxFQUFJd2QsRUFDbEJGLEVBQUl0UixFQUFJdVIsRUFDUkQsRUFBSXJSLEVBQUl1UixFLENBR2QsQ0E1Q0lDLENBQXFCVCxFQUFLSSxFQUF3QkYsRUFBU0MsRUFBUzNFLEVBQWlCZSxJQUM5RSxFQUdULE1BQU1tRSxFQUFvQmpCLEVBQTRCUSxHQUN0RCxHQUFJUyxFQUVGLE9BeUNKLFNBQ0VWLEVBQ0FLLEVBQ0FILEVBQ0FDLEVBQ0EzRSxFQUNBZSxHQUVBLElBQUlvRSxFQUFhQyxFQUFlck4sSUFBSThNLEdBQy9CTSxJQUNIQSxFQUFhLElBQUlFLElBQ2pCRCxFQUFlN2EsSUFBSXNhLEVBQWdCTSxJQUVyQyxNQUFNbEksRUFBWXVILEVBQUl2SCxVQUN0QixHQUF5QixpQkFBZEEsRUFDVCxNQUFNLElBQUl6SyxNQUFNLDhCQUE4QnlLLE1BRWhELElBQUlxSSxFQUFVSCxFQUFXcE4sSUFBSWtGLEdBQzdCLElBQUtxSSxFQUFTLENBQ1osTUFBTXhkLEVBQVErYyxFQUFlLEdBQUd6YyxPQUMxQlksRUFBUzZiLEVBQWV6YyxPQUN4Qm1kLEVBQVlmLEVBQUl6YixPQUFPeWMsY0FBY3JULGNBQWMsVUFDekRvVCxFQUFVemQsTUFBUUEsRUFDbEJ5ZCxFQUFVdmMsT0FBU0EsRUFDbkIsTUFBTXljLEdBQVMsSUFBQXhpQixjQUFhc2lCLEVBQVVoVCxXQUFXLE9BQzNDbVQsRUFBWSxJQUFJQyxVQUFVN2QsRUFBT2tCLEdBR3ZDLElBQUl5RixFQUNBQyxFQUNBQyxFQUNBQyxFQUNKLEdBQUlxTyxFQUFVMkksV0FBVyxLQUN2Qm5YLEVBQUlvWCxTQUFTNUksRUFBVW9GLE1BQU0sRUFBRyxHQUFJLElBQ3BDM1QsRUFBSW1YLFNBQVM1SSxFQUFVb0YsTUFBTSxFQUFHLEdBQUksSUFDcEMxVCxFQUFJa1gsU0FBUzVJLEVBQVVvRixNQUFNLEVBQUcsR0FBSSxJQUNwQ3pULEVBQUlxTyxFQUFVN1UsT0FBUyxHQUFLeWQsU0FBUzVJLEVBQVVvRixNQUFNLEVBQUcsR0FBSSxLQUFPLE1BQzlELEtBQUlwRixFQUFVMkksV0FBVyxRQUc5QixNQUFNLElBQUlwVCxNQUFNLHNDQUFzQ3lLLGtDQUZwRHhPLEVBQUdDLEVBQUdDLEVBQUdDLEdBQUtxTyxFQUFVNkksVUFBVSxFQUFHN0ksRUFBVTdVLE9BQVMsR0FBRzJkLE1BQU0sS0FBS0MsS0FBSS9aLEdBQUtnYSxXQUFXaGEsSSxDQUs5RixJQUFLLElBQUl6RSxFQUFJLEVBQUdBLEVBQUl3QixFQUFReEIsSUFDMUIsSUFBSyxJQUFJRCxFQUFJLEVBQUdBLEVBQUlPLEVBQU9QLElBQ3pCbWUsRUFBVVEsS0FBdUIsR0FBakIxZSxFQUFJTSxFQUFRUCxJQUFja0gsRUFDMUNpWCxFQUFVUSxLQUF1QixHQUFqQjFlLEVBQUlNLEVBQVFQLEdBQVMsR0FBS21ILEVBQzFDZ1gsRUFBVVEsS0FBdUIsR0FBakIxZSxFQUFJTSxFQUFRUCxHQUFTLEdBQUtvSCxFQUMxQytXLEVBQVVRLEtBQXVCLEdBQWpCMWUsRUFBSU0sRUFBUVAsR0FBUyxHQUFLc2QsRUFBZXJkLEdBQUdELElBQVUsSUFBSnFILEdBR3RFNlcsRUFBT1UsYUFBYVQsRUFBVyxFQUFHLEdBQ2xDSixHQUFVLElBQUFyaUIsY0FBYXVoQixFQUFJNEIsY0FBY2IsRUFBVyxPQUNwREosRUFBVzVhLElBQUkwUyxFQUFXcUksRSxDQUU1QmQsRUFBSXZILFVBQVlxSSxFQUNoQmQsRUFBSXpILFNBQVMySCxFQUFTQyxFQUFTM0UsRUFBaUJlLEVBQ2xELENBbkdJc0YsQ0FBZ0I3QixFQUFLVSxFQUFtQlIsRUFBU0MsRUFBUzNFLEVBQWlCZSxJQUNwRSxFQUdULE1BQU11RixFQUF1QixFQUFBcEMsc0JBQXNCTyxHQUNuRCxHQUFJNkIsRUFFRixPQXNJSixTQUNFOUIsRUFDQUssRUFDQUgsRUFDQUMsRUFDQTNFLEVBQ0FlLEVBQ0FHLEdBRUFzRCxFQUFJK0IsWUFBYy9CLEVBQUl2SCxVQUN0QixJQUFLLE1BQU9lLEVBQVl3SSxLQUFpQkMsT0FBT0MsUUFBUTdCLEdBQWlCLENBR3ZFLElBQUk4QixFQUZKbkMsRUFBSTlHLFlBQ0o4RyxFQUFJckUsVUFBWWUsRUFBbUIwRixPQUFPZixTQUFTN0gsR0FLakQySSxFQUgwQixtQkFBakJILEVBR1lBLEVBRlYsSUFDQSxJQUFNekYsRUFBbUJmLEdBR2Z3RyxFQUV2QixJQUFLLE1BQU1LLEtBQWVGLEVBQW1CWixNQUFNLEtBQU0sQ0FDdkQsTUFBTWxNLEVBQU9nTixFQUFZLEdBQ25CQyxFQUFJQyxFQUEwQmxOLEdBQ3BDLElBQUtpTixFQUFHLENBQ05wVSxRQUFRMEgsTUFBTSw0Q0FBNENQLE1BQzFELFEsQ0FFRixNQUFNbU4sRUFBaUJILEVBQVlmLFVBQVUsR0FBR0MsTUFBTSxLQUNqRGlCLEVBQUssSUFBT0EsRUFBSyxJQUd0QkYsRUFBRXRDLEVBQUt5QyxFQUFjRCxFQUFNaEgsRUFBaUJlLEVBQWtCMkQsRUFBU0MsR0FBUyxFQUFNekQsRyxDQUV4RnNELEVBQUkwQyxTQUNKMUMsRUFBSTJDLFcsQ0FFUixDQTVLSUMsQ0FBbUI1QyxFQUFLOEIsRUFBc0I1QixFQUFTQyxFQUFTM0UsRUFBaUJlLEVBQWtCRyxJQUM1RixFQUdULE1BQU1tRyxFQUFzQixFQUFBaEQscUJBQXFCSSxHQUNqRCxRQUFJNEMsSUF5S04sU0FDRTdDLEVBQ0FLLEVBQ0FILEVBQ0FDLEVBQ0EzRSxFQUNBZSxFQUNBOUMsRUFDQWlELEdBR0EsTUFBTW9HLEVBQWEsSUFBSUMsT0FDdkJELEVBQVczSixLQUFLK0csRUFBU0MsRUFBUzNFLEVBQWlCZSxHQUNuRHlELEVBQUk1RyxLQUFLMEosR0FFVDlDLEVBQUk5RyxZQUVKLE1BQU04SixFQUFldkosRUFBVyxHQUNoQ3VHLEVBQUlyRSxVQUFZZSxFQUFtQnNHLEVBQ25DLElBQUssTUFBTVgsS0FBZWhDLEVBQWV4RSxFQUFFMEYsTUFBTSxLQUFNLENBQ3JELE1BQU1sTSxFQUFPZ04sRUFBWSxHQUNuQkMsRUFBSUMsRUFBMEJsTixHQUNwQyxJQUFLaU4sRUFBRyxDQUNOcFUsUUFBUTBILE1BQU0sNENBQTRDUCxNQUMxRCxRLENBRUYsTUFBTW1OLEVBQWlCSCxFQUFZZixVQUFVLEdBQUdDLE1BQU0sS0FDakRpQixFQUFLLElBQU9BLEVBQUssSUFHdEJGLEVBQUV0QyxFQUFLeUMsRUFDTEQsRUFDQWhILEVBQ0FlLEVBQ0EyRCxFQUNBQyxHQUNBLEVBQ0F6RCxHQUNDMkQsRUFBZU4sYUFBZSxJQUFNaUQsRUFBZSxJQUNuRDNDLEVBQWVQLGNBQWdCLElBQU1rRCxFQUFlLEksQ0FHN0IsSUFBeEIzQyxFQUFlaEwsTUFDakIySyxFQUFJK0IsWUFBYy9CLEVBQUl2SCxVQUN0QnVILEVBQUkwQyxVQUVKMUMsRUFBSWhiLE9BRU5nYixFQUFJMkMsV0FDTixDQXpOSU0sQ0FBa0JqRCxFQUFLNkMsRUFBcUIzQyxFQUFTQyxFQUFTM0UsRUFBaUJlLEVBQWtCOUMsRUFBVWlELElBQ3BHLEVBSVgsRUF1QkEsTUFBTWtFLEVBQW9GLElBQUlDLElBK0w5RixTQUFTbk8sRUFBTTdELEVBQWVzRyxFQUFhM1csRUFBYyxHQUN2RCxPQUFPRCxLQUFLNFcsSUFBSTVXLEtBQUtDLElBQUlxUSxFQUFPc0csR0FBTTNXLEVBQ3hDLENBRUEsTUFBTStqQixFQUFzRCxDQUMxRCxFQUFLLENBQUN2QyxFQUErQndDLElBQW1CeEMsRUFBSWtELGNBQWNWLEVBQUssR0FBSUEsRUFBSyxHQUFJQSxFQUFLLEdBQUlBLEVBQUssR0FBSUEsRUFBSyxHQUFJQSxFQUFLLElBQzVILEVBQUssQ0FBQ3hDLEVBQStCd0MsSUFBbUJ4QyxFQUFJbUQsT0FBT1gsRUFBSyxHQUFJQSxFQUFLLElBQ2pGLEVBQUssQ0FBQ3hDLEVBQStCd0MsSUFBbUJ4QyxFQUFJb0QsT0FBT1osRUFBSyxHQUFJQSxFQUFLLEtBR25GLFNBQVNDLEVBQWNELEVBQWdCYSxFQUFtQkMsRUFBb0JwRCxFQUFpQkMsRUFBaUJvRCxFQUFrQjdHLEVBQTBCcUQsRUFBc0IsRUFBR0QsRUFBdUIsR0FDMU0sTUFBTXJNLEVBQVMrTyxFQUFLaEIsS0FBSS9aLEdBQUtnYSxXQUFXaGEsSUFBTTRaLFNBQVM1WixLQUV2RCxHQUFJZ00sRUFBTzdQLE9BQVMsRUFDbEIsTUFBTSxJQUFJb0ssTUFBTSxxQ0FHbEIsSUFBSyxJQUFJakwsRUFBSSxFQUFHQSxFQUFJMFEsRUFBTzdQLE9BQVFiLEdBQUssRUFFdEMwUSxFQUFPMVEsSUFBTXNnQixFQUFhdEQsRUFBY3JELEVBQXFCb0QsRUFBZXBELEVBR3hFNkcsR0FBeUIsSUFBZDlQLEVBQU8xUSxLQUNwQjBRLEVBQU8xUSxHQUFLMlAsRUFBTW5VLEtBQUtrVyxNQUFNaEIsRUFBTzFRLEdBQUssSUFBTyxHQUFLc2dCLEVBQVcsSUFHbEU1UCxFQUFPMVEsSUFBTW1kLEVBQVdILEVBQWNyRCxFQUd4QyxJQUFLLElBQUkxWixFQUFJLEVBQUdBLEVBQUl5USxFQUFPN1AsT0FBUVosR0FBSyxFQUV0Q3lRLEVBQU96USxJQUFNc2dCLEVBR1RDLEdBQXlCLElBQWQ5UCxFQUFPelEsS0FDcEJ5USxFQUFPelEsR0FBSzBQLEVBQU1uVSxLQUFLa1csTUFBTWhCLEVBQU96USxHQUFLLElBQU8sR0FBS3NnQixFQUFZLElBR25FN1AsRUFBT3pRLElBQU1tZCxFQUdmLE9BQU8xTSxDQUNULEMsc0dDenFCQSxlQUdBLHdDQUE2QytQLEVBQXNCQyxFQUEwQ0MsR0FLM0csSUFBSUMsRUFBdUMsSUFBSUYsRUFBYUcsZ0JBQWdCMUIsSUFDMUUsTUFBTXJGLEVBQVFxRixFQUFRMkIsTUFBTWhILEdBQVVBLEVBQU1pSCxTQUFXTixJQUN2RCxJQUFLM0csRUFDSCxPQUlGLEtBQU0sOEJBQStCQSxHQUduQyxPQUZBOEcsR0FBVUksa0JBQ1ZKLE9BQVd2bEIsR0FLYixNQUFNa0YsRUFBUXVaLEVBQU1tSCwwQkFBMEIsR0FBR0MsV0FDM0N6ZixFQUFTcVksRUFBTW1ILDBCQUEwQixHQUFHRSxVQUM5QzVnQixFQUFRLEdBQUtrQixFQUFTLEdBQ3hCa2YsRUFBU3BnQixFQUFPa0IsRSxJQUdwQixJQUNFbWYsRUFBU1EsUUFBUVgsRUFBUyxDQUFFbEQsSUFBSyxDQUFDLDZCLENBQ2xDLE1BQ0FxRCxFQUFTSSxhQUNUSixPQUFXdmxCLEMsQ0FFYixPQUFPLElBQUFpQixlQUFhLElBQU1za0IsR0FBVUksY0FDdEMsQyxjQzFCQSxTQUFnQkssRUFBaUJDLEdBSS9CLE9BQU8sT0FBVUEsR0FBYUEsR0FBYSxLQUM3QyxDQWNBLFNBQWdCQyxFQUFRRCxHQUN0QixPQUNFQSxHQUFhLFFBQVdBLEdBQWEsUUFDckNBLEdBQWEsUUFBV0EsR0FBYSxRQUNyQ0EsR0FBYSxRQUFXQSxHQUFhLFFBQ3JDQSxHQUFhLE1BQVdBLEdBQWEsTUFDckNBLEdBQWEsTUFBV0EsR0FBYSxPQUNyQ0EsR0FBYSxPQUFXQSxHQUFhLE9BQ3JDQSxHQUFhLFFBQVdBLEdBQWEsUUFDckNBLEdBQWEsUUFBV0EsR0FBYSxNQUV6QyxDLG9PQXJDQSx3QkFBZ0N4VixHQUM5QixJQUFLQSxFQUNILE1BQU0sSUFBSWIsTUFBTSwyQkFFbEIsT0FBT2EsQ0FDVCxFQUVBLHFCQU9BLHNDQUEyQ3dWLEdBQ3pDLE9BQU8sT0FBVUEsR0FBYUEsR0FBYSxLQUM3QyxFQVVBLFlBYUEsMEJBQStCQSxFQUErQi9nQixFQUFlaWhCLEVBQW9CL0ksR0FDL0YsT0FFWSxJQUFWbFksR0FHQWloQixFQUFhaG1CLEtBQUtnVyxLQUF1QixJQUFsQmlILFNBRVRwZCxJQUFkaW1CLEdBQTJCQSxFQUFZLE1BRXRDQyxFQUFRRCxLQUVSRCxFQUFpQkMsS0FqQ3RCLFNBQXlCQSxHQUN2QixPQUFPLE9BQVVBLEdBQWFBLEdBQWEsS0FDN0MsQ0ErQnFDRyxDQUFnQkgsRUFFckQsRUFFQSx1Q0FBNENBLEdBQzFDLE9BQU9ELEVBQWlCQyxJQWxDMUIsU0FBMkJBLEdBQ3pCLE9BQU8sTUFBVUEsR0FBYUEsR0FBYSxJQUM3QyxDQWdDd0NJLENBQWtCSixFQUMxRCxFQUVBLG9DQUNFLE1BQU8sQ0FDTG5VLElBQUssQ0FDSDNMLE9BaUJHLENBQ0xqQixNQUFPLEVBQ1BrQixPQUFRLEdBbEJOUCxLQWdCRyxDQUNMWCxNQUFPLEVBQ1BrQixPQUFRLElBaEJSUixPQUFRLENBQ05PLE9BYUcsQ0FDTGpCLE1BQU8sRUFDUGtCLE9BQVEsR0FkTlAsS0FZRyxDQUNMWCxNQUFPLEVBQ1BrQixPQUFRLEdBYk5OLEtBQU0sQ0FDSlosTUFBTyxFQUNQa0IsT0FBUSxFQUNSSixLQUFNLEVBQ05DLElBQUssSUFJYixFQVNBLG9DQUF5Q2dmLEVBQW1CMUgsRUFBbUIrSSxFQUF3QixHQUNyRyxPQUFRckIsR0FBcUMsRUFBeEI5a0IsS0FBS2tXLE1BQU1rSCxHQUFpQitJLEtBQTJDLEVBQXhCbm1CLEtBQUtrVyxNQUFNa0gsR0FDakYsQyxtR0NyRkEsTUFBTWdKLEVBWUosV0FBQXBuQixHQUNFWSxLQUFLOEcsT0FDUCxDQUVPLEtBQUFBLEdBQ0w5RyxLQUFLeW1CLGNBQWUsRUFDcEJ6bUIsS0FBS3dTLGtCQUFtQixFQUN4QnhTLEtBQUswbUIsaUJBQW1CLEVBQ3hCMW1CLEtBQUsybUIsZUFBaUIsRUFDdEIzbUIsS0FBSzRtQix1QkFBeUIsRUFDOUI1bUIsS0FBSzZtQixxQkFBdUIsRUFDNUI3bUIsS0FBSzhtQixTQUFXLEVBQ2hCOW1CLEtBQUsrbUIsT0FBUyxFQUNkL21CLEtBQUtnbkIsb0JBQWlCL21CLEVBQ3RCRCxLQUFLaW5CLGtCQUFlaG5CLENBQ3RCLENBRU8sTUFBQXdTLENBQU8xTCxFQUFxQnVMLEVBQXFDQyxFQUFtQ0MsR0FBNEIsR0FJckksR0FIQXhTLEtBQUtnbkIsZUFBaUIxVSxFQUN0QnRTLEtBQUtpbkIsYUFBZTFVLEdBRWZELElBQVVDLEdBQVFELEVBQU0sS0FBT0MsRUFBSSxJQUFNRCxFQUFNLEtBQU9DLEVBQUksR0FFN0QsWUFEQXZTLEtBQUs4RyxRQUtQLE1BQU1vZ0IsRUFBWW5nQixFQUFTb2dCLFFBQVF6UyxPQUFPRyxNQUNwQzZSLEVBQW1CcFUsRUFBTSxHQUFLNFUsRUFDOUJQLEVBQWlCcFUsRUFBSSxHQUFLMlUsRUFDMUJOLEVBQXlCeG1CLEtBQUs0VyxJQUFJMFAsRUFBa0IsR0FDcERHLEVBQXVCem1CLEtBQUtDLElBQUlzbUIsRUFBZ0I1ZixFQUFTRSxLQUFPLEdBR2xFMmYsR0FBMEI3ZixFQUFTRSxNQUFRNGYsRUFBdUIsRUFDcEU3bUIsS0FBSzhHLFNBSVA5RyxLQUFLeW1CLGNBQWUsRUFDcEJ6bUIsS0FBS3dTLGlCQUFtQkEsRUFDeEJ4UyxLQUFLMG1CLGlCQUFtQkEsRUFDeEIxbUIsS0FBSzJtQixlQUFpQkEsRUFDdEIzbUIsS0FBSzRtQix1QkFBeUJBLEVBQzlCNW1CLEtBQUs2bUIscUJBQXVCQSxFQUM1QjdtQixLQUFLOG1CLFNBQVd4VSxFQUFNLEdBQ3RCdFMsS0FBSyttQixPQUFTeFUsRUFBSSxHQUNwQixDQUVPLGNBQUFzTCxDQUFlOVcsRUFBb0JuQyxFQUFXQyxHQUNuRCxRQUFLN0UsS0FBS3ltQixlQUdWNWhCLEdBQUtrQyxFQUFTME4sT0FBT0MsT0FBT3dTLFVBQ3hCbG5CLEtBQUt3UyxpQkFDSHhTLEtBQUs4bUIsVUFBWTltQixLQUFLK21CLE9BQ2pCbmlCLEdBQUs1RSxLQUFLOG1CLFVBQVlqaUIsR0FBSzdFLEtBQUs0bUIsd0JBQ3JDaGlCLEVBQUk1RSxLQUFLK21CLFFBQVVsaUIsR0FBSzdFLEtBQUs2bUIscUJBRTFCamlCLEVBQUk1RSxLQUFLOG1CLFVBQVlqaUIsR0FBSzdFLEtBQUs0bUIsd0JBQ3BDaGlCLEdBQUs1RSxLQUFLK21CLFFBQVVsaUIsR0FBSzdFLEtBQUs2bUIscUJBRTFCaGlCLEVBQUk3RSxLQUFLMG1CLGtCQUFvQjdoQixFQUFJN0UsS0FBSzJtQixnQkFDM0MzbUIsS0FBSzBtQixtQkFBcUIxbUIsS0FBSzJtQixnQkFBa0I5aEIsSUFBTTdFLEtBQUswbUIsa0JBQW9COWhCLEdBQUs1RSxLQUFLOG1CLFVBQVlsaUIsRUFBSTVFLEtBQUsrbUIsUUFDL0cvbUIsS0FBSzBtQixpQkFBbUIxbUIsS0FBSzJtQixnQkFBa0I5aEIsSUFBTTdFLEtBQUsybUIsZ0JBQWtCL2hCLEVBQUk1RSxLQUFLK21CLFFBQ3JGL21CLEtBQUswbUIsaUJBQW1CMW1CLEtBQUsybUIsZ0JBQWtCOWhCLElBQU03RSxLQUFLMG1CLGtCQUFvQjloQixHQUFLNUUsS0FBSzhtQixTQUM3RixFQUdGLHdDQUNFLE9BQU8sSUFBSU4sQ0FDYixDLHVGQ3RGQSxlQUNBLFNBQ0EsU0FFQSxTQUNBLFNBQ0EsU0FDQSxTQUVBLFNBQ0EsU0FNTVksRUFBMEMsQ0FDOUM5Z0IsWUFBYSxFQUNiK2dCLGdCQUFpQixDQUFFemlCLEVBQUcsRUFBR0MsRUFBRyxHQUM1QjBCLHlCQUEwQixDQUFFM0IsRUFBRyxFQUFHQyxFQUFHLEdBQ3JDbUIsT0FBUSxDQUFFcEIsRUFBRyxFQUFHQyxFQUFHLEdBQ25Cc0IsS0FBTSxDQUFFdkIsRUFBRyxFQUFHQyxFQUFHLEdBQ2pCNEIsY0FBZSxDQUFFN0IsRUFBRyxFQUFHQyxFQUFHLElBMEI1QixJQUFJL0YsRUFFSixNQUFhb0IsRUFRWCxTQUFXc0csR0FBNEQsT0FBT3hHLEtBQUtzbkIsTUFBUSxDQXNCM0YsV0FBQWxvQixDQUNtQm1vQixFQUNBQyxFQUNBQyxHQUZBLEtBQUFGLFVBQUFBLEVBQ0EsS0FBQUMsUUFBQUEsRUFDQSxLQUFBQyxnQkFBQUEsRUFoQ1gsS0FBQUMsWUFBc0IsRUFFdEIsS0FBQUMsVUFBMEUsSUFBSSxFQUFBQyxXQUM5RSxLQUFBQyxrQkFBa0YsSUFBSSxFQUFBRCxXQUd0RixLQUFBTixPQUFzQixHQUl0QixLQUFBUSxhQUE0QixHQU01QixLQUFBQyxpQkFBaUMsQ0FBRTdoQixJQUFLLEVBQUdELEtBQU0sRUFBRytoQixPQUFRLEVBQUdDLE1BQU8sR0FDdEUsS0FBQUMsbUJBQW9DLElBQUksRUFBQTFSLGNBRXhDLEtBQUEyUixhQUF1QixJQUtkLEtBQUFuYSx5QkFBMkIsSUFBSSxFQUFBSCxhQUNoQyxLQUFBSSx3QkFBMEJqTyxLQUFLZ08seUJBQXlCRCxNQUN2RCxLQUFBRyw0QkFBOEIsSUFBSSxFQUFBTCxhQUNuQyxLQUFBTSwyQkFBNkJuTyxLQUFLa08sNEJBQTRCSCxNQThDdEUsS0FBQXFhLG9CQUFxQixFQXZDM0Jwb0IsS0FBS3FvQixpQkFDTHJvQixLQUFLc29CLFdBQWFDLEVBQ2hCaEIsRUFDK0IsRUFBL0J2bkIsS0FBS3duQixRQUFRbkssZ0JBQXNCbUwsRUFDbkN4b0IsS0FBS3duQixRQUFRcEosaUJBQW1Cb0ssR0FFbEN4b0IsS0FBS3lvQixTQUFVLElBQUFub0IsY0FBYU4sS0FBS3NvQixXQUFXMVksV0FBVyxLQUFNLENBQzNENkosTUFBT3paLEtBQUt3bkIsUUFBUTFILGtCQUNwQjRJLG9CQUFvQixJQUV4QixDQUVPLE9BQUFuWCxHQUNMLElBQUssTUFBTW9YLEtBQVEzb0IsS0FBS3dHLE1BQ3RCbWlCLEVBQUt2aUIsT0FBT21ULFNBRWR2WixLQUFLZ08seUJBQXlCdUQsU0FDaEMsQ0FFTyxNQUFBd0IsR0FDQS9TLEtBQUswbkIsYUFDUjFuQixLQUFLNG9CLFlBQ0w1b0IsS0FBSzBuQixZQUFhLEVBRXRCLENBRVEsU0FBQWtCLEdBRU4sTUFBTUMsRUFBUSxJQUFJLEVBQUFDLGNBQ2xCLElBQUssSUFBSS9uQixFQUFJLEdBQUlBLEVBQUksSUFBS0EsSUFDeEI4bkIsRUFBTUUsU0FBUSxLQUNaLElBQUsvb0IsS0FBSzJuQixVQUFVdlMsSUFBSXJVLEVBQUcsRUFBQWlvQixjQUFlLEVBQUFBLGNBQWUsRUFBQUMsYUFBYyxDQUNyRSxNQUFNQyxFQUFrQmxwQixLQUFLbXBCLGFBQWFwb0IsRUFBRyxFQUFBaW9CLGNBQWUsRUFBQUEsY0FBZSxFQUFBQyxhQUMzRWpwQixLQUFLMm5CLFVBQVUvZixJQUFJN0csRUFBRyxFQUFBaW9CLGNBQWUsRUFBQUEsY0FBZSxFQUFBQyxZQUFhQyxFLElBSXpFLENBR08sVUFBQXprQixHQUNMLE9BQU96RSxLQUFLb29CLGtCQUNkLENBRU8sWUFBQWxWLEdBQ0wsR0FBb0MsSUFBaENsVCxLQUFLc25CLE9BQU8sR0FBRzhCLFdBQVd4a0IsR0FBMkMsSUFBaEM1RSxLQUFLc25CLE9BQU8sR0FBRzhCLFdBQVd2a0IsRUFBbkUsQ0FHQSxJQUFLLE1BQU04akIsS0FBUTNvQixLQUFLc25CLE9BQ3RCcUIsRUFBSzdoQixRQUVQOUcsS0FBSzJuQixVQUFVN2dCLFFBQ2Y5RyxLQUFLNm5CLGtCQUFrQi9nQixRQUN2QjlHLEtBQUswbkIsWUFBYSxDLENBQ3BCLENBRVEsY0FBQVcsR0FLTixHQUFJbm9CLEVBQWFDLGVBQWlCSCxLQUFLc25CLE9BQU83aEIsUUFBVXJGLEtBQUs0VyxJQUFJLEVBQUc5VyxFQUFhQyxlQUFnQixDQUcvRixNQUFNa3BCLEVBQWNycEIsS0FBS3NuQixPQUFPZ0MsUUFBT2hnQixHQUNiLEVBQWpCQSxFQUFFbEQsT0FBT2pCLFFBQWNqRixFQUFhTyxnQkFBa0IsUUFDNUQ4b0IsTUFBSyxDQUFDdGQsRUFBR0QsSUFDTkEsRUFBRTVGLE9BQU9qQixRQUFVOEcsRUFBRTdGLE9BQU9qQixNQUN2QjZHLEVBQUU1RixPQUFPakIsTUFBUThHLEVBQUU3RixPQUFPakIsTUFFNUI2RyxFQUFFd2QsZUFBaUJ2ZCxFQUFFdWQsaUJBRTlCLElBQUlDLEdBQWEsRUFDYnRqQixFQUFPLEVBQ1gsSUFBSyxJQUFJcEYsRUFBSSxFQUFHQSxFQUFJc29CLEVBQVk1akIsT0FBUTFFLElBQ3RDLEdBQUlzb0IsRUFBWXRvQixHQUFHcUYsT0FBT2pCLFFBQVVnQixFQUNsQ3NqQixFQUFZMW9CLEVBQ1pvRixFQUFPa2pCLEVBQVl0b0IsR0FBR3FGLE9BQU9qQixXQUN4QixHQUFJcEUsRUFBSTBvQixHQUFjLEVBQzNCLE1BS0osTUFBTUMsRUFBZUwsRUFBWTNKLE1BQU0rSixFQUFXQSxFQUFZLEdBQ3hERSxFQUE0QkQsRUFBYXJHLEtBQUkvWixHQUFLQSxFQUFFc2dCLE9BQU8sR0FBR3RqQixjQUFhaWpCLE1BQUssQ0FBQ3RkLEVBQUdELElBQU1DLEVBQUlELEVBQUksR0FBSyxJQUN2RzZkLEVBQWtCN3BCLEtBQUt3RyxNQUFNZixPQUFTaWtCLEVBQWFqa0IsT0FHbkRxa0IsRUFBYTlwQixLQUFLK3BCLFlBQVlMLEVBQWNHLEdBQ2xEQyxFQUFXaGlCLFVBR1gsSUFBSyxJQUFJL0csRUFBSTRvQixFQUEwQmxrQixPQUFTLEVBQUcxRSxHQUFLLEVBQUdBLElBQ3pEZixLQUFLZ3FCLFlBQVlMLEVBQTBCNW9CLElBSTdDZixLQUFLd0csTUFBTXlZLEtBQUs2SyxHQUdoQjlwQixLQUFLb29CLG9CQUFxQixFQUMxQnBvQixLQUFLZ08seUJBQXlCcUMsS0FBS3laLEVBQVcxakIsTyxDQUloRCxNQUFNNmpCLEVBQVUsSUFBSUMsRUFBVWxxQixLQUFLdW5CLFVBQVd2bkIsS0FBS21vQixjQUluRCxPQUhBbm9CLEtBQUtzbkIsT0FBT3JJLEtBQUtnTCxHQUNqQmpxQixLQUFLOG5CLGFBQWE3SSxLQUFLZ0wsR0FDdkJqcUIsS0FBS2dPLHlCQUF5QnFDLEtBQUs0WixFQUFRN2pCLFFBQ3BDNmpCLENBQ1QsQ0FFUSxXQUFBRixDQUFZTCxFQUEyQkcsR0FDN0MsTUFBTU0sRUFBNEMsRUFBL0JULEVBQWEsR0FBR3RqQixPQUFPakIsTUFDcEMya0IsRUFBYSxJQUFJSSxFQUFVbHFCLEtBQUt1bkIsVUFBVzRDLEVBQVlULEdBQzdELElBQUssTUFBTzNvQixFQUFHcXBCLEtBQU1WLEVBQWEzRixVQUFXLENBQzNDLE1BQU1oQyxFQUFVaGhCLEVBQUlxcEIsRUFBRWhrQixPQUFPakIsTUFBUWdsQixFQUMvQm5JLEVBQVU1aEIsS0FBS3dGLE1BQU03RSxFQUFJLEdBQUtxcEIsRUFBRWhrQixPQUFPQyxPQUM3Q3lqQixFQUFXakksSUFBSXdJLFVBQVVELEVBQUVoa0IsT0FBUTJiLEVBQVNDLEdBQzVDLElBQUssTUFBTWpXLEtBQUtxZSxFQUFFUixPQUNoQjdkLEVBQUV6RixZQUFjdWpCLEVBQ2hCOWQsRUFBRXRGLGNBQWM3QixFQUFJbUgsRUFBRTVGLEtBQUt2QixFQUFJdWxCLEVBQy9CcGUsRUFBRXRGLGNBQWM1QixFQUFJa0gsRUFBRTVGLEtBQUt0QixFQUFJc2xCLEVBQy9CcGUsRUFBRXNiLGdCQUFnQnppQixHQUFLbWQsRUFDdkJoVyxFQUFFc2IsZ0JBQWdCeGlCLEdBQUttZCxFQUN2QmpXLEVBQUV4Rix5QkFBeUIzQixFQUFJbUgsRUFBRXNiLGdCQUFnQnppQixFQUFJdWxCLEVBQ3JEcGUsRUFBRXhGLHlCQUF5QjFCLEVBQUlrSCxFQUFFc2IsZ0JBQWdCeGlCLEVBQUlzbEIsRUFHdkRucUIsS0FBS2tPLDRCQUE0Qm1DLEtBQUsrWixFQUFFaGtCLFFBR3hDLE1BQU1pWixFQUFRcmYsS0FBSzhuQixhQUFhakosUUFBUXVMLElBQ3pCLElBQVgvSyxHQUNGcmYsS0FBSzhuQixhQUFhOUksT0FBT0ssRUFBTyxFLENBR3BDLE9BQU95SyxDQUNULENBRVEsV0FBQUUsQ0FBWU0sR0FDbEJ0cUIsS0FBS3NuQixPQUFPdEksT0FBT3NMLEVBQVcsR0FDOUIsSUFBSyxJQUFJaFcsRUFBSWdXLEVBQVdoVyxFQUFJdFUsS0FBS3NuQixPQUFPN2hCLE9BQVE2TyxJQUFLLENBQ25ELE1BQU1pVyxFQUFnQnZxQixLQUFLc25CLE9BQU9oVCxHQUNsQyxJQUFLLE1BQU12SSxLQUFLd2UsRUFBY1gsT0FDNUI3ZCxFQUFFekYsY0FFSmlrQixFQUFjemlCLFMsQ0FFbEIsQ0FFTyw4QkFBQXBDLENBQStCUixFQUFlSCxFQUFZQyxFQUFZQyxFQUFhdWxCLEdBQ3hGLE9BQU94cUIsS0FBS3lxQixpQkFBaUJ6cUIsS0FBSzZuQixrQkFBbUIzaUIsRUFBT0gsRUFBSUMsRUFBSUMsRUFBS3VsQixFQUMzRSxDQUVPLGtCQUFBN2tCLENBQW1CYixFQUFjQyxFQUFZQyxFQUFZQyxFQUFhdWxCLEdBQzNFLE9BQU94cUIsS0FBS3lxQixpQkFBaUJ6cUIsS0FBSzJuQixVQUFXN2lCLEVBQU1DLEVBQUlDLEVBQUlDLEVBQUt1bEIsRUFDbEUsQ0FLUSxnQkFBQUMsQ0FDTkMsRUFDQUMsRUFDQTVsQixFQUNBQyxFQUNBQyxFQUNBdWxCLEdBQWdDLEdBT2hDLE9BTEExckIsRUFBUzRyQixFQUFTdFYsSUFBSXVWLEVBQUs1bEIsRUFBSUMsRUFBSUMsR0FDOUJuRyxJQUNIQSxFQUFTa0IsS0FBS21wQixhQUFhd0IsRUFBSzVsQixFQUFJQyxFQUFJQyxFQUFLdWxCLEdBQzdDRSxFQUFTOWlCLElBQUkraUIsRUFBSzVsQixFQUFJQyxFQUFJQyxFQUFLbkcsSUFFMUJBLENBQ1QsQ0FFUSxzQkFBQThyQixDQUF1QkMsR0FDN0IsR0FBSUEsR0FBTzdxQixLQUFLd25CLFFBQVFwZSxPQUFPbUMsS0FBSzlGLE9BQ2xDLE1BQU0sSUFBSW9LLE1BQU0sMEJBQTRCZ2IsR0FFOUMsT0FBTzdxQixLQUFLd25CLFFBQVFwZSxPQUFPbUMsS0FBS3NmLEVBQ2xDLENBRVEsbUJBQUFDLENBQW9CQyxFQUFxQkMsRUFBaUJ0Z0IsRUFBa0J3UCxHQUNsRixHQUFJbGEsS0FBS3duQixRQUFRMUgsa0JBSWYsT0FBTyxFQUFBUCxXQUdULElBQUlqSyxFQUNKLE9BQVF5VixHQUNOLEtBQUssU0FDTCxLQUFLLFNBQ0h6VixFQUFTdFYsS0FBSzRxQix1QkFBdUJJLEdBQ3JDLE1BQ0YsS0FBSyxTQUNILE1BQU1DLEVBQU0sRUFBQXpVLGNBQWMwVSxXQUFXRixHQUNyQzFWLEVBQVMsRUFBQTZWLFNBQVNDLFFBQVFILEVBQUksR0FBSUEsRUFBSSxHQUFJQSxFQUFJLElBQzlDLE1BRUYsUUFFSTNWLEVBREU1SyxFQUNPLEVBQUF3QixNQUFNbWYsT0FBT3JyQixLQUFLd25CLFFBQVFwZSxPQUFPcUMsWUFFakN6TCxLQUFLd25CLFFBQVFwZSxPQUFPVyxXQUtuQyxPQUFPdUwsQ0FDVCxDQUVRLG1CQUFBZ1csQ0FBb0J2bUIsRUFBWWdtQixFQUFxQkMsRUFBaUJobUIsRUFBWXVtQixFQUFxQkMsRUFBaUI5Z0IsRUFBa0J3UCxFQUFjdVIsRUFBZUMsR0FDN0ssTUFBTUMsRUFBdUIzckIsS0FBSzRyQix5QkFBeUI3bUIsRUFBSWdtQixFQUFhQyxFQUFTaG1CLEVBQUl1bUIsRUFBYUMsRUFBUzlnQixFQUFTK2dCLEVBQU12UixFQUFLd1IsR0FDbkksR0FBSUMsRUFDRixPQUFPQSxFQUdULElBQUlyVyxFQUNKLE9BQVFpVyxHQUNOLEtBQUssU0FDTCxLQUFLLFNBQ0N2ckIsS0FBS3duQixRQUFRekgsNEJBQThCMEwsR0FBUUQsRUFBVSxJQUMvREEsR0FBVyxHQUVibFcsRUFBU3RWLEtBQUs0cUIsdUJBQXVCWSxHQUNyQyxNQUNGLEtBQUssU0FDSCxNQUFNUCxFQUFNLEVBQUF6VSxjQUFjMFUsV0FBV00sR0FDckNsVyxFQUFTLEVBQUE2VixTQUFTQyxRQUFRSCxFQUFJLEdBQUlBLEVBQUksR0FBSUEsRUFBSSxJQUM5QyxNQUVGLFFBRUkzVixFQURFNUssRUFDTzFLLEtBQUt3bkIsUUFBUXBlLE9BQU9XLFdBRXBCL0osS0FBS3duQixRQUFRcGUsT0FBT3FDLFdBY25DLE9BVEl6TCxLQUFLd25CLFFBQVExSCxvQkFDZnhLLEVBQVMsRUFBQXBKLE1BQU1tZixPQUFPL1YsSUFJcEI0RSxJQUNGNUUsRUFBUyxFQUFBcEosTUFBTTJmLGdCQUFnQnZXLEVBQVEsRUFBQTRLLGNBR2xDNUssQ0FDVCxDQUVRLHNCQUFBd1csQ0FBdUJmLEVBQXFCQyxFQUFpQnRnQixHQUNuRSxPQUFRcWdCLEdBQ04sS0FBSyxTQUNMLEtBQUssU0FDSCxPQUFPL3FCLEtBQUs0cUIsdUJBQXVCSSxHQUFTeGYsS0FDOUMsS0FBSyxTQUNILE9BQU93ZixHQUFXLEVBRXBCLFFBQ0UsT0FBSXRnQixFQUNLMUssS0FBS3duQixRQUFRcGUsT0FBT3FDLFdBQVdELEtBRWpDeEwsS0FBS3duQixRQUFRcGUsT0FBT1csV0FBV3lCLEtBRTVDLENBRVEsc0JBQUF1Z0IsQ0FBdUJSLEVBQXFCQyxFQUFpQjlnQixFQUFrQitnQixHQUNyRixPQUFRRixHQUNOLEtBQUssU0FDTCxLQUFLLFNBSUgsT0FISXZyQixLQUFLd25CLFFBQVF6SCw0QkFBOEIwTCxHQUFRRCxFQUFVLElBQy9EQSxHQUFXLEdBRU54ckIsS0FBSzRxQix1QkFBdUJZLEdBQVNoZ0IsS0FDOUMsS0FBSyxTQUNILE9BQU9nZ0IsR0FBVyxFQUVwQixRQUNFLE9BQUk5Z0IsRUFDSzFLLEtBQUt3bkIsUUFBUXBlLE9BQU9XLFdBQVd5QixLQUVqQ3hMLEtBQUt3bkIsUUFBUXBlLE9BQU9xQyxXQUFXRCxLQUU1QyxDQUVRLHdCQUFBb2dCLENBQXlCN21CLEVBQVlnbUIsRUFBcUJDLEVBQWlCaG1CLEVBQVl1bUIsRUFBcUJDLEVBQWlCOWdCLEVBQWtCK2dCLEVBQWV2UixFQUFjd1IsR0FDbEwsR0FBMEMsSUFBdEMxckIsS0FBS3duQixRQUFReEgsc0JBQThCMEwsRUFDN0MsT0FJRixNQUFNTSxFQUFRaHNCLEtBQUtpc0Isa0JBQWtCL1IsR0FDL0JnUyxFQUFnQkYsRUFBTUcsU0FBU3BuQixFQUFJQyxHQUN6QyxRQUFzQi9FLElBQWxCaXNCLEVBQ0YsT0FBT0EsUUFBaUJqc0IsRUFHMUIsTUFBTW1zQixFQUFTcHNCLEtBQUs4ckIsdUJBQXVCZixFQUFhQyxFQUFTdGdCLEdBQzNEMmhCLEVBQVNyc0IsS0FBSytyQix1QkFBdUJSLEVBQWFDLEVBQVM5Z0IsRUFBUytnQixHQUdwRW5XLEVBQVMsRUFBQTlKLEtBQUs4Z0Isb0JBQW9CRixFQUFRQyxFQUFRcnNCLEtBQUt3bkIsUUFBUXhILHNCQUF3QjlGLEVBQU0sRUFBSSxJQUV2RyxJQUFLNUUsRUFFSCxZQURBMFcsRUFBTU8sU0FBU3huQixFQUFJQyxFQUFJLE1BSXpCLE1BQU1rSCxFQUFRLEVBQUFpZixTQUFTQyxRQUNwQjlWLEdBQVUsR0FBTSxJQUNoQkEsR0FBVSxHQUFNLElBQ2hCQSxHQUFVLEVBQUssS0FJbEIsT0FGQTBXLEVBQU1PLFNBQVN4bkIsRUFBSUMsRUFBSWtILEdBRWhCQSxDQUNULENBRVEsaUJBQUErZixDQUFrQi9SLEdBQ3hCLE9BQUlBLEVBQ0tsYSxLQUFLd25CLFFBQVFwZSxPQUFPd1csa0JBRXRCNWYsS0FBS3duQixRQUFRcGUsT0FBT3VXLGFBQzdCLENBRVEsWUFBQXdKLENBQWFxRCxFQUE4QnpuQixFQUFZQyxFQUFZQyxFQUFhdWxCLEdBQWdDLEdBQ3RILE1BQU10bEIsRUFBK0IsaUJBQWhCc25CLEVBQTJCQyxPQUFPQyxhQUFhRixHQUFlQSxFQVE3RUcsRUFBZXZzQixLQUFLQyxJQUFJTCxLQUFLd25CLFFBQVFuSyxnQkFBa0JqZCxLQUFLNFcsSUFBSTlSLEVBQU1PLE9BQVEsR0FBSytpQixFQUE4QnhvQixLQUFLbW9CLGNBQ3hIbm9CLEtBQUtzb0IsV0FBV25qQixNQUFRd25CLElBQzFCM3NCLEtBQUtzb0IsV0FBV25qQixNQUFRd25CLEdBRzFCLE1BQU1DLEVBQWdCeHNCLEtBQUtDLElBQUlMLEtBQUt3bkIsUUFBUXBKLGlCQUFtQm9LLEVBQThCeG9CLEtBQUttb0IsY0FXbEcsR0FWSW5vQixLQUFLc29CLFdBQVdqaUIsT0FBU3VtQixJQUMzQjVzQixLQUFLc29CLFdBQVdqaUIsT0FBU3VtQixHQUUzQjVzQixLQUFLeW9CLFFBQVFvRSxPQUViN3NCLEtBQUtrb0IsbUJBQW1CbGpCLEdBQUtBLEVBQzdCaEYsS0FBS2tvQixtQkFBbUJuakIsR0FBS0EsRUFDN0IvRSxLQUFLa29CLG1CQUFtQjVLLFNBQVNyWSxJQUFNQSxFQUVuQmpGLEtBQUtrb0IsbUJBQW1CNEUsY0FFMUMsT0FBTzFGLEVBR1QsTUFBTXFFLElBQVN6ckIsS0FBS2tvQixtQkFBbUJoTixTQUNqQ3hRLElBQVkxSyxLQUFLa29CLG1CQUFtQjZFLFlBQ3BDN1MsSUFBUWxhLEtBQUtrb0IsbUJBQW1COEUsUUFDaENDLElBQVdqdEIsS0FBS2tvQixtQkFBbUIvTSxXQUNuQytSLElBQWNsdEIsS0FBS2tvQixtQkFBbUJpRixjQUN0Q0MsSUFBa0JwdEIsS0FBS2tvQixtQkFBbUJtRixrQkFDMUNDLElBQWF0dEIsS0FBS2tvQixtQkFBbUJxRixhQUMzQyxJQUFJL0IsRUFBVXhyQixLQUFLa29CLG1CQUFtQnNGLGFBQ2xDakMsRUFBY3ZyQixLQUFLa29CLG1CQUFtQnVGLGlCQUN0Q3pDLEVBQVVockIsS0FBS2tvQixtQkFBbUJ3RixhQUNsQzNDLEVBQWMvcUIsS0FBS2tvQixtQkFBbUJ5RixpQkFDMUMsR0FBSWpqQixFQUFTLENBQ1gsTUFBTWtqQixFQUFPcEMsRUFDYkEsRUFBVVIsRUFDVkEsRUFBVTRDLEVBQ1YsTUFBTUMsRUFBUXRDLEVBQ2RBLEVBQWNSLEVBQ2RBLEVBQWM4QyxDLENBSWhCLE1BQU1DLEVBQWtCOXRCLEtBQUs4cUIsb0JBQW9CQyxFQUFhQyxFQUFTdGdCLEVBQVN3UCxHQUdoRmxhLEtBQUt5b0IsUUFBUXNGLHlCQUEyQixPQUN4Qy90QixLQUFLeW9CLFFBQVFuTyxVQUFZd1QsRUFBZ0IvYixJQUN6Qy9SLEtBQUt5b0IsUUFBUXJPLFNBQVMsRUFBRyxFQUFHcGEsS0FBS3NvQixXQUFXbmpCLE1BQU9uRixLQUFLc29CLFdBQVdqaUIsUUFDbkVyRyxLQUFLeW9CLFFBQVFzRix5QkFBMkIsY0FHeEMsTUFBTTFTLEVBQWFvUSxFQUFPenJCLEtBQUt3bkIsUUFBUXBNLGVBQWlCcGIsS0FBS3duQixRQUFRbk0sV0FDL0QyUyxFQUFZZixFQUFTLFNBQVcsR0FDdENqdEIsS0FBS3lvQixRQUFRaE8sS0FDWCxHQUFHdVQsS0FBYTNTLEtBQWNyYixLQUFLd25CLFFBQVFsTSxTQUFXdGIsS0FBS3duQixRQUFRakosc0JBQXNCdmUsS0FBS3duQixRQUFRak0sYUFDeEd2YixLQUFLeW9CLFFBQVE5TixhQUFlLEVBQUFDLGNBRTVCLE1BQU1xVCxFQUFrQyxJQUFqQi9vQixFQUFNTyxTQUFnQixJQUFBd2dCLGtCQUFpQi9nQixFQUFNZ3BCLFdBQVcsSUFDekVDLEVBQTRDLElBQWpCanBCLEVBQU1PLFNBQWdCLElBQUEyb0IsNEJBQTJCbHBCLEVBQU1ncEIsV0FBVyxJQUM3RkcsRUFBa0JydUIsS0FBS3NyQixvQkFBb0J2bUIsRUFBSWdtQixFQUFhQyxFQUFTaG1CLEVBQUl1bUIsRUFBYUMsRUFBUzlnQixFQUFTd1AsRUFBS3VSLEdBQU0sSUFBQXZOLDZCQUE0QmhaLEVBQU1ncEIsV0FBVyxLQUN0S2x1QixLQUFLeW9CLFFBQVFuTyxVQUFZK1QsRUFBZ0J0YyxJQUd6QyxNQUFNdWMsRUFBVUgsRUFBMkIsRUFBSTNGLEVBRy9DLElBQUkrRixHQUFjLEdBQ2dCLElBQTlCdnVCLEtBQUt3bkIsUUFBUTNILGVBQ2YwTyxHQUFjLElBQUFDLG1CQUFrQnh1QixLQUFLeW9CLFFBQVN2akIsRUFBT29wQixFQUFTQSxFQUFTdHVCLEtBQUt3bkIsUUFBUW5LLGdCQUFpQnJkLEtBQUt3bkIsUUFBUXBKLGlCQUFrQnBlLEtBQUt3bkIsUUFBUWxNLFNBQVV0YixLQUFLd25CLFFBQVFqSixtQkFNMUssSUFFSWtRLEVBRkFDLEdBQTZCVCxFQVVqQyxHQU5FUSxFQUR5QixpQkFBaEJqQyxFQUNDeHNCLEtBQUt5bkIsZ0JBQWdCa0gsUUFBUW5DLEdBRTdCeHNCLEtBQUt5bkIsZ0JBQWdCbUgsbUJBQW1CcEMsR0FJaERVLEVBQVcsQ0FDYmx0QixLQUFLeW9CLFFBQVFvRSxPQUNiLE1BQU1yUCxFQUFZcGQsS0FBSzRXLElBQUksRUFBRzVXLEtBQUt3RixNQUFNNUYsS0FBS3duQixRQUFRbE0sU0FBV3RiLEtBQUt3bkIsUUFBUWpKLGlCQUFtQixLQUUzRnlELEVBQVV4RSxFQUFZLEdBQU0sRUFBSSxHQUFNLEVBSTVDLEdBSEF4ZCxLQUFLeW9CLFFBQVFqTCxVQUFZQSxFQUdyQnhkLEtBQUtrb0IsbUJBQW1CMkcsMEJBQzFCN3VCLEtBQUt5b0IsUUFBUTdFLFlBQWM1akIsS0FBS3lvQixRQUFRbk8sZUFDbkMsR0FBSXRhLEtBQUtrb0IsbUJBQW1CNEcsc0JBQ2pDSixHQUE0QixFQUM1QjF1QixLQUFLeW9CLFFBQVE3RSxZQUFjLE9BQU8sRUFBQXBOLGNBQWMwVSxXQUFXbHJCLEtBQUtrb0IsbUJBQW1CNkcscUJBQXFCQyxLQUFLLFlBQ3hHLENBQ0xOLEdBQTRCLEVBQzVCLElBQUkxcEIsRUFBS2hGLEtBQUtrb0IsbUJBQW1CNkcsb0JBQzdCL3VCLEtBQUt3bkIsUUFBUXpILDRCQUE4Qi9mLEtBQUtrb0IsbUJBQW1CaE4sVUFBWWxXLEVBQUssSUFDdEZBLEdBQU0sR0FFUmhGLEtBQUt5b0IsUUFBUTdFLFlBQWM1akIsS0FBSzRxQix1QkFBdUI1bEIsR0FBSStNLEcsQ0FJN0QvUixLQUFLeW9CLFFBQVExTixZQUNiLE1BQU1rVSxFQUFRWCxFQUNSWSxFQUFPOXVCLEtBQUtnVyxLQUFLa1ksRUFBVXR1QixLQUFLd25CLFFBQVFsSixrQkFBb0IwRCxHQUFXd0ksRUFBbUMsRUFBWmhOLEVBQWdCLEdBQzlHMlIsRUFBT0QsRUFBTzFSLEVBQ2Q0UixFQUFPRixFQUFtQixFQUFaMVIsRUFDcEIsSUFBSTZSLEVBQWFydkIsS0FBS2tvQixtQkFBbUJvSCw0QkFFekMsSUFBSyxJQUFJdnVCLEVBQUksRUFBR0EsRUFBSTB0QixFQUFTMXRCLElBQUssQ0FDaENmLEtBQUt5b0IsUUFBUW9FLE9BQ2IsTUFBTTBDLEVBQVVOLEVBQVFsdUIsRUFBSWYsS0FBS3duQixRQUFRbkssZ0JBQ25DbVMsRUFBV1AsR0FBU2x1QixFQUFJLEdBQUtmLEtBQUt3bkIsUUFBUW5LLGdCQUMxQ29TLEVBQVNGLEVBQVV2dkIsS0FBS3duQixRQUFRbkssZ0JBQWtCLEVBQ3hELE9BQVFyZCxLQUFLa29CLG1CQUFtQjVLLFNBQVNDLGdCQUN2QyxLQUFLLEVBQ0h2ZCxLQUFLeW9CLFFBQVF4RCxPQUFPc0ssRUFBU0wsR0FDN0JsdkIsS0FBS3lvQixRQUFRekQsT0FBT3dLLEVBQVVOLEdBQzlCbHZCLEtBQUt5b0IsUUFBUXhELE9BQU9zSyxFQUFTSCxHQUM3QnB2QixLQUFLeW9CLFFBQVF6RCxPQUFPd0ssRUFBVUosR0FDOUIsTUFDRixLQUFLLEVBR0gsTUFBTU0sRUFBWWxTLEdBQWEsRUFBSTRSLEVBQU9odkIsS0FBS2dXLEtBQUtrWSxFQUFVdHVCLEtBQUt3bkIsUUFBUWxKLGlCQUFtQmQsRUFBWSxHQUFLd0UsRUFDekcyTixFQUFZblMsR0FBYSxFQUFJMFIsRUFBTzl1QixLQUFLZ1csS0FBS2tZLEVBQVV0dUIsS0FBS3duQixRQUFRbEosaUJBQW1CZCxFQUFZLEdBQUt3RSxFQUl6RzJDLEVBQWEsSUFBSUMsT0FDdkJELEVBQVczSixLQUFLdVUsRUFBU0wsRUFBTWx2QixLQUFLd25CLFFBQVFuSyxnQkFBaUIrUixFQUFPRixHQUNwRWx2QixLQUFLeW9CLFFBQVF4TixLQUFLMEosR0FHbEIza0IsS0FBS3lvQixRQUFReEQsT0FBT3NLLEVBQVV2dkIsS0FBS3duQixRQUFRbkssZ0JBQWtCLEVBQUc4UixHQUNoRW52QixLQUFLeW9CLFFBQVExRCxjQUNYd0ssRUFBVXZ2QixLQUFLd25CLFFBQVFuSyxnQkFBa0IsRUFBR3NTLEVBQzVDSixFQUFTSSxFQUNUSixFQUFTSixHQUVYbnZCLEtBQUt5b0IsUUFBUTFELGNBQ1h3SyxFQUFTRyxFQUNURCxFQUFRQyxFQUNSRCxFQUFRTixHQUVWbnZCLEtBQUt5b0IsUUFBUTFELGNBQ1gwSyxFQUFRRSxFQUNSSCxFQUFVRyxFQUNWSCxFQUFVTCxHQUVabnZCLEtBQUt5b0IsUUFBUTFELGNBQ1h5SyxFQUFVRSxFQUNWRixFQUFXeHZCLEtBQUt3bkIsUUFBUW5LLGdCQUFrQixFQUFHcVMsRUFDN0NGLEVBQVd4dkIsS0FBS3duQixRQUFRbkssZ0JBQWtCLEVBQUc4UixHQUUvQyxNQUNGLEtBQUssRUFDSCxNQUFNUyxFQUE2QixJQUFmUCxFQUFtQixFQUNwQ0EsR0FBYzdSLEVBQXdCLEVBQVpBLEVBQWdCNlIsRUFBYTdSLEVBQVk2UixHQUdsRCxLQURBQSxHQUFjN1IsSUFDVyxJQUFoQm9TLEdBQzNCNXZCLEtBQUt5b0IsUUFBUW9ILFlBQVksQ0FBQ3p2QixLQUFLa1csTUFBTWtILEdBQVlwZCxLQUFLa1csTUFBTWtILEtBQzVEeGQsS0FBS3lvQixRQUFReEQsT0FBT3NLLEVBQVVLLEVBQWFWLEdBQzNDbHZCLEtBQUt5b0IsUUFBUXpELE9BQU93SyxFQUFVTixLQUU5Qmx2QixLQUFLeW9CLFFBQVFvSCxZQUFZLENBQUN6dkIsS0FBS2tXLE1BQU1rSCxHQUFZcGQsS0FBS2tXLE1BQU1rSCxLQUM1RHhkLEtBQUt5b0IsUUFBUXhELE9BQU9zSyxFQUFTTCxHQUM3Qmx2QixLQUFLeW9CLFFBQVF6RCxPQUFPdUssRUFBVUssRUFBYVYsR0FDM0NsdkIsS0FBS3lvQixRQUFReEQsT0FBT3NLLEVBQVVLLEVBQWNwUyxFQUFXMFIsR0FDdkRsdkIsS0FBS3lvQixRQUFRekQsT0FBT3dLLEVBQVVOLElBRWhDRyxHQUFhLElBQUFTLDBCQUF5Qk4sRUFBV0QsRUFBUy9SLEVBQVc2UixHQUNyRSxNQUNGLEtBQUssRUFDSCxNQUFNVSxFQUFZLEdBQ1pDLEVBQVcsR0FFWEMsRUFBV1QsRUFBV0QsRUFDdEJ0YixFQUFPN1QsS0FBS3dGLE1BQU1tcUIsRUFBWUUsR0FDOUJDLEVBQU05dkIsS0FBS3dGLE1BQU1vcUIsRUFBV0MsR0FDNUIxZCxFQUFNMGQsRUFBV2hjLEVBQU9pYyxFQUM5Qmx3QixLQUFLeW9CLFFBQVFvSCxZQUFZLENBQUM1YixFQUFNaWMsRUFBSzNkLElBQ3JDdlMsS0FBS3lvQixRQUFReEQsT0FBT3NLLEVBQVNMLEdBQzdCbHZCLEtBQUt5b0IsUUFBUXpELE9BQU93SyxFQUFVTixHQUM5QixNQUVGLFFBQ0VsdkIsS0FBS3lvQixRQUFReEQsT0FBT3NLLEVBQVNMLEdBQzdCbHZCLEtBQUt5b0IsUUFBUXpELE9BQU93SyxFQUFVTixHQUdsQ2x2QixLQUFLeW9CLFFBQVFsRSxTQUNidmtCLEtBQUt5b0IsUUFBUTBILFMsQ0FPZixHQUxBbndCLEtBQUt5b0IsUUFBUTBILFdBS1I1QixHQUFldnVCLEtBQUt3bkIsUUFBUWxNLFVBQVksS0FHdEN0YixLQUFLd25CLFFBQVExSCxtQkFBK0IsTUFBVjVhLEVBQWUsQ0FHcERsRixLQUFLeW9CLFFBQVFvRSxPQUNiN3NCLEtBQUt5b0IsUUFBUTlOLGFBQWUsYUFDNUIsTUFBTXlWLEVBQVVwd0IsS0FBS3lvQixRQUFRNEgsWUFBWW5yQixHQUV6QyxHQURBbEYsS0FBS3lvQixRQUFRMEgsVUFDVCw2QkFBOEJDLEdBQVdBLEVBQVFFLHlCQUEyQixFQUFHLENBRWpGdHdCLEtBQUt5b0IsUUFBUW9FLE9BSWIsTUFBTWxJLEVBQWEsSUFBSUMsT0FDdkJELEVBQVczSixLQUFLaVUsRUFBT0MsRUFBTzl1QixLQUFLZ1csS0FBS29ILEVBQVksR0FBSXhkLEtBQUt3bkIsUUFBUW5LLGdCQUFrQm9SLEVBQVNXLEVBQU9GLEVBQU85dUIsS0FBS2dXLEtBQUtvSCxFQUFZLElBQ3BJeGQsS0FBS3lvQixRQUFReE4sS0FBSzBKLEdBQ2xCM2tCLEtBQUt5b0IsUUFBUWpMLFVBQTRDLEVBQWhDeGQsS0FBS3duQixRQUFRakosaUJBQ3RDdmUsS0FBS3lvQixRQUFRN0UsWUFBY2tLLEVBQWdCL2IsSUFDM0MvUixLQUFLeW9CLFFBQVE4SCxXQUFXcnJCLEVBQU9vcEIsRUFBU0EsRUFBVXR1QixLQUFLd25CLFFBQVFsSixrQkFDL0R0ZSxLQUFLeW9CLFFBQVEwSCxTLEdBT3JCLEdBQUk3QyxFQUFVLENBQ1osTUFBTTlQLEVBQVlwZCxLQUFLNFcsSUFBSSxFQUFHNVcsS0FBS3dGLE1BQU01RixLQUFLd25CLFFBQVFsTSxTQUFXdGIsS0FBS3duQixRQUFRakosaUJBQW1CLEtBQzNGeUQsRUFBVXhFLEVBQVksR0FBTSxFQUFJLEdBQU0sRUFDNUN4ZCxLQUFLeW9CLFFBQVFqTCxVQUFZQSxFQUN6QnhkLEtBQUt5b0IsUUFBUTdFLFlBQWM1akIsS0FBS3lvQixRQUFRbk8sVUFDeEN0YSxLQUFLeW9CLFFBQVExTixZQUNiL2EsS0FBS3lvQixRQUFReEQsT0FBT3FKLEVBQVNBLEVBQVV0TSxHQUN2Q2hpQixLQUFLeW9CLFFBQVF6RCxPQUFPc0osRUFBVXR1QixLQUFLd25CLFFBQVFuSixnQkFBa0JvUSxFQUFTSCxFQUFVdE0sR0FDaEZoaUIsS0FBS3lvQixRQUFRbEUsUSxDQVVmLEdBTktnSyxHQUNIdnVCLEtBQUt5b0IsUUFBUTNOLFNBQVM1VixFQUFPb3BCLEVBQVNBLEVBQVV0dUIsS0FBS3duQixRQUFRbEosa0JBS2pELE1BQVZwWixJQUFrQmxGLEtBQUt3bkIsUUFBUTFILGtCQUFtQixDQUNwRCxJQUFJMFEsRUFBcUJDLEVBQVd6d0IsS0FBS3lvQixRQUFRaUksYUFBYXBDLEVBQVNBLEVBQVN0dUIsS0FBS3duQixRQUFRbkssZ0JBQWlCcmQsS0FBS3duQixRQUFRcEosa0JBQW1CMFAsRUFBaUJPLEVBQWlCSyxHQUNoTCxHQUFJOEIsRUFDRixJQUFLLElBQUl4cUIsRUFBUyxFQUFHQSxHQUFVLElBQzdCaEcsS0FBS3lvQixRQUFRb0UsT0FDYjdzQixLQUFLeW9CLFFBQVFuTyxVQUFZd1QsRUFBZ0IvYixJQUN6Qy9SLEtBQUt5b0IsUUFBUXJPLFNBQVMsRUFBRyxFQUFHcGEsS0FBS3NvQixXQUFXbmpCLE1BQU9uRixLQUFLc29CLFdBQVdqaUIsUUFDbkVyRyxLQUFLeW9CLFFBQVEwSCxVQUNibndCLEtBQUt5b0IsUUFBUTNOLFNBQVM1VixFQUFPb3BCLEVBQVNBLEVBQVV0dUIsS0FBS3duQixRQUFRbEosaUJBQW1CdFksR0FDaEZ3cUIsRUFBcUJDLEVBQVd6d0IsS0FBS3lvQixRQUFRaUksYUFBYXBDLEVBQVNBLEVBQVN0dUIsS0FBS3duQixRQUFRbkssZ0JBQWlCcmQsS0FBS3duQixRQUFRcEosa0JBQW1CMFAsRUFBaUJPLEVBQWlCSyxHQUN2SzhCLEdBUDJCeHFCLEssQ0FldEMsR0FBSW9uQixFQUFlLENBQ2pCLE1BQU01UCxFQUFZcGQsS0FBSzRXLElBQUksRUFBRzVXLEtBQUt3RixNQUFNNUYsS0FBS3duQixRQUFRbE0sU0FBV3RiLEtBQUt3bkIsUUFBUWpKLGlCQUFtQixLQUMzRnlELEVBQVVoaUIsS0FBS3lvQixRQUFRakwsVUFBWSxHQUFNLEVBQUksR0FBTSxFQUN6RHhkLEtBQUt5b0IsUUFBUWpMLFVBQVlBLEVBQ3pCeGQsS0FBS3lvQixRQUFRN0UsWUFBYzVqQixLQUFLeW9CLFFBQVFuTyxVQUN4Q3RhLEtBQUt5b0IsUUFBUTFOLFlBQ2IvYSxLQUFLeW9CLFFBQVF4RCxPQUFPcUosRUFBU0EsRUFBVWx1QixLQUFLd0YsTUFBTTVGLEtBQUt3bkIsUUFBUWxKLGlCQUFtQixHQUFLMEQsR0FDdkZoaUIsS0FBS3lvQixRQUFRekQsT0FBT3NKLEVBQVV0dUIsS0FBS3duQixRQUFRbkosZ0JBQWtCb1EsRUFBU0gsRUFBVWx1QixLQUFLd0YsTUFBTTVGLEtBQUt3bkIsUUFBUWxKLGlCQUFtQixHQUFLMEQsR0FDaEloaUIsS0FBS3lvQixRQUFRbEUsUSxDQUdmdmtCLEtBQUt5b0IsUUFBUTBILFVBSWIsTUFBTXBOLEVBQVkvaUIsS0FBS3lvQixRQUFRaUksYUFDN0IsRUFBRyxFQUFHMXdCLEtBQUtzb0IsV0FBV25qQixNQUFPbkYsS0FBS3NvQixXQUFXamlCLFFBSS9DLElBQUlzcUIsRUFRSixHQUpFQSxFQUhHM3dCLEtBQUt3bkIsUUFBUTFILGtCQTBXdEIsU0FBb0NpRCxHQUNsQyxJQUFLLElBQUkvYyxFQUFTLEVBQUdBLEVBQVMrYyxFQUFVUSxLQUFLOWQsT0FBUU8sR0FBVSxFQUM3RCxHQUFJK2MsRUFBVVEsS0FBS3ZkLEVBQVMsR0FBSyxFQUMvQixPQUFPLEVBR1gsT0FBTyxDQUNULENBOVdnQjRxQixDQUEyQjdOLEdBRjNCME4sRUFBVzFOLEVBQVcrSyxFQUFpQk8sRUFBaUJLLEdBTWhFaUMsRUFDRixPQUFPdkosRUFHVCxNQUFNOEIsRUFBa0JscEIsS0FBSzZ3QixzQkFBc0I5TixFQUFXL2lCLEtBQUsrbkIsaUJBQWtCNEUsRUFBY3dCLEVBQTBCSSxFQUFhRCxHQUcxSSxJQUFJd0MsRUFDQUMsRUFDSixPQUFhLENBRVgsR0FBaUMsSUFBN0Ivd0IsS0FBSzhuQixhQUFhcmlCLE9BQWMsQ0FDbEMsTUFBTXdrQixFQUFVanFCLEtBQUtxb0IsaUJBQ3JCeUksRUFBYTdHLEVBQ2I4RyxFQUFZOUcsRUFBUWIsV0FDcEIySCxFQUFVMXFCLE9BQVM2aUIsRUFBZ0IvaUIsS0FBS3RCLEVBQ3hDLEssQ0FJRmlzQixFQUFhOXdCLEtBQUs4bkIsYUFBYTluQixLQUFLOG5CLGFBQWFyaUIsT0FBUyxHQUMxRHNyQixFQUFZRCxFQUFXMUgsV0FDdkIsSUFBSyxNQUFNZ0IsS0FBS3BxQixLQUFLOG5CLGFBQ2ZvQixFQUFnQi9pQixLQUFLdEIsR0FBS3VsQixFQUFFaEIsV0FBVy9pQixTQUN6Q3lxQixFQUFhMUcsRUFDYjJHLEVBQVkzRyxFQUFFaEIsWUFVbEIsSUFBSyxJQUFJcm9CLEVBQUlmLEtBQUs4bkIsYUFBYXJpQixPQUFTLEVBQUcxRSxHQUFLLEVBQUdBLElBQ2pELElBQUssTUFBTWlULEtBQU9oVSxLQUFLOG5CLGFBQWEvbUIsR0FBR2l3QixVQUNqQ2hkLEVBQUkzTixRQUFVMHFCLEVBQVUxcUIsUUFBVTZpQixFQUFnQi9pQixLQUFLdEIsR0FBS21QLEVBQUkzTixTQUNsRXlxQixFQUFhOXdCLEtBQUs4bkIsYUFBYS9tQixHQUMvQmd3QixFQUFZL2MsR0FRbEIsR0FBSStjLEVBQVVsc0IsRUFBSXFrQixFQUFnQi9pQixLQUFLdEIsR0FBS2lzQixFQUFXMXFCLE9BQU9DLFFBQVUwcUIsRUFBVTFxQixPQUFTNmlCLEVBQWdCL2lCLEtBQUt0QixFQUFJLEVBQStCLENBR2pKLElBQUlvc0IsR0FBcUIsRUFDekIsR0FBSUgsRUFBVzFILFdBQVd2a0IsRUFBSWlzQixFQUFXMUgsV0FBVy9pQixPQUFTNmlCLEVBQWdCL2lCLEtBQUt0QixHQUFLaXNCLEVBQVcxcUIsT0FBT0MsT0FBUSxDQUUvRyxJQUFJNnFCLEVBQ0osSUFBSyxNQUFNOUcsS0FBS3BxQixLQUFLOG5CLGFBQ25CLEdBQUlzQyxFQUFFaEIsV0FBV3ZrQixFQUFJdWxCLEVBQUVoQixXQUFXL2lCLE9BQVM2aUIsRUFBZ0IvaUIsS0FBS3RCLEVBQUl1bEIsRUFBRWhrQixPQUFPQyxPQUFRLENBQ25GNnFCLEVBQWdCOUcsRUFDaEIsSyxDQUdKLEdBQUk4RyxFQUNGSixFQUFhSSxPQU1iLEdBQ0VoeEIsRUFBYUMsZUFDYkgsS0FBS3NuQixPQUFPN2hCLFFBQVV2RixFQUFhQyxlQUNuQzR3QixFQUFVbHNCLEVBQUlxa0IsRUFBZ0IvaUIsS0FBS3RCLEdBQUtpc0IsRUFBVzFxQixPQUFPQyxRQUMxRDBxQixFQUFVMXFCLFFBQVU2aUIsRUFBZ0IvaUIsS0FBS3RCLEdBQ3pDa3NCLEVBQVVuc0IsRUFBSXNrQixFQUFnQi9pQixLQUFLdkIsR0FBS2tzQixFQUFXMXFCLE9BQU9qQixNQUcxRDhyQixHQUFxQixNQUNoQixDQUVMLE1BQU1oSCxFQUFVanFCLEtBQUtxb0IsaUJBQ3JCeUksRUFBYTdHLEVBQ2I4RyxFQUFZOUcsRUFBUWIsV0FDcEIySCxFQUFVMXFCLE9BQVM2aUIsRUFBZ0IvaUIsS0FBS3RCLEVBQ3hDb3NCLEdBQXFCLEMsRUFJdEJBLElBRUNILEVBQVcxSCxXQUFXL2lCLE9BQVMsR0FDakN5cUIsRUFBV0UsVUFBVS9SLEtBQUs2UixFQUFXMUgsWUFFdkMySCxFQUFZLENBQ1Zuc0IsRUFBRyxFQUNIQyxFQUFHaXNCLEVBQVcxSCxXQUFXdmtCLEVBQUlpc0IsRUFBVzFILFdBQVcvaUIsT0FDbkRBLE9BQVE2aUIsRUFBZ0IvaUIsS0FBS3RCLEdBRS9CaXNCLEVBQVdFLFVBQVUvUixLQUFLOFIsR0FHMUJELEVBQVcxSCxXQUFhLENBQ3RCeGtCLEVBQUcsRUFDSEMsRUFBR2tzQixFQUFVbHNCLEVBQUlrc0IsRUFBVTFxQixPQUMzQkEsT0FBUSxHLENBT2QsR0FBSTBxQixFQUFVbnNCLEVBQUlza0IsRUFBZ0IvaUIsS0FBS3ZCLEdBQUtrc0IsRUFBVzFxQixPQUFPakIsTUFDNUQsTUFJRTRyQixJQUFjRCxFQUFXMUgsWUFDM0IySCxFQUFVbnNCLEVBQUksRUFDZG1zQixFQUFVbHNCLEdBQUtrc0IsRUFBVTFxQixPQUN6QjBxQixFQUFVMXFCLE9BQVMsR0FFbkJ5cUIsRUFBV0UsVUFBVWhTLE9BQU84UixFQUFXRSxVQUFVblMsUUFBUWtTLEdBQVksRSxDQWlDekUsT0E1QkE3SCxFQUFnQjVpQixZQUFjdEcsS0FBS3NuQixPQUFPekksUUFBUWlTLEdBQ2xENUgsRUFBZ0I3QixnQkFBZ0J6aUIsRUFBSW1zQixFQUFVbnNCLEVBQzlDc2tCLEVBQWdCN0IsZ0JBQWdCeGlCLEVBQUlrc0IsRUFBVWxzQixFQUM5Q3FrQixFQUFnQjNpQix5QkFBeUIzQixFQUFJbXNCLEVBQVVuc0IsRUFBSWtzQixFQUFXMXFCLE9BQU9qQixNQUM3RStqQixFQUFnQjNpQix5QkFBeUIxQixFQUFJa3NCLEVBQVVsc0IsRUFBSWlzQixFQUFXMXFCLE9BQU9DLE9BRzdFNmlCLEVBQWdCemlCLGNBQWM3QixHQUFLa3NCLEVBQVcxcUIsT0FBT2pCLE1BQ3JEK2pCLEVBQWdCemlCLGNBQWM1QixHQUFLaXNCLEVBQVcxcUIsT0FBT0MsT0FJckQwcUIsRUFBVTFxQixPQUFTakcsS0FBSzRXLElBQUkrWixFQUFVMXFCLE9BQVE2aUIsRUFBZ0IvaUIsS0FBS3RCLEdBQ25Fa3NCLEVBQVVuc0IsR0FBS3NrQixFQUFnQi9pQixLQUFLdkIsRUFHcENrc0IsRUFBV2pQLElBQUkyQixhQUNiVCxFQUNBbUcsRUFBZ0I3QixnQkFBZ0J6aUIsRUFBSTVFLEtBQUsrbkIsaUJBQWlCOWhCLEtBQzFEaWpCLEVBQWdCN0IsZ0JBQWdCeGlCLEVBQUk3RSxLQUFLK25CLGlCQUFpQjdoQixJQUMxRGxHLEtBQUsrbkIsaUJBQWlCOWhCLEtBQ3RCakcsS0FBSytuQixpQkFBaUI3aEIsSUFDdEJnakIsRUFBZ0IvaUIsS0FBS3ZCLEVBQ3JCc2tCLEVBQWdCL2lCLEtBQUt0QixHQUV2QmlzQixFQUFXSyxTQUFTakksR0FDcEI0SCxFQUFXaHBCLFVBRUpvaEIsQ0FDVCxDQVNRLHFCQUFBMkgsQ0FBc0I5TixFQUFzQnFPLEVBQTJCekUsRUFBc0IwRSxFQUEwQjlDLEVBQXNCRCxHQUNuSjhDLEVBQVlsckIsSUFBTSxFQUNsQixNQUFNRyxFQUFTZ3JCLEVBQWtCcnhCLEtBQUt3bkIsUUFBUXBKLGlCQUFtQnBlLEtBQUtzb0IsV0FBV2ppQixPQUMzRWxCLEVBQVFrc0IsRUFBa0JyeEIsS0FBS3duQixRQUFRbkssZ0JBQWtCc1AsRUFDL0QsSUFBSTJFLEdBQVEsRUFDWixJQUFLLElBQUl6c0IsRUFBSSxFQUFHQSxFQUFJd0IsRUFBUXhCLElBQUssQ0FDL0IsSUFBSyxJQUFJRCxFQUFJLEVBQUdBLEVBQUlPLEVBQU9QLElBQUssQ0FDOUIsTUFBTTJzQixFQUFjMXNCLEVBQUk3RSxLQUFLc29CLFdBQVduakIsTUFBUSxFQUFRLEVBQUpQLEVBQVEsRUFDNUQsR0FBb0MsSUFBaENtZSxFQUFVUSxLQUFLZ08sR0FBb0IsQ0FDckNILEVBQVlsckIsSUFBTXJCLEVBQ2xCeXNCLEdBQVEsRUFDUixLLEVBR0osR0FBSUEsRUFDRixLLENBR0pGLEVBQVluckIsS0FBTyxFQUNuQnFyQixHQUFRLEVBQ1IsSUFBSyxJQUFJMXNCLEVBQUksRUFBR0EsRUFBSTBwQixFQUFVbnBCLEVBQU9QLElBQUssQ0FDeEMsSUFBSyxJQUFJQyxFQUFJLEVBQUdBLEVBQUl3QixFQUFReEIsSUFBSyxDQUMvQixNQUFNMHNCLEVBQWMxc0IsRUFBSTdFLEtBQUtzb0IsV0FBV25qQixNQUFRLEVBQVEsRUFBSlAsRUFBUSxFQUM1RCxHQUFvQyxJQUFoQ21lLEVBQVVRLEtBQUtnTyxHQUFvQixDQUNyQ0gsRUFBWW5yQixLQUFPckIsRUFDbkIwc0IsR0FBUSxFQUNSLEssRUFHSixHQUFJQSxFQUNGLEssQ0FHSkYsRUFBWW5KLE1BQVE5aUIsRUFDcEJtc0IsR0FBUSxFQUNSLElBQUssSUFBSTFzQixFQUFJMHBCLEVBQVVucEIsRUFBUSxFQUFHUCxHQUFLMHBCLEVBQVMxcEIsSUFBSyxDQUNuRCxJQUFLLElBQUlDLEVBQUksRUFBR0EsRUFBSXdCLEVBQVF4QixJQUFLLENBQy9CLE1BQU0wc0IsRUFBYzFzQixFQUFJN0UsS0FBS3NvQixXQUFXbmpCLE1BQVEsRUFBUSxFQUFKUCxFQUFRLEVBQzVELEdBQW9DLElBQWhDbWUsRUFBVVEsS0FBS2dPLEdBQW9CLENBQ3JDSCxFQUFZbkosTUFBUXJqQixFQUNwQjBzQixHQUFRLEVBQ1IsSyxFQUdKLEdBQUlBLEVBQ0YsSyxDQUdKRixFQUFZcEosT0FBUzNoQixFQUNyQmlyQixHQUFRLEVBQ1IsSUFBSyxJQUFJenNCLEVBQUl3QixFQUFTLEVBQUd4QixHQUFLLEVBQUdBLElBQUssQ0FDcEMsSUFBSyxJQUFJRCxFQUFJLEVBQUdBLEVBQUlPLEVBQU9QLElBQUssQ0FDOUIsTUFBTTJzQixFQUFjMXNCLEVBQUk3RSxLQUFLc29CLFdBQVduakIsTUFBUSxFQUFRLEVBQUpQLEVBQVEsRUFDNUQsR0FBb0MsSUFBaENtZSxFQUFVUSxLQUFLZ08sR0FBb0IsQ0FDckNILEVBQVlwSixPQUFTbmpCLEVBQ3JCeXNCLEdBQVEsRUFDUixLLEVBR0osR0FBSUEsRUFDRixLLENBR0osTUFBTyxDQUNMaHJCLFlBQWEsRUFDYitnQixnQkFBaUIsQ0FBRXppQixFQUFHLEVBQUdDLEVBQUcsR0FDNUIwQix5QkFBMEIsQ0FBRTNCLEVBQUcsRUFBR0MsRUFBRyxHQUNyQ3NCLEtBQU0sQ0FDSnZCLEVBQUd3c0IsRUFBWW5KLE1BQVFtSixFQUFZbnJCLEtBQU8sRUFDMUNwQixFQUFHdXNCLEVBQVlwSixPQUFTb0osRUFBWWxyQixJQUFNLEdBRTVDTyxjQUFlLENBQ2I3QixFQUFJd3NCLEVBQVluSixNQUFRbUosRUFBWW5yQixLQUFPLEVBQzNDcEIsRUFBSXVzQixFQUFZcEosT0FBU29KLEVBQVlsckIsSUFBTSxHQUU3Q0YsT0FBUSxDQUNOcEIsR0FBSXdzQixFQUFZbnJCLEtBQU9xb0IsR0FBWStDLEdBQW1COUMsRUFBZW51QixLQUFLd0YsT0FBTzVGLEtBQUt3bkIsUUFBUW5LLGdCQUFrQnJkLEtBQUt3bkIsUUFBUW5KLGlCQUFtQixHQUFLLEdBQ3JKeFosR0FBSXVzQixFQUFZbHJCLElBQU1vb0IsR0FBWStDLEdBQW1COUMsRUFBMkMsSUFBNUJ2dUIsS0FBS3duQixRQUFRblIsV0FBbUIsRUFBSWpXLEtBQUtrVyxPQUFPdFcsS0FBS3duQixRQUFRcEosaUJBQW1CcGUsS0FBS3duQixRQUFRbEosa0JBQW9CLEdBQUssSUFHaE0sRUFwNUJGLGlCQXU1QkEsTUFBTTRMLEVBS0osa0JBQVdWLEdBQTJCLE9BQU94cEIsS0FBS3d4QixhQUFleHhCLEtBQUtvRyxPQUFPakIsTUFBUW5GLEtBQUtvRyxPQUFPQyxPQUFTLENBRzFHLFVBQVd1akIsR0FBNEMsT0FBTzVwQixLQUFLeXhCLE9BQVMsQ0FDckUsUUFBQU4sQ0FBU08sR0FDZDF4QixLQUFLeXhCLFFBQVF4UyxLQUFLeVMsR0FDbEIxeEIsS0FBS3d4QixhQUFlRSxFQUFNdnJCLEtBQUt2QixFQUFJOHNCLEVBQU12ckIsS0FBS3RCLENBQ2hELENBd0JBLFdBQUF6RixDQUNFK1IsRUFDQWhMLEVBQ0F3ckIsR0FFQSxHQXJDTSxLQUFBSCxZQUFzQixFQUdiLEtBQUFDLFFBQThCLEdBVXhDLEtBQUEzcEIsUUFBVSxFQVlWLEtBQUFzaEIsV0FBa0MsQ0FDdkN4a0IsRUFBRyxFQUNIQyxFQUFHLEVBQ0h3QixPQUFRLEdBRU0sS0FBQTJxQixVQUFtQyxHQU83Q1csRUFDRixJQUFLLE1BQU12SCxLQUFLdUgsRUFDZDN4QixLQUFLeXhCLFFBQVF4UyxRQUFRbUwsRUFBRVIsUUFDdkI1cEIsS0FBS3d4QixhQUFlcEgsRUFBRW9ILFlBRzFCeHhCLEtBQUtvRyxPQUFTbWlCLEVBQWFwWCxFQUFVaEwsRUFBTUEsR0FJM0NuRyxLQUFLNmhCLEtBQU0sSUFBQXZoQixjQUFhTixLQUFLb0csT0FBT3dKLFdBQVcsS0FBTSxDQUFFNkosT0FBTyxJQUNoRSxDQUVPLEtBQUEzUyxHQUNMOUcsS0FBSzZoQixJQUFJeEgsVUFBVSxFQUFHLEVBQUdyYSxLQUFLb0csT0FBT2pCLE1BQU9uRixLQUFLb0csT0FBT0MsUUFDeERyRyxLQUFLb3BCLFdBQVd4a0IsRUFBSSxFQUNwQjVFLEtBQUtvcEIsV0FBV3ZrQixFQUFJLEVBQ3BCN0UsS0FBS29wQixXQUFXL2lCLE9BQVMsRUFDekJyRyxLQUFLZ3hCLFVBQVV2ckIsT0FBUyxFQUN4QnpGLEtBQUs4SCxTQUNQLEVBUUYsU0FBUzJvQixFQUFXMU4sRUFBc0JoZSxFQUFZQyxFQUFZNHNCLEdBRWhFLE1BQU05bEIsRUFBSS9HLEVBQUd5RyxPQUFTLEdBQ2hCTyxFQUFJaEgsRUFBR3lHLE9BQVMsR0FBSyxJQUNyQlEsRUFBSWpILEVBQUd5RyxPQUFTLEVBQUksSUFDcEJxbUIsRUFBTTdzQixFQUFHd0csT0FBUyxHQUNsQnNtQixFQUFNOXNCLEVBQUd3RyxPQUFTLEdBQUssSUFDdkJ1bUIsRUFBTS9zQixFQUFHd0csT0FBUyxFQUFJLElBUXRCd21CLEVBQVk1eEIsS0FBS3dGLE9BQU94RixLQUFLNnhCLElBQUlubUIsRUFBSStsQixHQUFPenhCLEtBQUs2eEIsSUFBSWxtQixFQUFJK2xCLEdBQU8xeEIsS0FBSzZ4QixJQUFJam1CLEVBQUkrbEIsSUFBUSxJQUczRixJQUFJcEIsR0FBVSxFQUNkLElBQUssSUFBSTNxQixFQUFTLEVBQUdBLEVBQVMrYyxFQUFVUSxLQUFLOWQsT0FBUU8sR0FBVSxFQUV6RCtjLEVBQVVRLEtBQUt2ZCxLQUFZOEYsR0FDM0JpWCxFQUFVUSxLQUFLdmQsRUFBUyxLQUFPK0YsR0FDL0JnWCxFQUFVUSxLQUFLdmQsRUFBUyxLQUFPZ0csR0FJN0I0bEIsR0FDQ3h4QixLQUFLNnhCLElBQUlsUCxFQUFVUSxLQUFLdmQsR0FBVThGLEdBQ25DMUwsS0FBSzZ4QixJQUFJbFAsRUFBVVEsS0FBS3ZkLEVBQVMsR0FBSytGLEdBQ3RDM0wsS0FBSzZ4QixJQUFJbFAsRUFBVVEsS0FBS3ZkLEVBQVMsR0FBS2dHLEdBQU1nbUIsRUFOaERqUCxFQUFVUSxLQUFLdmQsRUFBUyxHQUFLLEVBUzNCMnFCLEdBQVUsRUFLaEIsT0FBT0EsQ0FDVCxDQVdBLFNBQVNwSSxFQUFhcFgsRUFBb0JoTSxFQUFla0IsR0FDdkQsTUFBTUQsRUFBUytLLEVBQVMzQixjQUFjLFVBR3RDLE9BRkFwSixFQUFPakIsTUFBUUEsRUFDZmlCLEVBQU9DLE9BQVNBLEVBQ1RELENBQ1QsQyx1SkNwa0NBLElBQUl3QyxFQUFLLEVBQ0xDLEVBQUssRUFDTEMsRUFBSyxFQUNMQyxFQUFLLEVBVVQsSUFBaUJvaUIsRUEwQkFqZixFQXVFQTZGLEVBdUdBbWdCLEVBb0NBMW1CLEVBdUdqQixTQUFnQjJtQixFQUFZclEsR0FDMUIsTUFBTXNRLEVBQUl0USxFQUFFekksU0FBUyxJQUNyQixPQUFPK1ksRUFBRTNzQixPQUFTLEVBQUksSUFBTTJzQixFQUFJQSxDQUNsQyxDQVFBLFNBQWdCQyxFQUFjQyxFQUFZQyxHQUN4QyxPQUFJRCxFQUFLQyxHQUNDQSxFQUFLLE1BQVNELEVBQUssTUFFckJBLEVBQUssTUFBU0MsRUFBSyxJQUM3QixDQTNXYSxFQUFBaFQsV0FBcUIsQ0FDaEN4TixJQUFLLFlBQ0x2RyxLQUFNLEdBTVIsU0FBaUIyZixHQUNDLEVBQUFxSCxNQUFoQixTQUFzQjFtQixFQUFXQyxFQUFXQyxFQUFXQyxHQUNyRCxZQUFVaE0sSUFBTmdNLEVBQ0ssSUFBSWttQixFQUFZcm1CLEtBQUtxbUIsRUFBWXBtQixLQUFLb21CLEVBQVlubUIsS0FBS21tQixFQUFZbG1CLEtBRXJFLElBQUlrbUIsRUFBWXJtQixLQUFLcW1CLEVBQVlwbUIsS0FBS29tQixFQUFZbm1CLElBQzNELEVBRWdCLEVBQUF5bUIsT0FBaEIsU0FBdUIzbUIsRUFBV0MsRUFBV0MsRUFBV0MsRUFBWSxLQUlsRSxPQUFRSCxHQUFLLEdBQUtDLEdBQUssR0FBS0MsR0FBSyxFQUFJQyxLQUFPLENBQzlDLEVBRWdCLEVBQUFtZixRQUFoQixTQUF3QnRmLEVBQVdDLEVBQVdDLEVBQVdDLEdBQ3ZELE1BQU8sQ0FDTDhGLElBQUtvWixFQUFTcUgsTUFBTTFtQixFQUFHQyxFQUFHQyxFQUFHQyxHQUM3QlQsS0FBTTJmLEVBQVNzSCxPQUFPM21CLEVBQUdDLEVBQUdDLEVBQUdDLEdBRW5DLENBQ0QsQ0FyQkQsQ0FBaUJrZixJQUFRLFdBQVJBLEVBQVEsS0EwQnpCLFNBQWlCLEdBZ0RmLFNBQWdCdUgsRUFBUXhtQixFQUFld21CLEdBR3JDLE9BRkEzcEIsRUFBSzNJLEtBQUtrVyxNQUFnQixJQUFWb2MsSUFDZjlwQixFQUFJQyxFQUFJQyxHQUFNMEMsRUFBS21uQixXQUFXem1CLEVBQU1WLE1BQzlCLENBQ0x1RyxJQUFLb1osRUFBU3FILE1BQU01cEIsRUFBSUMsRUFBSUMsRUFBSUMsR0FDaEN5QyxLQUFNMmYsRUFBU3NILE9BQU83cEIsRUFBSUMsRUFBSUMsRUFBSUMsR0FFdEMsQ0F0RGdCLEVBQUErVSxNQUFoQixTQUFzQi9ZLEVBQVlDLEdBRWhDLEdBREErRCxHQUFnQixJQUFWL0QsRUFBR3dHLE1BQWUsSUFDYixJQUFQekMsRUFDRixNQUFPLENBQ0xnSixJQUFLL00sRUFBRytNLElBQ1J2RyxLQUFNeEcsRUFBR3dHLE1BR2IsTUFBTXFtQixFQUFPN3NCLEVBQUd3RyxNQUFRLEdBQU0sSUFDeEJzbUIsRUFBTzlzQixFQUFHd0csTUFBUSxHQUFNLElBQ3hCdW1CLEVBQU8vc0IsRUFBR3dHLE1BQVEsRUFBSyxJQUN2Qm9uQixFQUFPN3RCLEVBQUd5RyxNQUFRLEdBQU0sSUFDeEJxbkIsRUFBTzl0QixFQUFHeUcsTUFBUSxHQUFNLElBQ3hCc25CLEVBQU8vdEIsRUFBR3lHLE1BQVEsRUFBSyxJQU03QixPQUxBNUMsRUFBS2dxQixFQUFNeHlCLEtBQUtrVyxPQUFPdWIsRUFBTWUsR0FBTzdwQixHQUNwQ0YsRUFBS2dxQixFQUFNenlCLEtBQUtrVyxPQUFPd2IsRUFBTWUsR0FBTzlwQixHQUNwQ0QsRUFBS2dxQixFQUFNMXlCLEtBQUtrVyxPQUFPeWIsRUFBTWUsR0FBTy9wQixHQUc3QixDQUFFZ0osSUFGR29aLEVBQVNxSCxNQUFNNXBCLEVBQUlDLEVBQUlDLEdBRXJCMEMsS0FERDJmLEVBQVNzSCxPQUFPN3BCLEVBQUlDLEVBQUlDLEdBRXZDLEVBRWdCLEVBQUFpcUIsU0FBaEIsU0FBeUI3bUIsR0FDdkIsT0FBK0IsTUFBVixJQUFiQSxFQUFNVixLQUNoQixFQUVnQixFQUFBOGdCLG9CQUFoQixTQUFvQ3ZuQixFQUFZQyxFQUFZZ3VCLEdBQzFELE1BQU0xZCxFQUFTOUosRUFBSzhnQixvQkFBb0J2bkIsRUFBR3lHLEtBQU14RyxFQUFHd0csS0FBTXduQixHQUMxRCxHQUFLMWQsRUFHTCxPQUFPNlYsRUFBU0MsUUFDYjlWLEdBQVUsR0FBSyxJQUNmQSxHQUFVLEdBQUssSUFDZkEsR0FBVSxFQUFLLElBRXBCLEVBRWdCLEVBQUErVixPQUFoQixTQUF1Qm5mLEdBQ3JCLE1BQU0rbUIsR0FBMEIsSUFBYi9tQixFQUFNVixRQUFpQixFQUUxQyxPQURDNUMsRUFBSUMsRUFBSUMsR0FBTTBDLEVBQUttbkIsV0FBV00sR0FDeEIsQ0FDTGxoQixJQUFLb1osRUFBU3FILE1BQU01cEIsRUFBSUMsRUFBSUMsR0FDNUIwQyxLQUFNeW5CLEVBRVYsRUFFZ0IsRUFBQVAsUUFBTyxFQVNQLEVBQUE3RyxnQkFBaEIsU0FBZ0MzZixFQUFlZ25CLEdBRTdDLE9BREFucUIsRUFBa0IsSUFBYm1ELEVBQU1WLEtBQ0prbkIsRUFBUXhtQixFQUFRbkQsRUFBS21xQixFQUFVLElBQ3hDLEVBRWdCLEVBQUFoSSxXQUFoQixTQUEyQmhmLEdBQ3pCLE1BQU8sQ0FBRUEsRUFBTVYsTUFBUSxHQUFNLElBQU9VLEVBQU1WLE1BQVEsR0FBTSxJQUFPVSxFQUFNVixNQUFRLEVBQUssSUFDcEYsQ0FDRCxDQWpFRCxDQUFpQlUsSUFBSyxRQUFMQSxFQUFLLEtBdUV0QixTQUFpQixHQUVmLElBQUlpbkIsRUFDQUMsRUFDSixJQUVFLE1BQU1odEIsRUFBUytLLFNBQVMzQixjQUFjLFVBQ3RDcEosRUFBT2pCLE1BQVEsRUFDZmlCLEVBQU9DLE9BQVMsRUFDaEIsTUFBTXdiLEVBQU16YixFQUFPd0osV0FBVyxLQUFNLENBQ2xDOFksb0JBQW9CLElBRWxCN0csSUFDRnNSLEVBQU90UixFQUNQc1IsRUFBS3BGLHlCQUEyQixPQUNoQ3FGLEVBQWVELEVBQUtFLHFCQUFxQixFQUFHLEVBQUcsRUFBRyxHLENBR3RELE0sQ0FXZ0IsRUFBQWpJLFFBQWhCLFNBQXdCclosR0FFdEIsR0FBSUEsRUFBSXVoQixNQUFNLGtCQUNaLE9BQVF2aEIsRUFBSXRNLFFBQ1YsS0FBSyxFQUlILE9BSEFtRCxFQUFLc2EsU0FBU25SLEVBQUkyTixNQUFNLEVBQUcsR0FBRzZULE9BQU8sR0FBSSxJQUN6QzFxQixFQUFLcWEsU0FBU25SLEVBQUkyTixNQUFNLEVBQUcsR0FBRzZULE9BQU8sR0FBSSxJQUN6Q3pxQixFQUFLb2EsU0FBU25SLEVBQUkyTixNQUFNLEVBQUcsR0FBRzZULE9BQU8sR0FBSSxJQUNsQ3BJLEVBQVNDLFFBQVF4aUIsRUFBSUMsRUFBSUMsR0FFbEMsS0FBSyxFQUtILE9BSkFGLEVBQUtzYSxTQUFTblIsRUFBSTJOLE1BQU0sRUFBRyxHQUFHNlQsT0FBTyxHQUFJLElBQ3pDMXFCLEVBQUtxYSxTQUFTblIsRUFBSTJOLE1BQU0sRUFBRyxHQUFHNlQsT0FBTyxHQUFJLElBQ3pDenFCLEVBQUtvYSxTQUFTblIsRUFBSTJOLE1BQU0sRUFBRyxHQUFHNlQsT0FBTyxHQUFJLElBQ3pDeHFCLEVBQUttYSxTQUFTblIsRUFBSTJOLE1BQU0sRUFBRyxHQUFHNlQsT0FBTyxHQUFJLElBQ2xDcEksRUFBU0MsUUFBUXhpQixFQUFJQyxFQUFJQyxFQUFJQyxHQUV0QyxLQUFLLEVBQ0gsTUFBTyxDQUNMZ0osTUFDQXZHLE1BQU8wWCxTQUFTblIsRUFBSTJOLE1BQU0sR0FBSSxLQUFPLEVBQUksT0FBVSxHQUV2RCxLQUFLLEVBQ0gsTUFBTyxDQUNMM04sTUFDQXZHLEtBQU0wWCxTQUFTblIsRUFBSTJOLE1BQU0sR0FBSSxNQUFRLEdBTTdDLE1BQU04VCxFQUFZemhCLEVBQUl1aEIsTUFBTSxzRkFDNUIsR0FBSUUsRUFLRixPQUpBNXFCLEVBQUtzYSxTQUFTc1EsRUFBVSxJQUN4QjNxQixFQUFLcWEsU0FBU3NRLEVBQVUsSUFDeEIxcUIsRUFBS29hLFNBQVNzUSxFQUFVLElBQ3hCenFCLEVBQUszSSxLQUFLa1csTUFBb0UsVUFBNUNyVyxJQUFqQnV6QixFQUFVLEdBQW1CLEVBQUlsUSxXQUFXa1EsRUFBVSxNQUNoRXJJLEVBQVNDLFFBQVF4aUIsRUFBSUMsRUFBSUMsRUFBSUMsR0FJdEMsSUFBS29xQixJQUFTQyxFQUNaLE1BQU0sSUFBSXZqQixNQUFNLHVDQU9sQixHQUZBc2pCLEVBQUs3WSxVQUFZOFksRUFDakJELEVBQUs3WSxVQUFZdkksRUFDYSxpQkFBbkJvaEIsRUFBSzdZLFVBQ2QsTUFBTSxJQUFJekssTUFBTSx1Q0FPbEIsR0FKQXNqQixFQUFLL1ksU0FBUyxFQUFHLEVBQUcsRUFBRyxJQUN0QnhSLEVBQUlDLEVBQUlDLEVBQUlDLEdBQU1vcUIsRUFBS3pDLGFBQWEsRUFBRyxFQUFHLEVBQUcsR0FBR25OLEtBR3RDLE1BQVB4YSxFQUNGLE1BQU0sSUFBSThHLE1BQU0sdUNBTWxCLE1BQU8sQ0FDTHJFLEtBQU0yZixFQUFTc0gsT0FBTzdwQixFQUFJQyxFQUFJQyxFQUFJQyxHQUNsQ2dKLE1BRUosQ0FDRCxDQWxHRCxDQUFpQkEsSUFBRyxNQUFIQSxFQUFHLEtBdUdwQixTQUFpQixHQXNCZixTQUFnQjBoQixFQUFtQjNuQixFQUFXQyxFQUFXQyxHQUN2RCxNQUFNMG5CLEVBQUs1bkIsRUFBSSxJQUNUNm5CLEVBQUs1bkIsRUFBSSxJQUNUNm5CLEVBQUs1bkIsRUFBSSxJQUlmLE1BQVksT0FIRDBuQixHQUFNLE9BQVVBLEVBQUssTUFBUXR6QixLQUFLeXpCLEtBQUtILEVBQUssTUFBUyxNQUFPLE1BRzdDLE9BRmZDLEdBQU0sT0FBVUEsRUFBSyxNQUFRdnpCLEtBQUt5ekIsS0FBS0YsRUFBSyxNQUFTLE1BQU8sTUFFL0IsT0FEN0JDLEdBQU0sT0FBVUEsRUFBSyxNQUFReHpCLEtBQUt5ekIsS0FBS0QsRUFBSyxNQUFTLE1BQU8sS0FFekUsQ0F2QmdCLEVBQUFFLGtCQUFoQixTQUFrQzVCLEdBQ2hDLE9BQU91QixFQUNKdkIsR0FBTyxHQUFNLElBQ2JBLEdBQU8sRUFBTSxJQUNBLElBQWQsRUFDSixFQVVnQixFQUFBdUIsbUJBQWtCLENBU25DLENBL0JELENBQWlCdkIsSUFBRyxNQUFIQSxFQUFHLEtBb0NwQixTQUFpQjFtQixHQTBEZixTQUFnQnVvQixFQUFnQjNILEVBQWdCQyxFQUFnQjJHLEdBRzlELE1BQU1KLEVBQU94RyxHQUFVLEdBQU0sSUFDdkJ5RyxFQUFPekcsR0FBVSxHQUFNLElBQ3ZCMEcsRUFBTzFHLEdBQVcsRUFBSyxJQUM3QixJQUFJeUYsRUFBT3hGLEdBQVUsR0FBTSxJQUN2QnlGLEVBQU96RixHQUFVLEdBQU0sSUFDdkIwRixFQUFPMUYsR0FBVyxFQUFLLElBQ3ZCMkgsRUFBSzNCLEVBQWNILEVBQUl1QixtQkFBbUI1QixFQUFLQyxFQUFLQyxHQUFNRyxFQUFJdUIsbUJBQW1CYixFQUFLQyxFQUFLQyxJQUMvRixLQUFPa0IsRUFBS2hCLElBQVVuQixFQUFNLEdBQUtDLEVBQU0sR0FBS0MsRUFBTSxJQUVoREYsR0FBT3p4QixLQUFLNFcsSUFBSSxFQUFHNVcsS0FBS2dXLEtBQVcsR0FBTnliLElBQzdCQyxHQUFPMXhCLEtBQUs0VyxJQUFJLEVBQUc1VyxLQUFLZ1csS0FBVyxHQUFOMGIsSUFDN0JDLEdBQU8zeEIsS0FBSzRXLElBQUksRUFBRzVXLEtBQUtnVyxLQUFXLEdBQU4yYixJQUM3QmlDLEVBQUszQixFQUFjSCxFQUFJdUIsbUJBQW1CNUIsRUFBS0MsRUFBS0MsR0FBTUcsRUFBSXVCLG1CQUFtQmIsRUFBS0MsRUFBS0MsSUFFN0YsT0FBUWpCLEdBQU8sR0FBS0MsR0FBTyxHQUFLQyxHQUFPLEVBQUksT0FBVSxDQUN2RCxDQUVBLFNBQWdCa0MsRUFBa0I3SCxFQUFnQkMsRUFBZ0IyRyxHQUdoRSxNQUFNSixFQUFPeEcsR0FBVSxHQUFNLElBQ3ZCeUcsRUFBT3pHLEdBQVUsR0FBTSxJQUN2QjBHLEVBQU8xRyxHQUFXLEVBQUssSUFDN0IsSUFBSXlGLEVBQU94RixHQUFVLEdBQU0sSUFDdkJ5RixFQUFPekYsR0FBVSxHQUFNLElBQ3ZCMEYsRUFBTzFGLEdBQVcsRUFBSyxJQUN2QjJILEVBQUszQixFQUFjSCxFQUFJdUIsbUJBQW1CNUIsRUFBS0MsRUFBS0MsR0FBTUcsRUFBSXVCLG1CQUFtQmIsRUFBS0MsRUFBS0MsSUFDL0YsS0FBT2tCLEVBQUtoQixJQUFVbkIsRUFBTSxLQUFRQyxFQUFNLEtBQVFDLEVBQU0sTUFFdERGLEVBQU16eEIsS0FBS0MsSUFBSSxJQUFNd3hCLEVBQU16eEIsS0FBS2dXLEtBQW1CLElBQWIsSUFBTXliLEtBQzVDQyxFQUFNMXhCLEtBQUtDLElBQUksSUFBTXl4QixFQUFNMXhCLEtBQUtnVyxLQUFtQixJQUFiLElBQU0wYixLQUM1Q0MsRUFBTTN4QixLQUFLQyxJQUFJLElBQU0weEIsRUFBTTN4QixLQUFLZ1csS0FBbUIsSUFBYixJQUFNMmIsS0FDNUNpQyxFQUFLM0IsRUFBY0gsRUFBSXVCLG1CQUFtQjVCLEVBQUtDLEVBQUtDLEdBQU1HLEVBQUl1QixtQkFBbUJiLEVBQUtDLEVBQUtDLElBRTdGLE9BQVFqQixHQUFPLEdBQUtDLEdBQU8sR0FBS0MsR0FBTyxFQUFJLE9BQVUsQ0FDdkQsQ0EvRmdCLEVBQUFqVSxNQUFoQixTQUFzQi9ZLEVBQVlDLEdBRWhDLEdBREErRCxHQUFXLElBQUwvRCxHQUFhLElBQ1IsSUFBUCtELEVBQ0YsT0FBTy9ELEVBRVQsTUFBTTZzQixFQUFPN3NCLEdBQU0sR0FBTSxJQUNuQjhzQixFQUFPOXNCLEdBQU0sR0FBTSxJQUNuQitzQixFQUFPL3NCLEdBQU0sRUFBSyxJQUNsQjR0QixFQUFPN3RCLEdBQU0sR0FBTSxJQUNuQjh0QixFQUFPOXRCLEdBQU0sR0FBTSxJQUNuQit0QixFQUFPL3RCLEdBQU0sRUFBSyxJQUl4QixPQUhBNkQsRUFBS2dxQixFQUFNeHlCLEtBQUtrVyxPQUFPdWIsRUFBTWUsR0FBTzdwQixHQUNwQ0YsRUFBS2dxQixFQUFNenlCLEtBQUtrVyxPQUFPd2IsRUFBTWUsR0FBTzlwQixHQUNwQ0QsRUFBS2dxQixFQUFNMXlCLEtBQUtrVyxPQUFPeWIsRUFBTWUsR0FBTy9wQixHQUM3Qm9pQixFQUFTc0gsT0FBTzdwQixFQUFJQyxFQUFJQyxFQUNqQyxFQWVnQixFQUFBd2pCLG9CQUFoQixTQUFvQ0YsRUFBZ0JDLEVBQWdCMkcsR0FDbEUsTUFBTWtCLEVBQU1oQyxFQUFJNEIsa0JBQWtCMUgsR0FBVSxHQUN0QytILEVBQU1qQyxFQUFJNEIsa0JBQWtCekgsR0FBVSxHQUU1QyxHQURXZ0csRUFBYzZCLEVBQUtDLEdBQ3JCbkIsRUFBTyxDQUNkLEdBQUltQixFQUFNRCxFQUFLLENBQ2IsTUFBTUUsRUFBVUwsRUFBZ0IzSCxFQUFRQyxFQUFRMkcsR0FDMUNxQixFQUFlaEMsRUFBYzZCLEVBQUtoQyxFQUFJNEIsa0JBQWtCTSxHQUFXLElBQ3pFLEdBQUlDLEVBQWVyQixFQUFPLENBQ3hCLE1BQU1zQixFQUFVTCxFQUFrQjdILEVBQVFDLEVBQVEyRyxHQUVsRCxPQUFPcUIsRUFEY2hDLEVBQWM2QixFQUFLaEMsRUFBSTRCLGtCQUFrQlEsR0FBVyxJQUNwQ0YsRUFBVUUsQyxDQUVqRCxPQUFPRixDLENBRVQsTUFBTUEsRUFBVUgsRUFBa0I3SCxFQUFRQyxFQUFRMkcsR0FDNUNxQixFQUFlaEMsRUFBYzZCLEVBQUtoQyxFQUFJNEIsa0JBQWtCTSxHQUFXLElBQ3pFLEdBQUlDLEVBQWVyQixFQUFPLENBQ3hCLE1BQU1zQixFQUFVUCxFQUFnQjNILEVBQVFDLEVBQVEyRyxHQUVoRCxPQUFPcUIsRUFEY2hDLEVBQWM2QixFQUFLaEMsRUFBSTRCLGtCQUFrQlEsR0FBVyxJQUNwQ0YsRUFBVUUsQyxDQUVqRCxPQUFPRixDLENBR1gsRUFFZ0IsRUFBQUwsZ0JBQWUsRUFvQmYsRUFBQUUsa0JBQWlCLEVBb0JqQixFQUFBdEIsV0FBaEIsU0FBMkJqaUIsR0FDekIsTUFBTyxDQUFFQSxHQUFTLEdBQU0sSUFBT0EsR0FBUyxHQUFNLElBQU9BLEdBQVMsRUFBSyxJQUFjLElBQVJBLEVBQzNFLENBQ0QsQ0FyR0QsQ0FBaUJsRixJQUFJLE9BQUpBLEVBQUksS0F1R3JCLGdCQVdBLGlCLHNIQzdWQSxtQ0FDVSxLQUFBK29CLFdBQWdDLEdBRWhDLEtBQUFDLFdBQXFCLENBNEMvQixDQTFDRSxTQUFXem1CLEdBbUJULE9BbEJLL04sS0FBS3kwQixTQUNSejBCLEtBQUt5MEIsT0FBVUMsSUFDYjEwQixLQUFLdTBCLFdBQVd0VixLQUFLeVYsR0FDRixDQUNqQm5qQixRQUFTLEtBQ1AsSUFBS3ZSLEtBQUt3MEIsVUFDUixJQUFLLElBQUl6ekIsRUFBSSxFQUFHQSxFQUFJZixLQUFLdTBCLFdBQVc5dUIsT0FBUTFFLElBQzFDLEdBQUlmLEtBQUt1MEIsV0FBV3h6QixLQUFPMnpCLEVBRXpCLFlBREExMEIsS0FBS3UwQixXQUFXdlYsT0FBT2plLEVBQUcsRSxLQVVqQ2YsS0FBS3kwQixNQUNkLENBRU8sSUFBQXBrQixDQUFLc2tCLEVBQVNDLEdBQ25CLE1BQU0vTCxFQUEyQixHQUNqQyxJQUFLLElBQUk5bkIsRUFBSSxFQUFHQSxFQUFJZixLQUFLdTBCLFdBQVc5dUIsT0FBUTFFLElBQzFDOG5CLEVBQU01SixLQUFLamYsS0FBS3UwQixXQUFXeHpCLElBRTdCLElBQUssSUFBSUEsRUFBSSxFQUFHQSxFQUFJOG5CLEVBQU1wakIsT0FBUTFFLElBQ2hDOG5CLEVBQU05bkIsR0FBRzh6QixVQUFLNTBCLEVBQVcwMEIsRUFBTUMsRUFFbkMsQ0FFTyxPQUFBcmpCLEdBQ0x2UixLQUFLODBCLGlCQUNMOTBCLEtBQUt3MEIsV0FBWSxDQUNuQixDQUVPLGNBQUFNLEdBQ0Q5MEIsS0FBS3UwQixhQUNQdjBCLEtBQUt1MEIsV0FBVzl1QixPQUFTLEVBRTdCLEdBR0Ysd0JBQWdDc3ZCLEVBQWlCQyxHQUMvQyxPQUFPRCxHQUFLenJCLEdBQUswckIsRUFBRzNrQixLQUFLL0csSUFDM0IsRUFFQSwyQkFBbUN5RSxFQUFrQnNGLEdBRW5ELE9BREFBLE9BQVFwVCxHQUNEOE4sR0FBTXpFLEdBQUsrSixFQUFRL0osSUFDNUIsQyxjQ2tCQSxTQUFnQjJyQixFQUFhQyxHQUMzQixJQUFLLE1BQU14WCxLQUFLd1gsRUFDZHhYLEVBQUVuTSxVQUVKMmpCLEVBQVl6dkIsT0FBUyxDQUN2QixDLG1KQXpGQSxpQ0FDWSxLQUFBMHZCLGFBQThCLEdBQzlCLEtBQUFDLGFBQXVCLENBa0NuQyxDQTdCUyxPQUFBN2pCLEdBQ0x2UixLQUFLbzFCLGFBQWMsRUFDbkIsSUFBSyxNQUFNMVgsS0FBSzFkLEtBQUttMUIsYUFDbkJ6WCxFQUFFbk0sVUFFSnZSLEtBQUttMUIsYUFBYTF2QixPQUFTLENBQzdCLENBT08sUUFBQXhFLENBQWdDeWMsR0FFckMsT0FEQTFkLEtBQUttMUIsYUFBYWxXLEtBQUt2QixHQUNoQkEsQ0FDVCxDQU9PLFVBQUEyWCxDQUFrQzNYLEdBQ3ZDLE1BQU0yQixFQUFRcmYsS0FBS20xQixhQUFhdFcsUUFBUW5CLElBQ3pCLElBQVgyQixHQUNGcmYsS0FBS20xQixhQUFhblcsT0FBT0ssRUFBTyxFQUVwQyxHQUdGLHdDQUVVLEtBQUErVixhQUFjLENBZ0N4QixDQTNCRSxTQUFXMWtCLEdBQ1QsT0FBTzFRLEtBQUtvMUIsaUJBQWNuMUIsRUFBWUQsS0FBS3MxQixNQUM3QyxDQUtBLFNBQVc1a0IsQ0FBTUEsR0FDWDFRLEtBQUtvMUIsYUFBZTFrQixJQUFVMVEsS0FBS3MxQixTQUd2Q3QxQixLQUFLczFCLFFBQVEvakIsVUFDYnZSLEtBQUtzMUIsT0FBUzVrQixFQUNoQixDQUtPLEtBQUE1SixHQUNMOUcsS0FBSzBRLFdBQVF6USxDQUNmLENBRU8sT0FBQXNSLEdBQ0x2UixLQUFLbzFCLGFBQWMsRUFDbkJwMUIsS0FBS3MxQixRQUFRL2pCLFVBQ2J2UixLQUFLczFCLFlBQVNyMUIsQ0FDaEIsR0FNRix3QkFBNkJra0IsR0FDM0IsTUFBTyxDQUFFNVMsUUFBUzRTLEVBQ3BCLEVBS0EsaUJBVUEscUNBQTBDN2UsR0FDeEMsTUFBTyxDQUFFaU0sUUFBUyxJQUFNMGpCLEVBQWEzdkIsR0FDdkMsQywrRkN0R0EsTUFBYWl3QixFQUFiLGNBQ1UsS0FBQUMsTUFBOEYsQ0FBQyxDQWdCekcsQ0FkUyxHQUFBNXRCLENBQUk2dEIsRUFBZUMsRUFBaUJobEIsR0FDcEMxUSxLQUFLdzFCLE1BQU1DLEtBQ2R6MUIsS0FBS3cxQixNQUFNQyxHQUFTLENBQUMsR0FFdkJ6MUIsS0FBS3cxQixNQUFNQyxHQUEyQkMsR0FBVWhsQixDQUNsRCxDQUVPLEdBQUEwRSxDQUFJcWdCLEVBQWVDLEdBQ3hCLE9BQU8xMUIsS0FBS3cxQixNQUFNQyxHQUE0QnoxQixLQUFLdzFCLE1BQU1DLEdBQTJCQyxRQUFVejFCLENBQ2hHLENBRU8sS0FBQTZHLEdBQ0w5RyxLQUFLdzFCLE1BQVEsQ0FBQyxDQUNoQixFQWhCRixjQW1CQSxpQ0FDVSxLQUFBQSxNQUF3RSxJQUFJRCxDQWdCdEYsQ0FkUyxHQUFBM3RCLENBQUk2dEIsRUFBZUMsRUFBaUJDLEVBQWVDLEVBQWlCbGxCLEdBQ3BFMVEsS0FBS3cxQixNQUFNcGdCLElBQUlxZ0IsRUFBT0MsSUFDekIxMUIsS0FBS3cxQixNQUFNNXRCLElBQUk2dEIsRUFBT0MsRUFBUSxJQUFJSCxHQUVwQ3YxQixLQUFLdzFCLE1BQU1wZ0IsSUFBSXFnQixFQUFPQyxHQUFTOXRCLElBQUkrdEIsRUFBT0MsRUFBUWxsQixFQUNwRCxDQUVPLEdBQUEwRSxDQUFJcWdCLEVBQWVDLEVBQWlCQyxFQUFlQyxHQUN4RCxPQUFPNTFCLEtBQUt3MUIsTUFBTXBnQixJQUFJcWdCLEVBQU9DLElBQVN0Z0IsSUFBSXVnQixFQUFPQyxFQUNuRCxDQUVPLEtBQUE5dUIsR0FDTDlHLEtBQUt3MUIsTUFBTTF1QixPQUNiLEUsdU1DeEJXLEVBQUErdUIsT0FBNkIsb0JBQVpDLFNBQTJCLFVBQVlBLFFBQ3JFLE1BQU1DLEVBQWEsRUFBTSxPQUFJLE9BQVNDLFVBQVVELFVBQzFDRSxFQUFZLEVBQU0sT0FBSSxPQUFTRCxVQUFVQyxTQUVsQyxFQUFBOVYsVUFBWTRWLEVBQVVHLFNBQVMsV0FDL0IsRUFBQTlWLGFBQWUyVixFQUFVRyxTQUFTLFFBQ2xDLEVBQUFDLFNBQVcsaUNBQWlDQyxLQUFLTCxHQUM5RCw4QkFDRSxJQUFLLEVBQUFJLFNBQ0gsT0FBTyxFQUVULE1BQU1FLEVBQWVOLEVBQVV6QyxNQUFNLGtCQUNyQyxPQUFxQixPQUFqQitDLEdBQXlCQSxFQUFhNXdCLE9BQVMsRUFDMUMsRUFFRnlkLFNBQVNtVCxFQUFhLEdBQy9CLEVBS2EsRUFBQUMsTUFBUSxDQUFDLFlBQWEsV0FBWSxTQUFVLFVBQVVKLFNBQVNELEdBQy9ELEVBQUFNLE9BQXNCLFNBQWJOLEVBQ1QsRUFBQU8sU0FBd0IsV0FBYlAsRUFDWCxFQUFBUSxVQUFZLENBQUMsVUFBVyxRQUFTLFFBQVMsU0FBU1AsU0FBU0QsR0FDNUQsRUFBQVMsUUFBVVQsRUFBU3BYLFFBQVEsVUFBWSxFQUV2QyxFQUFBOFgsV0FBYSxXQUFXUCxLQUFLTCxFLGdJQ3RDMUMsZUEyQkEsTUFBZWEsRUFBZixjQUNVLEtBQUFDLE9BQW1DLEdBRW5DLEtBQUFDLEdBQUssQ0FrRWYsQ0E3RFMsT0FBQS9OLENBQVFnTyxHQUNiLzJCLEtBQUs2MkIsT0FBTzVYLEtBQUs4WCxHQUNqQi8yQixLQUFLZzNCLFFBQ1AsQ0FFTyxLQUFBQyxHQUNMLEtBQU9qM0IsS0FBSzgyQixHQUFLOTJCLEtBQUs2MkIsT0FBT3B4QixRQUN0QnpGLEtBQUs2MkIsT0FBTzcyQixLQUFLODJCLE9BQ3BCOTJCLEtBQUs4MkIsS0FHVDkyQixLQUFLOEcsT0FDUCxDQUVPLEtBQUFBLEdBQ0Q5RyxLQUFLazNCLGdCQUNQbDNCLEtBQUttM0IsZ0JBQWdCbjNCLEtBQUtrM0IsZUFDMUJsM0IsS0FBS2szQixtQkFBZ0JqM0IsR0FFdkJELEtBQUs4MkIsR0FBSyxFQUNWOTJCLEtBQUs2MkIsT0FBT3B4QixPQUFTLENBQ3ZCLENBRVEsTUFBQXV4QixHQUNEaDNCLEtBQUtrM0IsZ0JBQ1JsM0IsS0FBS2szQixjQUFnQmwzQixLQUFLbzNCLGlCQUFpQnAzQixLQUFLcTNCLFNBQVNDLEtBQUt0M0IsT0FFbEUsQ0FFUSxRQUFBcTNCLENBQVNFLEdBQ2Z2M0IsS0FBS2szQixtQkFBZ0JqM0IsRUFDckIsSUFBSXUzQixFQUFlLEVBQ2ZDLEVBQWMsRUFDZEMsRUFBd0JILEVBQVNJLGdCQUNqQ0MsRUFBb0IsRUFDeEIsS0FBTzUzQixLQUFLODJCLEdBQUs5MkIsS0FBSzYyQixPQUFPcHhCLFFBQVEsQ0FhbkMsR0FaQSt4QixFQUFlMVcsS0FBS0MsTUFDZi9nQixLQUFLNjJCLE9BQU83MkIsS0FBSzgyQixPQUNwQjkyQixLQUFLODJCLEtBS1BVLEVBQWVwM0IsS0FBSzRXLElBQUksRUFBRzhKLEtBQUtDLE1BQVF5VyxHQUN4Q0MsRUFBY3IzQixLQUFLNFcsSUFBSXdnQixFQUFjQyxHQUdyQ0csRUFBb0JMLEVBQVNJLGdCQUNYLElBQWRGLEVBQW9CRyxFQU90QixPQUpJRixFQUF3QkYsR0FBZ0IsSUFDMUN6bkIsUUFBUUssS0FBSyw0Q0FBNENoUSxLQUFLNnhCLElBQUk3eEIsS0FBS2tXLE1BQU1vaEIsRUFBd0JGLGNBRXZHeDNCLEtBQUtnM0IsU0FHUFUsRUFBd0JFLEMsQ0FFMUI1M0IsS0FBSzhHLE9BQ1AsRUFRRixNQUFhK3dCLFVBQTBCakIsRUFDM0IsZ0JBQUFRLENBQWlCN1IsR0FDekIsT0FBT3BWLFlBQVcsSUFBTW9WLEVBQVN2bEIsS0FBSzgzQixnQkFBZ0IsTUFDeEQsQ0FFVSxlQUFBWCxDQUFnQlksR0FDeEJ6bkIsYUFBYXluQixFQUNmLENBRVEsZUFBQUQsQ0FBZ0JFLEdBQ3RCLE1BQU16bEIsRUFBTXVPLEtBQUtDLE1BQVFpWCxFQUN6QixNQUFPLENBQ0xMLGNBQWUsSUFBTXYzQixLQUFLNFcsSUFBSSxFQUFHekUsRUFBTXVPLEtBQUtDLE9BRWhELEVBZEYsc0JBb0NhLEVBQUErSCxlQUFrQixFQUFBK00sUUFBVSx3QkFBeUJqbEIsT0FuQmxFLGNBQW9DZ21CLEVBQ3hCLGdCQUFBUSxDQUFpQjdSLEdBQ3pCLE9BQU8wUyxvQkFBb0IxUyxFQUM3QixDQUVVLGVBQUE0UixDQUFnQlksR0FDeEJHLG1CQUFtQkgsRUFDckIsR0FZa0dGLEVBTXBHLDBCQUdFLFdBQUF6NEIsR0FDRVksS0FBS200QixPQUFTLElBQUksRUFBQXJQLGFBQ3BCLENBRU8sR0FBQWxoQixDQUFJbXZCLEdBQ1QvMkIsS0FBS200QixPQUFPcnhCLFFBQ1o5RyxLQUFLbTRCLE9BQU9wUCxRQUFRZ08sRUFDdEIsQ0FFTyxLQUFBRSxHQUNMajNCLEtBQUttNEIsT0FBT2xCLE9BQ2QsRSxzR0M1SkYsTUFBYXpnQixFQUFiLGNBc0JTLEtBQUF4UixHQUFLLEVBQ0wsS0FBQUQsR0FBSyxFQUNMLEtBQUF1WSxTQUEyQixJQUFJOGEsQ0FtR3hDLENBMUhTLGlCQUFPbE4sQ0FBV3hhLEdBQ3ZCLE1BQU8sQ0FDTEEsSUFBVSxHQUF1QixJQUNqQ0EsSUFBVSxFQUF5QixJQUMzQixJQUFSQSxFQUVKLENBRU8sbUJBQU8ybkIsQ0FBYTNuQixHQUN6QixPQUFtQixJQUFYQSxFQUFNLEtBQWEsSUFBbUMsSUFBWEEsRUFBTSxLQUFhLEVBQW9DLElBQVhBLEVBQU0sRUFDdkcsQ0FFTyxLQUFBNG5CLEdBQ0wsTUFBTUMsRUFBUyxJQUFJL2hCLEVBSW5CLE9BSEEraEIsRUFBT3Z6QixHQUFLaEYsS0FBS2dGLEdBQ2pCdXpCLEVBQU94ekIsR0FBSy9FLEtBQUsrRSxHQUNqQnd6QixFQUFPamIsU0FBV3RkLEtBQUtzZCxTQUFTZ2IsUUFDekJDLENBQ1QsQ0FRTyxTQUFBeEwsR0FBNEIsT0FBaUIsU0FBVi9zQixLQUFLZ0YsRUFBc0IsQ0FDOUQsTUFBQWtXLEdBQTRCLE9BQWlCLFVBQVZsYixLQUFLZ0YsRUFBbUIsQ0FDM0QsV0FBQW1vQixHQUNMLE9BQUludEIsS0FBS3c0QixvQkFBdUQsSUFBakN4NEIsS0FBS3NkLFNBQVNDLGVBQ3BDLEVBRVEsVUFBVnZkLEtBQUtnRixFQUNkLENBQ08sT0FBQXl6QixHQUE0QixPQUFpQixVQUFWejRCLEtBQUtnRixFQUFvQixDQUM1RCxXQUFBOG5CLEdBQTRCLE9BQWlCLFdBQVY5c0IsS0FBS2dGLEVBQXdCLENBQ2hFLFFBQUFtVyxHQUE0QixPQUFpQixTQUFWbmIsS0FBSytFLEVBQXFCLENBQzdELEtBQUFpb0IsR0FBNEIsT0FBaUIsVUFBVmh0QixLQUFLK0UsRUFBa0IsQ0FDMUQsZUFBQXNvQixHQUE0QixPQUFpQixXQUFWcnRCLEtBQUtnRixFQUE0QixDQUNwRSxXQUFBMHpCLEdBQTRCLE9BQWlCLFVBQVYxNEIsS0FBSytFLEVBQXdCLENBQ2hFLFVBQUF3b0IsR0FBNEIsT0FBaUIsV0FBVnZ0QixLQUFLK0UsRUFBdUIsQ0FHL0QsY0FBQTBvQixHQUEyQixPQUFpQixTQUFWenRCLEtBQUtnRixFQUF5QixDQUNoRSxjQUFBMm9CLEdBQTJCLE9BQWlCLFNBQVYzdEIsS0FBSytFLEVBQXlCLENBQ2hFLE9BQUE0ekIsR0FBMkIsT0FBMEMsV0FBeEIsU0FBVjM0QixLQUFLZ0YsR0FBZ0QsQ0FDeEYsT0FBQTR6QixHQUEyQixPQUEwQyxXQUF4QixTQUFWNTRCLEtBQUsrRSxHQUFnRCxDQUN4RixXQUFBOHpCLEdBQTJCLE9BQTBDLFdBQXhCLFNBQVY3NEIsS0FBS2dGLEtBQXFGLFdBQXhCLFNBQVZoRixLQUFLZ0YsR0FBaUQsQ0FDakosV0FBQTh6QixHQUEyQixPQUEwQyxXQUF4QixTQUFWOTRCLEtBQUsrRSxLQUFxRixXQUF4QixTQUFWL0UsS0FBSytFLEdBQWlELENBQ2pKLFdBQUFnMEIsR0FBMkIsT0FBMEMsSUFBeEIsU0FBVi80QixLQUFLZ0YsR0FBZ0MsQ0FDeEUsV0FBQWcwQixHQUEyQixPQUEwQyxJQUF4QixTQUFWaDVCLEtBQUsrRSxHQUFnQyxDQUN4RSxrQkFBQWswQixHQUFnQyxPQUFtQixJQUFaajVCLEtBQUtnRixJQUF3QixJQUFaaEYsS0FBSytFLEVBQVUsQ0FHdkUsVUFBQXlvQixHQUNMLE9BQWtCLFNBQVZ4dEIsS0FBS2dGLElBQ1gsS0FBSyxTQUNMLEtBQUssU0FBcUIsT0FBaUIsSUFBVmhGLEtBQUtnRixHQUN0QyxLQUFLLFNBQXFCLE9BQWlCLFNBQVZoRixLQUFLZ0YsR0FDdEMsUUFBMEIsT0FBUSxFQUV0QyxDQUNPLFVBQUEwb0IsR0FDTCxPQUFrQixTQUFWMXRCLEtBQUsrRSxJQUNYLEtBQUssU0FDTCxLQUFLLFNBQXFCLE9BQWlCLElBQVYvRSxLQUFLK0UsR0FDdEMsS0FBSyxTQUFxQixPQUFpQixTQUFWL0UsS0FBSytFLEdBQ3RDLFFBQTBCLE9BQVEsRUFFdEMsQ0FHTyxnQkFBQXl6QixHQUNMLE9BQWlCLFVBQVZ4NEIsS0FBSytFLEVBQ2QsQ0FDTyxjQUFBbTBCLEdBQ0RsNUIsS0FBS3NkLFNBQVNxVCxVQUNoQjN3QixLQUFLK0UsS0FBTSxVQUVYL0UsS0FBSytFLElBQU0sU0FFZixDQUNPLGlCQUFBZ3FCLEdBQ0wsR0FBZSxVQUFWL3VCLEtBQUsrRSxLQUErQi9FLEtBQUtzZCxTQUFTNmIsZUFDckQsT0FBdUMsU0FBL0JuNUIsS0FBS3NkLFNBQVM2YixnQkFDcEIsS0FBSyxTQUNMLEtBQUssU0FBcUIsT0FBc0MsSUFBL0JuNUIsS0FBS3NkLFNBQVM2YixlQUMvQyxLQUFLLFNBQXFCLE9BQXNDLFNBQS9CbjVCLEtBQUtzZCxTQUFTNmIsZUFDL0MsUUFBMEIsT0FBT241QixLQUFLd3RCLGFBRzFDLE9BQU94dEIsS0FBS3d0QixZQUNkLENBQ08scUJBQUE0TCxHQUNMLE9BQWtCLFVBQVZwNUIsS0FBSytFLEtBQStCL0UsS0FBS3NkLFNBQVM2YixlQUN2QixTQUEvQm41QixLQUFLc2QsU0FBUzZiLGVBQ2RuNUIsS0FBS3l0QixnQkFDWCxDQUNPLG1CQUFBcUIsR0FDTCxPQUFrQixVQUFWOXVCLEtBQUsrRSxLQUErQi9FLEtBQUtzZCxTQUFTNmIsZUFDRSxXQUF4QixTQUEvQm41QixLQUFLc2QsU0FBUzZiLGdCQUNmbjVCLEtBQUsyNEIsU0FDWCxDQUNPLHVCQUFBVSxHQUNMLE9BQWtCLFVBQVZyNUIsS0FBSytFLEtBQStCL0UsS0FBS3NkLFNBQVM2YixlQUNFLFdBQXhCLFNBQS9CbjVCLEtBQUtzZCxTQUFTNmIsaUJBQzhDLFdBQXhCLFNBQS9CbjVCLEtBQUtzZCxTQUFTNmIsZ0JBQ3BCbjVCLEtBQUs2NEIsYUFDWCxDQUNPLHVCQUFBaEssR0FDTCxPQUFrQixVQUFWN3VCLEtBQUsrRSxLQUErQi9FLEtBQUtzZCxTQUFTNmIsZUFDRSxJQUF4QixTQUEvQm41QixLQUFLc2QsU0FBUzZiLGdCQUNmbjVCLEtBQUsrNEIsYUFDWCxDQUNPLGlCQUFBTyxHQUNMLE9BQWlCLFVBQVZ0NUIsS0FBS2dGLEdBQ0csVUFBVmhGLEtBQUsrRSxHQUE0Qi9FLEtBQUtzZCxTQUFTQyxlQUFpQixFQUNqRSxDQUNOLENBQ08seUJBQUErUixHQUNMLE9BQU90dkIsS0FBS3NkLFNBQVNpYyxzQkFDdkIsRUExSEYsa0JBa0lBLE1BQWFuQixFQUVYLE9BQVduekIsR0FDVCxPQUFJakYsS0FBS3c1QixRQUVRLFVBQVp4NUIsS0FBS3k1QixLQUNMejVCLEtBQUt1ZCxnQkFBa0IsR0FHckJ2ZCxLQUFLeTVCLElBQ2QsQ0FDQSxPQUFXeDBCLENBQUl5TCxHQUFpQjFRLEtBQUt5NUIsS0FBTy9vQixDQUFPLENBRW5ELGtCQUFXNk0sR0FFVCxPQUFJdmQsS0FBS3c1QixPQUNBLEdBRVcsVUFBWng1QixLQUFLeTVCLE9BQW9DLEVBQ25ELENBQ0Esa0JBQVdsYyxDQUFlN00sR0FDeEIxUSxLQUFLeTVCLE9BQVEsVUFDYno1QixLQUFLeTVCLE1BQVMvb0IsR0FBUyxHQUFNLFNBQy9CLENBRUEsa0JBQVd5b0IsR0FDVCxPQUFtQixTQUFabjVCLEtBQUt5NUIsSUFDZCxDQUNBLGtCQUFXTixDQUFlem9CLEdBQ3hCMVEsS0FBS3k1QixPQUFRLFNBQ2J6NUIsS0FBS3k1QixNQUFnQixTQUFSL29CLENBQ2YsQ0FHQSxTQUFXZ3BCLEdBQ1QsT0FBTzE1QixLQUFLdzVCLE1BQ2QsQ0FDQSxTQUFXRSxDQUFNaHBCLEdBQ2YxUSxLQUFLdzVCLE9BQVM5b0IsQ0FDaEIsQ0FFQSwwQkFBVzZvQixHQUNULE1BQU1JLEdBQW1CLFdBQVozNUIsS0FBS3k1QixPQUFtQyxHQUNyRCxPQUFJRSxFQUFNLEVBQ0ssV0FBTkEsRUFFRkEsQ0FDVCxDQUNBLDBCQUFXSixDQUF1QjdvQixHQUNoQzFRLEtBQUt5NUIsTUFBUSxVQUNiejVCLEtBQUt5NUIsTUFBUy9vQixHQUFTLEdBQU0sVUFDL0IsQ0FFQSxXQUFBdFIsQ0FDRTZGLEVBQWMsRUFDZHkwQixFQUFnQixHQXREVixLQUFBRCxLQUFlLEVBZ0NmLEtBQUFELE9BQWlCLEVBd0J2Qng1QixLQUFLeTVCLEtBQU94MEIsRUFDWmpGLEtBQUt3NUIsT0FBU0UsQ0FDaEIsQ0FFTyxLQUFBcEIsR0FDTCxPQUFPLElBQUlGLEVBQWNwNEIsS0FBS3k1QixLQUFNejVCLEtBQUt3NUIsT0FDM0MsQ0FNTyxPQUFBN0ksR0FDTCxPQUErQixJQUF4QjN3QixLQUFLdWQsZ0JBQTBELElBQWhCdmQsS0FBS3c1QixNQUM3RCxFQXZFRixpQixtRkNwSUEsZUFDQSxTQUNBLFNBS0EsTUFBYWhzQixVQUFpQixFQUFBZ0osY0FBOUIsYyxvQkFRUyxLQUFBRSxRQUFVLEVBQ1YsS0FBQTFSLEdBQUssRUFDTCxLQUFBRCxHQUFLLEVBQ0wsS0FBQXVZLFNBQTJCLElBQUksRUFBQThhLGNBQy9CLEtBQUF6aEIsYUFBZSxFQW9FeEIsQ0E5RVMsbUJBQU9pakIsQ0FBYWxwQixHQUN6QixNQUFNbXBCLEVBQU0sSUFBSXJzQixFQUVoQixPQURBcXNCLEVBQUkvaUIsZ0JBQWdCcEcsR0FDYm1wQixDQUNULENBUU8sVUFBQWhqQixHQUNMLE9BQXNCLFFBQWY3VyxLQUFLMFcsT0FDZCxDQUVPLFFBQUFaLEdBQ0wsT0FBTzlWLEtBQUswVyxTQUFXLEVBQ3pCLENBRU8sUUFBQWYsR0FDTCxPQUFtQixRQUFmM1YsS0FBSzBXLFFBQ0ExVyxLQUFLMlcsYUFFSyxRQUFmM1csS0FBSzBXLFNBQ0EsSUFBQW9qQixxQkFBbUMsUUFBZjk1QixLQUFLMFcsU0FFM0IsRUFDVCxDQU9PLE9BQUFkLEdBQ0wsT0FBUTVWLEtBQUs2VyxhQUNUN1csS0FBSzJXLGFBQWF1WCxXQUFXbHVCLEtBQUsyVyxhQUFhbFIsT0FBUyxHQUN6QyxRQUFmekYsS0FBSzBXLE9BQ1gsQ0FFTyxlQUFBSSxDQUFnQnBHLEdBQ3JCMVEsS0FBS2dGLEdBQUswTCxFQUFNLEVBQUFxcEIsc0JBQ2hCLzVCLEtBQUsrRSxHQUFLLEVBQ1YsSUFBSWkxQixHQUFXLEVBRWYsR0FBSXRwQixFQUFNLEVBQUF1cEIsc0JBQXNCeDBCLE9BQVMsRUFDdkN1MEIsR0FBVyxPQUVSLEdBQTJDLElBQXZDdHBCLEVBQU0sRUFBQXVwQixzQkFBc0J4MEIsT0FBYyxDQUNqRCxNQUFNWCxFQUFPNEwsRUFBTSxFQUFBdXBCLHNCQUFzQi9MLFdBQVcsR0FHcEQsR0FBSSxPQUFVcHBCLEdBQVFBLEdBQVEsTUFBUSxDQUNwQyxNQUFNNHdCLEVBQVNobEIsRUFBTSxFQUFBdXBCLHNCQUFzQi9MLFdBQVcsR0FDbEQsT0FBVXdILEdBQVVBLEdBQVUsTUFDaEMxMUIsS0FBSzBXLFFBQTZCLE1BQWpCNVIsRUFBTyxPQUFrQjR3QixFQUFTLE1BQVMsTUFBWWhsQixFQUFNLEVBQUF3cEIsd0JBQTBCLEdBR3hHRixHQUFXLEMsTUFJYkEsR0FBVyxDLE1BSWJoNkIsS0FBSzBXLFFBQVVoRyxFQUFNLEVBQUF1cEIsc0JBQXNCL0wsV0FBVyxHQUFNeGQsRUFBTSxFQUFBd3BCLHdCQUEwQixHQUUxRkYsSUFDRmg2QixLQUFLMlcsYUFBZWpHLEVBQU0sRUFBQXVwQixzQkFDMUJqNkIsS0FBSzBXLFFBQVUsUUFBNEJoRyxFQUFNLEVBQUF3cEIsd0JBQTBCLEdBRS9FLENBRU8sYUFBQW5qQixHQUNMLE1BQU8sQ0FBQy9XLEtBQUtnRixHQUFJaEYsS0FBSzJWLFdBQVkzVixLQUFLOFYsV0FBWTlWLEtBQUs0VixVQUMxRCxFQS9FRixZLDBVQ1JhLEVBQUFvVCxjQUFnQixFQUNoQixFQUFBbVIsYUFBZSxJQUFhLEVBQUFuUixlQUFpQixFQUM3QyxFQUFBQyxZQUFjLEVBRWQsRUFBQThRLHFCQUF1QixFQUN2QixFQUFBRSxxQkFBdUIsRUFDdkIsRUFBQUMsc0JBQXdCLEVBQ3hCLEVBQUFFLHFCQUF1QixFQU92QixFQUFBamtCLGVBQWlCLEdBQ2pCLEVBQUFra0IsZ0JBQWtCLEVBQ2xCLEVBQUE3MEIsZUFBaUIsRUFPakIsRUFBQTgwQixxQkFBdUIsSUFDdkIsRUFBQUMsc0JBQXdCLEVBQ3hCLEVBQUFDLHFCQUF1QixFLDBJQ2xCcEMsK0JBQW9DQyxHQUNsQyxPQUFJQSxFQUFZLE9BQ2RBLEdBQWEsTUFDTmhPLE9BQU9DLGFBQWlDLE9BQW5CK04sR0FBYSxLQUFnQmhPLE9BQU9DLGFBQWMrTixFQUFZLEtBQVMsUUFFOUZoTyxPQUFPQyxhQUFhK04sRUFDN0IsRUFPQSx5QkFBOEJsWCxFQUFtQmpSLEVBQWdCLEVBQUdDLEVBQWNnUixFQUFLOWQsUUFDckYsSUFBSTZQLEVBQVMsR0FDYixJQUFLLElBQUl2VSxFQUFJdVIsRUFBT3ZSLEVBQUl3UixJQUFPeFIsRUFBRyxDQUNoQyxJQUFJbWxCLEVBQVkzQyxFQUFLeGlCLEdBQ2pCbWxCLEVBQVksT0FNZEEsR0FBYSxNQUNiNVEsR0FBVW1YLE9BQU9DLGFBQWlDLE9BQW5CeEcsR0FBYSxLQUFnQnVHLE9BQU9DLGFBQWN4RyxFQUFZLEtBQVMsUUFFdEc1USxHQUFVbVgsT0FBT0MsYUFBYXhHLEUsQ0FHbEMsT0FBTzVRLENBQ1QsRUFNQSxvQ0FDVSxLQUFBb2xCLFNBQW1CLENBa0U3QixDQTdEUyxLQUFBNXpCLEdBQ0w5RyxLQUFLMDZCLFNBQVcsQ0FDbEIsQ0FVTyxNQUFBQyxDQUFPQyxFQUFlalYsR0FDM0IsTUFBTWxnQixFQUFTbTFCLEVBQU1uMUIsT0FFckIsSUFBS0EsRUFDSCxPQUFPLEVBR1QsSUFBSVUsRUFBTyxFQUNQMDBCLEVBQVcsRUFHZixHQUFJNzZCLEtBQUswNkIsU0FBVSxDQUNqQixNQUFNaEYsRUFBU2tGLEVBQU0xTSxXQUFXMk0sS0FDNUIsT0FBVW5GLEdBQVVBLEdBQVUsTUFDaEMvUCxFQUFPeGYsS0FBcUMsTUFBMUJuRyxLQUFLMDZCLFNBQVcsT0FBa0JoRixFQUFTLE1BQVMsT0FHdEUvUCxFQUFPeGYsS0FBVW5HLEtBQUswNkIsU0FDdEIvVSxFQUFPeGYsS0FBVXV2QixHQUVuQjExQixLQUFLMDZCLFNBQVcsQyxDQUdsQixJQUFLLElBQUkzNUIsRUFBSTg1QixFQUFVOTVCLEVBQUkwRSxJQUFVMUUsRUFBRyxDQUN0QyxNQUFNK0QsRUFBTzgxQixFQUFNMU0sV0FBV250QixHQUU5QixHQUFJLE9BQVUrRCxHQUFRQSxHQUFRLE1BQTlCLENBQ0UsS0FBTS9ELEdBQUswRSxFQUVULE9BREF6RixLQUFLMDZCLFNBQVc1MUIsRUFDVHFCLEVBRVQsTUFBTXV2QixFQUFTa0YsRUFBTTFNLFdBQVdudEIsR0FDNUIsT0FBVTIwQixHQUFVQSxHQUFVLE1BQ2hDL1AsRUFBT3hmLEtBQTRCLE1BQWpCckIsRUFBTyxPQUFrQjR3QixFQUFTLE1BQVMsT0FHN0QvUCxFQUFPeGYsS0FBVXJCLEVBQ2pCNmdCLEVBQU94ZixLQUFVdXZCLEUsTUFJUixRQUFUNXdCLElBSUo2Z0IsRUFBT3hmLEtBQVVyQixFLENBRW5CLE9BQU9xQixDQUNULEdBTUYsa0NBQ1MsS0FBQTIwQixRQUFzQixJQUFJdjRCLFdBQVcsRUFnTzlDLENBM05TLEtBQUF1RSxHQUNMOUcsS0FBSzg2QixRQUFRajBCLEtBQUssRUFDcEIsQ0FVTyxNQUFBOHpCLENBQU9DLEVBQW1CalYsR0FDL0IsTUFBTWxnQixFQUFTbTFCLEVBQU1uMUIsT0FFckIsSUFBS0EsRUFDSCxPQUFPLEVBR1QsSUFDSXMxQixFQUNBQyxFQUNBQyxFQUNBQyxFQUpBLzBCLEVBQU8sRUFLUCtmLEVBQVksRUFDWjJVLEVBQVcsRUFHZixHQUFJNzZCLEtBQUs4NkIsUUFBUSxHQUFJLENBQ25CLElBQUlLLEdBQWlCLEVBQ2pCQyxFQUFLcDdCLEtBQUs4NkIsUUFBUSxHQUN0Qk0sR0FBeUIsTUFBVixJQUFMQSxHQUF3QixHQUF5QixNQUFWLElBQUxBLEdBQXdCLEdBQU8sRUFDM0UsSUFDSUMsRUFEQUMsRUFBTSxFQUVWLE1BQVFELEVBQTRCLEdBQXRCcjdCLEtBQUs4NkIsVUFBVVEsS0FBZ0JBLEVBQU0sR0FDakRGLElBQU8sRUFDUEEsR0FBTUMsRUFHUixNQUFNbmtCLEVBQXNDLE1BQVYsSUFBbEJsWCxLQUFLODZCLFFBQVEsSUFBd0IsRUFBbUMsTUFBVixJQUFsQjk2QixLQUFLODZCLFFBQVEsSUFBd0IsRUFBSSxFQUMvRlMsRUFBVXJrQixFQUFPb2tCLEVBQ3ZCLEtBQU9ULEVBQVdVLEdBQVMsQ0FDekIsR0FBSVYsR0FBWXAxQixFQUNkLE9BQU8sRUFHVCxHQURBNDFCLEVBQU1ULEVBQU1DLEtBQ1MsTUFBVixJQUFOUSxHQUFzQixDQUV6QlIsSUFDQU0sR0FBaUIsRUFDakIsSyxDQUdBbjdCLEtBQUs4NkIsUUFBUVEsS0FBU0QsRUFDdEJELElBQU8sRUFDUEEsR0FBWSxHQUFOQyxDLENBR0xGLElBRVUsSUFBVGprQixFQUNFa2tCLEVBQUssSUFFUFAsSUFFQWxWLEVBQU94ZixLQUFVaTFCLEVBRUQsSUFBVGxrQixFQUNMa2tCLEVBQUssTUFBV0EsR0FBTSxPQUFVQSxHQUFNLE9BQWtCLFFBQVBBLElBR25EelYsRUFBT3hmLEtBQVVpMUIsR0FHZkEsRUFBSyxPQUFZQSxFQUFLLFVBR3hCelYsRUFBT3hmLEtBQVVpMUIsSUFJdkJwN0IsS0FBSzg2QixRQUFRajBCLEtBQUssRSxDQUlwQixNQUFNMjBCLEVBQVcvMUIsRUFBUyxFQUMxQixJQUFJMUUsRUFBSTg1QixFQUNSLEtBQU85NUIsRUFBSTBFLEdBQVEsQ0FlakIsU0FBTzFFLEVBQUl5NkIsSUFDaUIsS0FBcEJULEVBQVFILEVBQU03NUIsS0FDVSxLQUF4Qmk2QixFQUFRSixFQUFNNzVCLEVBQUksS0FDTSxLQUF4Qms2QixFQUFRTCxFQUFNNzVCLEVBQUksS0FDTSxLQUF4Qm02QixFQUFRTixFQUFNNzVCLEVBQUksTUFFeEI0a0IsRUFBT3hmLEtBQVU0MEIsRUFDakJwVixFQUFPeGYsS0FBVTYwQixFQUNqQnJWLEVBQU94ZixLQUFVODBCLEVBQ2pCdFYsRUFBT3hmLEtBQVUrMEIsRUFDakJuNkIsR0FBSyxFQU9QLEdBSEFnNkIsRUFBUUgsRUFBTTc1QixLQUdWZzZCLEVBQVEsSUFDVnBWLEVBQU94ZixLQUFVNDBCLE9BR1osR0FBdUIsTUFBVixJQUFSQSxHQUF3QixDQUNsQyxHQUFJaDZCLEdBQUswRSxFQUVQLE9BREF6RixLQUFLODZCLFFBQVEsR0FBS0MsRUFDWDUwQixFQUdULEdBREE2MEIsRUFBUUosRUFBTTc1QixLQUNTLE1BQVYsSUFBUmk2QixHQUF3QixDQUUzQmo2QixJQUNBLFEsQ0FHRixHQURBbWxCLEdBQXFCLEdBQVI2VSxJQUFpQixFQUFhLEdBQVJDLEVBQy9COVUsRUFBWSxJQUFNLENBRXBCbmxCLElBQ0EsUSxDQUVGNGtCLEVBQU94ZixLQUFVK2YsQyxNQUdaLEdBQXVCLE1BQVYsSUFBUjZVLEdBQXdCLENBQ2xDLEdBQUloNkIsR0FBSzBFLEVBRVAsT0FEQXpGLEtBQUs4NkIsUUFBUSxHQUFLQyxFQUNYNTBCLEVBR1QsR0FEQTYwQixFQUFRSixFQUFNNzVCLEtBQ1MsTUFBVixJQUFSaTZCLEdBQXdCLENBRTNCajZCLElBQ0EsUSxDQUVGLEdBQUlBLEdBQUswRSxFQUdQLE9BRkF6RixLQUFLODZCLFFBQVEsR0FBS0MsRUFDbEIvNkIsS0FBSzg2QixRQUFRLEdBQUtFLEVBQ1g3MEIsRUFHVCxHQURBODBCLEVBQVFMLEVBQU03NUIsS0FDUyxNQUFWLElBQVJrNkIsR0FBd0IsQ0FFM0JsNkIsSUFDQSxRLENBR0YsR0FEQW1sQixHQUFxQixHQUFSNlUsSUFBaUIsSUFBYyxHQUFSQyxJQUFpQixFQUFhLEdBQVJDLEVBQ3REL1UsRUFBWSxNQUFXQSxHQUFhLE9BQVVBLEdBQWEsT0FBeUIsUUFBZEEsRUFFeEUsU0FFRlAsRUFBT3hmLEtBQVUrZixDLE1BR1osR0FBdUIsTUFBVixJQUFSNlUsR0FBd0IsQ0FDbEMsR0FBSWg2QixHQUFLMEUsRUFFUCxPQURBekYsS0FBSzg2QixRQUFRLEdBQUtDLEVBQ1g1MEIsRUFHVCxHQURBNjBCLEVBQVFKLEVBQU03NUIsS0FDUyxNQUFWLElBQVJpNkIsR0FBd0IsQ0FFM0JqNkIsSUFDQSxRLENBRUYsR0FBSUEsR0FBSzBFLEVBR1AsT0FGQXpGLEtBQUs4NkIsUUFBUSxHQUFLQyxFQUNsQi82QixLQUFLODZCLFFBQVEsR0FBS0UsRUFDWDcwQixFQUdULEdBREE4MEIsRUFBUUwsRUFBTTc1QixLQUNTLE1BQVYsSUFBUms2QixHQUF3QixDQUUzQmw2QixJQUNBLFEsQ0FFRixHQUFJQSxHQUFLMEUsRUFJUCxPQUhBekYsS0FBSzg2QixRQUFRLEdBQUtDLEVBQ2xCLzZCLEtBQUs4NkIsUUFBUSxHQUFLRSxFQUNsQmg3QixLQUFLODZCLFFBQVEsR0FBS0csRUFDWDkwQixFQUdULEdBREErMEIsRUFBUU4sRUFBTTc1QixLQUNTLE1BQVYsSUFBUm02QixHQUF3QixDQUUzQm42QixJQUNBLFEsQ0FHRixHQURBbWxCLEdBQXFCLEVBQVI2VSxJQUFpQixJQUFjLEdBQVJDLElBQWlCLElBQWMsR0FBUkMsSUFBaUIsRUFBYSxHQUFSQyxFQUM3RWhWLEVBQVksT0FBWUEsRUFBWSxRQUV0QyxTQUVGUCxFQUFPeGYsS0FBVStmLEMsRUFLckIsT0FBTy9mLENBQ1QsRSw2aEJDblZGLGVBQ0EsUUFnQk1zMUIsRUFBd0QsQ0FDNURDLE1BQU8sRUFBQUMsYUFBYUMsTUFDcEJDLE1BQU8sRUFBQUYsYUFBYUcsTUFDcEJDLEtBQU0sRUFBQUosYUFBYUssS0FDbkI1ckIsS0FBTSxFQUFBdXJCLGFBQWFNLEtBQ25CeGtCLE1BQU8sRUFBQWtrQixhQUFhTyxNQUNwQkMsSUFBSyxFQUFBUixhQUFhUyxLQUtiLElBaUVIQyxFQWpFU0MsRUFBVSxhQUFoQixjQUF5QixFQUFBbjlCLFdBSTlCLFlBQVdvOUIsR0FBMkIsT0FBT3Y4QixLQUFLdzhCLFNBQVcsQ0FFN0QsV0FBQXA5QixDQUNtQixHQUVqQkssUUFGa0MsS0FBQUQsZ0JBQUFBLEVBSjVCLEtBQUFnOUIsVUFBMEIsRUFBQWIsYUFBYVMsSUFPN0NwOEIsS0FBS3k4QixrQkFDTHo4QixLQUFLaUIsU0FBU2pCLEtBQUtSLGdCQUFnQms5Qix1QkFBdUIsWUFBWSxJQUFNMThCLEtBQUt5OEIscUJBR2pGSixFQUFjcjhCLElBQ2hCLENBRVEsZUFBQXk4QixHQUNOejhCLEtBQUt3OEIsVUFBWWYsRUFBcUJ6N0IsS0FBS1IsZ0JBQWdCa0gsV0FBVzYxQixTQUN4RSxDQUVRLHVCQUFBSSxDQUF3QkMsR0FDOUIsSUFBSyxJQUFJNzdCLEVBQUksRUFBR0EsRUFBSTY3QixFQUFlbjNCLE9BQVExRSxJQUNSLG1CQUF0QjY3QixFQUFlNzdCLEtBQ3hCNjdCLEVBQWU3N0IsR0FBSzY3QixFQUFlNzdCLEtBR3pDLENBRVEsSUFBQTg3QixDQUFLM2xCLEVBQWU0bEIsRUFBaUJGLEdBQzNDNThCLEtBQUsyOEIsd0JBQXdCQyxHQUM3QjFsQixFQUFLMmQsS0FBSzlrQixTQUFVL1AsS0FBS1IsZ0JBQWdCb1UsUUFBUW1wQixPQUFTLEdBakMzQyxjQWlDOERELEtBQVlGLEVBQzNGLENBRU8sS0FBQWxCLENBQU1vQixLQUFvQkYsR0FDM0I1OEIsS0FBS3c4QixXQUFhLEVBQUFiLGFBQWFDLE9BQ2pDNTdCLEtBQUs2OEIsS0FBSzc4QixLQUFLUixnQkFBZ0JvVSxRQUFRbXBCLFFBQVFyQixNQUFNcEUsS0FBS3QzQixLQUFLUixnQkFBZ0JvVSxRQUFRbXBCLFNBQVdodEIsUUFBUUMsSUFBSzhzQixFQUFTRixFQUU1SCxDQUVPLEtBQUFmLENBQU1pQixLQUFvQkYsR0FDM0I1OEIsS0FBS3c4QixXQUFhLEVBQUFiLGFBQWFHLE9BQ2pDOTdCLEtBQUs2OEIsS0FBSzc4QixLQUFLUixnQkFBZ0JvVSxRQUFRbXBCLFFBQVFsQixNQUFNdkUsS0FBS3QzQixLQUFLUixnQkFBZ0JvVSxRQUFRbXBCLFNBQVdodEIsUUFBUUMsSUFBSzhzQixFQUFTRixFQUU1SCxDQUVPLElBQUFiLENBQUtlLEtBQW9CRixHQUMxQjU4QixLQUFLdzhCLFdBQWEsRUFBQWIsYUFBYUssTUFDakNoOEIsS0FBSzY4QixLQUFLNzhCLEtBQUtSLGdCQUFnQm9VLFFBQVFtcEIsUUFBUWhCLEtBQUt6RSxLQUFLdDNCLEtBQUtSLGdCQUFnQm9VLFFBQVFtcEIsU0FBV2h0QixRQUFRZ3NCLEtBQU1lLEVBQVNGLEVBRTVILENBRU8sSUFBQXhzQixDQUFLMHNCLEtBQW9CRixHQUMxQjU4QixLQUFLdzhCLFdBQWEsRUFBQWIsYUFBYU0sTUFDakNqOEIsS0FBSzY4QixLQUFLNzhCLEtBQUtSLGdCQUFnQm9VLFFBQVFtcEIsUUFBUTNzQixLQUFLa25CLEtBQUt0M0IsS0FBS1IsZ0JBQWdCb1UsUUFBUW1wQixTQUFXaHRCLFFBQVFLLEtBQU0wc0IsRUFBU0YsRUFFNUgsQ0FFTyxLQUFBbmxCLENBQU1xbEIsS0FBb0JGLEdBQzNCNThCLEtBQUt3OEIsV0FBYSxFQUFBYixhQUFhTyxPQUNqQ2w4QixLQUFLNjhCLEtBQUs3OEIsS0FBS1IsZ0JBQWdCb1UsUUFBUW1wQixRQUFRdGxCLE1BQU02ZixLQUFLdDNCLEtBQUtSLGdCQUFnQm9VLFFBQVFtcEIsU0FBV2h0QixRQUFRMEgsTUFBT3FsQixFQUFTRixFQUU5SCxHLGFBOURXTixFQUFVLEdBT2xCLE1BQUFVLGtCQVBRVixHQWtFYiwwQkFBK0JTLEdBQzdCVixFQUFjVSxDQUNoQixFQUtBLHFCQUEwQkUsRUFBY3RTLEVBQWF1UyxHQUNuRCxHQUFnQyxtQkFBckJBLEVBQVd4c0IsTUFDcEIsTUFBTSxJQUFJYixNQUFNLGlCQUVsQixNQUNNc3RCLEVBQUtELEVBQVd4c0IsTUFDdEJ3c0IsRUFBZ0IsTUFBSSxZQUFhN1ksR0FFL0IsR0FBSWdZLEVBQVlFLFdBQWEsRUFBQVosYUFBYUMsTUFDeEMsT0FBT3VCLEVBQUdDLE1BQU1wOUIsS0FBTXFrQixHQUd4QmdZLEVBQVlYLE1BQU0saUJBQWlCeUIsRUFBR0UsUUFBUWhaLEVBQUtoQixLQUFJL1osR0FBS2cwQixLQUFLQyxVQUFVajBCLEtBQUkwbEIsS0FBSyxVQUNwRixNQUFNMVosRUFBUzZuQixFQUFHQyxNQUFNcDlCLEtBQU1xa0IsR0FFOUIsT0FEQWdZLEVBQVlYLE1BQU0saUJBQWlCeUIsRUFBR0UsY0FBZS9uQixHQUM5Q0EsQ0FDVCxDQUNGLEMsbUlDOUdBLE1BQU1rb0IsRUFBWSxZQUNaQyxFQUFrQixrQkFFWCxFQUFBQyxnQkFBd0QsSUFBSWhiLElBRXpFLGtDQUF1Q2liLEdBQ3JDLE9BQU9BLEVBQUtGLElBQW9CLEVBQ2xDLEVBRUEsMkJBQW1DL2tCLEdBQ2pDLEdBQUksRUFBQWdsQixnQkFBZ0JFLElBQUlsbEIsR0FDdEIsT0FBTyxFQUFBZ2xCLGdCQUFnQnRvQixJQUFJc0QsR0FHN0IsTUFBTW1sQixFQUFpQixTQUFVbFksRUFBa0JnRixFQUFhdEwsR0FDOUQsR0FBeUIsSUFBckJ5ZSxVQUFVcjRCLE9BQ1osTUFBTSxJQUFJb0ssTUFBTSxxRUFZdEIsU0FBZ0M2SSxFQUFjaU4sRUFBa0J0RyxHQUN6RHNHLEVBQWU2WCxLQUFlN1gsRUFDaENBLEVBQWU4WCxHQUFpQnhlLEtBQUssQ0FBRXZHLEtBQUkyRyxXQUUzQ3NHLEVBQWU4WCxHQUFtQixDQUFDLENBQUUva0IsS0FBSTJHLFVBQ3pDc0csRUFBZTZYLEdBQWE3WCxFQUVqQyxDQWhCSW9ZLENBQXVCRixFQUFXbFksRUFBUXRHLEVBQzVDLEVBS0EsT0FIQXdlLEVBQVV4a0IsU0FBVyxJQUFNWCxFQUUzQixFQUFBZ2xCLGdCQUFnQjkxQixJQUFJOFEsRUFBSW1sQixHQUNqQkEsQ0FDVCxDLDZRQy9CQSxlQXVJQSxJQUFZbEMsRUFwSUMsRUFBQXFDLGdCQUFpQixJQUFBQyxpQkFBZ0MsaUJBaUJqRCxFQUFBQyxtQkFBb0IsSUFBQUQsaUJBQW1DLG9CQWdDdkQsRUFBQUUsY0FBZSxJQUFBRixpQkFBOEIsZUFzQzdDLEVBQUFHLGlCQUFrQixJQUFBSCxpQkFBaUMsa0JBb0NuRCxFQUFBSSx1QkFBd0IsSUFBQUosaUJBQXVDLHdCQVM1RSxTQUFZdEMsR0FDVixxQkFDQSxxQkFDQSxtQkFDQSxtQkFDQSxxQkFDQSxnQkFDRCxDQVBELENBQVlBLElBQVksZUFBWkEsRUFBWSxLQVNYLEVBQUEyQyxhQUFjLElBQUFMLGlCQUE2QixjQWEzQyxFQUFBakIsaUJBQWtCLElBQUFpQixpQkFBaUMsa0JBdUhuRCxFQUFBTSxpQkFBa0IsSUFBQU4saUJBQWlDLGtCQXVDbkQsRUFBQU8saUJBQWtCLElBQUFQLGlCQUFpQyxrQkErQm5ELEVBQUFRLG9CQUFxQixJQUFBUixpQkFBb0Msb0IsR0NqV2xFUyxFQUEyQixDQUFDLEVBR2hDLFNBQVNDLEVBQW9CQyxHQUU1QixJQUFJQyxFQUFlSCxFQUF5QkUsR0FDNUMsUUFBcUIzK0IsSUFBakI0K0IsRUFDSCxPQUFPQSxFQUFheGdDLFFBR3JCLElBQUlDLEVBQVNvZ0MsRUFBeUJFLEdBQVksQ0FHakR2Z0MsUUFBUyxDQUFDLEdBT1gsT0FIQXlnQyxFQUFvQkYsR0FBVS9KLEtBQUt2MkIsRUFBT0QsUUFBU0MsRUFBUUEsRUFBT0QsUUFBU3NnQyxHQUdwRXJnQyxFQUFPRCxPQUNmLEMsa0dDYkEsZUFDQSxTQUNBLFNBR0EsU0FDQSxTQUVBLE1BQWEwZ0MsVUFBbUIsRUFBQTUvQixXQWE5QixXQUFBQyxDQUNVNC9CLEdBRVIsR0FBSSxFQUFBN0ksV0FBWSxJQUFBOEksb0JBQXFCLEdBQUksQ0FFdkMsTUFBTXh2QixFQUFvQixDQUN4QkMsV0FBVyxFQUNYQyxPQUFPLEVBQ1AzQyx1QkFBdUIsR0FHekIsSUFEV21FLFNBQVMzQixjQUFjLFVBQVVJLFdBQVcsU0FBVUgsR0FFL0QsTUFBTSxJQUFJSSxNQUFNLGtELENBR3BCcFEsUUFkUSxLQUFBdS9CLHVCQUFBQSxFQVZPLEtBQUFweEIsc0JBQXdCNU4sS0FBS2lCLFNBQVMsSUFBSSxFQUFBNE0sY0FDM0MsS0FBQUMscUJBQXVCOU4sS0FBSzROLHNCQUFzQkcsTUFDakQsS0FBQUMseUJBQTJCaE8sS0FBS2lCLFNBQVMsSUFBSSxFQUFBNE0sY0FDOUMsS0FBQUksd0JBQTBCak8sS0FBS2dPLHlCQUF5QkQsTUFDdkQsS0FBQUcsNEJBQThCbE8sS0FBS2lCLFNBQVMsSUFBSSxFQUFBNE0sY0FDakQsS0FBQU0sMkJBQTZCbk8sS0FBS2tPLDRCQUE0QkgsTUFDN0QsS0FBQU8sZUFBaUJ0TyxLQUFLaUIsU0FBUyxJQUFJLEVBQUE0TSxjQUNwQyxLQUFBVSxjQUFnQnZPLEtBQUtzTyxlQUFlUCxLQWtCcEQsQ0FFTyxRQUFBbXhCLENBQVNuNEIsR0FDZCxNQUFNbVksRUFBUW5ZLEVBQWlCNEgsTUFDL0IsSUFBSzVILEVBQVNzZSxRQUVaLFlBREFybEIsS0FBS2lCLFNBQVNpZSxFQUFLaWdCLFlBQVcsSUFBTW4vQixLQUFLay9CLFNBQVNuNEIsTUFJcEQvRyxLQUFLWCxVQUFZMEgsRUFDakIsTUFBTXE0QixFQUE0QmxnQixFQUFLa2dCLFlBQ2pDempCLEVBQWtDdUQsRUFBS3ZELGVBRXZDMGpCLEVBQWFuZ0IsRUFDYm9nQixFQUFnQ0QsRUFBV0UsZUFDM0NDLEVBQWtESCxFQUFXMXlCLHdCQUM3RDh5QixFQUFvQ0osRUFBV3p5QixpQkFDL0M4TyxFQUEwQzJqQixFQUFXeHlCLG9CQUNyRDZ5QixFQUF3Q0wsRUFBV3R5QixtQkFDbkQ0eUIsRUFBMEJOLEVBQVdPLFlBQ3JDaGtCLEVBQThCeWpCLEVBQVdwMkIsZUFJL0MsSUFBQTQyQixnQkFBZUYsR0FFZjMvQixLQUFLOC9CLFVBQVk5L0IsS0FBS2lCLFNBQVMsSUFBSSxFQUFBeUwsY0FDakMzRixFQUNBeTRCLEVBQ0FDLEVBQ0EvakIsRUFDQTBqQixFQUNBTSxFQUNBL2pCLEVBQ0FDLEVBQ0E1YixLQUFLZy9CLHlCQUVQaC9CLEtBQUtpQixVQUFTLElBQUE2UixjQUFhOVMsS0FBSzgvQixVQUFVdnhCLGNBQWV2TyxLQUFLc08saUJBQzlEdE8sS0FBS2lCLFVBQVMsSUFBQTZSLGNBQWE5UyxLQUFLOC9CLFVBQVVoeUIscUJBQXNCOU4sS0FBSzROLHdCQUNyRTVOLEtBQUtpQixVQUFTLElBQUE2UixjQUFhOVMsS0FBSzgvQixVQUFVN3hCLHdCQUF5QmpPLEtBQUtnTywyQkFDeEVoTyxLQUFLaUIsVUFBUyxJQUFBNlIsY0FBYTlTLEtBQUs4L0IsVUFBVTN4QiwyQkFBNEJuTyxLQUFLa08sOEJBQzNFb3hCLEVBQWNTLFlBQVkvL0IsS0FBSzgvQixXQUUvQjkvQixLQUFLaUIsVUFBUyxJQUFBQyxlQUFhLEtBQ3pCLE1BQU1vK0IsRUFBaUN0L0IsS0FBS1gsVUFBa0JzUCxNQUFNNHdCLGVBQ3BFRCxFQUFjUyxZQUFhLy9CLEtBQUtYLFVBQWtCc1AsTUFBTXF4QixtQkFDeERWLEVBQWM5NkIsYUFBYXVDLEVBQVN4QixLQUFNd0IsRUFBU0UsS0FBSyxJQUU1RCxDQUVBLGdCQUFXeUssR0FDVCxPQUFPMVIsS0FBSzgvQixXQUFXcHVCLFlBQ3pCLENBRU8saUJBQUF1QixHQUNMalQsS0FBSzgvQixXQUFXN3NCLG1CQUNsQixFQXJGRixjIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vV2ViZ2xBZGRvbi93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vV2ViZ2xBZGRvbi9zcmMvR2x5cGhSZW5kZXJlci50cyIsIndlYnBhY2s6Ly9XZWJnbEFkZG9uL3NyYy9SZWN0YW5nbGVSZW5kZXJlci50cyIsIndlYnBhY2s6Ly9XZWJnbEFkZG9uL3NyYy9SZW5kZXJNb2RlbC50cyIsIndlYnBhY2s6Ly9XZWJnbEFkZG9uL3NyYy9XZWJnbFJlbmRlcmVyLnRzIiwid2VicGFjazovL1dlYmdsQWRkb24vc3JjL1dlYmdsVXRpbHMudHMiLCJ3ZWJwYWNrOi8vV2ViZ2xBZGRvbi9zcmMvcmVuZGVyTGF5ZXIvQmFzZVJlbmRlckxheWVyLnRzIiwid2VicGFjazovL1dlYmdsQWRkb24vc3JjL3JlbmRlckxheWVyL0xpbmtSZW5kZXJMYXllci50cyIsIndlYnBhY2s6Ly9XZWJnbEFkZG9uL3NyYy9icm93c2VyL0xpZmVjeWNsZS50cyIsIndlYnBhY2s6Ly9XZWJnbEFkZG9uL3NyYy9icm93c2VyL3JlbmRlcmVyL3NoYXJlZC9DZWxsQ29sb3JSZXNvbHZlci50cyIsIndlYnBhY2s6Ly9XZWJnbEFkZG9uL3NyYy9icm93c2VyL3JlbmRlcmVyL3NoYXJlZC9DaGFyQXRsYXNDYWNoZS50cyIsIndlYnBhY2s6Ly9XZWJnbEFkZG9uL3NyYy9icm93c2VyL3JlbmRlcmVyL3NoYXJlZC9DaGFyQXRsYXNVdGlscy50cyIsIndlYnBhY2s6Ly9XZWJnbEFkZG9uL3NyYy9icm93c2VyL3JlbmRlcmVyL3NoYXJlZC9Db25zdGFudHMudHMiLCJ3ZWJwYWNrOi8vV2ViZ2xBZGRvbi9zcmMvYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvQ3Vyc29yQmxpbmtTdGF0ZU1hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vV2ViZ2xBZGRvbi9zcmMvYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvQ3VzdG9tR2x5cGhzLnRzIiwid2VicGFjazovL1dlYmdsQWRkb24vc3JjL2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL0RldmljZVBpeGVsT2JzZXJ2ZXIudHMiLCJ3ZWJwYWNrOi8vV2ViZ2xBZGRvbi9zcmMvYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvUmVuZGVyZXJVdGlscy50cyIsIndlYnBhY2s6Ly9XZWJnbEFkZG9uL3NyYy9icm93c2VyL3JlbmRlcmVyL3NoYXJlZC9TZWxlY3Rpb25SZW5kZXJNb2RlbC50cyIsIndlYnBhY2s6Ly9XZWJnbEFkZG9uL3NyYy9icm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UZXh0dXJlQXRsYXMudHMiLCJ3ZWJwYWNrOi8vV2ViZ2xBZGRvbi9zcmMvY29tbW9uL0NvbG9yLnRzIiwid2VicGFjazovL1dlYmdsQWRkb24vc3JjL2NvbW1vbi9FdmVudEVtaXR0ZXIudHMiLCJ3ZWJwYWNrOi8vV2ViZ2xBZGRvbi9zcmMvY29tbW9uL0xpZmVjeWNsZS50cyIsIndlYnBhY2s6Ly9XZWJnbEFkZG9uL3NyYy9jb21tb24vTXVsdGlLZXlNYXAudHMiLCJ3ZWJwYWNrOi8vV2ViZ2xBZGRvbi9zcmMvY29tbW9uL1BsYXRmb3JtLnRzIiwid2VicGFjazovL1dlYmdsQWRkb24vc3JjL2NvbW1vbi9UYXNrUXVldWUudHMiLCJ3ZWJwYWNrOi8vV2ViZ2xBZGRvbi9zcmMvY29tbW9uL2J1ZmZlci9BdHRyaWJ1dGVEYXRhLnRzIiwid2VicGFjazovL1dlYmdsQWRkb24vc3JjL2NvbW1vbi9idWZmZXIvQ2VsbERhdGEudHMiLCJ3ZWJwYWNrOi8vV2ViZ2xBZGRvbi9zcmMvY29tbW9uL2J1ZmZlci9Db25zdGFudHMudHMiLCJ3ZWJwYWNrOi8vV2ViZ2xBZGRvbi9zcmMvY29tbW9uL2lucHV0L1RleHREZWNvZGVyLnRzIiwid2VicGFjazovL1dlYmdsQWRkb24vc3JjL2NvbW1vbi9zZXJ2aWNlcy9Mb2dTZXJ2aWNlLnRzIiwid2VicGFjazovL1dlYmdsQWRkb24vc3JjL2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnkudHMiLCJ3ZWJwYWNrOi8vV2ViZ2xBZGRvbi9zcmMvY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzLnRzIiwid2VicGFjazovL1dlYmdsQWRkb24vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vV2ViZ2xBZGRvbi9zcmMvV2ViZ2xBZGRvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJXZWJnbEFkZG9uXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIldlYmdsQWRkb25cIl0gPSBmYWN0b3J5KCk7XG59KShzZWxmLCAoKSA9PiB7XG5yZXR1cm4gIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBhbGxvd1Jlc2NhbGluZywgdGhyb3dJZkZhbHN5IH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvUmVuZGVyZXJVdGlscyc7XG5pbXBvcnQgeyBUZXh0dXJlQXRsYXMgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UZXh0dXJlQXRsYXMnO1xuaW1wb3J0IHsgSVJhc3Rlcml6ZWRHbHlwaCwgSVJlbmRlckRpbWVuc2lvbnMsIElUZXh0dXJlQXRsYXMgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UeXBlcyc7XG5pbXBvcnQgeyBOVUxMX0NFTExfQ09ERSB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ29uc3RhbnRzJztcbmltcG9ydCB7IERpc3Bvc2FibGUsIHRvRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgVGVybWluYWwgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuaW1wb3J0IHsgSVJlbmRlck1vZGVsLCBJV2ViR0wyUmVuZGVyaW5nQ29udGV4dCwgSVdlYkdMVmVydGV4QXJyYXlPYmplY3QgfSBmcm9tICcuL1R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZVByb2dyYW0sIEdMVGV4dHVyZSwgUFJPSkVDVElPTl9NQVRSSVggfSBmcm9tICcuL1dlYmdsVXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBJT3B0aW9uc1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG5pbnRlcmZhY2UgSVZlcnRpY2VzIHtcbiAgYXR0cmlidXRlczogRmxvYXQzMkFycmF5O1xuICAvKipcbiAgICogVGhlc2UgYnVmZmVycyBhcmUgdGhlIG9uZXMgdXNlZCB0byBiaW5kIHRvIFdlYkdMLCB0aGUgcmVhc29uIHRoZXJlIGFyZVxuICAgKiBtdWx0aXBsZSBpcyB0byBhbGxvdyBkb3VibGUgYnVmZmVyaW5nIHRvIHdvcmsgYXMgeW91IGNhbm5vdCBtb2RpZnkgdGhlXG4gICAqIGJ1ZmZlciB3aGlsZSBpdCdzIGJlaW5nIHVzZWQgYnkgdGhlIEdQVS4gSGF2aW5nIG11bHRpcGxlIGxldHMgdXMgc3RhcnRcbiAgICogd29ya2luZyBvbiB0aGUgbmV4dCBmcmFtZS5cbiAgICovXG4gIGF0dHJpYnV0ZXNCdWZmZXJzOiBGbG9hdDMyQXJyYXlbXTtcbiAgY291bnQ6IG51bWJlcjtcbn1cblxuY29uc3QgZW51bSBWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMge1xuICBVTklUX1FVQUQgPSAwLFxuICBDRUxMX1BPU0lUSU9OID0gMSxcbiAgT0ZGU0VUID0gMixcbiAgU0laRSA9IDMsXG4gIFRFWFBBR0UgPSA0LFxuICBURVhDT09SRCA9IDUsXG4gIFRFWFNJWkUgPSA2XG59XG5cbmNvbnN0IHZlcnRleFNoYWRlclNvdXJjZSA9IGAjdmVyc2lvbiAzMDAgZXNcbmxheW91dCAobG9jYXRpb24gPSAke1ZlcnRleEF0dHJpYkxvY2F0aW9ucy5VTklUX1FVQUR9KSBpbiB2ZWMyIGFfdW5pdHF1YWQ7XG5sYXlvdXQgKGxvY2F0aW9uID0gJHtWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuQ0VMTF9QT1NJVElPTn0pIGluIHZlYzIgYV9jZWxscG9zO1xubGF5b3V0IChsb2NhdGlvbiA9ICR7VmVydGV4QXR0cmliTG9jYXRpb25zLk9GRlNFVH0pIGluIHZlYzIgYV9vZmZzZXQ7XG5sYXlvdXQgKGxvY2F0aW9uID0gJHtWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuU0laRX0pIGluIHZlYzIgYV9zaXplO1xubGF5b3V0IChsb2NhdGlvbiA9ICR7VmVydGV4QXR0cmliTG9jYXRpb25zLlRFWFBBR0V9KSBpbiBmbG9hdCBhX3RleHBhZ2U7XG5sYXlvdXQgKGxvY2F0aW9uID0gJHtWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuVEVYQ09PUkR9KSBpbiB2ZWMyIGFfdGV4Y29vcmQ7XG5sYXlvdXQgKGxvY2F0aW9uID0gJHtWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuVEVYU0laRX0pIGluIHZlYzIgYV90ZXhzaXplO1xuXG51bmlmb3JtIG1hdDQgdV9wcm9qZWN0aW9uO1xudW5pZm9ybSB2ZWMyIHVfcmVzb2x1dGlvbjtcblxub3V0IHZlYzIgdl90ZXhjb29yZDtcbmZsYXQgb3V0IGludCB2X3RleHBhZ2U7XG5cbnZvaWQgbWFpbigpIHtcbiAgdmVjMiB6ZXJvVG9PbmUgPSAoYV9vZmZzZXQgLyB1X3Jlc29sdXRpb24pICsgYV9jZWxscG9zICsgKGFfdW5pdHF1YWQgKiBhX3NpemUpO1xuICBnbF9Qb3NpdGlvbiA9IHVfcHJvamVjdGlvbiAqIHZlYzQoemVyb1RvT25lLCAwLjAsIDEuMCk7XG4gIHZfdGV4cGFnZSA9IGludChhX3RleHBhZ2UpO1xuICB2X3RleGNvb3JkID0gYV90ZXhjb29yZCArIGFfdW5pdHF1YWQgKiBhX3RleHNpemU7XG59YDtcblxuZnVuY3Rpb24gY3JlYXRlRnJhZ21lbnRTaGFkZXJTb3VyY2UobWF4RnJhZ21lbnRTaGFkZXJUZXh0dXJlVW5pdHM6IG51bWJlcik6IHN0cmluZyB7XG4gIGxldCB0ZXh0dXJlQ29uZGl0aW9uYWxzID0gJyc7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgbWF4RnJhZ21lbnRTaGFkZXJUZXh0dXJlVW5pdHM7IGkrKykge1xuICAgIHRleHR1cmVDb25kaXRpb25hbHMgKz0gYCBlbHNlIGlmICh2X3RleHBhZ2UgPT0gJHtpfSkgeyBvdXRDb2xvciA9IHRleHR1cmUodV90ZXh0dXJlWyR7aX1dLCB2X3RleGNvb3JkKTsgfWA7XG4gIH1cbiAgcmV0dXJuIChgI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbG93cCBmbG9hdDtcblxuaW4gdmVjMiB2X3RleGNvb3JkO1xuZmxhdCBpbiBpbnQgdl90ZXhwYWdlO1xuXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmVbJHttYXhGcmFnbWVudFNoYWRlclRleHR1cmVVbml0c31dO1xuXG5vdXQgdmVjNCBvdXRDb2xvcjtcblxudm9pZCBtYWluKCkge1xuICBpZiAodl90ZXhwYWdlID09IDApIHtcbiAgICBvdXRDb2xvciA9IHRleHR1cmUodV90ZXh0dXJlWzBdLCB2X3RleGNvb3JkKTtcbiAgfSAke3RleHR1cmVDb25kaXRpb25hbHN9XG59YCk7XG59XG5cbmNvbnN0IElORElDRVNfUEVSX0NFTEwgPSAxMTtcbmNvbnN0IEJZVEVTX1BFUl9DRUxMID0gSU5ESUNFU19QRVJfQ0VMTCAqIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtcbmNvbnN0IENFTExfUE9TSVRJT05fSU5ESUNFUyA9IDI7XG5cbi8vIFdvcmsgdmFyaWFibGVzIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvblxubGV0ICRpID0gMDtcbmxldCAkZ2x5cGg6IElSYXN0ZXJpemVkR2x5cGggfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5sZXQgJGxlZnRDZWxsUGFkZGluZyA9IDA7XG5sZXQgJGNsaXBwZWRQaXhlbHMgPSAwO1xuXG5leHBvcnQgY2xhc3MgR2x5cGhSZW5kZXJlciBleHRlbmRzIERpc3Bvc2FibGUge1xuICBwcml2YXRlIHJlYWRvbmx5IF9wcm9ncmFtOiBXZWJHTFByb2dyYW07XG4gIHByaXZhdGUgcmVhZG9ubHkgX3ZlcnRleEFycmF5T2JqZWN0OiBJV2ViR0xWZXJ0ZXhBcnJheU9iamVjdDtcbiAgcHJpdmF0ZSByZWFkb25seSBfcHJvamVjdGlvbkxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSBfcmVzb2x1dGlvbkxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSBfdGV4dHVyZUxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSBfYXRsYXNUZXh0dXJlczogR0xUZXh0dXJlW107XG4gIHByaXZhdGUgcmVhZG9ubHkgX2F0dHJpYnV0ZXNCdWZmZXI6IFdlYkdMQnVmZmVyO1xuXG4gIHByaXZhdGUgX2F0bGFzOiBJVGV4dHVyZUF0bGFzIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9hY3RpdmVCdWZmZXI6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3ZlcnRpY2VzOiBJVmVydGljZXMgPSB7XG4gICAgY291bnQ6IDAsXG4gICAgYXR0cmlidXRlczogbmV3IEZsb2F0MzJBcnJheSgwKSxcbiAgICBhdHRyaWJ1dGVzQnVmZmVyczogW1xuICAgICAgbmV3IEZsb2F0MzJBcnJheSgwKSxcbiAgICAgIG5ldyBGbG9hdDMyQXJyYXkoMClcbiAgICBdXG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGVybWluYWw6IFRlcm1pbmFsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2dsOiBJV2ViR0wyUmVuZGVyaW5nQ29udGV4dCxcbiAgICBwcml2YXRlIF9kaW1lbnNpb25zOiBJUmVuZGVyRGltZW5zaW9ucyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBjb25zdCBnbCA9IHRoaXMuX2dsO1xuXG4gICAgaWYgKFRleHR1cmVBdGxhcy5tYXhBdGxhc1BhZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFR5cGljYWxseSA4IG9yIDE2XG4gICAgICBUZXh0dXJlQXRsYXMubWF4QXRsYXNQYWdlcyA9IE1hdGgubWluKDMyLCB0aHJvd0lmRmFsc3koZ2wuZ2V0UGFyYW1ldGVyKGdsLk1BWF9URVhUVVJFX0lNQUdFX1VOSVRTKSBhcyBudW1iZXIgfCBudWxsKSk7XG4gICAgICAvLyBBbG1vc3QgYWxsIGNsaWVudHMgd2lsbCBzdXBwb3J0ID49IDQwOTZcbiAgICAgIFRleHR1cmVBdGxhcy5tYXhUZXh0dXJlU2l6ZSA9IHRocm93SWZGYWxzeShnbC5nZXRQYXJhbWV0ZXIoZ2wuTUFYX1RFWFRVUkVfU0laRSkgYXMgbnVtYmVyIHwgbnVsbCk7XG4gICAgfVxuXG4gICAgdGhpcy5fcHJvZ3JhbSA9IHRocm93SWZGYWxzeShjcmVhdGVQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXJTb3VyY2UsIGNyZWF0ZUZyYWdtZW50U2hhZGVyU291cmNlKFRleHR1cmVBdGxhcy5tYXhBdGxhc1BhZ2VzKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodG9EaXNwb3NhYmxlKCgpID0+IGdsLmRlbGV0ZVByb2dyYW0odGhpcy5fcHJvZ3JhbSkpKTtcblxuICAgIC8vIFVuaWZvcm0gbG9jYXRpb25zXG4gICAgdGhpcy5fcHJvamVjdGlvbkxvY2F0aW9uID0gdGhyb3dJZkZhbHN5KGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLl9wcm9ncmFtLCAndV9wcm9qZWN0aW9uJykpO1xuICAgIHRoaXMuX3Jlc29sdXRpb25Mb2NhdGlvbiA9IHRocm93SWZGYWxzeShnbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5fcHJvZ3JhbSwgJ3VfcmVzb2x1dGlvbicpKTtcbiAgICB0aGlzLl90ZXh0dXJlTG9jYXRpb24gPSB0aHJvd0lmRmFsc3koZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMuX3Byb2dyYW0sICd1X3RleHR1cmUnKSk7XG5cbiAgICAvLyBDcmVhdGUgYW5kIHNldCB0aGUgdmVydGV4IGFycmF5IG9iamVjdFxuICAgIHRoaXMuX3ZlcnRleEFycmF5T2JqZWN0ID0gZ2wuY3JlYXRlVmVydGV4QXJyYXkoKTtcbiAgICBnbC5iaW5kVmVydGV4QXJyYXkodGhpcy5fdmVydGV4QXJyYXlPYmplY3QpO1xuXG4gICAgLy8gU2V0dXAgYV91bml0cXVhZCwgdGhpcyBkZWZpbmVzIHRoZSA0IHZlcnRpY2VzIG9mIGEgcmVjdGFuZ2xlXG4gICAgY29uc3QgdW5pdFF1YWRWZXJ0aWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoWzAsIDAsIDEsIDAsIDAsIDEsIDEsIDFdKTtcbiAgICBjb25zdCB1bml0UXVhZFZlcnRpY2VzQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgdGhpcy5yZWdpc3Rlcih0b0Rpc3Bvc2FibGUoKCkgPT4gZ2wuZGVsZXRlQnVmZmVyKHVuaXRRdWFkVmVydGljZXNCdWZmZXIpKSk7XG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHVuaXRRdWFkVmVydGljZXNCdWZmZXIpO1xuICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCB1bml0UXVhZFZlcnRpY2VzLCBnbC5TVEFUSUNfRFJBVyk7XG4gICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoVmVydGV4QXR0cmliTG9jYXRpb25zLlVOSVRfUVVBRCk7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuVU5JVF9RVUFELCAyLCB0aGlzLl9nbC5GTE9BVCwgZmFsc2UsIDAsIDApO1xuXG4gICAgLy8gU2V0dXAgdGhlIHVuaXQgcXVhZCBlbGVtZW50IGFycmF5IGJ1ZmZlciwgdGhpcyBwb2ludHMgdG8gaW5kaWNlcyBpblxuICAgIC8vIHVuaXRRdWFkVmVydGljZXMgdG8gYWxsb3cgaXMgdG8gZHJhdyAyIHRyaWFuZ2xlcyBmcm9tIHRoZSB2ZXJ0aWNlcyB2aWEgYVxuICAgIC8vIHRyaWFuZ2xlIHN0cmlwXG4gICAgY29uc3QgdW5pdFF1YWRFbGVtZW50SW5kaWNlcyA9IG5ldyBVaW50OEFycmF5KFswLCAxLCAyLCAzXSk7XG4gICAgY29uc3QgZWxlbWVudEluZGljZXNCdWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiBnbC5kZWxldGVCdWZmZXIoZWxlbWVudEluZGljZXNCdWZmZXIpKSk7XG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgZWxlbWVudEluZGljZXNCdWZmZXIpO1xuICAgIGdsLmJ1ZmZlckRhdGEoZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHVuaXRRdWFkRWxlbWVudEluZGljZXMsIGdsLlNUQVRJQ19EUkFXKTtcblxuICAgIC8vIFNldHVwIGF0dHJpYnV0ZXNcbiAgICB0aGlzLl9hdHRyaWJ1dGVzQnVmZmVyID0gdGhyb3dJZkZhbHN5KGdsLmNyZWF0ZUJ1ZmZlcigpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiBnbC5kZWxldGVCdWZmZXIodGhpcy5fYXR0cmlidXRlc0J1ZmZlcikpKTtcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgdGhpcy5fYXR0cmlidXRlc0J1ZmZlcik7XG4gICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoVmVydGV4QXR0cmliTG9jYXRpb25zLk9GRlNFVCk7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuT0ZGU0VULCAyLCBnbC5GTE9BVCwgZmFsc2UsIEJZVEVTX1BFUl9DRUxMLCAwKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJEaXZpc29yKFZlcnRleEF0dHJpYkxvY2F0aW9ucy5PRkZTRVQsIDEpO1xuICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KFZlcnRleEF0dHJpYkxvY2F0aW9ucy5TSVpFKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKFZlcnRleEF0dHJpYkxvY2F0aW9ucy5TSVpFLCAyLCBnbC5GTE9BVCwgZmFsc2UsIEJZVEVTX1BFUl9DRUxMLCAyICogRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJEaXZpc29yKFZlcnRleEF0dHJpYkxvY2F0aW9ucy5TSVpFLCAxKTtcbiAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuVEVYUEFHRSk7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuVEVYUEFHRSwgMSwgZ2wuRkxPQVQsIGZhbHNlLCBCWVRFU19QRVJfQ0VMTCwgNCAqIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7XG4gICAgZ2wudmVydGV4QXR0cmliRGl2aXNvcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuVEVYUEFHRSwgMSk7XG4gICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoVmVydGV4QXR0cmliTG9jYXRpb25zLlRFWENPT1JEKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKFZlcnRleEF0dHJpYkxvY2F0aW9ucy5URVhDT09SRCwgMiwgZ2wuRkxPQVQsIGZhbHNlLCBCWVRFU19QRVJfQ0VMTCwgNSAqIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7XG4gICAgZ2wudmVydGV4QXR0cmliRGl2aXNvcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuVEVYQ09PUkQsIDEpO1xuICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KFZlcnRleEF0dHJpYkxvY2F0aW9ucy5URVhTSVpFKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKFZlcnRleEF0dHJpYkxvY2F0aW9ucy5URVhTSVpFLCAyLCBnbC5GTE9BVCwgZmFsc2UsIEJZVEVTX1BFUl9DRUxMLCA3ICogRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJEaXZpc29yKFZlcnRleEF0dHJpYkxvY2F0aW9ucy5URVhTSVpFLCAxKTtcbiAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuQ0VMTF9QT1NJVElPTik7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuQ0VMTF9QT1NJVElPTiwgMiwgZ2wuRkxPQVQsIGZhbHNlLCBCWVRFU19QRVJfQ0VMTCwgOSAqIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7XG4gICAgZ2wudmVydGV4QXR0cmliRGl2aXNvcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuQ0VMTF9QT1NJVElPTiwgMSk7XG5cbiAgICAvLyBTZXR1cCBzdGF0aWMgdW5pZm9ybXNcbiAgICBnbC51c2VQcm9ncmFtKHRoaXMuX3Byb2dyYW0pO1xuICAgIGNvbnN0IHRleHR1cmVVbml0cyA9IG5ldyBJbnQzMkFycmF5KFRleHR1cmVBdGxhcy5tYXhBdGxhc1BhZ2VzKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IFRleHR1cmVBdGxhcy5tYXhBdGxhc1BhZ2VzOyBpKyspIHtcbiAgICAgIHRleHR1cmVVbml0c1tpXSA9IGk7XG4gICAgfVxuICAgIGdsLnVuaWZvcm0xaXYodGhpcy5fdGV4dHVyZUxvY2F0aW9uLCB0ZXh0dXJlVW5pdHMpO1xuICAgIGdsLnVuaWZvcm1NYXRyaXg0ZnYodGhpcy5fcHJvamVjdGlvbkxvY2F0aW9uLCBmYWxzZSwgUFJPSkVDVElPTl9NQVRSSVgpO1xuXG4gICAgLy8gU2V0dXAgMXgxIHJlZCBwaXhlbCB0ZXh0dXJlcyBmb3IgYWxsIHBvdGVudGlhbCBhdGxhcyBwYWdlcywgaWYgb25lIG9mIHRoZXNlIGludmFsaWQgdGV4dHVyZXNcbiAgICAvLyBpcyBldmVyIGRyYXduIGl0IHdpbGwgc2hvdyBjaGFyYWN0ZXJzIGFzIHJlZCByZWN0YW5nbGVzLlxuICAgIHRoaXMuX2F0bGFzVGV4dHVyZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IFRleHR1cmVBdGxhcy5tYXhBdGxhc1BhZ2VzOyBpKyspIHtcbiAgICAgIGNvbnN0IGdsVGV4dHVyZSA9IG5ldyBHTFRleHR1cmUodGhyb3dJZkZhbHN5KGdsLmNyZWF0ZVRleHR1cmUoKSkpO1xuICAgICAgdGhpcy5yZWdpc3Rlcih0b0Rpc3Bvc2FibGUoKCkgPT4gZ2wuZGVsZXRlVGV4dHVyZShnbFRleHR1cmUudGV4dHVyZSkpKTtcbiAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTAgKyBpKTtcbiAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGdsVGV4dHVyZS50ZXh0dXJlKTtcbiAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIDEsIDEsIDAsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIG5ldyBVaW50OEFycmF5KFsyNTUsIDAsIDAsIDI1NV0pKTtcbiAgICAgIHRoaXMuX2F0bGFzVGV4dHVyZXNbaV0gPSBnbFRleHR1cmU7XG4gICAgfVxuXG4gICAgLy8gQWxsb3cgZHJhd2luZyBvZiB0cmFuc3BhcmVudCB0ZXh0dXJlXG4gICAgZ2wuZW5hYmxlKGdsLkJMRU5EKTtcbiAgICBnbC5ibGVuZEZ1bmMoZ2wuU1JDX0FMUEhBLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBKTtcblxuICAgIC8vIFNldCB2aWV3cG9ydFxuICAgIHRoaXMuaGFuZGxlUmVzaXplKCk7XG4gIH1cblxuICBwdWJsaWMgYmVnaW5GcmFtZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fYXRsYXMgPyB0aGlzLl9hdGxhcy5iZWdpbkZyYW1lKCkgOiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZUNlbGwoeDogbnVtYmVyLCB5OiBudW1iZXIsIGNvZGU6IG51bWJlciwgYmc6IG51bWJlciwgZmc6IG51bWJlciwgZXh0OiBudW1iZXIsIGNoYXJzOiBzdHJpbmcsIHdpZHRoOiBudW1iZXIsIGxhc3RCZzogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gU2luY2UgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGV2ZXJ5IGNlbGwgKGByb3dzKmNvbHNgKSwgaXQgbXVzdCBiZSB2ZXJ5IG9wdGltaXplZC4gSXRcbiAgICAvLyBzaG91bGQgbm90IGluc3RhbnRpYXRlIGFueSB2YXJpYWJsZXMgdW5sZXNzIGEgbmV3IGdseXBoIGlzIGRyYXduIHRvIHRoZSBjYWNoZSB3aGVyZSB0aGVcbiAgICAvLyBzbGlnaHQgc2xvd2Rvd24gaXMgYWNjZXB0YWJsZSBmb3IgdGhlIGRldmVsb3BlciBlcmdvbm9taWNzIHByb3ZpZGVkIGFzIGl0J3MgYSBvbmNlIG9mIGZvclxuICAgIC8vIGVhY2ggZ2x5cGguXG4gICAgdGhpcy5fdXBkYXRlQ2VsbCh0aGlzLl92ZXJ0aWNlcy5hdHRyaWJ1dGVzLCB4LCB5LCBjb2RlLCBiZywgZmcsIGV4dCwgY2hhcnMsIHdpZHRoLCBsYXN0QmcpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlQ2VsbChhcnJheTogRmxvYXQzMkFycmF5LCB4OiBudW1iZXIsIHk6IG51bWJlciwgY29kZTogbnVtYmVyIHwgdW5kZWZpbmVkLCBiZzogbnVtYmVyLCBmZzogbnVtYmVyLCBleHQ6IG51bWJlciwgY2hhcnM6IHN0cmluZywgd2lkdGg6IG51bWJlciwgbGFzdEJnOiBudW1iZXIpOiB2b2lkIHtcbiAgICAkaSA9ICh5ICogdGhpcy5fdGVybWluYWwuY29scyArIHgpICogSU5ESUNFU19QRVJfQ0VMTDtcblxuICAgIC8vIEV4aXQgZWFybHkgaWYgdGhpcyBpcyBhIG51bGwgY2hhcmFjdGVyLCBhbGxvdyBzcGFjZSBjaGFyYWN0ZXIgdG8gY29udGludWUgYXMgaXQgbWF5IGhhdmVcbiAgICAvLyB1bmRlcmxpbmUvc3RyaWtldGhyb3VnaCBzdHlsZXNcbiAgICBpZiAoY29kZSA9PT0gTlVMTF9DRUxMX0NPREUgfHwgY29kZSA9PT0gdW5kZWZpbmVkLyogVGhpcyBpcyB1c2VkIGZvciB0aGUgcmlnaHQgc2lkZSBvZiB3aWRlIGNoYXJzICovKSB7XG4gICAgICBhcnJheS5maWxsKDAsICRpLCAkaSArIElORElDRVNfUEVSX0NFTEwgLSAxIC0gQ0VMTF9QT1NJVElPTl9JTkRJQ0VTKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2F0bGFzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBnbHlwaFxuICAgIGlmIChjaGFycyAmJiBjaGFycy5sZW5ndGggPiAxKSB7XG4gICAgICAkZ2x5cGggPSB0aGlzLl9hdGxhcy5nZXRSYXN0ZXJpemVkR2x5cGhDb21iaW5lZENoYXIoY2hhcnMsIGJnLCBmZywgZXh0LCBmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICRnbHlwaCA9IHRoaXMuX2F0bGFzLmdldFJhc3Rlcml6ZWRHbHlwaChjb2RlLCBiZywgZmcsIGV4dCwgZmFsc2UpO1xuICAgIH1cblxuICAgICRsZWZ0Q2VsbFBhZGRpbmcgPSBNYXRoLmZsb29yKCh0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jZWxsLndpZHRoIC0gdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2hhci53aWR0aCkgLyAyKTtcbiAgICBpZiAoYmcgIT09IGxhc3RCZyAmJiAkZ2x5cGgub2Zmc2V0LnggPiAkbGVmdENlbGxQYWRkaW5nKSB7XG4gICAgICAkY2xpcHBlZFBpeGVscyA9ICRnbHlwaC5vZmZzZXQueCAtICRsZWZ0Q2VsbFBhZGRpbmc7XG4gICAgICAvLyBhX29yaWdpblxuICAgICAgYXJyYXlbJGkgICAgXSA9IC0oJGdseXBoLm9mZnNldC54IC0gJGNsaXBwZWRQaXhlbHMpICsgdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2hhci5sZWZ0O1xuICAgICAgYXJyYXlbJGkgKyAxXSA9IC0kZ2x5cGgub2Zmc2V0LnkgKyB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jaGFyLnRvcDtcbiAgICAgIC8vIGFfc2l6ZVxuICAgICAgYXJyYXlbJGkgKyAyXSA9ICgkZ2x5cGguc2l6ZS54IC0gJGNsaXBwZWRQaXhlbHMpIC8gdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLndpZHRoO1xuICAgICAgYXJyYXlbJGkgKyAzXSA9ICRnbHlwaC5zaXplLnkgLyB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jYW52YXMuaGVpZ2h0O1xuICAgICAgLy8gYV90ZXhwYWdlXG4gICAgICBhcnJheVskaSArIDRdID0gJGdseXBoLnRleHR1cmVQYWdlO1xuICAgICAgLy8gYV90ZXhjb29yZFxuICAgICAgYXJyYXlbJGkgKyA1XSA9ICRnbHlwaC50ZXh0dXJlUG9zaXRpb25DbGlwU3BhY2UueCArICRjbGlwcGVkUGl4ZWxzIC8gdGhpcy5fYXRsYXMucGFnZXNbJGdseXBoLnRleHR1cmVQYWdlXS5jYW52YXMud2lkdGg7XG4gICAgICBhcnJheVskaSArIDZdID0gJGdseXBoLnRleHR1cmVQb3NpdGlvbkNsaXBTcGFjZS55O1xuICAgICAgLy8gYV90ZXhzaXplXG4gICAgICBhcnJheVskaSArIDddID0gJGdseXBoLnNpemVDbGlwU3BhY2UueCAtICRjbGlwcGVkUGl4ZWxzIC8gdGhpcy5fYXRsYXMucGFnZXNbJGdseXBoLnRleHR1cmVQYWdlXS5jYW52YXMud2lkdGg7XG4gICAgICBhcnJheVskaSArIDhdID0gJGdseXBoLnNpemVDbGlwU3BhY2UueTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYV9vcmlnaW5cbiAgICAgIGFycmF5WyRpICAgIF0gPSAtJGdseXBoLm9mZnNldC54ICsgdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2hhci5sZWZ0O1xuICAgICAgYXJyYXlbJGkgKyAxXSA9IC0kZ2x5cGgub2Zmc2V0LnkgKyB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jaGFyLnRvcDtcbiAgICAgIC8vIGFfc2l6ZVxuICAgICAgYXJyYXlbJGkgKyAyXSA9ICRnbHlwaC5zaXplLnggLyB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jYW52YXMud2lkdGg7XG4gICAgICBhcnJheVskaSArIDNdID0gJGdseXBoLnNpemUueSAvIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNhbnZhcy5oZWlnaHQ7XG4gICAgICAvLyBhX3RleHBhZ2VcbiAgICAgIGFycmF5WyRpICsgNF0gPSAkZ2x5cGgudGV4dHVyZVBhZ2U7XG4gICAgICAvLyBhX3RleGNvb3JkXG4gICAgICBhcnJheVskaSArIDVdID0gJGdseXBoLnRleHR1cmVQb3NpdGlvbkNsaXBTcGFjZS54O1xuICAgICAgYXJyYXlbJGkgKyA2XSA9ICRnbHlwaC50ZXh0dXJlUG9zaXRpb25DbGlwU3BhY2UueTtcbiAgICAgIC8vIGFfdGV4c2l6ZVxuICAgICAgYXJyYXlbJGkgKyA3XSA9ICRnbHlwaC5zaXplQ2xpcFNwYWNlLng7XG4gICAgICBhcnJheVskaSArIDhdID0gJGdseXBoLnNpemVDbGlwU3BhY2UueTtcbiAgICB9XG4gICAgLy8gYV9jZWxscG9zIG9ubHkgY2hhbmdlcyBvbiByZXNpemVcblxuICAgIC8vIFJlZHVjZSBzY2FsZSBob3Jpem9udGFsbHkgZm9yIHdpZGUgZ2x5cGhzIHByaW50ZWQgaW4gY2VsbHMgdGhhdCB3b3VsZCBvdmVybGFwIHdpdGggdGhlXG4gICAgLy8gZm9sbG93aW5nIGNlbGwgKGllLiB0aGUgd2lkdGggaXMgbm90IDIpLlxuICAgIGlmICh0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnJlc2NhbGVPdmVybGFwcGluZ0dseXBocykge1xuICAgICAgaWYgKGFsbG93UmVzY2FsaW5nKGNvZGUsIHdpZHRoLCAkZ2x5cGguc2l6ZS54LCB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jZWxsLndpZHRoKSkge1xuICAgICAgICBhcnJheVskaSArIDJdID0gKHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNlbGwud2lkdGggLSAxKSAvIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNhbnZhcy53aWR0aDsgLy8gLSAxIHRvIGltcHJvdmUgcmVhZGFiaWxpdHlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgY29uc3QgdGVybWluYWwgPSB0aGlzLl90ZXJtaW5hbDtcbiAgICBjb25zdCBuZXdDb3VudCA9IHRlcm1pbmFsLmNvbHMgKiB0ZXJtaW5hbC5yb3dzICogSU5ESUNFU19QRVJfQ0VMTDtcblxuICAgIC8vIENsZWFyIHZlcnRpY2VzXG4gICAgaWYgKHRoaXMuX3ZlcnRpY2VzLmNvdW50ICE9PSBuZXdDb3VudCkge1xuICAgICAgdGhpcy5fdmVydGljZXMuYXR0cmlidXRlcyA9IG5ldyBGbG9hdDMyQXJyYXkobmV3Q291bnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl92ZXJ0aWNlcy5hdHRyaWJ1dGVzLmZpbGwoMCk7XG4gICAgfVxuICAgIGxldCBpID0gMDtcbiAgICBmb3IgKDsgaSA8IHRoaXMuX3ZlcnRpY2VzLmF0dHJpYnV0ZXNCdWZmZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5fdmVydGljZXMuY291bnQgIT09IG5ld0NvdW50KSB7XG4gICAgICAgIHRoaXMuX3ZlcnRpY2VzLmF0dHJpYnV0ZXNCdWZmZXJzW2ldID0gbmV3IEZsb2F0MzJBcnJheShuZXdDb3VudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl92ZXJ0aWNlcy5hdHRyaWJ1dGVzQnVmZmVyc1tpXS5maWxsKDApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl92ZXJ0aWNlcy5jb3VudCA9IG5ld0NvdW50O1xuICAgIGkgPSAwO1xuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdGVybWluYWwucm93czsgeSsrKSB7XG4gICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHRlcm1pbmFsLmNvbHM7IHgrKykge1xuICAgICAgICB0aGlzLl92ZXJ0aWNlcy5hdHRyaWJ1dGVzW2kgKyA5XSA9IHggLyB0ZXJtaW5hbC5jb2xzO1xuICAgICAgICB0aGlzLl92ZXJ0aWNlcy5hdHRyaWJ1dGVzW2kgKyAxMF0gPSB5IC8gdGVybWluYWwucm93cztcbiAgICAgICAgaSArPSBJTkRJQ0VTX1BFUl9DRUxMO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVSZXNpemUoKTogdm9pZCB7XG4gICAgY29uc3QgZ2wgPSB0aGlzLl9nbDtcbiAgICBnbC51c2VQcm9ncmFtKHRoaXMuX3Byb2dyYW0pO1xuICAgIGdsLnZpZXdwb3J0KDAsIDAsIGdsLmNhbnZhcy53aWR0aCwgZ2wuY2FudmFzLmhlaWdodCk7XG4gICAgZ2wudW5pZm9ybTJmKHRoaXMuX3Jlc29sdXRpb25Mb2NhdGlvbiwgZ2wuY2FudmFzLndpZHRoLCBnbC5jYW52YXMuaGVpZ2h0KTtcbiAgICB0aGlzLmNsZWFyKCk7XG4gIH1cblxuICBwdWJsaWMgcmVuZGVyKHJlbmRlck1vZGVsOiBJUmVuZGVyTW9kZWwpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2F0bGFzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZ2wgPSB0aGlzLl9nbDtcblxuICAgIGdsLnVzZVByb2dyYW0odGhpcy5fcHJvZ3JhbSk7XG4gICAgZ2wuYmluZFZlcnRleEFycmF5KHRoaXMuX3ZlcnRleEFycmF5T2JqZWN0KTtcblxuICAgIC8vIEFsdGVybmF0ZSBidWZmZXJzIGVhY2ggZnJhbWUgYXMgdGhlIGFjdGl2ZSBidWZmZXIgZ2V0cyBsb2NrZWQgd2hpbGUgaXQncyBpbiB1c2UgYnkgdGhlIEdQVVxuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlciA9ICh0aGlzLl9hY3RpdmVCdWZmZXIgKyAxKSAlIDI7XG4gICAgY29uc3QgYWN0aXZlQnVmZmVyID0gdGhpcy5fdmVydGljZXMuYXR0cmlidXRlc0J1ZmZlcnNbdGhpcy5fYWN0aXZlQnVmZmVyXTtcblxuICAgIC8vIENvcHkgZGF0YSBmb3IgZWFjaCBjZWxsIG9mIGVhY2ggbGluZSB1cCB0byBpdHMgbGluZSBsZW5ndGggKHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlIGNlbGwpXG4gICAgLy8gZnJvbSB0aGUgYXR0cmlidXRlcyBidWZmZXIgaW50byBhY3RpdmVCdWZmZXIsIHdoaWNoIGlzIHRoZSBvbmUgdGhhdCBnZXRzIGJvdW5kIHRvIHRoZSBHUFUuXG4gICAgLy8gVGhlIHJlYXNvbnMgZm9yIHRoaXMgYXJlIGFzIGZvbGxvd3M6XG4gICAgLy8gLSBTbyB0aGUgYWN0aXZlIGJ1ZmZlciBjYW4gYmUgYWx0ZXJuYXRlZCBzbyB3ZSBkb24ndCBnZXQgYmxvY2tlZCBvbiByZW5kZXJpbmcgZmluaXNoaW5nXG4gICAgLy8gLSBUbyBjb3B5IGVpdGhlciB0aGUgbm9ybWFsIGF0dHJpYnV0ZXMgYnVmZmVyIG9yIHRoZSBzZWxlY3Rpb24gYXR0cmlidXRlcyBidWZmZXIgd2hlbiB0aGVyZVxuICAgIC8vICAgaXMgYSBzZWxlY3Rpb25cbiAgICAvLyAtIFNvIHdlIGRvbid0IHNlbmQgdmVydGljZXMgZm9yIGFsbCB0aGUgbGluZS1lbmRpbmcgd2hpdGVzcGFjZSB0byB0aGUgR1BVXG4gICAgbGV0IGJ1ZmZlckxlbmd0aCA9IDA7XG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCByZW5kZXJNb2RlbC5saW5lTGVuZ3Rocy5sZW5ndGg7IHkrKykge1xuICAgICAgY29uc3Qgc2kgPSB5ICogdGhpcy5fdGVybWluYWwuY29scyAqIElORElDRVNfUEVSX0NFTEw7XG4gICAgICBjb25zdCBzdWIgPSB0aGlzLl92ZXJ0aWNlcy5hdHRyaWJ1dGVzLnN1YmFycmF5KHNpLCBzaSArIHJlbmRlck1vZGVsLmxpbmVMZW5ndGhzW3ldICogSU5ESUNFU19QRVJfQ0VMTCk7XG4gICAgICBhY3RpdmVCdWZmZXIuc2V0KHN1YiwgYnVmZmVyTGVuZ3RoKTtcbiAgICAgIGJ1ZmZlckxlbmd0aCArPSBzdWIubGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIEJpbmQgdGhlIGF0dHJpYnV0ZXMgYnVmZmVyXG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHRoaXMuX2F0dHJpYnV0ZXNCdWZmZXIpO1xuICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBhY3RpdmVCdWZmZXIuc3ViYXJyYXkoMCwgYnVmZmVyTGVuZ3RoKSwgZ2wuU1RSRUFNX0RSQVcpO1xuXG4gICAgLy8gQmluZCB0aGUgYXRsYXMgcGFnZSB0ZXh0dXJlIGlmIHRoZXkgaGF2ZSBjaGFuZ2VkXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9hdGxhcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuX2F0bGFzLnBhZ2VzW2ldLnZlcnNpb24gIT09IHRoaXMuX2F0bGFzVGV4dHVyZXNbaV0udmVyc2lvbikge1xuICAgICAgICB0aGlzLl9iaW5kQXRsYXNQYWdlVGV4dHVyZShnbCwgdGhpcy5fYXRsYXMsIGkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERyYXcgdGhlIHZpZXdwb3J0XG4gICAgZ2wuZHJhd0VsZW1lbnRzSW5zdGFuY2VkKGdsLlRSSUFOR0xFX1NUUklQLCA0LCBnbC5VTlNJR05FRF9CWVRFLCAwLCBidWZmZXJMZW5ndGggLyBJTkRJQ0VTX1BFUl9DRUxMKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRBdGxhcyhhdGxhczogSVRleHR1cmVBdGxhcyk6IHZvaWQge1xuICAgIHRoaXMuX2F0bGFzID0gYXRsYXM7XG4gICAgZm9yIChjb25zdCBnbFRleHR1cmUgb2YgdGhpcy5fYXRsYXNUZXh0dXJlcykge1xuICAgICAgZ2xUZXh0dXJlLnZlcnNpb24gPSAtMTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9iaW5kQXRsYXNQYWdlVGV4dHVyZShnbDogSVdlYkdMMlJlbmRlcmluZ0NvbnRleHQsIGF0bGFzOiBJVGV4dHVyZUF0bGFzLCBpOiBudW1iZXIpOiB2b2lkIHtcbiAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUwICsgaSk7XG4gICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGhpcy5fYXRsYXNUZXh0dXJlc1tpXS50ZXh0dXJlKTtcbiAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGF0bGFzLnBhZ2VzW2ldLmNhbnZhcyk7XG4gICAgZ2wuZ2VuZXJhdGVNaXBtYXAoZ2wuVEVYVFVSRV8yRCk7XG4gICAgdGhpcy5fYXRsYXNUZXh0dXJlc1tpXS52ZXJzaW9uID0gYXRsYXMucGFnZXNbaV0udmVyc2lvbjtcbiAgfVxuXG4gIHB1YmxpYyBzZXREaW1lbnNpb25zKGRpbWVuc2lvbnM6IElSZW5kZXJEaW1lbnNpb25zKTogdm9pZCB7XG4gICAgdGhpcy5fZGltZW5zaW9ucyA9IGRpbWVuc2lvbnM7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgdGhyb3dJZkZhbHN5IH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvUmVuZGVyZXJVdGlscyc7XG5pbXBvcnQgeyBJUmVuZGVyRGltZW5zaW9ucyB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1R5cGVzJztcbmltcG9ydCB7IElUaGVtZVNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IFJlYWRvbmx5Q29sb3JTZXQgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IEF0dHJpYnV0ZXMsIEZnRmxhZ3MgfSBmcm9tICdjb21tb24vYnVmZmVyL0NvbnN0YW50cyc7XG5pbXBvcnQgeyBEaXNwb3NhYmxlLCB0b0Rpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IElDb2xvciB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBUZXJtaW5hbCB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5pbXBvcnQgeyBSRU5ERVJfTU9ERUxfQkdfT0ZGU0VULCBSRU5ERVJfTU9ERUxfRkdfT0ZGU0VULCBSRU5ERVJfTU9ERUxfSU5ESUNJRVNfUEVSX0NFTEwgfSBmcm9tICcuL1JlbmRlck1vZGVsJztcbmltcG9ydCB7IElSZW5kZXJNb2RlbCwgSVdlYkdMMlJlbmRlcmluZ0NvbnRleHQsIElXZWJHTFZlcnRleEFycmF5T2JqZWN0IH0gZnJvbSAnLi9UeXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVQcm9ncmFtLCBleHBhbmRGbG9hdDMyQXJyYXksIFBST0pFQ1RJT05fTUFUUklYIH0gZnJvbSAnLi9XZWJnbFV0aWxzJztcblxuY29uc3QgZW51bSBWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMge1xuICBQT1NJVElPTiA9IDAsXG4gIFNJWkUgPSAxLFxuICBDT0xPUiA9IDIsXG4gIFVOSVRfUVVBRCA9IDNcbn1cblxuY29uc3QgdmVydGV4U2hhZGVyU291cmNlID0gYCN2ZXJzaW9uIDMwMCBlc1xubGF5b3V0IChsb2NhdGlvbiA9ICR7VmVydGV4QXR0cmliTG9jYXRpb25zLlBPU0lUSU9OfSkgaW4gdmVjMiBhX3Bvc2l0aW9uO1xubGF5b3V0IChsb2NhdGlvbiA9ICR7VmVydGV4QXR0cmliTG9jYXRpb25zLlNJWkV9KSBpbiB2ZWMyIGFfc2l6ZTtcbmxheW91dCAobG9jYXRpb24gPSAke1ZlcnRleEF0dHJpYkxvY2F0aW9ucy5DT0xPUn0pIGluIHZlYzQgYV9jb2xvcjtcbmxheW91dCAobG9jYXRpb24gPSAke1ZlcnRleEF0dHJpYkxvY2F0aW9ucy5VTklUX1FVQUR9KSBpbiB2ZWMyIGFfdW5pdHF1YWQ7XG5cbnVuaWZvcm0gbWF0NCB1X3Byb2plY3Rpb247XG5cbm91dCB2ZWM0IHZfY29sb3I7XG5cbnZvaWQgbWFpbigpIHtcbiAgdmVjMiB6ZXJvVG9PbmUgPSBhX3Bvc2l0aW9uICsgKGFfdW5pdHF1YWQgKiBhX3NpemUpO1xuICBnbF9Qb3NpdGlvbiA9IHVfcHJvamVjdGlvbiAqIHZlYzQoemVyb1RvT25lLCAwLjAsIDEuMCk7XG4gIHZfY29sb3IgPSBhX2NvbG9yO1xufWA7XG5cbmNvbnN0IGZyYWdtZW50U2hhZGVyU291cmNlID0gYCN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIGxvd3AgZmxvYXQ7XG5cbmluIHZlYzQgdl9jb2xvcjtcblxub3V0IHZlYzQgb3V0Q29sb3I7XG5cbnZvaWQgbWFpbigpIHtcbiAgb3V0Q29sb3IgPSB2X2NvbG9yO1xufWA7XG5cbmNvbnN0IElORElDRVNfUEVSX1JFQ1RBTkdMRSA9IDg7XG5jb25zdCBCWVRFU19QRVJfUkVDVEFOR0xFID0gSU5ESUNFU19QRVJfUkVDVEFOR0xFICogRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UO1xuXG5jb25zdCBJTklUSUFMX0JVRkZFUl9SRUNUQU5HTEVfQ0FQQUNJVFkgPSAyMCAqIElORElDRVNfUEVSX1JFQ1RBTkdMRTtcblxuY2xhc3MgVmVydGljZXMge1xuICBwdWJsaWMgYXR0cmlidXRlczogRmxvYXQzMkFycmF5O1xuICBwdWJsaWMgY291bnQ6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmF0dHJpYnV0ZXMgPSBuZXcgRmxvYXQzMkFycmF5KElOSVRJQUxfQlVGRkVSX1JFQ1RBTkdMRV9DQVBBQ0lUWSk7XG4gICAgdGhpcy5jb3VudCA9IDA7XG4gIH1cbn1cblxuLy8gV29yayB2YXJpYWJsZXMgdG8gYXZvaWQgZ2FyYmFnZSBjb2xsZWN0aW9uXG5sZXQgJHJnYmEgPSAwO1xubGV0ICR4MSA9IDA7XG5sZXQgJHkxID0gMDtcbmxldCAkciA9IDA7XG5sZXQgJGcgPSAwO1xubGV0ICRiID0gMDtcbmxldCAkYSA9IDA7XG5cbmV4cG9ydCBjbGFzcyBSZWN0YW5nbGVSZW5kZXJlciBleHRlbmRzIERpc3Bvc2FibGUge1xuXG4gIHByaXZhdGUgX3Byb2dyYW06IFdlYkdMUHJvZ3JhbTtcbiAgcHJpdmF0ZSBfdmVydGV4QXJyYXlPYmplY3Q6IElXZWJHTFZlcnRleEFycmF5T2JqZWN0O1xuICBwcml2YXRlIF9hdHRyaWJ1dGVzQnVmZmVyOiBXZWJHTEJ1ZmZlcjtcbiAgcHJpdmF0ZSBfcHJvamVjdGlvbkxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbjtcbiAgcHJpdmF0ZSBfYmdGbG9hdCE6IEZsb2F0MzJBcnJheTtcbiAgcHJpdmF0ZSBfY3Vyc29yRmxvYXQhOiBGbG9hdDMyQXJyYXk7XG5cbiAgcHJpdmF0ZSBfdmVydGljZXM6IFZlcnRpY2VzID0gbmV3IFZlcnRpY2VzKCk7XG4gIHByaXZhdGUgX3ZlcnRpY2VzQ3Vyc29yOiBWZXJ0aWNlcyA9IG5ldyBWZXJ0aWNlcygpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX3Rlcm1pbmFsOiBUZXJtaW5hbCxcbiAgICBwcml2YXRlIF9nbDogSVdlYkdMMlJlbmRlcmluZ0NvbnRleHQsXG4gICAgcHJpdmF0ZSBfZGltZW5zaW9uczogSVJlbmRlckRpbWVuc2lvbnMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGhlbWVTZXJ2aWNlOiBJVGhlbWVTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBjb25zdCBnbCA9IHRoaXMuX2dsO1xuXG4gICAgdGhpcy5fcHJvZ3JhbSA9IHRocm93SWZGYWxzeShjcmVhdGVQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXJTb3VyY2UsIGZyYWdtZW50U2hhZGVyU291cmNlKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0b0Rpc3Bvc2FibGUoKCkgPT4gZ2wuZGVsZXRlUHJvZ3JhbSh0aGlzLl9wcm9ncmFtKSkpO1xuXG4gICAgLy8gVW5pZm9ybSBsb2NhdGlvbnNcbiAgICB0aGlzLl9wcm9qZWN0aW9uTG9jYXRpb24gPSB0aHJvd0lmRmFsc3koZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMuX3Byb2dyYW0sICd1X3Byb2plY3Rpb24nKSk7XG5cbiAgICAvLyBDcmVhdGUgYW5kIHNldCB0aGUgdmVydGV4IGFycmF5IG9iamVjdFxuICAgIHRoaXMuX3ZlcnRleEFycmF5T2JqZWN0ID0gZ2wuY3JlYXRlVmVydGV4QXJyYXkoKTtcbiAgICBnbC5iaW5kVmVydGV4QXJyYXkodGhpcy5fdmVydGV4QXJyYXlPYmplY3QpO1xuXG4gICAgLy8gU2V0dXAgYV91bml0cXVhZCwgdGhpcyBkZWZpbmVzIHRoZSA0IHZlcnRpY2VzIG9mIGEgcmVjdGFuZ2xlXG4gICAgY29uc3QgdW5pdFF1YWRWZXJ0aWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoWzAsIDAsIDEsIDAsIDAsIDEsIDEsIDFdKTtcbiAgICBjb25zdCB1bml0UXVhZFZlcnRpY2VzQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgdGhpcy5yZWdpc3Rlcih0b0Rpc3Bvc2FibGUoKCkgPT4gZ2wuZGVsZXRlQnVmZmVyKHVuaXRRdWFkVmVydGljZXNCdWZmZXIpKSk7XG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHVuaXRRdWFkVmVydGljZXNCdWZmZXIpO1xuICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCB1bml0UXVhZFZlcnRpY2VzLCBnbC5TVEFUSUNfRFJBVyk7XG4gICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoVmVydGV4QXR0cmliTG9jYXRpb25zLlVOSVRfUVVBRCk7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuVU5JVF9RVUFELCAyLCB0aGlzLl9nbC5GTE9BVCwgZmFsc2UsIDAsIDApO1xuXG4gICAgLy8gU2V0dXAgdGhlIHVuaXQgcXVhZCBlbGVtZW50IGFycmF5IGJ1ZmZlciwgdGhpcyBwb2ludHMgdG8gaW5kaWNlcyBpblxuICAgIC8vIHVuaXRRdWFkVmVydGljZXMgdG8gYWxsb3cgaXMgdG8gZHJhdyAyIHRyaWFuZ2xlcyBmcm9tIHRoZSB2ZXJ0aWNlcyB2aWEgYVxuICAgIC8vIHRyaWFuZ2xlIHN0cmlwXG4gICAgY29uc3QgdW5pdFF1YWRFbGVtZW50SW5kaWNlcyA9IG5ldyBVaW50OEFycmF5KFswLCAxLCAyLCAzXSk7XG4gICAgY29uc3QgZWxlbWVudEluZGljZXNCdWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiBnbC5kZWxldGVCdWZmZXIoZWxlbWVudEluZGljZXNCdWZmZXIpKSk7XG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgZWxlbWVudEluZGljZXNCdWZmZXIpO1xuICAgIGdsLmJ1ZmZlckRhdGEoZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHVuaXRRdWFkRWxlbWVudEluZGljZXMsIGdsLlNUQVRJQ19EUkFXKTtcblxuICAgIC8vIFNldHVwIGF0dHJpYnV0ZXNcbiAgICB0aGlzLl9hdHRyaWJ1dGVzQnVmZmVyID0gdGhyb3dJZkZhbHN5KGdsLmNyZWF0ZUJ1ZmZlcigpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiBnbC5kZWxldGVCdWZmZXIodGhpcy5fYXR0cmlidXRlc0J1ZmZlcikpKTtcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgdGhpcy5fYXR0cmlidXRlc0J1ZmZlcik7XG4gICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoVmVydGV4QXR0cmliTG9jYXRpb25zLlBPU0lUSU9OKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKFZlcnRleEF0dHJpYkxvY2F0aW9ucy5QT1NJVElPTiwgMiwgZ2wuRkxPQVQsIGZhbHNlLCBCWVRFU19QRVJfUkVDVEFOR0xFLCAwKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJEaXZpc29yKFZlcnRleEF0dHJpYkxvY2F0aW9ucy5QT1NJVElPTiwgMSk7XG4gICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoVmVydGV4QXR0cmliTG9jYXRpb25zLlNJWkUpO1xuICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoVmVydGV4QXR0cmliTG9jYXRpb25zLlNJWkUsIDIsIGdsLkZMT0FULCBmYWxzZSwgQllURVNfUEVSX1JFQ1RBTkdMRSwgMiAqIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7XG4gICAgZ2wudmVydGV4QXR0cmliRGl2aXNvcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuU0laRSwgMSk7XG4gICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoVmVydGV4QXR0cmliTG9jYXRpb25zLkNPTE9SKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKFZlcnRleEF0dHJpYkxvY2F0aW9ucy5DT0xPUiwgNCwgZ2wuRkxPQVQsIGZhbHNlLCBCWVRFU19QRVJfUkVDVEFOR0xFLCA0ICogRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJEaXZpc29yKFZlcnRleEF0dHJpYkxvY2F0aW9ucy5DT0xPUiwgMSk7XG5cbiAgICB0aGlzLl91cGRhdGVDYWNoZWRDb2xvcnMoX3RoZW1lU2VydmljZS5jb2xvcnMpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fdGhlbWVTZXJ2aWNlLm9uQ2hhbmdlQ29sb3JzKGUgPT4ge1xuICAgICAgdGhpcy5fdXBkYXRlQ2FjaGVkQ29sb3JzKGUpO1xuICAgICAgdGhpcy5fdXBkYXRlVmlld3BvcnRSZWN0YW5nbGUoKTtcbiAgICB9KSk7XG4gIH1cblxuICBwdWJsaWMgcmVuZGVyQmFja2dyb3VuZHMoKTogdm9pZCB7XG4gICAgdGhpcy5fcmVuZGVyVmVydGljZXModGhpcy5fdmVydGljZXMpO1xuICB9XG5cbiAgcHVibGljIHJlbmRlckN1cnNvcigpOiB2b2lkIHtcbiAgICB0aGlzLl9yZW5kZXJWZXJ0aWNlcyh0aGlzLl92ZXJ0aWNlc0N1cnNvcik7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJWZXJ0aWNlcyh2ZXJ0aWNlczogVmVydGljZXMpOiB2b2lkIHtcbiAgICBjb25zdCBnbCA9IHRoaXMuX2dsO1xuXG4gICAgZ2wudXNlUHJvZ3JhbSh0aGlzLl9wcm9ncmFtKTtcblxuICAgIGdsLmJpbmRWZXJ0ZXhBcnJheSh0aGlzLl92ZXJ0ZXhBcnJheU9iamVjdCk7XG5cbiAgICBnbC51bmlmb3JtTWF0cml4NGZ2KHRoaXMuX3Byb2plY3Rpb25Mb2NhdGlvbiwgZmFsc2UsIFBST0pFQ1RJT05fTUFUUklYKTtcblxuICAgIC8vIEJpbmQgYXR0cmlidXRlcyBidWZmZXIgYW5kIGRyYXdcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgdGhpcy5fYXR0cmlidXRlc0J1ZmZlcik7XG4gICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIHZlcnRpY2VzLmF0dHJpYnV0ZXMsIGdsLkRZTkFNSUNfRFJBVyk7XG4gICAgZ2wuZHJhd0VsZW1lbnRzSW5zdGFuY2VkKHRoaXMuX2dsLlRSSUFOR0xFX1NUUklQLCA0LCBnbC5VTlNJR05FRF9CWVRFLCAwLCB2ZXJ0aWNlcy5jb3VudCk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlUmVzaXplKCk6IHZvaWQge1xuICAgIHRoaXMuX3VwZGF0ZVZpZXdwb3J0UmVjdGFuZ2xlKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0RGltZW5zaW9ucyhkaW1lbnNpb25zOiBJUmVuZGVyRGltZW5zaW9ucyk6IHZvaWQge1xuICAgIHRoaXMuX2RpbWVuc2lvbnMgPSBkaW1lbnNpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlQ2FjaGVkQ29sb3JzKGNvbG9yczogUmVhZG9ubHlDb2xvclNldCk6IHZvaWQge1xuICAgIHRoaXMuX2JnRmxvYXQgPSB0aGlzLl9jb2xvclRvRmxvYXQzMkFycmF5KGNvbG9ycy5iYWNrZ3JvdW5kKTtcbiAgICB0aGlzLl9jdXJzb3JGbG9hdCA9IHRoaXMuX2NvbG9yVG9GbG9hdDMyQXJyYXkoY29sb3JzLmN1cnNvcik7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVWaWV3cG9ydFJlY3RhbmdsZSgpOiB2b2lkIHtcbiAgICAvLyBTZXQgZmlyc3QgcmVjdGFuZ2xlIHRoYXQgY2xlYXJzIHRoZSBzY3JlZW5cbiAgICB0aGlzLl9hZGRSZWN0YW5nbGVGbG9hdChcbiAgICAgIHRoaXMuX3ZlcnRpY2VzLmF0dHJpYnV0ZXMsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICB0aGlzLl90ZXJtaW5hbC5jb2xzICogdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2VsbC53aWR0aCxcbiAgICAgIHRoaXMuX3Rlcm1pbmFsLnJvd3MgKiB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jZWxsLmhlaWdodCxcbiAgICAgIHRoaXMuX2JnRmxvYXRcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZUJhY2tncm91bmRzKG1vZGVsOiBJUmVuZGVyTW9kZWwpOiB2b2lkIHtcbiAgICBjb25zdCB0ZXJtaW5hbCA9IHRoaXMuX3Rlcm1pbmFsO1xuICAgIGNvbnN0IHZlcnRpY2VzID0gdGhpcy5fdmVydGljZXM7XG5cbiAgICAvLyBEZWNsYXJlIHZhcmlhYmxlIGFoZWFkIG9mIHRpbWUgdG8gYXZvaWQgZ2FyYmFnZSBjb2xsZWN0aW9uXG4gICAgbGV0IHJlY3RhbmdsZUNvdW50ID0gMTtcbiAgICBsZXQgeTogbnVtYmVyO1xuICAgIGxldCB4OiBudW1iZXI7XG4gICAgbGV0IGN1cnJlbnRTdGFydFg6IG51bWJlcjtcbiAgICBsZXQgY3VycmVudEJnOiBudW1iZXI7XG4gICAgbGV0IGN1cnJlbnRGZzogbnVtYmVyO1xuICAgIGxldCBjdXJyZW50SW52ZXJzZTogYm9vbGVhbjtcbiAgICBsZXQgbW9kZWxJbmRleDogbnVtYmVyO1xuICAgIGxldCBiZzogbnVtYmVyO1xuICAgIGxldCBmZzogbnVtYmVyO1xuICAgIGxldCBpbnZlcnNlOiBib29sZWFuO1xuICAgIGxldCBvZmZzZXQ6IG51bWJlcjtcblxuICAgIGZvciAoeSA9IDA7IHkgPCB0ZXJtaW5hbC5yb3dzOyB5KyspIHtcbiAgICAgIGN1cnJlbnRTdGFydFggPSAtMTtcbiAgICAgIGN1cnJlbnRCZyA9IDA7XG4gICAgICBjdXJyZW50RmcgPSAwO1xuICAgICAgY3VycmVudEludmVyc2UgPSBmYWxzZTtcbiAgICAgIGZvciAoeCA9IDA7IHggPCB0ZXJtaW5hbC5jb2xzOyB4KyspIHtcbiAgICAgICAgbW9kZWxJbmRleCA9ICgoeSAqIHRlcm1pbmFsLmNvbHMpICsgeCkgKiBSRU5ERVJfTU9ERUxfSU5ESUNJRVNfUEVSX0NFTEw7XG4gICAgICAgIGJnID0gbW9kZWwuY2VsbHNbbW9kZWxJbmRleCArIFJFTkRFUl9NT0RFTF9CR19PRkZTRVRdO1xuICAgICAgICBmZyA9IG1vZGVsLmNlbGxzW21vZGVsSW5kZXggKyBSRU5ERVJfTU9ERUxfRkdfT0ZGU0VUXTtcbiAgICAgICAgaW52ZXJzZSA9ICEhKGZnICYgRmdGbGFncy5JTlZFUlNFKTtcbiAgICAgICAgaWYgKGJnICE9PSBjdXJyZW50QmcgfHwgKGZnICE9PSBjdXJyZW50RmcgJiYgKGN1cnJlbnRJbnZlcnNlIHx8IGludmVyc2UpKSkge1xuICAgICAgICAgIC8vIEEgcmVjdGFuZ2xlIG5lZWRzIHRvIGJlIGRyYXduIGlmIGdvaW5nIGZyb20gbm9uLWRlZmF1bHQgdG8gYW5vdGhlciBjb2xvclxuICAgICAgICAgIGlmIChjdXJyZW50QmcgIT09IDAgfHwgKGN1cnJlbnRJbnZlcnNlICYmIGN1cnJlbnRGZyAhPT0gMCkpIHtcbiAgICAgICAgICAgIG9mZnNldCA9IHJlY3RhbmdsZUNvdW50KysgKiBJTkRJQ0VTX1BFUl9SRUNUQU5HTEU7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVSZWN0YW5nbGUodmVydGljZXMsIG9mZnNldCwgY3VycmVudEZnLCBjdXJyZW50QmcsIGN1cnJlbnRTdGFydFgsIHgsIHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50U3RhcnRYID0geDtcbiAgICAgICAgICBjdXJyZW50QmcgPSBiZztcbiAgICAgICAgICBjdXJyZW50RmcgPSBmZztcbiAgICAgICAgICBjdXJyZW50SW52ZXJzZSA9IGludmVyc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEZpbmlzaCByZWN0YW5nbGUgaWYgaXQncyBzdGlsbCBnb2luZ1xuICAgICAgaWYgKGN1cnJlbnRCZyAhPT0gMCB8fCAoY3VycmVudEludmVyc2UgJiYgY3VycmVudEZnICE9PSAwKSkge1xuICAgICAgICBvZmZzZXQgPSByZWN0YW5nbGVDb3VudCsrICogSU5ESUNFU19QRVJfUkVDVEFOR0xFO1xuICAgICAgICB0aGlzLl91cGRhdGVSZWN0YW5nbGUodmVydGljZXMsIG9mZnNldCwgY3VycmVudEZnLCBjdXJyZW50QmcsIGN1cnJlbnRTdGFydFgsIHRlcm1pbmFsLmNvbHMsIHkpO1xuICAgICAgfVxuICAgIH1cbiAgICB2ZXJ0aWNlcy5jb3VudCA9IHJlY3RhbmdsZUNvdW50O1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZUN1cnNvcihtb2RlbDogSVJlbmRlck1vZGVsKTogdm9pZCB7XG4gICAgY29uc3QgdmVydGljZXMgPSB0aGlzLl92ZXJ0aWNlc0N1cnNvcjtcbiAgICBjb25zdCBjdXJzb3IgPSBtb2RlbC5jdXJzb3I7XG4gICAgaWYgKCFjdXJzb3IgfHwgY3Vyc29yLnN0eWxlID09PSAnYmxvY2snKSB7XG4gICAgICB2ZXJ0aWNlcy5jb3VudCA9IDA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG9mZnNldDogbnVtYmVyO1xuICAgIGxldCByZWN0YW5nbGVDb3VudCA9IDA7XG5cbiAgICBpZiAoY3Vyc29yLnN0eWxlID09PSAnYmFyJyB8fCBjdXJzb3Iuc3R5bGUgPT09ICdvdXRsaW5lJykge1xuICAgICAgLy8gTGVmdCBlZGdlXG4gICAgICBvZmZzZXQgPSByZWN0YW5nbGVDb3VudCsrICogSU5ESUNFU19QRVJfUkVDVEFOR0xFO1xuICAgICAgdGhpcy5fYWRkUmVjdGFuZ2xlRmxvYXQoXG4gICAgICAgIHZlcnRpY2VzLmF0dHJpYnV0ZXMsXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgY3Vyc29yLnggKiB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jZWxsLndpZHRoLFxuICAgICAgICBjdXJzb3IueSAqIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNlbGwuaGVpZ2h0LFxuICAgICAgICBjdXJzb3Iuc3R5bGUgPT09ICdiYXInID8gY3Vyc29yLmRwciAqIGN1cnNvci5jdXJzb3JXaWR0aCA6IGN1cnNvci5kcHIsXG4gICAgICAgIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNlbGwuaGVpZ2h0LFxuICAgICAgICB0aGlzLl9jdXJzb3JGbG9hdFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGN1cnNvci5zdHlsZSA9PT0gJ3VuZGVybGluZScgfHwgY3Vyc29yLnN0eWxlID09PSAnb3V0bGluZScpIHtcbiAgICAgIC8vIEJvdHRvbSBlZGdlXG4gICAgICBvZmZzZXQgPSByZWN0YW5nbGVDb3VudCsrICogSU5ESUNFU19QRVJfUkVDVEFOR0xFO1xuICAgICAgdGhpcy5fYWRkUmVjdGFuZ2xlRmxvYXQoXG4gICAgICAgIHZlcnRpY2VzLmF0dHJpYnV0ZXMsXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgY3Vyc29yLnggKiB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jZWxsLndpZHRoLFxuICAgICAgICAoY3Vyc29yLnkgKyAxKSAqIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNlbGwuaGVpZ2h0IC0gY3Vyc29yLmRwcixcbiAgICAgICAgY3Vyc29yLndpZHRoICogdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2VsbC53aWR0aCxcbiAgICAgICAgY3Vyc29yLmRwcixcbiAgICAgICAgdGhpcy5fY3Vyc29yRmxvYXRcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChjdXJzb3Iuc3R5bGUgPT09ICdvdXRsaW5lJykge1xuICAgICAgLy8gVG9wIGVkZ2VcbiAgICAgIG9mZnNldCA9IHJlY3RhbmdsZUNvdW50KysgKiBJTkRJQ0VTX1BFUl9SRUNUQU5HTEU7XG4gICAgICB0aGlzLl9hZGRSZWN0YW5nbGVGbG9hdChcbiAgICAgICAgdmVydGljZXMuYXR0cmlidXRlcyxcbiAgICAgICAgb2Zmc2V0LFxuICAgICAgICBjdXJzb3IueCAqIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNlbGwud2lkdGgsXG4gICAgICAgIGN1cnNvci55ICogdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2VsbC5oZWlnaHQsXG4gICAgICAgIGN1cnNvci53aWR0aCAqIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNlbGwud2lkdGgsXG4gICAgICAgIGN1cnNvci5kcHIsXG4gICAgICAgIHRoaXMuX2N1cnNvckZsb2F0XG4gICAgICApO1xuICAgICAgLy8gUmlnaHQgZWRnZVxuICAgICAgb2Zmc2V0ID0gcmVjdGFuZ2xlQ291bnQrKyAqIElORElDRVNfUEVSX1JFQ1RBTkdMRTtcbiAgICAgIHRoaXMuX2FkZFJlY3RhbmdsZUZsb2F0KFxuICAgICAgICB2ZXJ0aWNlcy5hdHRyaWJ1dGVzLFxuICAgICAgICBvZmZzZXQsXG4gICAgICAgIChjdXJzb3IueCArIGN1cnNvci53aWR0aCkgKiB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jZWxsLndpZHRoIC0gY3Vyc29yLmRwcixcbiAgICAgICAgY3Vyc29yLnkgKiB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jZWxsLmhlaWdodCxcbiAgICAgICAgY3Vyc29yLmRwcixcbiAgICAgICAgdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2VsbC5oZWlnaHQsXG4gICAgICAgIHRoaXMuX2N1cnNvckZsb2F0XG4gICAgICApO1xuICAgIH1cblxuICAgIHZlcnRpY2VzLmNvdW50ID0gcmVjdGFuZ2xlQ291bnQ7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVSZWN0YW5nbGUodmVydGljZXM6IFZlcnRpY2VzLCBvZmZzZXQ6IG51bWJlciwgZmc6IG51bWJlciwgYmc6IG51bWJlciwgc3RhcnRYOiBudW1iZXIsIGVuZFg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKGZnICYgRmdGbGFncy5JTlZFUlNFKSB7XG4gICAgICBzd2l0Y2ggKGZnICYgQXR0cmlidXRlcy5DTV9NQVNLKSB7XG4gICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMjU2OlxuICAgICAgICAgICRyZ2JhID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5hbnNpW2ZnICYgQXR0cmlidXRlcy5QQ09MT1JfTUFTS10ucmdiYTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1JHQjpcbiAgICAgICAgICAkcmdiYSA9IChmZyAmIEF0dHJpYnV0ZXMuUkdCX01BU0spIDw8IDg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9ERUZBVUxUOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICRyZ2JhID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5mb3JlZ3JvdW5kLnJnYmE7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAoYmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spIHtcbiAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AxNjpcbiAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AyNTY6XG4gICAgICAgICAgJHJnYmEgPSB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzLmFuc2lbYmcgJiBBdHRyaWJ1dGVzLlBDT0xPUl9NQVNLXS5yZ2JhO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUkdCOlxuICAgICAgICAgICRyZ2JhID0gKGJnICYgQXR0cmlidXRlcy5SR0JfTUFTSykgPDwgODtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX0RFRkFVTFQ6XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgJHJnYmEgPSB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzLmJhY2tncm91bmQucmdiYTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmVydGljZXMuYXR0cmlidXRlcy5sZW5ndGggPCBvZmZzZXQgKyA0KSB7XG4gICAgICB2ZXJ0aWNlcy5hdHRyaWJ1dGVzID0gZXhwYW5kRmxvYXQzMkFycmF5KHZlcnRpY2VzLmF0dHJpYnV0ZXMsIHRoaXMuX3Rlcm1pbmFsLnJvd3MgKiB0aGlzLl90ZXJtaW5hbC5jb2xzICogSU5ESUNFU19QRVJfUkVDVEFOR0xFKTtcbiAgICB9XG4gICAgJHgxID0gc3RhcnRYICogdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2VsbC53aWR0aDtcbiAgICAkeTEgPSB5ICogdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2VsbC5oZWlnaHQ7XG4gICAgJHIgPSAoKCRyZ2JhID4+IDI0KSAmIDB4RkYpIC8gMjU1O1xuICAgICRnID0gKCgkcmdiYSA+PiAxNikgJiAweEZGKSAvIDI1NTtcbiAgICAkYiA9ICgoJHJnYmEgPj4gOCApICYgMHhGRikgLyAyNTU7XG4gICAgJGEgPSAxO1xuXG4gICAgdGhpcy5fYWRkUmVjdGFuZ2xlKHZlcnRpY2VzLmF0dHJpYnV0ZXMsIG9mZnNldCwgJHgxLCAkeTEsIChlbmRYIC0gc3RhcnRYKSAqIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNlbGwud2lkdGgsIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNlbGwuaGVpZ2h0LCAkciwgJGcsICRiLCAkYSk7XG4gIH1cblxuICBwcml2YXRlIF9hZGRSZWN0YW5nbGUoYXJyYXk6IEZsb2F0MzJBcnJheSwgb2Zmc2V0OiBudW1iZXIsIHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCByOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBhOiBudW1iZXIpOiB2b2lkIHtcbiAgICBhcnJheVtvZmZzZXQgICAgXSA9IHgxIC8gdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLndpZHRoO1xuICAgIGFycmF5W29mZnNldCArIDFdID0geTEgLyB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jYW52YXMuaGVpZ2h0O1xuICAgIGFycmF5W29mZnNldCArIDJdID0gd2lkdGggLyB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jYW52YXMud2lkdGg7XG4gICAgYXJyYXlbb2Zmc2V0ICsgM10gPSBoZWlnaHQgLyB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jYW52YXMuaGVpZ2h0O1xuICAgIGFycmF5W29mZnNldCArIDRdID0gcjtcbiAgICBhcnJheVtvZmZzZXQgKyA1XSA9IGc7XG4gICAgYXJyYXlbb2Zmc2V0ICsgNl0gPSBiO1xuICAgIGFycmF5W29mZnNldCArIDddID0gYTtcbiAgfVxuXG4gIHByaXZhdGUgX2FkZFJlY3RhbmdsZUZsb2F0KGFycmF5OiBGbG9hdDMyQXJyYXksIG9mZnNldDogbnVtYmVyLCB4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgY29sb3I6IEZsb2F0MzJBcnJheSk6IHZvaWQge1xuICAgIGFycmF5W29mZnNldCAgICBdID0geDEgLyB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jYW52YXMud2lkdGg7XG4gICAgYXJyYXlbb2Zmc2V0ICsgMV0gPSB5MSAvIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNhbnZhcy5oZWlnaHQ7XG4gICAgYXJyYXlbb2Zmc2V0ICsgMl0gPSB3aWR0aCAvIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNhbnZhcy53aWR0aDtcbiAgICBhcnJheVtvZmZzZXQgKyAzXSA9IGhlaWdodCAvIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNhbnZhcy5oZWlnaHQ7XG4gICAgYXJyYXlbb2Zmc2V0ICsgNF0gPSBjb2xvclswXTtcbiAgICBhcnJheVtvZmZzZXQgKyA1XSA9IGNvbG9yWzFdO1xuICAgIGFycmF5W29mZnNldCArIDZdID0gY29sb3JbMl07XG4gICAgYXJyYXlbb2Zmc2V0ICsgN10gPSBjb2xvclszXTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbG9yVG9GbG9hdDMyQXJyYXkoY29sb3I6IElDb2xvcik6IEZsb2F0MzJBcnJheSB7XG4gICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoW1xuICAgICAgKChjb2xvci5yZ2JhID4+IDI0KSAmIDB4RkYpIC8gMjU1LFxuICAgICAgKChjb2xvci5yZ2JhID4+IDE2KSAmIDB4RkYpIC8gMjU1LFxuICAgICAgKChjb2xvci5yZ2JhID4+IDggKSAmIDB4RkYpIC8gMjU1LFxuICAgICAgKChjb2xvci5yZ2JhICAgICAgKSAmIDB4RkYpIC8gMjU1XG4gICAgXSk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUN1cnNvclJlbmRlck1vZGVsLCBJUmVuZGVyTW9kZWwgfSBmcm9tICcuL1R5cGVzJztcbmltcG9ydCB7IElTZWxlY3Rpb25SZW5kZXJNb2RlbCB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZVNlbGVjdGlvblJlbmRlck1vZGVsIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvU2VsZWN0aW9uUmVuZGVyTW9kZWwnO1xuXG5leHBvcnQgY29uc3QgUkVOREVSX01PREVMX0lORElDSUVTX1BFUl9DRUxMID0gNDtcbmV4cG9ydCBjb25zdCBSRU5ERVJfTU9ERUxfQkdfT0ZGU0VUID0gMTtcbmV4cG9ydCBjb25zdCBSRU5ERVJfTU9ERUxfRkdfT0ZGU0VUID0gMjtcbmV4cG9ydCBjb25zdCBSRU5ERVJfTU9ERUxfRVhUX09GRlNFVCA9IDM7XG5cbmV4cG9ydCBjb25zdCBDT01CSU5FRF9DSEFSX0JJVF9NQVNLID0gMHg4MDAwMDAwMDtcblxuZXhwb3J0IGNsYXNzIFJlbmRlck1vZGVsIGltcGxlbWVudHMgSVJlbmRlck1vZGVsIHtcbiAgcHVibGljIGNlbGxzOiBVaW50MzJBcnJheTtcbiAgcHVibGljIGxpbmVMZW5ndGhzOiBVaW50MzJBcnJheTtcbiAgcHVibGljIHNlbGVjdGlvbjogSVNlbGVjdGlvblJlbmRlck1vZGVsO1xuICBwdWJsaWMgY3Vyc29yPzogSUN1cnNvclJlbmRlck1vZGVsO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuY2VsbHMgPSBuZXcgVWludDMyQXJyYXkoMCk7XG4gICAgdGhpcy5saW5lTGVuZ3RocyA9IG5ldyBVaW50MzJBcnJheSgwKTtcbiAgICB0aGlzLnNlbGVjdGlvbiA9IGNyZWF0ZVNlbGVjdGlvblJlbmRlck1vZGVsKCk7XG4gIH1cblxuICBwdWJsaWMgcmVzaXplKGNvbHM6IG51bWJlciwgcm93czogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXhDb3VudCA9IGNvbHMgKiByb3dzICogUkVOREVSX01PREVMX0lORElDSUVTX1BFUl9DRUxMO1xuICAgIGlmIChpbmRleENvdW50ICE9PSB0aGlzLmNlbGxzLmxlbmd0aCkge1xuICAgICAgdGhpcy5jZWxscyA9IG5ldyBVaW50MzJBcnJheShpbmRleENvdW50KTtcbiAgICAgIHRoaXMubGluZUxlbmd0aHMgPSBuZXcgVWludDMyQXJyYXkocm93cyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuY2VsbHMuZmlsbCgwLCAwKTtcbiAgICB0aGlzLmxpbmVMZW5ndGhzLmZpbGwoMCwgMCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyIH0gZnJvbSAnYnJvd3Nlci9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgSVRlcm1pbmFsIH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBDZWxsQ29sb3JSZXNvbHZlciB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL0NlbGxDb2xvclJlc29sdmVyJztcbmltcG9ydCB7IGFjcXVpcmVUZXh0dXJlQXRsYXMsIHJlbW92ZVRlcm1pbmFsRnJvbUNhY2hlIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvQ2hhckF0bGFzQ2FjaGUnO1xuaW1wb3J0IHsgQ3Vyc29yQmxpbmtTdGF0ZU1hbmFnZXIgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9DdXJzb3JCbGlua1N0YXRlTWFuYWdlcic7XG5pbXBvcnQgeyBvYnNlcnZlRGV2aWNlUGl4ZWxEaW1lbnNpb25zIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvRGV2aWNlUGl4ZWxPYnNlcnZlcic7XG5pbXBvcnQgeyBjcmVhdGVSZW5kZXJEaW1lbnNpb25zIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvUmVuZGVyZXJVdGlscyc7XG5pbXBvcnQgeyBJUmVuZGVyRGltZW5zaW9ucywgSVJlbmRlcmVyLCBJUmVxdWVzdFJlZHJhd0V2ZW50LCBJVGV4dHVyZUF0bGFzIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvVHlwZXMnO1xuaW1wb3J0IHsgSUNoYXJTaXplU2VydmljZSwgSUNoYXJhY3RlckpvaW5lclNlcnZpY2UsIElDb3JlQnJvd3NlclNlcnZpY2UsIElUaGVtZVNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciwgZm9yd2FyZEV2ZW50IH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBEaXNwb3NhYmxlLCBNdXRhYmxlRGlzcG9zYWJsZSwgZ2V0RGlzcG9zZUFycmF5RGlzcG9zYWJsZSwgdG9EaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBDaGFyRGF0YSwgSUJ1ZmZlckxpbmUsIElDZWxsRGF0YSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVEYXRhIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9BdHRyaWJ1dGVEYXRhJztcbmltcG9ydCB7IENlbGxEYXRhIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9DZWxsRGF0YSc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVzLCBDb250ZW50LCBOVUxMX0NFTExfQ0hBUiwgTlVMTF9DRUxMX0NPREUgfSBmcm9tICdjb21tb24vYnVmZmVyL0NvbnN0YW50cyc7XG5pbXBvcnQgeyBJQ29yZVNlcnZpY2UsIElEZWNvcmF0aW9uU2VydmljZSwgSU9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IFRlcm1pbmFsIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcbmltcG9ydCB7IEdseXBoUmVuZGVyZXIgfSBmcm9tICcuL0dseXBoUmVuZGVyZXInO1xuaW1wb3J0IHsgUmVjdGFuZ2xlUmVuZGVyZXIgfSBmcm9tICcuL1JlY3RhbmdsZVJlbmRlcmVyJztcbmltcG9ydCB7IENPTUJJTkVEX0NIQVJfQklUX01BU0ssIFJFTkRFUl9NT0RFTF9CR19PRkZTRVQsIFJFTkRFUl9NT0RFTF9FWFRfT0ZGU0VULCBSRU5ERVJfTU9ERUxfRkdfT0ZGU0VULCBSRU5ERVJfTU9ERUxfSU5ESUNJRVNfUEVSX0NFTEwsIFJlbmRlck1vZGVsIH0gZnJvbSAnLi9SZW5kZXJNb2RlbCc7XG5pbXBvcnQgeyBJV2ViR0wyUmVuZGVyaW5nQ29udGV4dCB9IGZyb20gJy4vVHlwZXMnO1xuaW1wb3J0IHsgTGlua1JlbmRlckxheWVyIH0gZnJvbSAnLi9yZW5kZXJMYXllci9MaW5rUmVuZGVyTGF5ZXInO1xuaW1wb3J0IHsgSVJlbmRlckxheWVyIH0gZnJvbSAnLi9yZW5kZXJMYXllci9UeXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBXZWJnbFJlbmRlcmVyIGV4dGVuZHMgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElSZW5kZXJlciB7XG4gIHByaXZhdGUgX3JlbmRlckxheWVyczogSVJlbmRlckxheWVyW107XG4gIHByaXZhdGUgX2N1cnNvckJsaW5rU3RhdGVNYW5hZ2VyOiBNdXRhYmxlRGlzcG9zYWJsZTxDdXJzb3JCbGlua1N0YXRlTWFuYWdlcj4gPSBuZXcgTXV0YWJsZURpc3Bvc2FibGUoKTtcbiAgcHJpdmF0ZSBfY2hhckF0bGFzRGlzcG9zYWJsZSA9IHRoaXMucmVnaXN0ZXIobmV3IE11dGFibGVEaXNwb3NhYmxlKCkpO1xuICBwcml2YXRlIF9jaGFyQXRsYXM6IElUZXh0dXJlQXRsYXMgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2RldmljZVBpeGVsUmF0aW86IG51bWJlcjtcbiAgcHJpdmF0ZSBfb2JzZXJ2ZXJEaXNwb3NhYmxlID0gdGhpcy5yZWdpc3RlcihuZXcgTXV0YWJsZURpc3Bvc2FibGUoKSk7XG5cbiAgcHJpdmF0ZSBfbW9kZWw6IFJlbmRlck1vZGVsID0gbmV3IFJlbmRlck1vZGVsKCk7XG4gIHByaXZhdGUgX3dvcmtDZWxsOiBJQ2VsbERhdGEgPSBuZXcgQ2VsbERhdGEoKTtcbiAgcHJpdmF0ZSBfd29ya0NlbGwyOiBJQ2VsbERhdGEgPSBuZXcgQ2VsbERhdGEoKTtcbiAgcHJpdmF0ZSBfY2VsbENvbG9yUmVzb2x2ZXI6IENlbGxDb2xvclJlc29sdmVyO1xuXG4gIHByaXZhdGUgX2NhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XG4gIHByaXZhdGUgX2dsOiBJV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcbiAgcHJpdmF0ZSBfcmVjdGFuZ2xlUmVuZGVyZXI6IE11dGFibGVEaXNwb3NhYmxlPFJlY3RhbmdsZVJlbmRlcmVyPiA9IHRoaXMucmVnaXN0ZXIobmV3IE11dGFibGVEaXNwb3NhYmxlKCkpO1xuICBwcml2YXRlIF9nbHlwaFJlbmRlcmVyOiBNdXRhYmxlRGlzcG9zYWJsZTxHbHlwaFJlbmRlcmVyPiA9IHRoaXMucmVnaXN0ZXIobmV3IE11dGFibGVEaXNwb3NhYmxlKCkpO1xuXG4gIHB1YmxpYyByZWFkb25seSBkaW1lbnNpb25zOiBJUmVuZGVyRGltZW5zaW9ucztcblxuICBwcml2YXRlIF9jb3JlOiBJVGVybWluYWw7XG4gIHByaXZhdGUgX2lzQXR0YWNoZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgX2NvbnRleHRSZXN0b3JhdGlvblRpbWVvdXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vbkNoYW5nZVRleHR1cmVBdGxhcyA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxIVE1MQ2FudmFzRWxlbWVudD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkNoYW5nZVRleHR1cmVBdGxhcyA9IHRoaXMuX29uQ2hhbmdlVGV4dHVyZUF0bGFzLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vbkFkZFRleHR1cmVBdGxhc0NhbnZhcyA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxIVE1MQ2FudmFzRWxlbWVudD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkFkZFRleHR1cmVBdGxhc0NhbnZhcyA9IHRoaXMuX29uQWRkVGV4dHVyZUF0bGFzQ2FudmFzLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vblJlbW92ZVRleHR1cmVBdGxhc0NhbnZhcyA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxIVE1MQ2FudmFzRWxlbWVudD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblJlbW92ZVRleHR1cmVBdGxhc0NhbnZhcyA9IHRoaXMuX29uUmVtb3ZlVGV4dHVyZUF0bGFzQ2FudmFzLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vblJlcXVlc3RSZWRyYXcgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8SVJlcXVlc3RSZWRyYXdFdmVudD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblJlcXVlc3RSZWRyYXcgPSB0aGlzLl9vblJlcXVlc3RSZWRyYXcuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uQ29udGV4dExvc3MgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkNvbnRleHRMb3NzID0gdGhpcy5fb25Db250ZXh0TG9zcy5ldmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF90ZXJtaW5hbDogVGVybWluYWwsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2hhcmFjdGVySm9pbmVyU2VydmljZTogSUNoYXJhY3RlckpvaW5lclNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2hhclNpemVTZXJ2aWNlOiBJQ2hhclNpemVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvcmVCcm93c2VyU2VydmljZTogSUNvcmVCcm93c2VyU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb3JlU2VydmljZTogSUNvcmVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RlY29yYXRpb25TZXJ2aWNlOiBJRGVjb3JhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90aGVtZVNlcnZpY2U6IElUaGVtZVNlcnZpY2UsXG4gICAgcHJlc2VydmVEcmF3aW5nQnVmZmVyPzogYm9vbGVhblxuICApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl90aGVtZVNlcnZpY2Uub25DaGFuZ2VDb2xvcnMoKCkgPT4gdGhpcy5faGFuZGxlQ29sb3JDaGFuZ2UoKSkpO1xuXG4gICAgdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIgPSBuZXcgQ2VsbENvbG9yUmVzb2x2ZXIodGhpcy5fdGVybWluYWwsIHRoaXMuX29wdGlvbnNTZXJ2aWNlLCB0aGlzLl9tb2RlbC5zZWxlY3Rpb24sIHRoaXMuX2RlY29yYXRpb25TZXJ2aWNlLCB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UsIHRoaXMuX3RoZW1lU2VydmljZSk7XG5cbiAgICB0aGlzLl9jb3JlID0gKHRoaXMuX3Rlcm1pbmFsIGFzIGFueSkuX2NvcmU7XG5cbiAgICB0aGlzLl9yZW5kZXJMYXllcnMgPSBbXG4gICAgICBuZXcgTGlua1JlbmRlckxheWVyKHRoaXMuX2NvcmUuc2NyZWVuRWxlbWVudCEsIDIsIHRoaXMuX3Rlcm1pbmFsLCB0aGlzLl9jb3JlLmxpbmtpZmllciEsIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZSwgX29wdGlvbnNTZXJ2aWNlLCB0aGlzLl90aGVtZVNlcnZpY2UpXG4gICAgXTtcbiAgICB0aGlzLmRpbWVuc2lvbnMgPSBjcmVhdGVSZW5kZXJEaW1lbnNpb25zKCk7XG4gICAgdGhpcy5fZGV2aWNlUGl4ZWxSYXRpbyA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5kcHI7XG4gICAgdGhpcy5fdXBkYXRlRGltZW5zaW9ucygpO1xuICAgIHRoaXMuX3VwZGF0ZUN1cnNvckJsaW5rKCk7XG4gICAgdGhpcy5yZWdpc3Rlcihfb3B0aW9uc1NlcnZpY2Uub25PcHRpb25DaGFuZ2UoKCkgPT4gdGhpcy5faGFuZGxlT3B0aW9uc0NoYW5nZWQoKSkpO1xuXG4gICAgdGhpcy5fY2FudmFzID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLm1haW5Eb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcblxuICAgIGNvbnN0IGNvbnRleHRBdHRyaWJ1dGVzID0ge1xuICAgICAgYW50aWFsaWFzOiBmYWxzZSxcbiAgICAgIGRlcHRoOiBmYWxzZSxcbiAgICAgIHByZXNlcnZlRHJhd2luZ0J1ZmZlclxuICAgIH07XG4gICAgdGhpcy5fZ2wgPSB0aGlzLl9jYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wyJywgY29udGV4dEF0dHJpYnV0ZXMpIGFzIElXZWJHTDJSZW5kZXJpbmdDb250ZXh0O1xuICAgIGlmICghdGhpcy5fZ2wpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignV2ViR0wyIG5vdCBzdXBwb3J0ZWQgJyArIHRoaXMuX2dsKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcih0aGlzLl9jYW52YXMsICd3ZWJnbGNvbnRleHRsb3N0JywgKGUpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCd3ZWJnbGNvbnRleHRsb3N0IGV2ZW50IHJlY2VpdmVkJyk7XG4gICAgICAvLyBQcmV2ZW50IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGluIG9yZGVyIHRvIGVuYWJsZSBXZWJHTCBjb250ZXh0IHJlc3RvcmF0aW9uLlxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgLy8gV2FpdCBhIGZldyBzZWNvbmRzIHRvIHNlZSBpZiB0aGUgJ3dlYmdsY29udGV4dHJlc3RvcmVkJyBldmVudCBpcyBmaXJlZC5cbiAgICAgIC8vIElmIG5vdCwgZGlzcGF0Y2ggdGhlIG9uQ29udGV4dExvc3Mgbm90aWZpY2F0aW9uIHRvIG9ic2VydmVycy5cbiAgICAgIHRoaXMuX2NvbnRleHRSZXN0b3JhdGlvblRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5fY29udGV4dFJlc3RvcmF0aW9uVGltZW91dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc29sZS53YXJuKCd3ZWJnbCBjb250ZXh0IG5vdCByZXN0b3JlZDsgZmlyaW5nIG9uQ29udGV4dExvc3MnKTtcbiAgICAgICAgdGhpcy5fb25Db250ZXh0TG9zcy5maXJlKGUpO1xuICAgICAgfSwgMzAwMCAvKiBtcyAqLyk7XG4gICAgfSkpO1xuICAgIHRoaXMucmVnaXN0ZXIoYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKHRoaXMuX2NhbnZhcywgJ3dlYmdsY29udGV4dHJlc3RvcmVkJywgKGUpID0+IHtcbiAgICAgIGNvbnNvbGUud2Fybignd2ViZ2xjb250ZXh0cmVzdG9yZWQgZXZlbnQgcmVjZWl2ZWQnKTtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9jb250ZXh0UmVzdG9yYXRpb25UaW1lb3V0KTtcbiAgICAgIHRoaXMuX2NvbnRleHRSZXN0b3JhdGlvblRpbWVvdXQgPSB1bmRlZmluZWQ7XG4gICAgICAvLyBUaGUgdGV4dHVyZSBhdGxhcyBhbmQgZ2x5cGggcmVuZGVyZXIgbXVzdCBiZSBmdWxseSByZWluaXRpYWxpemVkXG4gICAgICAvLyBiZWNhdXNlIHRoZWlyIGNvbnRlbnRzIGhhdmUgYmVlbiBsb3N0LlxuICAgICAgcmVtb3ZlVGVybWluYWxGcm9tQ2FjaGUodGhpcy5fdGVybWluYWwpO1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZVdlYkdMU3RhdGUoKTtcbiAgICAgIHRoaXMuX3JlcXVlc3RSZWRyYXdWaWV3cG9ydCgpO1xuICAgIH0pKTtcblxuICAgIHRoaXMuX29ic2VydmVyRGlzcG9zYWJsZS52YWx1ZSA9IG9ic2VydmVEZXZpY2VQaXhlbERpbWVuc2lvbnModGhpcy5fY2FudmFzLCB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LCAodywgaCkgPT4gdGhpcy5fc2V0Q2FudmFzRGV2aWNlUGl4ZWxEaW1lbnNpb25zKHcsIGgpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5vbldpbmRvd0NoYW5nZSh3ID0+IHtcbiAgICAgIHRoaXMuX29ic2VydmVyRGlzcG9zYWJsZS52YWx1ZSA9IG9ic2VydmVEZXZpY2VQaXhlbERpbWVuc2lvbnModGhpcy5fY2FudmFzLCB3LCAodywgaCkgPT4gdGhpcy5fc2V0Q2FudmFzRGV2aWNlUGl4ZWxEaW1lbnNpb25zKHcsIGgpKTtcbiAgICB9KSk7XG5cbiAgICB0aGlzLl9jb3JlLnNjcmVlbkVsZW1lbnQhLmFwcGVuZENoaWxkKHRoaXMuX2NhbnZhcyk7XG5cbiAgICBbdGhpcy5fcmVjdGFuZ2xlUmVuZGVyZXIudmFsdWUsIHRoaXMuX2dseXBoUmVuZGVyZXIudmFsdWVdID0gdGhpcy5faW5pdGlhbGl6ZVdlYkdMU3RhdGUoKTtcblxuICAgIHRoaXMuX2lzQXR0YWNoZWQgPSB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LmRvY3VtZW50LmJvZHkuY29udGFpbnModGhpcy5fY29yZS5zY3JlZW5FbGVtZW50ISk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGwgb2YgdGhpcy5fcmVuZGVyTGF5ZXJzKSB7XG4gICAgICAgIGwuZGlzcG9zZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5fY2FudmFzLnBhcmVudEVsZW1lbnQ/LnJlbW92ZUNoaWxkKHRoaXMuX2NhbnZhcyk7XG4gICAgICByZW1vdmVUZXJtaW5hbEZyb21DYWNoZSh0aGlzLl90ZXJtaW5hbCk7XG4gICAgfSkpO1xuICB9XG5cbiAgcHVibGljIGdldCB0ZXh0dXJlQXRsYXMoKTogSFRNTENhbnZhc0VsZW1lbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jaGFyQXRsYXM/LnBhZ2VzWzBdLmNhbnZhcztcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUNvbG9yQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuX3JlZnJlc2hDaGFyQXRsYXMoKTtcblxuICAgIC8vIEZvcmNlIGEgZnVsbCByZWZyZXNoXG4gICAgdGhpcy5fY2xlYXJNb2RlbCh0cnVlKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVEZXZpY2VQaXhlbFJhdGlvQ2hhbmdlKCk6IHZvaWQge1xuICAgIC8vIElmIHRoZSBkZXZpY2UgcGl4ZWwgcmF0aW8gY2hhbmdlZCwgdGhlIGNoYXIgYXRsYXMgbmVlZHMgdG8gYmUgcmVnZW5lcmF0ZWRcbiAgICAvLyBhbmQgdGhlIHRlcm1pbmFsIG5lZWRzIHRvIHJlZnJlc2hlZFxuICAgIGlmICh0aGlzLl9kZXZpY2VQaXhlbFJhdGlvICE9PSB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuZHByKSB7XG4gICAgICB0aGlzLl9kZXZpY2VQaXhlbFJhdGlvID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmRwcjtcbiAgICAgIHRoaXMuaGFuZGxlUmVzaXplKHRoaXMuX3Rlcm1pbmFsLmNvbHMsIHRoaXMuX3Rlcm1pbmFsLnJvd3MpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVSZXNpemUoY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBVcGRhdGUgY2hhcmFjdGVyIGFuZCBjYW52YXMgZGltZW5zaW9uc1xuICAgIHRoaXMuX3VwZGF0ZURpbWVuc2lvbnMoKTtcblxuICAgIHRoaXMuX21vZGVsLnJlc2l6ZSh0aGlzLl90ZXJtaW5hbC5jb2xzLCB0aGlzLl90ZXJtaW5hbC5yb3dzKTtcblxuICAgIC8vIFJlc2l6ZSBhbGwgcmVuZGVyIGxheWVyc1xuICAgIGZvciAoY29uc3QgbCBvZiB0aGlzLl9yZW5kZXJMYXllcnMpIHtcbiAgICAgIGwucmVzaXplKHRoaXMuX3Rlcm1pbmFsLCB0aGlzLmRpbWVuc2lvbnMpO1xuICAgIH1cblxuICAgIC8vIFJlc2l6ZSB0aGUgY2FudmFzXG4gICAgdGhpcy5fY2FudmFzLndpZHRoID0gdGhpcy5kaW1lbnNpb25zLmRldmljZS5jYW52YXMud2lkdGg7XG4gICAgdGhpcy5fY2FudmFzLmhlaWdodCA9IHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLmhlaWdodDtcbiAgICB0aGlzLl9jYW52YXMuc3R5bGUud2lkdGggPSBgJHt0aGlzLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy53aWR0aH1weGA7XG4gICAgdGhpcy5fY2FudmFzLnN0eWxlLmhlaWdodCA9IGAke3RoaXMuZGltZW5zaW9ucy5jc3MuY2FudmFzLmhlaWdodH1weGA7XG5cbiAgICAvLyBSZXNpemUgdGhlIHNjcmVlblxuICAgIHRoaXMuX2NvcmUuc2NyZWVuRWxlbWVudCEuc3R5bGUud2lkdGggPSBgJHt0aGlzLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy53aWR0aH1weGA7XG4gICAgdGhpcy5fY29yZS5zY3JlZW5FbGVtZW50IS5zdHlsZS5oZWlnaHQgPSBgJHt0aGlzLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy5oZWlnaHR9cHhgO1xuXG4gICAgdGhpcy5fcmVjdGFuZ2xlUmVuZGVyZXIudmFsdWU/LnNldERpbWVuc2lvbnModGhpcy5kaW1lbnNpb25zKTtcbiAgICB0aGlzLl9yZWN0YW5nbGVSZW5kZXJlci52YWx1ZT8uaGFuZGxlUmVzaXplKCk7XG4gICAgdGhpcy5fZ2x5cGhSZW5kZXJlci52YWx1ZT8uc2V0RGltZW5zaW9ucyh0aGlzLmRpbWVuc2lvbnMpO1xuICAgIHRoaXMuX2dseXBoUmVuZGVyZXIudmFsdWU/LmhhbmRsZVJlc2l6ZSgpO1xuXG4gICAgdGhpcy5fcmVmcmVzaENoYXJBdGxhcygpO1xuXG4gICAgLy8gRm9yY2UgYSBmdWxsIHJlZnJlc2guIFJlc2l6aW5nIGBfZ2x5cGhSZW5kZXJlcmAgc2hvdWxkIGNsZWFyIGl0IGFscmVhZHksXG4gICAgLy8gc28gdGhlcmUgaXMgbm8gbmVlZCB0byBjbGVhciBpdCBhZ2FpbiBoZXJlLlxuICAgIHRoaXMuX2NsZWFyTW9kZWwoZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZUNoYXJTaXplQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmhhbmRsZVJlc2l6ZSh0aGlzLl90ZXJtaW5hbC5jb2xzLCB0aGlzLl90ZXJtaW5hbC5yb3dzKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVCbHVyKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgbCBvZiB0aGlzLl9yZW5kZXJMYXllcnMpIHtcbiAgICAgIGwuaGFuZGxlQmx1cih0aGlzLl90ZXJtaW5hbCk7XG4gICAgfVxuICAgIHRoaXMuX2N1cnNvckJsaW5rU3RhdGVNYW5hZ2VyLnZhbHVlPy5wYXVzZSgpO1xuICAgIC8vIFJlcXVlc3QgYSByZWRyYXcgZm9yIGFjdGl2ZS9pbmFjdGl2ZSBzZWxlY3Rpb24gYmFja2dyb3VuZFxuICAgIHRoaXMuX3JlcXVlc3RSZWRyYXdWaWV3cG9ydCgpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZUZvY3VzKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgbCBvZiB0aGlzLl9yZW5kZXJMYXllcnMpIHtcbiAgICAgIGwuaGFuZGxlRm9jdXModGhpcy5fdGVybWluYWwpO1xuICAgIH1cbiAgICB0aGlzLl9jdXJzb3JCbGlua1N0YXRlTWFuYWdlci52YWx1ZT8ucmVzdW1lKCk7XG4gICAgLy8gUmVxdWVzdCBhIHJlZHJhdyBmb3IgYWN0aXZlL2luYWN0aXZlIHNlbGVjdGlvbiBiYWNrZ3JvdW5kXG4gICAgdGhpcy5fcmVxdWVzdFJlZHJhd1ZpZXdwb3J0KCk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChzdGFydDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgZW5kOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBjb2x1bW5TZWxlY3RNb2RlOiBib29sZWFuKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBsIG9mIHRoaXMuX3JlbmRlckxheWVycykge1xuICAgICAgbC5oYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKHRoaXMuX3Rlcm1pbmFsLCBzdGFydCwgZW5kLCBjb2x1bW5TZWxlY3RNb2RlKTtcbiAgICB9XG4gICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uLnVwZGF0ZSh0aGlzLl9jb3JlLCBzdGFydCwgZW5kLCBjb2x1bW5TZWxlY3RNb2RlKTtcbiAgICB0aGlzLl9yZXF1ZXN0UmVkcmF3Vmlld3BvcnQoKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVDdXJzb3JNb3ZlKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgbCBvZiB0aGlzLl9yZW5kZXJMYXllcnMpIHtcbiAgICAgIGwuaGFuZGxlQ3Vyc29yTW92ZSh0aGlzLl90ZXJtaW5hbCk7XG4gICAgfVxuICAgIHRoaXMuX2N1cnNvckJsaW5rU3RhdGVNYW5hZ2VyLnZhbHVlPy5yZXN0YXJ0QmxpbmtBbmltYXRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZU9wdGlvbnNDaGFuZ2VkKCk6IHZvaWQge1xuICAgIHRoaXMuX3VwZGF0ZURpbWVuc2lvbnMoKTtcbiAgICB0aGlzLl9yZWZyZXNoQ2hhckF0bGFzKCk7XG4gICAgdGhpcy5fdXBkYXRlQ3Vyc29yQmxpbmsoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBtZW1iZXJzIGRlcGVuZGVudCBvbiBXZWJHTCBjb250ZXh0IHN0YXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZVdlYkdMU3RhdGUoKTogW1JlY3RhbmdsZVJlbmRlcmVyLCBHbHlwaFJlbmRlcmVyXSB7XG4gICAgdGhpcy5fcmVjdGFuZ2xlUmVuZGVyZXIudmFsdWUgPSBuZXcgUmVjdGFuZ2xlUmVuZGVyZXIodGhpcy5fdGVybWluYWwsIHRoaXMuX2dsLCB0aGlzLmRpbWVuc2lvbnMsIHRoaXMuX3RoZW1lU2VydmljZSk7XG4gICAgdGhpcy5fZ2x5cGhSZW5kZXJlci52YWx1ZSA9IG5ldyBHbHlwaFJlbmRlcmVyKHRoaXMuX3Rlcm1pbmFsLCB0aGlzLl9nbCwgdGhpcy5kaW1lbnNpb25zLCB0aGlzLl9vcHRpb25zU2VydmljZSk7XG5cbiAgICAvLyBVcGRhdGUgZGltZW5zaW9ucyBhbmQgYWNxdWlyZSBjaGFyIGF0bGFzXG4gICAgdGhpcy5oYW5kbGVDaGFyU2l6ZUNoYW5nZWQoKTtcblxuICAgIHJldHVybiBbdGhpcy5fcmVjdGFuZ2xlUmVuZGVyZXIudmFsdWUsIHRoaXMuX2dseXBoUmVuZGVyZXIudmFsdWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2hlcyB0aGUgY2hhciBhdGxhcywgYXF1aXJpbmcgYSBuZXcgb25lIGlmIG5lY2Vzc2FyeS5cbiAgICovXG4gIHByaXZhdGUgX3JlZnJlc2hDaGFyQXRsYXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2hhci53aWR0aCA8PSAwICYmIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2hhci5oZWlnaHQgPD0gMCkge1xuICAgICAgLy8gTWFyayBhcyBub3QgYXR0YWNoZWQgc28gY2hhciBhdGxhcyBnZXRzIHJlZnJlc2hlZCBvbiBuZXh0IHJlbmRlclxuICAgICAgdGhpcy5faXNBdHRhY2hlZCA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGF0bGFzID0gYWNxdWlyZVRleHR1cmVBdGxhcyhcbiAgICAgIHRoaXMuX3Rlcm1pbmFsLFxuICAgICAgdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucyxcbiAgICAgIHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMsXG4gICAgICB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNlbGwud2lkdGgsXG4gICAgICB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNlbGwuaGVpZ2h0LFxuICAgICAgdGhpcy5kaW1lbnNpb25zLmRldmljZS5jaGFyLndpZHRoLFxuICAgICAgdGhpcy5kaW1lbnNpb25zLmRldmljZS5jaGFyLmhlaWdodCxcbiAgICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5kcHJcbiAgICApO1xuICAgIGlmICh0aGlzLl9jaGFyQXRsYXMgIT09IGF0bGFzKSB7XG4gICAgICB0aGlzLl9vbkNoYW5nZVRleHR1cmVBdGxhcy5maXJlKGF0bGFzLnBhZ2VzWzBdLmNhbnZhcyk7XG4gICAgICB0aGlzLl9jaGFyQXRsYXNEaXNwb3NhYmxlLnZhbHVlID0gZ2V0RGlzcG9zZUFycmF5RGlzcG9zYWJsZShbXG4gICAgICAgIGZvcndhcmRFdmVudChhdGxhcy5vbkFkZFRleHR1cmVBdGxhc0NhbnZhcywgdGhpcy5fb25BZGRUZXh0dXJlQXRsYXNDYW52YXMpLFxuICAgICAgICBmb3J3YXJkRXZlbnQoYXRsYXMub25SZW1vdmVUZXh0dXJlQXRsYXNDYW52YXMsIHRoaXMuX29uUmVtb3ZlVGV4dHVyZUF0bGFzQ2FudmFzKVxuICAgICAgXSk7XG4gICAgfVxuICAgIHRoaXMuX2NoYXJBdGxhcyA9IGF0bGFzO1xuICAgIHRoaXMuX2NoYXJBdGxhcy53YXJtVXAoKTtcbiAgICB0aGlzLl9nbHlwaFJlbmRlcmVyLnZhbHVlPy5zZXRBdGxhcyh0aGlzLl9jaGFyQXRsYXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHRoZSBtb2RlbC5cbiAgICogQHBhcmFtIGNsZWFyR2x5cGhSZW5kZXJlciBXaGV0aGVyIHRvIGFsc28gY2xlYXIgdGhlIGdseXBoIHJlbmRlcmVyLiBUaGlzXG4gICAqIHNob3VsZCBiZSB0cnVlIGdlbmVyYWxseSB0byBtYWtlIHN1cmUgaXQgaXMgaW4gdGhlIHNhbWUgc3RhdGUgYXMgdGhlIG1vZGVsLlxuICAgKi9cbiAgcHJpdmF0ZSBfY2xlYXJNb2RlbChjbGVhckdseXBoUmVuZGVyZXI6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9tb2RlbC5jbGVhcigpO1xuICAgIGlmIChjbGVhckdseXBoUmVuZGVyZXIpIHtcbiAgICAgIHRoaXMuX2dseXBoUmVuZGVyZXIudmFsdWU/LmNsZWFyKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNsZWFyVGV4dHVyZUF0bGFzKCk6IHZvaWQge1xuICAgIHRoaXMuX2NoYXJBdGxhcz8uY2xlYXJUZXh0dXJlKCk7XG4gICAgdGhpcy5fY2xlYXJNb2RlbCh0cnVlKTtcbiAgICB0aGlzLl9yZXF1ZXN0UmVkcmF3Vmlld3BvcnQoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLl9jbGVhck1vZGVsKHRydWUpO1xuICAgIGZvciAoY29uc3QgbCBvZiB0aGlzLl9yZW5kZXJMYXllcnMpIHtcbiAgICAgIGwucmVzZXQodGhpcy5fdGVybWluYWwpO1xuICAgIH1cblxuICAgIHRoaXMuX2N1cnNvckJsaW5rU3RhdGVNYW5hZ2VyLnZhbHVlPy5yZXN0YXJ0QmxpbmtBbmltYXRpb24oKTtcbiAgICB0aGlzLl91cGRhdGVDdXJzb3JCbGluaygpO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyQ2hhcmFjdGVySm9pbmVyKGhhbmRsZXI6ICh0ZXh0OiBzdHJpbmcpID0+IFtudW1iZXIsIG51bWJlcl1bXSk6IG51bWJlciB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgcHVibGljIGRlcmVnaXN0ZXJDaGFyYWN0ZXJKb2luZXIoam9pbmVySWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyByZW5kZXJSb3dzKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9pc0F0dGFjaGVkKSB7XG4gICAgICBpZiAodGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5kb2N1bWVudC5ib2R5LmNvbnRhaW5zKHRoaXMuX2NvcmUuc2NyZWVuRWxlbWVudCEpICYmIHRoaXMuX2NoYXJTaXplU2VydmljZS53aWR0aCAmJiB0aGlzLl9jaGFyU2l6ZVNlcnZpY2UuaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZURpbWVuc2lvbnMoKTtcbiAgICAgICAgdGhpcy5fcmVmcmVzaENoYXJBdGxhcygpO1xuICAgICAgICB0aGlzLl9pc0F0dGFjaGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgcmVuZGVyIGxheWVyc1xuICAgIGZvciAoY29uc3QgbCBvZiB0aGlzLl9yZW5kZXJMYXllcnMpIHtcbiAgICAgIGwuaGFuZGxlR3JpZENoYW5nZWQodGhpcy5fdGVybWluYWwsIHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fZ2x5cGhSZW5kZXJlci52YWx1ZSB8fCAhdGhpcy5fcmVjdGFuZ2xlUmVuZGVyZXIudmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUZWxsIHJlbmRlcmVyIHRoZSBmcmFtZSBpcyBiZWdpbm5pbmdcbiAgICAvLyB1cG9uIGEgbW9kZWwgY2xlYXIgYWxzbyByZWZyZXNoIHRoZSBmdWxsIHZpZXdwb3J0IG1vZGVsXG4gICAgLy8gKGFsc28gdHJpZ2dlcmVkIGJ5IGFuIGF0bGFzIHBhZ2UgbWVyZ2UsIHBhcnQgb2YgIzQ0ODApXG4gICAgaWYgKHRoaXMuX2dseXBoUmVuZGVyZXIudmFsdWUuYmVnaW5GcmFtZSgpKSB7XG4gICAgICB0aGlzLl9jbGVhck1vZGVsKHRydWUpO1xuICAgICAgdGhpcy5fdXBkYXRlTW9kZWwoMCwgdGhpcy5fdGVybWluYWwucm93cyAtIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBqdXN0IHVwZGF0ZSBjaGFuZ2VkIGxpbmVzIHRvIGRyYXdcbiAgICAgIHRoaXMuX3VwZGF0ZU1vZGVsKHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIC8vIFJlbmRlclxuICAgIHRoaXMuX3JlY3RhbmdsZVJlbmRlcmVyLnZhbHVlLnJlbmRlckJhY2tncm91bmRzKCk7XG4gICAgdGhpcy5fZ2x5cGhSZW5kZXJlci52YWx1ZS5yZW5kZXIodGhpcy5fbW9kZWwpO1xuICAgIGlmICghdGhpcy5fY3Vyc29yQmxpbmtTdGF0ZU1hbmFnZXIudmFsdWUgfHwgdGhpcy5fY3Vyc29yQmxpbmtTdGF0ZU1hbmFnZXIudmFsdWUuaXNDdXJzb3JWaXNpYmxlKSB7XG4gICAgICB0aGlzLl9yZWN0YW5nbGVSZW5kZXJlci52YWx1ZS5yZW5kZXJDdXJzb3IoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVDdXJzb3JCbGluaygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fdGVybWluYWwub3B0aW9ucy5jdXJzb3JCbGluaykge1xuICAgICAgdGhpcy5fY3Vyc29yQmxpbmtTdGF0ZU1hbmFnZXIudmFsdWUgPSBuZXcgQ3Vyc29yQmxpbmtTdGF0ZU1hbmFnZXIoKCkgPT4ge1xuICAgICAgICB0aGlzLl9yZXF1ZXN0UmVkcmF3Q3Vyc29yKCk7XG4gICAgICB9LCB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jdXJzb3JCbGlua1N0YXRlTWFuYWdlci5jbGVhcigpO1xuICAgIH1cbiAgICAvLyBSZXF1ZXN0IGEgcmVmcmVzaCBmcm9tIHRoZSB0ZXJtaW5hbCBhcyBtYW5hZ2VtZW50IG9mIHJlbmRlcmluZyBpcyBiZWluZ1xuICAgIC8vIG1vdmVkIGJhY2sgdG8gdGhlIHRlcm1pbmFsXG4gICAgdGhpcy5fcmVxdWVzdFJlZHJhd0N1cnNvcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlTW9kZWwoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB0ZXJtaW5hbCA9IHRoaXMuX2NvcmU7XG4gICAgbGV0IGNlbGw6IElDZWxsRGF0YSA9IHRoaXMuX3dvcmtDZWxsO1xuXG4gICAgLy8gRGVjbGFyZSB2YXJpYWJsZSBhaGVhZCBvZiB0aW1lIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvblxuICAgIGxldCBsYXN0Qmc6IG51bWJlcjtcbiAgICBsZXQgeTogbnVtYmVyO1xuICAgIGxldCByb3c6IG51bWJlcjtcbiAgICBsZXQgbGluZTogSUJ1ZmZlckxpbmU7XG4gICAgbGV0IGpvaW5lZFJhbmdlczogW251bWJlciwgbnVtYmVyXVtdO1xuICAgIGxldCBpc0pvaW5lZDogYm9vbGVhbjtcbiAgICBsZXQgbGFzdENoYXJYOiBudW1iZXI7XG4gICAgbGV0IHJhbmdlOiBbbnVtYmVyLCBudW1iZXJdO1xuICAgIGxldCBjaGFyczogc3RyaW5nO1xuICAgIGxldCBjb2RlOiBudW1iZXI7XG4gICAgbGV0IHdpZHRoOiBudW1iZXI7XG4gICAgbGV0IGk6IG51bWJlcjtcbiAgICBsZXQgeDogbnVtYmVyO1xuICAgIGxldCBqOiBudW1iZXI7XG4gICAgc3RhcnQgPSBjbGFtcChzdGFydCwgdGVybWluYWwucm93cyAtIDEsIDApO1xuICAgIGVuZCA9IGNsYW1wKGVuZCwgdGVybWluYWwucm93cyAtIDEsIDApO1xuXG4gICAgY29uc3QgY3Vyc29yWSA9IHRoaXMuX3Rlcm1pbmFsLmJ1ZmZlci5hY3RpdmUuYmFzZVkgKyB0aGlzLl90ZXJtaW5hbC5idWZmZXIuYWN0aXZlLmN1cnNvclk7XG4gICAgY29uc3Qgdmlld3BvcnRSZWxhdGl2ZUN1cnNvclkgPSBjdXJzb3JZIC0gdGVybWluYWwuYnVmZmVyLnlkaXNwO1xuICAgIC8vIGluIGNhc2UgY3Vyc29yLnggPT0gY29scyBhZGp1c3QgdmlzdWFsIGN1cnNvciB0byBjb2xzIC0gMVxuICAgIGNvbnN0IGN1cnNvclggPSBNYXRoLm1pbih0aGlzLl90ZXJtaW5hbC5idWZmZXIuYWN0aXZlLmN1cnNvclgsIHRlcm1pbmFsLmNvbHMgLSAxKTtcbiAgICBsZXQgbGFzdEN1cnNvclggPSAtMTtcbiAgICBjb25zdCBpc0N1cnNvclZpc2libGUgPVxuICAgICAgdGhpcy5fY29yZVNlcnZpY2UuaXNDdXJzb3JJbml0aWFsaXplZCAmJlxuICAgICAgIXRoaXMuX2NvcmVTZXJ2aWNlLmlzQ3Vyc29ySGlkZGVuICYmXG4gICAgICAoIXRoaXMuX2N1cnNvckJsaW5rU3RhdGVNYW5hZ2VyLnZhbHVlIHx8IHRoaXMuX2N1cnNvckJsaW5rU3RhdGVNYW5hZ2VyLnZhbHVlLmlzQ3Vyc29yVmlzaWJsZSk7XG4gICAgdGhpcy5fbW9kZWwuY3Vyc29yID0gdW5kZWZpbmVkO1xuICAgIGxldCBtb2RlbFVwZGF0ZWQgPSBmYWxzZTtcblxuICAgIGZvciAoeSA9IHN0YXJ0OyB5IDw9IGVuZDsgeSsrKSB7XG4gICAgICByb3cgPSB5ICsgdGVybWluYWwuYnVmZmVyLnlkaXNwO1xuICAgICAgbGluZSA9IHRlcm1pbmFsLmJ1ZmZlci5saW5lcy5nZXQocm93KSE7XG4gICAgICB0aGlzLl9tb2RlbC5saW5lTGVuZ3Roc1t5XSA9IDA7XG4gICAgICBqb2luZWRSYW5nZXMgPSB0aGlzLl9jaGFyYWN0ZXJKb2luZXJTZXJ2aWNlLmdldEpvaW5lZENoYXJhY3RlcnMocm93KTtcbiAgICAgIGZvciAoeCA9IDA7IHggPCB0ZXJtaW5hbC5jb2xzOyB4KyspIHtcbiAgICAgICAgbGFzdEJnID0gdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIucmVzdWx0LmJnO1xuICAgICAgICBsaW5lLmxvYWRDZWxsKHgsIGNlbGwpO1xuXG4gICAgICAgIGlmICh4ID09PSAwKSB7XG4gICAgICAgICAgbGFzdEJnID0gdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIucmVzdWx0LmJnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdHJ1ZSwgaW5kaWNhdGVzIHRoYXQgdGhlIGN1cnJlbnQgY2hhcmFjdGVyKHMpIHRvIGRyYXcgd2VyZSBqb2luZWQuXG4gICAgICAgIGlzSm9pbmVkID0gZmFsc2U7XG4gICAgICAgIGxhc3RDaGFyWCA9IHg7XG5cbiAgICAgICAgLy8gUHJvY2VzcyBhbnkgam9pbmVkIGNoYXJhY3RlciByYW5nZXMgYXMgbmVlZGVkLiBCZWNhdXNlIG9mIGhvdyB0aGVcbiAgICAgICAgLy8gcmFuZ2VzIGFyZSBwcm9kdWNlZCwgd2Uga25vdyB0aGF0IHRoZXkgYXJlIHZhbGlkIGZvciB0aGUgY2hhcmFjdGVyc1xuICAgICAgICAvLyBhbmQgYXR0cmlidXRlcyBvZiBvdXIgaW5wdXQuXG4gICAgICAgIGlmIChqb2luZWRSYW5nZXMubGVuZ3RoID4gMCAmJiB4ID09PSBqb2luZWRSYW5nZXNbMF1bMF0pIHtcbiAgICAgICAgICBpc0pvaW5lZCA9IHRydWU7XG4gICAgICAgICAgcmFuZ2UgPSBqb2luZWRSYW5nZXMuc2hpZnQoKSE7XG5cbiAgICAgICAgICAvLyBXZSBhbHJlYWR5IGtub3cgdGhlIGV4YWN0IHN0YXJ0IGFuZCBlbmQgY29sdW1uIG9mIHRoZSBqb2luZWQgcmFuZ2UsXG4gICAgICAgICAgLy8gc28gd2UgZ2V0IHRoZSBzdHJpbmcgYW5kIHdpZHRoIHJlcHJlc2VudGluZyBpdCBkaXJlY3RseS5cbiAgICAgICAgICBjZWxsID0gbmV3IEpvaW5lZENlbGxEYXRhKFxuICAgICAgICAgICAgY2VsbCxcbiAgICAgICAgICAgIGxpbmUhLnRyYW5zbGF0ZVRvU3RyaW5nKHRydWUsIHJhbmdlWzBdLCByYW5nZVsxXSksXG4gICAgICAgICAgICByYW5nZVsxXSAtIHJhbmdlWzBdXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFNraXAgb3ZlciB0aGUgY2VsbHMgb2NjdXBpZWQgYnkgdGhpcyByYW5nZSBpbiB0aGUgbG9vcFxuICAgICAgICAgIGxhc3RDaGFyWCA9IHJhbmdlWzFdIC0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoYXJzID0gY2VsbC5nZXRDaGFycygpO1xuICAgICAgICBjb2RlID0gY2VsbC5nZXRDb2RlKCk7XG4gICAgICAgIGkgPSAoKHkgKiB0ZXJtaW5hbC5jb2xzKSArIHgpICogUkVOREVSX01PREVMX0lORElDSUVTX1BFUl9DRUxMO1xuXG4gICAgICAgIC8vIExvYWQgY29sb3JzL3Jlc29sdmUgb3ZlcnJpZGVzIGludG8gd29yayBjb2xvcnNcbiAgICAgICAgdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIucmVzb2x2ZShjZWxsLCB4LCByb3csIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2VsbC53aWR0aCk7XG5cbiAgICAgICAgLy8gT3ZlcnJpZGUgY29sb3JzIGZvciBjdXJzb3IgY2VsbFxuICAgICAgICBpZiAoaXNDdXJzb3JWaXNpYmxlICYmIHJvdyA9PT0gY3Vyc29yWSkge1xuICAgICAgICAgIGlmICh4ID09PSBjdXJzb3JYKSB7XG4gICAgICAgICAgICB0aGlzLl9tb2RlbC5jdXJzb3IgPSB7XG4gICAgICAgICAgICAgIHg6IGN1cnNvclgsXG4gICAgICAgICAgICAgIHk6IHZpZXdwb3J0UmVsYXRpdmVDdXJzb3JZLFxuICAgICAgICAgICAgICB3aWR0aDogY2VsbC5nZXRXaWR0aCgpLFxuICAgICAgICAgICAgICBzdHlsZTogdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmlzRm9jdXNlZCA/XG4gICAgICAgICAgICAgICAgKHRlcm1pbmFsLm9wdGlvbnMuY3Vyc29yU3R5bGUgfHwgJ2Jsb2NrJykgOiB0ZXJtaW5hbC5vcHRpb25zLmN1cnNvckluYWN0aXZlU3R5bGUsXG4gICAgICAgICAgICAgIGN1cnNvcldpZHRoOiB0ZXJtaW5hbC5vcHRpb25zLmN1cnNvcldpZHRoLFxuICAgICAgICAgICAgICBkcHI6IHRoaXMuX2RldmljZVBpeGVsUmF0aW9cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsYXN0Q3Vyc29yWCA9IGN1cnNvclggKyBjZWxsLmdldFdpZHRoKCkgLSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoeCA+PSBjdXJzb3JYICYmIHggPD0gbGFzdEN1cnNvclggJiZcbiAgICAgICAgICAgICAgKCh0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuaXNGb2N1c2VkICYmXG4gICAgICAgICAgICAgICh0ZXJtaW5hbC5vcHRpb25zLmN1cnNvclN0eWxlIHx8ICdibG9jaycpID09PSAnYmxvY2snKSB8fFxuICAgICAgICAgICAgICAodGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmlzRm9jdXNlZCA9PT0gZmFsc2UgJiZcbiAgICAgICAgICAgICAgdGVybWluYWwub3B0aW9ucy5jdXJzb3JJbmFjdGl2ZVN0eWxlID09PSAnYmxvY2snKSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2NlbGxDb2xvclJlc29sdmVyLnJlc3VsdC5mZyA9XG4gICAgICAgICAgICAgIEF0dHJpYnV0ZXMuQ01fUkdCIHwgKHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMuY3Vyc29yQWNjZW50LnJnYmEgPj4gOCAmIEF0dHJpYnV0ZXMuUkdCX01BU0spO1xuICAgICAgICAgICAgdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIucmVzdWx0LmJnID1cbiAgICAgICAgICAgICAgQXR0cmlidXRlcy5DTV9SR0IgfCAodGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5jdXJzb3IucmdiYSA+PiA4ICYgQXR0cmlidXRlcy5SR0JfTUFTSyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgIT09IE5VTExfQ0VMTF9DT0RFKSB7XG4gICAgICAgICAgdGhpcy5fbW9kZWwubGluZUxlbmd0aHNbeV0gPSB4ICsgMTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vdGhpbmcgaGFzIGNoYW5nZWQsIG5vIHVwZGF0ZXMgbmVlZGVkXG4gICAgICAgIGlmICh0aGlzLl9tb2RlbC5jZWxsc1tpXSA9PT0gY29kZSAmJlxuICAgICAgICAgICAgdGhpcy5fbW9kZWwuY2VsbHNbaSArIFJFTkRFUl9NT0RFTF9CR19PRkZTRVRdID09PSB0aGlzLl9jZWxsQ29sb3JSZXNvbHZlci5yZXN1bHQuYmcgJiZcbiAgICAgICAgICAgIHRoaXMuX21vZGVsLmNlbGxzW2kgKyBSRU5ERVJfTU9ERUxfRkdfT0ZGU0VUXSA9PT0gdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIucmVzdWx0LmZnICYmXG4gICAgICAgICAgICB0aGlzLl9tb2RlbC5jZWxsc1tpICsgUkVOREVSX01PREVMX0VYVF9PRkZTRVRdID09PSB0aGlzLl9jZWxsQ29sb3JSZXNvbHZlci5yZXN1bHQuZXh0KSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBtb2RlbFVwZGF0ZWQgPSB0cnVlO1xuXG4gICAgICAgIC8vIEZsYWcgY29tYmluZWQgY2hhcnMgd2l0aCBhIGJpdCBtYXNrIHNvIHRoZXkncmUgZWFzaWx5IGlkZW50aWZpYWJsZVxuICAgICAgICBpZiAoY2hhcnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIGNvZGUgfD0gQ09NQklORURfQ0hBUl9CSVRfTUFTSztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhY2hlIHRoZSByZXN1bHRzIGluIHRoZSBtb2RlbFxuICAgICAgICB0aGlzLl9tb2RlbC5jZWxsc1tpXSA9IGNvZGU7XG4gICAgICAgIHRoaXMuX21vZGVsLmNlbGxzW2kgKyBSRU5ERVJfTU9ERUxfQkdfT0ZGU0VUXSA9IHRoaXMuX2NlbGxDb2xvclJlc29sdmVyLnJlc3VsdC5iZztcbiAgICAgICAgdGhpcy5fbW9kZWwuY2VsbHNbaSArIFJFTkRFUl9NT0RFTF9GR19PRkZTRVRdID0gdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIucmVzdWx0LmZnO1xuICAgICAgICB0aGlzLl9tb2RlbC5jZWxsc1tpICsgUkVOREVSX01PREVMX0VYVF9PRkZTRVRdID0gdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIucmVzdWx0LmV4dDtcblxuICAgICAgICB3aWR0aCA9IGNlbGwuZ2V0V2lkdGgoKTtcbiAgICAgICAgdGhpcy5fZ2x5cGhSZW5kZXJlci52YWx1ZSEudXBkYXRlQ2VsbCh4LCB5LCBjb2RlLCB0aGlzLl9jZWxsQ29sb3JSZXNvbHZlci5yZXN1bHQuYmcsIHRoaXMuX2NlbGxDb2xvclJlc29sdmVyLnJlc3VsdC5mZywgdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIucmVzdWx0LmV4dCwgY2hhcnMsIHdpZHRoLCBsYXN0QmcpO1xuXG4gICAgICAgIGlmIChpc0pvaW5lZCkge1xuICAgICAgICAgIC8vIFJlc3RvcmUgd29yayBjZWxsXG4gICAgICAgICAgY2VsbCA9IHRoaXMuX3dvcmtDZWxsO1xuXG4gICAgICAgICAgLy8gTnVsbCBvdXQgbm9uLWZpcnN0IGNlbGxzXG4gICAgICAgICAgZm9yICh4Kys7IHggPCBsYXN0Q2hhclg7IHgrKykge1xuICAgICAgICAgICAgaiA9ICgoeSAqIHRlcm1pbmFsLmNvbHMpICsgeCkgKiBSRU5ERVJfTU9ERUxfSU5ESUNJRVNfUEVSX0NFTEw7XG4gICAgICAgICAgICB0aGlzLl9nbHlwaFJlbmRlcmVyLnZhbHVlIS51cGRhdGVDZWxsKHgsIHksIE5VTExfQ0VMTF9DT0RFLCAwLCAwLCAwLCBOVUxMX0NFTExfQ0hBUiwgMCwgMCk7XG4gICAgICAgICAgICB0aGlzLl9tb2RlbC5jZWxsc1tqXSA9IE5VTExfQ0VMTF9DT0RFO1xuICAgICAgICAgICAgdGhpcy5fbW9kZWwuY2VsbHNbaiArIFJFTkRFUl9NT0RFTF9CR19PRkZTRVRdID0gdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIucmVzdWx0LmJnO1xuICAgICAgICAgICAgdGhpcy5fbW9kZWwuY2VsbHNbaiArIFJFTkRFUl9NT0RFTF9GR19PRkZTRVRdID0gdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIucmVzdWx0LmZnO1xuICAgICAgICAgICAgdGhpcy5fbW9kZWwuY2VsbHNbaiArIFJFTkRFUl9NT0RFTF9FWFRfT0ZGU0VUXSA9IHRoaXMuX2NlbGxDb2xvclJlc29sdmVyLnJlc3VsdC5leHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtb2RlbFVwZGF0ZWQpIHtcbiAgICAgIHRoaXMuX3JlY3RhbmdsZVJlbmRlcmVyLnZhbHVlIS51cGRhdGVCYWNrZ3JvdW5kcyh0aGlzLl9tb2RlbCk7XG4gICAgfVxuICAgIHRoaXMuX3JlY3RhbmdsZVJlbmRlcmVyLnZhbHVlIS51cGRhdGVDdXJzb3IodGhpcy5fbW9kZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY2FsY3VsYXRlcyB0aGUgY2hhcmFjdGVyIGFuZCBjYW52YXMgZGltZW5zaW9ucy5cbiAgICovXG4gIHByaXZhdGUgX3VwZGF0ZURpbWVuc2lvbnMoKTogdm9pZCB7XG4gICAgLy8gUGVyZm9ybSBhIG5ldyBtZWFzdXJlIGlmIHRoZSBDaGFyTWVhc3VyZSBkaW1lbnNpb25zIGFyZSBub3QgeWV0IGF2YWlsYWJsZVxuICAgIGlmICghdGhpcy5fY2hhclNpemVTZXJ2aWNlLndpZHRoIHx8ICF0aGlzLl9jaGFyU2l6ZVNlcnZpY2UuaGVpZ2h0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBkZXZpY2UgY2hhcmFjdGVyIHdpZHRoLiBXaWR0aCBpcyBmbG9vcmVkIGFzIGl0IG11c3QgYmUgZHJhd24gdG8gYW4gaW50ZWdlciBncmlkXG4gICAgLy8gaW4gb3JkZXIgZm9yIHRoZSBjaGFyIGF0bGFzIGdseXBocyB0byBub3QgYmUgYmx1cnJ5LlxuICAgIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2hhci53aWR0aCA9IE1hdGguZmxvb3IodGhpcy5fY2hhclNpemVTZXJ2aWNlLndpZHRoICogdGhpcy5fZGV2aWNlUGl4ZWxSYXRpbyk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGRldmljZSBjaGFyYWN0ZXIgaGVpZ2h0LiBIZWlnaHQgaXMgY2VpbGVkIGluIGNhc2UgZGV2aWNlUGl4ZWxSYXRpbyBpcyBhXG4gICAgLy8gZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGluIG9yZGVyIHRvIGVuc3VyZSB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgdG8gZHJhdyB0aGUgY2hhcmFjdGVyIHRvIHRoZVxuICAgIC8vIGNlbGwuXG4gICAgdGhpcy5kaW1lbnNpb25zLmRldmljZS5jaGFyLmhlaWdodCA9IE1hdGguY2VpbCh0aGlzLl9jaGFyU2l6ZVNlcnZpY2UuaGVpZ2h0ICogdGhpcy5fZGV2aWNlUGl4ZWxSYXRpbyk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGRldmljZSBjZWxsIGhlaWdodCwgaWYgbGluZUhlaWdodCBpcyBfbm90XyAxLCB0aGUgcmVzdWx0aW5nIHZhbHVlIHdpbGwgYmVcbiAgICAvLyBmbG9vcmVkIHNpbmNlIGxpbmVIZWlnaHQgY2FuIG5ldmVyIGJlIGxvd2VyIHRoZW4gMSwgdGhpcyBndWFyZW50ZWVzIHRoZSBkZXZpY2UgY2VsbCBoZWlnaHRcbiAgICAvLyB3aWxsIGFsd2F5cyBiZSBsYXJnZXIgdGhhbiBkZXZpY2UgY2hhciBoZWlnaHQuXG4gICAgdGhpcy5kaW1lbnNpb25zLmRldmljZS5jZWxsLmhlaWdodCA9IE1hdGguZmxvb3IodGhpcy5kaW1lbnNpb25zLmRldmljZS5jaGFyLmhlaWdodCAqIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMubGluZUhlaWdodCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIHkgb2Zmc2V0IHdpdGhpbiBhIGNlbGwgdGhhdCBnbHlwaCBzaG91bGQgZHJhdyBhdCBpbiBvcmRlciBmb3IgaXQgdG8gYmUgY2VudGVyZWRcbiAgICAvLyBjb3JyZWN0bHkgd2l0aGluIHRoZSBjZWxsLlxuICAgIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2hhci50b3AgPSB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmxpbmVIZWlnaHQgPT09IDEgPyAwIDogTWF0aC5yb3VuZCgodGhpcy5kaW1lbnNpb25zLmRldmljZS5jZWxsLmhlaWdodCAtIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2hhci5oZWlnaHQpIC8gMik7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGRldmljZSBjZWxsIHdpZHRoLCB0YWtpbmcgdGhlIGxldHRlclNwYWNpbmcgaW50byBhY2NvdW50LlxuICAgIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2VsbC53aWR0aCA9IHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2hhci53aWR0aCArIE1hdGgucm91bmQodGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5sZXR0ZXJTcGFjaW5nKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgeCBvZmZzZXQgd2l0aCBhIGNlbGwgdGhhdCB0ZXh0IHNob3VsZCBkcmF3IGZyb20gaW4gb3JkZXIgZm9yIGl0IHRvIGJlIGNlbnRlcmVkXG4gICAgLy8gY29ycmVjdGx5IHdpdGhpbiB0aGUgY2VsbC5cbiAgICB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNoYXIubGVmdCA9IE1hdGguZmxvb3IodGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5sZXR0ZXJTcGFjaW5nIC8gMik7XG5cbiAgICAvLyBSZWNhbGN1bGF0ZSB0aGUgY2FudmFzIGRpbWVuc2lvbnMsIHRoZSBkZXZpY2UgZGltZW5zaW9ucyBkZWZpbmUgdGhlIGFjdHVhbCBudW1iZXIgb2YgcGl4ZWwgaW5cbiAgICAvLyB0aGUgY2FudmFzXG4gICAgdGhpcy5kaW1lbnNpb25zLmRldmljZS5jYW52YXMuaGVpZ2h0ID0gdGhpcy5fdGVybWluYWwucm93cyAqIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2VsbC5oZWlnaHQ7XG4gICAgdGhpcy5kaW1lbnNpb25zLmRldmljZS5jYW52YXMud2lkdGggPSB0aGlzLl90ZXJtaW5hbC5jb2xzICogdGhpcy5kaW1lbnNpb25zLmRldmljZS5jZWxsLndpZHRoO1xuXG4gICAgLy8gVGhlIHRoZSBzaXplIG9mIHRoZSBjYW52YXMgb24gdGhlIHBhZ2UuIEl0J3MgaW1wb3J0YW50IHRoYXQgdGhpcyByb3VuZHMgdG8gbmVhcmVzdCBpbnRlZ2VyXG4gICAgLy8gYW5kIG5vdCBjZWlscyBhcyBicm93c2VycyBvZnRlbiBoYXZlIGZsb2F0aW5nIHBvaW50IHByZWNpc2lvbiBpc3N1ZXMgd2hlcmVcbiAgICAvLyBgd2luZG93LmRldmljZVBpeGVsUmF0aW9gIGVuZHMgdXAgYmVpbmcgc29tZXRoaW5nIGxpa2UgYDEuMTAwMDAwMDIzODQxODU4YCBmb3IgZXhhbXBsZSwgd2hlblxuICAgIC8vIGl0J3MgYWN0dWFsbHkgMS4xLiBDZWlsaW5nIG1heSBjYXVzZXMgYmx1cnJpbmVzcyBhcyB0aGUgYmFja2luZyBjYW52YXMgaW1hZ2UgaXMgMSBwaXhlbCB0b29cbiAgICAvLyBsYXJnZSBmb3IgdGhlIGNhbnZhcyBlbGVtZW50IHNpemUuXG4gICAgdGhpcy5kaW1lbnNpb25zLmNzcy5jYW52YXMuaGVpZ2h0ID0gTWF0aC5yb3VuZCh0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNhbnZhcy5oZWlnaHQgLyB0aGlzLl9kZXZpY2VQaXhlbFJhdGlvKTtcbiAgICB0aGlzLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy53aWR0aCA9IE1hdGgucm91bmQodGhpcy5kaW1lbnNpb25zLmRldmljZS5jYW52YXMud2lkdGggLyB0aGlzLl9kZXZpY2VQaXhlbFJhdGlvKTtcblxuICAgIC8vIEdldCB0aGUgQ1NTIGRpbWVuc2lvbnMgb2YgYW4gaW5kaXZpZHVhbCBjZWxsLiBUaGlzIG5lZWRzIHRvIGJlIGRlcml2ZWQgZnJvbSB0aGUgY2FsY3VsYXRlZFxuICAgIC8vIGRldmljZSBwaXhlbCBjYW52YXMgdmFsdWUgYWJvdmUuIENoYXJNZWFzdXJlLndpZHRoL2hlaWdodCBieSBpdHNlbGYgaXMgaW5zdWZmaWNpZW50IHdoZW4gdGhlXG4gICAgLy8gcGFnZSBpcyBub3QgYXQgMTAwJSB6b29tIGxldmVsIGFzIENoYXJNZWFzdXJlIGlzIG1lYXN1cmVkIGluIENTUyBwaXhlbHMsIGJ1dCB0aGUgYWN0dWFsIGNoYXJcbiAgICAvLyBzaXplIG9uIHRoZSBjYW52YXMgY2FuIGRpZmZlci5cbiAgICB0aGlzLmRpbWVuc2lvbnMuY3NzLmNlbGwuaGVpZ2h0ID0gdGhpcy5kaW1lbnNpb25zLmRldmljZS5jZWxsLmhlaWdodCAvIHRoaXMuX2RldmljZVBpeGVsUmF0aW87XG4gICAgdGhpcy5kaW1lbnNpb25zLmNzcy5jZWxsLndpZHRoID0gdGhpcy5kaW1lbnNpb25zLmRldmljZS5jZWxsLndpZHRoIC8gdGhpcy5fZGV2aWNlUGl4ZWxSYXRpbztcbiAgfVxuXG4gIHByaXZhdGUgX3NldENhbnZhc0RldmljZVBpeGVsRGltZW5zaW9ucyh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9jYW52YXMud2lkdGggPT09IHdpZHRoICYmIHRoaXMuX2NhbnZhcy5oZWlnaHQgPT09IGhlaWdodCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBXaGlsZSB0aGUgYWN0dWFsIGNhbnZhcyBzaXplIGhhcyBjaGFuZ2VkLCBrZWVwIGRldmljZSBjYW52YXMgZGltZW5zaW9ucyBhcyB0aGUgdmFsdWUgYmVmb3JlXG4gICAgLy8gdGhlIGNoYW5nZSBhcyBpdCdzIGFuIGV4YWN0IG11bHRpcGxlIG9mIHRoZSBjZWxsIHNpemVzLlxuICAgIHRoaXMuX2NhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuX2NhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgdGhpcy5fcmVxdWVzdFJlZHJhd1ZpZXdwb3J0KCk7XG4gIH1cblxuICBwcml2YXRlIF9yZXF1ZXN0UmVkcmF3Vmlld3BvcnQoKTogdm9pZCB7XG4gICAgdGhpcy5fb25SZXF1ZXN0UmVkcmF3LmZpcmUoeyBzdGFydDogMCwgZW5kOiB0aGlzLl90ZXJtaW5hbC5yb3dzIC0gMSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlcXVlc3RSZWRyYXdDdXJzb3IoKTogdm9pZCB7XG4gICAgY29uc3QgY3Vyc29yWSA9IHRoaXMuX3Rlcm1pbmFsLmJ1ZmZlci5hY3RpdmUuY3Vyc29yWTtcbiAgICB0aGlzLl9vblJlcXVlc3RSZWRyYXcuZmlyZSh7IHN0YXJ0OiBjdXJzb3JZLCBlbmQ6IGN1cnNvclkgfSk7XG4gIH1cbn1cblxuLy8gVE9ETzogU2hhcmUgaW1wbCB3aXRoIGNvcmVcbmV4cG9ydCBjbGFzcyBKb2luZWRDZWxsRGF0YSBleHRlbmRzIEF0dHJpYnV0ZURhdGEgaW1wbGVtZW50cyBJQ2VsbERhdGEge1xuICBwcml2YXRlIF93aWR0aDogbnVtYmVyO1xuICAvLyAuY29udGVudCBjYXJyaWVzIG5vIG1lYW5pbmcgZm9yIGpvaW5lZCBDZWxsRGF0YSwgc2ltcGx5IG51bGxpZnkgaXRcbiAgLy8gdGh1cyB3ZSBoYXZlIHRvIG92ZXJsb2FkIGFsbCBvdGhlciAuY29udGVudCBhY2Nlc3NvcnNcbiAgcHVibGljIGNvbnRlbnQ6IG51bWJlciA9IDA7XG4gIHB1YmxpYyBmZzogbnVtYmVyO1xuICBwdWJsaWMgYmc6IG51bWJlcjtcbiAgcHVibGljIGNvbWJpbmVkRGF0YTogc3RyaW5nID0gJyc7XG5cbiAgY29uc3RydWN0b3IoZmlyc3RDZWxsOiBJQ2VsbERhdGEsIGNoYXJzOiBzdHJpbmcsIHdpZHRoOiBudW1iZXIpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZmcgPSBmaXJzdENlbGwuZmc7XG4gICAgdGhpcy5iZyA9IGZpcnN0Q2VsbC5iZztcbiAgICB0aGlzLmNvbWJpbmVkRGF0YSA9IGNoYXJzO1xuICAgIHRoaXMuX3dpZHRoID0gd2lkdGg7XG4gIH1cblxuICBwdWJsaWMgaXNDb21iaW5lZCgpOiBudW1iZXIge1xuICAgIC8vIGFsd2F5cyBtYXJrIGpvaW5lZCBjZWxsIGRhdGEgYXMgY29tYmluZWRcbiAgICByZXR1cm4gQ29udGVudC5JU19DT01CSU5FRF9NQVNLO1xuICB9XG5cbiAgcHVibGljIGdldFdpZHRoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3dpZHRoO1xuICB9XG5cbiAgcHVibGljIGdldENoYXJzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29tYmluZWREYXRhO1xuICB9XG5cbiAgcHVibGljIGdldENvZGUoKTogbnVtYmVyIHtcbiAgICAvLyBjb2RlIGFsd2F5cyBnZXRzIHRoZSBoaWdoZXN0IHBvc3NpYmxlIGZha2UgY29kZXBvaW50IChyZWFkIGFzIC0xKVxuICAgIC8vIHRoaXMgaXMgbmVlZGVkIGFzIGNvZGUgaXMgdXNlZCBieSBjYWNoZXMgYXMgaWRlbnRpZmllclxuICAgIHJldHVybiAweDFGRkZGRjtcbiAgfVxuXG4gIHB1YmxpYyBzZXRGcm9tQ2hhckRhdGEodmFsdWU6IENoYXJEYXRhKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBc0NoYXJEYXRhKCk6IENoYXJEYXRhIHtcbiAgICByZXR1cm4gW3RoaXMuZmcsIHRoaXMuZ2V0Q2hhcnMoKSwgdGhpcy5nZXRXaWR0aCgpLCB0aGlzLmdldENvZGUoKV07XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xhbXAodmFsdWU6IG51bWJlciwgbWF4OiBudW1iZXIsIG1pbjogbnVtYmVyID0gMCk6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLm1heChNYXRoLm1pbih2YWx1ZSwgbWF4KSwgbWluKTtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgdGhyb3dJZkZhbHN5IH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvUmVuZGVyZXJVdGlscyc7XG5cbi8qKlxuICogQSBtYXRyaXggdGhhdCB3aGVuIG11bHRpcGxpZXMgd2lsbCB0cmFuc2xhdGUgMC0xIGNvb3JkaW5hdGVzIChsZWZ0IHRvIHJpZ2h0LFxuICogdG9wIHRvIGJvdHRvbSkgdG8gY2xpcCBzcGFjZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFBST0pFQ1RJT05fTUFUUklYID0gbmV3IEZsb2F0MzJBcnJheShbXG4gIDIsIDAsIDAsIDAsXG4gIDAsIC0yLCAwLCAwLFxuICAwLCAwLCAxLCAwLFxuICAtMSwgMSwgMCwgMVxuXSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9ncmFtKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHZlcnRleFNvdXJjZTogc3RyaW5nLCBmcmFnbWVudFNvdXJjZTogc3RyaW5nKTogV2ViR0xQcm9ncmFtIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcHJvZ3JhbSA9IHRocm93SWZGYWxzeShnbC5jcmVhdGVQcm9ncmFtKCkpO1xuICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgdGhyb3dJZkZhbHN5KGNyZWF0ZVNoYWRlcihnbCwgZ2wuVkVSVEVYX1NIQURFUiwgdmVydGV4U291cmNlKSkpO1xuICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgdGhyb3dJZkZhbHN5KGNyZWF0ZVNoYWRlcihnbCwgZ2wuRlJBR01FTlRfU0hBREVSLCBmcmFnbWVudFNvdXJjZSkpKTtcbiAgZ2wubGlua1Byb2dyYW0ocHJvZ3JhbSk7XG4gIGNvbnN0IHN1Y2Nlc3MgPSBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIGdsLkxJTktfU1RBVFVTKTtcbiAgaWYgKHN1Y2Nlc3MpIHtcbiAgICByZXR1cm4gcHJvZ3JhbTtcbiAgfVxuXG4gIGNvbnNvbGUuZXJyb3IoZ2wuZ2V0UHJvZ3JhbUluZm9Mb2cocHJvZ3JhbSkpO1xuICBnbC5kZWxldGVQcm9ncmFtKHByb2dyYW0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2hhZGVyKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHR5cGU6IG51bWJlciwgc291cmNlOiBzdHJpbmcpOiBXZWJHTFNoYWRlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNoYWRlciA9IHRocm93SWZGYWxzeShnbC5jcmVhdGVTaGFkZXIodHlwZSkpO1xuICBnbC5zaGFkZXJTb3VyY2Uoc2hhZGVyLCBzb3VyY2UpO1xuICBnbC5jb21waWxlU2hhZGVyKHNoYWRlcik7XG4gIGNvbnN0IHN1Y2Nlc3MgPSBnbC5nZXRTaGFkZXJQYXJhbWV0ZXIoc2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUyk7XG4gIGlmIChzdWNjZXNzKSB7XG4gICAgcmV0dXJuIHNoYWRlcjtcbiAgfVxuXG4gIGNvbnNvbGUuZXJyb3IoZ2wuZ2V0U2hhZGVySW5mb0xvZyhzaGFkZXIpKTtcbiAgZ2wuZGVsZXRlU2hhZGVyKHNoYWRlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBhbmRGbG9hdDMyQXJyYXkoc291cmNlOiBGbG9hdDMyQXJyYXksIG1heDogbnVtYmVyKTogRmxvYXQzMkFycmF5IHtcbiAgY29uc3QgbmV3TGVuZ3RoID0gTWF0aC5taW4oc291cmNlLmxlbmd0aCAqIDIsIG1heCk7XG4gIGNvbnN0IG5ld0FycmF5ID0gbmV3IEZsb2F0MzJBcnJheShuZXdMZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykge1xuICAgIG5ld0FycmF5W2ldID0gc291cmNlW2ldO1xuICB9XG4gIHJldHVybiBuZXdBcnJheTtcbn1cblxuZXhwb3J0IGNsYXNzIEdMVGV4dHVyZSB7XG4gIHB1YmxpYyB0ZXh0dXJlOiBXZWJHTFRleHR1cmU7XG4gIHB1YmxpYyB2ZXJzaW9uOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IodGV4dHVyZTogV2ViR0xUZXh0dXJlKSB7XG4gICAgdGhpcy50ZXh0dXJlID0gdGV4dHVyZTtcbiAgICB0aGlzLnZlcnNpb24gPSAtMTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBSZWFkb25seUNvbG9yU2V0IH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBhY3F1aXJlVGV4dHVyZUF0bGFzIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvQ2hhckF0bGFzQ2FjaGUnO1xuaW1wb3J0IHsgVEVYVF9CQVNFTElORSB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL0NvbnN0YW50cyc7XG5pbXBvcnQgeyB0aHJvd0lmRmFsc3kgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9SZW5kZXJlclV0aWxzJztcbmltcG9ydCB7IElSZW5kZXJEaW1lbnNpb25zLCBJVGV4dHVyZUF0bGFzIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvVHlwZXMnO1xuaW1wb3J0IHsgSUNvcmVCcm93c2VyU2VydmljZSwgSVRoZW1lU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSwgdG9EaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBDZWxsRGF0YSB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ2VsbERhdGEnO1xuaW1wb3J0IHsgSU9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IFRlcm1pbmFsIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcbmltcG9ydCB7IElSZW5kZXJMYXllciB9IGZyb20gJy4vVHlwZXMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVJlbmRlckxheWVyIGV4dGVuZHMgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElSZW5kZXJMYXllciB7XG4gIHByaXZhdGUgX2NhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XG4gIHByb3RlY3RlZCBfY3R4ITogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuICBwcml2YXRlIF9kZXZpY2VDaGFyV2lkdGg6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2RldmljZUNoYXJIZWlnaHQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2RldmljZUNlbGxXaWR0aDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfZGV2aWNlQ2VsbEhlaWdodDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfZGV2aWNlQ2hhckxlZnQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2RldmljZUNoYXJUb3A6IG51bWJlciA9IDA7XG5cbiAgcHJvdGVjdGVkIF9jaGFyQXRsYXM6IElUZXh0dXJlQXRsYXMgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgdGVybWluYWw6IFRlcm1pbmFsLFxuICAgIHByaXZhdGUgX2NvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgaWQ6IHN0cmluZyxcbiAgICB6SW5kZXg6IG51bWJlcixcbiAgICBwcml2YXRlIF9hbHBoYTogYm9vbGVhbixcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2NvcmVCcm93c2VyU2VydmljZTogSUNvcmVCcm93c2VyU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX29wdGlvbnNTZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF90aGVtZVNlcnZpY2U6IElUaGVtZVNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9jYW52YXMgPSB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UubWFpbkRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIHRoaXMuX2NhbnZhcy5jbGFzc0xpc3QuYWRkKGB4dGVybS0ke2lkfS1sYXllcmApO1xuICAgIHRoaXMuX2NhbnZhcy5zdHlsZS56SW5kZXggPSB6SW5kZXgudG9TdHJpbmcoKTtcbiAgICB0aGlzLl9pbml0Q2FudmFzKCk7XG4gICAgdGhpcy5fY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuX2NhbnZhcyk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl90aGVtZVNlcnZpY2Uub25DaGFuZ2VDb2xvcnMoZSA9PiB7XG4gICAgICB0aGlzLl9yZWZyZXNoQ2hhckF0bGFzKHRlcm1pbmFsLCBlKTtcbiAgICAgIHRoaXMucmVzZXQodGVybWluYWwpO1xuICAgIH0pKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiB7XG4gICAgICB0aGlzLl9jYW52YXMucmVtb3ZlKCk7XG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdENhbnZhcygpOiB2b2lkIHtcbiAgICB0aGlzLl9jdHggPSB0aHJvd0lmRmFsc3kodGhpcy5fY2FudmFzLmdldENvbnRleHQoJzJkJywgeyBhbHBoYTogdGhpcy5fYWxwaGEgfSkpO1xuICAgIC8vIERyYXcgdGhlIGJhY2tncm91bmQgaWYgdGhpcyBpcyBhbiBvcGFxdWUgbGF5ZXJcbiAgICBpZiAoIXRoaXMuX2FscGhhKSB7XG4gICAgICB0aGlzLl9jbGVhckFsbCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVCbHVyKHRlcm1pbmFsOiBUZXJtaW5hbCk6IHZvaWQge31cbiAgcHVibGljIGhhbmRsZUZvY3VzKHRlcm1pbmFsOiBUZXJtaW5hbCk6IHZvaWQge31cbiAgcHVibGljIGhhbmRsZUN1cnNvck1vdmUodGVybWluYWw6IFRlcm1pbmFsKTogdm9pZCB7fVxuICBwdWJsaWMgaGFuZGxlR3JpZENoYW5nZWQodGVybWluYWw6IFRlcm1pbmFsLCBzdGFydFJvdzogbnVtYmVyLCBlbmRSb3c6IG51bWJlcik6IHZvaWQge31cbiAgcHVibGljIGhhbmRsZVNlbGVjdGlvbkNoYW5nZWQodGVybWluYWw6IFRlcm1pbmFsLCBzdGFydDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgZW5kOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBjb2x1bW5TZWxlY3RNb2RlOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIF9zZXRUcmFuc3BhcmVuY3kodGVybWluYWw6IFRlcm1pbmFsLCBhbHBoYTogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vIERvIG5vdGhpbmcgd2hlbiBhbHBoYSBkb2Vzbid0IGNoYW5nZVxuICAgIGlmIChhbHBoYSA9PT0gdGhpcy5fYWxwaGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgbmV3IGNhbnZhcyBhbmQgcmVwbGFjZSBvbGQgb25lXG4gICAgY29uc3Qgb2xkQ2FudmFzID0gdGhpcy5fY2FudmFzO1xuICAgIHRoaXMuX2FscGhhID0gYWxwaGE7XG4gICAgLy8gQ2xvbmluZyBwcmVzZXJ2ZXMgcHJvcGVydGllc1xuICAgIHRoaXMuX2NhbnZhcyA9IHRoaXMuX2NhbnZhcy5jbG9uZU5vZGUoKSBhcyBIVE1MQ2FudmFzRWxlbWVudDtcbiAgICB0aGlzLl9pbml0Q2FudmFzKCk7XG4gICAgdGhpcy5fY29udGFpbmVyLnJlcGxhY2VDaGlsZCh0aGlzLl9jYW52YXMsIG9sZENhbnZhcyk7XG5cbiAgICAvLyBSZWdlbmVyYXRlIGNoYXIgYXRsYXMgYW5kIGZvcmNlIGEgZnVsbCByZWRyYXdcbiAgICB0aGlzLl9yZWZyZXNoQ2hhckF0bGFzKHRlcm1pbmFsLCB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzKTtcbiAgICB0aGlzLmhhbmRsZUdyaWRDaGFuZ2VkKHRlcm1pbmFsLCAwLCB0ZXJtaW5hbC5yb3dzIC0gMSk7XG4gIH1cblxuICAvKipcbiAgICogUmVmcmVzaGVzIHRoZSBjaGFyIGF0bGFzLCBhcXVpcmluZyBhIG5ldyBvbmUgaWYgbmVjZXNzYXJ5LlxuICAgKiBAcGFyYW0gdGVybWluYWwgVGhlIHRlcm1pbmFsLlxuICAgKiBAcGFyYW0gY29sb3JTZXQgVGhlIGNvbG9yIHNldCB0byB1c2UgZm9yIHRoZSBjaGFyIGF0bGFzLlxuICAgKi9cbiAgcHJpdmF0ZSBfcmVmcmVzaENoYXJBdGxhcyh0ZXJtaW5hbDogVGVybWluYWwsIGNvbG9yU2V0OiBSZWFkb25seUNvbG9yU2V0KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2RldmljZUNoYXJXaWR0aCA8PSAwICYmIHRoaXMuX2RldmljZUNoYXJIZWlnaHQgPD0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jaGFyQXRsYXMgPSBhY3F1aXJlVGV4dHVyZUF0bGFzKHRlcm1pbmFsLCB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLCBjb2xvclNldCwgdGhpcy5fZGV2aWNlQ2VsbFdpZHRoLCB0aGlzLl9kZXZpY2VDZWxsSGVpZ2h0LCB0aGlzLl9kZXZpY2VDaGFyV2lkdGgsIHRoaXMuX2RldmljZUNoYXJIZWlnaHQsIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5kcHIpO1xuICAgIHRoaXMuX2NoYXJBdGxhcy53YXJtVXAoKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNpemUodGVybWluYWw6IFRlcm1pbmFsLCBkaW06IElSZW5kZXJEaW1lbnNpb25zKTogdm9pZCB7XG4gICAgdGhpcy5fZGV2aWNlQ2VsbFdpZHRoID0gZGltLmRldmljZS5jZWxsLndpZHRoO1xuICAgIHRoaXMuX2RldmljZUNlbGxIZWlnaHQgPSBkaW0uZGV2aWNlLmNlbGwuaGVpZ2h0O1xuICAgIHRoaXMuX2RldmljZUNoYXJXaWR0aCA9IGRpbS5kZXZpY2UuY2hhci53aWR0aDtcbiAgICB0aGlzLl9kZXZpY2VDaGFySGVpZ2h0ID0gZGltLmRldmljZS5jaGFyLmhlaWdodDtcbiAgICB0aGlzLl9kZXZpY2VDaGFyTGVmdCA9IGRpbS5kZXZpY2UuY2hhci5sZWZ0O1xuICAgIHRoaXMuX2RldmljZUNoYXJUb3AgPSBkaW0uZGV2aWNlLmNoYXIudG9wO1xuICAgIHRoaXMuX2NhbnZhcy53aWR0aCA9IGRpbS5kZXZpY2UuY2FudmFzLndpZHRoO1xuICAgIHRoaXMuX2NhbnZhcy5oZWlnaHQgPSBkaW0uZGV2aWNlLmNhbnZhcy5oZWlnaHQ7XG4gICAgdGhpcy5fY2FudmFzLnN0eWxlLndpZHRoID0gYCR7ZGltLmNzcy5jYW52YXMud2lkdGh9cHhgO1xuICAgIHRoaXMuX2NhbnZhcy5zdHlsZS5oZWlnaHQgPSBgJHtkaW0uY3NzLmNhbnZhcy5oZWlnaHR9cHhgO1xuXG4gICAgLy8gRHJhdyB0aGUgYmFja2dyb3VuZCBpZiB0aGlzIGlzIGFuIG9wYXF1ZSBsYXllclxuICAgIGlmICghdGhpcy5fYWxwaGEpIHtcbiAgICAgIHRoaXMuX2NsZWFyQWxsKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fcmVmcmVzaENoYXJBdGxhcyh0ZXJtaW5hbCwgdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycyk7XG4gIH1cblxuICBwdWJsaWMgYWJzdHJhY3QgcmVzZXQodGVybWluYWw6IFRlcm1pbmFsKTogdm9pZDtcblxuICAvKipcbiAgICogRmlsbHMgYSAxcHggbGluZSAoMnB4IG9uIEhEUEkpIGF0IHRoZSBib3R0b20gb2YgdGhlIGNlbGwuIFRoaXMgdXNlcyB0aGVcbiAgICogZXhpc3RpbmcgZmlsbFN0eWxlIG9uIHRoZSBjb250ZXh0LlxuICAgKiBAcGFyYW0geCBUaGUgY29sdW1uIHRvIGZpbGwuXG4gICAqIEBwYXJhbSB5IFRoZSByb3cgdG8gZmlsbC5cbiAgICovXG4gIHByb3RlY3RlZCBfZmlsbEJvdHRvbUxpbmVBdENlbGxzKHg6IG51bWJlciwgeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyID0gMSk6IHZvaWQge1xuICAgIHRoaXMuX2N0eC5maWxsUmVjdChcbiAgICAgIHggKiB0aGlzLl9kZXZpY2VDZWxsV2lkdGgsXG4gICAgICAoeSArIDEpICogdGhpcy5fZGV2aWNlQ2VsbEhlaWdodCAtIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5kcHIgLSAxIC8qIEVuc3VyZSBpdCdzIGRyYXduIHdpdGhpbiB0aGUgY2VsbCAqLyxcbiAgICAgIHdpZHRoICogdGhpcy5fZGV2aWNlQ2VsbFdpZHRoLFxuICAgICAgdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmRwcik7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIHRoZSBlbnRpcmUgY2FudmFzLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9jbGVhckFsbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fYWxwaGEpIHtcbiAgICAgIHRoaXMuX2N0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy5fY2FudmFzLndpZHRoLCB0aGlzLl9jYW52YXMuaGVpZ2h0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY3R4LmZpbGxTdHlsZSA9IHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMuYmFja2dyb3VuZC5jc3M7XG4gICAgICB0aGlzLl9jdHguZmlsbFJlY3QoMCwgMCwgdGhpcy5fY2FudmFzLndpZHRoLCB0aGlzLl9jYW52YXMuaGVpZ2h0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIDErIGNlbGxzIGNvbXBsZXRlbHkuXG4gICAqIEBwYXJhbSB4IFRoZSBjb2x1bW4gdG8gc3RhcnQgYXQuXG4gICAqIEBwYXJhbSB5IFRoZSByb3cgdG8gc3RhcnQgYXQuXG4gICAqIEBwYXJhbSB3aWR0aCBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgdG8gY2xlYXIuXG4gICAqIEBwYXJhbSBoZWlnaHQgVGhlIG51bWJlciBvZiByb3dzIHRvIGNsZWFyLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9jbGVhckNlbGxzKHg6IG51bWJlciwgeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9hbHBoYSkge1xuICAgICAgdGhpcy5fY3R4LmNsZWFyUmVjdChcbiAgICAgICAgeCAqIHRoaXMuX2RldmljZUNlbGxXaWR0aCxcbiAgICAgICAgeSAqIHRoaXMuX2RldmljZUNlbGxIZWlnaHQsXG4gICAgICAgIHdpZHRoICogdGhpcy5fZGV2aWNlQ2VsbFdpZHRoLFxuICAgICAgICBoZWlnaHQgKiB0aGlzLl9kZXZpY2VDZWxsSGVpZ2h0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY3R4LmZpbGxTdHlsZSA9IHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMuYmFja2dyb3VuZC5jc3M7XG4gICAgICB0aGlzLl9jdHguZmlsbFJlY3QoXG4gICAgICAgIHggKiB0aGlzLl9kZXZpY2VDZWxsV2lkdGgsXG4gICAgICAgIHkgKiB0aGlzLl9kZXZpY2VDZWxsSGVpZ2h0LFxuICAgICAgICB3aWR0aCAqIHRoaXMuX2RldmljZUNlbGxXaWR0aCxcbiAgICAgICAgaGVpZ2h0ICogdGhpcy5fZGV2aWNlQ2VsbEhlaWdodCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERyYXdzIGEgdHJ1ZWNvbG9yIGNoYXJhY3RlciBhdCB0aGUgY2VsbC4gVGhlIGNoYXJhY3RlciB3aWxsIGJlIGNsaXBwZWQgdG9cbiAgICogZW5zdXJlIHRoYXQgaXQgZml0cyB3aXRoIHRoZSBjZWxsLCBpbmNsdWRpbmcgdGhlIGNlbGwgdG8gdGhlIHJpZ2h0IGlmIGl0J3NcbiAgICogYSB3aWRlIGNoYXJhY3Rlci4gVGhpcyB1c2VzIHRoZSBleGlzdGluZyBmaWxsU3R5bGUgb24gdGhlIGNvbnRleHQuXG4gICAqIEBwYXJhbSB0ZXJtaW5hbCBUaGUgdGVybWluYWwuXG4gICAqIEBwYXJhbSBjZWxsIFRoZSBjZWxsIGRhdGEgZm9yIHRoZSBjaGFyYWN0ZXIgdG8gZHJhdy5cbiAgICogQHBhcmFtIHggVGhlIGNvbHVtbiB0byBkcmF3IGF0LlxuICAgKiBAcGFyYW0geSBUaGUgcm93IHRvIGRyYXcgYXQuXG4gICAqL1xuICBwcm90ZWN0ZWQgX2ZpbGxDaGFyVHJ1ZUNvbG9yKHRlcm1pbmFsOiBUZXJtaW5hbCwgY2VsbDogQ2VsbERhdGEsIHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fY3R4LmZvbnQgPSB0aGlzLl9nZXRGb250KHRlcm1pbmFsLCBmYWxzZSwgZmFsc2UpO1xuICAgIHRoaXMuX2N0eC50ZXh0QmFzZWxpbmUgPSBURVhUX0JBU0VMSU5FO1xuICAgIHRoaXMuX2NsaXBDZWxsKHgsIHksIGNlbGwuZ2V0V2lkdGgoKSk7XG4gICAgdGhpcy5fY3R4LmZpbGxUZXh0KFxuICAgICAgY2VsbC5nZXRDaGFycygpLFxuICAgICAgeCAqIHRoaXMuX2RldmljZUNlbGxXaWR0aCArIHRoaXMuX2RldmljZUNoYXJMZWZ0LFxuICAgICAgeSAqIHRoaXMuX2RldmljZUNlbGxIZWlnaHQgKyB0aGlzLl9kZXZpY2VDaGFyVG9wICsgdGhpcy5fZGV2aWNlQ2hhckhlaWdodCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xpcHMgYSBjZWxsIHRvIGVuc3VyZSBubyBwaXhlbHMgd2lsbCBiZSBkcmF3biBvdXRzaWRlIG9mIGl0LlxuICAgKiBAcGFyYW0geCBUaGUgY29sdW1uIHRvIGNsaXAuXG4gICAqIEBwYXJhbSB5IFRoZSByb3cgdG8gY2xpcC5cbiAgICogQHBhcmFtIHdpZHRoIFRoZSBudW1iZXIgb2YgY29sdW1ucyB0byBjbGlwLlxuICAgKi9cbiAgcHJpdmF0ZSBfY2xpcENlbGwoeDogbnVtYmVyLCB5OiBudW1iZXIsIHdpZHRoOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9jdHguYmVnaW5QYXRoKCk7XG4gICAgdGhpcy5fY3R4LnJlY3QoXG4gICAgICB4ICogdGhpcy5fZGV2aWNlQ2VsbFdpZHRoLFxuICAgICAgeSAqIHRoaXMuX2RldmljZUNlbGxIZWlnaHQsXG4gICAgICB3aWR0aCAqIHRoaXMuX2RldmljZUNlbGxXaWR0aCxcbiAgICAgIHRoaXMuX2RldmljZUNlbGxIZWlnaHQpO1xuICAgIHRoaXMuX2N0eC5jbGlwKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBmb250LlxuICAgKiBAcGFyYW0gdGVybWluYWwgVGhlIHRlcm1pbmFsLlxuICAgKiBAcGFyYW0gaXNCb2xkIElmIHdlIHNob3VsZCB1c2UgdGhlIGJvbGQgZm9udFdlaWdodC5cbiAgICovXG4gIHByb3RlY3RlZCBfZ2V0Rm9udCh0ZXJtaW5hbDogVGVybWluYWwsIGlzQm9sZDogYm9vbGVhbiwgaXNJdGFsaWM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIGNvbnN0IGZvbnRXZWlnaHQgPSBpc0JvbGQgPyB0ZXJtaW5hbC5vcHRpb25zLmZvbnRXZWlnaHRCb2xkIDogdGVybWluYWwub3B0aW9ucy5mb250V2VpZ2h0O1xuICAgIGNvbnN0IGZvbnRTdHlsZSA9IGlzSXRhbGljID8gJ2l0YWxpYycgOiAnJztcblxuICAgIHJldHVybiBgJHtmb250U3R5bGV9ICR7Zm9udFdlaWdodH0gJHt0ZXJtaW5hbC5vcHRpb25zLmZvbnRTaXplISAqIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5kcHJ9cHggJHt0ZXJtaW5hbC5vcHRpb25zLmZvbnRGYW1pbHl9YDtcbiAgfVxufVxuXG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IGlzMjU2Q29sb3IgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9DaGFyQXRsYXNVdGlscyc7XG5pbXBvcnQgeyBJTlZFUlRFRF9ERUZBVUxUX0NPTE9SIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvQ29uc3RhbnRzJztcbmltcG9ydCB7IElSZW5kZXJEaW1lbnNpb25zIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvVHlwZXMnO1xuaW1wb3J0IHsgSUNvcmVCcm93c2VyU2VydmljZSwgSVRoZW1lU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgSUxpbmtpZmllcjIsIElMaW5raWZpZXJFdmVudCB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuaW1wb3J0IHsgSU9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IFRlcm1pbmFsIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcbmltcG9ydCB7IEJhc2VSZW5kZXJMYXllciB9IGZyb20gJy4vQmFzZVJlbmRlckxheWVyJztcblxuZXhwb3J0IGNsYXNzIExpbmtSZW5kZXJMYXllciBleHRlbmRzIEJhc2VSZW5kZXJMYXllciB7XG4gIHByaXZhdGUgX3N0YXRlOiBJTGlua2lmaWVyRXZlbnQgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgY29udGFpbmVyOiBIVE1MRWxlbWVudCxcbiAgICB6SW5kZXg6IG51bWJlcixcbiAgICB0ZXJtaW5hbDogVGVybWluYWwsXG4gICAgbGlua2lmaWVyMjogSUxpbmtpZmllcjIsXG4gICAgY29yZUJyb3dzZXJTZXJ2aWNlOiBJQ29yZUJyb3dzZXJTZXJ2aWNlLFxuICAgIG9wdGlvbnNTZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2UsXG4gICAgdGhlbWVTZXJ2aWNlOiBJVGhlbWVTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKHRlcm1pbmFsLCBjb250YWluZXIsICdsaW5rJywgekluZGV4LCB0cnVlLCBjb3JlQnJvd3NlclNlcnZpY2UsIG9wdGlvbnNTZXJ2aWNlLCB0aGVtZVNlcnZpY2UpO1xuXG4gICAgdGhpcy5yZWdpc3RlcihsaW5raWZpZXIyLm9uU2hvd0xpbmtVbmRlcmxpbmUoZSA9PiB0aGlzLl9oYW5kbGVTaG93TGlua1VuZGVybGluZShlKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIobGlua2lmaWVyMi5vbkhpZGVMaW5rVW5kZXJsaW5lKGUgPT4gdGhpcy5faGFuZGxlSGlkZUxpbmtVbmRlcmxpbmUoZSkpKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNpemUodGVybWluYWw6IFRlcm1pbmFsLCBkaW06IElSZW5kZXJEaW1lbnNpb25zKTogdm9pZCB7XG4gICAgc3VwZXIucmVzaXplKHRlcm1pbmFsLCBkaW0pO1xuICAgIC8vIFJlc2l6aW5nIHRoZSBjYW52YXMgZGlzY2FyZHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBjYW52YXMgc28gY2xlYXIgc3RhdGVcbiAgICB0aGlzLl9zdGF0ZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCh0ZXJtaW5hbDogVGVybWluYWwpOiB2b2lkIHtcbiAgICB0aGlzLl9jbGVhckN1cnJlbnRMaW5rKCk7XG4gIH1cblxuICBwcml2YXRlIF9jbGVhckN1cnJlbnRMaW5rKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zdGF0ZSkge1xuICAgICAgdGhpcy5fY2xlYXJDZWxscyh0aGlzLl9zdGF0ZS54MSwgdGhpcy5fc3RhdGUueTEsIHRoaXMuX3N0YXRlLmNvbHMgLSB0aGlzLl9zdGF0ZS54MSwgMSk7XG4gICAgICBjb25zdCBtaWRkbGVSb3dDb3VudCA9IHRoaXMuX3N0YXRlLnkyIC0gdGhpcy5fc3RhdGUueTEgLSAxO1xuICAgICAgaWYgKG1pZGRsZVJvd0NvdW50ID4gMCkge1xuICAgICAgICB0aGlzLl9jbGVhckNlbGxzKDAsIHRoaXMuX3N0YXRlLnkxICsgMSwgdGhpcy5fc3RhdGUuY29scywgbWlkZGxlUm93Q291bnQpO1xuICAgICAgfVxuICAgICAgdGhpcy5fY2xlYXJDZWxscygwLCB0aGlzLl9zdGF0ZS55MiwgdGhpcy5fc3RhdGUueDIsIDEpO1xuICAgICAgdGhpcy5fc3RhdGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlU2hvd0xpbmtVbmRlcmxpbmUoZTogSUxpbmtpZmllckV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGUuZmcgPT09IElOVkVSVEVEX0RFRkFVTFRfQ09MT1IpIHtcbiAgICAgIHRoaXMuX2N0eC5maWxsU3R5bGUgPSB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzLmJhY2tncm91bmQuY3NzO1xuICAgIH0gZWxzZSBpZiAoZS5mZyAhPT0gdW5kZWZpbmVkICYmIGlzMjU2Q29sb3IoZS5mZykpIHtcbiAgICAgIC8vIDI1NiBjb2xvciBzdXBwb3J0XG4gICAgICB0aGlzLl9jdHguZmlsbFN0eWxlID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5hbnNpW2UuZmchXS5jc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2N0eC5maWxsU3R5bGUgPSB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzLmZvcmVncm91bmQuY3NzO1xuICAgIH1cblxuICAgIGlmIChlLnkxID09PSBlLnkyKSB7XG4gICAgICAvLyBTaW5nbGUgbGluZSBsaW5rXG4gICAgICB0aGlzLl9maWxsQm90dG9tTGluZUF0Q2VsbHMoZS54MSwgZS55MSwgZS54MiAtIGUueDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBNdWx0aS1saW5lIGxpbmtcbiAgICAgIHRoaXMuX2ZpbGxCb3R0b21MaW5lQXRDZWxscyhlLngxLCBlLnkxLCBlLmNvbHMgLSBlLngxKTtcbiAgICAgIGZvciAobGV0IHkgPSBlLnkxICsgMTsgeSA8IGUueTI7IHkrKykge1xuICAgICAgICB0aGlzLl9maWxsQm90dG9tTGluZUF0Q2VsbHMoMCwgeSwgZS5jb2xzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2ZpbGxCb3R0b21MaW5lQXRDZWxscygwLCBlLnkyLCBlLngyKTtcbiAgICB9XG4gICAgdGhpcy5fc3RhdGUgPSBlO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlSGlkZUxpbmtVbmRlcmxpbmUoZTogSUxpbmtpZmllckV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5fY2xlYXJDdXJyZW50TGluaygpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOCBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcblxuLyoqXG4gKiBBZGRzIGEgZGlzcG9zYWJsZSBsaXN0ZW5lciB0byBhIG5vZGUgaW4gdGhlIERPTSwgcmV0dXJuaW5nIHRoZSBkaXNwb3NhYmxlLlxuICogQHBhcmFtIG5vZGUgVGhlIG5vZGUgdG8gYWRkIGEgbGlzdGVuZXIgdG8uXG4gKiBAcGFyYW0gdHlwZSBUaGUgZXZlbnQgdHlwZS5cbiAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGZvciB0aGUgbGlzdGVuZXIuXG4gKiBAcGFyYW0gb3B0aW9ucyBUaGUgYm9vbGVhbiBvciBvcHRpb25zIG9iamVjdCB0byBwYXNzIG9uIHRvIHRoZSBldmVudFxuICogbGlzdGVuZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIoXG4gIG5vZGU6IEVsZW1lbnQgfCBXaW5kb3cgfCBEb2N1bWVudCxcbiAgdHlwZTogc3RyaW5nLFxuICBoYW5kbGVyOiAoZTogYW55KSA9PiB2b2lkLFxuICBvcHRpb25zPzogYm9vbGVhbiB8IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zXG4pOiBJRGlzcG9zYWJsZSB7XG4gIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGVyLCBvcHRpb25zKTtcbiAgbGV0IGRpc3Bvc2VkID0gZmFsc2U7XG4gIHJldHVybiB7XG4gICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgaWYgKGRpc3Bvc2VkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGRpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGVyLCBvcHRpb25zKTtcbiAgICB9XG4gIH07XG59XG4iLCJpbXBvcnQgeyBJU2VsZWN0aW9uUmVuZGVyTW9kZWwgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UeXBlcyc7XG5pbXBvcnQgeyBJQ29yZUJyb3dzZXJTZXJ2aWNlLCBJVGhlbWVTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBSZWFkb25seUNvbG9yU2V0IH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVzLCBCZ0ZsYWdzLCBFeHRGbGFncywgRmdGbGFncywgTlVMTF9DRUxMX0NPREUsIFVuZGVybGluZVN0eWxlIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9Db25zdGFudHMnO1xuaW1wb3J0IHsgSURlY29yYXRpb25TZXJ2aWNlLCBJT3B0aW9uc1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgSUNlbGxEYXRhIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IFRlcm1pbmFsIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcbmltcG9ydCB7IHJnYmEgfSBmcm9tICdjb21tb24vQ29sb3InO1xuaW1wb3J0IHsgdHJlYXRHbHlwaEFzQmFja2dyb3VuZENvbG9yIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvUmVuZGVyZXJVdGlscyc7XG5cbi8vIFdvcmsgdmFyaWFibGVzIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvblxubGV0ICRmZyA9IDA7XG5sZXQgJGJnID0gMDtcbmxldCAkaGFzRmcgPSBmYWxzZTtcbmxldCAkaGFzQmcgPSBmYWxzZTtcbmxldCAkaXNTZWxlY3RlZCA9IGZhbHNlO1xubGV0ICRjb2xvcnM6IFJlYWRvbmx5Q29sb3JTZXQgfCB1bmRlZmluZWQ7XG5sZXQgJHZhcmlhbnRPZmZzZXQgPSAwO1xuXG5leHBvcnQgY2xhc3MgQ2VsbENvbG9yUmVzb2x2ZXIge1xuICAvKipcbiAgICogVGhlIHNoYXJlZCByZXN1bHQgb2YgdGhlIHtAbGluayByZXNvbHZlfSBjYWxsLiBUaGlzIGlzIG9ubHkgc2FmZSB0byB1c2UgaW1tZWRpYXRlbHkgYWZ0ZXIgYXNcbiAgICogYW55IG90aGVyIGNhbGxzIHdpbGwgc2hhcmUgb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlc3VsdDogeyBmZzogbnVtYmVyLCBiZzogbnVtYmVyLCBleHQ6IG51bWJlciB9ID0ge1xuICAgIGZnOiAwLFxuICAgIGJnOiAwLFxuICAgIGV4dDogMFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3Rlcm1pbmFsOiBUZXJtaW5hbCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25TZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfc2VsZWN0aW9uUmVuZGVyTW9kZWw6IElTZWxlY3Rpb25SZW5kZXJNb2RlbCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kZWNvcmF0aW9uU2VydmljZTogSURlY29yYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvcmVCcm93c2VyU2VydmljZTogSUNvcmVCcm93c2VyU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90aGVtZVNlcnZpY2U6IElUaGVtZVNlcnZpY2VcbiAgKSB7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgY29sb3JzIGZvciB0aGUgY2VsbCwgcHV0dGluZyB0aGUgcmVzdWx0IGludG8gdGhlIHNoYXJlZCB7QGxpbmsgcmVzdWx0fS4gVGhpcyByZXNvbHZlc1xuICAgKiBvdmVycmlkZXMsIGludmVyc2UgYW5kIHNlbGVjdGlvbiBmb3IgdGhlIGNlbGwgd2hpY2ggY2FuIHRoZW4gYmUgdXNlZCB0byBmZWVkIGludG8gdGhlIHJlbmRlcmVyLlxuICAgKi9cbiAgcHVibGljIHJlc29sdmUoY2VsbDogSUNlbGxEYXRhLCB4OiBudW1iZXIsIHk6IG51bWJlciwgZGV2aWNlQ2VsbFdpZHRoOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlc3VsdC5iZyA9IGNlbGwuYmc7XG4gICAgdGhpcy5yZXN1bHQuZmcgPSBjZWxsLmZnO1xuICAgIHRoaXMucmVzdWx0LmV4dCA9IGNlbGwuYmcgJiBCZ0ZsYWdzLkhBU19FWFRFTkRFRCA/IGNlbGwuZXh0ZW5kZWQuZXh0IDogMDtcbiAgICAvLyBHZXQgYW55IGZvcmVncm91bmQvYmFja2dyb3VuZCBvdmVycmlkZXMsIHRoaXMgaGFwcGVucyBvbiB0aGUgbW9kZWwgdG8gYXZvaWQgc3ByZWFkaW5nXG4gICAgLy8gb3ZlcnJpZGUgbG9naWMgdGhyb3VnaG91dCB0aGUgZGlmZmVyZW50IHN1Yi1yZW5kZXJlcnNcblxuICAgIC8vIFJlc2V0IG92ZXJyaWRlcyB3b3JrIHZhcmlhYmxlc1xuICAgICRiZyA9IDA7XG4gICAgJGZnID0gMDtcbiAgICAkaGFzQmcgPSBmYWxzZTtcbiAgICAkaGFzRmcgPSBmYWxzZTtcbiAgICAkaXNTZWxlY3RlZCA9IGZhbHNlO1xuICAgICRjb2xvcnMgPSB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzO1xuICAgICR2YXJpYW50T2Zmc2V0ID0gMDtcblxuICAgIGNvbnN0IGNvZGUgPSBjZWxsLmdldENvZGUoKTtcbiAgICBpZiAoY29kZSAhPT0gTlVMTF9DRUxMX0NPREUgJiYgY2VsbC5leHRlbmRlZC51bmRlcmxpbmVTdHlsZSA9PT0gVW5kZXJsaW5lU3R5bGUuRE9UVEVEKSB7XG4gICAgICBjb25zdCBsaW5lV2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHRoaXMuX29wdGlvblNlcnZpY2UucmF3T3B0aW9ucy5mb250U2l6ZSAqIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5kcHIgLyAxNSkpO1xuICAgICAgJHZhcmlhbnRPZmZzZXQgPSB4ICogZGV2aWNlQ2VsbFdpZHRoICUgKE1hdGgucm91bmQobGluZVdpZHRoKSAqIDIpO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IGRlY29yYXRpb25zIG9uIHRoZSBib3R0b20gbGF5ZXJcbiAgICB0aGlzLl9kZWNvcmF0aW9uU2VydmljZS5mb3JFYWNoRGVjb3JhdGlvbkF0Q2VsbCh4LCB5LCAnYm90dG9tJywgZCA9PiB7XG4gICAgICBpZiAoZC5iYWNrZ3JvdW5kQ29sb3JSR0IpIHtcbiAgICAgICAgJGJnID0gZC5iYWNrZ3JvdW5kQ29sb3JSR0IucmdiYSA+PiA4ICYgQXR0cmlidXRlcy5SR0JfTUFTSztcbiAgICAgICAgJGhhc0JnID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChkLmZvcmVncm91bmRDb2xvclJHQikge1xuICAgICAgICAkZmcgPSBkLmZvcmVncm91bmRDb2xvclJHQi5yZ2JhID4+IDggJiBBdHRyaWJ1dGVzLlJHQl9NQVNLO1xuICAgICAgICAkaGFzRmcgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQXBwbHkgdGhlIHNlbGVjdGlvbiBjb2xvciBpZiBuZWVkZWRcbiAgICAkaXNTZWxlY3RlZCA9IHRoaXMuX3NlbGVjdGlvblJlbmRlck1vZGVsLmlzQ2VsbFNlbGVjdGVkKHRoaXMuX3Rlcm1pbmFsLCB4LCB5KTtcbiAgICBpZiAoJGlzU2VsZWN0ZWQpIHtcbiAgICAgIC8vIElmIHRoZSBjZWxsIGhhcyBhIGJnIGNvbG9yLCByZXRhaW4gdGhlIGNvbG9yIGJ5IGJsZW5kaW5nIGl0IHdpdGggdGhlIHNlbGVjdGlvbiBjb2xvclxuICAgICAgaWYgKFxuICAgICAgICAodGhpcy5yZXN1bHQuZmcgJiBGZ0ZsYWdzLklOVkVSU0UpIHx8XG4gICAgICAgICh0aGlzLnJlc3VsdC5iZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgIT09IEF0dHJpYnV0ZXMuQ01fREVGQVVMVFxuICAgICAgKSB7XG4gICAgICAgIC8vIFJlc29sdmUgdGhlIHN0YW5kYXJkIGJnIGNvbG9yXG4gICAgICAgIGlmICh0aGlzLnJlc3VsdC5mZyAmIEZnRmxhZ3MuSU5WRVJTRSkge1xuICAgICAgICAgIHN3aXRjaCAodGhpcy5yZXN1bHQuZmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spIHtcbiAgICAgICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjpcbiAgICAgICAgICAgICAgJGJnID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5hbnNpW3RoaXMucmVzdWx0LmZnICYgQXR0cmlidXRlcy5QQ09MT1JfTUFTS10ucmdiYTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUkdCOlxuICAgICAgICAgICAgICAkYmcgPSAoKHRoaXMucmVzdWx0LmZnICYgQXR0cmlidXRlcy5SR0JfTUFTSykgPDwgOCkgfCAweEZGO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9ERUZBVUxUOlxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgJGJnID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5mb3JlZ3JvdW5kLnJnYmE7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN3aXRjaCAodGhpcy5yZXN1bHQuYmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spIHtcbiAgICAgICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjpcbiAgICAgICAgICAgICAgJGJnID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5hbnNpW3RoaXMucmVzdWx0LmJnICYgQXR0cmlidXRlcy5QQ09MT1JfTUFTS10ucmdiYTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUkdCOlxuICAgICAgICAgICAgICAkYmcgPSAoKHRoaXMucmVzdWx0LmJnICYgQXR0cmlidXRlcy5SR0JfTUFTSykgPDwgOCkgfCAweEZGO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gY29uc2lkZXIgZGVmYXVsdCBiZyBjb2xvciBoZXJlIGFzIGl0J3Mgbm90IHBvc3NpYmxlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEJsZW5kIHdpdGggc2VsZWN0aW9uIGJnIGNvbG9yXG4gICAgICAgICRiZyA9IHJnYmEuYmxlbmQoXG4gICAgICAgICAgJGJnLFxuICAgICAgICAgICgodGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmlzRm9jdXNlZCA/ICRjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZE9wYXF1ZSA6ICRjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kT3BhcXVlKS5yZ2JhICYgMHhGRkZGRkYwMCkgfCAweDgwXG4gICAgICAgICkgPj4gOCAmIEF0dHJpYnV0ZXMuUkdCX01BU0s7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkYmcgPSAodGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmlzRm9jdXNlZCA/ICRjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZE9wYXF1ZSA6ICRjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kT3BhcXVlKS5yZ2JhID4+IDggJiBBdHRyaWJ1dGVzLlJHQl9NQVNLO1xuICAgICAgfVxuICAgICAgJGhhc0JnID0gdHJ1ZTtcblxuICAgICAgLy8gQXBwbHkgZXhwbGljaXQgc2VsZWN0aW9uIGZvcmVncm91bmQgaWYgcHJlc2VudFxuICAgICAgaWYgKCRjb2xvcnMuc2VsZWN0aW9uRm9yZWdyb3VuZCkge1xuICAgICAgICAkZmcgPSAkY29sb3JzLnNlbGVjdGlvbkZvcmVncm91bmQucmdiYSA+PiA4ICYgQXR0cmlidXRlcy5SR0JfTUFTSztcbiAgICAgICAgJGhhc0ZnID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gT3ZlcndyaXRlIGZnIGFzIGJnIGlmIGl0J3MgYSBzcGVjaWFsIGRlY29yYXRpdmUgZ2x5cGggKGVnLiBwb3dlcmxpbmUpXG4gICAgICBpZiAodHJlYXRHbHlwaEFzQmFja2dyb3VuZENvbG9yKGNlbGwuZ2V0Q29kZSgpKSkge1xuICAgICAgICAvLyBJbnZlcnNlIGRlZmF1bHQgYmFja2dyb3VuZCBzaG91bGQgYmUgdHJlYXRlZCBhcyB0cmFuc3BhcmVudFxuICAgICAgICBpZiAoXG4gICAgICAgICAgKHRoaXMucmVzdWx0LmZnICYgRmdGbGFncy5JTlZFUlNFKSAmJlxuICAgICAgICAgICh0aGlzLnJlc3VsdC5iZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fREVGQVVMVFxuICAgICAgICApIHtcbiAgICAgICAgICAkZmcgPSAodGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmlzRm9jdXNlZCA/ICRjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZE9wYXF1ZSA6ICRjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kT3BhcXVlKS5yZ2JhID4+IDggJiBBdHRyaWJ1dGVzLlJHQl9NQVNLO1xuICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgaWYgKHRoaXMucmVzdWx0LmZnICYgRmdGbGFncy5JTlZFUlNFKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMucmVzdWx0LmJnICYgQXR0cmlidXRlcy5DTV9NQVNLKSB7XG4gICAgICAgICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICAgICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMjU2OlxuICAgICAgICAgICAgICAgICRmZyA9IHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMuYW5zaVt0aGlzLnJlc3VsdC5iZyAmIEF0dHJpYnV0ZXMuUENPTE9SX01BU0tdLnJnYmE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9SR0I6XG4gICAgICAgICAgICAgICAgJGZnID0gKCh0aGlzLnJlc3VsdC5iZyAmIEF0dHJpYnV0ZXMuUkdCX01BU0spIDw8IDgpIHwgMHhGRjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBjb25zaWRlciBkZWZhdWx0IGJnIGNvbG9yIGhlcmUgYXMgaXQncyBub3QgcG9zc2libGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3dpdGNoICh0aGlzLnJlc3VsdC5mZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykge1xuICAgICAgICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDE2OlxuICAgICAgICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjpcbiAgICAgICAgICAgICAgICAkZmcgPSB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzLmFuc2lbdGhpcy5yZXN1bHQuZmcgJiBBdHRyaWJ1dGVzLlBDT0xPUl9NQVNLXS5yZ2JhO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUkdCOlxuICAgICAgICAgICAgICAgICRmZyA9ICgodGhpcy5yZXN1bHQuZmcgJiBBdHRyaWJ1dGVzLlJHQl9NQVNLKSA8PCA4KSB8IDB4RkY7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9ERUZBVUxUOlxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICRmZyA9IHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMuZm9yZWdyb3VuZC5yZ2JhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgICRmZyA9IHJnYmEuYmxlbmQoXG4gICAgICAgICAgICAkZmcsXG4gICAgICAgICAgICAoKHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5pc0ZvY3VzZWQgPyAkY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRPcGFxdWUgOiAkY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZE9wYXF1ZSkucmdiYSAmIDB4RkZGRkZGMDApIHwgMHg4MFxuICAgICAgICAgICkgPj4gOCAmIEF0dHJpYnV0ZXMuUkdCX01BU0s7XG4gICAgICAgIH1cbiAgICAgICAgJGhhc0ZnID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBcHBseSBkZWNvcmF0aW9ucyBvbiB0aGUgdG9wIGxheWVyXG4gICAgdGhpcy5fZGVjb3JhdGlvblNlcnZpY2UuZm9yRWFjaERlY29yYXRpb25BdENlbGwoeCwgeSwgJ3RvcCcsIGQgPT4ge1xuICAgICAgaWYgKGQuYmFja2dyb3VuZENvbG9yUkdCKSB7XG4gICAgICAgICRiZyA9IGQuYmFja2dyb3VuZENvbG9yUkdCLnJnYmEgPj4gOCAmIEF0dHJpYnV0ZXMuUkdCX01BU0s7XG4gICAgICAgICRoYXNCZyA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoZC5mb3JlZ3JvdW5kQ29sb3JSR0IpIHtcbiAgICAgICAgJGZnID0gZC5mb3JlZ3JvdW5kQ29sb3JSR0IucmdiYSA+PiA4ICYgQXR0cmlidXRlcy5SR0JfTUFTSztcbiAgICAgICAgJGhhc0ZnID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIENvbnZlcnQgYW55IG92ZXJyaWRlcyBmcm9tIHJnYmEgdG8gdGhlIGZnL2JnIHBhY2tlZCBmb3JtYXQuIFRoaXMgcmVzb2x2ZXMgdGhlIGludmVyc2UgZmxhZ1xuICAgIC8vIGFoZWFkIG9mIHRpbWUgaW4gb3JkZXIgdG8gdXNlIHRoZSBjb3JyZWN0IGNhY2hlIGtleVxuICAgIGlmICgkaGFzQmcpIHtcbiAgICAgIGlmICgkaXNTZWxlY3RlZCkge1xuICAgICAgICAvLyBOb24tUkdCIGF0dHJpYnV0ZXMgZnJvbSBtb2RlbCArIGZvcmNlIG5vbi1kaW0gKyBvdmVycmlkZSArIGZvcmNlIFJHQiBjb2xvciBtb2RlXG4gICAgICAgICRiZyA9IChjZWxsLmJnICYgfkF0dHJpYnV0ZXMuUkdCX01BU0sgJiB+QmdGbGFncy5ESU0pIHwgJGJnIHwgQXR0cmlidXRlcy5DTV9SR0I7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBOb24tUkdCIGF0dHJpYnV0ZXMgZnJvbSBtb2RlbCArIG92ZXJyaWRlICsgZm9yY2UgUkdCIGNvbG9yIG1vZGVcbiAgICAgICAgJGJnID0gKGNlbGwuYmcgJiB+QXR0cmlidXRlcy5SR0JfTUFTSykgfCAkYmcgfCBBdHRyaWJ1dGVzLkNNX1JHQjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCRoYXNGZykge1xuICAgICAgLy8gTm9uLVJHQiBhdHRyaWJ1dGVzIGZyb20gbW9kZWwgKyBmb3JjZSBkaXNhYmxlIGludmVyc2UgKyBvdmVycmlkZSArIGZvcmNlIFJHQiBjb2xvciBtb2RlXG4gICAgICAkZmcgPSAoY2VsbC5mZyAmIH5BdHRyaWJ1dGVzLlJHQl9NQVNLICYgfkZnRmxhZ3MuSU5WRVJTRSkgfCAkZmcgfCBBdHRyaWJ1dGVzLkNNX1JHQjtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgY2FzZSB3aGVyZSBpbnZlcnNlIHdhcyBzcGVjaWZpZWQgYnkgb25seSBvbmUgb2YgYmcgb3ZlcnJpZGUgb3IgZmcgb3ZlcnJpZGUgd2FzIHNldCxcbiAgICAvLyByZXNvbHZpbmcgdGhlIG90aGVyIGludmVyc2UgY29sb3IgYW5kIHNldHRpbmcgdGhlIGludmVyc2UgZmxhZyBpZiBuZWVkZWQuXG4gICAgaWYgKHRoaXMucmVzdWx0LmZnICYgRmdGbGFncy5JTlZFUlNFKSB7XG4gICAgICBpZiAoJGhhc0JnICYmICEkaGFzRmcpIHtcbiAgICAgICAgLy8gUmVzb2x2ZSBiZyBjb2xvciB0eXBlIChkZWZhdWx0IGNvbG9yIGhhcyBhIGRpZmZlcmVudCBtZWFuaW5nIGluIGZnIHZzIGJnKVxuICAgICAgICBpZiAoKHRoaXMucmVzdWx0LmJnICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9ERUZBVUxUKSB7XG4gICAgICAgICAgJGZnID0gKHRoaXMucmVzdWx0LmZnICYgfihBdHRyaWJ1dGVzLlJHQl9NQVNLIHwgRmdGbGFncy5JTlZFUlNFIHwgQXR0cmlidXRlcy5DTV9NQVNLKSkgfCAoKCRjb2xvcnMuYmFja2dyb3VuZC5yZ2JhID4+IDggJiBBdHRyaWJ1dGVzLlJHQl9NQVNLKSAmIEF0dHJpYnV0ZXMuUkdCX01BU0spIHwgQXR0cmlidXRlcy5DTV9SR0I7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJGZnID0gKHRoaXMucmVzdWx0LmZnICYgfihBdHRyaWJ1dGVzLlJHQl9NQVNLIHwgRmdGbGFncy5JTlZFUlNFIHwgQXR0cmlidXRlcy5DTV9NQVNLKSkgfCB0aGlzLnJlc3VsdC5iZyAmIChBdHRyaWJ1dGVzLlJHQl9NQVNLIHwgQXR0cmlidXRlcy5DTV9NQVNLKTtcbiAgICAgICAgfVxuICAgICAgICAkaGFzRmcgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKCEkaGFzQmcgJiYgJGhhc0ZnKSB7XG4gICAgICAgIC8vIFJlc29sdmUgYmcgY29sb3IgdHlwZSAoZGVmYXVsdCBjb2xvciBoYXMgYSBkaWZmZXJlbnQgbWVhbmluZyBpbiBmZyB2cyBiZylcbiAgICAgICAgaWYgKCh0aGlzLnJlc3VsdC5mZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fREVGQVVMVCkge1xuICAgICAgICAgICRiZyA9ICh0aGlzLnJlc3VsdC5iZyAmIH4oQXR0cmlidXRlcy5SR0JfTUFTSyB8IEF0dHJpYnV0ZXMuQ01fTUFTSykpIHwgKCgkY29sb3JzLmZvcmVncm91bmQucmdiYSA+PiA4ICYgQXR0cmlidXRlcy5SR0JfTUFTSykgJiBBdHRyaWJ1dGVzLlJHQl9NQVNLKSB8IEF0dHJpYnV0ZXMuQ01fUkdCO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRiZyA9ICh0aGlzLnJlc3VsdC5iZyAmIH4oQXR0cmlidXRlcy5SR0JfTUFTSyB8IEF0dHJpYnV0ZXMuQ01fTUFTSykpIHwgdGhpcy5yZXN1bHQuZmcgJiAoQXR0cmlidXRlcy5SR0JfTUFTSyB8IEF0dHJpYnV0ZXMuQ01fTUFTSyk7XG4gICAgICAgIH1cbiAgICAgICAgJGhhc0JnID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWxlYXNlIG9iamVjdFxuICAgICRjb2xvcnMgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBVc2UgdGhlIG92ZXJyaWRlIGlmIGl0IGV4aXN0c1xuICAgIHRoaXMucmVzdWx0LmJnID0gJGhhc0JnID8gJGJnIDogdGhpcy5yZXN1bHQuYmc7XG4gICAgdGhpcy5yZXN1bHQuZmcgPSAkaGFzRmcgPyAkZmcgOiB0aGlzLnJlc3VsdC5mZztcblxuICAgIC8vIFJlc2V0IG92ZXJyaWRlcyB2YXJpYW50T2Zmc2V0XG4gICAgdGhpcy5yZXN1bHQuZXh0ICY9IH5FeHRGbGFncy5WQVJJQU5UX09GRlNFVDtcbiAgICB0aGlzLnJlc3VsdC5leHQgfD0gKCR2YXJpYW50T2Zmc2V0IDw8IDI5KSAmIEV4dEZsYWdzLlZBUklBTlRfT0ZGU0VUO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IFRleHR1cmVBdGxhcyB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1RleHR1cmVBdGxhcyc7XG5pbXBvcnQgeyBJVGVybWluYWxPcHRpb25zLCBUZXJtaW5hbCB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5pbXBvcnQgeyBJVGVybWluYWwsIFJlYWRvbmx5Q29sb3JTZXQgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IElDaGFyQXRsYXNDb25maWcsIElUZXh0dXJlQXRsYXMgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UeXBlcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUNvbmZpZywgY29uZmlnRXF1YWxzIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvQ2hhckF0bGFzVXRpbHMnO1xuXG5pbnRlcmZhY2UgSVRleHR1cmVBdGxhc0NhY2hlRW50cnkge1xuICBhdGxhczogSVRleHR1cmVBdGxhcztcbiAgY29uZmlnOiBJQ2hhckF0bGFzQ29uZmlnO1xuICAvLyBOLkIuIFRoaXMgaW1wbGVtZW50YXRpb24gcG90ZW50aWFsbHkgaG9sZHMgb250byBjb3BpZXMgb2YgdGhlIHRlcm1pbmFsIGZvcmV2ZXIsIHNvXG4gIC8vIHRoaXMgbWF5IGNhdXNlIG1lbW9yeSBsZWFrcy5cbiAgb3duZWRCeTogVGVybWluYWxbXTtcbn1cblxuY29uc3QgY2hhckF0bGFzQ2FjaGU6IElUZXh0dXJlQXRsYXNDYWNoZUVudHJ5W10gPSBbXTtcblxuLyoqXG4gKiBBY3F1aXJlcyBhIGNoYXIgYXRsYXMsIGVpdGhlciBnZW5lcmF0aW5nIGEgbmV3IG9uZSBvciByZXR1cm5pbmcgYW4gZXhpc3RpbmdcbiAqIG9uZSB0aGF0IGlzIGluIHVzZSBieSBhbm90aGVyIHRlcm1pbmFsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWNxdWlyZVRleHR1cmVBdGxhcyhcbiAgdGVybWluYWw6IFRlcm1pbmFsLFxuICBvcHRpb25zOiBSZXF1aXJlZDxJVGVybWluYWxPcHRpb25zPixcbiAgY29sb3JzOiBSZWFkb25seUNvbG9yU2V0LFxuICBkZXZpY2VDZWxsV2lkdGg6IG51bWJlcixcbiAgZGV2aWNlQ2VsbEhlaWdodDogbnVtYmVyLFxuICBkZXZpY2VDaGFyV2lkdGg6IG51bWJlcixcbiAgZGV2aWNlQ2hhckhlaWdodDogbnVtYmVyLFxuICBkZXZpY2VQaXhlbFJhdGlvOiBudW1iZXJcbik6IElUZXh0dXJlQXRsYXMge1xuICBjb25zdCBuZXdDb25maWcgPSBnZW5lcmF0ZUNvbmZpZyhkZXZpY2VDZWxsV2lkdGgsIGRldmljZUNlbGxIZWlnaHQsIGRldmljZUNoYXJXaWR0aCwgZGV2aWNlQ2hhckhlaWdodCwgb3B0aW9ucywgY29sb3JzLCBkZXZpY2VQaXhlbFJhdGlvKTtcblxuICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIHRlcm1pbmFsIGFscmVhZHkgb3ducyB0aGlzIGNvbmZpZ1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYXJBdGxhc0NhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZW50cnkgPSBjaGFyQXRsYXNDYWNoZVtpXTtcbiAgICBjb25zdCBvd25lZEJ5SW5kZXggPSBlbnRyeS5vd25lZEJ5LmluZGV4T2YodGVybWluYWwpO1xuICAgIGlmIChvd25lZEJ5SW5kZXggPj0gMCkge1xuICAgICAgaWYgKGNvbmZpZ0VxdWFscyhlbnRyeS5jb25maWcsIG5ld0NvbmZpZykpIHtcbiAgICAgICAgcmV0dXJuIGVudHJ5LmF0bGFzO1xuICAgICAgfVxuICAgICAgLy8gVGhlIGNvbmZpZ3MgZGlmZmVyLCByZWxlYXNlIHRoZSB0ZXJtaW5hbCBmcm9tIHRoZSBlbnRyeVxuICAgICAgaWYgKGVudHJ5Lm93bmVkQnkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGVudHJ5LmF0bGFzLmRpc3Bvc2UoKTtcbiAgICAgICAgY2hhckF0bGFzQ2FjaGUuc3BsaWNlKGksIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW50cnkub3duZWRCeS5zcGxpY2Uob3duZWRCeUluZGV4LCAxKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRyeSBtYXRjaCBhIGNoYXIgYXRsYXMgZnJvbSB0aGUgY2FjaGVcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFyQXRsYXNDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGVudHJ5ID0gY2hhckF0bGFzQ2FjaGVbaV07XG4gICAgaWYgKGNvbmZpZ0VxdWFscyhlbnRyeS5jb25maWcsIG5ld0NvbmZpZykpIHtcbiAgICAgIC8vIEFkZCB0aGUgdGVybWluYWwgdG8gdGhlIGNhY2hlIGVudHJ5IGFuZCByZXR1cm5cbiAgICAgIGVudHJ5Lm93bmVkQnkucHVzaCh0ZXJtaW5hbCk7XG4gICAgICByZXR1cm4gZW50cnkuYXRsYXM7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgY29yZTogSVRlcm1pbmFsID0gKHRlcm1pbmFsIGFzIGFueSkuX2NvcmU7XG4gIGNvbnN0IG5ld0VudHJ5OiBJVGV4dHVyZUF0bGFzQ2FjaGVFbnRyeSA9IHtcbiAgICBhdGxhczogbmV3IFRleHR1cmVBdGxhcyhkb2N1bWVudCwgbmV3Q29uZmlnLCBjb3JlLnVuaWNvZGVTZXJ2aWNlKSxcbiAgICBjb25maWc6IG5ld0NvbmZpZyxcbiAgICBvd25lZEJ5OiBbdGVybWluYWxdXG4gIH07XG4gIGNoYXJBdGxhc0NhY2hlLnB1c2gobmV3RW50cnkpO1xuICByZXR1cm4gbmV3RW50cnkuYXRsYXM7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBhIHRlcm1pbmFsIHJlZmVyZW5jZSBmcm9tIHRoZSBjYWNoZSwgYWxsb3dpbmcgaXRzIG1lbW9yeSB0byBiZSBmcmVlZC5cbiAqIEBwYXJhbSB0ZXJtaW5hbCBUaGUgdGVybWluYWwgdG8gcmVtb3ZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlVGVybWluYWxGcm9tQ2FjaGUodGVybWluYWw6IFRlcm1pbmFsKTogdm9pZCB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhckF0bGFzQ2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBpbmRleCA9IGNoYXJBdGxhc0NhY2hlW2ldLm93bmVkQnkuaW5kZXhPZih0ZXJtaW5hbCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgaWYgKGNoYXJBdGxhc0NhY2hlW2ldLm93bmVkQnkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIC8vIFJlbW92ZSB0aGUgY2FjaGUgZW50cnkgaWYgaXQncyB0aGUgb25seSB0ZXJtaW5hbFxuICAgICAgICBjaGFyQXRsYXNDYWNoZVtpXS5hdGxhcy5kaXNwb3NlKCk7XG4gICAgICAgIGNoYXJBdGxhc0NhY2hlLnNwbGljZShpLCAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJlbW92ZSB0aGUgcmVmZXJlbmNlIGZyb20gdGhlIGNhY2hlIGVudHJ5XG4gICAgICAgIGNoYXJBdGxhc0NhY2hlW2ldLm93bmVkQnkuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJQ2hhckF0bGFzQ29uZmlnIH0gZnJvbSAnLi9UeXBlcyc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVzIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9Db25zdGFudHMnO1xuaW1wb3J0IHsgSVRlcm1pbmFsT3B0aW9ucyB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5pbXBvcnQgeyBJQ29sb3JTZXQsIFJlYWRvbmx5Q29sb3JTZXQgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IE5VTExfQ09MT1IgfSBmcm9tICdjb21tb24vQ29sb3InO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVDb25maWcoZGV2aWNlQ2VsbFdpZHRoOiBudW1iZXIsIGRldmljZUNlbGxIZWlnaHQ6IG51bWJlciwgZGV2aWNlQ2hhcldpZHRoOiBudW1iZXIsIGRldmljZUNoYXJIZWlnaHQ6IG51bWJlciwgb3B0aW9uczogUmVxdWlyZWQ8SVRlcm1pbmFsT3B0aW9ucz4sIGNvbG9yczogUmVhZG9ubHlDb2xvclNldCwgZGV2aWNlUGl4ZWxSYXRpbzogbnVtYmVyKTogSUNoYXJBdGxhc0NvbmZpZyB7XG4gIC8vIG51bGwgb3V0IHNvbWUgZmllbGRzIHRoYXQgZG9uJ3QgbWF0dGVyXG4gIGNvbnN0IGNsb25lZENvbG9yczogSUNvbG9yU2V0ID0ge1xuICAgIGZvcmVncm91bmQ6IGNvbG9ycy5mb3JlZ3JvdW5kLFxuICAgIGJhY2tncm91bmQ6IGNvbG9ycy5iYWNrZ3JvdW5kLFxuICAgIGN1cnNvcjogTlVMTF9DT0xPUixcbiAgICBjdXJzb3JBY2NlbnQ6IE5VTExfQ09MT1IsXG4gICAgc2VsZWN0aW9uRm9yZWdyb3VuZDogTlVMTF9DT0xPUixcbiAgICBzZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQ6IE5VTExfQ09MT1IsXG4gICAgc2VsZWN0aW9uQmFja2dyb3VuZE9wYXF1ZTogTlVMTF9DT0xPUixcbiAgICBzZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRUcmFuc3BhcmVudDogTlVMTF9DT0xPUixcbiAgICBzZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRPcGFxdWU6IE5VTExfQ09MT1IsXG4gICAgLy8gRm9yIHRoZSBzdGF0aWMgY2hhciBhdGxhcywgd2Ugb25seSB1c2UgdGhlIGZpcnN0IDE2IGNvbG9ycywgYnV0IHdlIG5lZWQgYWxsIDI1NiBmb3IgdGhlXG4gICAgLy8gZHluYW1pYyBjaGFyYWN0ZXIgYXRsYXMuXG4gICAgYW5zaTogY29sb3JzLmFuc2kuc2xpY2UoKSxcbiAgICBjb250cmFzdENhY2hlOiBjb2xvcnMuY29udHJhc3RDYWNoZSxcbiAgICBoYWxmQ29udHJhc3RDYWNoZTogY29sb3JzLmhhbGZDb250cmFzdENhY2hlXG4gIH07XG4gIHJldHVybiB7XG4gICAgY3VzdG9tR2x5cGhzOiBvcHRpb25zLmN1c3RvbUdseXBocyxcbiAgICBkZXZpY2VQaXhlbFJhdGlvLFxuICAgIGxldHRlclNwYWNpbmc6IG9wdGlvbnMubGV0dGVyU3BhY2luZyxcbiAgICBsaW5lSGVpZ2h0OiBvcHRpb25zLmxpbmVIZWlnaHQsXG4gICAgZGV2aWNlQ2VsbFdpZHRoOiBkZXZpY2VDZWxsV2lkdGgsXG4gICAgZGV2aWNlQ2VsbEhlaWdodDogZGV2aWNlQ2VsbEhlaWdodCxcbiAgICBkZXZpY2VDaGFyV2lkdGg6IGRldmljZUNoYXJXaWR0aCxcbiAgICBkZXZpY2VDaGFySGVpZ2h0OiBkZXZpY2VDaGFySGVpZ2h0LFxuICAgIGZvbnRGYW1pbHk6IG9wdGlvbnMuZm9udEZhbWlseSxcbiAgICBmb250U2l6ZTogb3B0aW9ucy5mb250U2l6ZSxcbiAgICBmb250V2VpZ2h0OiBvcHRpb25zLmZvbnRXZWlnaHQsXG4gICAgZm9udFdlaWdodEJvbGQ6IG9wdGlvbnMuZm9udFdlaWdodEJvbGQsXG4gICAgYWxsb3dUcmFuc3BhcmVuY3k6IG9wdGlvbnMuYWxsb3dUcmFuc3BhcmVuY3ksXG4gICAgZHJhd0JvbGRUZXh0SW5CcmlnaHRDb2xvcnM6IG9wdGlvbnMuZHJhd0JvbGRUZXh0SW5CcmlnaHRDb2xvcnMsXG4gICAgbWluaW11bUNvbnRyYXN0UmF0aW86IG9wdGlvbnMubWluaW11bUNvbnRyYXN0UmF0aW8sXG4gICAgY29sb3JzOiBjbG9uZWRDb2xvcnNcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmZpZ0VxdWFscyhhOiBJQ2hhckF0bGFzQ29uZmlnLCBiOiBJQ2hhckF0bGFzQ29uZmlnKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYS5jb2xvcnMuYW5zaS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChhLmNvbG9ycy5hbnNpW2ldLnJnYmEgIT09IGIuY29sb3JzLmFuc2lbaV0ucmdiYSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYS5kZXZpY2VQaXhlbFJhdGlvID09PSBiLmRldmljZVBpeGVsUmF0aW8gJiZcbiAgICAgIGEuY3VzdG9tR2x5cGhzID09PSBiLmN1c3RvbUdseXBocyAmJlxuICAgICAgYS5saW5lSGVpZ2h0ID09PSBiLmxpbmVIZWlnaHQgJiZcbiAgICAgIGEubGV0dGVyU3BhY2luZyA9PT0gYi5sZXR0ZXJTcGFjaW5nICYmXG4gICAgICBhLmZvbnRGYW1pbHkgPT09IGIuZm9udEZhbWlseSAmJlxuICAgICAgYS5mb250U2l6ZSA9PT0gYi5mb250U2l6ZSAmJlxuICAgICAgYS5mb250V2VpZ2h0ID09PSBiLmZvbnRXZWlnaHQgJiZcbiAgICAgIGEuZm9udFdlaWdodEJvbGQgPT09IGIuZm9udFdlaWdodEJvbGQgJiZcbiAgICAgIGEuYWxsb3dUcmFuc3BhcmVuY3kgPT09IGIuYWxsb3dUcmFuc3BhcmVuY3kgJiZcbiAgICAgIGEuZGV2aWNlQ2hhcldpZHRoID09PSBiLmRldmljZUNoYXJXaWR0aCAmJlxuICAgICAgYS5kZXZpY2VDaGFySGVpZ2h0ID09PSBiLmRldmljZUNoYXJIZWlnaHQgJiZcbiAgICAgIGEuZHJhd0JvbGRUZXh0SW5CcmlnaHRDb2xvcnMgPT09IGIuZHJhd0JvbGRUZXh0SW5CcmlnaHRDb2xvcnMgJiZcbiAgICAgIGEubWluaW11bUNvbnRyYXN0UmF0aW8gPT09IGIubWluaW11bUNvbnRyYXN0UmF0aW8gJiZcbiAgICAgIGEuY29sb3JzLmZvcmVncm91bmQucmdiYSA9PT0gYi5jb2xvcnMuZm9yZWdyb3VuZC5yZ2JhICYmXG4gICAgICBhLmNvbG9ycy5iYWNrZ3JvdW5kLnJnYmEgPT09IGIuY29sb3JzLmJhY2tncm91bmQucmdiYTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzMjU2Q29sb3IoY29sb3JDb2RlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIChjb2xvckNvZGUgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSBBdHRyaWJ1dGVzLkNNX1AxNiB8fCAoY29sb3JDb2RlICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9QMjU2O1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBpc0ZpcmVmb3gsIGlzTGVnYWN5RWRnZSB9IGZyb20gJ2NvbW1vbi9QbGF0Zm9ybSc7XG5cbmV4cG9ydCBjb25zdCBJTlZFUlRFRF9ERUZBVUxUX0NPTE9SID0gMjU3O1xuXG5leHBvcnQgY29uc3QgRElNX09QQUNJVFkgPSAwLjU7XG4vLyBUaGUgdGV4dCBiYXNlbGluZSBpcyBzZXQgY29uZGl0aW9uYWxseSBieSBicm93c2VyLiBVc2luZyAnaWRlb2dyYXBoaWMnIGZvciBGaXJlZm94IG9yIExlZ2FjeSBFZGdlXG4vLyB3b3VsZCByZXN1bHQgaW4gdHJ1bmNhdGVkIHRleHQgKElzc3VlIDMzNTMpLiBVc2luZyAnYm90dG9tJyBmb3IgQ2hyb21lIHdvdWxkIHJlc3VsdCBpbiBzbGlnaHRseVxuLy8gdW5hbGlnbmVkIFBvd2VybGluZSBmb250cyAoUFIgMzM1NiNpc3N1ZWNvbW1lbnQtODUwOTI4MTc5KS5cbmV4cG9ydCBjb25zdCBURVhUX0JBU0VMSU5FOiBDYW52YXNUZXh0QmFzZWxpbmUgPSBpc0ZpcmVmb3ggfHwgaXNMZWdhY3lFZGdlID8gJ2JvdHRvbScgOiAnaWRlb2dyYXBoaWMnO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJQ29yZUJyb3dzZXJTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5cbi8qKlxuICogVGhlIHRpbWUgYmV0d2VlbiBjdXJzb3IgYmxpbmtzLlxuICovXG5jb25zdCBCTElOS19JTlRFUlZBTCA9IDYwMDtcblxuZXhwb3J0IGNsYXNzIEN1cnNvckJsaW5rU3RhdGVNYW5hZ2VyIHtcbiAgcHVibGljIGlzQ3Vyc29yVmlzaWJsZTogYm9vbGVhbjtcblxuICBwcml2YXRlIF9hbmltYXRpb25GcmFtZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9ibGlua1N0YXJ0VGltZW91dDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9ibGlua0ludGVydmFsOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lIGF0IHdoaWNoIHRoZSBhbmltYXRpb24gZnJhbWUgd2FzIHJlc3RhcnRlZCwgdGhpcyBpcyB1c2VkIG9uIHRoZVxuICAgKiBuZXh0IHJlbmRlciB0byByZXN0YXJ0IHRoZSB0aW1lcnMgc28gdGhleSBkb24ndCBuZWVkIHRvIHJlc3RhcnQgdGhlIHRpbWVyc1xuICAgKiBtdWx0aXBsZSB0aW1lcyBvdmVyIGEgc2hvcnQgcGVyaW9kLlxuICAgKi9cbiAgcHJpdmF0ZSBfYW5pbWF0aW9uVGltZVJlc3RhcnRlZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX3JlbmRlckNhbGxiYWNrOiAoKSA9PiB2b2lkLFxuICAgIHByaXZhdGUgX2NvcmVCcm93c2VyU2VydmljZTogSUNvcmVCcm93c2VyU2VydmljZVxuICApIHtcbiAgICB0aGlzLmlzQ3Vyc29yVmlzaWJsZSA9IHRydWU7XG4gICAgaWYgKHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5pc0ZvY3VzZWQpIHtcbiAgICAgIHRoaXMuX3Jlc3RhcnRJbnRlcnZhbCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNQYXVzZWQoKTogYm9vbGVhbiB7IHJldHVybiAhKHRoaXMuX2JsaW5rU3RhcnRUaW1lb3V0IHx8IHRoaXMuX2JsaW5rSW50ZXJ2YWwpOyB9XG5cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2JsaW5rSW50ZXJ2YWwpIHtcbiAgICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLl9ibGlua0ludGVydmFsKTtcbiAgICAgIHRoaXMuX2JsaW5rSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl9ibGlua1N0YXJ0VGltZW91dCkge1xuICAgICAgdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fYmxpbmtTdGFydFRpbWVvdXQpO1xuICAgICAgdGhpcy5fYmxpbmtTdGFydFRpbWVvdXQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl9hbmltYXRpb25GcmFtZSkge1xuICAgICAgdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9hbmltYXRpb25GcmFtZSk7XG4gICAgICB0aGlzLl9hbmltYXRpb25GcmFtZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVzdGFydEJsaW5rQW5pbWF0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzUGF1c2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFNhdmUgYSB0aW1lc3RhbXAgc28gdGhhdCB0aGUgcmVzdGFydCBjYW4gYmUgZG9uZSBvbiB0aGUgbmV4dCBpbnRlcnZhbFxuICAgIHRoaXMuX2FuaW1hdGlvblRpbWVSZXN0YXJ0ZWQgPSBEYXRlLm5vdygpO1xuICAgIC8vIEZvcmNlIGEgY3Vyc29yIHJlbmRlciB0byBlbnN1cmUgaXQncyB2aXNpYmxlIGFuZCBpbiB0aGUgY29ycmVjdCBwb3NpdGlvblxuICAgIHRoaXMuaXNDdXJzb3JWaXNpYmxlID0gdHJ1ZTtcbiAgICBpZiAoIXRoaXMuX2FuaW1hdGlvbkZyYW1lKSB7XG4gICAgICB0aGlzLl9hbmltYXRpb25GcmFtZSA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgdGhpcy5fcmVuZGVyQ2FsbGJhY2soKTtcbiAgICAgICAgdGhpcy5fYW5pbWF0aW9uRnJhbWUgPSB1bmRlZmluZWQ7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZXN0YXJ0SW50ZXJ2YWwodGltZVRvU3RhcnQ6IG51bWJlciA9IEJMSU5LX0lOVEVSVkFMKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgYW55IGV4aXN0aW5nIGludGVydmFsXG4gICAgaWYgKHRoaXMuX2JsaW5rSW50ZXJ2YWwpIHtcbiAgICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLl9ibGlua0ludGVydmFsKTtcbiAgICAgIHRoaXMuX2JsaW5rSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gU2V0dXAgdGhlIGluaXRpYWwgdGltZW91dCB3aGljaCB3aWxsIGhpZGUgdGhlIGN1cnNvciwgdGhpcyBpcyBkb25lIGJlZm9yZVxuICAgIC8vIHRoZSByZWd1bGFyIGludGVydmFsIGlzIHNldHVwIGluIG9yZGVyIHRvIHN1cHBvcnQgcmVzdGFydGluZyB0aGUgYmxpbmtcbiAgICAvLyBhbmltYXRpb24gaW4gYSBsaWdodHdlaWdodCB3YXkgKHdpdGhvdXQgdGhyYXNoaW5nIGNsZWFySW50ZXJ2YWwgYW5kXG4gICAgLy8gc2V0SW50ZXJ2YWwpLlxuICAgIHRoaXMuX2JsaW5rU3RhcnRUaW1lb3V0ID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIENoZWNrIGlmIGFub3RoZXIgYW5pbWF0aW9uIHJlc3RhcnQgd2FzIHJlcXVlc3RlZCB3aGlsZSB0aGlzIHdhcyBiZWluZ1xuICAgICAgLy8gc3RhcnRlZFxuICAgICAgaWYgKHRoaXMuX2FuaW1hdGlvblRpbWVSZXN0YXJ0ZWQpIHtcbiAgICAgICAgY29uc3QgdGltZSA9IEJMSU5LX0lOVEVSVkFMIC0gKERhdGUubm93KCkgLSB0aGlzLl9hbmltYXRpb25UaW1lUmVzdGFydGVkKTtcbiAgICAgICAgdGhpcy5fYW5pbWF0aW9uVGltZVJlc3RhcnRlZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRpbWUgPiAwKSB7XG4gICAgICAgICAgdGhpcy5fcmVzdGFydEludGVydmFsKHRpbWUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIaWRlIHRoZSBjdXJzb3JcbiAgICAgIHRoaXMuaXNDdXJzb3JWaXNpYmxlID0gZmFsc2U7XG4gICAgICB0aGlzLl9hbmltYXRpb25GcmFtZSA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgdGhpcy5fcmVuZGVyQ2FsbGJhY2soKTtcbiAgICAgICAgdGhpcy5fYW5pbWF0aW9uRnJhbWUgPSB1bmRlZmluZWQ7XG4gICAgICB9KTtcblxuICAgICAgLy8gU2V0dXAgdGhlIGJsaW5rIGludGVydmFsXG4gICAgICB0aGlzLl9ibGlua0ludGVydmFsID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIC8vIEFkanVzdCB0aGUgYW5pbWF0aW9uIHRpbWUgaWYgaXQgd2FzIHJlc3RhcnRlZFxuICAgICAgICBpZiAodGhpcy5fYW5pbWF0aW9uVGltZVJlc3RhcnRlZCkge1xuICAgICAgICAgIC8vIGNhbGMgdGltZSBkaWZmXG4gICAgICAgICAgLy8gTWFrZSByZXN0YXJ0IGludGVydmFsIGRvIGEgc2V0VGltZW91dCBpbml0aWFsbHk/XG4gICAgICAgICAgY29uc3QgdGltZSA9IEJMSU5LX0lOVEVSVkFMIC0gKERhdGUubm93KCkgLSB0aGlzLl9hbmltYXRpb25UaW1lUmVzdGFydGVkKTtcbiAgICAgICAgICB0aGlzLl9hbmltYXRpb25UaW1lUmVzdGFydGVkID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHRoaXMuX3Jlc3RhcnRJbnRlcnZhbCh0aW1lKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbnZlcnQgdmlzaWJpbGl0eSBhbmQgcmVuZGVyXG4gICAgICAgIHRoaXMuaXNDdXJzb3JWaXNpYmxlID0gIXRoaXMuaXNDdXJzb3JWaXNpYmxlO1xuICAgICAgICB0aGlzLl9hbmltYXRpb25GcmFtZSA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9yZW5kZXJDYWxsYmFjaygpO1xuICAgICAgICAgIHRoaXMuX2FuaW1hdGlvbkZyYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB9KTtcbiAgICAgIH0sIEJMSU5LX0lOVEVSVkFMKTtcbiAgICB9LCB0aW1lVG9TdGFydCk7XG4gIH1cblxuICBwdWJsaWMgcGF1c2UoKTogdm9pZCB7XG4gICAgdGhpcy5pc0N1cnNvclZpc2libGUgPSB0cnVlO1xuICAgIGlmICh0aGlzLl9ibGlua0ludGVydmFsKSB7XG4gICAgICB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5fYmxpbmtJbnRlcnZhbCk7XG4gICAgICB0aGlzLl9ibGlua0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodGhpcy5fYmxpbmtTdGFydFRpbWVvdXQpIHtcbiAgICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX2JsaW5rU3RhcnRUaW1lb3V0KTtcbiAgICAgIHRoaXMuX2JsaW5rU3RhcnRUaW1lb3V0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodGhpcy5fYW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fYW5pbWF0aW9uRnJhbWUpO1xuICAgICAgdGhpcy5fYW5pbWF0aW9uRnJhbWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc3VtZSgpOiB2b2lkIHtcbiAgICAvLyBDbGVhciBvdXQgYW55IGV4aXN0aW5nIHRpbWVycyBqdXN0IGluIGNhc2VcbiAgICB0aGlzLnBhdXNlKCk7XG5cbiAgICB0aGlzLl9hbmltYXRpb25UaW1lUmVzdGFydGVkID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3Jlc3RhcnRJbnRlcnZhbCgpO1xuICAgIHRoaXMucmVzdGFydEJsaW5rQW5pbWF0aW9uKCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIxIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgdGhyb3dJZkZhbHN5IH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvUmVuZGVyZXJVdGlscyc7XG5cbmludGVyZmFjZSBJQmxvY2tWZWN0b3Ige1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbiAgdzogbnVtYmVyO1xuICBoOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBibG9ja0VsZW1lbnREZWZpbml0aW9uczogeyBbaW5kZXg6IHN0cmluZ106IElCbG9ja1ZlY3RvcltdIHwgdW5kZWZpbmVkIH0gPSB7XG4gIC8vIEJsb2NrIGVsZW1lbnRzICgweDI1ODAtMHgyNTkwKVxuICAn4paAJzogW3sgeDogMCwgeTogMCwgdzogOCwgaDogNCB9XSwgLy8gVVBQRVIgSEFMRiBCTE9DS1xuICAn4paBJzogW3sgeDogMCwgeTogNywgdzogOCwgaDogMSB9XSwgLy8gTE9XRVIgT05FIEVJR0hUSCBCTE9DS1xuICAn4paCJzogW3sgeDogMCwgeTogNiwgdzogOCwgaDogMiB9XSwgLy8gTE9XRVIgT05FIFFVQVJURVIgQkxPQ0tcbiAgJ+KWgyc6IFt7IHg6IDAsIHk6IDUsIHc6IDgsIGg6IDMgfV0sIC8vIExPV0VSIFRIUkVFIEVJR0hUSFMgQkxPQ0tcbiAgJ+KWhCc6IFt7IHg6IDAsIHk6IDQsIHc6IDgsIGg6IDQgfV0sIC8vIExPV0VSIEhBTEYgQkxPQ0tcbiAgJ+KWhSc6IFt7IHg6IDAsIHk6IDMsIHc6IDgsIGg6IDUgfV0sIC8vIExPV0VSIEZJVkUgRUlHSFRIUyBCTE9DS1xuICAn4paGJzogW3sgeDogMCwgeTogMiwgdzogOCwgaDogNiB9XSwgLy8gTE9XRVIgVEhSRUUgUVVBUlRFUlMgQkxPQ0tcbiAgJ+KWhyc6IFt7IHg6IDAsIHk6IDEsIHc6IDgsIGg6IDcgfV0sIC8vIExPV0VSIFNFVkVOIEVJR0hUSFMgQkxPQ0tcbiAgJ+KWiCc6IFt7IHg6IDAsIHk6IDAsIHc6IDgsIGg6IDggfV0sIC8vIEZVTEwgQkxPQ0tcbiAgJ+KWiSc6IFt7IHg6IDAsIHk6IDAsIHc6IDcsIGg6IDggfV0sIC8vIExFRlQgU0VWRU4gRUlHSFRIUyBCTE9DS1xuICAn4paKJzogW3sgeDogMCwgeTogMCwgdzogNiwgaDogOCB9XSwgLy8gTEVGVCBUSFJFRSBRVUFSVEVSUyBCTE9DS1xuICAn4paLJzogW3sgeDogMCwgeTogMCwgdzogNSwgaDogOCB9XSwgLy8gTEVGVCBGSVZFIEVJR0hUSFMgQkxPQ0tcbiAgJ+KWjCc6IFt7IHg6IDAsIHk6IDAsIHc6IDQsIGg6IDggfV0sIC8vIExFRlQgSEFMRiBCTE9DS1xuICAn4paNJzogW3sgeDogMCwgeTogMCwgdzogMywgaDogOCB9XSwgLy8gTEVGVCBUSFJFRSBFSUdIVEhTIEJMT0NLXG4gICfilo4nOiBbeyB4OiAwLCB5OiAwLCB3OiAyLCBoOiA4IH1dLCAvLyBMRUZUIE9ORSBRVUFSVEVSIEJMT0NLXG4gICfilo8nOiBbeyB4OiAwLCB5OiAwLCB3OiAxLCBoOiA4IH1dLCAvLyBMRUZUIE9ORSBFSUdIVEggQkxPQ0tcbiAgJ+KWkCc6IFt7IHg6IDQsIHk6IDAsIHc6IDQsIGg6IDggfV0sIC8vIFJJR0hUIEhBTEYgQkxPQ0tcblxuICAvLyBCbG9jayBlbGVtZW50cyAoMHgyNTk0LTB4MjU5NSlcbiAgJ+KWlCc6IFt7IHg6IDAsIHk6IDAsIHc6IDgsIGg6IDEgfV0sIC8vIFVQUEVSIE9ORSBFSUdIVEggQkxPQ0tcbiAgJ+KWlSc6IFt7IHg6IDcsIHk6IDAsIHc6IDEsIGg6IDggfV0sIC8vIFJJR0hUIE9ORSBFSUdIVEggQkxPQ0tcblxuICAvLyBUZXJtaW5hbCBncmFwaGljIGNoYXJhY3RlcnMgKDB4MjU5Ni0weDI1OUYpXG4gICfilpYnOiBbeyB4OiAwLCB5OiA0LCB3OiA0LCBoOiA0IH1dLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUVVBRFJBTlQgTE9XRVIgTEVGVFxuICAn4paXJzogW3sgeDogNCwgeTogNCwgdzogNCwgaDogNCB9XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFFVQURSQU5UIExPV0VSIFJJR0hUXG4gICfilpgnOiBbeyB4OiAwLCB5OiAwLCB3OiA0LCBoOiA0IH1dLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUVVBRFJBTlQgVVBQRVIgTEVGVFxuICAn4paZJzogW3sgeDogMCwgeTogMCwgdzogNCwgaDogOCB9LCB7IHg6IDAsIHk6IDQsIHc6IDgsIGg6IDQgfV0sIC8vIFFVQURSQU5UIFVQUEVSIExFRlQgQU5EIExPV0VSIExFRlQgQU5EIExPV0VSIFJJR0hUXG4gICfilponOiBbeyB4OiAwLCB5OiAwLCB3OiA0LCBoOiA0IH0sIHsgeDogNCwgeTogNCwgdzogNCwgaDogNCB9XSwgLy8gUVVBRFJBTlQgVVBQRVIgTEVGVCBBTkQgTE9XRVIgUklHSFRcbiAgJ+KWmyc6IFt7IHg6IDAsIHk6IDAsIHc6IDQsIGg6IDggfSwgeyB4OiA0LCB5OiAwLCB3OiA0LCBoOiA0IH1dLCAvLyBRVUFEUkFOVCBVUFBFUiBMRUZUIEFORCBVUFBFUiBSSUdIVCBBTkQgTE9XRVIgTEVGVFxuICAn4pacJzogW3sgeDogMCwgeTogMCwgdzogOCwgaDogNCB9LCB7IHg6IDQsIHk6IDAsIHc6IDQsIGg6IDggfV0sIC8vIFFVQURSQU5UIFVQUEVSIExFRlQgQU5EIFVQUEVSIFJJR0hUIEFORCBMT1dFUiBSSUdIVFxuICAn4padJzogW3sgeDogNCwgeTogMCwgdzogNCwgaDogNCB9XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFFVQURSQU5UIFVQUEVSIFJJR0hUXG4gICfilp4nOiBbeyB4OiA0LCB5OiAwLCB3OiA0LCBoOiA0IH0sIHsgeDogMCwgeTogNCwgdzogNCwgaDogNCB9XSwgLy8gUVVBRFJBTlQgVVBQRVIgUklHSFQgQU5EIExPV0VSIExFRlRcbiAgJ+KWnyc6IFt7IHg6IDQsIHk6IDAsIHc6IDQsIGg6IDggfSwgeyB4OiAwLCB5OiA0LCB3OiA4LCBoOiA0IH1dLCAvLyBRVUFEUkFOVCBVUFBFUiBSSUdIVCBBTkQgTE9XRVIgTEVGVCBBTkQgTE9XRVIgUklHSFRcblxuICAvLyBWRVJUSUNBTCBPTkUgRUlHSFRIIEJMT0NLLTIgdGhyb3VnaCBWRVJUSUNBTCBPTkUgRUlHSFRIIEJMT0NLLTdcbiAgJ1xcdXsxRkI3MH0nOiBbeyB4OiAxLCB5OiAwLCB3OiAxLCBoOiA4IH1dLFxuICAnXFx1ezFGQjcxfSc6IFt7IHg6IDIsIHk6IDAsIHc6IDEsIGg6IDggfV0sXG4gICdcXHV7MUZCNzJ9JzogW3sgeDogMywgeTogMCwgdzogMSwgaDogOCB9XSxcbiAgJ1xcdXsxRkI3M30nOiBbeyB4OiA0LCB5OiAwLCB3OiAxLCBoOiA4IH1dLFxuICAnXFx1ezFGQjc0fSc6IFt7IHg6IDUsIHk6IDAsIHc6IDEsIGg6IDggfV0sXG4gICdcXHV7MUZCNzV9JzogW3sgeDogNiwgeTogMCwgdzogMSwgaDogOCB9XSxcblxuICAvLyBIT1JJWk9OVEFMIE9ORSBFSUdIVEggQkxPQ0stMiB0aHJvdWdoIEhPUklaT05UQUwgT05FIEVJR0hUSCBCTE9DSy03XG4gICdcXHV7MUZCNzZ9JzogW3sgeDogMCwgeTogMSwgdzogOCwgaDogMSB9XSxcbiAgJ1xcdXsxRkI3N30nOiBbeyB4OiAwLCB5OiAyLCB3OiA4LCBoOiAxIH1dLFxuICAnXFx1ezFGQjc4fSc6IFt7IHg6IDAsIHk6IDMsIHc6IDgsIGg6IDEgfV0sXG4gICdcXHV7MUZCNzl9JzogW3sgeDogMCwgeTogNCwgdzogOCwgaDogMSB9XSxcbiAgJ1xcdXsxRkI3QX0nOiBbeyB4OiAwLCB5OiA1LCB3OiA4LCBoOiAxIH1dLFxuICAnXFx1ezFGQjdCfSc6IFt7IHg6IDAsIHk6IDYsIHc6IDgsIGg6IDEgfV0sXG5cbiAgLy8gTEVGVCBBTkQgTE9XRVIgT05FIEVJR0hUSCBCTE9DS1xuICAnXFx1ezFGQjdDfSc6IFt7IHg6IDAsIHk6IDAsIHc6IDEsIGg6IDggfSwgeyB4OiAwLCB5OiA3LCB3OiA4LCBoOiAxIH1dLFxuICAvLyBMRUZUIEFORCBVUFBFUiBPTkUgRUlHSFRIIEJMT0NLXG4gICdcXHV7MUZCN0R9JzogW3sgeDogMCwgeTogMCwgdzogMSwgaDogOCB9LCB7IHg6IDAsIHk6IDAsIHc6IDgsIGg6IDEgfV0sXG4gIC8vIFJJR0hUIEFORCBVUFBFUiBPTkUgRUlHSFRIIEJMT0NLXG4gICdcXHV7MUZCN0V9JzogW3sgeDogNywgeTogMCwgdzogMSwgaDogOCB9LCB7IHg6IDAsIHk6IDAsIHc6IDgsIGg6IDEgfV0sXG4gIC8vIFJJR0hUIEFORCBMT1dFUiBPTkUgRUlHSFRIIEJMT0NLXG4gICdcXHV7MUZCN0Z9JzogW3sgeDogNywgeTogMCwgdzogMSwgaDogOCB9LCB7IHg6IDAsIHk6IDcsIHc6IDgsIGg6IDEgfV0sXG4gIC8vIFVQUEVSIEFORCBMT1dFUiBPTkUgRUlHSFRIIEJMT0NLXG4gICdcXHV7MUZCODB9JzogW3sgeDogMCwgeTogMCwgdzogOCwgaDogMSB9LCB7IHg6IDAsIHk6IDcsIHc6IDgsIGg6IDEgfV0sXG4gIC8vIEhPUklaT05UQUwgT05FIEVJR0hUSCBCTE9DSy0xMzU4XG4gICdcXHV7MUZCODF9JzogW3sgeDogMCwgeTogMCwgdzogOCwgaDogMSB9LCB7IHg6IDAsIHk6IDIsIHc6IDgsIGg6IDEgfSwgeyB4OiAwLCB5OiA0LCB3OiA4LCBoOiAxIH0sIHsgeDogMCwgeTogNywgdzogOCwgaDogMSB9XSxcblxuICAvLyBVUFBFUiBPTkUgUVVBUlRFUiBCTE9DS1xuICAnXFx1ezFGQjgyfSc6IFt7IHg6IDAsIHk6IDAsIHc6IDgsIGg6IDIgfV0sXG4gIC8vIFVQUEVSIFRIUkVFIEVJR0hUSFMgQkxPQ0tcbiAgJ1xcdXsxRkI4M30nOiBbeyB4OiAwLCB5OiAwLCB3OiA4LCBoOiAzIH1dLFxuICAvLyBVUFBFUiBGSVZFIEVJR0hUSFMgQkxPQ0tcbiAgJ1xcdXsxRkI4NH0nOiBbeyB4OiAwLCB5OiAwLCB3OiA4LCBoOiA1IH1dLFxuICAvLyBVUFBFUiBUSFJFRSBRVUFSVEVSUyBCTE9DS1xuICAnXFx1ezFGQjg1fSc6IFt7IHg6IDAsIHk6IDAsIHc6IDgsIGg6IDYgfV0sXG4gIC8vIFVQUEVSIFNFVkVOIEVJR0hUSFMgQkxPQ0tcbiAgJ1xcdXsxRkI4Nn0nOiBbeyB4OiAwLCB5OiAwLCB3OiA4LCBoOiA3IH1dLFxuXG4gIC8vIFJJR0hUIE9ORSBRVUFSVEVSIEJMT0NLXG4gICdcXHV7MUZCODd9JzogW3sgeDogNiwgeTogMCwgdzogMiwgaDogOCB9XSxcbiAgLy8gUklHSFQgVEhSRUUgRUlHSFRIUyBCME9DS1xuICAnXFx1ezFGQjg4fSc6IFt7IHg6IDUsIHk6IDAsIHc6IDMsIGg6IDggfV0sXG4gIC8vIFJJR0hUIEZJVkUgRUlHSFRIUyBCTDBDS1xuICAnXFx1ezFGQjg5fSc6IFt7IHg6IDMsIHk6IDAsIHc6IDUsIGg6IDggfV0sXG4gIC8vIFJJR0hUIFRIUkVFIFFVQVJURVJTIDBMT0NLXG4gICdcXHV7MUZCOEF9JzogW3sgeDogMiwgeTogMCwgdzogNiwgaDogOCB9XSxcbiAgLy8gUklHSFQgU0VWRU4gRUlHSFRIUyBCME9DS1xuICAnXFx1ezFGQjhCfSc6IFt7IHg6IDEsIHk6IDAsIHc6IDcsIGg6IDggfV0sXG5cbiAgLy8gQ0hFQ0tFUiBCT0FSRCBGSUxMXG4gICdcXHV7MUZCOTV9JzogW1xuICAgIHsgeDogMCwgeTogMCwgdzogMiwgaDogMiB9LCB7IHg6IDQsIHk6IDAsIHc6IDIsIGg6IDIgfSxcbiAgICB7IHg6IDIsIHk6IDIsIHc6IDIsIGg6IDIgfSwgeyB4OiA2LCB5OiAyLCB3OiAyLCBoOiAyIH0sXG4gICAgeyB4OiAwLCB5OiA0LCB3OiAyLCBoOiAyIH0sIHsgeDogNCwgeTogNCwgdzogMiwgaDogMiB9LFxuICAgIHsgeDogMiwgeTogNiwgdzogMiwgaDogMiB9LCB7IHg6IDYsIHk6IDYsIHc6IDIsIGg6IDIgfVxuICBdLFxuICAvLyBJTlZFUlNFIENIRUNLRVIgQk9BUkQgRklMTFxuICAnXFx1ezFGQjk2fSc6IFtcbiAgICB7IHg6IDIsIHk6IDAsIHc6IDIsIGg6IDIgfSwgeyB4OiA2LCB5OiAwLCB3OiAyLCBoOiAyIH0sXG4gICAgeyB4OiAwLCB5OiAyLCB3OiAyLCBoOiAyIH0sIHsgeDogNCwgeTogMiwgdzogMiwgaDogMiB9LFxuICAgIHsgeDogMiwgeTogNCwgdzogMiwgaDogMiB9LCB7IHg6IDYsIHk6IDQsIHc6IDIsIGg6IDIgfSxcbiAgICB7IHg6IDAsIHk6IDYsIHc6IDIsIGg6IDIgfSwgeyB4OiA0LCB5OiA2LCB3OiAyLCBoOiAyIH1cbiAgXSxcbiAgLy8gSEVBVlkgSE9SSVpPTlRBTCBGSUxMICh1cHBlciBtaWRkbGUgYW5kIGxvd2VyIG9uZSBxdWFydGVyIGJsb2NrKVxuICAnXFx1ezFGQjk3fSc6IFt7IHg6IDAsIHk6IDIsIHc6IDgsIGg6IDIgfSwgeyB4OiAwLCB5OiA2LCB3OiA4LCBoOiAyIH1dXG59O1xuXG50eXBlIFBhdHRlcm5EZWZpbml0aW9uID0gbnVtYmVyW11bXTtcblxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXBlYXRpbmcgcGF0dGVybiB1c2VkIGJ5IHNwZWNpYWwgY2hhcmFjdGVycywgdGhlIHBhdHRlcm4gaXMgbWFkZSB1cCBvZiBhIDJkIGFycmF5IG9mXG4gKiBwaXhlbCB2YWx1ZXMgdG8gYmUgZmlsbGVkICgxKSBvciBub3QgZmlsbGVkICgwKS5cbiAqL1xuY29uc3QgcGF0dGVybkNoYXJhY3RlckRlZmluaXRpb25zOiB7IFtrZXk6IHN0cmluZ106IFBhdHRlcm5EZWZpbml0aW9uIHwgdW5kZWZpbmVkIH0gPSB7XG4gIC8vIFNoYWRlIGNoYXJhY3RlcnMgKDB4MjU5MS0weDI1OTMpXG4gICfilpEnOiBbIC8vIExJR0hUIFNIQURFICgyNSUpXG4gICAgWzEsIDAsIDAsIDBdLFxuICAgIFswLCAwLCAwLCAwXSxcbiAgICBbMCwgMCwgMSwgMF0sXG4gICAgWzAsIDAsIDAsIDBdXG4gIF0sXG4gICfilpInOiBbIC8vIE1FRElVTSBTSEFERSAoNTAlKVxuICAgIFsxLCAwXSxcbiAgICBbMCwgMF0sXG4gICAgWzAsIDFdLFxuICAgIFswLCAwXVxuICBdLFxuICAn4paTJzogWyAvLyBEQVJLIFNIQURFICg3NSUpXG4gICAgWzAsIDFdLFxuICAgIFsxLCAxXSxcbiAgICBbMSwgMF0sXG4gICAgWzEsIDFdXG4gIF1cbn07XG5cbmNvbnN0IGVudW0gU2hhcGVzIHtcbiAgLyoqIOKUgiAqLyBUT1BfVE9fQk9UVE9NID0gJ00uNSwwIEwuNSwxJyxcbiAgLyoqIOKUgCAqLyBMRUZUX1RPX1JJR0hUID0gJ00wLC41IEwxLC41JyxcblxuICAvKiog4pSUICovIFRPUF9UT19SSUdIVCA9ICdNLjUsMCBMLjUsLjUgTDEsLjUnLFxuICAvKiog4pSYICovIFRPUF9UT19MRUZUID0gJ00uNSwwIEwuNSwuNSBMMCwuNScsXG4gIC8qKiDilJAgKi8gTEVGVF9UT19CT1RUT00gPSAnTTAsLjUgTC41LC41IEwuNSwxJyxcbiAgLyoqIOKUjCAqLyBSSUdIVF9UT19CT1RUT00gPSAnTTAuNSwxIEwuNSwuNSBMMSwuNScsXG5cbiAgLyoqIOKVtSAqLyBNSURETEVfVE9fVE9QID0gJ00uNSwuNSBMLjUsMCcsXG4gIC8qKiDilbQgKi8gTUlERExFX1RPX0xFRlQgPSAnTS41LC41IEwwLC41JyxcbiAgLyoqIOKVtiAqLyBNSURETEVfVE9fUklHSFQgPSAnTS41LC41IEwxLC41JyxcbiAgLyoqIOKVtyAqLyBNSURETEVfVE9fQk9UVE9NID0gJ00uNSwuNSBMLjUsMScsXG5cbiAgLyoqIOKUtCAqLyBUX1RPUCA9ICdNMCwuNSBMMSwuNSBNLjUsLjUgTC41LDAnLFxuICAvKiog4pSkICovIFRfTEVGVCA9ICdNLjUsMCBMLjUsMSBNLjUsLjUgTDAsLjUnLFxuICAvKiog4pScICovIFRfUklHSFQgPSAnTS41LDAgTC41LDEgTS41LC41IEwxLC41JyxcbiAgLyoqIOKUrCAqLyBUX0JPVFRPTSA9ICdNMCwuNSBMMSwuNSBNLjUsLjUgTC41LDEnLFxuXG4gIC8qKiDilLwgKi8gQ1JPU1MgPSAnTTAsLjUgTDEsLjUgTS41LDAgTC41LDEnLFxuXG4gIC8qKiDilYwgKi8gVFdPX0RBU0hFU19IT1JJWk9OVEFMID0gJ00uMSwuNSBMLjQsLjUgTS42LC41IEwuOSwuNScsIC8vIC4yIGVtcHR5LCAuMyBmaWxsZWRcbiAgLyoqIOKUhCAqLyBUSFJFRV9EQVNIRVNfSE9SSVpPTlRBTCA9ICdNLjA2NjcsLjUgTC4yNjY3LC41IE0uNCwuNSBMLjYsLjUgTS43MzMzLC41IEwuOTMzMywuNScsIC8vIC4xMzMzIGVtcHR5LCAuMiBmaWxsZWRcbiAgLyoqIOKUiSAqLyBGT1VSX0RBU0hFU19IT1JJWk9OVEFMID0gJ00uMDUsLjUgTC4yLC41IE0uMywuNSBMLjQ1LC41IE0uNTUsLjUgTC43LC41IE0uOCwuNSBMLjk1LC41JywgLy8gLjEgZW1wdHksIC4xNSBmaWxsZWRcbiAgLyoqIOKVjiAqLyBUV09fREFTSEVTX1ZFUlRJQ0FMID0gJ00uNSwuMSBMLjUsLjQgTS41LC42IEwuNSwuOScsXG4gIC8qKiDilIYgKi8gVEhSRUVfREFTSEVTX1ZFUlRJQ0FMID0gJ00uNSwuMDY2NyBMLjUsLjI2NjcgTS41LC40IEwuNSwuNiBNLjUsLjczMzMgTC41LC45MzMzJyxcbiAgLyoqIOKUiiAqLyBGT1VSX0RBU0hFU19WRVJUSUNBTCA9ICdNLjUsLjA1IEwuNSwuMiBNLjUsLjMgTC41LC40NSBMLjUsLjU1IE0uNSwuNyBMLjUsLjk1Jyxcbn1cblxuY29uc3QgZW51bSBTdHlsZSB7XG4gIE5PUk1BTCA9IDEsXG4gIEJPTEQgPSAzXG59XG5cbi8qKlxuICogQHBhcmFtIHhwIFRoZSBwZXJjZW50YWdlIG9mIDE1JSBvZiB0aGUgeCBheGlzLlxuICogQHBhcmFtIHlwIFRoZSBwZXJjZW50YWdlIG9mIDE1JSBvZiB0aGUgeCBheGlzIG9uIHRoZSB5IGF4aXMuXG4gKi9cbnR5cGUgRHJhd0Z1bmN0aW9uRGVmaW5pdGlvbiA9ICh4cDogbnVtYmVyLCB5cDogbnVtYmVyKSA9PiBzdHJpbmc7XG5cbi8qKlxuICogVGhpcyBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgb2YgYWxsIGJveCBkcmF3aW5nIGNoYXJhY3RlcnMgaW4gdGhlIGZvcm1hdCBvZiBTVkcgcGF0aHMgKGllLiB0aGVcbiAqIHN2ZyBkIGF0dHJpYnV0ZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBib3hEcmF3aW5nRGVmaW5pdGlvbnM6IHsgW2NoYXJhY3Rlcjogc3RyaW5nXTogeyBbZm9udFdlaWdodDogbnVtYmVyXTogc3RyaW5nIHwgRHJhd0Z1bmN0aW9uRGVmaW5pdGlvbiB9IHwgdW5kZWZpbmVkIH0gPSB7XG4gIC8vIFVuaWZvcm0gbm9ybWFsIGFuZCBib2xkXG4gICfilIAnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTEVGVF9UT19SSUdIVCB9LFxuICAn4pSBJzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLkxFRlRfVE9fUklHSFQgfSxcbiAgJ+KUgic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UT1BfVE9fQk9UVE9NIH0sXG4gICfilIMnOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuVE9QX1RPX0JPVFRPTSB9LFxuICAn4pSMJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlJJR0hUX1RPX0JPVFRPTSB9LFxuICAn4pSPJzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLlJJR0hUX1RPX0JPVFRPTSB9LFxuICAn4pSQJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLkxFRlRfVE9fQk9UVE9NIH0sXG4gICfilJMnOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuTEVGVF9UT19CT1RUT00gfSxcbiAgJ+KUlCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UT1BfVE9fUklHSFQgfSxcbiAgJ+KUlyc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5UT1BfVE9fUklHSFQgfSxcbiAgJ+KUmCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UT1BfVE9fTEVGVCB9LFxuICAn4pSbJzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLlRPUF9UT19MRUZUIH0sXG4gICfilJwnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVF9SSUdIVCB9LFxuICAn4pSjJzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLlRfUklHSFQgfSxcbiAgJ+KUpCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UX0xFRlQgfSxcbiAgJ+KUqyc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5UX0xFRlQgfSxcbiAgJ+KUrCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UX0JPVFRPTSB9LFxuICAn4pSzJzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLlRfQk9UVE9NIH0sXG4gICfilLQnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVF9UT1AgfSxcbiAgJ+KUuyc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5UX1RPUCB9LFxuICAn4pS8JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLkNST1NTIH0sXG4gICfilYsnOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuQ1JPU1MgfSxcbiAgJ+KVtCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fTEVGVCB9LFxuICAn4pW4JzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLk1JRERMRV9UT19MRUZUIH0sXG4gICfilbUnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1RPUCB9LFxuICAn4pW5JzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLk1JRERMRV9UT19UT1AgfSxcbiAgJ+KVtic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fUklHSFQgfSxcbiAgJ+KVuic6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5NSURETEVfVE9fUklHSFQgfSxcbiAgJ+KVtyc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fQk9UVE9NIH0sXG4gICfilbsnOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuTUlERExFX1RPX0JPVFRPTSB9LFxuXG4gIC8vIERvdWJsZSBib3JkZXJcbiAgJ+KVkCc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNMCwkey41IC0geXB9IEwxLCR7LjUgLSB5cH0gTTAsJHsuNSArIHlwfSBMMSwkey41ICsgeXB9YCB9LFxuICAn4pWRJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0key41IC0geHB9LDAgTCR7LjUgLSB4cH0sMSBNJHsuNSArIHhwfSwwIEwkey41ICsgeHB9LDFgIH0sXG4gICfilZInOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTS41LDEgTC41LCR7LjUgLSB5cH0gTDEsJHsuNSAtIHlwfSBNLjUsJHsuNSArIHlwfSBMMSwkey41ICsgeXB9YCB9LFxuICAn4pWTJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0key41IC0geHB9LDEgTCR7LjUgLSB4cH0sLjUgTDEsLjUgTSR7LjUgKyB4cH0sLjUgTCR7LjUgKyB4cH0sMWAgfSxcbiAgJ+KVlCc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNMSwkey41IC0geXB9IEwkey41IC0geHB9LCR7LjUgLSB5cH0gTCR7LjUgLSB4cH0sMSBNMSwkey41ICsgeXB9IEwkey41ICsgeHB9LCR7LjUgKyB5cH0gTCR7LjUgKyB4cH0sMWAgfSxcbiAgJ+KVlSc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNMCwkey41IC0geXB9IEwuNSwkey41IC0geXB9IEwuNSwxIE0wLCR7LjUgKyB5cH0gTC41LCR7LjUgKyB5cH1gIH0sXG4gICfilZYnOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTSR7LjUgKyB4cH0sMSBMJHsuNSArIHhwfSwuNSBMMCwuNSBNJHsuNSAtIHhwfSwuNSBMJHsuNSAtIHhwfSwxYCB9LFxuICAn4pWXJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0wLCR7LjUgKyB5cH0gTCR7LjUgLSB4cH0sJHsuNSArIHlwfSBMJHsuNSAtIHhwfSwxIE0wLCR7LjUgLSB5cH0gTCR7LjUgKyB4cH0sJHsuNSAtIHlwfSBMJHsuNSArIHhwfSwxYCB9LFxuICAn4pWYJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0uNSwwIEwuNSwkey41ICsgeXB9IEwxLCR7LjUgKyB5cH0gTS41LCR7LjUgLSB5cH0gTDEsJHsuNSAtIHlwfWAgfSxcbiAgJ+KVmSc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNMSwuNSBMJHsuNSAtIHhwfSwuNSBMJHsuNSAtIHhwfSwwIE0key41ICsgeHB9LC41IEwkey41ICsgeHB9LDBgIH0sXG4gICfilZonOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTTEsJHsuNSAtIHlwfSBMJHsuNSArIHhwfSwkey41IC0geXB9IEwkey41ICsgeHB9LDAgTTEsJHsuNSArIHlwfSBMJHsuNSAtIHhwfSwkey41ICsgeXB9IEwkey41IC0geHB9LDBgIH0sXG4gICfilZsnOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTTAsJHsuNSArIHlwfSBMLjUsJHsuNSArIHlwfSBMLjUsMCBNMCwkey41IC0geXB9IEwuNSwkey41IC0geXB9YCB9LFxuICAn4pWcJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0wLC41IEwkey41ICsgeHB9LC41IEwkey41ICsgeHB9LDAgTSR7LjUgLSB4cH0sLjUgTCR7LjUgLSB4cH0sMGAgfSxcbiAgJ+KVnSc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNMCwkey41IC0geXB9IEwkey41IC0geHB9LCR7LjUgLSB5cH0gTCR7LjUgLSB4cH0sMCBNMCwkey41ICsgeXB9IEwkey41ICsgeHB9LCR7LjUgKyB5cH0gTCR7LjUgKyB4cH0sMGAgfSxcbiAgJ+KVnic6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGAke1NoYXBlcy5UT1BfVE9fQk9UVE9NfSBNLjUsJHsuNSAtIHlwfSBMMSwkey41IC0geXB9IE0uNSwkey41ICsgeXB9IEwxLCR7LjUgKyB5cH1gIH0sXG4gICfilZ8nOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTSR7LjUgLSB4cH0sMCBMJHsuNSAtIHhwfSwxIE0key41ICsgeHB9LDAgTCR7LjUgKyB4cH0sMSBNJHsuNSArIHhwfSwuNSBMMSwuNWAgfSxcbiAgJ+KVoCc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNJHsuNSAtIHhwfSwwIEwkey41IC0geHB9LDEgTTEsJHsuNSArIHlwfSBMJHsuNSArIHhwfSwkey41ICsgeXB9IEwkey41ICsgeHB9LDEgTTEsJHsuNSAtIHlwfSBMJHsuNSArIHhwfSwkey41IC0geXB9IEwkey41ICsgeHB9LDBgIH0sXG4gICfilaEnOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgJHtTaGFwZXMuVE9QX1RPX0JPVFRPTX0gTTAsJHsuNSAtIHlwfSBMLjUsJHsuNSAtIHlwfSBNMCwkey41ICsgeXB9IEwuNSwkey41ICsgeXB9YCB9LFxuICAn4pWiJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0wLC41IEwkey41IC0geHB9LC41IE0key41IC0geHB9LDAgTCR7LjUgLSB4cH0sMSBNJHsuNSArIHhwfSwwIEwkey41ICsgeHB9LDFgIH0sXG4gICfilaMnOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTSR7LjUgKyB4cH0sMCBMJHsuNSArIHhwfSwxIE0wLCR7LjUgKyB5cH0gTCR7LjUgLSB4cH0sJHsuNSArIHlwfSBMJHsuNSAtIHhwfSwxIE0wLCR7LjUgLSB5cH0gTCR7LjUgLSB4cH0sJHsuNSAtIHlwfSBMJHsuNSAtIHhwfSwwYCB9LFxuICAn4pWkJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0wLCR7LjUgLSB5cH0gTDEsJHsuNSAtIHlwfSBNMCwkey41ICsgeXB9IEwxLCR7LjUgKyB5cH0gTS41LCR7LjUgKyB5cH0gTC41LDFgIH0sXG4gICfilaUnOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgJHtTaGFwZXMuTEVGVF9UT19SSUdIVH0gTSR7LjUgLSB4cH0sLjUgTCR7LjUgLSB4cH0sMSBNJHsuNSArIHhwfSwuNSBMJHsuNSArIHhwfSwxYCB9LFxuICAn4pWmJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0wLCR7LjUgLSB5cH0gTDEsJHsuNSAtIHlwfSBNMCwkey41ICsgeXB9IEwkey41IC0geHB9LCR7LjUgKyB5cH0gTCR7LjUgLSB4cH0sMSBNMSwkey41ICsgeXB9IEwkey41ICsgeHB9LCR7LjUgKyB5cH0gTCR7LjUgKyB4cH0sMWAgfSxcbiAgJ+KVpyc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNLjUsMCBMLjUsJHsuNSAtIHlwfSBNMCwkey41IC0geXB9IEwxLCR7LjUgLSB5cH0gTTAsJHsuNSArIHlwfSBMMSwkey41ICsgeXB9YCB9LFxuICAn4pWoJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYCR7U2hhcGVzLkxFRlRfVE9fUklHSFR9IE0key41IC0geHB9LC41IEwkey41IC0geHB9LDAgTSR7LjUgKyB4cH0sLjUgTCR7LjUgKyB4cH0sMGAgfSxcbiAgJ+KVqSc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNMCwkey41ICsgeXB9IEwxLCR7LjUgKyB5cH0gTTAsJHsuNSAtIHlwfSBMJHsuNSAtIHhwfSwkey41IC0geXB9IEwkey41IC0geHB9LDAgTTEsJHsuNSAtIHlwfSBMJHsuNSArIHhwfSwkey41IC0geXB9IEwkey41ICsgeHB9LDBgIH0sXG4gICfilaonOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgJHtTaGFwZXMuVE9QX1RPX0JPVFRPTX0gTTAsJHsuNSAtIHlwfSBMMSwkey41IC0geXB9IE0wLCR7LjUgKyB5cH0gTDEsJHsuNSArIHlwfWAgfSxcbiAgJ+KVqyc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGAke1NoYXBlcy5MRUZUX1RPX1JJR0hUfSBNJHsuNSAtIHhwfSwwIEwkey41IC0geHB9LDEgTSR7LjUgKyB4cH0sMCBMJHsuNSArIHhwfSwxYCB9LFxuICAn4pWsJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0wLCR7LjUgKyB5cH0gTCR7LjUgLSB4cH0sJHsuNSArIHlwfSBMJHsuNSAtIHhwfSwxIE0xLCR7LjUgKyB5cH0gTCR7LjUgKyB4cH0sJHsuNSArIHlwfSBMJHsuNSArIHhwfSwxIE0wLCR7LjUgLSB5cH0gTCR7LjUgLSB4cH0sJHsuNSAtIHlwfSBMJHsuNSAtIHhwfSwwIE0xLCR7LjUgLSB5cH0gTCR7LjUgKyB4cH0sJHsuNSAtIHlwfSBMJHsuNSArIHhwfSwwYCB9LFxuXG4gIC8vIERpYWdvbmFsXG4gICfilbEnOiB7IFtTdHlsZS5OT1JNQUxdOiAnTTEsMCBMMCwxJyB9LFxuICAn4pWyJzogeyBbU3R5bGUuTk9STUFMXTogJ00wLDAgTDEsMScgfSxcbiAgJ+KVsyc6IHsgW1N0eWxlLk5PUk1BTF06ICdNMSwwIEwwLDEgTTAsMCBMMSwxJyB9LFxuXG4gIC8vIE1peGVkIHdlaWdodFxuICAn4pW8JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19MRUZULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX1JJR0hUIH0sXG4gICfilb0nOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1RPUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fQk9UVE9NIH0sXG4gICfilb4nOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fTEVGVCB9LFxuICAn4pW/JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX1RPUCB9LFxuICAn4pSNJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX1JJR0hUIH0sXG4gICfilI4nOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fQk9UVE9NIH0sXG4gICfilJEnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX0JPVFRPTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fTEVGVCB9LFxuICAn4pSSJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19MRUZULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0JPVFRPTSB9LFxuICAn4pSVJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19UT1AsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX1JJR0hUIH0sXG4gICfilJYnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fVE9QIH0sXG4gICfilJknOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1RPUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fTEVGVCB9LFxuICAn4pSaJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19MRUZULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX1RPUCB9LFxuICAn4pSdJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlRPUF9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX1JJR0hUIH0sXG4gICfilJ4nOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuUklHSFRfVE9fQk9UVE9NLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fVE9QIH0sXG4gICfilJ8nOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVE9QX1RPX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fQk9UVE9NIH0sXG4gICfilKAnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5UT1BfVE9fQk9UVE9NIH0sXG4gICfilKEnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX0JPVFRPTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5UT1BfVE9fUklHSFQgfSxcbiAgJ+KUoic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fVE9QLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLlJJR0hUX1RPX0JPVFRPTSB9LFxuICAn4pSlJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlRPUF9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0xFRlQgfSxcbiAgJ+KUpic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5MRUZUX1RPX0JPVFRPTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19UT1AgfSxcbiAgJ+KUpyc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UT1BfVE9fTEVGVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19CT1RUT00gfSxcbiAgJ+KUqCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fTEVGVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLlRPUF9UT19CT1RUT00gfSxcbiAgJ+KUqSc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fQk9UVE9NLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLlRPUF9UT19MRUZUIH0sXG4gICfilKonOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1RPUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5MRUZUX1RPX0JPVFRPTSB9LFxuICAn4pStJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlJJR0hUX1RPX0JPVFRPTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0xFRlQgfSxcbiAgJ+KUric6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5MRUZUX1RPX0JPVFRPTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19SSUdIVCB9LFxuICAn4pSvJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTEVGVF9UT19SSUdIVCB9LFxuICAn4pSwJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLkxFRlRfVE9fUklHSFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0JPVFRPTSB9LFxuICAn4pSxJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTEVGVF9UT19CT1RUT00gfSxcbiAgJ+KUsic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fTEVGVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLlJJR0hUX1RPX0JPVFRPTSB9LFxuICAn4pS1JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlRPUF9UT19SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0xFRlQgfSxcbiAgJ+KUtic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UT1BfVE9fTEVGVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19SSUdIVCB9LFxuICAn4pS3JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19UT1AsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTEVGVF9UT19SSUdIVCB9LFxuICAn4pS4JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLkxFRlRfVE9fUklHSFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX1RPUCB9LFxuICAn4pS5JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuVE9QX1RPX0xFRlQgfSxcbiAgJ+KUuic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fTEVGVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLlRPUF9UT19SSUdIVCB9LFxuICAn4pS9JzogeyBbU3R5bGUuTk9STUFMXTogYCR7U2hhcGVzLlRPUF9UT19CT1RUT019ICR7U2hhcGVzLk1JRERMRV9UT19SSUdIVH1gLCAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0xFRlQgfSxcbiAgJ+KUvic6IHsgW1N0eWxlLk5PUk1BTF06IGAke1NoYXBlcy5UT1BfVE9fQk9UVE9NfSAke1NoYXBlcy5NSURETEVfVE9fTEVGVH1gLCAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19SSUdIVCB9LFxuICAn4pS/JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlRPUF9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTEVGVF9UT19SSUdIVCB9LFxuICAn4pWAJzogeyBbU3R5bGUuTk9STUFMXTogYCR7U2hhcGVzLkxFRlRfVE9fUklHSFR9ICR7U2hhcGVzLk1JRERMRV9UT19CT1RUT019YCwgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX1RPUCB9LFxuICAn4pWBJzogeyBbU3R5bGUuTk9STUFMXTogYCR7U2hhcGVzLk1JRERMRV9UT19UT1B9ICR7U2hhcGVzLkxFRlRfVE9fUklHSFR9YCwgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0JPVFRPTSB9LFxuICAn4pWCJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLkxFRlRfVE9fUklHSFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuVE9QX1RPX0JPVFRPTSB9LFxuICAn4pWDJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlJJR0hUX1RPX0JPVFRPTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuVE9QX1RPX0xFRlQgfSxcbiAgJ+KVhCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5MRUZUX1RPX0JPVFRPTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLlRPUF9UT19SSUdIVCB9LFxuICAn4pWFJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlRPUF9UT19SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTEVGVF9UT19CT1RUT00gfSxcbiAgJ+KVhic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UT1BfVE9fTEVGVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLlJJR0hUX1RPX0JPVFRPTSB9LFxuICAn4pWHJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBgJHtTaGFwZXMuTUlERExFX1RPX1RPUH0gJHtTaGFwZXMuTEVGVF9UT19SSUdIVH1gIH0sXG4gICfilYgnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1RPUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IGAke1NoYXBlcy5MRUZUX1RPX1JJR0hUfSAke1NoYXBlcy5NSURETEVfVE9fQk9UVE9NfWAgfSxcbiAgJ+KViSc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fUklHSFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogYCR7U2hhcGVzLlRPUF9UT19CT1RUT019ICR7U2hhcGVzLk1JRERMRV9UT19MRUZUfWAgfSxcbiAgJ+KViic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fTEVGVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogYCR7U2hhcGVzLlRPUF9UT19CT1RUT019ICR7U2hhcGVzLk1JRERMRV9UT19SSUdIVH1gIH0sXG5cbiAgLy8gRGFzaGVkXG4gICfilYwnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVFdPX0RBU0hFU19IT1JJWk9OVEFMIH0sXG4gICfilY0nOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuVFdPX0RBU0hFU19IT1JJWk9OVEFMIH0sXG4gICfilIQnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVEhSRUVfREFTSEVTX0hPUklaT05UQUwgfSxcbiAgJ+KUhSc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5USFJFRV9EQVNIRVNfSE9SSVpPTlRBTCB9LFxuICAn4pSIJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLkZPVVJfREFTSEVTX0hPUklaT05UQUwgfSxcbiAgJ+KUiSc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5GT1VSX0RBU0hFU19IT1JJWk9OVEFMIH0sXG4gICfilY4nOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVFdPX0RBU0hFU19WRVJUSUNBTCB9LFxuICAn4pWPJzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLlRXT19EQVNIRVNfVkVSVElDQUwgfSxcbiAgJ+KUhic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5USFJFRV9EQVNIRVNfVkVSVElDQUwgIH0sXG4gICfilIcnOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuVEhSRUVfREFTSEVTX1ZFUlRJQ0FMIH0sXG4gICfilIonOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuRk9VUl9EQVNIRVNfVkVSVElDQUwgfSxcbiAgJ+KUiyc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5GT1VSX0RBU0hFU19WRVJUSUNBTCB9LFxuXG4gIC8vIEN1cnZlZFxuICAn4pWtJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0uNSwxIEwuNSwkey41ICsgKHlwIC8gLjE1ICogLjUpfSBDLjUsJHsuNSArICh5cCAvIC4xNSAqIC41KX0sLjUsLjUsMSwuNWAgfSxcbiAgJ+KVric6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNLjUsMSBMLjUsJHsuNSArICh5cCAvIC4xNSAqIC41KX0gQy41LCR7LjUgKyAoeXAgLyAuMTUgKiAuNSl9LC41LC41LDAsLjVgIH0sXG4gICfila8nOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTS41LDAgTC41LCR7LjUgLSAoeXAgLyAuMTUgKiAuNSl9IEMuNSwkey41IC0gKHlwIC8gLjE1ICogLjUpfSwuNSwuNSwwLC41YCB9LFxuICAn4pWwJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0uNSwwIEwuNSwkey41IC0gKHlwIC8gLjE1ICogLjUpfSBDLjUsJHsuNSAtICh5cCAvIC4xNSAqIC41KX0sLjUsLjUsMSwuNWAgfVxufTtcblxuaW50ZXJmYWNlIElWZWN0b3JTaGFwZSB7XG4gIGQ6IHN0cmluZztcbiAgdHlwZTogVmVjdG9yVHlwZTtcbiAgbGVmdFBhZGRpbmc/OiBudW1iZXI7XG4gIHJpZ2h0UGFkZGluZz86IG51bWJlcjtcbn1cblxuY29uc3QgZW51bSBWZWN0b3JUeXBlIHtcbiAgRklMTCxcbiAgU1RST0tFXG59XG5cbi8qKlxuICogVGhpcyBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIHByaW1hcmlseSB1c2VkIGJveCBkcmF3aW5nIGNoYXJhY3RlcnMgYXMgdmVjdG9yIHNoYXBlcy4gVGhlXG4gKiByZWFzb24gdGhlc2UgY2hhcmFjdGVycyBhcmUgZGVmaW5lZCBzcGVjaWFsbHkgaXMgdG8gYXZvaWQgY29tbW9uIHByb2JsZW1zIGlmIGEgdXNlcidzIGZvbnQgaGFzXG4gKiBub3QgYmVlbiBwYXRjaGVkIHdpdGggcG93ZXJsaW5lIGNoYXJhY3RlcnMgYW5kIGFsc28gdG8gZ2V0IHBpeGVsIHBlcmZlY3QgcmVuZGVyaW5nIGFzIHJlbmRlcmluZ1xuICogaXNzdWVzIGNhbiBvY2N1ciBhcm91bmQgQUEvU1BBQS5cbiAqXG4gKiBUaGUgbGluZSB2YXJpYW50cyBkcmF3IGJleW9uZCB0aGUgY2VsbCBhbmQgZ2V0IGNsaXBwZWQgdG8gZW5zdXJlIHRoZSBlbmQgb2YgdGhlIGxpbmUgaXMgbm90XG4gKiB2aXNpYmxlLlxuICpcbiAqIE9yaWdpbmFsIHN5bWJvbHMgZGVmaW5lZCBpbiBodHRwczovL2dpdGh1Yi5jb20vcG93ZXJsaW5lL2ZvbnRwYXRjaGVyXG4gKi9cbmV4cG9ydCBjb25zdCBwb3dlcmxpbmVEZWZpbml0aW9uczogeyBbaW5kZXg6IHN0cmluZ106IElWZWN0b3JTaGFwZSB9ID0ge1xuICAvLyBSaWdodCB0cmlhbmdsZSBzb2xpZFxuICAnXFx1e0UwQjB9JzogeyBkOiAnTTAsMCBMMSwuNSBMMCwxJywgdHlwZTogVmVjdG9yVHlwZS5GSUxMLCByaWdodFBhZGRpbmc6IDIgfSxcbiAgLy8gUmlnaHQgdHJpYW5nbGUgbGluZVxuICAnXFx1e0UwQjF9JzogeyBkOiAnTS0xLC0uNSBMMSwuNSBMLTEsMS41JywgdHlwZTogVmVjdG9yVHlwZS5TVFJPS0UsIGxlZnRQYWRkaW5nOiAxLCByaWdodFBhZGRpbmc6IDEgfSxcbiAgLy8gTGVmdCB0cmlhbmdsZSBzb2xpZFxuICAnXFx1e0UwQjJ9JzogeyBkOiAnTTEsMCBMMCwuNSBMMSwxJywgdHlwZTogVmVjdG9yVHlwZS5GSUxMLCBsZWZ0UGFkZGluZzogMiB9LFxuICAvLyBMZWZ0IHRyaWFuZ2xlIGxpbmVcbiAgJ1xcdXtFMEIzfSc6IHsgZDogJ00yLC0uNSBMMCwuNSBMMiwxLjUnLCB0eXBlOiBWZWN0b3JUeXBlLlNUUk9LRSwgbGVmdFBhZGRpbmc6IDEsIHJpZ2h0UGFkZGluZzogMSB9LFxuICAvLyBSaWdodCBzZW1pLWNpcmNsZSBzb2xpZFxuICAnXFx1e0UwQjR9JzogeyBkOiAnTTAsMCBMMCwxIEMwLjU1MiwxLDEsMC43NzYsMSwuNSBDMSwwLjIyNCwwLjU1MiwwLDAsMCcsIHR5cGU6IFZlY3RvclR5cGUuRklMTCwgcmlnaHRQYWRkaW5nOiAxIH0sXG4gIC8vIFJpZ2h0IHNlbWktY2lyY2xlIGxpbmVcbiAgJ1xcdXtFMEI1fSc6IHsgZDogJ00uMiwxIEMuNDIyLDEsLjgsLjgyNiwuNzgsLjUgQy44LC4xNzQsMC40MjIsMCwuMiwwJywgdHlwZTogVmVjdG9yVHlwZS5TVFJPS0UsIHJpZ2h0UGFkZGluZzogMSB9LFxuICAvLyBMZWZ0IHNlbWktY2lyY2xlIHNvbGlkXG4gICdcXHV7RTBCNn0nOiB7IGQ6ICdNMSwwIEwxLDEgQzAuNDQ4LDEsMCwwLjc3NiwwLC41IEMwLDAuMjI0LDAuNDQ4LDAsMSwwJywgdHlwZTogVmVjdG9yVHlwZS5GSUxMLCBsZWZ0UGFkZGluZzogMSB9LFxuICAvLyBMZWZ0IHNlbWktY2lyY2xlIGxpbmVcbiAgJ1xcdXtFMEI3fSc6IHsgZDogJ00uOCwxIEMwLjU3OCwxLDAuMiwuODI2LC4yMiwuNSBDMC4yLDAuMTc0LDAuNTc4LDAsMC44LDAnLCB0eXBlOiBWZWN0b3JUeXBlLlNUUk9LRSwgbGVmdFBhZGRpbmc6IDEgfSxcbiAgLy8gTG93ZXIgbGVmdCB0cmlhbmdsZVxuICAnXFx1e0UwQjh9JzogeyBkOiAnTS0uNSwtLjUgTDEuNSwxLjUgTC0uNSwxLjUnLCB0eXBlOiBWZWN0b3JUeXBlLkZJTEwgfSxcbiAgLy8gQmFja3NsYXNoIHNlcGFyYXRvclxuICAnXFx1e0UwQjl9JzogeyBkOiAnTS0uNSwtLjUgTDEuNSwxLjUnLCB0eXBlOiBWZWN0b3JUeXBlLlNUUk9LRSwgbGVmdFBhZGRpbmc6IDEsIHJpZ2h0UGFkZGluZzogMSB9LFxuICAvLyBMb3dlciByaWdodCB0cmlhbmdsZVxuICAnXFx1e0UwQkF9JzogeyBkOiAnTTEuNSwtLjUgTC0uNSwxLjUgTDEuNSwxLjUnLCB0eXBlOiBWZWN0b3JUeXBlLkZJTEwgfSxcbiAgLy8gVXBwZXIgbGVmdCB0cmlhbmdsZVxuICAnXFx1e0UwQkN9JzogeyBkOiAnTTEuNSwtLjUgTC0uNSwxLjUgTC0uNSwtLjUnLCB0eXBlOiBWZWN0b3JUeXBlLkZJTEwgfSxcbiAgLy8gRm9yd2FyZCBzbGFzaCBzZXBhcmF0b3JcbiAgJ1xcdXtFMEJEfSc6IHsgZDogJ00xLjUsLS41IEwtLjUsMS41JywgdHlwZTogVmVjdG9yVHlwZS5TVFJPS0UsIGxlZnRQYWRkaW5nOiAxLCByaWdodFBhZGRpbmc6IDEgfSxcbiAgLy8gVXBwZXIgcmlnaHQgdHJpYW5nbGVcbiAgJ1xcdXtFMEJFfSc6IHsgZDogJ00tLjUsLS41IEwxLjUsMS41IEwxLjUsLS41JywgdHlwZTogVmVjdG9yVHlwZS5GSUxMIH1cbn07XG4vLyBGb3J3YXJkIHNsYXNoIHNlcGFyYXRvciByZWR1bmRhbnRcbnBvd2VybGluZURlZmluaXRpb25zWydcXHV7RTBCQn0nXSA9IHBvd2VybGluZURlZmluaXRpb25zWydcXHV7RTBCRH0nXTtcbi8vIEJhY2tzbGFzaCBzZXBhcmF0b3IgcmVkdW5kYW50XG5wb3dlcmxpbmVEZWZpbml0aW9uc1snXFx1e0UwQkZ9J10gPSBwb3dlcmxpbmVEZWZpbml0aW9uc1snXFx1e0UwQjl9J107XG5cbi8qKlxuICogVHJ5IGRyYXdpbmcgYSBjdXN0b20gYmxvY2sgZWxlbWVudCBvciBib3ggZHJhd2luZyBjaGFyYWN0ZXIsIHJldHVybmluZyB3aGV0aGVyIGl0IHdhc1xuICogc3VjY2Vzc2Z1bGx5IGRyYXduLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ5RHJhd0N1c3RvbUNoYXIoXG4gIGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELFxuICBjOiBzdHJpbmcsXG4gIHhPZmZzZXQ6IG51bWJlcixcbiAgeU9mZnNldDogbnVtYmVyLFxuICBkZXZpY2VDZWxsV2lkdGg6IG51bWJlcixcbiAgZGV2aWNlQ2VsbEhlaWdodDogbnVtYmVyLFxuICBmb250U2l6ZTogbnVtYmVyLFxuICBkZXZpY2VQaXhlbFJhdGlvOiBudW1iZXJcbik6IGJvb2xlYW4ge1xuICBjb25zdCBibG9ja0VsZW1lbnREZWZpbml0aW9uID0gYmxvY2tFbGVtZW50RGVmaW5pdGlvbnNbY107XG4gIGlmIChibG9ja0VsZW1lbnREZWZpbml0aW9uKSB7XG4gICAgZHJhd0Jsb2NrRWxlbWVudENoYXIoY3R4LCBibG9ja0VsZW1lbnREZWZpbml0aW9uLCB4T2Zmc2V0LCB5T2Zmc2V0LCBkZXZpY2VDZWxsV2lkdGgsIGRldmljZUNlbGxIZWlnaHQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgcGF0dGVybkRlZmluaXRpb24gPSBwYXR0ZXJuQ2hhcmFjdGVyRGVmaW5pdGlvbnNbY107XG4gIGlmIChwYXR0ZXJuRGVmaW5pdGlvbikge1xuICAgIGRyYXdQYXR0ZXJuQ2hhcihjdHgsIHBhdHRlcm5EZWZpbml0aW9uLCB4T2Zmc2V0LCB5T2Zmc2V0LCBkZXZpY2VDZWxsV2lkdGgsIGRldmljZUNlbGxIZWlnaHQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgYm94RHJhd2luZ0RlZmluaXRpb24gPSBib3hEcmF3aW5nRGVmaW5pdGlvbnNbY107XG4gIGlmIChib3hEcmF3aW5nRGVmaW5pdGlvbikge1xuICAgIGRyYXdCb3hEcmF3aW5nQ2hhcihjdHgsIGJveERyYXdpbmdEZWZpbml0aW9uLCB4T2Zmc2V0LCB5T2Zmc2V0LCBkZXZpY2VDZWxsV2lkdGgsIGRldmljZUNlbGxIZWlnaHQsIGRldmljZVBpeGVsUmF0aW8pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgcG93ZXJsaW5lRGVmaW5pdGlvbiA9IHBvd2VybGluZURlZmluaXRpb25zW2NdO1xuICBpZiAocG93ZXJsaW5lRGVmaW5pdGlvbikge1xuICAgIGRyYXdQb3dlcmxpbmVDaGFyKGN0eCwgcG93ZXJsaW5lRGVmaW5pdGlvbiwgeE9mZnNldCwgeU9mZnNldCwgZGV2aWNlQ2VsbFdpZHRoLCBkZXZpY2VDZWxsSGVpZ2h0LCBmb250U2l6ZSwgZGV2aWNlUGl4ZWxSYXRpbyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGRyYXdCbG9ja0VsZW1lbnRDaGFyKFxuICBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgY2hhckRlZmluaXRpb246IElCbG9ja1ZlY3RvcltdLFxuICB4T2Zmc2V0OiBudW1iZXIsXG4gIHlPZmZzZXQ6IG51bWJlcixcbiAgZGV2aWNlQ2VsbFdpZHRoOiBudW1iZXIsXG4gIGRldmljZUNlbGxIZWlnaHQ6IG51bWJlclxuKTogdm9pZCB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhckRlZmluaXRpb24ubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBib3ggPSBjaGFyRGVmaW5pdGlvbltpXTtcbiAgICBjb25zdCB4RWlnaHRoID0gZGV2aWNlQ2VsbFdpZHRoIC8gODtcbiAgICBjb25zdCB5RWlnaHRoID0gZGV2aWNlQ2VsbEhlaWdodCAvIDg7XG4gICAgY3R4LmZpbGxSZWN0KFxuICAgICAgeE9mZnNldCArIGJveC54ICogeEVpZ2h0aCxcbiAgICAgIHlPZmZzZXQgKyBib3gueSAqIHlFaWdodGgsXG4gICAgICBib3gudyAqIHhFaWdodGgsXG4gICAgICBib3guaCAqIHlFaWdodGhcbiAgICApO1xuICB9XG59XG5cbmNvbnN0IGNhY2hlZFBhdHRlcm5zOiBNYXA8UGF0dGVybkRlZmluaXRpb24sIE1hcDwvKiBmaWxsU3R5bGUgKi9zdHJpbmcsIENhbnZhc1BhdHRlcm4+PiA9IG5ldyBNYXAoKTtcblxuZnVuY3Rpb24gZHJhd1BhdHRlcm5DaGFyKFxuICBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgY2hhckRlZmluaXRpb246IG51bWJlcltdW10sXG4gIHhPZmZzZXQ6IG51bWJlcixcbiAgeU9mZnNldDogbnVtYmVyLFxuICBkZXZpY2VDZWxsV2lkdGg6IG51bWJlcixcbiAgZGV2aWNlQ2VsbEhlaWdodDogbnVtYmVyXG4pOiB2b2lkIHtcbiAgbGV0IHBhdHRlcm5TZXQgPSBjYWNoZWRQYXR0ZXJucy5nZXQoY2hhckRlZmluaXRpb24pO1xuICBpZiAoIXBhdHRlcm5TZXQpIHtcbiAgICBwYXR0ZXJuU2V0ID0gbmV3IE1hcCgpO1xuICAgIGNhY2hlZFBhdHRlcm5zLnNldChjaGFyRGVmaW5pdGlvbiwgcGF0dGVyblNldCk7XG4gIH1cbiAgY29uc3QgZmlsbFN0eWxlID0gY3R4LmZpbGxTdHlsZTtcbiAgaWYgKHR5cGVvZiBmaWxsU3R5bGUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGZpbGxTdHlsZSB0eXBlIFwiJHtmaWxsU3R5bGV9XCJgKTtcbiAgfVxuICBsZXQgcGF0dGVybiA9IHBhdHRlcm5TZXQuZ2V0KGZpbGxTdHlsZSk7XG4gIGlmICghcGF0dGVybikge1xuICAgIGNvbnN0IHdpZHRoID0gY2hhckRlZmluaXRpb25bMF0ubGVuZ3RoO1xuICAgIGNvbnN0IGhlaWdodCA9IGNoYXJEZWZpbml0aW9uLmxlbmd0aDtcbiAgICBjb25zdCB0bXBDYW52YXMgPSBjdHguY2FudmFzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgdG1wQ2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgdG1wQ2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICBjb25zdCB0bXBDdHggPSB0aHJvd0lmRmFsc3kodG1wQ2FudmFzLmdldENvbnRleHQoJzJkJykpO1xuICAgIGNvbnN0IGltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEod2lkdGgsIGhlaWdodCk7XG5cbiAgICAvLyBFeHRyYWN0IHJnYmEgZnJvbSBmaWxsU3R5bGVcbiAgICBsZXQgcjogbnVtYmVyO1xuICAgIGxldCBnOiBudW1iZXI7XG4gICAgbGV0IGI6IG51bWJlcjtcbiAgICBsZXQgYTogbnVtYmVyO1xuICAgIGlmIChmaWxsU3R5bGUuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICByID0gcGFyc2VJbnQoZmlsbFN0eWxlLnNsaWNlKDEsIDMpLCAxNik7XG4gICAgICBnID0gcGFyc2VJbnQoZmlsbFN0eWxlLnNsaWNlKDMsIDUpLCAxNik7XG4gICAgICBiID0gcGFyc2VJbnQoZmlsbFN0eWxlLnNsaWNlKDUsIDcpLCAxNik7XG4gICAgICBhID0gZmlsbFN0eWxlLmxlbmd0aCA+IDcgJiYgcGFyc2VJbnQoZmlsbFN0eWxlLnNsaWNlKDcsIDkpLCAxNikgfHwgMTtcbiAgICB9IGVsc2UgaWYgKGZpbGxTdHlsZS5zdGFydHNXaXRoKCdyZ2JhJykpIHtcbiAgICAgIChbciwgZywgYiwgYV0gPSBmaWxsU3R5bGUuc3Vic3RyaW5nKDUsIGZpbGxTdHlsZS5sZW5ndGggLSAxKS5zcGxpdCgnLCcpLm1hcChlID0+IHBhcnNlRmxvYXQoZSkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGZpbGxTdHlsZSBjb2xvciBmb3JtYXQgXCIke2ZpbGxTdHlsZX1cIiB3aGVuIGRyYXdpbmcgcGF0dGVybiBnbHlwaGApO1xuICAgIH1cblxuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICBpbWFnZURhdGEuZGF0YVsoeSAqIHdpZHRoICsgeCkgKiA0ICAgIF0gPSByO1xuICAgICAgICBpbWFnZURhdGEuZGF0YVsoeSAqIHdpZHRoICsgeCkgKiA0ICsgMV0gPSBnO1xuICAgICAgICBpbWFnZURhdGEuZGF0YVsoeSAqIHdpZHRoICsgeCkgKiA0ICsgMl0gPSBiO1xuICAgICAgICBpbWFnZURhdGEuZGF0YVsoeSAqIHdpZHRoICsgeCkgKiA0ICsgM10gPSBjaGFyRGVmaW5pdGlvblt5XVt4XSAqIChhICogMjU1KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdG1wQ3R4LnB1dEltYWdlRGF0YShpbWFnZURhdGEsIDAsIDApO1xuICAgIHBhdHRlcm4gPSB0aHJvd0lmRmFsc3koY3R4LmNyZWF0ZVBhdHRlcm4odG1wQ2FudmFzLCBudWxsKSk7XG4gICAgcGF0dGVyblNldC5zZXQoZmlsbFN0eWxlLCBwYXR0ZXJuKTtcbiAgfVxuICBjdHguZmlsbFN0eWxlID0gcGF0dGVybjtcbiAgY3R4LmZpbGxSZWN0KHhPZmZzZXQsIHlPZmZzZXQsIGRldmljZUNlbGxXaWR0aCwgZGV2aWNlQ2VsbEhlaWdodCk7XG59XG5cbi8qKlxuICogRHJhd3MgdGhlIGZvbGxvd2luZyBib3ggZHJhd2luZyBjaGFyYWN0ZXJzIGJ5IG1hcHBpbmcgYSBzdWJzZXQgb2YgU1ZHIGQgYXR0cmlidXRlIGluc3RydWN0aW9ucyB0b1xuICogY2FudmFzIGRyYXcgY2FsbHMuXG4gKlxuICogQm94IHN0eWxlczogICAgICAg4pSO4pSw4pSS4pSN4pSv4pSR4pWT4pWl4pWW4pWS4pWk4pWVIOKUj+KUs+KUk+KUjOKUsuKUk+KUjOKUrOKUkOKUj+KUseKUkFxuICog4pSM4pSA4pSs4pSA4pSQIOKUj+KUgeKUs+KUgeKUkyDilZTilZDilabilZDilZcg4pSg4pWC4pSo4pSd4pS/4pSl4pWf4pWr4pWi4pWe4pWq4pWhIOKUoeKVh+KUqeKUnOKViuKUq+KUouKViOKUquKUo+KVieKUpFxuICog4pSCIOKUgiDilIIg4pSDIOKUgyDilIMg4pWRIOKVkSDilZEg4pSW4pS44pSa4pSV4pS34pSZ4pWZ4pWo4pWc4pWY4pWn4pWbIOKUlOKUtOKUmOKUlOKUuuKUm+KUl+KUu+KUm+KUl+KUueKUmFxuICog4pSc4pSA4pS84pSA4pSkIOKUo+KUgeKVi+KUgeKUqyDilaDilZDilazilZDilaMg4pSP4pSx4pSQ4pSM4pSy4pST4pSM4pSs4pSQ4pSM4pSs4pSQIOKUj+KUs+KUk+KUjOKUruKUk+KUjOKUrOKUkOKUj+KUreKUkFxuICog4pSCIOKUgiDilIIg4pSDIOKUgyDilIMg4pWRIOKVkSDilZEg4pSh4pWD4pSk4pSc4pWE4pSp4pSc4pWG4pSq4pSi4pWF4pSkIOKUnuKVgOKUpuKUnOKUvuKUq+KUn+KVgeKUp+KUo+KUveKUpFxuICog4pSU4pSA4pS04pSA4pSYIOKUl+KUgeKUu+KUgeKUmyDilZrilZDilanilZDilZ0g4pSU4pS04pSY4pSU4pS04pSY4pSU4pS64pSb4pSX4pS54pSYIOKUlOKUtOKUmOKUlOKUtuKUm+KUl+KUu+KUm+KUl+KUteKUmFxuICpcbiAqIE90aGVyOlxuICog4pWt4pSA4pWuIOKVsiDilbEg4pW34pW74pWO4pWP4pSG4pSH4pSK4pSLIOKVuuKVvuKVtCDilYzilYzilYwg4pSE4pSE4pSEIOKUiOKUiOKUiFxuICog4pSCIOKUgiAg4pWzICDilb3ilb/ilY7ilY/ilIbilIfilIrilIsg4pW24pW84pW4IOKVjeKVjeKVjSDilIXilIXilIUg4pSJ4pSJ4pSJXG4gKiDilbDilIDila8g4pWxIOKVsiDilbnilbXilY7ilY/ilIbilIfilIrilItcbiAqXG4gKiBBbGwgYm94IGRyYXdpbmcgY2hhcmFjdGVyczpcbiAqIOKUgCDilIEg4pSCIOKUgyDilIQg4pSFIOKUhiDilIcg4pSIIOKUiSDilIog4pSLIOKUjCDilI0g4pSOIOKUj1xuICog4pSQIOKUkSDilJIg4pSTIOKUlCDilJUg4pSWIOKUlyDilJgg4pSZIOKUmiDilJsg4pScIOKUnSDilJ4g4pSfXG4gKiDilKAg4pShIOKUoiDilKMg4pSkIOKUpSDilKYg4pSnIOKUqCDilKkg4pSqIOKUqyDilKwg4pStIOKUriDilK9cbiAqIOKUsCDilLEg4pSyIOKUsyDilLQg4pS1IOKUtiDilLcg4pS4IOKUuSDilLog4pS7IOKUvCDilL0g4pS+IOKUv1xuICog4pWAIOKVgSDilYIg4pWDIOKVhCDilYUg4pWGIOKVhyDilYgg4pWJIOKViiDilYsg4pWMIOKVjSDilY4g4pWPXG4gKiDilZAg4pWRIOKVkiDilZMg4pWUIOKVlSDilZYg4pWXIOKVmCDilZkg4pWaIOKVmyDilZwg4pWdIOKVniDilZ9cbiAqIOKVoCDilaEg4pWiIOKVoyDilaQg4pWlIOKVpiDilacg4pWoIOKVqSDilaog4pWrIOKVrCDila0g4pWuIOKVr1xuICog4pWwIOKVsSDilbIg4pWzIOKVtCDilbUg4pW2IOKVtyDilbgg4pW5IOKVuiDilbsg4pW8IOKVvSDilb4g4pW/XG4gKlxuICogLS0tXG4gKlxuICogQm94IGRyYXdpbmcgYWxpZ25tZW50IHRlc3RzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKWiFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKWiVxuICogICDilZTilZDilZDilabilZDilZDilZcgIOKUjOKUgOKUgOKUrOKUgOKUgOKUkCAg4pWt4pSA4pSA4pSs4pSA4pSA4pWuICDila3ilIDilIDilKzilIDilIDila4gIOKUj+KUgeKUgeKUs+KUgeKUgeKUkyAg4pSO4pSS4pSP4pSRICAg4pW3ICDilbsg4pSP4pSv4pSTIOKUjOKUsOKUkCAgICDiloog4pWx4pWy4pWx4pWy4pWz4pWz4pWzXG4gKiAgIOKVkeKUjOKUgOKVqOKUgOKUkOKVkSAg4pSC4pWU4pWQ4pWn4pWQ4pWX4pSCICDilILilZLilZDilarilZDilZXilIIgIOKUguKVk+KUgOKVgeKUgOKVluKUgiAg4pSD4pSM4pSA4pWC4pSA4pSQ4pSDICDilJfilYPilYTilJkgIOKVtuKUvOKVtOKVuuKVi+KVuOKUoOKUvOKUqCDilJ3ilYvilKUgICAg4paLIOKVsuKVseKVsuKVseKVs+KVs+KVs1xuICogICDilZHilILilbIg4pWx4pSC4pWRICDilILilZEgICDilZHilIIgIOKUguKUgiDilIIg4pSC4pSCICDilILilZEg4pSDIOKVkeKUgiAg4pSD4pSCIOKVvyDilILilIMgIOKUjeKVheKVhuKUkyAgIOKVtSAg4pW5IOKUl+KUt+KUmyDilJTilLjilJggICAg4paMIOKVseKVsuKVseKVsuKVs+KVs+KVs1xuICogICDilaDilaEg4pWzIOKVnuKVoyAg4pSc4pWiICAg4pWf4pSkICDilJzilLzilIDilLzilIDilLzilKQgIOKUnOKVq+KUgOKVguKUgOKVq+KUpCAg4pSj4pS/4pW+4pS84pW84pS/4pSrICDilJXilJvilJbilJogICAgIOKUjOKUhOKUhOKUkCDilY4g4pSP4pSF4pSF4pSTIOKUiyDilo0g4pWy4pWx4pWy4pWx4pWz4pWz4pWzXG4gKiAgIOKVkeKUguKVsSDilbLilILilZEgIOKUguKVkSAgIOKVkeKUgiAg4pSC4pSCIOKUgiDilILilIIgIOKUguKVkSDilIMg4pWR4pSCICDilIPilIIg4pW9IOKUguKUgyAg4paR4paR4paS4paS4paT4paT4paI4paIIOKUiiAg4pSGIOKVjiDilY8gIOKUhyDilIsg4paOXG4gKiAgIOKVkeKUlOKUgOKVpeKUgOKUmOKVkSAg4pSC4pWa4pWQ4pWk4pWQ4pWd4pSCICDilILilZjilZDilarilZDilZvilIIgIOKUguKVmeKUgOKVgOKUgOKVnOKUgiAg4pSD4pSU4pSA4pWC4pSA4pSY4pSDICDilpHilpHilpLilpLilpPilpPilojilogg4pSKICDilIYg4pWOIOKVjyAg4pSHIOKUiyDilo9cbiAqICAg4pWa4pWQ4pWQ4pWp4pWQ4pWQ4pWdICDilJTilIDilIDilLTilIDilIDilJggIOKVsOKUgOKUgOKUtOKUgOKUgOKVryAg4pWw4pSA4pSA4pS04pSA4pSA4pWvICDilJfilIHilIHilLvilIHilIHilJsgICAgICAgICAgIOKUlOKVjOKVjOKUmCDilY4g4pSX4pWN4pWN4pSbIOKUiyAg4paB4paC4paD4paE4paF4paG4paH4paIXG4gKlxuICogU291cmNlOiBodHRwczovL3d3dy53My5vcmcvMjAwMS8wNi91dGYtOC10ZXN0L1VURi04LWRlbW8uaHRtbFxuICovXG5mdW5jdGlvbiBkcmF3Qm94RHJhd2luZ0NoYXIoXG4gIGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELFxuICBjaGFyRGVmaW5pdGlvbjogeyBbZm9udFdlaWdodDogbnVtYmVyXTogc3RyaW5nIHwgKCh4cDogbnVtYmVyLCB5cDogbnVtYmVyKSA9PiBzdHJpbmcpIH0sXG4gIHhPZmZzZXQ6IG51bWJlcixcbiAgeU9mZnNldDogbnVtYmVyLFxuICBkZXZpY2VDZWxsV2lkdGg6IG51bWJlcixcbiAgZGV2aWNlQ2VsbEhlaWdodDogbnVtYmVyLFxuICBkZXZpY2VQaXhlbFJhdGlvOiBudW1iZXJcbik6IHZvaWQge1xuICBjdHguc3Ryb2tlU3R5bGUgPSBjdHguZmlsbFN0eWxlO1xuICBmb3IgKGNvbnN0IFtmb250V2VpZ2h0LCBpbnN0cnVjdGlvbnNdIG9mIE9iamVjdC5lbnRyaWVzKGNoYXJEZWZpbml0aW9uKSkge1xuICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICBjdHgubGluZVdpZHRoID0gZGV2aWNlUGl4ZWxSYXRpbyAqIE51bWJlci5wYXJzZUludChmb250V2VpZ2h0KTtcbiAgICBsZXQgYWN0dWFsSW5zdHJ1Y3Rpb25zOiBzdHJpbmc7XG4gICAgaWYgKHR5cGVvZiBpbnN0cnVjdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHhwID0gLjE1O1xuICAgICAgY29uc3QgeXAgPSAuMTUgLyBkZXZpY2VDZWxsSGVpZ2h0ICogZGV2aWNlQ2VsbFdpZHRoO1xuICAgICAgYWN0dWFsSW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zKHhwLCB5cCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdHVhbEluc3RydWN0aW9ucyA9IGluc3RydWN0aW9ucztcbiAgICB9XG4gICAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBhY3R1YWxJbnN0cnVjdGlvbnMuc3BsaXQoJyAnKSkge1xuICAgICAgY29uc3QgdHlwZSA9IGluc3RydWN0aW9uWzBdO1xuICAgICAgY29uc3QgZiA9IHN2Z1RvQ2FudmFzSW5zdHJ1Y3Rpb25NYXBbdHlwZV07XG4gICAgICBpZiAoIWYpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQ291bGQgbm90IGZpbmQgZHJhd2luZyBpbnN0cnVjdGlvbnMgZm9yIFwiJHt0eXBlfVwiYCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgYXJnczogc3RyaW5nW10gPSBpbnN0cnVjdGlvbi5zdWJzdHJpbmcoMSkuc3BsaXQoJywnKTtcbiAgICAgIGlmICghYXJnc1swXSB8fCAhYXJnc1sxXSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGYoY3R4LCB0cmFuc2xhdGVBcmdzKGFyZ3MsIGRldmljZUNlbGxXaWR0aCwgZGV2aWNlQ2VsbEhlaWdodCwgeE9mZnNldCwgeU9mZnNldCwgdHJ1ZSwgZGV2aWNlUGl4ZWxSYXRpbykpO1xuICAgIH1cbiAgICBjdHguc3Ryb2tlKCk7XG4gICAgY3R4LmNsb3NlUGF0aCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRyYXdQb3dlcmxpbmVDaGFyKFxuICBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgY2hhckRlZmluaXRpb246IElWZWN0b3JTaGFwZSxcbiAgeE9mZnNldDogbnVtYmVyLFxuICB5T2Zmc2V0OiBudW1iZXIsXG4gIGRldmljZUNlbGxXaWR0aDogbnVtYmVyLFxuICBkZXZpY2VDZWxsSGVpZ2h0OiBudW1iZXIsXG4gIGZvbnRTaXplOiBudW1iZXIsXG4gIGRldmljZVBpeGVsUmF0aW86IG51bWJlclxuKTogdm9pZCB7XG4gIC8vIENsaXAgdGhlIGNlbGwgdG8gbWFrZSBzdXJlIGRyYXdpbmcgZG9lc24ndCBvY2N1ciBiZXlvbmQgYm91bmRzXG4gIGNvbnN0IGNsaXBSZWdpb24gPSBuZXcgUGF0aDJEKCk7XG4gIGNsaXBSZWdpb24ucmVjdCh4T2Zmc2V0LCB5T2Zmc2V0LCBkZXZpY2VDZWxsV2lkdGgsIGRldmljZUNlbGxIZWlnaHQpO1xuICBjdHguY2xpcChjbGlwUmVnaW9uKTtcblxuICBjdHguYmVnaW5QYXRoKCk7XG4gIC8vIFNjYWxlIHRoZSBzdHJva2Ugd2l0aCBEUFIgYW5kIGZvbnQgc2l6ZVxuICBjb25zdCBjc3NMaW5lV2lkdGggPSBmb250U2l6ZSAvIDEyO1xuICBjdHgubGluZVdpZHRoID0gZGV2aWNlUGl4ZWxSYXRpbyAqIGNzc0xpbmVXaWR0aDtcbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBjaGFyRGVmaW5pdGlvbi5kLnNwbGl0KCcgJykpIHtcbiAgICBjb25zdCB0eXBlID0gaW5zdHJ1Y3Rpb25bMF07XG4gICAgY29uc3QgZiA9IHN2Z1RvQ2FudmFzSW5zdHJ1Y3Rpb25NYXBbdHlwZV07XG4gICAgaWYgKCFmKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBDb3VsZCBub3QgZmluZCBkcmF3aW5nIGluc3RydWN0aW9ucyBmb3IgXCIke3R5cGV9XCJgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBhcmdzOiBzdHJpbmdbXSA9IGluc3RydWN0aW9uLnN1YnN0cmluZygxKS5zcGxpdCgnLCcpO1xuICAgIGlmICghYXJnc1swXSB8fCAhYXJnc1sxXSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGYoY3R4LCB0cmFuc2xhdGVBcmdzKFxuICAgICAgYXJncyxcbiAgICAgIGRldmljZUNlbGxXaWR0aCxcbiAgICAgIGRldmljZUNlbGxIZWlnaHQsXG4gICAgICB4T2Zmc2V0LFxuICAgICAgeU9mZnNldCxcbiAgICAgIGZhbHNlLFxuICAgICAgZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgIChjaGFyRGVmaW5pdGlvbi5sZWZ0UGFkZGluZyA/PyAwKSAqIChjc3NMaW5lV2lkdGggLyAyKSxcbiAgICAgIChjaGFyRGVmaW5pdGlvbi5yaWdodFBhZGRpbmcgPz8gMCkgKiAoY3NzTGluZVdpZHRoIC8gMilcbiAgICApKTtcbiAgfVxuICBpZiAoY2hhckRlZmluaXRpb24udHlwZSA9PT0gVmVjdG9yVHlwZS5TVFJPS0UpIHtcbiAgICBjdHguc3Ryb2tlU3R5bGUgPSBjdHguZmlsbFN0eWxlO1xuICAgIGN0eC5zdHJva2UoKTtcbiAgfSBlbHNlIHtcbiAgICBjdHguZmlsbCgpO1xuICB9XG4gIGN0eC5jbG9zZVBhdGgoKTtcbn1cblxuZnVuY3Rpb24gY2xhbXAodmFsdWU6IG51bWJlciwgbWF4OiBudW1iZXIsIG1pbjogbnVtYmVyID0gMCk6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLm1heChNYXRoLm1pbih2YWx1ZSwgbWF4KSwgbWluKTtcbn1cblxuY29uc3Qgc3ZnVG9DYW52YXNJbnN0cnVjdGlvbk1hcDogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge1xuICAnQyc6IChjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgYXJnczogbnVtYmVyW10pID0+IGN0eC5iZXppZXJDdXJ2ZVRvKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0pLFxuICAnTCc6IChjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgYXJnczogbnVtYmVyW10pID0+IGN0eC5saW5lVG8oYXJnc1swXSwgYXJnc1sxXSksXG4gICdNJzogKGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELCBhcmdzOiBudW1iZXJbXSkgPT4gY3R4Lm1vdmVUbyhhcmdzWzBdLCBhcmdzWzFdKVxufTtcblxuZnVuY3Rpb24gdHJhbnNsYXRlQXJncyhhcmdzOiBzdHJpbmdbXSwgY2VsbFdpZHRoOiBudW1iZXIsIGNlbGxIZWlnaHQ6IG51bWJlciwgeE9mZnNldDogbnVtYmVyLCB5T2Zmc2V0OiBudW1iZXIsIGRvQ2xhbXA6IGJvb2xlYW4sIGRldmljZVBpeGVsUmF0aW86IG51bWJlciwgbGVmdFBhZGRpbmc6IG51bWJlciA9IDAsIHJpZ2h0UGFkZGluZzogbnVtYmVyID0gMCk6IG51bWJlcltdIHtcbiAgY29uc3QgcmVzdWx0ID0gYXJncy5tYXAoZSA9PiBwYXJzZUZsb2F0KGUpIHx8IHBhcnNlSW50KGUpKTtcblxuICBpZiAocmVzdWx0Lmxlbmd0aCA8IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RvbyBmZXcgYXJndW1lbnRzIGZvciBpbnN0cnVjdGlvbicpO1xuICB9XG5cbiAgZm9yIChsZXQgeCA9IDA7IHggPCByZXN1bHQubGVuZ3RoOyB4ICs9IDIpIHtcbiAgICAvLyBUcmFuc2xhdGUgZnJvbSAwLTEgdG8gMC1jZWxsV2lkdGhcbiAgICByZXN1bHRbeF0gKj0gY2VsbFdpZHRoIC0gKGxlZnRQYWRkaW5nICogZGV2aWNlUGl4ZWxSYXRpbykgLSAocmlnaHRQYWRkaW5nICogZGV2aWNlUGl4ZWxSYXRpbyk7XG4gICAgLy8gRW5zdXJlIGNvb3JkaW5hdGUgZG9lc24ndCBlc2NhcGUgY2VsbCBib3VuZHMgYW5kIHJvdW5kIHRvIHRoZSBuZWFyZXN0IDAuNSB0byBlbnN1cmUgYSBjcmlzcFxuICAgIC8vIGxpbmUgYXQgMTAwJSBkZXZpY2VQaXhlbFJhdGlvXG4gICAgaWYgKGRvQ2xhbXAgJiYgcmVzdWx0W3hdICE9PSAwKSB7XG4gICAgICByZXN1bHRbeF0gPSBjbGFtcChNYXRoLnJvdW5kKHJlc3VsdFt4XSArIDAuNSkgLSAwLjUsIGNlbGxXaWR0aCwgMCk7XG4gICAgfVxuICAgIC8vIEFwcGx5IHRoZSBjZWxsJ3Mgb2Zmc2V0IChpZS4geCpjZWxsV2lkdGgpXG4gICAgcmVzdWx0W3hdICs9IHhPZmZzZXQgKyAobGVmdFBhZGRpbmcgKiBkZXZpY2VQaXhlbFJhdGlvKTtcbiAgfVxuXG4gIGZvciAobGV0IHkgPSAxOyB5IDwgcmVzdWx0Lmxlbmd0aDsgeSArPSAyKSB7XG4gICAgLy8gVHJhbnNsYXRlIGZyb20gMC0xIHRvIDAtY2VsbEhlaWdodFxuICAgIHJlc3VsdFt5XSAqPSBjZWxsSGVpZ2h0O1xuICAgIC8vIEVuc3VyZSBjb29yZGluYXRlIGRvZXNuJ3QgZXNjYXBlIGNlbGwgYm91bmRzIGFuZCByb3VuZCB0byB0aGUgbmVhcmVzdCAwLjUgdG8gZW5zdXJlIGEgY3Jpc3BcbiAgICAvLyBsaW5lIGF0IDEwMCUgZGV2aWNlUGl4ZWxSYXRpb1xuICAgIGlmIChkb0NsYW1wICYmIHJlc3VsdFt5XSAhPT0gMCkge1xuICAgICAgcmVzdWx0W3ldID0gY2xhbXAoTWF0aC5yb3VuZChyZXN1bHRbeV0gKyAwLjUpIC0gMC41LCBjZWxsSGVpZ2h0LCAwKTtcbiAgICB9XG4gICAgLy8gQXBwbHkgdGhlIGNlbGwncyBvZmZzZXQgKGllLiB4KmNlbGxIZWlnaHQpXG4gICAgcmVzdWx0W3ldICs9IHlPZmZzZXQ7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyB0b0Rpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IElEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIG9ic2VydmVEZXZpY2VQaXhlbERpbWVuc2lvbnMoZWxlbWVudDogSFRNTEVsZW1lbnQsIHBhcmVudFdpbmRvdzogV2luZG93ICYgdHlwZW9mIGdsb2JhbFRoaXMsIGNhbGxiYWNrOiAoZGV2aWNlV2lkdGg6IG51bWJlciwgZGV2aWNlSGVpZ2h0OiBudW1iZXIpID0+IHZvaWQpOiBJRGlzcG9zYWJsZSB7XG4gIC8vIE9ic2VydmUgYW55IHJlc2l6ZXMgdG8gdGhlIGVsZW1lbnQgYW5kIGV4dHJhY3QgdGhlIGFjdHVhbCBwaXhlbCBzaXplIG9mIHRoZSBlbGVtZW50IGlmIHRoZVxuICAvLyBkZXZpY2VQaXhlbENvbnRlbnRCb3hTaXplIEFQSSBpcyBzdXBwb3J0ZWQuIFRoaXMgYWxsb3dzIGNvcnJlY3Rpbmcgcm91bmRpbmcgZXJyb3JzIHdoZW5cbiAgLy8gY29udmVydGluZyBiZXR3ZWVuIENTUyBwaXhlbHMgYW5kIGRldmljZSBwaXhlbHMgd2hpY2ggY2F1c2VzIGJsdXJyeSByZW5kZXJpbmcgd2hlbiBkZXZpY2VcbiAgLy8gcGl4ZWwgcmF0aW8gaXMgbm90IGEgcm91bmQgbnVtYmVyLlxuICBsZXQgb2JzZXJ2ZXI6IFJlc2l6ZU9ic2VydmVyIHwgdW5kZWZpbmVkID0gbmV3IHBhcmVudFdpbmRvdy5SZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gZW50cmllcy5maW5kKChlbnRyeSkgPT4gZW50cnkudGFyZ2V0ID09PSBlbGVtZW50KTtcbiAgICBpZiAoIWVudHJ5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRGlzY29ubmVjdCBpZiBkZXZpY2VQaXhlbENvbnRlbnRCb3hTaXplIGlzbid0IHN1cHBvcnRlZCBieSB0aGUgYnJvd3NlclxuICAgIGlmICghKCdkZXZpY2VQaXhlbENvbnRlbnRCb3hTaXplJyBpbiBlbnRyeSkpIHtcbiAgICAgIG9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgICBvYnNlcnZlciA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGaXJlIHRoZSBjYWxsYmFjaywgaWdub3JlIGV2ZW50cyB3aGVyZSB0aGUgZGltZW5zaW9ucyBhcmUgMHgwIGFzIHRoZSBjYW52YXMgaXMgbGlrZWx5IGhpZGRlblxuICAgIGNvbnN0IHdpZHRoID0gZW50cnkuZGV2aWNlUGl4ZWxDb250ZW50Qm94U2l6ZVswXS5pbmxpbmVTaXplO1xuICAgIGNvbnN0IGhlaWdodCA9IGVudHJ5LmRldmljZVBpeGVsQ29udGVudEJveFNpemVbMF0uYmxvY2tTaXplO1xuICAgIGlmICh3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCkge1xuICAgICAgY2FsbGJhY2sod2lkdGgsIGhlaWdodCk7XG4gICAgfVxuICB9KTtcbiAgdHJ5IHtcbiAgICBvYnNlcnZlci5vYnNlcnZlKGVsZW1lbnQsIHsgYm94OiBbJ2RldmljZS1waXhlbC1jb250ZW50LWJveCddIH0gYXMgYW55KTtcbiAgfSBjYXRjaCB7XG4gICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIG9ic2VydmVyID0gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB0b0Rpc3Bvc2FibGUoKCkgPT4gb2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKSk7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElEaW1lbnNpb25zLCBJUmVuZGVyRGltZW5zaW9ucyB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHRocm93SWZGYWxzeTxUPih2YWx1ZTogVCB8IHVuZGVmaW5lZCB8IG51bGwpOiBUIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndmFsdWUgbXVzdCBub3QgYmUgZmFsc3knKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Bvd2VybGluZUdseXBoKGNvZGVwb2ludDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIC8vIE9ubHkgcmV0dXJuIHRydWUgZm9yIFBvd2VybGluZSBzeW1ib2xzIHdoaWNoIHJlcXVpcmVcbiAgLy8gZGlmZmVyZW50IHBhZGRpbmcgYW5kIHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIG1pbmltdW0gY29udHJhc3RcbiAgLy8gcmF0aW8gc3RhbmRhcmRzXG4gIHJldHVybiAweEUwQTQgPD0gY29kZXBvaW50ICYmIGNvZGVwb2ludCA8PSAweEUwRDY7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Jlc3RyaWN0ZWRQb3dlcmxpbmVHbHlwaChjb2RlcG9pbnQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gMHhFMEIwIDw9IGNvZGVwb2ludCAmJiBjb2RlcG9pbnQgPD0gMHhFMEI3O1xufVxuXG5mdW5jdGlvbiBpc05lcmRGb250R2x5cGgoY29kZXBvaW50OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIDB4RTAwMCA8PSBjb2RlcG9pbnQgJiYgY29kZXBvaW50IDw9IDB4RjhGRjtcbn1cblxuZnVuY3Rpb24gaXNCb3hPckJsb2NrR2x5cGgoY29kZXBvaW50OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIDB4MjUwMCA8PSBjb2RlcG9pbnQgJiYgY29kZXBvaW50IDw9IDB4MjU5Rjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRW1vamkoY29kZXBvaW50OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb2RlcG9pbnQgPj0gMHgxRjYwMCAmJiBjb2RlcG9pbnQgPD0gMHgxRjY0RiB8fCAvLyBFbW90aWNvbnNcbiAgICBjb2RlcG9pbnQgPj0gMHgxRjMwMCAmJiBjb2RlcG9pbnQgPD0gMHgxRjVGRiB8fCAvLyBNaXNjIFN5bWJvbHMgYW5kIFBpY3RvZ3JhcGhzXG4gICAgY29kZXBvaW50ID49IDB4MUY2ODAgJiYgY29kZXBvaW50IDw9IDB4MUY2RkYgfHwgLy8gVHJhbnNwb3J0IGFuZCBNYXBcbiAgICBjb2RlcG9pbnQgPj0gMHgyNjAwICAmJiBjb2RlcG9pbnQgPD0gMHgyNkZGICB8fCAvLyBNaXNjIHN5bWJvbHNcbiAgICBjb2RlcG9pbnQgPj0gMHgyNzAwICAmJiBjb2RlcG9pbnQgPD0gMHgyN0JGICB8fCAvLyBEaW5nYmF0c1xuICAgIGNvZGVwb2ludCA+PSAweEZFMDAgICYmIGNvZGVwb2ludCA8PSAweEZFMEYgIHx8IC8vIFZhcmlhdGlvbiBTZWxlY3RvcnNcbiAgICBjb2RlcG9pbnQgPj0gMHgxRjkwMCAmJiBjb2RlcG9pbnQgPD0gMHgxRjlGRiB8fCAvLyBTdXBwbGVtZW50YWwgU3ltYm9scyBhbmQgUGljdG9ncmFwaHNcbiAgICBjb2RlcG9pbnQgPj0gMHgxRjFFNiAmJiBjb2RlcG9pbnQgPD0gMHgxRjFGRlxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWxsb3dSZXNjYWxpbmcoY29kZXBvaW50OiBudW1iZXIgfCB1bmRlZmluZWQsIHdpZHRoOiBudW1iZXIsIGdseXBoU2l6ZVg6IG51bWJlciwgZGV2aWNlQ2VsbFdpZHRoOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICAvLyBJcyBzaW5nbGUgY2VsbCB3aWR0aFxuICAgIHdpZHRoID09PSAxICYmXG4gICAgLy8gR2x5cGggZXhjZWVkcyBjZWxsIGJvdW5kcywgYWRkIDUwJSB0byBhdm9pZCBodXJ0aW5nIHJlYWRhYmlsaXR5IGJ5IHJlc2NhbGluZyBnbHlwaHMgdGhhdFxuICAgIC8vIGJhcmVseSBvdmVybGFwXG4gICAgZ2x5cGhTaXplWCA+IE1hdGguY2VpbChkZXZpY2VDZWxsV2lkdGggKiAxLjUpICYmXG4gICAgLy8gTmV2ZXIgcmVzY2FsZSBhc2NpaVxuICAgIGNvZGVwb2ludCAhPT0gdW5kZWZpbmVkICYmIGNvZGVwb2ludCA+IDB4RkYgJiZcbiAgICAvLyBOZXZlciByZXNjYWxlIGVtb2ppXG4gICAgIWlzRW1vamkoY29kZXBvaW50KSAmJlxuICAgIC8vIE5ldmVyIHJlc2NhbGUgcG93ZXJsaW5lIG9yIG5lcmQgZm9udHNcbiAgICAhaXNQb3dlcmxpbmVHbHlwaChjb2RlcG9pbnQpICYmICFpc05lcmRGb250R2x5cGgoY29kZXBvaW50KVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJlYXRHbHlwaEFzQmFja2dyb3VuZENvbG9yKGNvZGVwb2ludDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1Bvd2VybGluZUdseXBoKGNvZGVwb2ludCkgfHwgaXNCb3hPckJsb2NrR2x5cGgoY29kZXBvaW50KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlbmRlckRpbWVuc2lvbnMoKTogSVJlbmRlckRpbWVuc2lvbnMge1xuICByZXR1cm4ge1xuICAgIGNzczoge1xuICAgICAgY2FudmFzOiBjcmVhdGVEaW1lbnNpb24oKSxcbiAgICAgIGNlbGw6IGNyZWF0ZURpbWVuc2lvbigpXG4gICAgfSxcbiAgICBkZXZpY2U6IHtcbiAgICAgIGNhbnZhczogY3JlYXRlRGltZW5zaW9uKCksXG4gICAgICBjZWxsOiBjcmVhdGVEaW1lbnNpb24oKSxcbiAgICAgIGNoYXI6IHtcbiAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgIGhlaWdodDogMCxcbiAgICAgICAgbGVmdDogMCxcbiAgICAgICAgdG9wOiAwXG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVEaW1lbnNpb24oKTogSURpbWVuc2lvbnMge1xuICByZXR1cm4ge1xuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogMFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZU5leHRWYXJpYW50T2Zmc2V0KGNlbGxXaWR0aDogbnVtYmVyLCBsaW5lV2lkdGg6IG51bWJlciwgY3VycmVudE9mZnNldDogbnVtYmVyID0gMCk6IG51bWJlciB7XG4gIHJldHVybiAoY2VsbFdpZHRoIC0gKE1hdGgucm91bmQobGluZVdpZHRoKSAqIDIgLSBjdXJyZW50T2Zmc2V0KSkgJSAoTWF0aC5yb3VuZChsaW5lV2lkdGgpICogMik7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMiBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElUZXJtaW5hbCB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuaW1wb3J0IHsgSVNlbGVjdGlvblJlbmRlck1vZGVsIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvVHlwZXMnO1xuaW1wb3J0IHsgVGVybWluYWwgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuXG5jbGFzcyBTZWxlY3Rpb25SZW5kZXJNb2RlbCBpbXBsZW1lbnRzIElTZWxlY3Rpb25SZW5kZXJNb2RlbCB7XG4gIHB1YmxpYyBoYXNTZWxlY3Rpb24hOiBib29sZWFuO1xuICBwdWJsaWMgY29sdW1uU2VsZWN0TW9kZSE6IGJvb2xlYW47XG4gIHB1YmxpYyB2aWV3cG9ydFN0YXJ0Um93ITogbnVtYmVyO1xuICBwdWJsaWMgdmlld3BvcnRFbmRSb3chOiBudW1iZXI7XG4gIHB1YmxpYyB2aWV3cG9ydENhcHBlZFN0YXJ0Um93ITogbnVtYmVyO1xuICBwdWJsaWMgdmlld3BvcnRDYXBwZWRFbmRSb3chOiBudW1iZXI7XG4gIHB1YmxpYyBzdGFydENvbCE6IG51bWJlcjtcbiAgcHVibGljIGVuZENvbCE6IG51bWJlcjtcbiAgcHVibGljIHNlbGVjdGlvblN0YXJ0OiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgc2VsZWN0aW9uRW5kOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmhhc1NlbGVjdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMuY29sdW1uU2VsZWN0TW9kZSA9IGZhbHNlO1xuICAgIHRoaXMudmlld3BvcnRTdGFydFJvdyA9IDA7XG4gICAgdGhpcy52aWV3cG9ydEVuZFJvdyA9IDA7XG4gICAgdGhpcy52aWV3cG9ydENhcHBlZFN0YXJ0Um93ID0gMDtcbiAgICB0aGlzLnZpZXdwb3J0Q2FwcGVkRW5kUm93ID0gMDtcbiAgICB0aGlzLnN0YXJ0Q29sID0gMDtcbiAgICB0aGlzLmVuZENvbCA9IDA7XG4gICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNlbGVjdGlvbkVuZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGUodGVybWluYWw6IElUZXJtaW5hbCwgc3RhcnQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQsIGVuZDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgY29sdW1uU2VsZWN0TW9kZTogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0O1xuICAgIHRoaXMuc2VsZWN0aW9uRW5kID0gZW5kO1xuICAgIC8vIFNlbGVjdGlvbiBkb2VzIG5vdCBleGlzdFxuICAgIGlmICghc3RhcnQgfHwgIWVuZCB8fCAoc3RhcnRbMF0gPT09IGVuZFswXSAmJiBzdGFydFsxXSA9PT0gZW5kWzFdKSkge1xuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRyYW5zbGF0ZSBmcm9tIGJ1ZmZlciBwb3NpdGlvbiB0byB2aWV3cG9ydCBwb3NpdGlvblxuICAgIGNvbnN0IHZpZXdwb3J0WSA9IHRlcm1pbmFsLmJ1ZmZlcnMuYWN0aXZlLnlkaXNwO1xuICAgIGNvbnN0IHZpZXdwb3J0U3RhcnRSb3cgPSBzdGFydFsxXSAtIHZpZXdwb3J0WTtcbiAgICBjb25zdCB2aWV3cG9ydEVuZFJvdyA9IGVuZFsxXSAtIHZpZXdwb3J0WTtcbiAgICBjb25zdCB2aWV3cG9ydENhcHBlZFN0YXJ0Um93ID0gTWF0aC5tYXgodmlld3BvcnRTdGFydFJvdywgMCk7XG4gICAgY29uc3Qgdmlld3BvcnRDYXBwZWRFbmRSb3cgPSBNYXRoLm1pbih2aWV3cG9ydEVuZFJvdywgdGVybWluYWwucm93cyAtIDEpO1xuXG4gICAgLy8gTm8gbmVlZCB0byBkcmF3IHRoZSBzZWxlY3Rpb25cbiAgICBpZiAodmlld3BvcnRDYXBwZWRTdGFydFJvdyA+PSB0ZXJtaW5hbC5yb3dzIHx8IHZpZXdwb3J0Q2FwcGVkRW5kUm93IDwgMCkge1xuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaGFzU2VsZWN0aW9uID0gdHJ1ZTtcbiAgICB0aGlzLmNvbHVtblNlbGVjdE1vZGUgPSBjb2x1bW5TZWxlY3RNb2RlO1xuICAgIHRoaXMudmlld3BvcnRTdGFydFJvdyA9IHZpZXdwb3J0U3RhcnRSb3c7XG4gICAgdGhpcy52aWV3cG9ydEVuZFJvdyA9IHZpZXdwb3J0RW5kUm93O1xuICAgIHRoaXMudmlld3BvcnRDYXBwZWRTdGFydFJvdyA9IHZpZXdwb3J0Q2FwcGVkU3RhcnRSb3c7XG4gICAgdGhpcy52aWV3cG9ydENhcHBlZEVuZFJvdyA9IHZpZXdwb3J0Q2FwcGVkRW5kUm93O1xuICAgIHRoaXMuc3RhcnRDb2wgPSBzdGFydFswXTtcbiAgICB0aGlzLmVuZENvbCA9IGVuZFswXTtcbiAgfVxuXG4gIHB1YmxpYyBpc0NlbGxTZWxlY3RlZCh0ZXJtaW5hbDogVGVybWluYWwsIHg6IG51bWJlciwgeTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmhhc1NlbGVjdGlvbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB5IC09IHRlcm1pbmFsLmJ1ZmZlci5hY3RpdmUudmlld3BvcnRZO1xuICAgIGlmICh0aGlzLmNvbHVtblNlbGVjdE1vZGUpIHtcbiAgICAgIGlmICh0aGlzLnN0YXJ0Q29sIDw9IHRoaXMuZW5kQ29sKSB7XG4gICAgICAgIHJldHVybiB4ID49IHRoaXMuc3RhcnRDb2wgJiYgeSA+PSB0aGlzLnZpZXdwb3J0Q2FwcGVkU3RhcnRSb3cgJiZcbiAgICAgICAgICB4IDwgdGhpcy5lbmRDb2wgJiYgeSA8PSB0aGlzLnZpZXdwb3J0Q2FwcGVkRW5kUm93O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHggPCB0aGlzLnN0YXJ0Q29sICYmIHkgPj0gdGhpcy52aWV3cG9ydENhcHBlZFN0YXJ0Um93ICYmXG4gICAgICAgIHggPj0gdGhpcy5lbmRDb2wgJiYgeSA8PSB0aGlzLnZpZXdwb3J0Q2FwcGVkRW5kUm93O1xuICAgIH1cbiAgICByZXR1cm4gKHkgPiB0aGlzLnZpZXdwb3J0U3RhcnRSb3cgJiYgeSA8IHRoaXMudmlld3BvcnRFbmRSb3cpIHx8XG4gICAgICAodGhpcy52aWV3cG9ydFN0YXJ0Um93ID09PSB0aGlzLnZpZXdwb3J0RW5kUm93ICYmIHkgPT09IHRoaXMudmlld3BvcnRTdGFydFJvdyAmJiB4ID49IHRoaXMuc3RhcnRDb2wgJiYgeCA8IHRoaXMuZW5kQ29sKSB8fFxuICAgICAgKHRoaXMudmlld3BvcnRTdGFydFJvdyA8IHRoaXMudmlld3BvcnRFbmRSb3cgJiYgeSA9PT0gdGhpcy52aWV3cG9ydEVuZFJvdyAmJiB4IDwgdGhpcy5lbmRDb2wpIHx8XG4gICAgICAodGhpcy52aWV3cG9ydFN0YXJ0Um93IDwgdGhpcy52aWV3cG9ydEVuZFJvdyAmJiB5ID09PSB0aGlzLnZpZXdwb3J0U3RhcnRSb3cgJiYgeCA+PSB0aGlzLnN0YXJ0Q29sKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VsZWN0aW9uUmVuZGVyTW9kZWwoKTogSVNlbGVjdGlvblJlbmRlck1vZGVsIHtcbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb25SZW5kZXJNb2RlbCgpO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJQ29sb3JDb250cmFzdENhY2hlIH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBESU1fT1BBQ0lUWSwgVEVYVF9CQVNFTElORSB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL0NvbnN0YW50cyc7XG5pbXBvcnQgeyB0cnlEcmF3Q3VzdG9tQ2hhciB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL0N1c3RvbUdseXBocyc7XG5pbXBvcnQgeyBjb21wdXRlTmV4dFZhcmlhbnRPZmZzZXQsIHRyZWF0R2x5cGhBc0JhY2tncm91bmRDb2xvciwgaXNQb3dlcmxpbmVHbHlwaCwgaXNSZXN0cmljdGVkUG93ZXJsaW5lR2x5cGgsIHRocm93SWZGYWxzeSB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1JlbmRlcmVyVXRpbHMnO1xuaW1wb3J0IHsgSUJvdW5kaW5nQm94LCBJQ2hhckF0bGFzQ29uZmlnLCBJUmFzdGVyaXplZEdseXBoLCBJVGV4dHVyZUF0bGFzIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvVHlwZXMnO1xuaW1wb3J0IHsgTlVMTF9DT0xPUiwgY2hhbm5lbHMsIGNvbG9yLCByZ2JhIH0gZnJvbSAnY29tbW9uL0NvbG9yJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2NvbW1vbi9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgRm91cktleU1hcCB9IGZyb20gJ2NvbW1vbi9NdWx0aUtleU1hcCc7XG5pbXBvcnQgeyBJZGxlVGFza1F1ZXVlIH0gZnJvbSAnY29tbW9uL1Rhc2tRdWV1ZSc7XG5pbXBvcnQgeyBJQ29sb3IgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgQXR0cmlidXRlRGF0YSB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQXR0cmlidXRlRGF0YSc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVzLCBERUZBVUxUX0NPTE9SLCBERUZBVUxUX0VYVCwgVW5kZXJsaW5lU3R5bGUgfSBmcm9tICdjb21tb24vYnVmZmVyL0NvbnN0YW50cyc7XG5pbXBvcnQgeyBJVW5pY29kZVNlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG4vKipcbiAqIEEgc2hhcmVkIG9iamVjdCB3aGljaCBpcyB1c2VkIHRvIGRyYXcgbm90aGluZyBmb3IgYSBwYXJ0aWN1bGFyIGNlbGwuXG4gKi9cbmNvbnN0IE5VTExfUkFTVEVSSVpFRF9HTFlQSDogSVJhc3Rlcml6ZWRHbHlwaCA9IHtcbiAgdGV4dHVyZVBhZ2U6IDAsXG4gIHRleHR1cmVQb3NpdGlvbjogeyB4OiAwLCB5OiAwIH0sXG4gIHRleHR1cmVQb3NpdGlvbkNsaXBTcGFjZTogeyB4OiAwLCB5OiAwIH0sXG4gIG9mZnNldDogeyB4OiAwLCB5OiAwIH0sXG4gIHNpemU6IHsgeDogMCwgeTogMCB9LFxuICBzaXplQ2xpcFNwYWNlOiB7IHg6IDAsIHk6IDAgfVxufTtcblxuY29uc3QgVE1QX0NBTlZBU19HTFlQSF9QQURESU5HID0gMjtcblxuY29uc3QgZW51bSBDb25zdGFudHMge1xuICAvKipcbiAgICogVGhlIGFtb3VudCBvZiBwaXhlbCBwYWRkaW5nIHRvIGFsbG93IGluIGVhY2ggcm93LiBTZXR0aW5nIHRoaXMgdG8gemVybyB3b3VsZCBtYWtlIHRoZSBhdGxhc1xuICAgKiBwYWdlIHBhY2sgYXMgdGlnaHRseSBhcyBwb3NzaWJsZSwgYnV0IG1vcmUgcGFnZXMgd291bGQgZW5kIHVwIGJlaW5nIGNyZWF0ZWQgYXMgYSByZXN1bHQuXG4gICAqL1xuICBST1dfUElYRUxfVEhSRVNIT0xEID0gMixcbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIHRleHR1cmUgc2l6ZSByZWdhcmRsZXNzIG9mIHdoYXQgdGhlIGFjdHVhbCBoYXJkd2FyZSBtYXhpbXVtIHR1cm5zIG91dCB0byBiZS4gVGhpc1xuICAgKiBpcyBlbmZvcmNlZCB0byBlbnN1cmUgdXBsb2FkaW5nIHRoZSB0ZXh0dXJlIHN0aWxsIGZpbmlzaGVzIGluIGEgcmVhc29uYWJsZSBhbW91bnQgb2YgdGltZS4gQVxuICAgKiA0MDk2IHNxdWFyZWQgaW1hZ2UgdGFrZXMgdXAgMTZNQiBvZiBHUFUgbWVtb3J5LlxuICAgKi9cbiAgRk9SQ0VEX01BWF9URVhUVVJFX1NJWkUgPSA0MDk2XG59XG5cbmludGVyZmFjZSBJQ2hhckF0bGFzQWN0aXZlUm93IHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xufVxuXG4vLyBXb3JrIHZhcmlhYmxlcyB0byBhdm9pZCBnYXJiYWdlIGNvbGxlY3Rpb25cbmxldCAkZ2x5cGggPSB1bmRlZmluZWQ7XG5cbmV4cG9ydCBjbGFzcyBUZXh0dXJlQXRsYXMgaW1wbGVtZW50cyBJVGV4dHVyZUF0bGFzIHtcbiAgcHJpdmF0ZSBfZGlkV2FybVVwOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfY2FjaGVNYXA6IEZvdXJLZXlNYXA8bnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBJUmFzdGVyaXplZEdseXBoPiA9IG5ldyBGb3VyS2V5TWFwKCk7XG4gIHByaXZhdGUgX2NhY2hlTWFwQ29tYmluZWQ6IEZvdXJLZXlNYXA8c3RyaW5nLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBJUmFzdGVyaXplZEdseXBoPiA9IG5ldyBGb3VyS2V5TWFwKCk7XG5cbiAgLy8gVGhlIHRleHR1cmUgdGhhdCB0aGUgYXRsYXMgaXMgZHJhd24gdG9cbiAgcHJpdmF0ZSBfcGFnZXM6IEF0bGFzUGFnZVtdID0gW107XG4gIHB1YmxpYyBnZXQgcGFnZXMoKTogeyBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LCB2ZXJzaW9uOiBudW1iZXIgfVtdIHsgcmV0dXJuIHRoaXMuX3BhZ2VzOyB9XG5cbiAgLy8gVGhlIHNldCBvZiBhdGxhcyBwYWdlcyB0aGF0IGNhbiBiZSB3cml0dGVuIHRvXG4gIHByaXZhdGUgX2FjdGl2ZVBhZ2VzOiBBdGxhc1BhZ2VbXSA9IFtdO1xuXG4gIHByaXZhdGUgX3RtcENhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XG4gIC8vIEEgdGVtcG9yYXJ5IGNvbnRleHQgdGhhdCBnbHlwaHMgYXJlIGRyYXduIHRvIGJlZm9yZSBiZWluZyB0cmFuc2ZlcmVkIHRvIHRoZSBhdGxhcy5cbiAgcHJpdmF0ZSBfdG1wQ3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG5cbiAgcHJpdmF0ZSBfd29ya0JvdW5kaW5nQm94OiBJQm91bmRpbmdCb3ggPSB7IHRvcDogMCwgbGVmdDogMCwgYm90dG9tOiAwLCByaWdodDogMCB9O1xuICBwcml2YXRlIF93b3JrQXR0cmlidXRlRGF0YTogQXR0cmlidXRlRGF0YSA9IG5ldyBBdHRyaWJ1dGVEYXRhKCk7XG5cbiAgcHJpdmF0ZSBfdGV4dHVyZVNpemU6IG51bWJlciA9IDUxMjtcblxuICBwdWJsaWMgc3RhdGljIG1heEF0bGFzUGFnZXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgcHVibGljIHN0YXRpYyBtYXhUZXh0dXJlU2l6ZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29uQWRkVGV4dHVyZUF0bGFzQ2FudmFzID0gbmV3IEV2ZW50RW1pdHRlcjxIVE1MQ2FudmFzRWxlbWVudD4oKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uQWRkVGV4dHVyZUF0bGFzQ2FudmFzID0gdGhpcy5fb25BZGRUZXh0dXJlQXRsYXNDYW52YXMuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uUmVtb3ZlVGV4dHVyZUF0bGFzQ2FudmFzID0gbmV3IEV2ZW50RW1pdHRlcjxIVE1MQ2FudmFzRWxlbWVudD4oKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uUmVtb3ZlVGV4dHVyZUF0bGFzQ2FudmFzID0gdGhpcy5fb25SZW1vdmVUZXh0dXJlQXRsYXNDYW52YXMuZXZlbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZG9jdW1lbnQ6IERvY3VtZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbmZpZzogSUNoYXJBdGxhc0NvbmZpZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF91bmljb2RlU2VydmljZTogSVVuaWNvZGVTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuX2NyZWF0ZU5ld1BhZ2UoKTtcbiAgICB0aGlzLl90bXBDYW52YXMgPSBjcmVhdGVDYW52YXMoXG4gICAgICBfZG9jdW1lbnQsXG4gICAgICB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbFdpZHRoICogNCArIFRNUF9DQU5WQVNfR0xZUEhfUEFERElORyAqIDIsXG4gICAgICB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbEhlaWdodCArIFRNUF9DQU5WQVNfR0xZUEhfUEFERElORyAqIDJcbiAgICApO1xuICAgIHRoaXMuX3RtcEN0eCA9IHRocm93SWZGYWxzeSh0aGlzLl90bXBDYW52YXMuZ2V0Q29udGV4dCgnMmQnLCB7XG4gICAgICBhbHBoYTogdGhpcy5fY29uZmlnLmFsbG93VHJhbnNwYXJlbmN5LFxuICAgICAgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlXG4gICAgfSkpO1xuICB9XG5cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBwYWdlIG9mIHRoaXMucGFnZXMpIHtcbiAgICAgIHBhZ2UuY2FudmFzLnJlbW92ZSgpO1xuICAgIH1cbiAgICB0aGlzLl9vbkFkZFRleHR1cmVBdGxhc0NhbnZhcy5kaXNwb3NlKCk7XG4gIH1cblxuICBwdWJsaWMgd2FybVVwKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZGlkV2FybVVwKSB7XG4gICAgICB0aGlzLl9kb1dhcm1VcCgpO1xuICAgICAgdGhpcy5fZGlkV2FybVVwID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9kb1dhcm1VcCgpOiB2b2lkIHtcbiAgICAvLyBQcmUtZmlsbCB3aXRoIEFTQ0lJIDMzLTEyNiwgdGhpcyBpcyBub3QgdXJnZW50IGFuZCBkb25lIGluIGlkbGUgY2FsbGJhY2tzXG4gICAgY29uc3QgcXVldWUgPSBuZXcgSWRsZVRhc2tRdWV1ZSgpO1xuICAgIGZvciAobGV0IGkgPSAzMzsgaSA8IDEyNjsgaSsrKSB7XG4gICAgICBxdWV1ZS5lbnF1ZXVlKCgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWNoZU1hcC5nZXQoaSwgREVGQVVMVF9DT0xPUiwgREVGQVVMVF9DT0xPUiwgREVGQVVMVF9FWFQpKSB7XG4gICAgICAgICAgY29uc3QgcmFzdGVyaXplZEdseXBoID0gdGhpcy5fZHJhd1RvQ2FjaGUoaSwgREVGQVVMVF9DT0xPUiwgREVGQVVMVF9DT0xPUiwgREVGQVVMVF9FWFQpO1xuICAgICAgICAgIHRoaXMuX2NhY2hlTWFwLnNldChpLCBERUZBVUxUX0NPTE9SLCBERUZBVUxUX0NPTE9SLCBERUZBVUxUX0VYVCwgcmFzdGVyaXplZEdseXBoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVxdWVzdENsZWFyTW9kZWwgPSBmYWxzZTtcbiAgcHVibGljIGJlZ2luRnJhbWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3RDbGVhck1vZGVsO1xuICB9XG5cbiAgcHVibGljIGNsZWFyVGV4dHVyZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcGFnZXNbMF0uY3VycmVudFJvdy54ID09PSAwICYmIHRoaXMuX3BhZ2VzWzBdLmN1cnJlbnRSb3cueSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgdGhpcy5fcGFnZXMpIHtcbiAgICAgIHBhZ2UuY2xlYXIoKTtcbiAgICB9XG4gICAgdGhpcy5fY2FjaGVNYXAuY2xlYXIoKTtcbiAgICB0aGlzLl9jYWNoZU1hcENvbWJpbmVkLmNsZWFyKCk7XG4gICAgdGhpcy5fZGlkV2FybVVwID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVOZXdQYWdlKCk6IEF0bGFzUGFnZSB7XG4gICAgLy8gVHJ5IG1lcmdlIHRoZSBzZXQgb2YgdGhlIDQgbW9zdCB1c2VkIHBhZ2VzIG9mIHRoZSBsYXJnZXN0IHNpemUuIFRoaXMgaXMgaXMgZGVmZXJyZWQgdG8gYVxuICAgIC8vIG1pY3JvdGFzayB0byBlbnN1cmUgaXQgZG9lcyBub3QgaW50ZXJydXB0IHRleHR1cmVzIHRoYXQgd2lsbCBiZSByZW5kZXJlZCBpbiB0aGUgY3VycmVudFxuICAgIC8vIGFuaW1hdGlvbiBmcmFtZSB3aGljaCB3b3VsZCByZXN1bHQgaW4gYmxhbmsgcmVuZGVyZWQgYXJlYXMuIFRoaXMgaXMgYWN0dWFsbHkgbm90IHRoYXRcbiAgICAvLyBleHBlbnNpdmUgcmVsYXRpdmUgdG8gZHJhd2luZyB0aGUgZ2x5cGhzLCBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHdhaXQgZm9yIGFuIGlkbGUgY2FsbGJhY2suXG4gICAgaWYgKFRleHR1cmVBdGxhcy5tYXhBdGxhc1BhZ2VzICYmIHRoaXMuX3BhZ2VzLmxlbmd0aCA+PSBNYXRoLm1heCg0LCBUZXh0dXJlQXRsYXMubWF4QXRsYXNQYWdlcykpIHtcbiAgICAgIC8vIEZpbmQgdGhlIHNldCBvZiB0aGUgbGFyZ2VzdCA0IGltYWdlcywgYmVsb3cgdGhlIG1heGltdW0gc2l6ZSwgd2l0aCB0aGUgaGlnaGVzdFxuICAgICAgLy8gcGVyY2VudGFnZXMgdXNlZFxuICAgICAgY29uc3QgcGFnZXNCeVNpemUgPSB0aGlzLl9wYWdlcy5maWx0ZXIoZSA9PiB7XG4gICAgICAgIHJldHVybiBlLmNhbnZhcy53aWR0aCAqIDIgPD0gKFRleHR1cmVBdGxhcy5tYXhUZXh0dXJlU2l6ZSB8fCBDb25zdGFudHMuRk9SQ0VEX01BWF9URVhUVVJFX1NJWkUpO1xuICAgICAgfSkuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBpZiAoYi5jYW52YXMud2lkdGggIT09IGEuY2FudmFzLndpZHRoKSB7XG4gICAgICAgICAgcmV0dXJuIGIuY2FudmFzLndpZHRoIC0gYS5jYW52YXMud2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGIucGVyY2VudGFnZVVzZWQgLSBhLnBlcmNlbnRhZ2VVc2VkO1xuICAgICAgfSk7XG4gICAgICBsZXQgc2FtZVNpemVJID0gLTE7XG4gICAgICBsZXQgc2l6ZSA9IDA7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhZ2VzQnlTaXplLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwYWdlc0J5U2l6ZVtpXS5jYW52YXMud2lkdGggIT09IHNpemUpIHtcbiAgICAgICAgICBzYW1lU2l6ZUkgPSBpO1xuICAgICAgICAgIHNpemUgPSBwYWdlc0J5U2l6ZVtpXS5jYW52YXMud2lkdGg7XG4gICAgICAgIH0gZWxzZSBpZiAoaSAtIHNhbWVTaXplSSA9PT0gMykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEdhdGhlciBkZXRhaWxzIG9mIHRoZSBtZXJnZVxuICAgICAgY29uc3QgbWVyZ2luZ1BhZ2VzID0gcGFnZXNCeVNpemUuc2xpY2Uoc2FtZVNpemVJLCBzYW1lU2l6ZUkgKyA0KTtcbiAgICAgIGNvbnN0IHNvcnRlZE1lcmdpbmdQYWdlc0luZGV4ZXMgPSBtZXJnaW5nUGFnZXMubWFwKGUgPT4gZS5nbHlwaHNbMF0udGV4dHVyZVBhZ2UpLnNvcnQoKGEsIGIpID0+IGEgPiBiID8gMSA6IC0xKTtcbiAgICAgIGNvbnN0IG1lcmdlZFBhZ2VJbmRleCA9IHRoaXMucGFnZXMubGVuZ3RoIC0gbWVyZ2luZ1BhZ2VzLmxlbmd0aDtcblxuICAgICAgLy8gTWVyZ2UgaW50byB0aGUgbmV3IHBhZ2VcbiAgICAgIGNvbnN0IG1lcmdlZFBhZ2UgPSB0aGlzLl9tZXJnZVBhZ2VzKG1lcmdpbmdQYWdlcywgbWVyZ2VkUGFnZUluZGV4KTtcbiAgICAgIG1lcmdlZFBhZ2UudmVyc2lvbisrO1xuXG4gICAgICAvLyBEZWxldGUgdGhlIHBhZ2VzLCBzaGlmdGluZyBnbHlwaCB0ZXh0dXJlIHBhZ2VzIGFzIG5lZWRlZFxuICAgICAgZm9yIChsZXQgaSA9IHNvcnRlZE1lcmdpbmdQYWdlc0luZGV4ZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdGhpcy5fZGVsZXRlUGFnZShzb3J0ZWRNZXJnaW5nUGFnZXNJbmRleGVzW2ldKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIHRoZSBuZXcgbWVyZ2VkIHBhZ2UgdG8gdGhlIGVuZFxuICAgICAgdGhpcy5wYWdlcy5wdXNoKG1lcmdlZFBhZ2UpO1xuXG4gICAgICAvLyBSZXF1ZXN0IHRoZSBtb2RlbCB0byBiZSBjbGVhcmVkIHRvIHJlZnJlc2ggYWxsIHRleHR1cmUgcGFnZXMuXG4gICAgICB0aGlzLl9yZXF1ZXN0Q2xlYXJNb2RlbCA9IHRydWU7XG4gICAgICB0aGlzLl9vbkFkZFRleHR1cmVBdGxhc0NhbnZhcy5maXJlKG1lcmdlZFBhZ2UuY2FudmFzKTtcbiAgICB9XG5cbiAgICAvLyBBbGwgbmV3IGF0bGFzIHBhZ2VzIGFyZSBjcmVhdGVkIHNtYWxsIGFzIHRoZXkgYXJlIGhpZ2hseSBkeW5hbWljXG4gICAgY29uc3QgbmV3UGFnZSA9IG5ldyBBdGxhc1BhZ2UodGhpcy5fZG9jdW1lbnQsIHRoaXMuX3RleHR1cmVTaXplKTtcbiAgICB0aGlzLl9wYWdlcy5wdXNoKG5ld1BhZ2UpO1xuICAgIHRoaXMuX2FjdGl2ZVBhZ2VzLnB1c2gobmV3UGFnZSk7XG4gICAgdGhpcy5fb25BZGRUZXh0dXJlQXRsYXNDYW52YXMuZmlyZShuZXdQYWdlLmNhbnZhcyk7XG4gICAgcmV0dXJuIG5ld1BhZ2U7XG4gIH1cblxuICBwcml2YXRlIF9tZXJnZVBhZ2VzKG1lcmdpbmdQYWdlczogQXRsYXNQYWdlW10sIG1lcmdlZFBhZ2VJbmRleDogbnVtYmVyKTogQXRsYXNQYWdlIHtcbiAgICBjb25zdCBtZXJnZWRTaXplID0gbWVyZ2luZ1BhZ2VzWzBdLmNhbnZhcy53aWR0aCAqIDI7XG4gICAgY29uc3QgbWVyZ2VkUGFnZSA9IG5ldyBBdGxhc1BhZ2UodGhpcy5fZG9jdW1lbnQsIG1lcmdlZFNpemUsIG1lcmdpbmdQYWdlcyk7XG4gICAgZm9yIChjb25zdCBbaSwgcF0gb2YgbWVyZ2luZ1BhZ2VzLmVudHJpZXMoKSkge1xuICAgICAgY29uc3QgeE9mZnNldCA9IGkgKiBwLmNhbnZhcy53aWR0aCAlIG1lcmdlZFNpemU7XG4gICAgICBjb25zdCB5T2Zmc2V0ID0gTWF0aC5mbG9vcihpIC8gMikgKiBwLmNhbnZhcy5oZWlnaHQ7XG4gICAgICBtZXJnZWRQYWdlLmN0eC5kcmF3SW1hZ2UocC5jYW52YXMsIHhPZmZzZXQsIHlPZmZzZXQpO1xuICAgICAgZm9yIChjb25zdCBnIG9mIHAuZ2x5cGhzKSB7XG4gICAgICAgIGcudGV4dHVyZVBhZ2UgPSBtZXJnZWRQYWdlSW5kZXg7XG4gICAgICAgIGcuc2l6ZUNsaXBTcGFjZS54ID0gZy5zaXplLnggLyBtZXJnZWRTaXplO1xuICAgICAgICBnLnNpemVDbGlwU3BhY2UueSA9IGcuc2l6ZS55IC8gbWVyZ2VkU2l6ZTtcbiAgICAgICAgZy50ZXh0dXJlUG9zaXRpb24ueCArPSB4T2Zmc2V0O1xuICAgICAgICBnLnRleHR1cmVQb3NpdGlvbi55ICs9IHlPZmZzZXQ7XG4gICAgICAgIGcudGV4dHVyZVBvc2l0aW9uQ2xpcFNwYWNlLnggPSBnLnRleHR1cmVQb3NpdGlvbi54IC8gbWVyZ2VkU2l6ZTtcbiAgICAgICAgZy50ZXh0dXJlUG9zaXRpb25DbGlwU3BhY2UueSA9IGcudGV4dHVyZVBvc2l0aW9uLnkgLyBtZXJnZWRTaXplO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9vblJlbW92ZVRleHR1cmVBdGxhc0NhbnZhcy5maXJlKHAuY2FudmFzKTtcblxuICAgICAgLy8gUmVtb3ZlIHRoZSBtZXJnaW5nIHBhZ2UgZnJvbSBhY3RpdmUgcGFnZXMgaWYgaXQgd2FzIHRoZXJlXG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2FjdGl2ZVBhZ2VzLmluZGV4T2YocCk7XG4gICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZVBhZ2VzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtZXJnZWRQYWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGVsZXRlUGFnZShwYWdlSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX3BhZ2VzLnNwbGljZShwYWdlSW5kZXgsIDEpO1xuICAgIGZvciAobGV0IGogPSBwYWdlSW5kZXg7IGogPCB0aGlzLl9wYWdlcy5sZW5ndGg7IGorKykge1xuICAgICAgY29uc3QgYWRqdXN0aW5nUGFnZSA9IHRoaXMuX3BhZ2VzW2pdO1xuICAgICAgZm9yIChjb25zdCBnIG9mIGFkanVzdGluZ1BhZ2UuZ2x5cGhzKSB7XG4gICAgICAgIGcudGV4dHVyZVBhZ2UtLTtcbiAgICAgIH1cbiAgICAgIGFkanVzdGluZ1BhZ2UudmVyc2lvbisrO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRSYXN0ZXJpemVkR2x5cGhDb21iaW5lZENoYXIoY2hhcnM6IHN0cmluZywgYmc6IG51bWJlciwgZmc6IG51bWJlciwgZXh0OiBudW1iZXIsIHJlc3RyaWN0VG9DZWxsSGVpZ2h0OiBib29sZWFuKTogSVJhc3Rlcml6ZWRHbHlwaCB7XG4gICAgcmV0dXJuIHRoaXMuX2dldEZyb21DYWNoZU1hcCh0aGlzLl9jYWNoZU1hcENvbWJpbmVkLCBjaGFycywgYmcsIGZnLCBleHQsIHJlc3RyaWN0VG9DZWxsSGVpZ2h0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSYXN0ZXJpemVkR2x5cGgoY29kZTogbnVtYmVyLCBiZzogbnVtYmVyLCBmZzogbnVtYmVyLCBleHQ6IG51bWJlciwgcmVzdHJpY3RUb0NlbGxIZWlnaHQ6IGJvb2xlYW4pOiBJUmFzdGVyaXplZEdseXBoIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0RnJvbUNhY2hlTWFwKHRoaXMuX2NhY2hlTWFwLCBjb2RlLCBiZywgZmcsIGV4dCwgcmVzdHJpY3RUb0NlbGxIZWlnaHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGdseXBocyB0ZXh0dXJlIGNvb3JkcywgZHJhd2luZyB0aGUgdGV4dHVyZSBpZiBpdCdzIG5vdCBhbHJlYWR5XG4gICAqL1xuICBwcml2YXRlIF9nZXRGcm9tQ2FjaGVNYXAoXG4gICAgY2FjaGVNYXA6IEZvdXJLZXlNYXA8c3RyaW5nIHwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBJUmFzdGVyaXplZEdseXBoPixcbiAgICBrZXk6IHN0cmluZyB8IG51bWJlcixcbiAgICBiZzogbnVtYmVyLFxuICAgIGZnOiBudW1iZXIsXG4gICAgZXh0OiBudW1iZXIsXG4gICAgcmVzdHJpY3RUb0NlbGxIZWlnaHQ6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBJUmFzdGVyaXplZEdseXBoIHtcbiAgICAkZ2x5cGggPSBjYWNoZU1hcC5nZXQoa2V5LCBiZywgZmcsIGV4dCk7XG4gICAgaWYgKCEkZ2x5cGgpIHtcbiAgICAgICRnbHlwaCA9IHRoaXMuX2RyYXdUb0NhY2hlKGtleSwgYmcsIGZnLCBleHQsIHJlc3RyaWN0VG9DZWxsSGVpZ2h0KTtcbiAgICAgIGNhY2hlTWFwLnNldChrZXksIGJnLCBmZywgZXh0LCAkZ2x5cGgpO1xuICAgIH1cbiAgICByZXR1cm4gJGdseXBoO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Q29sb3JGcm9tQW5zaUluZGV4KGlkeDogbnVtYmVyKTogSUNvbG9yIHtcbiAgICBpZiAoaWR4ID49IHRoaXMuX2NvbmZpZy5jb2xvcnMuYW5zaS5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gY29sb3IgZm91bmQgZm9yIGlkeCAnICsgaWR4KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5jb2xvcnMuYW5zaVtpZHhdO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0QmFja2dyb3VuZENvbG9yKGJnQ29sb3JNb2RlOiBudW1iZXIsIGJnQ29sb3I6IG51bWJlciwgaW52ZXJzZTogYm9vbGVhbiwgZGltOiBib29sZWFuKTogSUNvbG9yIHtcbiAgICBpZiAodGhpcy5fY29uZmlnLmFsbG93VHJhbnNwYXJlbmN5KSB7XG4gICAgICAvLyBUaGUgYmFja2dyb3VuZCBjb2xvciBtaWdodCBoYXZlIHNvbWUgdHJhbnNwYXJlbmN5LCBzbyB3ZSBuZWVkIHRvIHJlbmRlciBpdCBhcyBmdWxseVxuICAgICAgLy8gdHJhbnNwYXJlbnQgaW4gdGhlIGF0bGFzLiBPdGhlcndpc2Ugd2UnZCBlbmQgdXAgZHJhd2luZyB0aGUgdHJhbnNwYXJlbnQgYmFja2dyb3VuZCB0d2ljZVxuICAgICAgLy8gYXJvdW5kIHRoZSBhbnRpLWFsaWFzZWQgZWRnZXMgb2YgdGhlIGdseXBoLCBhbmQgaXQgd291bGQgbG9vayB0b28gZGFyay5cbiAgICAgIHJldHVybiBOVUxMX0NPTE9SO1xuICAgIH1cblxuICAgIGxldCByZXN1bHQ6IElDb2xvcjtcbiAgICBzd2l0Y2ggKGJnQ29sb3JNb2RlKSB7XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDE2OlxuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AyNTY6XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuX2dldENvbG9yRnJvbUFuc2lJbmRleChiZ0NvbG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUkdCOlxuICAgICAgICBjb25zdCBhcnIgPSBBdHRyaWJ1dGVEYXRhLnRvQ29sb3JSR0IoYmdDb2xvcik7XG4gICAgICAgIHJlc3VsdCA9IGNoYW5uZWxzLnRvQ29sb3IoYXJyWzBdLCBhcnJbMV0sIGFyclsyXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX0RFRkFVTFQ6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoaW52ZXJzZSkge1xuICAgICAgICAgIHJlc3VsdCA9IGNvbG9yLm9wYXF1ZSh0aGlzLl9jb25maWcuY29sb3JzLmZvcmVncm91bmQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCA9IHRoaXMuX2NvbmZpZy5jb2xvcnMuYmFja2dyb3VuZDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Rm9yZWdyb3VuZENvbG9yKGJnOiBudW1iZXIsIGJnQ29sb3JNb2RlOiBudW1iZXIsIGJnQ29sb3I6IG51bWJlciwgZmc6IG51bWJlciwgZmdDb2xvck1vZGU6IG51bWJlciwgZmdDb2xvcjogbnVtYmVyLCBpbnZlcnNlOiBib29sZWFuLCBkaW06IGJvb2xlYW4sIGJvbGQ6IGJvb2xlYW4sIGV4Y2x1ZGVGcm9tQ29udHJhc3RSYXRpb0RlbWFuZHM6IGJvb2xlYW4pOiBJQ29sb3Ige1xuICAgIGNvbnN0IG1pbmltdW1Db250cmFzdENvbG9yID0gdGhpcy5fZ2V0TWluaW11bUNvbnRyYXN0Q29sb3IoYmcsIGJnQ29sb3JNb2RlLCBiZ0NvbG9yLCBmZywgZmdDb2xvck1vZGUsIGZnQ29sb3IsIGludmVyc2UsIGJvbGQsIGRpbSwgZXhjbHVkZUZyb21Db250cmFzdFJhdGlvRGVtYW5kcyk7XG4gICAgaWYgKG1pbmltdW1Db250cmFzdENvbG9yKSB7XG4gICAgICByZXR1cm4gbWluaW11bUNvbnRyYXN0Q29sb3I7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdDogSUNvbG9yO1xuICAgIHN3aXRjaCAoZmdDb2xvck1vZGUpIHtcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjpcbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5kcmF3Qm9sZFRleHRJbkJyaWdodENvbG9ycyAmJiBib2xkICYmIGZnQ29sb3IgPCA4KSB7XG4gICAgICAgICAgZmdDb2xvciArPSA4O1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuX2dldENvbG9yRnJvbUFuc2lJbmRleChmZ0NvbG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUkdCOlxuICAgICAgICBjb25zdCBhcnIgPSBBdHRyaWJ1dGVEYXRhLnRvQ29sb3JSR0IoZmdDb2xvcik7XG4gICAgICAgIHJlc3VsdCA9IGNoYW5uZWxzLnRvQ29sb3IoYXJyWzBdLCBhcnJbMV0sIGFyclsyXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX0RFRkFVTFQ6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoaW52ZXJzZSkge1xuICAgICAgICAgIHJlc3VsdCA9IHRoaXMuX2NvbmZpZy5jb2xvcnMuYmFja2dyb3VuZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgPSB0aGlzLl9jb25maWcuY29sb3JzLmZvcmVncm91bmQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBbHdheXMgdXNlIGFuIG9wYXF1ZSBjb2xvciByZWdhcmRsZXNzIG9mIGFsbG93VHJhbnNwYXJlbmN5XG4gICAgaWYgKHRoaXMuX2NvbmZpZy5hbGxvd1RyYW5zcGFyZW5jeSkge1xuICAgICAgcmVzdWx0ID0gY29sb3Iub3BhcXVlKHJlc3VsdCk7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgZGltIHRvIHRoZSBjb2xvciwgb3BhY2l0eSBpcyBmaW5lIHRvIHVzZSBmb3IgdGhlIGZvcmVncm91bmQgY29sb3JcbiAgICBpZiAoZGltKSB7XG4gICAgICByZXN1bHQgPSBjb2xvci5tdWx0aXBseU9wYWNpdHkocmVzdWx0LCBESU1fT1BBQ0lUWSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc29sdmVCYWNrZ3JvdW5kUmdiYShiZ0NvbG9yTW9kZTogbnVtYmVyLCBiZ0NvbG9yOiBudW1iZXIsIGludmVyc2U6IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIHN3aXRjaCAoYmdDb2xvck1vZGUpIHtcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldENvbG9yRnJvbUFuc2lJbmRleChiZ0NvbG9yKS5yZ2JhO1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1JHQjpcbiAgICAgICAgcmV0dXJuIGJnQ29sb3IgPDwgODtcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9ERUZBVUxUOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGludmVyc2UpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlnLmNvbG9ycy5mb3JlZ3JvdW5kLnJnYmE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5jb2xvcnMuYmFja2dyb3VuZC5yZ2JhO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Jlc29sdmVGb3JlZ3JvdW5kUmdiYShmZ0NvbG9yTW9kZTogbnVtYmVyLCBmZ0NvbG9yOiBudW1iZXIsIGludmVyc2U6IGJvb2xlYW4sIGJvbGQ6IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIHN3aXRjaCAoZmdDb2xvck1vZGUpIHtcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjpcbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5kcmF3Qm9sZFRleHRJbkJyaWdodENvbG9ycyAmJiBib2xkICYmIGZnQ29sb3IgPCA4KSB7XG4gICAgICAgICAgZmdDb2xvciArPSA4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRDb2xvckZyb21BbnNpSW5kZXgoZmdDb2xvcikucmdiYTtcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9SR0I6XG4gICAgICAgIHJldHVybiBmZ0NvbG9yIDw8IDg7XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fREVGQVVMVDpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChpbnZlcnNlKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5jb2xvcnMuYmFja2dyb3VuZC5yZ2JhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maWcuY29sb3JzLmZvcmVncm91bmQucmdiYTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZXRNaW5pbXVtQ29udHJhc3RDb2xvcihiZzogbnVtYmVyLCBiZ0NvbG9yTW9kZTogbnVtYmVyLCBiZ0NvbG9yOiBudW1iZXIsIGZnOiBudW1iZXIsIGZnQ29sb3JNb2RlOiBudW1iZXIsIGZnQ29sb3I6IG51bWJlciwgaW52ZXJzZTogYm9vbGVhbiwgYm9sZDogYm9vbGVhbiwgZGltOiBib29sZWFuLCBleGNsdWRlRnJvbUNvbnRyYXN0UmF0aW9EZW1hbmRzOiBib29sZWFuKTogSUNvbG9yIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5fY29uZmlnLm1pbmltdW1Db250cmFzdFJhdGlvID09PSAxIHx8IGV4Y2x1ZGVGcm9tQ29udHJhc3RSYXRpb0RlbWFuZHMpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gVHJ5IGdldCBmcm9tIGNhY2hlIGZpcnN0XG4gICAgY29uc3QgY2FjaGUgPSB0aGlzLl9nZXRDb250cmFzdENhY2hlKGRpbSk7XG4gICAgY29uc3QgYWRqdXN0ZWRDb2xvciA9IGNhY2hlLmdldENvbG9yKGJnLCBmZyk7XG4gICAgaWYgKGFkanVzdGVkQ29sb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGFkanVzdGVkQ29sb3IgfHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGJnUmdiYSA9IHRoaXMuX3Jlc29sdmVCYWNrZ3JvdW5kUmdiYShiZ0NvbG9yTW9kZSwgYmdDb2xvciwgaW52ZXJzZSk7XG4gICAgY29uc3QgZmdSZ2JhID0gdGhpcy5fcmVzb2x2ZUZvcmVncm91bmRSZ2JhKGZnQ29sb3JNb2RlLCBmZ0NvbG9yLCBpbnZlcnNlLCBib2xkKTtcbiAgICAvLyBEaW0gY2VsbHMgb25seSByZXF1aXJlIGhhbGYgdGhlIGNvbnRyYXN0LCBvdGhlcndpc2UgdGhleSB3b3VsZG4ndCBiZSBkaXN0aW5ndWlzaGFibGUgZnJvbVxuICAgIC8vIG5vbi1kaW0gY2VsbHNcbiAgICBjb25zdCByZXN1bHQgPSByZ2JhLmVuc3VyZUNvbnRyYXN0UmF0aW8oYmdSZ2JhLCBmZ1JnYmEsIHRoaXMuX2NvbmZpZy5taW5pbXVtQ29udHJhc3RSYXRpbyAvIChkaW0gPyAyIDogMSkpO1xuXG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIGNhY2hlLnNldENvbG9yKGJnLCBmZywgbnVsbCk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbG9yID0gY2hhbm5lbHMudG9Db2xvcihcbiAgICAgIChyZXN1bHQgPj4gMjQpICYgMHhGRixcbiAgICAgIChyZXN1bHQgPj4gMTYpICYgMHhGRixcbiAgICAgIChyZXN1bHQgPj4gOCkgJiAweEZGXG4gICAgKTtcbiAgICBjYWNoZS5zZXRDb2xvcihiZywgZmcsIGNvbG9yKTtcblxuICAgIHJldHVybiBjb2xvcjtcbiAgfVxuXG4gIHByaXZhdGUgX2dldENvbnRyYXN0Q2FjaGUoZGltOiBib29sZWFuKTogSUNvbG9yQ29udHJhc3RDYWNoZSB7XG4gICAgaWYgKGRpbSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5jb2xvcnMuaGFsZkNvbnRyYXN0Q2FjaGU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jb25maWcuY29sb3JzLmNvbnRyYXN0Q2FjaGU7XG4gIH1cblxuICBwcml2YXRlIF9kcmF3VG9DYWNoZShjb2RlT3JDaGFyczogbnVtYmVyIHwgc3RyaW5nLCBiZzogbnVtYmVyLCBmZzogbnVtYmVyLCBleHQ6IG51bWJlciwgcmVzdHJpY3RUb0NlbGxIZWlnaHQ6IGJvb2xlYW4gPSBmYWxzZSk6IElSYXN0ZXJpemVkR2x5cGgge1xuICAgIGNvbnN0IGNoYXJzID0gdHlwZW9mIGNvZGVPckNoYXJzID09PSAnbnVtYmVyJyA/IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZU9yQ2hhcnMpIDogY29kZU9yQ2hhcnM7XG5cbiAgICAvLyBVbmNvbW1lbnQgZm9yIGRlYnVnZ2luZ1xuICAgIC8vIGNvbnNvbGUubG9nKGBkcmF3IHRvIGNhY2hlIFwiJHtjaGFyc31cImAsIGJnLCBmZywgZXh0KTtcblxuICAgIC8vIEFsbG93IDEgY2VsbCB3aWR0aCBwZXIgY2hhcmFjdGVyLCB3aXRoIGEgbWluaW11bSBvZiAyIChDSkspLCBwbHVzIHNvbWUgcGFkZGluZy4gVGhpcyBpcyB1c2VkXG4gICAgLy8gdG8gZHJhdyB0aGUgZ2x5cGggdG8gdGhlIGNhbnZhcyBhcyB3ZWxsIGFzIHRvIHJlc3RyaWN0IHRoZSBib3VuZGluZyBib3ggc2VhcmNoIHRvIGVuc3VyZVxuICAgIC8vIGdpYW50IGxpZ2F0dXJlcyAoZWcuID09PT09PikgZG9uJ3QgaW1wYWN0IG92ZXJhbGwgcGVyZm9ybWFuY2UuXG4gICAgY29uc3QgYWxsb3dlZFdpZHRoID0gTWF0aC5taW4odGhpcy5fY29uZmlnLmRldmljZUNlbGxXaWR0aCAqIE1hdGgubWF4KGNoYXJzLmxlbmd0aCwgMikgKyBUTVBfQ0FOVkFTX0dMWVBIX1BBRERJTkcgKiAyLCB0aGlzLl90ZXh0dXJlU2l6ZSk7XG4gICAgaWYgKHRoaXMuX3RtcENhbnZhcy53aWR0aCA8IGFsbG93ZWRXaWR0aCkge1xuICAgICAgdGhpcy5fdG1wQ2FudmFzLndpZHRoID0gYWxsb3dlZFdpZHRoO1xuICAgIH1cbiAgICAvLyBJbmNsdWRlIGxpbmUgaGVpZ2h0IHdoZW4gZHJhd2luZyBnbHlwaHNcbiAgICBjb25zdCBhbGxvd2VkSGVpZ2h0ID0gTWF0aC5taW4odGhpcy5fY29uZmlnLmRldmljZUNlbGxIZWlnaHQgKyBUTVBfQ0FOVkFTX0dMWVBIX1BBRERJTkcgKiA0LCB0aGlzLl90ZXh0dXJlU2l6ZSk7XG4gICAgaWYgKHRoaXMuX3RtcENhbnZhcy5oZWlnaHQgPCBhbGxvd2VkSGVpZ2h0KSB7XG4gICAgICB0aGlzLl90bXBDYW52YXMuaGVpZ2h0ID0gYWxsb3dlZEhlaWdodDtcbiAgICB9XG4gICAgdGhpcy5fdG1wQ3R4LnNhdmUoKTtcblxuICAgIHRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmZnID0gZmc7XG4gICAgdGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuYmcgPSBiZztcbiAgICB0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5leHRlbmRlZC5leHQgPSBleHQ7XG5cbiAgICBjb25zdCBpbnZpc2libGUgPSAhIXRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmlzSW52aXNpYmxlKCk7XG4gICAgaWYgKGludmlzaWJsZSkge1xuICAgICAgcmV0dXJuIE5VTExfUkFTVEVSSVpFRF9HTFlQSDtcbiAgICB9XG5cbiAgICBjb25zdCBib2xkID0gISF0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5pc0JvbGQoKTtcbiAgICBjb25zdCBpbnZlcnNlID0gISF0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5pc0ludmVyc2UoKTtcbiAgICBjb25zdCBkaW0gPSAhIXRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmlzRGltKCk7XG4gICAgY29uc3QgaXRhbGljID0gISF0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5pc0l0YWxpYygpO1xuICAgIGNvbnN0IHVuZGVybGluZSA9ICEhdGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuaXNVbmRlcmxpbmUoKTtcbiAgICBjb25zdCBzdHJpa2V0aHJvdWdoID0gISF0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5pc1N0cmlrZXRocm91Z2goKTtcbiAgICBjb25zdCBvdmVybGluZSA9ICEhdGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuaXNPdmVybGluZSgpO1xuICAgIGxldCBmZ0NvbG9yID0gdGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuZ2V0RmdDb2xvcigpO1xuICAgIGxldCBmZ0NvbG9yTW9kZSA9IHRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmdldEZnQ29sb3JNb2RlKCk7XG4gICAgbGV0IGJnQ29sb3IgPSB0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5nZXRCZ0NvbG9yKCk7XG4gICAgbGV0IGJnQ29sb3JNb2RlID0gdGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuZ2V0QmdDb2xvck1vZGUoKTtcbiAgICBpZiAoaW52ZXJzZSkge1xuICAgICAgY29uc3QgdGVtcCA9IGZnQ29sb3I7XG4gICAgICBmZ0NvbG9yID0gYmdDb2xvcjtcbiAgICAgIGJnQ29sb3IgPSB0ZW1wO1xuICAgICAgY29uc3QgdGVtcDIgPSBmZ0NvbG9yTW9kZTtcbiAgICAgIGZnQ29sb3JNb2RlID0gYmdDb2xvck1vZGU7XG4gICAgICBiZ0NvbG9yTW9kZSA9IHRlbXAyO1xuICAgIH1cblxuICAgIC8vIGRyYXcgdGhlIGJhY2tncm91bmRcbiAgICBjb25zdCBiYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLl9nZXRCYWNrZ3JvdW5kQ29sb3IoYmdDb2xvck1vZGUsIGJnQ29sb3IsIGludmVyc2UsIGRpbSk7XG4gICAgLy8gVXNlIGEgJ2NvcHknIGNvbXBvc2l0ZSBvcGVyYXRpb24gdG8gY2xlYXIgYW55IGV4aXN0aW5nIGdseXBoIG91dCBvZiBfdG1wQ3R4V2l0aEFscGhhLFxuICAgIC8vIHJlZ2FyZGxlc3Mgb2YgdHJhbnNwYXJlbmN5IGluIGJhY2tncm91bmRDb2xvclxuICAgIHRoaXMuX3RtcEN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnY29weSc7XG4gICAgdGhpcy5fdG1wQ3R4LmZpbGxTdHlsZSA9IGJhY2tncm91bmRDb2xvci5jc3M7XG4gICAgdGhpcy5fdG1wQ3R4LmZpbGxSZWN0KDAsIDAsIHRoaXMuX3RtcENhbnZhcy53aWR0aCwgdGhpcy5fdG1wQ2FudmFzLmhlaWdodCk7XG4gICAgdGhpcy5fdG1wQ3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdzb3VyY2Utb3Zlcic7XG5cbiAgICAvLyBkcmF3IHRoZSBmb3JlZ3JvdW5kL2dseXBoXG4gICAgY29uc3QgZm9udFdlaWdodCA9IGJvbGQgPyB0aGlzLl9jb25maWcuZm9udFdlaWdodEJvbGQgOiB0aGlzLl9jb25maWcuZm9udFdlaWdodDtcbiAgICBjb25zdCBmb250U3R5bGUgPSBpdGFsaWMgPyAnaXRhbGljJyA6ICcnO1xuICAgIHRoaXMuX3RtcEN0eC5mb250ID1cbiAgICAgIGAke2ZvbnRTdHlsZX0gJHtmb250V2VpZ2h0fSAke3RoaXMuX2NvbmZpZy5mb250U2l6ZSAqIHRoaXMuX2NvbmZpZy5kZXZpY2VQaXhlbFJhdGlvfXB4ICR7dGhpcy5fY29uZmlnLmZvbnRGYW1pbHl9YDtcbiAgICB0aGlzLl90bXBDdHgudGV4dEJhc2VsaW5lID0gVEVYVF9CQVNFTElORTtcblxuICAgIGNvbnN0IHBvd2VybGluZUdseXBoID0gY2hhcnMubGVuZ3RoID09PSAxICYmIGlzUG93ZXJsaW5lR2x5cGgoY2hhcnMuY2hhckNvZGVBdCgwKSk7XG4gICAgY29uc3QgcmVzdHJpY3RlZFBvd2VybGluZUdseXBoID0gY2hhcnMubGVuZ3RoID09PSAxICYmIGlzUmVzdHJpY3RlZFBvd2VybGluZUdseXBoKGNoYXJzLmNoYXJDb2RlQXQoMCkpO1xuICAgIGNvbnN0IGZvcmVncm91bmRDb2xvciA9IHRoaXMuX2dldEZvcmVncm91bmRDb2xvcihiZywgYmdDb2xvck1vZGUsIGJnQ29sb3IsIGZnLCBmZ0NvbG9yTW9kZSwgZmdDb2xvciwgaW52ZXJzZSwgZGltLCBib2xkLCB0cmVhdEdseXBoQXNCYWNrZ3JvdW5kQ29sb3IoY2hhcnMuY2hhckNvZGVBdCgwKSkpO1xuICAgIHRoaXMuX3RtcEN0eC5maWxsU3R5bGUgPSBmb3JlZ3JvdW5kQ29sb3IuY3NzO1xuXG4gICAgLy8gRm9yIHBvd2VybGluZSBnbHlwaHMgbGVmdC90b3AgcGFkZGluZyBpcyBleGNsdWRlZCAoaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC92c2NvZGUvaXNzdWVzLzEyMDEyOSlcbiAgICBjb25zdCBwYWRkaW5nID0gcmVzdHJpY3RlZFBvd2VybGluZUdseXBoID8gMCA6IFRNUF9DQU5WQVNfR0xZUEhfUEFERElORyAqIDI7XG5cbiAgICAvLyBEcmF3IGN1c3RvbSBjaGFyYWN0ZXJzIGlmIGFwcGxpY2FibGVcbiAgICBsZXQgY3VzdG9tR2x5cGggPSBmYWxzZTtcbiAgICBpZiAodGhpcy5fY29uZmlnLmN1c3RvbUdseXBocyAhPT0gZmFsc2UpIHtcbiAgICAgIGN1c3RvbUdseXBoID0gdHJ5RHJhd0N1c3RvbUNoYXIodGhpcy5fdG1wQ3R4LCBjaGFycywgcGFkZGluZywgcGFkZGluZywgdGhpcy5fY29uZmlnLmRldmljZUNlbGxXaWR0aCwgdGhpcy5fY29uZmlnLmRldmljZUNlbGxIZWlnaHQsIHRoaXMuX2NvbmZpZy5mb250U2l6ZSwgdGhpcy5fY29uZmlnLmRldmljZVBpeGVsUmF0aW8pO1xuICAgIH1cblxuICAgIC8vIFdoZXRoZXIgdG8gY2xlYXIgcGl4ZWxzIGJhc2VkIG9uIGEgdGhyZXNob2xkIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZ2x5cGggY29sb3IgYW5kIHRoZVxuICAgIC8vIGJhY2tncm91bmQgY29sb3IuIFRoaXMgc2hvdWxkIGJlIGRpc2FibGVkIHdoZW4gdGhlIGdseXBoIGNvbnRhaW5zIG11bHRpcGxlIGNvbG9ycyBzdWNoIGFzXG4gICAgLy8gdW5kZXJsaW5lIGNvbG9ycyB0byBwcmV2ZW50IGltcG9ydGFudCBjb2xvcnMgY291bGQgZ2V0IGNsZWFyZWQuXG4gICAgbGV0IGVuYWJsZUNsZWFyVGhyZXNob2xkQ2hlY2sgPSAhcG93ZXJsaW5lR2x5cGg7XG5cbiAgICBsZXQgY2hXaWR0aDogbnVtYmVyO1xuICAgIGlmICh0eXBlb2YgY29kZU9yQ2hhcnMgPT09ICdudW1iZXInKSB7XG4gICAgICBjaFdpZHRoID0gdGhpcy5fdW5pY29kZVNlcnZpY2Uud2N3aWR0aChjb2RlT3JDaGFycyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoV2lkdGggPSB0aGlzLl91bmljb2RlU2VydmljZS5nZXRTdHJpbmdDZWxsV2lkdGgoY29kZU9yQ2hhcnMpO1xuICAgIH1cblxuICAgIC8vIERyYXcgdW5kZXJsaW5lXG4gICAgaWYgKHVuZGVybGluZSkge1xuICAgICAgdGhpcy5fdG1wQ3R4LnNhdmUoKTtcbiAgICAgIGNvbnN0IGxpbmVXaWR0aCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IodGhpcy5fY29uZmlnLmZvbnRTaXplICogdGhpcy5fY29uZmlnLmRldmljZVBpeGVsUmF0aW8gLyAxNSkpO1xuICAgICAgLy8gV2hlbiB0aGUgbGluZSB3aWR0aCBpcyBvZGQsIGRyYXcgYXQgYSAwLjUgcG9zaXRpb25cbiAgICAgIGNvbnN0IHlPZmZzZXQgPSBsaW5lV2lkdGggJSAyID09PSAxID8gMC41IDogMDtcbiAgICAgIHRoaXMuX3RtcEN0eC5saW5lV2lkdGggPSBsaW5lV2lkdGg7XG5cbiAgICAgIC8vIFVuZGVybGluZSBjb2xvclxuICAgICAgaWYgKHRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmlzVW5kZXJsaW5lQ29sb3JEZWZhdWx0KCkpIHtcbiAgICAgICAgdGhpcy5fdG1wQ3R4LnN0cm9rZVN0eWxlID0gdGhpcy5fdG1wQ3R4LmZpbGxTdHlsZTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuaXNVbmRlcmxpbmVDb2xvclJHQigpKSB7XG4gICAgICAgIGVuYWJsZUNsZWFyVGhyZXNob2xkQ2hlY2sgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fdG1wQ3R4LnN0cm9rZVN0eWxlID0gYHJnYigke0F0dHJpYnV0ZURhdGEudG9Db2xvclJHQih0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5nZXRVbmRlcmxpbmVDb2xvcigpKS5qb2luKCcsJyl9KWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbmFibGVDbGVhclRocmVzaG9sZENoZWNrID0gZmFsc2U7XG4gICAgICAgIGxldCBmZyA9IHRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmdldFVuZGVybGluZUNvbG9yKCk7XG4gICAgICAgIGlmICh0aGlzLl9jb25maWcuZHJhd0JvbGRUZXh0SW5CcmlnaHRDb2xvcnMgJiYgdGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuaXNCb2xkKCkgJiYgZmcgPCA4KSB7XG4gICAgICAgICAgZmcgKz0gODtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90bXBDdHguc3Ryb2tlU3R5bGUgPSB0aGlzLl9nZXRDb2xvckZyb21BbnNpSW5kZXgoZmcpLmNzcztcbiAgICAgIH1cblxuICAgICAgLy8gVW5kZXJsaW5lIHN0eWxlL3N0cm9rZVxuICAgICAgdGhpcy5fdG1wQ3R4LmJlZ2luUGF0aCgpO1xuICAgICAgY29uc3QgeExlZnQgPSBwYWRkaW5nO1xuICAgICAgY29uc3QgeVRvcCA9IE1hdGguY2VpbChwYWRkaW5nICsgdGhpcy5fY29uZmlnLmRldmljZUNoYXJIZWlnaHQpIC0geU9mZnNldCAtIChyZXN0cmljdFRvQ2VsbEhlaWdodCA/IGxpbmVXaWR0aCAqIDIgOiAwKTtcbiAgICAgIGNvbnN0IHlNaWQgPSB5VG9wICsgbGluZVdpZHRoO1xuICAgICAgY29uc3QgeUJvdCA9IHlUb3AgKyBsaW5lV2lkdGggKiAyO1xuICAgICAgbGV0IG5leHRPZmZzZXQgPSB0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5nZXRVbmRlcmxpbmVWYXJpYW50T2Zmc2V0KCk7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hXaWR0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuX3RtcEN0eC5zYXZlKCk7XG4gICAgICAgIGNvbnN0IHhDaExlZnQgPSB4TGVmdCArIGkgKiB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbFdpZHRoO1xuICAgICAgICBjb25zdCB4Q2hSaWdodCA9IHhMZWZ0ICsgKGkgKyAxKSAqIHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsV2lkdGg7XG4gICAgICAgIGNvbnN0IHhDaE1pZCA9IHhDaExlZnQgKyB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbFdpZHRoIC8gMjtcbiAgICAgICAgc3dpdGNoICh0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5leHRlbmRlZC51bmRlcmxpbmVTdHlsZSkge1xuICAgICAgICAgIGNhc2UgVW5kZXJsaW5lU3R5bGUuRE9VQkxFOlxuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4Lm1vdmVUbyh4Q2hMZWZ0LCB5VG9wKTtcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5saW5lVG8oeENoUmlnaHQsIHlUb3ApO1xuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4Lm1vdmVUbyh4Q2hMZWZ0LCB5Qm90KTtcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5saW5lVG8oeENoUmlnaHQsIHlCb3QpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBVbmRlcmxpbmVTdHlsZS5DVVJMWTpcbiAgICAgICAgICAgIC8vIENob29zZSB0aGUgYmV6aWVyIHRvcCBhbmQgYm90dG9tIGJhc2VkIG9uIHRoZSBkZXZpY2UgcGl4ZWwgcmF0aW8sIHRoZSBjdXJseSBsaW5lIGlzXG4gICAgICAgICAgICAvLyBtYWRlIHRhbGxlciB3aGVuIHRoZSBsaW5lIHdpZHRoIGlzICBhcyBvdGhlcndpc2UgaXQncyBub3QgdmVyeSBjbGVhciBvdGhlcndpc2UuXG4gICAgICAgICAgICBjb25zdCB5Q3VybHlCb3QgPSBsaW5lV2lkdGggPD0gMSA/IHlCb3QgOiBNYXRoLmNlaWwocGFkZGluZyArIHRoaXMuX2NvbmZpZy5kZXZpY2VDaGFySGVpZ2h0IC0gbGluZVdpZHRoIC8gMikgLSB5T2Zmc2V0O1xuICAgICAgICAgICAgY29uc3QgeUN1cmx5VG9wID0gbGluZVdpZHRoIDw9IDEgPyB5VG9wIDogTWF0aC5jZWlsKHBhZGRpbmcgKyB0aGlzLl9jb25maWcuZGV2aWNlQ2hhckhlaWdodCArIGxpbmVXaWR0aCAvIDIpIC0geU9mZnNldDtcbiAgICAgICAgICAgIC8vIENsaXAgdGhlIGxlZnQgYW5kIHJpZ2h0IGVkZ2VzIG9mIHRoZSB1bmRlcmxpbmUgc3VjaCB0aGF0IGl0IGNhbiBiZSBkcmF3biBqdXN0IG91dHNpZGVcbiAgICAgICAgICAgIC8vIHRoZSBlZGdlIG9mIHRoZSBjZWxsIHRvIGVuc3VyZSBhIGNvbnRpbnVvdXMgc3Ryb2tlIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIHVuZGVybGluZWRcbiAgICAgICAgICAgIC8vIGdseXBocyBhZGphY2VudCB0byBvbmUgYW5vdGhlci5cbiAgICAgICAgICAgIGNvbnN0IGNsaXBSZWdpb24gPSBuZXcgUGF0aDJEKCk7XG4gICAgICAgICAgICBjbGlwUmVnaW9uLnJlY3QoeENoTGVmdCwgeVRvcCwgdGhpcy5fY29uZmlnLmRldmljZUNlbGxXaWR0aCwgeUJvdCAtIHlUb3ApO1xuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LmNsaXAoY2xpcFJlZ2lvbik7XG4gICAgICAgICAgICAvLyBTdGFydCAxLzIgY2VsbCBiZWZvcmUgYW5kIGVuZCAxLzIgY2VsbHMgYWZ0ZXIgdG8gZW5zdXJlIGEgc21vb3RoIGN1cnZlIHdpdGggb3RoZXJcbiAgICAgICAgICAgIC8vIGNlbGxzXG4gICAgICAgICAgICB0aGlzLl90bXBDdHgubW92ZVRvKHhDaExlZnQgLSB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbFdpZHRoIC8gMiwgeU1pZCk7XG4gICAgICAgICAgICB0aGlzLl90bXBDdHguYmV6aWVyQ3VydmVUbyhcbiAgICAgICAgICAgICAgeENoTGVmdCAtIHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsV2lkdGggLyAyLCB5Q3VybHlUb3AsXG4gICAgICAgICAgICAgIHhDaExlZnQsIHlDdXJseVRvcCxcbiAgICAgICAgICAgICAgeENoTGVmdCwgeU1pZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5iZXppZXJDdXJ2ZVRvKFxuICAgICAgICAgICAgICB4Q2hMZWZ0LCB5Q3VybHlCb3QsXG4gICAgICAgICAgICAgIHhDaE1pZCwgeUN1cmx5Qm90LFxuICAgICAgICAgICAgICB4Q2hNaWQsIHlNaWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLl90bXBDdHguYmV6aWVyQ3VydmVUbyhcbiAgICAgICAgICAgICAgeENoTWlkLCB5Q3VybHlUb3AsXG4gICAgICAgICAgICAgIHhDaFJpZ2h0LCB5Q3VybHlUb3AsXG4gICAgICAgICAgICAgIHhDaFJpZ2h0LCB5TWlkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LmJlemllckN1cnZlVG8oXG4gICAgICAgICAgICAgIHhDaFJpZ2h0LCB5Q3VybHlCb3QsXG4gICAgICAgICAgICAgIHhDaFJpZ2h0ICsgdGhpcy5fY29uZmlnLmRldmljZUNlbGxXaWR0aCAvIDIsIHlDdXJseUJvdCxcbiAgICAgICAgICAgICAgeENoUmlnaHQgKyB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbFdpZHRoIC8gMiwgeU1pZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgVW5kZXJsaW5lU3R5bGUuRE9UVEVEOlxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0V2lkdGggPSBuZXh0T2Zmc2V0ID09PSAwID8gMCA6XG4gICAgICAgICAgICAgIChuZXh0T2Zmc2V0ID49IGxpbmVXaWR0aCA/IGxpbmVXaWR0aCAqIDIgLSBuZXh0T2Zmc2V0IDogbGluZVdpZHRoIC0gbmV4dE9mZnNldCk7XG4gICAgICAgICAgICAgIC8vIGEgbGluZSBhbmQgYSBnYXAuXG4gICAgICAgICAgICBjb25zdCBpc0xpbmVTdGFydCA9IG5leHRPZmZzZXQgPj0gbGluZVdpZHRoID8gZmFsc2UgOiB0cnVlO1xuICAgICAgICAgICAgaWYgKGlzTGluZVN0YXJ0ID09PSBmYWxzZSB8fCBvZmZzZXRXaWR0aCA9PT0gMCkge1xuICAgICAgICAgICAgICB0aGlzLl90bXBDdHguc2V0TGluZURhc2goW01hdGgucm91bmQobGluZVdpZHRoKSwgTWF0aC5yb3VuZChsaW5lV2lkdGgpXSk7XG4gICAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5tb3ZlVG8oeENoTGVmdCArIG9mZnNldFdpZHRoLCB5VG9wKTtcbiAgICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LmxpbmVUbyh4Q2hSaWdodCwgeVRvcCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLl90bXBDdHguc2V0TGluZURhc2goW01hdGgucm91bmQobGluZVdpZHRoKSwgTWF0aC5yb3VuZChsaW5lV2lkdGgpXSk7XG4gICAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5tb3ZlVG8oeENoTGVmdCwgeVRvcCk7XG4gICAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5saW5lVG8oeENoTGVmdCArIG9mZnNldFdpZHRoLCB5VG9wKTtcbiAgICAgICAgICAgICAgdGhpcy5fdG1wQ3R4Lm1vdmVUbyh4Q2hMZWZ0ICsgb2Zmc2V0V2lkdGggKyBsaW5lV2lkdGgsIHlUb3ApO1xuICAgICAgICAgICAgICB0aGlzLl90bXBDdHgubGluZVRvKHhDaFJpZ2h0LCB5VG9wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5leHRPZmZzZXQgPSBjb21wdXRlTmV4dFZhcmlhbnRPZmZzZXQoeENoUmlnaHQgLSB4Q2hMZWZ0LCBsaW5lV2lkdGgsIG5leHRPZmZzZXQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBVbmRlcmxpbmVTdHlsZS5EQVNIRUQ6XG4gICAgICAgICAgICBjb25zdCBsaW5lUmF0aW8gPSAwLjY7XG4gICAgICAgICAgICBjb25zdCBnYXBSYXRpbyA9IDAuMztcbiAgICAgICAgICAgIC8vIEVuZCBsaW5lIHJhdGlvIGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gMC4xXG4gICAgICAgICAgICBjb25zdCB4Q2hXaWR0aCA9IHhDaFJpZ2h0IC0geENoTGVmdDtcbiAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBNYXRoLmZsb29yKGxpbmVSYXRpbyAqIHhDaFdpZHRoKTtcbiAgICAgICAgICAgIGNvbnN0IGdhcCA9IE1hdGguZmxvb3IoZ2FwUmF0aW8gKiB4Q2hXaWR0aCk7XG4gICAgICAgICAgICBjb25zdCBlbmQgPSB4Q2hXaWR0aCAtIGxpbmUgLSBnYXA7XG4gICAgICAgICAgICB0aGlzLl90bXBDdHguc2V0TGluZURhc2goW2xpbmUsIGdhcCwgZW5kXSk7XG4gICAgICAgICAgICB0aGlzLl90bXBDdHgubW92ZVRvKHhDaExlZnQsIHlUb3ApO1xuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LmxpbmVUbyh4Q2hSaWdodCwgeVRvcCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFVuZGVybGluZVN0eWxlLlNJTkdMRTpcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4Lm1vdmVUbyh4Q2hMZWZ0LCB5VG9wKTtcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5saW5lVG8oeENoUmlnaHQsIHlUb3ApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdG1wQ3R4LnN0cm9rZSgpO1xuICAgICAgICB0aGlzLl90bXBDdHgucmVzdG9yZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5fdG1wQ3R4LnJlc3RvcmUoKTtcblxuICAgICAgLy8gRHJhdyBzdHJva2UgaW4gdGhlIGJhY2tncm91bmQgY29sb3IgZm9yIG5vbiBjdXN0b20gY2hhcmFjdGVycyBpbiBvcmRlciB0byBnaXZlIGFuIG91dGxpbmVcbiAgICAgIC8vIGJldHdlZW4gdGhlIHRleHQgYW5kIHRoZSB1bmRlcmxpbmUuIE9ubHkgZG8gdGhpcyB3aGVuIGZvbnQgc2l6ZSBpcyA+PSAxMiBhcyB0aGUgdW5kZXJsaW5lXG4gICAgICAvLyBsb29rcyBvZGQgd2hlbiB0aGUgZm9udCBzaXplIGlzIHRvbyBzbWFsbFxuICAgICAgaWYgKCFjdXN0b21HbHlwaCAmJiB0aGlzLl9jb25maWcuZm9udFNpemUgPj0gMTIpIHtcbiAgICAgICAgLy8gVGhpcyBvbmx5IHdvcmtzIHdoZW4gdHJhbnNwYXJlbmN5IGlzIGRpc2FibGVkIGJlY2F1c2UgaXQncyBub3QgY2xlYXIgaG93IHRvIGNsZWFyIHN0cm9rZWRcbiAgICAgICAgLy8gdGV4dFxuICAgICAgICBpZiAoIXRoaXMuX2NvbmZpZy5hbGxvd1RyYW5zcGFyZW5jeSAmJiBjaGFycyAhPT0gJyAnKSB7XG4gICAgICAgICAgLy8gTWVhc3VyZSB0aGUgdGV4dCwgb25seSBkcmF3IHRoZSBzdHJva2UgaWYgdGhlcmUgaXMgYSBkZXNjZW50IGJleW9uZCBhbiBhbHBoYWJldGljIHRleHRcbiAgICAgICAgICAvLyBiYXNlbGluZVxuICAgICAgICAgIHRoaXMuX3RtcEN0eC5zYXZlKCk7XG4gICAgICAgICAgdGhpcy5fdG1wQ3R4LnRleHRCYXNlbGluZSA9ICdhbHBoYWJldGljJztcbiAgICAgICAgICBjb25zdCBtZXRyaWNzID0gdGhpcy5fdG1wQ3R4Lm1lYXN1cmVUZXh0KGNoYXJzKTtcbiAgICAgICAgICB0aGlzLl90bXBDdHgucmVzdG9yZSgpO1xuICAgICAgICAgIGlmICgnYWN0dWFsQm91bmRpbmdCb3hEZXNjZW50JyBpbiBtZXRyaWNzICYmIG1ldHJpY3MuYWN0dWFsQm91bmRpbmdCb3hEZXNjZW50ID4gMCkge1xuICAgICAgICAgICAgLy8gVGhpcyB0cmFuc2xhdGVzIHRvIDEvMiB0aGUgbGluZSB3aWR0aCBpbiBlaXRoZXIgZGlyZWN0aW9uXG4gICAgICAgICAgICB0aGlzLl90bXBDdHguc2F2ZSgpO1xuICAgICAgICAgICAgLy8gQ2xpcCB0aGUgcmVnaW9uIHRvIG9ubHkgZHJhdyBpbiB2YWxpZCBwaXhlbHMgbmVhciB0aGUgdW5kZXJsaW5lIHRvIGF2b2lkIGEgc2xpZ2h0XG4gICAgICAgICAgICAvLyBvdXRsaW5lIGFyb3VuZCB0aGUgd2hvbGUgZ2x5cGgsIGFzIHdlbGwgYXMgYWRkaXRpb25hbCBwaXhlbHMgaW4gdGhlIGdseXBoIGF0IHRoZSB0b3BcbiAgICAgICAgICAgIC8vIHdoaWNoIHdvdWxkIGluY3JlYXNlIEdQVSBtZW1vcnkgZGVtYW5kc1xuICAgICAgICAgICAgY29uc3QgY2xpcFJlZ2lvbiA9IG5ldyBQYXRoMkQoKTtcbiAgICAgICAgICAgIGNsaXBSZWdpb24ucmVjdCh4TGVmdCwgeVRvcCAtIE1hdGguY2VpbChsaW5lV2lkdGggLyAyKSwgdGhpcy5fY29uZmlnLmRldmljZUNlbGxXaWR0aCAqIGNoV2lkdGgsIHlCb3QgLSB5VG9wICsgTWF0aC5jZWlsKGxpbmVXaWR0aCAvIDIpKTtcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5jbGlwKGNsaXBSZWdpb24pO1xuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LmxpbmVXaWR0aCA9IHRoaXMuX2NvbmZpZy5kZXZpY2VQaXhlbFJhdGlvICogMztcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5zdHJva2VTdHlsZSA9IGJhY2tncm91bmRDb2xvci5jc3M7XG4gICAgICAgICAgICB0aGlzLl90bXBDdHguc3Ryb2tlVGV4dChjaGFycywgcGFkZGluZywgcGFkZGluZyArIHRoaXMuX2NvbmZpZy5kZXZpY2VDaGFySGVpZ2h0KTtcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5yZXN0b3JlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT3ZlcmxpbmVcbiAgICBpZiAob3ZlcmxpbmUpIHtcbiAgICAgIGNvbnN0IGxpbmVXaWR0aCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IodGhpcy5fY29uZmlnLmZvbnRTaXplICogdGhpcy5fY29uZmlnLmRldmljZVBpeGVsUmF0aW8gLyAxNSkpO1xuICAgICAgY29uc3QgeU9mZnNldCA9IGxpbmVXaWR0aCAlIDIgPT09IDEgPyAwLjUgOiAwO1xuICAgICAgdGhpcy5fdG1wQ3R4LmxpbmVXaWR0aCA9IGxpbmVXaWR0aDtcbiAgICAgIHRoaXMuX3RtcEN0eC5zdHJva2VTdHlsZSA9IHRoaXMuX3RtcEN0eC5maWxsU3R5bGU7XG4gICAgICB0aGlzLl90bXBDdHguYmVnaW5QYXRoKCk7XG4gICAgICB0aGlzLl90bXBDdHgubW92ZVRvKHBhZGRpbmcsIHBhZGRpbmcgKyB5T2Zmc2V0KTtcbiAgICAgIHRoaXMuX3RtcEN0eC5saW5lVG8ocGFkZGluZyArIHRoaXMuX2NvbmZpZy5kZXZpY2VDaGFyV2lkdGggKiBjaFdpZHRoLCBwYWRkaW5nICsgeU9mZnNldCk7XG4gICAgICB0aGlzLl90bXBDdHguc3Ryb2tlKCk7XG4gICAgfVxuXG4gICAgLy8gRHJhdyB0aGUgY2hhcmFjdGVyXG4gICAgaWYgKCFjdXN0b21HbHlwaCkge1xuICAgICAgdGhpcy5fdG1wQ3R4LmZpbGxUZXh0KGNoYXJzLCBwYWRkaW5nLCBwYWRkaW5nICsgdGhpcy5fY29uZmlnLmRldmljZUNoYXJIZWlnaHQpO1xuICAgIH1cblxuICAgIC8vIElmIHRoaXMgY2hhcmFjdGVyIGlzIHVuZGVyc2NvcmUgYW5kIGJleW9uZCB0aGUgY2VsbCBib3VuZHMsIHNoaWZ0IGl0IHVwIHVudGlsIGl0IGlzIHZpc2libGVcbiAgICAvLyBldmVuIG9uIHRoZSBib3R0b20gcm93LCB0cnkgZm9yIGEgbWF4aW11bSBvZiA1IHBpeGVscy5cbiAgICBpZiAoY2hhcnMgPT09ICdfJyAmJiAhdGhpcy5fY29uZmlnLmFsbG93VHJhbnNwYXJlbmN5KSB7XG4gICAgICBsZXQgaXNCZXlvbmRDZWxsQm91bmRzID0gY2xlYXJDb2xvcih0aGlzLl90bXBDdHguZ2V0SW1hZ2VEYXRhKHBhZGRpbmcsIHBhZGRpbmcsIHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsV2lkdGgsIHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsSGVpZ2h0KSwgYmFja2dyb3VuZENvbG9yLCBmb3JlZ3JvdW5kQ29sb3IsIGVuYWJsZUNsZWFyVGhyZXNob2xkQ2hlY2spO1xuICAgICAgaWYgKGlzQmV5b25kQ2VsbEJvdW5kcykge1xuICAgICAgICBmb3IgKGxldCBvZmZzZXQgPSAxOyBvZmZzZXQgPD0gNTsgb2Zmc2V0KyspIHtcbiAgICAgICAgICB0aGlzLl90bXBDdHguc2F2ZSgpO1xuICAgICAgICAgIHRoaXMuX3RtcEN0eC5maWxsU3R5bGUgPSBiYWNrZ3JvdW5kQ29sb3IuY3NzO1xuICAgICAgICAgIHRoaXMuX3RtcEN0eC5maWxsUmVjdCgwLCAwLCB0aGlzLl90bXBDYW52YXMud2lkdGgsIHRoaXMuX3RtcENhbnZhcy5oZWlnaHQpO1xuICAgICAgICAgIHRoaXMuX3RtcEN0eC5yZXN0b3JlKCk7XG4gICAgICAgICAgdGhpcy5fdG1wQ3R4LmZpbGxUZXh0KGNoYXJzLCBwYWRkaW5nLCBwYWRkaW5nICsgdGhpcy5fY29uZmlnLmRldmljZUNoYXJIZWlnaHQgLSBvZmZzZXQpO1xuICAgICAgICAgIGlzQmV5b25kQ2VsbEJvdW5kcyA9IGNsZWFyQ29sb3IodGhpcy5fdG1wQ3R4LmdldEltYWdlRGF0YShwYWRkaW5nLCBwYWRkaW5nLCB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbFdpZHRoLCB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbEhlaWdodCksIGJhY2tncm91bmRDb2xvciwgZm9yZWdyb3VuZENvbG9yLCBlbmFibGVDbGVhclRocmVzaG9sZENoZWNrKTtcbiAgICAgICAgICBpZiAoIWlzQmV5b25kQ2VsbEJvdW5kcykge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRHJhdyBzdHJva2V0aHJvdWdoXG4gICAgaWYgKHN0cmlrZXRocm91Z2gpIHtcbiAgICAgIGNvbnN0IGxpbmVXaWR0aCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IodGhpcy5fY29uZmlnLmZvbnRTaXplICogdGhpcy5fY29uZmlnLmRldmljZVBpeGVsUmF0aW8gLyAxMCkpO1xuICAgICAgY29uc3QgeU9mZnNldCA9IHRoaXMuX3RtcEN0eC5saW5lV2lkdGggJSAyID09PSAxID8gMC41IDogMDsgLy8gV2hlbiB0aGUgd2lkdGggaXMgb2RkLCBkcmF3IGF0IDAuNSBwb3NpdGlvblxuICAgICAgdGhpcy5fdG1wQ3R4LmxpbmVXaWR0aCA9IGxpbmVXaWR0aDtcbiAgICAgIHRoaXMuX3RtcEN0eC5zdHJva2VTdHlsZSA9IHRoaXMuX3RtcEN0eC5maWxsU3R5bGU7XG4gICAgICB0aGlzLl90bXBDdHguYmVnaW5QYXRoKCk7XG4gICAgICB0aGlzLl90bXBDdHgubW92ZVRvKHBhZGRpbmcsIHBhZGRpbmcgKyBNYXRoLmZsb29yKHRoaXMuX2NvbmZpZy5kZXZpY2VDaGFySGVpZ2h0IC8gMikgLSB5T2Zmc2V0KTtcbiAgICAgIHRoaXMuX3RtcEN0eC5saW5lVG8ocGFkZGluZyArIHRoaXMuX2NvbmZpZy5kZXZpY2VDaGFyV2lkdGggKiBjaFdpZHRoLCBwYWRkaW5nICsgTWF0aC5mbG9vcih0aGlzLl9jb25maWcuZGV2aWNlQ2hhckhlaWdodCAvIDIpIC0geU9mZnNldCk7XG4gICAgICB0aGlzLl90bXBDdHguc3Ryb2tlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fdG1wQ3R4LnJlc3RvcmUoKTtcblxuICAgIC8vIGNsZWFyIHRoZSBiYWNrZ3JvdW5kIGZyb20gdGhlIGNoYXJhY3RlciB0byBhdm9pZCBpc3N1ZXMgd2l0aCBkcmF3aW5nIG92ZXIgdGhlIHByZXZpb3VzXG4gICAgLy8gY2hhcmFjdGVyIGlmIGl0IGV4dGVuZHMgcGFzdCBpdCdzIGJvdW5kc1xuICAgIGNvbnN0IGltYWdlRGF0YSA9IHRoaXMuX3RtcEN0eC5nZXRJbWFnZURhdGEoXG4gICAgICAwLCAwLCB0aGlzLl90bXBDYW52YXMud2lkdGgsIHRoaXMuX3RtcENhbnZhcy5oZWlnaHRcbiAgICApO1xuXG4gICAgLy8gQ2xlYXIgb3V0IHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGFuZCBkZXRlcm1pbmUgaWYgdGhlIGdseXBoIGlzIGVtcHR5LlxuICAgIGxldCBpc0VtcHR5OiBib29sZWFuO1xuICAgIGlmICghdGhpcy5fY29uZmlnLmFsbG93VHJhbnNwYXJlbmN5KSB7XG4gICAgICBpc0VtcHR5ID0gY2xlYXJDb2xvcihpbWFnZURhdGEsIGJhY2tncm91bmRDb2xvciwgZm9yZWdyb3VuZENvbG9yLCBlbmFibGVDbGVhclRocmVzaG9sZENoZWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXNFbXB0eSA9IGNoZWNrQ29tcGxldGVseVRyYW5zcGFyZW50KGltYWdlRGF0YSk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGVtcHR5IGdseXBoc1xuICAgIGlmIChpc0VtcHR5KSB7XG4gICAgICByZXR1cm4gTlVMTF9SQVNURVJJWkVEX0dMWVBIO1xuICAgIH1cblxuICAgIGNvbnN0IHJhc3Rlcml6ZWRHbHlwaCA9IHRoaXMuX2ZpbmRHbHlwaEJvdW5kaW5nQm94KGltYWdlRGF0YSwgdGhpcy5fd29ya0JvdW5kaW5nQm94LCBhbGxvd2VkV2lkdGgsIHJlc3RyaWN0ZWRQb3dlcmxpbmVHbHlwaCwgY3VzdG9tR2x5cGgsIHBhZGRpbmcpO1xuXG4gICAgLy8gRmluZCB0aGUgYmVzdCBhdGxhcyByb3cgdG8gdXNlXG4gICAgbGV0IGFjdGl2ZVBhZ2U6IEF0bGFzUGFnZTtcbiAgICBsZXQgYWN0aXZlUm93OiBJQ2hhckF0bGFzQWN0aXZlUm93O1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gYWN0aXZlIHBhZ2VzICh0aGUgbGFzdCBzbWFsbGVzdCA0IHdlcmUgbWVyZ2VkKSwgY3JlYXRlIGEgbmV3IG9uZVxuICAgICAgaWYgKHRoaXMuX2FjdGl2ZVBhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zdCBuZXdQYWdlID0gdGhpcy5fY3JlYXRlTmV3UGFnZSgpO1xuICAgICAgICBhY3RpdmVQYWdlID0gbmV3UGFnZTtcbiAgICAgICAgYWN0aXZlUm93ID0gbmV3UGFnZS5jdXJyZW50Um93O1xuICAgICAgICBhY3RpdmVSb3cuaGVpZ2h0ID0gcmFzdGVyaXplZEdseXBoLnNpemUueTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCB0aGUgYmVzdCBjdXJyZW50IHJvdyBmcm9tIGFsbCBhY3RpdmUgcGFnZXNcbiAgICAgIGFjdGl2ZVBhZ2UgPSB0aGlzLl9hY3RpdmVQYWdlc1t0aGlzLl9hY3RpdmVQYWdlcy5sZW5ndGggLSAxXTtcbiAgICAgIGFjdGl2ZVJvdyA9IGFjdGl2ZVBhZ2UuY3VycmVudFJvdztcbiAgICAgIGZvciAoY29uc3QgcCBvZiB0aGlzLl9hY3RpdmVQYWdlcykge1xuICAgICAgICBpZiAocmFzdGVyaXplZEdseXBoLnNpemUueSA8PSBwLmN1cnJlbnRSb3cuaGVpZ2h0KSB7XG4gICAgICAgICAgYWN0aXZlUGFnZSA9IHA7XG4gICAgICAgICAgYWN0aXZlUm93ID0gcC5jdXJyZW50Um93O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE86IFRoaXMgYWxnb3JpdGhtIGNvdWxkIGJlIHNpbXBsaWZpZWQ6XG4gICAgICAvLyAtIFNlYXJjaCBmb3IgdGhlIHBhZ2Ugd2l0aCBST1dfUElYRUxfVEhSRVNIT0xEIGluIG1pbmRcbiAgICAgIC8vIC0gS2VlcCB0cmFjayBvZiBjdXJyZW50L2ZpeGVkIHJvd3MgaW4gYSBNYXBcblxuICAgICAgLy8gUmVwbGFjZSB0aGUgYmVzdCBjdXJyZW50IHJvdyB3aXRoIGEgZml4ZWQgcm93IGlmIHRoZXJlIGlzIG9uZSBhdCBsZWFzdCBhcyBnb29kIGFzIHRoZVxuICAgICAgLy8gY3VycmVudCByb3cuIFNlYXJjaCBpbiByZXZlcnNlIHRvIHByaW9yaXRpemUgZmlsbGluZyBpbiBvbGRlciBwYWdlcy5cbiAgICAgIGZvciAobGV0IGkgPSB0aGlzLl9hY3RpdmVQYWdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiB0aGlzLl9hY3RpdmVQYWdlc1tpXS5maXhlZFJvd3MpIHtcbiAgICAgICAgICBpZiAocm93LmhlaWdodCA8PSBhY3RpdmVSb3cuaGVpZ2h0ICYmIHJhc3Rlcml6ZWRHbHlwaC5zaXplLnkgPD0gcm93LmhlaWdodCkge1xuICAgICAgICAgICAgYWN0aXZlUGFnZSA9IHRoaXMuX2FjdGl2ZVBhZ2VzW2ldO1xuICAgICAgICAgICAgYWN0aXZlUm93ID0gcm93O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgcGFnZSBpZiB0b28gbXVjaCB2ZXJ0aWNhbCBzcGFjZSB3b3VsZCBiZSB3YXN0ZWQgb3IgdGhlcmUgaXMgbm90IGVub3VnaCByb29tXG4gICAgICAvLyBsZWZ0IGluIHRoZSBwYWdlLiBUaGUgcHJldmlvdXMgYWN0aXZlIHJvdyB3aWxsIGJlY29tZSBmaXhlZCBpbiB0aGUgcHJvY2VzcyBhcyBpdCBub3cgaGFzIGFcbiAgICAgIC8vIGZpeGVkIGhlaWdodFxuICAgICAgaWYgKGFjdGl2ZVJvdy55ICsgcmFzdGVyaXplZEdseXBoLnNpemUueSA+PSBhY3RpdmVQYWdlLmNhbnZhcy5oZWlnaHQgfHwgYWN0aXZlUm93LmhlaWdodCA+IHJhc3Rlcml6ZWRHbHlwaC5zaXplLnkgKyBDb25zdGFudHMuUk9XX1BJWEVMX1RIUkVTSE9MRCkge1xuICAgICAgICAvLyBDcmVhdGUgdGhlIG5ldyBmaXhlZCBoZWlnaHQgcm93LCBjcmVhdGluZyBhIG5ldyBwYWdlIGlmIHRoZXJlIGlzbid0IGVub3VnaCByb29tIG9uIHRoZVxuICAgICAgICAvLyBjdXJyZW50IHBhZ2VcbiAgICAgICAgbGV0IHdhc1BhZ2VBbmRSb3dGb3VuZCA9IGZhbHNlO1xuICAgICAgICBpZiAoYWN0aXZlUGFnZS5jdXJyZW50Um93LnkgKyBhY3RpdmVQYWdlLmN1cnJlbnRSb3cuaGVpZ2h0ICsgcmFzdGVyaXplZEdseXBoLnNpemUueSA+PSBhY3RpdmVQYWdlLmNhbnZhcy5oZWlnaHQpIHtcbiAgICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBwYWdlIHdpdGggcm9vbSB0byBjcmVhdGUgdGhlIG5ldyByb3cgb25cbiAgICAgICAgICBsZXQgY2FuZGlkYXRlUGFnZTogQXRsYXNQYWdlIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIGZvciAoY29uc3QgcCBvZiB0aGlzLl9hY3RpdmVQYWdlcykge1xuICAgICAgICAgICAgaWYgKHAuY3VycmVudFJvdy55ICsgcC5jdXJyZW50Um93LmhlaWdodCArIHJhc3Rlcml6ZWRHbHlwaC5zaXplLnkgPCBwLmNhbnZhcy5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgY2FuZGlkYXRlUGFnZSA9IHA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY2FuZGlkYXRlUGFnZSkge1xuICAgICAgICAgICAgYWN0aXZlUGFnZSA9IGNhbmRpZGF0ZVBhZ2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEJlZm9yZSBjcmVhdGluZyBhIG5ldyBhdGxhcyBwYWdlIHRoYXQgd291bGQgdHJpZ2dlciBhIHBhZ2UgbWVyZ2UsIGNoZWNrIGlmIHRoZVxuICAgICAgICAgICAgLy8gY3VycmVudCBhY3RpdmUgcm93IGlzIHN1ZmZpY2llbnQgd2hlbiBpZ25vcmluZyB0aGUgUk9XX1BJWEVMX1RIUkVTSE9MRC4gVGhpcyB3aWxsXG4gICAgICAgICAgICAvLyBpbXByb3ZlIHRleHR1cmUgdXRpbGl6YXRpb24gYnkgdXNpbmcgdGhlIGF2YWlsYWJsZSBzcGFjZSBiZWZvcmUgdGhlIHBhZ2UgaXMgbWVyZ2VkXG4gICAgICAgICAgICAvLyBhbmQgYmVjb21lcyBzdGF0aWMuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIFRleHR1cmVBdGxhcy5tYXhBdGxhc1BhZ2VzICYmXG4gICAgICAgICAgICAgIHRoaXMuX3BhZ2VzLmxlbmd0aCA+PSBUZXh0dXJlQXRsYXMubWF4QXRsYXNQYWdlcyAmJlxuICAgICAgICAgICAgICBhY3RpdmVSb3cueSArIHJhc3Rlcml6ZWRHbHlwaC5zaXplLnkgPD0gYWN0aXZlUGFnZS5jYW52YXMuaGVpZ2h0ICYmXG4gICAgICAgICAgICAgIGFjdGl2ZVJvdy5oZWlnaHQgPj0gcmFzdGVyaXplZEdseXBoLnNpemUueSAmJlxuICAgICAgICAgICAgICBhY3RpdmVSb3cueCArIHJhc3Rlcml6ZWRHbHlwaC5zaXplLnggPD0gYWN0aXZlUGFnZS5jYW52YXMud2lkdGhcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAvLyBhY3RpdmVQYWdlIGFuZCBhY3RpdmVSb3cgaXMgYWxyZWFkeSB2YWxpZFxuICAgICAgICAgICAgICB3YXNQYWdlQW5kUm93Rm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHBhZ2UgaWYgdGhlcmUgaXMgbm8gcm9vbVxuICAgICAgICAgICAgICBjb25zdCBuZXdQYWdlID0gdGhpcy5fY3JlYXRlTmV3UGFnZSgpO1xuICAgICAgICAgICAgICBhY3RpdmVQYWdlID0gbmV3UGFnZTtcbiAgICAgICAgICAgICAgYWN0aXZlUm93ID0gbmV3UGFnZS5jdXJyZW50Um93O1xuICAgICAgICAgICAgICBhY3RpdmVSb3cuaGVpZ2h0ID0gcmFzdGVyaXplZEdseXBoLnNpemUueTtcbiAgICAgICAgICAgICAgd2FzUGFnZUFuZFJvd0ZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF3YXNQYWdlQW5kUm93Rm91bmQpIHtcbiAgICAgICAgICAvLyBGaXggdGhlIGN1cnJlbnQgcm93IGFzIHRoZSBuZXcgcm93IGlzIGJlaW5nIGFkZGVkIGJlbG93XG4gICAgICAgICAgaWYgKGFjdGl2ZVBhZ2UuY3VycmVudFJvdy5oZWlnaHQgPiAwKSB7XG4gICAgICAgICAgICBhY3RpdmVQYWdlLmZpeGVkUm93cy5wdXNoKGFjdGl2ZVBhZ2UuY3VycmVudFJvdyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFjdGl2ZVJvdyA9IHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiBhY3RpdmVQYWdlLmN1cnJlbnRSb3cueSArIGFjdGl2ZVBhZ2UuY3VycmVudFJvdy5oZWlnaHQsXG4gICAgICAgICAgICBoZWlnaHQ6IHJhc3Rlcml6ZWRHbHlwaC5zaXplLnlcbiAgICAgICAgICB9O1xuICAgICAgICAgIGFjdGl2ZVBhZ2UuZml4ZWRSb3dzLnB1c2goYWN0aXZlUm93KTtcblxuICAgICAgICAgIC8vIENyZWF0ZSB0aGUgbmV3IGN1cnJlbnQgcm93IGJlbG93IHRoZSBuZXcgZml4ZWQgaGVpZ2h0IHJvd1xuICAgICAgICAgIGFjdGl2ZVBhZ2UuY3VycmVudFJvdyA9IHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiBhY3RpdmVSb3cueSArIGFjdGl2ZVJvdy5oZWlnaHQsXG4gICAgICAgICAgICBoZWlnaHQ6IDBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE86IFJlbW92ZSBwYWdlcyBmcm9tIF9hY3RpdmVQYWdlcyB3aGVuIGFsbCByb3dzIGFyZSBmaWxsZWRcbiAgICAgIH1cblxuICAgICAgLy8gRXhpdCB0aGUgbG9vcCBpZiB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpbiB0aGUgcm93XG4gICAgICBpZiAoYWN0aXZlUm93LnggKyByYXN0ZXJpemVkR2x5cGguc2l6ZS54IDw9IGFjdGl2ZVBhZ2UuY2FudmFzLndpZHRoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIGN1cnJlbnQgcm93LCBmaW5pc2ggaXQgYW5kIHRyeSBhZ2FpblxuICAgICAgaWYgKGFjdGl2ZVJvdyA9PT0gYWN0aXZlUGFnZS5jdXJyZW50Um93KSB7XG4gICAgICAgIGFjdGl2ZVJvdy54ID0gMDtcbiAgICAgICAgYWN0aXZlUm93LnkgKz0gYWN0aXZlUm93LmhlaWdodDtcbiAgICAgICAgYWN0aXZlUm93LmhlaWdodCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY3RpdmVQYWdlLmZpeGVkUm93cy5zcGxpY2UoYWN0aXZlUGFnZS5maXhlZFJvd3MuaW5kZXhPZihhY3RpdmVSb3cpLCAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWNvcmQgdGV4dHVyZSBwb3NpdGlvblxuICAgIHJhc3Rlcml6ZWRHbHlwaC50ZXh0dXJlUGFnZSA9IHRoaXMuX3BhZ2VzLmluZGV4T2YoYWN0aXZlUGFnZSk7XG4gICAgcmFzdGVyaXplZEdseXBoLnRleHR1cmVQb3NpdGlvbi54ID0gYWN0aXZlUm93Lng7XG4gICAgcmFzdGVyaXplZEdseXBoLnRleHR1cmVQb3NpdGlvbi55ID0gYWN0aXZlUm93Lnk7XG4gICAgcmFzdGVyaXplZEdseXBoLnRleHR1cmVQb3NpdGlvbkNsaXBTcGFjZS54ID0gYWN0aXZlUm93LnggLyBhY3RpdmVQYWdlLmNhbnZhcy53aWR0aDtcbiAgICByYXN0ZXJpemVkR2x5cGgudGV4dHVyZVBvc2l0aW9uQ2xpcFNwYWNlLnkgPSBhY3RpdmVSb3cueSAvIGFjdGl2ZVBhZ2UuY2FudmFzLmhlaWdodDtcblxuICAgIC8vIEZpeCB0aGUgY2xpcHNwYWNlIHBvc2l0aW9uIGFzIHBhZ2VzIG1heSBiZSBvZiBkaWZmZXJpbmcgc2l6ZVxuICAgIHJhc3Rlcml6ZWRHbHlwaC5zaXplQ2xpcFNwYWNlLnggLz0gYWN0aXZlUGFnZS5jYW52YXMud2lkdGg7XG4gICAgcmFzdGVyaXplZEdseXBoLnNpemVDbGlwU3BhY2UueSAvPSBhY3RpdmVQYWdlLmNhbnZhcy5oZWlnaHQ7XG5cbiAgICAvLyBVcGRhdGUgYXRsYXMgY3VycmVudCByb3csIGZvciBmaXhlZCByb3dzIHRoZSBnbHlwaCBoZWlnaHQgd2lsbCBuZXZlciBiZSBsYXJnZXIgdGhhbiB0aGUgcm93XG4gICAgLy8gaGVpZ2h0XG4gICAgYWN0aXZlUm93LmhlaWdodCA9IE1hdGgubWF4KGFjdGl2ZVJvdy5oZWlnaHQsIHJhc3Rlcml6ZWRHbHlwaC5zaXplLnkpO1xuICAgIGFjdGl2ZVJvdy54ICs9IHJhc3Rlcml6ZWRHbHlwaC5zaXplLng7XG5cbiAgICAvLyBwdXRJbWFnZURhdGEgZG9lc24ndCBkbyBhbnkgYmxlbmRpbmcsIHNvIGl0IHdpbGwgb3ZlcndyaXRlIGFueSBleGlzdGluZyBjYWNoZSBlbnRyeSBmb3IgdXNcbiAgICBhY3RpdmVQYWdlLmN0eC5wdXRJbWFnZURhdGEoXG4gICAgICBpbWFnZURhdGEsXG4gICAgICByYXN0ZXJpemVkR2x5cGgudGV4dHVyZVBvc2l0aW9uLnggLSB0aGlzLl93b3JrQm91bmRpbmdCb3gubGVmdCxcbiAgICAgIHJhc3Rlcml6ZWRHbHlwaC50ZXh0dXJlUG9zaXRpb24ueSAtIHRoaXMuX3dvcmtCb3VuZGluZ0JveC50b3AsXG4gICAgICB0aGlzLl93b3JrQm91bmRpbmdCb3gubGVmdCxcbiAgICAgIHRoaXMuX3dvcmtCb3VuZGluZ0JveC50b3AsXG4gICAgICByYXN0ZXJpemVkR2x5cGguc2l6ZS54LFxuICAgICAgcmFzdGVyaXplZEdseXBoLnNpemUueVxuICAgICk7XG4gICAgYWN0aXZlUGFnZS5hZGRHbHlwaChyYXN0ZXJpemVkR2x5cGgpO1xuICAgIGFjdGl2ZVBhZ2UudmVyc2lvbisrO1xuXG4gICAgcmV0dXJuIHJhc3Rlcml6ZWRHbHlwaDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhbiBJbWFnZURhdGEgb2JqZWN0LCBmaW5kIHRoZSBib3VuZGluZyBib3ggb2YgdGhlIG5vbi10cmFuc3BhcmVudFxuICAgKiBwb3J0aW9uIG9mIHRoZSB0ZXh0dXJlIGFuZCByZXR1cm4gYW4gSVJhc3Rlcml6ZWRHbHlwaCB3aXRoIHRoZXNlXG4gICAqIGRpbWVuc2lvbnMuXG4gICAqIEBwYXJhbSBpbWFnZURhdGEgVGhlIGltYWdlIGRhdGEgdG8gcmVhZC5cbiAgICogQHBhcmFtIGJvdW5kaW5nQm94IEFuIElCb3VuZGluZ0JveCB0byBwdXQgdGhlIGNsaXBwZWQgYm91bmRpbmcgYm94IHZhbHVlcy5cbiAgICovXG4gIHByaXZhdGUgX2ZpbmRHbHlwaEJvdW5kaW5nQm94KGltYWdlRGF0YTogSW1hZ2VEYXRhLCBib3VuZGluZ0JveDogSUJvdW5kaW5nQm94LCBhbGxvd2VkV2lkdGg6IG51bWJlciwgcmVzdHJpY3RlZEdseXBoOiBib29sZWFuLCBjdXN0b21HbHlwaDogYm9vbGVhbiwgcGFkZGluZzogbnVtYmVyKTogSVJhc3Rlcml6ZWRHbHlwaCB7XG4gICAgYm91bmRpbmdCb3gudG9wID0gMDtcbiAgICBjb25zdCBoZWlnaHQgPSByZXN0cmljdGVkR2x5cGggPyB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbEhlaWdodCA6IHRoaXMuX3RtcENhbnZhcy5oZWlnaHQ7XG4gICAgY29uc3Qgd2lkdGggPSByZXN0cmljdGVkR2x5cGggPyB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbFdpZHRoIDogYWxsb3dlZFdpZHRoO1xuICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICBjb25zdCBhbHBoYU9mZnNldCA9IHkgKiB0aGlzLl90bXBDYW52YXMud2lkdGggKiA0ICsgeCAqIDQgKyAzO1xuICAgICAgICBpZiAoaW1hZ2VEYXRhLmRhdGFbYWxwaGFPZmZzZXRdICE9PSAwKSB7XG4gICAgICAgICAgYm91bmRpbmdCb3gudG9wID0geTtcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgYm91bmRpbmdCb3gubGVmdCA9IDA7XG4gICAgZm91bmQgPSBmYWxzZTtcbiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHBhZGRpbmcgKyB3aWR0aDsgeCsrKSB7XG4gICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XG4gICAgICAgIGNvbnN0IGFscGhhT2Zmc2V0ID0geSAqIHRoaXMuX3RtcENhbnZhcy53aWR0aCAqIDQgKyB4ICogNCArIDM7XG4gICAgICAgIGlmIChpbWFnZURhdGEuZGF0YVthbHBoYU9mZnNldF0gIT09IDApIHtcbiAgICAgICAgICBib3VuZGluZ0JveC5sZWZ0ID0geDtcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgYm91bmRpbmdCb3gucmlnaHQgPSB3aWR0aDtcbiAgICBmb3VuZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IHggPSBwYWRkaW5nICsgd2lkdGggLSAxOyB4ID49IHBhZGRpbmc7IHgtLSkge1xuICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgICBjb25zdCBhbHBoYU9mZnNldCA9IHkgKiB0aGlzLl90bXBDYW52YXMud2lkdGggKiA0ICsgeCAqIDQgKyAzO1xuICAgICAgICBpZiAoaW1hZ2VEYXRhLmRhdGFbYWxwaGFPZmZzZXRdICE9PSAwKSB7XG4gICAgICAgICAgYm91bmRpbmdCb3gucmlnaHQgPSB4O1xuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBib3VuZGluZ0JveC5ib3R0b20gPSBoZWlnaHQ7XG4gICAgZm91bmQgPSBmYWxzZTtcbiAgICBmb3IgKGxldCB5ID0gaGVpZ2h0IC0gMTsgeSA+PSAwOyB5LS0pIHtcbiAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICBjb25zdCBhbHBoYU9mZnNldCA9IHkgKiB0aGlzLl90bXBDYW52YXMud2lkdGggKiA0ICsgeCAqIDQgKyAzO1xuICAgICAgICBpZiAoaW1hZ2VEYXRhLmRhdGFbYWxwaGFPZmZzZXRdICE9PSAwKSB7XG4gICAgICAgICAgYm91bmRpbmdCb3guYm90dG9tID0geTtcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHR1cmVQYWdlOiAwLFxuICAgICAgdGV4dHVyZVBvc2l0aW9uOiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgIHRleHR1cmVQb3NpdGlvbkNsaXBTcGFjZTogeyB4OiAwLCB5OiAwIH0sXG4gICAgICBzaXplOiB7XG4gICAgICAgIHg6IGJvdW5kaW5nQm94LnJpZ2h0IC0gYm91bmRpbmdCb3gubGVmdCArIDEsXG4gICAgICAgIHk6IGJvdW5kaW5nQm94LmJvdHRvbSAtIGJvdW5kaW5nQm94LnRvcCArIDFcbiAgICAgIH0sXG4gICAgICBzaXplQ2xpcFNwYWNlOiB7XG4gICAgICAgIHg6IChib3VuZGluZ0JveC5yaWdodCAtIGJvdW5kaW5nQm94LmxlZnQgKyAxKSxcbiAgICAgICAgeTogKGJvdW5kaW5nQm94LmJvdHRvbSAtIGJvdW5kaW5nQm94LnRvcCArIDEpXG4gICAgICB9LFxuICAgICAgb2Zmc2V0OiB7XG4gICAgICAgIHg6IC1ib3VuZGluZ0JveC5sZWZ0ICsgcGFkZGluZyArICgocmVzdHJpY3RlZEdseXBoIHx8IGN1c3RvbUdseXBoKSA/IE1hdGguZmxvb3IoKHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsV2lkdGggLSB0aGlzLl9jb25maWcuZGV2aWNlQ2hhcldpZHRoKSAvIDIpIDogMCksXG4gICAgICAgIHk6IC1ib3VuZGluZ0JveC50b3AgKyBwYWRkaW5nICsgKChyZXN0cmljdGVkR2x5cGggfHwgY3VzdG9tR2x5cGgpID8gdGhpcy5fY29uZmlnLmxpbmVIZWlnaHQgPT09IDEgPyAwIDogTWF0aC5yb3VuZCgodGhpcy5fY29uZmlnLmRldmljZUNlbGxIZWlnaHQgLSB0aGlzLl9jb25maWcuZGV2aWNlQ2hhckhlaWdodCkgLyAyKSA6IDApXG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG5jbGFzcyBBdGxhc1BhZ2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDtcbiAgcHVibGljIHJlYWRvbmx5IGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuXG4gIHByaXZhdGUgX3VzZWRQaXhlbHM6IG51bWJlciA9IDA7XG4gIHB1YmxpYyBnZXQgcGVyY2VudGFnZVVzZWQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3VzZWRQaXhlbHMgLyAodGhpcy5jYW52YXMud2lkdGggKiB0aGlzLmNhbnZhcy5oZWlnaHQpOyB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZ2x5cGhzOiBJUmFzdGVyaXplZEdseXBoW10gPSBbXTtcbiAgcHVibGljIGdldCBnbHlwaHMoKTogUmVhZG9ubHlBcnJheTxJUmFzdGVyaXplZEdseXBoPiB7IHJldHVybiB0aGlzLl9nbHlwaHM7IH1cbiAgcHVibGljIGFkZEdseXBoKGdseXBoOiBJUmFzdGVyaXplZEdseXBoKTogdm9pZCB7XG4gICAgdGhpcy5fZ2x5cGhzLnB1c2goZ2x5cGgpO1xuICAgIHRoaXMuX3VzZWRQaXhlbHMgKz0gZ2x5cGguc2l6ZS54ICogZ2x5cGguc2l6ZS55O1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gY2hlY2sgd2hldGhlciB0aGUgY2FudmFzIG9mIHRoZSBhdGxhcyBwYWdlIGhhcyBjaGFuZ2VkLlxuICAgKi9cbiAgcHVibGljIHZlcnNpb24gPSAwO1xuXG4gIC8vIFRleHR1cmUgYXRsYXMgY3VycmVudCBwb3NpdGlvbmluZyBkYXRhLiBUaGUgdGV4dHVyZSBwYWNraW5nIHN0cmF0ZWd5IHVzZWQgaXMgdG8gZmlsbCBmcm9tXG4gIC8vIGxlZnQtdG8tcmlnaHQgYW5kIHRvcC10by1ib3R0b20uIFdoZW4gdGhlIGdseXBoIGJlaW5nIHdyaXR0ZW4gaXMgbGVzcyB0aGFuIGhhbGYgb2YgdGhlIGN1cnJlbnRcbiAgLy8gcm93J3MgaGVpZ2h0LCB0aGUgZm9sbG93aW5nIGhhcHBlbnM6XG4gIC8vXG4gIC8vIC0gVGhlIGN1cnJlbnQgcm93IGJlY29tZXMgdGhlIGZpeGVkIGhlaWdodCByb3cgQVxuICAvLyAtIEEgbmV3IGZpeGVkIGhlaWdodCByb3cgQiB0aGUgZXhhY3Qgc2l6ZSBvZiB0aGUgZ2x5cGggaXMgY3JlYXRlZCBiZWxvdyB0aGUgY3VycmVudCByb3dcbiAgLy8gLSBBIG5ldyBkeW5hbWljIGhlaWdodCBjdXJyZW50IHJvdyBpcyBjcmVhdGVkIGJlbG93IEJcbiAgLy9cbiAgLy8gVGhpcyBzdHJhdGVneSBkb2VzIGEgZ29vZCBqb2IgcHJldmVudGluZyBzcGFjZSBiZWluZyB3YXN0ZWQgZm9yIHZlcnkgc2hvcnQgZ2x5cGhzIHN1Y2ggYXNcbiAgLy8gdW5kZXJzY29yZXMsIGh5cGhlbnMgZXRjLiBvciB0aG9zZSB3aXRoIHVuZGVybGluZXMgcmVuZGVyZWQuXG4gIHB1YmxpYyBjdXJyZW50Um93OiBJQ2hhckF0bGFzQWN0aXZlUm93ID0ge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICBoZWlnaHQ6IDBcbiAgfTtcbiAgcHVibGljIHJlYWRvbmx5IGZpeGVkUm93czogSUNoYXJBdGxhc0FjdGl2ZVJvd1tdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZG9jdW1lbnQ6IERvY3VtZW50LFxuICAgIHNpemU6IG51bWJlcixcbiAgICBzb3VyY2VQYWdlcz86IEF0bGFzUGFnZVtdXG4gICkge1xuICAgIGlmIChzb3VyY2VQYWdlcykge1xuICAgICAgZm9yIChjb25zdCBwIG9mIHNvdXJjZVBhZ2VzKSB7XG4gICAgICAgIHRoaXMuX2dseXBocy5wdXNoKC4uLnAuZ2x5cGhzKTtcbiAgICAgICAgdGhpcy5fdXNlZFBpeGVscyArPSBwLl91c2VkUGl4ZWxzO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNhbnZhcyA9IGNyZWF0ZUNhbnZhcyhkb2N1bWVudCwgc2l6ZSwgc2l6ZSk7XG4gICAgLy8gVGhlIGNhbnZhcyBuZWVkcyBhbHBoYSBiZWNhdXNlIHdlIHVzZSBjbGVhckNvbG9yIHRvIGNvbnZlcnQgdGhlIGJhY2tncm91bmQgY29sb3IgdG8gYWxwaGEuXG4gICAgLy8gSXQgbWlnaHQgYWxzbyBjb250YWluIHNvbWUgY2hhcmFjdGVycyB3aXRoIHRyYW5zcGFyZW50IGJhY2tncm91bmRzIGlmIGFsbG93VHJhbnNwYXJlbmN5IGlzXG4gICAgLy8gc2V0LlxuICAgIHRoaXMuY3R4ID0gdGhyb3dJZkZhbHN5KHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJywgeyBhbHBoYTogdHJ1ZSB9KSk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5jdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuY2FudmFzLndpZHRoLCB0aGlzLmNhbnZhcy5oZWlnaHQpO1xuICAgIHRoaXMuY3VycmVudFJvdy54ID0gMDtcbiAgICB0aGlzLmN1cnJlbnRSb3cueSA9IDA7XG4gICAgdGhpcy5jdXJyZW50Um93LmhlaWdodCA9IDA7XG4gICAgdGhpcy5maXhlZFJvd3MubGVuZ3RoID0gMDtcbiAgICB0aGlzLnZlcnNpb24rKztcbiAgfVxufVxuXG4vKipcbiAqIE1ha2VzIGEgcGFydGljdWxhciByZ2IgY29sb3IgYW5kIGNvbG9ycyB0aGF0IGFyZSBuZWFybHkgdGhlIHNhbWUgaW4gYW4gSW1hZ2VEYXRhIGNvbXBsZXRlbHlcbiAqIHRyYW5zcGFyZW50LlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgcmVzdWx0IGlzIFwiZW1wdHlcIiwgbWVhbmluZyBhbGwgcGl4ZWxzIGFyZSBmdWxseSB0cmFuc3BhcmVudC5cbiAqL1xuZnVuY3Rpb24gY2xlYXJDb2xvcihpbWFnZURhdGE6IEltYWdlRGF0YSwgYmc6IElDb2xvciwgZmc6IElDb2xvciwgZW5hYmxlVGhyZXNob2xkQ2hlY2s6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgLy8gR2V0IGNvbG9yIGNoYW5uZWxzXG4gIGNvbnN0IHIgPSBiZy5yZ2JhID4+PiAyNDtcbiAgY29uc3QgZyA9IGJnLnJnYmEgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgYiA9IGJnLnJnYmEgPj4+IDggJiAweEZGO1xuICBjb25zdCBmZ1IgPSBmZy5yZ2JhID4+PiAyNDtcbiAgY29uc3QgZmdHID0gZmcucmdiYSA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBmZ0IgPSBmZy5yZ2JhID4+PiA4ICYgMHhGRjtcblxuICAvLyBDYWxjdWxhdGUgYSB0aHJlc2hvbGQgdGhhdCB3aGVuIGJlbG93IGEgY29sb3Igd2lsbCBiZSB0cmVhdGVkIGFzIHRyYW5zcGFydCB3aGVuIHRoZSBzdW0gb2ZcbiAgLy8gY2hhbm5lbCB2YWx1ZSBkaWZmZXJzLiBUaGlzIGhlbHBzIGltcHJvdmUgcmVuZGVyaW5nIHdoZW4gZ2x5cGhzIG92ZXJsYXAgd2l0aCBvdGhlcnMuIFRoaXNcbiAgLy8gdGhyZXNob2xkIGlzIGNhbGN1bGF0ZWQgcmVsYXRpdmUgdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYmFja2dyb3VuZCBhbmQgZm9yZWdyb3VuZCB0b1xuICAvLyBlbnN1cmUgaW1wb3J0YW50IGRldGFpbHMgb2YgdGhlIGdseXBoIGFyZSBhbHdheXMgc2hvd24sIGV2ZW4gd2hlbiB0aGUgY29udHJhc3QgcmF0aW8gaXMgbG93LlxuICAvLyBUaGUgbnVtYmVyIDEyIGlzIGxhcmdlbHkgYXJiaXRyYXJ5IHRvIGVuc3VyZSB0aGUgcGl4ZWxzIHRoYXQgZXNjYXBlIHRoZSBjZWxsIGluIHRoZSB0ZXN0IGNhc2VcbiAgLy8gd2VyZSBjb3ZlcmVkIChmZz0jOGFlMjM0LCBiZz0jYzRhMDAwKS5cbiAgY29uc3QgdGhyZXNob2xkID0gTWF0aC5mbG9vcigoTWF0aC5hYnMociAtIGZnUikgKyBNYXRoLmFicyhnIC0gZmdHKSArIE1hdGguYWJzKGIgLSBmZ0IpKSAvIDEyKTtcblxuICAvLyBTZXQgYWxwaGEgY2hhbm5lbCBvZiByZWxldmVudCBwaXhlbHMgdG8gMFxuICBsZXQgaXNFbXB0eSA9IHRydWU7XG4gIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IGltYWdlRGF0YS5kYXRhLmxlbmd0aDsgb2Zmc2V0ICs9IDQpIHtcbiAgICAvLyBDaGVjayBleGFjdCBtYXRjaFxuICAgIGlmIChpbWFnZURhdGEuZGF0YVtvZmZzZXRdID09PSByICYmXG4gICAgICAgIGltYWdlRGF0YS5kYXRhW29mZnNldCArIDFdID09PSBnICYmXG4gICAgICAgIGltYWdlRGF0YS5kYXRhW29mZnNldCArIDJdID09PSBiKSB7XG4gICAgICBpbWFnZURhdGEuZGF0YVtvZmZzZXQgKyAzXSA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENoZWNrIHRoZSB0aHJlc2hvbGQgYmFzZWQgZGlmZmVyZW5jZVxuICAgICAgaWYgKGVuYWJsZVRocmVzaG9sZENoZWNrICYmXG4gICAgICAgICAgKE1hdGguYWJzKGltYWdlRGF0YS5kYXRhW29mZnNldF0gLSByKSArXG4gICAgICAgICAgTWF0aC5hYnMoaW1hZ2VEYXRhLmRhdGFbb2Zmc2V0ICsgMV0gLSBnKSArXG4gICAgICAgICAgTWF0aC5hYnMoaW1hZ2VEYXRhLmRhdGFbb2Zmc2V0ICsgMl0gLSBiKSkgPCB0aHJlc2hvbGQpIHtcbiAgICAgICAgaW1hZ2VEYXRhLmRhdGFbb2Zmc2V0ICsgM10gPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXNFbXB0eSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpc0VtcHR5O1xufVxuXG5mdW5jdGlvbiBjaGVja0NvbXBsZXRlbHlUcmFuc3BhcmVudChpbWFnZURhdGE6IEltYWdlRGF0YSk6IGJvb2xlYW4ge1xuICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBpbWFnZURhdGEuZGF0YS5sZW5ndGg7IG9mZnNldCArPSA0KSB7XG4gICAgaWYgKGltYWdlRGF0YS5kYXRhW29mZnNldCArIDNdID4gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ2FudmFzKGRvY3VtZW50OiBEb2N1bWVudCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBIVE1MQ2FudmFzRWxlbWVudCB7XG4gIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgcmV0dXJuIGNhbnZhcztcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUNvbG9yLCBJQ29sb3JSR0IgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG5sZXQgJHIgPSAwO1xubGV0ICRnID0gMDtcbmxldCAkYiA9IDA7XG5sZXQgJGEgPSAwO1xuXG5leHBvcnQgY29uc3QgTlVMTF9DT0xPUjogSUNvbG9yID0ge1xuICBjc3M6ICcjMDAwMDAwMDAnLFxuICByZ2JhOiAwXG59O1xuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIFwiY2hhbm5lbHNcIiAoaW5kaXZpZHVhbCBjb2xvciBjaGFubmVscyBhcyBudW1iZXJzKS5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBjaGFubmVscyB7XG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NzcyhyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBhPzogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoYSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gYCMke3RvUGFkZGVkSGV4KHIpfSR7dG9QYWRkZWRIZXgoZyl9JHt0b1BhZGRlZEhleChiKX0ke3RvUGFkZGVkSGV4KGEpfWA7XG4gICAgfVxuICAgIHJldHVybiBgIyR7dG9QYWRkZWRIZXgocil9JHt0b1BhZGRlZEhleChnKX0ke3RvUGFkZGVkSGV4KGIpfWA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gdG9SZ2JhKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlciA9IDB4RkYpOiBudW1iZXIge1xuICAgIC8vIE5vdGU6IFRoZSBhZ2dyZWdhdGVkIG51bWJlciBpcyBSR0JBMzIgKEJFKSwgdGh1cyBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG8gQUJHUjMyXG4gICAgLy8gb24gTEUgc3lzdGVtcywgYmVmb3JlIGl0IGNhbiBiZSB1c2VkIGZvciBkaXJlY3QgMzItYml0IGJ1ZmZlciB3cml0ZXMuXG4gICAgLy8gPj4+IDAgZm9yY2VzIGFuIHVuc2lnbmVkIGludFxuICAgIHJldHVybiAociA8PCAyNCB8IGcgPDwgMTYgfCBiIDw8IDggfCBhKSA+Pj4gMDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NvbG9yKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE/OiBudW1iZXIpOiBJQ29sb3Ige1xuICAgIHJldHVybiB7XG4gICAgICBjc3M6IGNoYW5uZWxzLnRvQ3NzKHIsIGcsIGIsIGEpLFxuICAgICAgcmdiYTogY2hhbm5lbHMudG9SZ2JhKHIsIGcsIGIsIGEpXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIGBJQ29sb3JgLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIGNvbG9yIHtcbiAgZXhwb3J0IGZ1bmN0aW9uIGJsZW5kKGJnOiBJQ29sb3IsIGZnOiBJQ29sb3IpOiBJQ29sb3Ige1xuICAgICRhID0gKGZnLnJnYmEgJiAweEZGKSAvIDI1NTtcbiAgICBpZiAoJGEgPT09IDEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNzczogZmcuY3NzLFxuICAgICAgICByZ2JhOiBmZy5yZ2JhXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBmZ1IgPSAoZmcucmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGZnRyA9IChmZy5yZ2JhID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgZmdCID0gKGZnLnJnYmEgPj4gOCkgJiAweEZGO1xuICAgIGNvbnN0IGJnUiA9IChiZy5yZ2JhID4+IDI0KSAmIDB4RkY7XG4gICAgY29uc3QgYmdHID0gKGJnLnJnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmcucmdiYSA+PiA4KSAmIDB4RkY7XG4gICAgJHIgPSBiZ1IgKyBNYXRoLnJvdW5kKChmZ1IgLSBiZ1IpICogJGEpO1xuICAgICRnID0gYmdHICsgTWF0aC5yb3VuZCgoZmdHIC0gYmdHKSAqICRhKTtcbiAgICAkYiA9IGJnQiArIE1hdGgucm91bmQoKGZnQiAtIGJnQikgKiAkYSk7XG4gICAgY29uc3QgY3NzID0gY2hhbm5lbHMudG9Dc3MoJHIsICRnLCAkYik7XG4gICAgY29uc3QgcmdiYSA9IGNoYW5uZWxzLnRvUmdiYSgkciwgJGcsICRiKTtcbiAgICByZXR1cm4geyBjc3MsIHJnYmEgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBpc09wYXF1ZShjb2xvcjogSUNvbG9yKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChjb2xvci5yZ2JhICYgMHhGRikgPT09IDB4RkY7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gZW5zdXJlQ29udHJhc3RSYXRpbyhiZzogSUNvbG9yLCBmZzogSUNvbG9yLCByYXRpbzogbnVtYmVyKTogSUNvbG9yIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZXN1bHQgPSByZ2JhLmVuc3VyZUNvbnRyYXN0UmF0aW8oYmcucmdiYSwgZmcucmdiYSwgcmF0aW8pO1xuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gY2hhbm5lbHMudG9Db2xvcihcbiAgICAgIChyZXN1bHQgPj4gMjQgJiAweEZGKSxcbiAgICAgIChyZXN1bHQgPj4gMTYgJiAweEZGKSxcbiAgICAgIChyZXN1bHQgPj4gOCAgJiAweEZGKVxuICAgICk7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gb3BhcXVlKGNvbG9yOiBJQ29sb3IpOiBJQ29sb3Ige1xuICAgIGNvbnN0IHJnYmFDb2xvciA9IChjb2xvci5yZ2JhIHwgMHhGRikgPj4+IDA7XG4gICAgWyRyLCAkZywgJGJdID0gcmdiYS50b0NoYW5uZWxzKHJnYmFDb2xvcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNzczogY2hhbm5lbHMudG9Dc3MoJHIsICRnLCAkYiksXG4gICAgICByZ2JhOiByZ2JhQ29sb3JcbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIG9wYWNpdHkoY29sb3I6IElDb2xvciwgb3BhY2l0eTogbnVtYmVyKTogSUNvbG9yIHtcbiAgICAkYSA9IE1hdGgucm91bmQob3BhY2l0eSAqIDB4RkYpO1xuICAgIFskciwgJGcsICRiXSA9IHJnYmEudG9DaGFubmVscyhjb2xvci5yZ2JhKTtcbiAgICByZXR1cm4ge1xuICAgICAgY3NzOiBjaGFubmVscy50b0NzcygkciwgJGcsICRiLCAkYSksXG4gICAgICByZ2JhOiBjaGFubmVscy50b1JnYmEoJHIsICRnLCAkYiwgJGEpXG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseU9wYWNpdHkoY29sb3I6IElDb2xvciwgZmFjdG9yOiBudW1iZXIpOiBJQ29sb3Ige1xuICAgICRhID0gY29sb3IucmdiYSAmIDB4RkY7XG4gICAgcmV0dXJuIG9wYWNpdHkoY29sb3IsICgkYSAqIGZhY3RvcikgLyAweEZGKTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NvbG9yUkdCKGNvbG9yOiBJQ29sb3IpOiBJQ29sb3JSR0Ige1xuICAgIHJldHVybiBbKGNvbG9yLnJnYmEgPj4gMjQpICYgMHhGRiwgKGNvbG9yLnJnYmEgPj4gMTYpICYgMHhGRiwgKGNvbG9yLnJnYmEgPj4gOCkgJiAweEZGXTtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIFwiY3NzXCIgKHN0cmluZzogJyNyZ2InLCAnI3JnYmEnLCAnI3JyZ2diYicsXG4gKiAnI3JyZ2diYmFhJykuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgY3NzIHtcbiAgLy8gQXR0ZW1wdCB0byBzZXQgZ2V0IHRoZSBzaGFyZWQgY2FudmFzIGNvbnRleHRcbiAgbGV0ICRjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB8IHVuZGVmaW5lZDtcbiAgbGV0ICRsaXRtdXNDb2xvcjogQ2FudmFzR3JhZGllbnQgfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgLy8gVGhpcyBpcyBndWFyYW50ZWVkIHRvIHJ1biBpbiB0aGUgZmlyc3Qgd2luZG93LCBzbyBkb2N1bWVudCBzaG91bGQgYmUgY29ycmVjdFxuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IDE7XG4gICAgY2FudmFzLmhlaWdodCA9IDE7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJywge1xuICAgICAgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlXG4gICAgfSk7XG4gICAgaWYgKGN0eCkge1xuICAgICAgJGN0eCA9IGN0eDtcbiAgICAgICRjdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2NvcHknO1xuICAgICAgJGxpdG11c0NvbG9yID0gJGN0eC5jcmVhdGVMaW5lYXJHcmFkaWVudCgwLCAwLCAxLCAxKTtcbiAgICB9XG4gIH1cbiAgY2F0Y2gge1xuICAgIC8vIG5vb3BcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGNzcyBzdHJpbmcgdG8gYW4gSUNvbG9yLCB0aGlzIHNob3VsZCBoYW5kbGUgYWxsIHZhbGlkIENTUyBjb2xvciBzdHJpbmdzIGFuZCB3aWxsXG4gICAqIHRocm93IGlmIGl0J3MgaW52YWxpZC4gVGhlIGlkZWFsIGZvcm1hdCB0byB1c2UgaXMgYCNycmdnYmJbYWFdYCBhcyBpdCdzIHRoZSBmYXN0ZXN0IHRvIHBhcnNlLlxuICAgKlxuICAgKiBPbmx5IGAjcmdiW2FdYCwgYCNycmdnYmJbYWFdYCwgYHJnYigpYCBhbmQgYHJnYmEoKWAgZm9ybWF0cyBhcmUgc3VwcG9ydGVkIHdoZW4gcnVuIGluIGEgTm9kZVxuICAgKiBlbnZpcm9ubWVudC5cbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NvbG9yKGNzczogc3RyaW5nKTogSUNvbG9yIHtcbiAgICAvLyBGb3JtYXRzOiAjcmdiW2FdIGFuZCAjcnJnZ2JiW2FhXVxuICAgIGlmIChjc3MubWF0Y2goLyNbXFxkYS1mXXszLDh9L2kpKSB7XG4gICAgICBzd2l0Y2ggKGNzcy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSA0OiB7IC8vICNyZ2JcbiAgICAgICAgICAkciA9IHBhcnNlSW50KGNzcy5zbGljZSgxLCAyKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkZyA9IHBhcnNlSW50KGNzcy5zbGljZSgyLCAzKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkYiA9IHBhcnNlSW50KGNzcy5zbGljZSgzLCA0KS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICByZXR1cm4gY2hhbm5lbHMudG9Db2xvcigkciwgJGcsICRiKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDU6IHsgLy8gI3JnYmFcbiAgICAgICAgICAkciA9IHBhcnNlSW50KGNzcy5zbGljZSgxLCAyKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkZyA9IHBhcnNlSW50KGNzcy5zbGljZSgyLCAzKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkYiA9IHBhcnNlSW50KGNzcy5zbGljZSgzLCA0KS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkYSA9IHBhcnNlSW50KGNzcy5zbGljZSg0LCA1KS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICByZXR1cm4gY2hhbm5lbHMudG9Db2xvcigkciwgJGcsICRiLCAkYSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSA3OiAvLyAjcnJnZ2JiXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNzcyxcbiAgICAgICAgICAgIHJnYmE6IChwYXJzZUludChjc3Muc2xpY2UoMSksIDE2KSA8PCA4IHwgMHhGRikgPj4+IDBcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlIDk6IC8vICNycmdnYmJhYVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjc3MsXG4gICAgICAgICAgICByZ2JhOiBwYXJzZUludChjc3Muc2xpY2UoMSksIDE2KSA+Pj4gMFxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRm9ybWF0czogcmdiKCkgb3IgcmdiYSgpXG4gICAgY29uc3QgcmdiYU1hdGNoID0gY3NzLm1hdGNoKC9yZ2JhP1xcKFxccyooXFxkezEsM30pXFxzKixcXHMqKFxcZHsxLDN9KVxccyosXFxzKihcXGR7MSwzfSlcXHMqKCxcXHMqKDB8MXxcXGQ/XFwuKFxcZCspKVxccyopP1xcKS8pO1xuICAgIGlmIChyZ2JhTWF0Y2gpIHtcbiAgICAgICRyID0gcGFyc2VJbnQocmdiYU1hdGNoWzFdKTtcbiAgICAgICRnID0gcGFyc2VJbnQocmdiYU1hdGNoWzJdKTtcbiAgICAgICRiID0gcGFyc2VJbnQocmdiYU1hdGNoWzNdKTtcbiAgICAgICRhID0gTWF0aC5yb3VuZCgocmdiYU1hdGNoWzVdID09PSB1bmRlZmluZWQgPyAxIDogcGFyc2VGbG9hdChyZ2JhTWF0Y2hbNV0pKSAqIDB4RkYpO1xuICAgICAgcmV0dXJuIGNoYW5uZWxzLnRvQ29sb3IoJHIsICRnLCAkYiwgJGEpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoZSBjb250ZXh0IGlzIGF2YWlsYWJsZSBmb3IgY2FudmFzLWJhc2VkIGNvbG9yIHBhcnNpbmdcbiAgICBpZiAoISRjdHggfHwgISRsaXRtdXNDb2xvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjc3MudG9Db2xvcjogVW5zdXBwb3J0ZWQgY3NzIGZvcm1hdCcpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoZSBjb2xvciB1c2luZyBjYW52YXMgZmlsbFN0eWxlXG4gICAgLy8gU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2NhbnZhcy5odG1sI2ZpbGwtYW5kLXN0cm9rZS1zdHlsZXNcbiAgICAkY3R4LmZpbGxTdHlsZSA9ICRsaXRtdXNDb2xvcjtcbiAgICAkY3R4LmZpbGxTdHlsZSA9IGNzcztcbiAgICBpZiAodHlwZW9mICRjdHguZmlsbFN0eWxlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjc3MudG9Db2xvcjogVW5zdXBwb3J0ZWQgY3NzIGZvcm1hdCcpO1xuICAgIH1cblxuICAgICRjdHguZmlsbFJlY3QoMCwgMCwgMSwgMSk7XG4gICAgWyRyLCAkZywgJGIsICRhXSA9ICRjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIDEsIDEpLmRhdGE7XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgY29sb3IgaXMgbm9uLXRyYW5zcGFyZW50IGFzIGNvbG9yIGh1ZSBnZXRzIGxvc3Qgd2hlbiBkcmF3biB0byB0aGUgY2FudmFzXG4gICAgaWYgKCRhICE9PSAweEZGKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nzcy50b0NvbG9yOiBVbnN1cHBvcnRlZCBjc3MgZm9ybWF0Jyk7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCB0aGUgY29sb3IgZnJvbSB0aGUgY2FudmFzJyBmaWxsU3R5bGUgcHJvcGVydHkgd2hpY2ggZXhwb3NlcyB0aGUgY29sb3IgdmFsdWUgaW4gcmdiYSgpXG4gICAgLy8gZm9ybWF0XG4gICAgLy8gU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2NhbnZhcy5odG1sI3NlcmlhbGlzYXRpb24tb2YtYS1jb2xvclxuICAgIHJldHVybiB7XG4gICAgICByZ2JhOiBjaGFubmVscy50b1JnYmEoJHIsICRnLCAkYiwgJGEpLFxuICAgICAgY3NzXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIFwicmdiXCIgKG51bWJlcjogMHhycmdnYmIpLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIHJnYiB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSByZWxhdGl2ZSBsdW1pbmFuY2Ugb2YgYW4gUkdCIGNvbG9yLCB0aGlzIGlzIHVzZWZ1bCBpbiBkZXRlcm1pbmluZyB0aGUgY29udHJhc3QgcmF0aW9cbiAgICogYmV0d2VlbiB0d28gY29sb3JzLlxuICAgKiBAcGFyYW0gcmdiIFRoZSBjb2xvciB0byB1c2UuXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL1dDQUcyMC8jcmVsYXRpdmVsdW1pbmFuY2VkZWZcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZUx1bWluYW5jZShyZ2I6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHJlbGF0aXZlTHVtaW5hbmNlMihcbiAgICAgIChyZ2IgPj4gMTYpICYgMHhGRixcbiAgICAgIChyZ2IgPj4gOCApICYgMHhGRixcbiAgICAgIChyZ2IgICAgICApICYgMHhGRik7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgcmVsYXRpdmUgbHVtaW5hbmNlIG9mIGFuIFJHQiBjb2xvciwgdGhpcyBpcyB1c2VmdWwgaW4gZGV0ZXJtaW5pbmcgdGhlIGNvbnRyYXN0IHJhdGlvXG4gICAqIGJldHdlZW4gdHdvIGNvbG9ycy5cbiAgICogQHBhcmFtIHIgVGhlIHJlZCBjaGFubmVsICgweDAwIHRvIDB4RkYpLlxuICAgKiBAcGFyYW0gZyBUaGUgZ3JlZW4gY2hhbm5lbCAoMHgwMCB0byAweEZGKS5cbiAgICogQHBhcmFtIGIgVGhlIGJsdWUgY2hhbm5lbCAoMHgwMCB0byAweEZGKS5cbiAgICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvV0NBRzIwLyNyZWxhdGl2ZWx1bWluYW5jZWRlZlxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aXZlTHVtaW5hbmNlMihyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBycyA9IHIgLyAyNTU7XG4gICAgY29uc3QgZ3MgPSBnIC8gMjU1O1xuICAgIGNvbnN0IGJzID0gYiAvIDI1NTtcbiAgICBjb25zdCByciA9IHJzIDw9IDAuMDM5MjggPyBycyAvIDEyLjkyIDogTWF0aC5wb3coKHJzICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgY29uc3QgcmcgPSBncyA8PSAwLjAzOTI4ID8gZ3MgLyAxMi45MiA6IE1hdGgucG93KChncyArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgIGNvbnN0IHJiID0gYnMgPD0gMC4wMzkyOCA/IGJzIC8gMTIuOTIgOiBNYXRoLnBvdygoYnMgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICByZXR1cm4gcnIgKiAwLjIxMjYgKyByZyAqIDAuNzE1MiArIHJiICogMC4wNzIyO1xuICB9XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9ucyB3aGVyZSB0aGUgc291cmNlIHR5cGUgaXMgXCJyZ2JhXCIgKG51bWJlcjogMHhycmdnYmJhYSkuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgcmdiYSB7XG4gIGV4cG9ydCBmdW5jdGlvbiBibGVuZChiZzogbnVtYmVyLCBmZzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAkYSA9IChmZyAmIDB4RkYpIC8gMHhGRjtcbiAgICBpZiAoJGEgPT09IDEpIHtcbiAgICAgIHJldHVybiBmZztcbiAgICB9XG4gICAgY29uc3QgZmdSID0gKGZnID4+IDI0KSAmIDB4RkY7XG4gICAgY29uc3QgZmdHID0gKGZnID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgZmdCID0gKGZnID4+IDgpICYgMHhGRjtcbiAgICBjb25zdCBiZ1IgPSAoYmcgPj4gMjQpICYgMHhGRjtcbiAgICBjb25zdCBiZ0cgPSAoYmcgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmcgPj4gOCkgJiAweEZGO1xuICAgICRyID0gYmdSICsgTWF0aC5yb3VuZCgoZmdSIC0gYmdSKSAqICRhKTtcbiAgICAkZyA9IGJnRyArIE1hdGgucm91bmQoKGZnRyAtIGJnRykgKiAkYSk7XG4gICAgJGIgPSBiZ0IgKyBNYXRoLnJvdW5kKChmZ0IgLSBiZ0IpICogJGEpO1xuICAgIHJldHVybiBjaGFubmVscy50b1JnYmEoJHIsICRnLCAkYik7XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYSBmb3JlZ3JvdW5kIGNvbG9yIGFuZCBhIGJhY2tncm91bmQgY29sb3IsIGVpdGhlciBpbmNyZWFzZSBvciByZWR1Y2UgdGhlIGx1bWluYW5jZSBvZiB0aGVcbiAgICogZm9yZWdyb3VuZCBjb2xvciB1bnRpbCB0aGUgc3BlY2lmaWVkIGNvbnRyYXN0IHJhdGlvIGlzIG1ldC4gSWYgcHVyZSB3aGl0ZSBvciBibGFjayBpcyBoaXRcbiAgICogd2l0aG91dCB0aGUgY29udHJhc3QgcmF0aW8gYmVpbmcgbWV0LCBnbyB0aGUgb3RoZXIgZGlyZWN0aW9uIHVzaW5nIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGFzIHRoZVxuICAgKiBmb3JlZ3JvdW5kIGNvbG9yIGFuZCB0YWtlIGVpdGhlciB0aGUgZmlyc3Qgb3Igc2Vjb25kIHJlc3VsdCBkZXBlbmRpbmcgb24gd2hpY2ggaGFzIHRoZSBoaWdoZXJcbiAgICogY29udHJhc3QgcmF0aW8uXG4gICAqXG4gICAqIGB1bmRlZmluZWRgIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGNvbnRyYXN0IHJhdGlvIGlzIGFscmVhZHkgbWV0LlxuICAgKlxuICAgKiBAcGFyYW0gYmdSZ2JhIFRoZSBiYWNrZ3JvdW5kIGNvbG9yIGluIHJnYmEgZm9ybWF0LlxuICAgKiBAcGFyYW0gZmdSZ2JhIFRoZSBmb3JlZ3JvdW5kIGNvbG9yIGluIHJnYmEgZm9ybWF0LlxuICAgKiBAcGFyYW0gcmF0aW8gVGhlIGNvbnRyYXN0IHJhdGlvIHRvIGFjaGlldmUuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gZW5zdXJlQ29udHJhc3RSYXRpbyhiZ1JnYmE6IG51bWJlciwgZmdSZ2JhOiBudW1iZXIsIHJhdGlvOiBudW1iZXIpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGJnTCA9IHJnYi5yZWxhdGl2ZUx1bWluYW5jZShiZ1JnYmEgPj4gOCk7XG4gICAgY29uc3QgZmdMID0gcmdiLnJlbGF0aXZlTHVtaW5hbmNlKGZnUmdiYSA+PiA4KTtcbiAgICBjb25zdCBjciA9IGNvbnRyYXN0UmF0aW8oYmdMLCBmZ0wpO1xuICAgIGlmIChjciA8IHJhdGlvKSB7XG4gICAgICBpZiAoZmdMIDwgYmdMKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdEEgPSByZWR1Y2VMdW1pbmFuY2UoYmdSZ2JhLCBmZ1JnYmEsIHJhdGlvKTtcbiAgICAgICAgY29uc3QgcmVzdWx0QVJhdGlvID0gY29udHJhc3RSYXRpbyhiZ0wsIHJnYi5yZWxhdGl2ZUx1bWluYW5jZShyZXN1bHRBID4+IDgpKTtcbiAgICAgICAgaWYgKHJlc3VsdEFSYXRpbyA8IHJhdGlvKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0QiA9IGluY3JlYXNlTHVtaW5hbmNlKGJnUmdiYSwgZmdSZ2JhLCByYXRpbyk7XG4gICAgICAgICAgY29uc3QgcmVzdWx0QlJhdGlvID0gY29udHJhc3RSYXRpbyhiZ0wsIHJnYi5yZWxhdGl2ZUx1bWluYW5jZShyZXN1bHRCID4+IDgpKTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0QVJhdGlvID4gcmVzdWx0QlJhdGlvID8gcmVzdWx0QSA6IHJlc3VsdEI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdEE7XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHRBID0gaW5jcmVhc2VMdW1pbmFuY2UoYmdSZ2JhLCBmZ1JnYmEsIHJhdGlvKTtcbiAgICAgIGNvbnN0IHJlc3VsdEFSYXRpbyA9IGNvbnRyYXN0UmF0aW8oYmdMLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UocmVzdWx0QSA+PiA4KSk7XG4gICAgICBpZiAocmVzdWx0QVJhdGlvIDwgcmF0aW8pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0QiA9IHJlZHVjZUx1bWluYW5jZShiZ1JnYmEsIGZnUmdiYSwgcmF0aW8pO1xuICAgICAgICBjb25zdCByZXN1bHRCUmF0aW8gPSBjb250cmFzdFJhdGlvKGJnTCwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlKHJlc3VsdEIgPj4gOCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0QVJhdGlvID4gcmVzdWx0QlJhdGlvID8gcmVzdWx0QSA6IHJlc3VsdEI7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0QTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiByZWR1Y2VMdW1pbmFuY2UoYmdSZ2JhOiBudW1iZXIsIGZnUmdiYTogbnVtYmVyLCByYXRpbzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAvLyBUaGlzIGlzIGEgbmFpdmUgYnV0IGZhc3QgYXBwcm9hY2ggdG8gcmVkdWNpbmcgbHVtaW5hbmNlIGFzIGNvbnZlcnRpbmcgdG9cbiAgICAvLyBIU0wgYW5kIGJhY2sgaXMgZXhwZW5zaXZlXG4gICAgY29uc3QgYmdSID0gKGJnUmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGJnRyA9IChiZ1JnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGZnUiA9IChmZ1JnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBsZXQgZmdHID0gKGZnUmdiYSA+PiAxNikgJiAweEZGO1xuICAgIGxldCBmZ0IgPSAoZmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB3aGlsZSAoY3IgPCByYXRpbyAmJiAoZmdSID4gMCB8fCBmZ0cgPiAwIHx8IGZnQiA+IDApKSB7XG4gICAgICAvLyBSZWR1Y2UgYnkgMTAlIHVudGlsIHRoZSByYXRpbyBpcyBoaXRcbiAgICAgIGZnUiAtPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoZmdSICogMC4xKSk7XG4gICAgICBmZ0cgLT0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKGZnRyAqIDAuMSkpO1xuICAgICAgZmdCIC09IE1hdGgubWF4KDAsIE1hdGguY2VpbChmZ0IgKiAwLjEpKTtcbiAgICAgIGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB9XG4gICAgcmV0dXJuIChmZ1IgPDwgMjQgfCBmZ0cgPDwgMTYgfCBmZ0IgPDwgOCB8IDB4RkYpID4+PiAwO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGluY3JlYXNlTHVtaW5hbmNlKGJnUmdiYTogbnVtYmVyLCBmZ1JnYmE6IG51bWJlciwgcmF0aW86IG51bWJlcik6IG51bWJlciB7XG4gICAgLy8gVGhpcyBpcyBhIG5haXZlIGJ1dCBmYXN0IGFwcHJvYWNoIHRvIGluY3JlYXNpbmcgbHVtaW5hbmNlIGFzIGNvbnZlcnRpbmcgdG9cbiAgICAvLyBIU0wgYW5kIGJhY2sgaXMgZXhwZW5zaXZlXG4gICAgY29uc3QgYmdSID0gKGJnUmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGJnRyA9IChiZ1JnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGZnUiA9IChmZ1JnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBsZXQgZmdHID0gKGZnUmdiYSA+PiAxNikgJiAweEZGO1xuICAgIGxldCBmZ0IgPSAoZmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB3aGlsZSAoY3IgPCByYXRpbyAmJiAoZmdSIDwgMHhGRiB8fCBmZ0cgPCAweEZGIHx8IGZnQiA8IDB4RkYpKSB7XG4gICAgICAvLyBJbmNyZWFzZSBieSAxMCUgdW50aWwgdGhlIHJhdGlvIGlzIGhpdFxuICAgICAgZmdSID0gTWF0aC5taW4oMHhGRiwgZmdSICsgTWF0aC5jZWlsKCgyNTUgLSBmZ1IpICogMC4xKSk7XG4gICAgICBmZ0cgPSBNYXRoLm1pbigweEZGLCBmZ0cgKyBNYXRoLmNlaWwoKDI1NSAtIGZnRykgKiAwLjEpKTtcbiAgICAgIGZnQiA9IE1hdGgubWluKDB4RkYsIGZnQiArIE1hdGguY2VpbCgoMjU1IC0gZmdCKSAqIDAuMSkpO1xuICAgICAgY3IgPSBjb250cmFzdFJhdGlvKHJnYi5yZWxhdGl2ZUx1bWluYW5jZTIoZmdSLCBmZ0csIGZnQiksIHJnYi5yZWxhdGl2ZUx1bWluYW5jZTIoYmdSLCBiZ0csIGJnQikpO1xuICAgIH1cbiAgICByZXR1cm4gKGZnUiA8PCAyNCB8IGZnRyA8PCAxNiB8IGZnQiA8PCA4IHwgMHhGRikgPj4+IDA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gdG9DaGFubmVscyh2YWx1ZTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0ge1xuICAgIHJldHVybiBbKHZhbHVlID4+IDI0KSAmIDB4RkYsICh2YWx1ZSA+PiAxNikgJiAweEZGLCAodmFsdWUgPj4gOCkgJiAweEZGLCB2YWx1ZSAmIDB4RkZdO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1BhZGRlZEhleChjOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBzID0gYy50b1N0cmluZygxNik7XG4gIHJldHVybiBzLmxlbmd0aCA8IDIgPyAnMCcgKyBzIDogcztcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBjb250cmFzdCByYXRpbyBiZXR3ZWVuIHR3byByZWxhdGl2ZSBsdW1pbmFuY2UgdmFsdWVzLlxuICogQHBhcmFtIGwxIFRoZSBmaXJzdCByZWxhdGl2ZSBsdW1pbmFuY2UuXG4gKiBAcGFyYW0gbDIgVGhlIGZpcnN0IHJlbGF0aXZlIGx1bWluYW5jZS5cbiAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL1dDQUcyMC8jY29udHJhc3QtcmF0aW9kZWZcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRyYXN0UmF0aW8obDE6IG51bWJlciwgbDI6IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChsMSA8IGwyKSB7XG4gICAgcmV0dXJuIChsMiArIDAuMDUpIC8gKGwxICsgMC4wNSk7XG4gIH1cbiAgcmV0dXJuIChsMSArIDAuMDUpIC8gKGwyICsgMC4wNSk7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcblxuaW50ZXJmYWNlIElMaXN0ZW5lcjxULCBVID0gdm9pZD4ge1xuICAoYXJnMTogVCwgYXJnMjogVSk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUV2ZW50PFQsIFUgPSB2b2lkPiB7XG4gIChsaXN0ZW5lcjogKGFyZzE6IFQsIGFyZzI6IFUpID0+IGFueSk6IElEaXNwb3NhYmxlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFdmVudEVtaXR0ZXI8VCwgVSA9IHZvaWQ+IHtcbiAgZXZlbnQ6IElFdmVudDxULCBVPjtcbiAgZmlyZShhcmcxOiBULCBhcmcyOiBVKTogdm9pZDtcbiAgZGlzcG9zZSgpOiB2b2lkO1xufVxuXG5leHBvcnQgY2xhc3MgRXZlbnRFbWl0dGVyPFQsIFUgPSB2b2lkPiBpbXBsZW1lbnRzIElFdmVudEVtaXR0ZXI8VCwgVT4ge1xuICBwcml2YXRlIF9saXN0ZW5lcnM6IElMaXN0ZW5lcjxULCBVPltdID0gW107XG4gIHByaXZhdGUgX2V2ZW50PzogSUV2ZW50PFQsIFU+O1xuICBwcml2YXRlIF9kaXNwb3NlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHB1YmxpYyBnZXQgZXZlbnQoKTogSUV2ZW50PFQsIFU+IHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50KSB7XG4gICAgICB0aGlzLl9ldmVudCA9IChsaXN0ZW5lcjogKGFyZzE6IFQsIGFyZzI6IFUpID0+IGFueSkgPT4ge1xuICAgICAgICB0aGlzLl9saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIGNvbnN0IGRpc3Bvc2FibGUgPSB7XG4gICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9kaXNwb3NlZCkge1xuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2xpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9saXN0ZW5lcnNbaV0gPT09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGRpc3Bvc2FibGU7XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZmlyZShhcmcxOiBULCBhcmcyOiBVKTogdm9pZCB7XG4gICAgY29uc3QgcXVldWU6IElMaXN0ZW5lcjxULCBVPltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9saXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXVlLnB1c2godGhpcy5fbGlzdGVuZXJzW2ldKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgcXVldWVbaV0uY2FsbCh1bmRlZmluZWQsIGFyZzEsIGFyZzIpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLl9kaXNwb3NlZCA9IHRydWU7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xpc3RlbmVycykge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLmxlbmd0aCA9IDA7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkRXZlbnQ8VD4oZnJvbTogSUV2ZW50PFQ+LCB0bzogSUV2ZW50RW1pdHRlcjxUPik6IElEaXNwb3NhYmxlIHtcbiAgcmV0dXJuIGZyb20oZSA9PiB0by5maXJlKGUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bkFuZFN1YnNjcmliZTxUPihldmVudDogSUV2ZW50PFQ+LCBoYW5kbGVyOiAoZTogVCB8IHVuZGVmaW5lZCkgPT4gYW55KTogSURpc3Bvc2FibGUge1xuICBoYW5kbGVyKHVuZGVmaW5lZCk7XG4gIHJldHVybiBldmVudChlID0+IGhhbmRsZXIoZSkpO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbi8qKlxuICogQSBiYXNlIGNsYXNzIHRoYXQgY2FuIGJlIGV4dGVuZGVkIHRvIHByb3ZpZGUgY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgbWFuYWdpbmcgdGhlIGxpZmVjeWNsZSBvZiBhblxuICogb2JqZWN0IGFuZCBpdHMgY29tcG9uZW50cy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJRGlzcG9zYWJsZSB7XG4gIHByb3RlY3RlZCBfZGlzcG9zYWJsZXM6IElEaXNwb3NhYmxlW10gPSBbXTtcbiAgcHJvdGVjdGVkIF9pc0Rpc3Bvc2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIHRoZSBvYmplY3QsIHRyaWdnZXJpbmcgdGhlIGBkaXNwb3NlYCBtZXRob2Qgb24gYWxsIHJlZ2lzdGVyZWQgSURpc3Bvc2FibGVzLlxuICAgKi9cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5faXNEaXNwb3NlZCA9IHRydWU7XG4gICAgZm9yIChjb25zdCBkIG9mIHRoaXMuX2Rpc3Bvc2FibGVzKSB7XG4gICAgICBkLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgdGhpcy5fZGlzcG9zYWJsZXMubGVuZ3RoID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBkaXNwb3NhYmxlIG9iamVjdC5cbiAgICogQHBhcmFtIGQgVGhlIGRpc3Bvc2FibGUgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBkaXNwb3NhYmxlLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyPFQgZXh0ZW5kcyBJRGlzcG9zYWJsZT4oZDogVCk6IFQge1xuICAgIHRoaXMuX2Rpc3Bvc2FibGVzLnB1c2goZCk7XG4gICAgcmV0dXJuIGQ7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBkaXNwb3NhYmxlIG9iamVjdCBpZiBpdCBoYXMgYmVlbiByZWdpc3RlcmVkLCBpZiBub3QgZG9cbiAgICogbm90aGluZy5cbiAgICogQHBhcmFtIGQgVGhlIGRpc3Bvc2FibGUgdG8gdW5yZWdpc3Rlci5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyPFQgZXh0ZW5kcyBJRGlzcG9zYWJsZT4oZDogVCk6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fZGlzcG9zYWJsZXMuaW5kZXhPZihkKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLl9kaXNwb3NhYmxlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTXV0YWJsZURpc3Bvc2FibGU8VCBleHRlbmRzIElEaXNwb3NhYmxlPiBpbXBsZW1lbnRzIElEaXNwb3NhYmxlIHtcbiAgcHJpdmF0ZSBfdmFsdWU/OiBUO1xuICBwcml2YXRlIF9pc0Rpc3Bvc2VkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZhbHVlIGlmIGl0IGV4aXN0cy5cbiAgICovXG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRGlzcG9zZWQgPyB1bmRlZmluZWQgOiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSwgZGlzcG9zaW5nIG9mIHRoZSBvbGQgdmFsdWUgaWYgaXQgZXhpc3RzLlxuICAgKi9cbiAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogVCB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh0aGlzLl9pc0Rpc3Bvc2VkIHx8IHZhbHVlID09PSB0aGlzLl92YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl92YWx1ZT8uZGlzcG9zZSgpO1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBzdG9yZWQgdmFsdWUgYW5kIGRpc3Bvc2VzIG9mIHRoZSBwcmV2aW91c2x5IHN0b3JlZCB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5faXNEaXNwb3NlZCA9IHRydWU7XG4gICAgdGhpcy5fdmFsdWU/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLl92YWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFdyYXAgYSBmdW5jdGlvbiBpbiBhIGRpc3Bvc2FibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0Rpc3Bvc2FibGUoZjogKCkgPT4gdm9pZCk6IElEaXNwb3NhYmxlIHtcbiAgcmV0dXJuIHsgZGlzcG9zZTogZiB9O1xufVxuXG4vKipcbiAqIERpc3Bvc2Ugb2YgYWxsIGRpc3Bvc2FibGVzIGluIGFuIGFycmF5IGFuZCBzZXQgaXRzIGxlbmd0aCB0byAwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzcG9zZUFycmF5KGRpc3Bvc2FibGVzOiBJRGlzcG9zYWJsZVtdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgZCBvZiBkaXNwb3NhYmxlcykge1xuICAgIGQuZGlzcG9zZSgpO1xuICB9XG4gIGRpc3Bvc2FibGVzLmxlbmd0aCA9IDA7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRpc3Bvc2FibGUgdGhhdCB3aWxsIGRpc3Bvc2Ugb2YgYW4gYXJyYXkgb2YgZGlzcG9zYWJsZXMgd2hlbiBkaXNwb3NlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERpc3Bvc2VBcnJheURpc3Bvc2FibGUoYXJyYXk6IElEaXNwb3NhYmxlW10pOiBJRGlzcG9zYWJsZSB7XG4gIHJldHVybiB7IGRpc3Bvc2U6ICgpID0+IGRpc3Bvc2VBcnJheShhcnJheSkgfTtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIyIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuZXhwb3J0IGNsYXNzIFR3b0tleU1hcDxURmlyc3QgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIsIFRTZWNvbmQgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIsIFRWYWx1ZT4ge1xuICBwcml2YXRlIF9kYXRhOiB7IFtiZzogc3RyaW5nIHwgbnVtYmVyXTogeyBbZmc6IHN0cmluZyB8IG51bWJlcl06IFRWYWx1ZSB8IHVuZGVmaW5lZCB9IHwgdW5kZWZpbmVkIH0gPSB7fTtcblxuICBwdWJsaWMgc2V0KGZpcnN0OiBURmlyc3QsIHNlY29uZDogVFNlY29uZCwgdmFsdWU6IFRWYWx1ZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZGF0YVtmaXJzdF0pIHtcbiAgICAgIHRoaXMuX2RhdGFbZmlyc3RdID0ge307XG4gICAgfVxuICAgIHRoaXMuX2RhdGFbZmlyc3QgYXMgc3RyaW5nIHwgbnVtYmVyXSFbc2Vjb25kXSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldChmaXJzdDogVEZpcnN0LCBzZWNvbmQ6IFRTZWNvbmQpOiBUVmFsdWUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhW2ZpcnN0IGFzIHN0cmluZyB8IG51bWJlcl0gPyB0aGlzLl9kYXRhW2ZpcnN0IGFzIHN0cmluZyB8IG51bWJlcl0hW3NlY29uZF0gOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YSA9IHt9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGb3VyS2V5TWFwPFRGaXJzdCBleHRlbmRzIHN0cmluZyB8IG51bWJlciwgVFNlY29uZCBleHRlbmRzIHN0cmluZyB8IG51bWJlciwgVFRoaXJkIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyLCBURm91cnRoIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyLCBUVmFsdWU+IHtcbiAgcHJpdmF0ZSBfZGF0YTogVHdvS2V5TWFwPFRGaXJzdCwgVFNlY29uZCwgVHdvS2V5TWFwPFRUaGlyZCwgVEZvdXJ0aCwgVFZhbHVlPj4gPSBuZXcgVHdvS2V5TWFwKCk7XG5cbiAgcHVibGljIHNldChmaXJzdDogVEZpcnN0LCBzZWNvbmQ6IFRTZWNvbmQsIHRoaXJkOiBUVGhpcmQsIGZvdXJ0aDogVEZvdXJ0aCwgdmFsdWU6IFRWYWx1ZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZGF0YS5nZXQoZmlyc3QsIHNlY29uZCkpIHtcbiAgICAgIHRoaXMuX2RhdGEuc2V0KGZpcnN0LCBzZWNvbmQsIG5ldyBUd29LZXlNYXAoKSk7XG4gICAgfVxuICAgIHRoaXMuX2RhdGEuZ2V0KGZpcnN0LCBzZWNvbmQpIS5zZXQodGhpcmQsIGZvdXJ0aCwgdmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGdldChmaXJzdDogVEZpcnN0LCBzZWNvbmQ6IFRTZWNvbmQsIHRoaXJkOiBUVGhpcmQsIGZvdXJ0aDogVEZvdXJ0aCk6IFRWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEuZ2V0KGZpcnN0LCBzZWNvbmQpPy5nZXQodGhpcmQsIGZvdXJ0aCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YS5jbGVhcigpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNiBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmludGVyZmFjZSBJTmF2aWdhdG9yIHtcbiAgdXNlckFnZW50OiBzdHJpbmc7XG4gIGxhbmd1YWdlOiBzdHJpbmc7XG4gIHBsYXRmb3JtOiBzdHJpbmc7XG59XG5cbi8vIFdlJ3JlIGRlY2xhcmluZyBhIG5hdmlnYXRvciBnbG9iYWwgaGVyZSBhcyB3ZSBleHBlY3QgaXQgaW4gYWxsIHJ1bnRpbWVzIChub2RlIGFuZCBicm93c2VyKSwgYnV0XG4vLyB3ZSB3YW50IHRoaXMgbW9kdWxlIHRvIGxpdmUgaW4gY29tbW9uLlxuZGVjbGFyZSBjb25zdCBuYXZpZ2F0b3I6IElOYXZpZ2F0b3I7XG5kZWNsYXJlIGNvbnN0IHByb2Nlc3M6IHVua25vd247XG5cbmV4cG9ydCBjb25zdCBpc05vZGUgPSAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICd0aXRsZScgaW4gKHByb2Nlc3MgYXMgYW55KSkgPyB0cnVlIDogZmFsc2U7XG5jb25zdCB1c2VyQWdlbnQgPSAoaXNOb2RlKSA/ICdub2RlJyA6IG5hdmlnYXRvci51c2VyQWdlbnQ7XG5jb25zdCBwbGF0Zm9ybSA9IChpc05vZGUpID8gJ25vZGUnIDogbmF2aWdhdG9yLnBsYXRmb3JtO1xuXG5leHBvcnQgY29uc3QgaXNGaXJlZm94ID0gdXNlckFnZW50LmluY2x1ZGVzKCdGaXJlZm94Jyk7XG5leHBvcnQgY29uc3QgaXNMZWdhY3lFZGdlID0gdXNlckFnZW50LmluY2x1ZGVzKCdFZGdlJyk7XG5leHBvcnQgY29uc3QgaXNTYWZhcmkgPSAvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KHVzZXJBZ2VudCk7XG5leHBvcnQgZnVuY3Rpb24gZ2V0U2FmYXJpVmVyc2lvbigpOiBudW1iZXIge1xuICBpZiAoIWlzU2FmYXJpKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgY29uc3QgbWFqb3JWZXJzaW9uID0gdXNlckFnZW50Lm1hdGNoKC9WZXJzaW9uXFwvKFxcZCspLyk7XG4gIGlmIChtYWpvclZlcnNpb24gPT09IG51bGwgfHwgbWFqb3JWZXJzaW9uLmxlbmd0aCA8IDIpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICByZXR1cm4gcGFyc2VJbnQobWFqb3JWZXJzaW9uWzFdKTtcbn1cblxuLy8gRmluZCB0aGUgdXNlcnMgcGxhdGZvcm0uIFdlIHVzZSB0aGlzIHRvIGludGVycHJldCB0aGUgbWV0YSBrZXlcbi8vIGFuZCBJU08gdGhpcmQgbGV2ZWwgc2hpZnRzLlxuLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3EvMTk4Nzc5MjQvNTc3NTk4XG5leHBvcnQgY29uc3QgaXNNYWMgPSBbJ01hY2ludG9zaCcsICdNYWNJbnRlbCcsICdNYWNQUEMnLCAnTWFjNjhLJ10uaW5jbHVkZXMocGxhdGZvcm0pO1xuZXhwb3J0IGNvbnN0IGlzSXBhZCA9IHBsYXRmb3JtID09PSAnaVBhZCc7XG5leHBvcnQgY29uc3QgaXNJcGhvbmUgPSBwbGF0Zm9ybSA9PT0gJ2lQaG9uZSc7XG5leHBvcnQgY29uc3QgaXNXaW5kb3dzID0gWydXaW5kb3dzJywgJ1dpbjE2JywgJ1dpbjMyJywgJ1dpbkNFJ10uaW5jbHVkZXMocGxhdGZvcm0pO1xuZXhwb3J0IGNvbnN0IGlzTGludXggPSBwbGF0Zm9ybS5pbmRleE9mKCdMaW51eCcpID49IDA7XG4vLyBOb3RlIHRoYXQgd2hlbiB0aGlzIGlzIHRydWUsIGlzTGludXggd2lsbCBhbHNvIGJlIHRydWUuXG5leHBvcnQgY29uc3QgaXNDaHJvbWVPUyA9IC9cXGJDck9TXFxiLy50ZXN0KHVzZXJBZ2VudCk7XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMiBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IGlzTm9kZSB9IGZyb20gJ2NvbW1vbi9QbGF0Zm9ybSc7XG5cbmludGVyZmFjZSBJVGFza1F1ZXVlIHtcbiAgLyoqXG4gICAqIEFkZHMgYSB0YXNrIHRvIHRoZSBxdWV1ZSB3aGljaCB3aWxsIHJ1biBpbiBhIGZ1dHVyZSBpZGxlIGNhbGxiYWNrLlxuICAgKiBUbyBhdm9pZCBwZXJjZWl2YWJsZSBzdGFsbHMgb24gdGhlIG1haW50aHJlYWQsIHRhc2tzIHdpdGggaGVhdnkgd29ya2xvYWRcbiAgICogc2hvdWxkIHNwbGl0IHRoZWlyIHdvcmsgaW50byBzbWFsbGVyIHBpZWNlcyBhbmQgcmV0dXJuIGB0cnVlYCB0byBnZXRcbiAgICogY2FsbGVkIGFnYWluIHVudGlsIHRoZSB3b3JrIGlzIGRvbmUgKG9uIGZhbHN5IHJldHVybiB2YWx1ZSkuXG4gICAqL1xuICBlbnF1ZXVlKHRhc2s6ICgpID0+IGJvb2xlYW4gfCB2b2lkKTogdm9pZDtcblxuICAvKipcbiAgICogRmx1c2hlcyB0aGUgcXVldWUsIHJ1bm5pbmcgYWxsIHJlbWFpbmluZyB0YXNrcyBzeW5jaHJvbm91c2x5LlxuICAgKi9cbiAgZmx1c2goKTogdm9pZDtcblxuICAvKipcbiAgICogQ2xlYXJzIGFueSByZW1haW5pbmcgdGFza3MgZnJvbSB0aGUgcXVldWUsIHRoZXNlIHdpbGwgbm90IGJlIHJ1bi5cbiAgICovXG4gIGNsZWFyKCk6IHZvaWQ7XG59XG5cbmludGVyZmFjZSBJVGFza0RlYWRsaW5lIHtcbiAgdGltZVJlbWFpbmluZygpOiBudW1iZXI7XG59XG50eXBlIENhbGxiYWNrV2l0aERlYWRsaW5lID0gKGRlYWRsaW5lOiBJVGFza0RlYWRsaW5lKSA9PiB2b2lkO1xuXG5hYnN0cmFjdCBjbGFzcyBUYXNrUXVldWUgaW1wbGVtZW50cyBJVGFza1F1ZXVlIHtcbiAgcHJpdmF0ZSBfdGFza3M6ICgoKSA9PiBib29sZWFuIHwgdm9pZClbXSA9IFtdO1xuICBwcml2YXRlIF9pZGxlQ2FsbGJhY2s/OiBudW1iZXI7XG4gIHByaXZhdGUgX2kgPSAwO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBfcmVxdWVzdENhbGxiYWNrKGNhbGxiYWNrOiBDYWxsYmFja1dpdGhEZWFkbGluZSk6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IF9jYW5jZWxDYWxsYmFjayhpZGVudGlmaWVyOiBudW1iZXIpOiB2b2lkO1xuXG4gIHB1YmxpYyBlbnF1ZXVlKHRhc2s6ICgpID0+IGJvb2xlYW4gfCB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fdGFza3MucHVzaCh0YXNrKTtcbiAgICB0aGlzLl9zdGFydCgpO1xuICB9XG5cbiAgcHVibGljIGZsdXNoKCk6IHZvaWQge1xuICAgIHdoaWxlICh0aGlzLl9pIDwgdGhpcy5fdGFza3MubGVuZ3RoKSB7XG4gICAgICBpZiAoIXRoaXMuX3Rhc2tzW3RoaXMuX2ldKCkpIHtcbiAgICAgICAgdGhpcy5faSsrO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNsZWFyKCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2lkbGVDYWxsYmFjaykge1xuICAgICAgdGhpcy5fY2FuY2VsQ2FsbGJhY2sodGhpcy5faWRsZUNhbGxiYWNrKTtcbiAgICAgIHRoaXMuX2lkbGVDYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGhpcy5faSA9IDA7XG4gICAgdGhpcy5fdGFza3MubGVuZ3RoID0gMDtcbiAgfVxuXG4gIHByaXZhdGUgX3N0YXJ0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5faWRsZUNhbGxiYWNrKSB7XG4gICAgICB0aGlzLl9pZGxlQ2FsbGJhY2sgPSB0aGlzLl9yZXF1ZXN0Q2FsbGJhY2sodGhpcy5fcHJvY2Vzcy5iaW5kKHRoaXMpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wcm9jZXNzKGRlYWRsaW5lOiBJVGFza0RlYWRsaW5lKTogdm9pZCB7XG4gICAgdGhpcy5faWRsZUNhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgIGxldCB0YXNrRHVyYXRpb24gPSAwO1xuICAgIGxldCBsb25nZXN0VGFzayA9IDA7XG4gICAgbGV0IGxhc3REZWFkbGluZVJlbWFpbmluZyA9IGRlYWRsaW5lLnRpbWVSZW1haW5pbmcoKTtcbiAgICBsZXQgZGVhZGxpbmVSZW1haW5pbmcgPSAwO1xuICAgIHdoaWxlICh0aGlzLl9pIDwgdGhpcy5fdGFza3MubGVuZ3RoKSB7XG4gICAgICB0YXNrRHVyYXRpb24gPSBEYXRlLm5vdygpO1xuICAgICAgaWYgKCF0aGlzLl90YXNrc1t0aGlzLl9pXSgpKSB7XG4gICAgICAgIHRoaXMuX2krKztcbiAgICAgIH1cbiAgICAgIC8vIG90aGVyIHRoYW4gcGVyZm9ybWFuY2Uubm93LCBEYXRlLm5vdyBtaWdodCBub3QgYmUgc3RhYmxlIChjaGFuZ2VzIG9uIHdhbGwgY2xvY2sgY2hhbmdlcyksXG4gICAgICAvLyB0aGlzIGlzIG5vdCBhbiBpc3N1ZSBoZXJlIGFzIGEgY2xvY2sgY2hhbmdlIGR1cmluZyBhIHNob3J0IHJ1bm5pbmcgdGFzayBpcyB2ZXJ5IHVubGlrZWx5XG4gICAgICAvLyBpbiBjYXNlIGl0IHN0aWxsIGhhcHBlbmVkIGFuZCBsZWFkcyB0byBuZWdhdGl2ZSBkdXJhdGlvbiwgc2ltcGx5IGFzc3VtZSAxIG1zZWNcbiAgICAgIHRhc2tEdXJhdGlvbiA9IE1hdGgubWF4KDEsIERhdGUubm93KCkgLSB0YXNrRHVyYXRpb24pO1xuICAgICAgbG9uZ2VzdFRhc2sgPSBNYXRoLm1heCh0YXNrRHVyYXRpb24sIGxvbmdlc3RUYXNrKTtcbiAgICAgIC8vIEd1ZXNzIHRoZSBmb2xsb3dpbmcgdGFzayB3aWxsIHRha2UgYSBzaW1pbGFyIHRpbWUgdG8gdGhlIGxvbmdlc3QgdGFzayBpbiB0aGlzIGJhdGNoLCBhbGxvd1xuICAgICAgLy8gYWRkaXRpb25hbCByb29tIHRvIHRyeSBhdm9pZCBleGNlZWRpbmcgdGhlIGRlYWRsaW5lXG4gICAgICBkZWFkbGluZVJlbWFpbmluZyA9IGRlYWRsaW5lLnRpbWVSZW1haW5pbmcoKTtcbiAgICAgIGlmIChsb25nZXN0VGFzayAqIDEuNSA+IGRlYWRsaW5lUmVtYWluaW5nKSB7XG4gICAgICAgIC8vIFdhcm4gd2hlbiB0aGUgdGltZSBleGNlZWRpbmcgdGhlIGRlYWRsaW5lIGlzIG92ZXIgMjBtcywgaWYgdGhpcyBoYXBwZW5zIGluIHByYWN0aWNlIHRoZVxuICAgICAgICAvLyB0YXNrIHNob3VsZCBiZSBzcGxpdCBpbnRvIHN1Yi10YXNrcyB0byBlbnN1cmUgdGhlIFVJIHJlbWFpbnMgcmVzcG9uc2l2ZS5cbiAgICAgICAgaWYgKGxhc3REZWFkbGluZVJlbWFpbmluZyAtIHRhc2tEdXJhdGlvbiA8IC0yMCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgdGFzayBxdWV1ZSBleGNlZWRlZCBhbGxvdHRlZCBkZWFkbGluZSBieSAke01hdGguYWJzKE1hdGgucm91bmQobGFzdERlYWRsaW5lUmVtYWluaW5nIC0gdGFza0R1cmF0aW9uKSl9bXNgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGFydCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsYXN0RGVhZGxpbmVSZW1haW5pbmcgPSBkZWFkbGluZVJlbWFpbmluZztcbiAgICB9XG4gICAgdGhpcy5jbGVhcigpO1xuICB9XG59XG5cbi8qKlxuICogQSBxdWV1ZSBvZiB0aGF0IHJ1bnMgdGFza3Mgb3ZlciBzZXZlcmFsIHRhc2tzIHZpYSBzZXRUaW1lb3V0LCB0cnlpbmcgdG8gbWFpbnRhaW4gYWJvdmUgNjAgZnJhbWVzXG4gKiBwZXIgc2Vjb25kLiBUaGUgdGFza3Mgd2lsbCBydW4gaW4gdGhlIG9yZGVyIHRoZXkgYXJlIGVucXVldWVkLCBidXQgdGhleSB3aWxsIHJ1biBzb21lIHRpbWUgbGF0ZXIsXG4gKiBhbmQgY2FyZSBzaG91bGQgYmUgdGFrZW4gdG8gZW5zdXJlIHRoZXkncmUgbm9uLXVyZ2VudCBhbmQgd2lsbCBub3QgaW50cm9kdWNlIHJhY2UgY29uZGl0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFByaW9yaXR5VGFza1F1ZXVlIGV4dGVuZHMgVGFza1F1ZXVlIHtcbiAgcHJvdGVjdGVkIF9yZXF1ZXN0Q2FsbGJhY2soY2FsbGJhY2s6IENhbGxiYWNrV2l0aERlYWRsaW5lKTogbnVtYmVyIHtcbiAgICByZXR1cm4gc2V0VGltZW91dCgoKSA9PiBjYWxsYmFjayh0aGlzLl9jcmVhdGVEZWFkbGluZSgxNikpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfY2FuY2VsQ2FsbGJhY2soaWRlbnRpZmllcjogbnVtYmVyKTogdm9pZCB7XG4gICAgY2xlYXJUaW1lb3V0KGlkZW50aWZpZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlRGVhZGxpbmUoZHVyYXRpb246IG51bWJlcik6IElUYXNrRGVhZGxpbmUge1xuICAgIGNvbnN0IGVuZCA9IERhdGUubm93KCkgKyBkdXJhdGlvbjtcbiAgICByZXR1cm4ge1xuICAgICAgdGltZVJlbWFpbmluZzogKCkgPT4gTWF0aC5tYXgoMCwgZW5kIC0gRGF0ZS5ub3coKSlcbiAgICB9O1xuICB9XG59XG5cbmNsYXNzIElkbGVUYXNrUXVldWVJbnRlcm5hbCBleHRlbmRzIFRhc2tRdWV1ZSB7XG4gIHByb3RlY3RlZCBfcmVxdWVzdENhbGxiYWNrKGNhbGxiYWNrOiBJZGxlUmVxdWVzdENhbGxiYWNrKTogbnVtYmVyIHtcbiAgICByZXR1cm4gcmVxdWVzdElkbGVDYWxsYmFjayhjYWxsYmFjayk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2NhbmNlbENhbGxiYWNrKGlkZW50aWZpZXI6IG51bWJlcik6IHZvaWQge1xuICAgIGNhbmNlbElkbGVDYWxsYmFjayhpZGVudGlmaWVyKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgcXVldWUgb2YgdGhhdCBydW5zIHRhc2tzIG92ZXIgc2V2ZXJhbCBpZGxlIGNhbGxiYWNrcywgdHJ5aW5nIHRvIHJlc3BlY3QgdGhlIGlkbGUgY2FsbGJhY2snc1xuICogZGVhZGxpbmUgZ2l2ZW4gYnkgdGhlIGVudmlyb25tZW50LiBUaGUgdGFza3Mgd2lsbCBydW4gaW4gdGhlIG9yZGVyIHRoZXkgYXJlIGVucXVldWVkLCBidXQgdGhleVxuICogd2lsbCBydW4gc29tZSB0aW1lIGxhdGVyLCBhbmQgY2FyZSBzaG91bGQgYmUgdGFrZW4gdG8gZW5zdXJlIHRoZXkncmUgbm9uLXVyZ2VudCBhbmQgd2lsbCBub3RcbiAqIGludHJvZHVjZSByYWNlIGNvbmRpdGlvbnMuXG4gKlxuICogVGhpcyByZXZlcnRzIHRvIGEge0BsaW5rIFByaW9yaXR5VGFza1F1ZXVlfSBpZiB0aGUgZW52aXJvbm1lbnQgZG9lcyBub3Qgc3VwcG9ydCBpZGxlIGNhbGxiYWNrcy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuZXhwb3J0IGNvbnN0IElkbGVUYXNrUXVldWUgPSAoIWlzTm9kZSAmJiAncmVxdWVzdElkbGVDYWxsYmFjaycgaW4gd2luZG93KSA/IElkbGVUYXNrUXVldWVJbnRlcm5hbCA6IFByaW9yaXR5VGFza1F1ZXVlO1xuXG4vKipcbiAqIEFuIG9iamVjdCB0aGF0IHRyYWNrcyBhIHNpbmdsZSBkZWJvdW5jZWQgdGFzayB0aGF0IHdpbGwgcnVuIG9uIHRoZSBuZXh0IGlkbGUgZnJhbWUuIFdoZW4gY2FsbGVkXG4gKiBtdWx0aXBsZSB0aW1lcywgb25seSB0aGUgbGFzdCBzZXQgdGFzayB3aWxsIHJ1bi5cbiAqL1xuZXhwb3J0IGNsYXNzIERlYm91bmNlZElkbGVUYXNrIHtcbiAgcHJpdmF0ZSBfcXVldWU6IElUYXNrUXVldWU7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fcXVldWUgPSBuZXcgSWRsZVRhc2tRdWV1ZSgpO1xuICB9XG5cbiAgcHVibGljIHNldCh0YXNrOiAoKSA9PiBib29sZWFuIHwgdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX3F1ZXVlLmNsZWFyKCk7XG4gICAgdGhpcy5fcXVldWUuZW5xdWV1ZSh0YXNrKTtcbiAgfVxuXG4gIHB1YmxpYyBmbHVzaCgpOiB2b2lkIHtcbiAgICB0aGlzLl9xdWV1ZS5mbHVzaCgpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOCBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElBdHRyaWJ1dGVEYXRhLCBJQ29sb3JSR0IsIElFeHRlbmRlZEF0dHJzIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IEF0dHJpYnV0ZXMsIEZnRmxhZ3MsIEJnRmxhZ3MsIFVuZGVybGluZVN0eWxlLCBFeHRGbGFncyB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ29uc3RhbnRzJztcblxuZXhwb3J0IGNsYXNzIEF0dHJpYnV0ZURhdGEgaW1wbGVtZW50cyBJQXR0cmlidXRlRGF0YSB7XG4gIHB1YmxpYyBzdGF0aWMgdG9Db2xvclJHQih2YWx1ZTogbnVtYmVyKTogSUNvbG9yUkdCIHtcbiAgICByZXR1cm4gW1xuICAgICAgdmFsdWUgPj4+IEF0dHJpYnV0ZXMuUkVEX1NISUZUICYgMjU1LFxuICAgICAgdmFsdWUgPj4+IEF0dHJpYnV0ZXMuR1JFRU5fU0hJRlQgJiAyNTUsXG4gICAgICB2YWx1ZSAmIDI1NVxuICAgIF07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGZyb21Db2xvclJHQih2YWx1ZTogSUNvbG9yUkdCKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHZhbHVlWzBdICYgMjU1KSA8PCBBdHRyaWJ1dGVzLlJFRF9TSElGVCB8ICh2YWx1ZVsxXSAmIDI1NSkgPDwgQXR0cmlidXRlcy5HUkVFTl9TSElGVCB8IHZhbHVlWzJdICYgMjU1O1xuICB9XG5cbiAgcHVibGljIGNsb25lKCk6IElBdHRyaWJ1dGVEYXRhIHtcbiAgICBjb25zdCBuZXdPYmogPSBuZXcgQXR0cmlidXRlRGF0YSgpO1xuICAgIG5ld09iai5mZyA9IHRoaXMuZmc7XG4gICAgbmV3T2JqLmJnID0gdGhpcy5iZztcbiAgICBuZXdPYmouZXh0ZW5kZWQgPSB0aGlzLmV4dGVuZGVkLmNsb25lKCk7XG4gICAgcmV0dXJuIG5ld09iajtcbiAgfVxuXG4gIC8vIGRhdGFcbiAgcHVibGljIGZnID0gMDtcbiAgcHVibGljIGJnID0gMDtcbiAgcHVibGljIGV4dGVuZGVkOiBJRXh0ZW5kZWRBdHRycyA9IG5ldyBFeHRlbmRlZEF0dHJzKCk7XG5cbiAgLy8gZmxhZ3NcbiAgcHVibGljIGlzSW52ZXJzZSgpOiBudW1iZXIgICAgICAgeyByZXR1cm4gdGhpcy5mZyAmIEZnRmxhZ3MuSU5WRVJTRTsgfVxuICBwdWJsaWMgaXNCb2xkKCk6IG51bWJlciAgICAgICAgICB7IHJldHVybiB0aGlzLmZnICYgRmdGbGFncy5CT0xEOyB9XG4gIHB1YmxpYyBpc1VuZGVybGluZSgpOiBudW1iZXIgICAgIHtcbiAgICBpZiAodGhpcy5oYXNFeHRlbmRlZEF0dHJzKCkgJiYgdGhpcy5leHRlbmRlZC51bmRlcmxpbmVTdHlsZSAhPT0gVW5kZXJsaW5lU3R5bGUuTk9ORSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZnICYgRmdGbGFncy5VTkRFUkxJTkU7XG4gIH1cbiAgcHVibGljIGlzQmxpbmsoKTogbnVtYmVyICAgICAgICAgeyByZXR1cm4gdGhpcy5mZyAmIEZnRmxhZ3MuQkxJTks7IH1cbiAgcHVibGljIGlzSW52aXNpYmxlKCk6IG51bWJlciAgICAgeyByZXR1cm4gdGhpcy5mZyAmIEZnRmxhZ3MuSU5WSVNJQkxFOyB9XG4gIHB1YmxpYyBpc0l0YWxpYygpOiBudW1iZXIgICAgICAgIHsgcmV0dXJuIHRoaXMuYmcgJiBCZ0ZsYWdzLklUQUxJQzsgfVxuICBwdWJsaWMgaXNEaW0oKTogbnVtYmVyICAgICAgICAgICB7IHJldHVybiB0aGlzLmJnICYgQmdGbGFncy5ESU07IH1cbiAgcHVibGljIGlzU3RyaWtldGhyb3VnaCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5mZyAmIEZnRmxhZ3MuU1RSSUtFVEhST1VHSDsgfVxuICBwdWJsaWMgaXNQcm90ZWN0ZWQoKTogbnVtYmVyICAgICB7IHJldHVybiB0aGlzLmJnICYgQmdGbGFncy5QUk9URUNURUQ7IH1cbiAgcHVibGljIGlzT3ZlcmxpbmUoKTogbnVtYmVyICAgICAgeyByZXR1cm4gdGhpcy5iZyAmIEJnRmxhZ3MuT1ZFUkxJTkU7IH1cblxuICAvLyBjb2xvciBtb2Rlc1xuICBwdWJsaWMgZ2V0RmdDb2xvck1vZGUoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuZmcgJiBBdHRyaWJ1dGVzLkNNX01BU0s7IH1cbiAgcHVibGljIGdldEJnQ29sb3JNb2RlKCk6IG51bWJlciB7IHJldHVybiB0aGlzLmJnICYgQXR0cmlidXRlcy5DTV9NQVNLOyB9XG4gIHB1YmxpYyBpc0ZnUkdCKCk6IGJvb2xlYW4gICAgICAgeyByZXR1cm4gKHRoaXMuZmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSBBdHRyaWJ1dGVzLkNNX1JHQjsgfVxuICBwdWJsaWMgaXNCZ1JHQigpOiBib29sZWFuICAgICAgIHsgcmV0dXJuICh0aGlzLmJnICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9SR0I7IH1cbiAgcHVibGljIGlzRmdQYWxldHRlKCk6IGJvb2xlYW4gICB7IHJldHVybiAodGhpcy5mZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fUDE2IHx8ICh0aGlzLmZnICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9QMjU2OyB9XG4gIHB1YmxpYyBpc0JnUGFsZXR0ZSgpOiBib29sZWFuICAgeyByZXR1cm4gKHRoaXMuYmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSBBdHRyaWJ1dGVzLkNNX1AxNiB8fCAodGhpcy5iZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fUDI1NjsgfVxuICBwdWJsaWMgaXNGZ0RlZmF1bHQoKTogYm9vbGVhbiAgIHsgcmV0dXJuICh0aGlzLmZnICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gMDsgfVxuICBwdWJsaWMgaXNCZ0RlZmF1bHQoKTogYm9vbGVhbiAgIHsgcmV0dXJuICh0aGlzLmJnICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gMDsgfVxuICBwdWJsaWMgaXNBdHRyaWJ1dGVEZWZhdWx0KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5mZyA9PT0gMCAmJiB0aGlzLmJnID09PSAwOyB9XG5cbiAgLy8gY29sb3JzXG4gIHB1YmxpYyBnZXRGZ0NvbG9yKCk6IG51bWJlciB7XG4gICAgc3dpdGNoICh0aGlzLmZnICYgQXR0cmlidXRlcy5DTV9NQVNLKSB7XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDE2OlxuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AyNTY6ICByZXR1cm4gdGhpcy5mZyAmIEF0dHJpYnV0ZXMuUENPTE9SX01BU0s7XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUkdCOiAgIHJldHVybiB0aGlzLmZnICYgQXR0cmlidXRlcy5SR0JfTUFTSztcbiAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOyAgLy8gQ01fREVGQVVMVCBkZWZhdWx0cyB0byAtMVxuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0QmdDb2xvcigpOiBudW1iZXIge1xuICAgIHN3aXRjaCAodGhpcy5iZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykge1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AxNjpcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMjU2OiAgcmV0dXJuIHRoaXMuYmcgJiBBdHRyaWJ1dGVzLlBDT0xPUl9NQVNLO1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1JHQjogICByZXR1cm4gdGhpcy5iZyAmIEF0dHJpYnV0ZXMuUkdCX01BU0s7XG4gICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsgIC8vIENNX0RFRkFVTFQgZGVmYXVsdHMgdG8gLTFcbiAgICB9XG4gIH1cblxuICAvLyBleHRlbmRlZCBhdHRyc1xuICBwdWJsaWMgaGFzRXh0ZW5kZWRBdHRycygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmJnICYgQmdGbGFncy5IQVNfRVhURU5ERUQ7XG4gIH1cbiAgcHVibGljIHVwZGF0ZUV4dGVuZGVkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmV4dGVuZGVkLmlzRW1wdHkoKSkge1xuICAgICAgdGhpcy5iZyAmPSB+QmdGbGFncy5IQVNfRVhURU5ERUQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYmcgfD0gQmdGbGFncy5IQVNfRVhURU5ERUQ7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRVbmRlcmxpbmVDb2xvcigpOiBudW1iZXIge1xuICAgIGlmICgodGhpcy5iZyAmIEJnRmxhZ3MuSEFTX0VYVEVOREVEKSAmJiB+dGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvcikge1xuICAgICAgc3dpdGNoICh0aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yICYgQXR0cmlidXRlcy5DTV9NQVNLKSB7XG4gICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMjU2OiAgcmV0dXJuIHRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3IgJiBBdHRyaWJ1dGVzLlBDT0xPUl9NQVNLO1xuICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUkdCOiAgIHJldHVybiB0aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yICYgQXR0cmlidXRlcy5SR0JfTUFTSztcbiAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGZ0NvbG9yKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldEZnQ29sb3IoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VW5kZXJsaW5lQ29sb3JNb2RlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuICh0aGlzLmJnICYgQmdGbGFncy5IQVNfRVhURU5ERUQpICYmIH50aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yXG4gICAgICA/IHRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3IgJiBBdHRyaWJ1dGVzLkNNX01BU0tcbiAgICAgIDogdGhpcy5nZXRGZ0NvbG9yTW9kZSgpO1xuICB9XG4gIHB1YmxpYyBpc1VuZGVybGluZUNvbG9yUkdCKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5iZyAmIEJnRmxhZ3MuSEFTX0VYVEVOREVEKSAmJiB+dGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvclxuICAgICAgPyAodGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvciAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fUkdCXG4gICAgICA6IHRoaXMuaXNGZ1JHQigpO1xuICB9XG4gIHB1YmxpYyBpc1VuZGVybGluZUNvbG9yUGFsZXR0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMuYmcgJiBCZ0ZsYWdzLkhBU19FWFRFTkRFRCkgJiYgfnRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3JcbiAgICAgID8gKHRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3IgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSBBdHRyaWJ1dGVzLkNNX1AxNlxuICAgICAgICAgIHx8ICh0aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9QMjU2XG4gICAgICA6IHRoaXMuaXNGZ1BhbGV0dGUoKTtcbiAgfVxuICBwdWJsaWMgaXNVbmRlcmxpbmVDb2xvckRlZmF1bHQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLmJnICYgQmdGbGFncy5IQVNfRVhURU5ERUQpICYmIH50aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yXG4gICAgICA/ICh0aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gMFxuICAgICAgOiB0aGlzLmlzRmdEZWZhdWx0KCk7XG4gIH1cbiAgcHVibGljIGdldFVuZGVybGluZVN0eWxlKCk6IFVuZGVybGluZVN0eWxlIHtcbiAgICByZXR1cm4gdGhpcy5mZyAmIEZnRmxhZ3MuVU5ERVJMSU5FXG4gICAgICA/ICh0aGlzLmJnICYgQmdGbGFncy5IQVNfRVhURU5ERUQgPyB0aGlzLmV4dGVuZGVkLnVuZGVybGluZVN0eWxlIDogVW5kZXJsaW5lU3R5bGUuU0lOR0xFKVxuICAgICAgOiBVbmRlcmxpbmVTdHlsZS5OT05FO1xuICB9XG4gIHB1YmxpYyBnZXRVbmRlcmxpbmVWYXJpYW50T2Zmc2V0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lVmFyaWFudE9mZnNldDtcbiAgfVxufVxuXG5cbi8qKlxuICogRXh0ZW5kZWQgYXR0cmlidXRlcyBmb3IgYSBjZWxsLlxuICogSG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgZGlmZmVyZW50IHVuZGVybGluZSBzdHlsZXMgYW5kIGNvbG9yLlxuICovXG5leHBvcnQgY2xhc3MgRXh0ZW5kZWRBdHRycyBpbXBsZW1lbnRzIElFeHRlbmRlZEF0dHJzIHtcbiAgcHJpdmF0ZSBfZXh0OiBudW1iZXIgPSAwO1xuICBwdWJsaWMgZ2V0IGV4dCgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLl91cmxJZCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKHRoaXMuX2V4dCAmIH5FeHRGbGFncy5VTkRFUkxJTkVfU1RZTEUpIHxcbiAgICAgICAgKHRoaXMudW5kZXJsaW5lU3R5bGUgPDwgMjYpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZXh0O1xuICB9XG4gIHB1YmxpYyBzZXQgZXh0KHZhbHVlOiBudW1iZXIpIHsgdGhpcy5fZXh0ID0gdmFsdWU7IH1cblxuICBwdWJsaWMgZ2V0IHVuZGVybGluZVN0eWxlKCk6IFVuZGVybGluZVN0eWxlIHtcbiAgICAvLyBBbHdheXMgcmV0dXJuIHRoZSBVUkwgc3R5bGUgaWYgaXQgaGFzIG9uZVxuICAgIGlmICh0aGlzLl91cmxJZCkge1xuICAgICAgcmV0dXJuIFVuZGVybGluZVN0eWxlLkRBU0hFRDtcbiAgICB9XG4gICAgcmV0dXJuICh0aGlzLl9leHQgJiBFeHRGbGFncy5VTkRFUkxJTkVfU1RZTEUpID4+IDI2O1xuICB9XG4gIHB1YmxpYyBzZXQgdW5kZXJsaW5lU3R5bGUodmFsdWU6IFVuZGVybGluZVN0eWxlKSB7XG4gICAgdGhpcy5fZXh0ICY9IH5FeHRGbGFncy5VTkRFUkxJTkVfU1RZTEU7XG4gICAgdGhpcy5fZXh0IHw9ICh2YWx1ZSA8PCAyNikgJiBFeHRGbGFncy5VTkRFUkxJTkVfU1RZTEU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVuZGVybGluZUNvbG9yKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2V4dCAmIChBdHRyaWJ1dGVzLkNNX01BU0sgfCBBdHRyaWJ1dGVzLlJHQl9NQVNLKTtcbiAgfVxuICBwdWJsaWMgc2V0IHVuZGVybGluZUNvbG9yKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9leHQgJj0gfihBdHRyaWJ1dGVzLkNNX01BU0sgfCBBdHRyaWJ1dGVzLlJHQl9NQVNLKTtcbiAgICB0aGlzLl9leHQgfD0gdmFsdWUgJiAoQXR0cmlidXRlcy5DTV9NQVNLIHwgQXR0cmlidXRlcy5SR0JfTUFTSyk7XG4gIH1cblxuICBwcml2YXRlIF91cmxJZDogbnVtYmVyID0gMDtcbiAgcHVibGljIGdldCB1cmxJZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl91cmxJZDtcbiAgfVxuICBwdWJsaWMgc2V0IHVybElkKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl91cmxJZCA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCB1bmRlcmxpbmVWYXJpYW50T2Zmc2V0KCk6IG51bWJlciB7XG4gICAgY29uc3QgdmFsID0gKHRoaXMuX2V4dCAmIEV4dEZsYWdzLlZBUklBTlRfT0ZGU0VUKSA+PiAyOTtcbiAgICBpZiAodmFsIDwgMCkge1xuICAgICAgcmV0dXJuIHZhbCBeIDB4RkZGRkZGRjg7XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgcHVibGljIHNldCB1bmRlcmxpbmVWYXJpYW50T2Zmc2V0KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9leHQgJj0gfkV4dEZsYWdzLlZBUklBTlRfT0ZGU0VUO1xuICAgIHRoaXMuX2V4dCB8PSAodmFsdWUgPDwgMjkpICYgRXh0RmxhZ3MuVkFSSUFOVF9PRkZTRVQ7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBleHQ6IG51bWJlciA9IDAsXG4gICAgdXJsSWQ6IG51bWJlciA9IDBcbiAgKSB7XG4gICAgdGhpcy5fZXh0ID0gZXh0O1xuICAgIHRoaXMuX3VybElkID0gdXJsSWQ7XG4gIH1cblxuICBwdWJsaWMgY2xvbmUoKTogSUV4dGVuZGVkQXR0cnMge1xuICAgIHJldHVybiBuZXcgRXh0ZW5kZWRBdHRycyh0aGlzLl9leHQsIHRoaXMuX3VybElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW50IG1ldGhvZCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBvYmplY3QgaG9sZHMgbm8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbixcbiAgICogdGhhdCBuZWVkcyB0byBiZSBwZXJzaXN0YW50IGluIHRoZSBidWZmZXIuXG4gICAqL1xuICBwdWJsaWMgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy51bmRlcmxpbmVTdHlsZSA9PT0gVW5kZXJsaW5lU3R5bGUuTk9ORSAmJiB0aGlzLl91cmxJZCA9PT0gMDtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBDaGFyRGF0YSwgSUNlbGxEYXRhLCBJRXh0ZW5kZWRBdHRycyB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBzdHJpbmdGcm9tQ29kZVBvaW50IH0gZnJvbSAnY29tbW9uL2lucHV0L1RleHREZWNvZGVyJztcbmltcG9ydCB7IENIQVJfREFUQV9DSEFSX0lOREVYLCBDSEFSX0RBVEFfV0lEVEhfSU5ERVgsIENIQVJfREFUQV9BVFRSX0lOREVYLCBDb250ZW50IH0gZnJvbSAnY29tbW9uL2J1ZmZlci9Db25zdGFudHMnO1xuaW1wb3J0IHsgQXR0cmlidXRlRGF0YSwgRXh0ZW5kZWRBdHRycyB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQXR0cmlidXRlRGF0YSc7XG5cbi8qKlxuICogQ2VsbERhdGEgLSByZXByZXNlbnRzIGEgc2luZ2xlIENlbGwgaW4gdGhlIHRlcm1pbmFsIGJ1ZmZlci5cbiAqL1xuZXhwb3J0IGNsYXNzIENlbGxEYXRhIGV4dGVuZHMgQXR0cmlidXRlRGF0YSBpbXBsZW1lbnRzIElDZWxsRGF0YSB7XG4gIC8qKiBIZWxwZXIgdG8gY3JlYXRlIENlbGxEYXRhIGZyb20gQ2hhckRhdGEuICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUNoYXJEYXRhKHZhbHVlOiBDaGFyRGF0YSk6IENlbGxEYXRhIHtcbiAgICBjb25zdCBvYmogPSBuZXcgQ2VsbERhdGEoKTtcbiAgICBvYmouc2V0RnJvbUNoYXJEYXRhKHZhbHVlKTtcbiAgICByZXR1cm4gb2JqO1xuICB9XG4gIC8qKiBQcmltaXRpdmVzIGZyb20gdGVybWluYWwgYnVmZmVyLiAqL1xuICBwdWJsaWMgY29udGVudCA9IDA7XG4gIHB1YmxpYyBmZyA9IDA7XG4gIHB1YmxpYyBiZyA9IDA7XG4gIHB1YmxpYyBleHRlbmRlZDogSUV4dGVuZGVkQXR0cnMgPSBuZXcgRXh0ZW5kZWRBdHRycygpO1xuICBwdWJsaWMgY29tYmluZWREYXRhID0gJyc7XG4gIC8qKiBXaGV0aGVyIGNlbGwgY29udGFpbnMgYSBjb21iaW5lZCBzdHJpbmcuICovXG4gIHB1YmxpYyBpc0NvbWJpbmVkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY29udGVudCAmIENvbnRlbnQuSVNfQ09NQklORURfTUFTSztcbiAgfVxuICAvKiogV2lkdGggb2YgdGhlIGNlbGwuICovXG4gIHB1YmxpYyBnZXRXaWR0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbnRlbnQgPj4gQ29udGVudC5XSURUSF9TSElGVDtcbiAgfVxuICAvKiogSlMgc3RyaW5nIG9mIHRoZSBjb250ZW50LiAqL1xuICBwdWJsaWMgZ2V0Q2hhcnMoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5jb250ZW50ICYgQ29udGVudC5JU19DT01CSU5FRF9NQVNLKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21iaW5lZERhdGE7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbnRlbnQgJiBDb250ZW50LkNPREVQT0lOVF9NQVNLKSB7XG4gICAgICByZXR1cm4gc3RyaW5nRnJvbUNvZGVQb2ludCh0aGlzLmNvbnRlbnQgJiBDb250ZW50LkNPREVQT0lOVF9NQVNLKTtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIC8qKlxuICAgKiBDb2RlcG9pbnQgb2YgY2VsbFxuICAgKiBOb3RlIHRoaXMgcmV0dXJucyB0aGUgVVRGMzIgY29kZXBvaW50IG9mIHNpbmdsZSBjaGFycyxcbiAgICogaWYgY29udGVudCBpcyBhIGNvbWJpbmVkIHN0cmluZyBpdCByZXR1cm5zIHRoZSBjb2RlcG9pbnRcbiAgICogb2YgdGhlIGxhc3QgY2hhciBpbiBzdHJpbmcgdG8gYmUgaW4gbGluZSB3aXRoIGNvZGUgaW4gQ2hhckRhdGEuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29kZSgpOiBudW1iZXIge1xuICAgIHJldHVybiAodGhpcy5pc0NvbWJpbmVkKCkpXG4gICAgICA/IHRoaXMuY29tYmluZWREYXRhLmNoYXJDb2RlQXQodGhpcy5jb21iaW5lZERhdGEubGVuZ3RoIC0gMSlcbiAgICAgIDogdGhpcy5jb250ZW50ICYgQ29udGVudC5DT0RFUE9JTlRfTUFTSztcbiAgfVxuICAvKiogU2V0IGRhdGEgZnJvbSBDaGFyRGF0YSAqL1xuICBwdWJsaWMgc2V0RnJvbUNoYXJEYXRhKHZhbHVlOiBDaGFyRGF0YSk6IHZvaWQge1xuICAgIHRoaXMuZmcgPSB2YWx1ZVtDSEFSX0RBVEFfQVRUUl9JTkRFWF07XG4gICAgdGhpcy5iZyA9IDA7XG4gICAgbGV0IGNvbWJpbmVkID0gZmFsc2U7XG4gICAgLy8gc3Vycm9nYXRlcyBhbmQgY29tYmluZWQgc3RyaW5ncyBuZWVkIHNwZWNpYWwgdHJlYXRtZW50XG4gICAgaWYgKHZhbHVlW0NIQVJfREFUQV9DSEFSX0lOREVYXS5sZW5ndGggPiAyKSB7XG4gICAgICBjb21iaW5lZCA9IHRydWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbHVlW0NIQVJfREFUQV9DSEFSX0lOREVYXS5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IGNvZGUgPSB2YWx1ZVtDSEFSX0RBVEFfQ0hBUl9JTkRFWF0uY2hhckNvZGVBdCgwKTtcbiAgICAgIC8vIGlmIHRoZSAyLWNoYXIgc3RyaW5nIGlzIGEgc3Vycm9nYXRlIGNyZWF0ZSBzaW5nbGUgY29kZXBvaW50XG4gICAgICAvLyBldmVyeXRoaW5nIGVsc2UgaXMgY29tYmluZWRcbiAgICAgIGlmICgweEQ4MDAgPD0gY29kZSAmJiBjb2RlIDw9IDB4REJGRikge1xuICAgICAgICBjb25zdCBzZWNvbmQgPSB2YWx1ZVtDSEFSX0RBVEFfQ0hBUl9JTkRFWF0uY2hhckNvZGVBdCgxKTtcbiAgICAgICAgaWYgKDB4REMwMCA8PSBzZWNvbmQgJiYgc2Vjb25kIDw9IDB4REZGRikge1xuICAgICAgICAgIHRoaXMuY29udGVudCA9ICgoY29kZSAtIDB4RDgwMCkgKiAweDQwMCArIHNlY29uZCAtIDB4REMwMCArIDB4MTAwMDApIHwgKHZhbHVlW0NIQVJfREFUQV9XSURUSF9JTkRFWF0gPDwgQ29udGVudC5XSURUSF9TSElGVCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY29tYmluZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29tYmluZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuY29udGVudCA9IHZhbHVlW0NIQVJfREFUQV9DSEFSX0lOREVYXS5jaGFyQ29kZUF0KDApIHwgKHZhbHVlW0NIQVJfREFUQV9XSURUSF9JTkRFWF0gPDwgQ29udGVudC5XSURUSF9TSElGVCk7XG4gICAgfVxuICAgIGlmIChjb21iaW5lZCkge1xuICAgICAgdGhpcy5jb21iaW5lZERhdGEgPSB2YWx1ZVtDSEFSX0RBVEFfQ0hBUl9JTkRFWF07XG4gICAgICB0aGlzLmNvbnRlbnQgPSBDb250ZW50LklTX0NPTUJJTkVEX01BU0sgfCAodmFsdWVbQ0hBUl9EQVRBX1dJRFRIX0lOREVYXSA8PCBDb250ZW50LldJRFRIX1NISUZUKTtcbiAgICB9XG4gIH1cbiAgLyoqIEdldCBkYXRhIGFzIENoYXJEYXRhLiAqL1xuICBwdWJsaWMgZ2V0QXNDaGFyRGF0YSgpOiBDaGFyRGF0YSB7XG4gICAgcmV0dXJuIFt0aGlzLmZnLCB0aGlzLmdldENoYXJzKCksIHRoaXMuZ2V0V2lkdGgoKSwgdGhpcy5nZXRDb2RlKCldO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0NPTE9SID0gMDtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0FUVFIgPSAoMCA8PCAxOCkgfCAoREVGQVVMVF9DT0xPUiA8PCA5KSB8ICgyNTYgPDwgMCk7XG5leHBvcnQgY29uc3QgREVGQVVMVF9FWFQgPSAwO1xuXG5leHBvcnQgY29uc3QgQ0hBUl9EQVRBX0FUVFJfSU5ERVggPSAwO1xuZXhwb3J0IGNvbnN0IENIQVJfREFUQV9DSEFSX0lOREVYID0gMTtcbmV4cG9ydCBjb25zdCBDSEFSX0RBVEFfV0lEVEhfSU5ERVggPSAyO1xuZXhwb3J0IGNvbnN0IENIQVJfREFUQV9DT0RFX0lOREVYID0gMztcblxuLyoqXG4gKiBOdWxsIGNlbGwgLSBhIHJlYWwgZW1wdHkgY2VsbCAoY29udGFpbmluZyBub3RoaW5nKS5cbiAqIE5vdGUgdGhhdCBjb2RlIHNob3VsZCBhbHdheXMgYmUgMCBmb3IgYSBudWxsIGNlbGwgYXNcbiAqIHNldmVyYWwgdGVzdCBjb25kaXRpb24gb2YgdGhlIGJ1ZmZlciBsaW5lIHJlbHkgb24gdGhpcy5cbiAqL1xuZXhwb3J0IGNvbnN0IE5VTExfQ0VMTF9DSEFSID0gJyc7XG5leHBvcnQgY29uc3QgTlVMTF9DRUxMX1dJRFRIID0gMTtcbmV4cG9ydCBjb25zdCBOVUxMX0NFTExfQ09ERSA9IDA7XG5cbi8qKlxuICogV2hpdGVzcGFjZSBjZWxsLlxuICogVGhpcyBpcyBtZWFudCBhcyBhIHJlcGxhY2VtZW50IGZvciBlbXB0eSBjZWxscyB3aGVuIG5lZWRlZFxuICogZHVyaW5nIHJlbmRlcmluZyBsaW5lcyB0byBwcmVzZXJ2ZSBjb3JyZWN0IGFsaWdtZW50LlxuICovXG5leHBvcnQgY29uc3QgV0hJVEVTUEFDRV9DRUxMX0NIQVIgPSAnICc7XG5leHBvcnQgY29uc3QgV0hJVEVTUEFDRV9DRUxMX1dJRFRIID0gMTtcbmV4cG9ydCBjb25zdCBXSElURVNQQUNFX0NFTExfQ09ERSA9IDMyO1xuXG4vKipcbiAqIEJpdG1hc2tzIGZvciBhY2Nlc3NpbmcgZGF0YSBpbiBgY29udGVudGAuXG4gKi9cbmV4cG9ydCBjb25zdCBlbnVtIENvbnRlbnQge1xuICAvKipcbiAgICogYml0IDEuLjIxICAgIGNvZGVwb2ludCwgbWF4IGFsbG93ZWQgaW4gVVRGMzIgaXMgMHgxMEZGRkYgKDIxIGJpdHMgdGFrZW4pXG4gICAqICAgICAgICAgICAgICByZWFkOiAgIGBjb2RlcG9pbnQgPSBjb250ZW50ICYgQ29udGVudC5jb2RlcG9pbnRNYXNrO2BcbiAgICogICAgICAgICAgICAgIHdyaXRlOiAgYGNvbnRlbnQgfD0gY29kZXBvaW50ICYgQ29udGVudC5jb2RlcG9pbnRNYXNrO2BcbiAgICogICAgICAgICAgICAgICAgICAgICAgc2hvcnRjdXQgaWYgcHJlY29uZGl0aW9uIGBjb2RlcG9pbnQgPD0gMHgxMEZGRkZgIGlzIG1ldDpcbiAgICogICAgICAgICAgICAgICAgICAgICAgYGNvbnRlbnQgfD0gY29kZXBvaW50O2BcbiAgICovXG4gIENPREVQT0lOVF9NQVNLID0gMHgxRkZGRkYsXG5cbiAgLyoqXG4gICAqIGJpdCAyMiAgICAgICBmbGFnIGluZGljYXRpb24gd2hldGhlciBhIGNlbGwgY29udGFpbnMgY29tYmluZWQgY29udGVudFxuICAgKiAgICAgICAgICAgICAgcmVhZDogICBgaXNDb21iaW5lZCA9IGNvbnRlbnQgJiBDb250ZW50LmlzQ29tYmluZWQ7YFxuICAgKiAgICAgICAgICAgICAgc2V0OiAgICBgY29udGVudCB8PSBDb250ZW50LmlzQ29tYmluZWQ7YFxuICAgKiAgICAgICAgICAgICAgY2xlYXI6ICBgY29udGVudCAmPSB+Q29udGVudC5pc0NvbWJpbmVkO2BcbiAgICovXG4gIElTX0NPTUJJTkVEX01BU0sgPSAweDIwMDAwMCwgIC8vIDEgPDwgMjFcblxuICAvKipcbiAgICogYml0IDEuLjIyICAgIG1hc2sgdG8gY2hlY2sgd2hldGhlciBhIGNlbGwgY29udGFpbnMgYW55IHN0cmluZyBkYXRhXG4gICAqICAgICAgICAgICAgICB3ZSBuZWVkIHRvIGNoZWNrIGZvciBjb2RlcG9pbnQgYW5kIGlzQ29tYmluZWQgYml0cyB0byBzZWVcbiAgICogICAgICAgICAgICAgIHdoZXRoZXIgYSBjZWxsIGNvbnRhaW5zIGFueXRoaW5nXG4gICAqICAgICAgICAgICAgICByZWFkOiAgIGBpc0VtcHR5ID0gIShjb250ZW50ICYgQ29udGVudC5oYXNDb250ZW50KWBcbiAgICovXG4gIEhBU19DT05URU5UX01BU0sgPSAweDNGRkZGRixcblxuICAvKipcbiAgICogYml0IDIzLi4yNCAgIHdjd2lkdGggdmFsdWUgb2YgY2VsbCwgdGFrZXMgMiBiaXRzIChyYW5nZXMgZnJvbSAwLi4yKVxuICAgKiAgICAgICAgICAgICAgcmVhZDogICBgd2lkdGggPSAoY29udGVudCAmIENvbnRlbnQud2lkdGhNYXNrKSA+PiBDb250ZW50LndpZHRoU2hpZnQ7YFxuICAgKiAgICAgICAgICAgICAgICAgICAgICBgaGFzV2lkdGggPSBjb250ZW50ICYgQ29udGVudC53aWR0aE1hc2s7YFxuICAgKiAgICAgICAgICAgICAgICAgICAgICBhcyBsb25nIGFzIHdjd2lkdGggaXMgaGlnaGVzdCB2YWx1ZSBpbiBgY29udGVudGA6XG4gICAqICAgICAgICAgICAgICAgICAgICAgIGB3aWR0aCA9IGNvbnRlbnQgPj4gQ29udGVudC53aWR0aFNoaWZ0O2BcbiAgICogICAgICAgICAgICAgIHdyaXRlOiAgYGNvbnRlbnQgfD0gKHdpZHRoIDw8IENvbnRlbnQud2lkdGhTaGlmdCkgJiBDb250ZW50LndpZHRoTWFzaztgXG4gICAqICAgICAgICAgICAgICAgICAgICAgIHNob3J0Y3V0IGlmIHByZWNvbmRpdGlvbiBgMCA8PSB3aWR0aCA8PSAzYCBpcyBtZXQ6XG4gICAqICAgICAgICAgICAgICAgICAgICAgIGBjb250ZW50IHw9IHdpZHRoIDw8IENvbnRlbnQud2lkdGhTaGlmdDtgXG4gICAqL1xuICBXSURUSF9NQVNLID0gMHhDMDAwMDAsICAgLy8gMyA8PCAyMlxuICBXSURUSF9TSElGVCA9IDIyXG59XG5cbmV4cG9ydCBjb25zdCBlbnVtIEF0dHJpYnV0ZXMge1xuICAvKipcbiAgICogYml0IDEuLjggICAgIGJsdWUgaW4gUkdCLCBjb2xvciBpbiBQMjU2IGFuZCBQMTZcbiAgICovXG4gIEJMVUVfTUFTSyA9IDB4RkYsXG4gIEJMVUVfU0hJRlQgPSAwLFxuICBQQ09MT1JfTUFTSyA9IDB4RkYsXG4gIFBDT0xPUl9TSElGVCA9IDAsXG5cbiAgLyoqXG4gICAqIGJpdCA5Li4xNiAgICBncmVlbiBpbiBSR0JcbiAgICovXG4gIEdSRUVOX01BU0sgPSAweEZGMDAsXG4gIEdSRUVOX1NISUZUID0gOCxcblxuICAvKipcbiAgICogYml0IDE3Li4yNCAgIHJlZCBpbiBSR0JcbiAgICovXG4gIFJFRF9NQVNLID0gMHhGRjAwMDAsXG4gIFJFRF9TSElGVCA9IDE2LFxuXG4gIC8qKlxuICAgKiBiaXQgMjUuLjI2ICAgY29sb3IgbW9kZTogREVGQVVMVCAoMCkgfCBQMTYgKDEpIHwgUDI1NiAoMikgfCBSR0IgKDMpXG4gICAqL1xuICBDTV9NQVNLID0gMHgzMDAwMDAwLFxuICBDTV9ERUZBVUxUID0gMCxcbiAgQ01fUDE2ID0gMHgxMDAwMDAwLFxuICBDTV9QMjU2ID0gMHgyMDAwMDAwLFxuICBDTV9SR0IgPSAweDMwMDAwMDAsXG5cbiAgLyoqXG4gICAqIGJpdCAxLi4yNCAgUkdCIHJvb21cbiAgICovXG4gIFJHQl9NQVNLID0gMHhGRkZGRkZcbn1cblxuZXhwb3J0IGNvbnN0IGVudW0gRmdGbGFncyB7XG4gIC8qKlxuICAgKiBiaXQgMjcuLjMyXG4gICAqL1xuICBJTlZFUlNFID0gMHg0MDAwMDAwLFxuICBCT0xEID0gMHg4MDAwMDAwLFxuICBVTkRFUkxJTkUgPSAweDEwMDAwMDAwLFxuICBCTElOSyA9IDB4MjAwMDAwMDAsXG4gIElOVklTSUJMRSA9IDB4NDAwMDAwMDAsXG4gIFNUUklLRVRIUk9VR0ggPSAweDgwMDAwMDAwLFxufVxuXG5leHBvcnQgY29uc3QgZW51bSBCZ0ZsYWdzIHtcbiAgLyoqXG4gICAqIGJpdCAyNy4uMzIgKHVwcGVyIDIgdW51c2VkKVxuICAgKi9cbiAgSVRBTElDID0gMHg0MDAwMDAwLFxuICBESU0gPSAweDgwMDAwMDAsXG4gIEhBU19FWFRFTkRFRCA9IDB4MTAwMDAwMDAsXG4gIFBST1RFQ1RFRCA9IDB4MjAwMDAwMDAsXG4gIE9WRVJMSU5FID0gMHg0MDAwMDAwMFxufVxuXG5leHBvcnQgY29uc3QgZW51bSBFeHRGbGFncyB7XG4gIC8qKlxuICAgKiBiaXQgMjcuLjI5XG4gICAqL1xuICBVTkRFUkxJTkVfU1RZTEUgPSAweDFDMDAwMDAwLFxuXG4gIC8qKlxuICAgKiBiaXQgMzAuLjMyXG4gICAqXG4gICAqIEFuIG9wdGlvbmFsIHZhcmlhbnQgZm9yIHRoZSBnbHlwaCwgdGhpcyBjYW4gYmUgdXNlZCBmb3IgZXhhbXBsZSB0byBvZmZzZXQgdW5kZXJsaW5lcyBieSBhXG4gICAqIG51bWJlciBvZiBwaXhlbHMgdG8gY3JlYXRlIGEgcGVyZmVjdCBwYXR0ZXJuLlxuICAgKi9cbiAgVkFSSUFOVF9PRkZTRVQgPSAweEUwMDAwMDAwXG59XG5cbmV4cG9ydCBjb25zdCBlbnVtIFVuZGVybGluZVN0eWxlIHtcbiAgTk9ORSA9IDAsXG4gIFNJTkdMRSA9IDEsXG4gIERPVUJMRSA9IDIsXG4gIENVUkxZID0gMyxcbiAgRE9UVEVEID0gNCxcbiAgREFTSEVEID0gNVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG4vKipcbiAqIFBvbHlmaWxsIC0gQ29udmVydCBVVEYzMiBjb2RlcG9pbnQgaW50byBKUyBzdHJpbmcuXG4gKiBOb3RlOiBUaGUgYnVpbHQtaW4gU3RyaW5nLmZyb21Db2RlUG9pbnQgaGFwcGVucyB0byBiZSBtdWNoIHNsb3dlclxuICogICAgICAgZHVlIHRvIGFkZGl0aW9uYWwgc2FuaXR5IGNoZWNrcy4gV2UgY2FuIGF2b2lkIHRoZW0gc2luY2VcbiAqICAgICAgIHdlIGFsd2F5cyBvcGVyYXRlIG9uIGxlZ2FsIFVURjMyIChncmFudGVkIGJ5IHRoZSBpbnB1dCBkZWNvZGVycylcbiAqICAgICAgIGFuZCB1c2UgdGhpcyBmYXN0ZXIgdmVyc2lvbiBpbnN0ZWFkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nRnJvbUNvZGVQb2ludChjb2RlUG9pbnQ6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMDtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSgoY29kZVBvaW50ID4+IDEwKSArIDB4RDgwMCkgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKChjb2RlUG9pbnQgJSAweDQwMCkgKyAweERDMDApO1xuICB9XG4gIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGVQb2ludCk7XG59XG5cbi8qKlxuICogQ29udmVydCBVVEYzMiBjaGFyIGNvZGVzIGludG8gSlMgc3RyaW5nLlxuICogQmFzaWNhbGx5IHRoZSBzYW1lIGFzIGBzdHJpbmdGcm9tQ29kZVBvaW50YCBidXQgZm9yIG11bHRpcGxlIGNvZGVwb2ludHNcbiAqIGluIGEgbG9vcCAod2hpY2ggaXMgYSBsb3QgZmFzdGVyKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHV0ZjMyVG9TdHJpbmcoZGF0YTogVWludDMyQXJyYXksIHN0YXJ0OiBudW1iZXIgPSAwLCBlbmQ6IG51bWJlciA9IGRhdGEubGVuZ3RoKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIGxldCBjb2RlcG9pbnQgPSBkYXRhW2ldO1xuICAgIGlmIChjb2RlcG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIEpTIHN0cmluZ3MgYXJlIGVuY29kZWQgYXMgVVRGMTYsIHRodXMgYSBub24gQk1QIGNvZGVwb2ludCBnZXRzIGNvbnZlcnRlZCBpbnRvIGEgc3Vycm9nYXRlXG4gICAgICAvLyBwYWlyIGNvbnZlcnNpb24gcnVsZXM6XG4gICAgICAvLyAgLSBzdWJ0cmFjdCAweDEwMDAwIGZyb20gY29kZSBwb2ludCwgbGVhdmluZyBhIDIwIGJpdCBudW1iZXJcbiAgICAgIC8vICAtIGFkZCBoaWdoIDEwIGJpdHMgdG8gMHhEODAwICAtLT4gZmlyc3Qgc3Vycm9nYXRlXG4gICAgICAvLyAgLSBhZGQgbG93IDEwIGJpdHMgdG8gMHhEQzAwICAgLS0+IHNlY29uZCBzdXJyb2dhdGVcbiAgICAgIGNvZGVwb2ludCAtPSAweDEwMDAwO1xuICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGNvZGVwb2ludCA+PiAxMCkgKyAweEQ4MDApICsgU3RyaW5nLmZyb21DaGFyQ29kZSgoY29kZXBvaW50ICUgMHg0MDApICsgMHhEQzAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZXBvaW50KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBTdHJpbmdUb1V0ZjMyIC0gZGVjb2RlcyBVVEYxNiBzZXF1ZW5jZXMgaW50byBVVEYzMiBjb2RlcG9pbnRzLlxuICogVG8ga2VlcCB0aGUgZGVjb2RlciBpbiBsaW5lIHdpdGggSlMgc3RyaW5ncyBpdCBoYW5kbGVzIHNpbmdsZSBzdXJyb2dhdGVzIGFzIFVDUzIuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHJpbmdUb1V0ZjMyIHtcbiAgcHJpdmF0ZSBfaW50ZXJpbTogbnVtYmVyID0gMDtcblxuICAvKipcbiAgICogQ2xlYXJzIGludGVyaW0gYW5kIHJlc2V0cyBkZWNvZGVyIHRvIGNsZWFuIHN0YXRlLlxuICAgKi9cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuX2ludGVyaW0gPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZSBKUyBzdHJpbmcgdG8gVVRGMzIgY29kZXBvaW50cy5cbiAgICogVGhlIG1ldGhvZHMgYXNzdW1lcyBzdHJlYW0gaW5wdXQgYW5kIHdpbGwgc3RvcmUgcGFydGx5IHRyYW5zbWl0dGVkXG4gICAqIHN1cnJvZ2F0ZSBwYWlycyBhbmQgZGVjb2RlIHRoZW0gd2l0aCB0aGUgbmV4dCBkYXRhIGNodW5rLlxuICAgKiBOb3RlOiBUaGUgbWV0aG9kIGRvZXMgbm8gYm91bmQgY2hlY2tzIGZvciB0YXJnZXQsIHRoZXJlZm9yZSBtYWtlIHN1cmVcbiAgICogdGhlIHByb3ZpZGVkIGlucHV0IGRhdGEgZG9lcyBub3QgZXhjZWVkIHRoZSBzaXplIG9mIGB0YXJnZXRgLlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygd3JpdHRlbiBjb2RlcG9pbnRzIGluIGB0YXJnZXRgLlxuICAgKi9cbiAgcHVibGljIGRlY29kZShpbnB1dDogc3RyaW5nLCB0YXJnZXQ6IFVpbnQzMkFycmF5KTogbnVtYmVyIHtcbiAgICBjb25zdCBsZW5ndGggPSBpbnB1dC5sZW5ndGg7XG5cbiAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgbGV0IHNpemUgPSAwO1xuICAgIGxldCBzdGFydFBvcyA9IDA7XG5cbiAgICAvLyBoYW5kbGUgbGVmdG92ZXIgc3Vycm9nYXRlIGhpZ2hcbiAgICBpZiAodGhpcy5faW50ZXJpbSkge1xuICAgICAgY29uc3Qgc2Vjb25kID0gaW5wdXQuY2hhckNvZGVBdChzdGFydFBvcysrKTtcbiAgICAgIGlmICgweERDMDAgPD0gc2Vjb25kICYmIHNlY29uZCA8PSAweERGRkYpIHtcbiAgICAgICAgdGFyZ2V0W3NpemUrK10gPSAodGhpcy5faW50ZXJpbSAtIDB4RDgwMCkgKiAweDQwMCArIHNlY29uZCAtIDB4REMwMCArIDB4MTAwMDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpbGxlZ2FsIGNvZGVwb2ludCAoVVNDMiBoYW5kbGluZylcbiAgICAgICAgdGFyZ2V0W3NpemUrK10gPSB0aGlzLl9pbnRlcmltO1xuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IHNlY29uZDtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2ludGVyaW0gPSAwO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSBzdGFydFBvczsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCBjb2RlID0gaW5wdXQuY2hhckNvZGVBdChpKTtcbiAgICAgIC8vIHN1cnJvZ2F0ZSBwYWlyIGZpcnN0XG4gICAgICBpZiAoMHhEODAwIDw9IGNvZGUgJiYgY29kZSA8PSAweERCRkYpIHtcbiAgICAgICAgaWYgKCsraSA+PSBsZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLl9pbnRlcmltID0gY29kZTtcbiAgICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWNvbmQgPSBpbnB1dC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBpZiAoMHhEQzAwIDw9IHNlY29uZCAmJiBzZWNvbmQgPD0gMHhERkZGKSB7XG4gICAgICAgICAgdGFyZ2V0W3NpemUrK10gPSAoY29kZSAtIDB4RDgwMCkgKiAweDQwMCArIHNlY29uZCAtIDB4REMwMCArIDB4MTAwMDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gaWxsZWdhbCBjb2RlcG9pbnQgKFVTQzIgaGFuZGxpbmcpXG4gICAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBjb2RlO1xuICAgICAgICAgIHRhcmdldFtzaXplKytdID0gc2Vjb25kO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNvZGUgPT09IDB4RkVGRikge1xuICAgICAgICAvLyBCT01cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0YXJnZXRbc2l6ZSsrXSA9IGNvZGU7XG4gICAgfVxuICAgIHJldHVybiBzaXplO1xuICB9XG59XG5cbi8qKlxuICogVXRmOERlY29kZXIgLSBkZWNvZGVzIFVURjggYnl0ZSBzZXF1ZW5jZXMgaW50byBVVEYzMiBjb2RlcG9pbnRzLlxuICovXG5leHBvcnQgY2xhc3MgVXRmOFRvVXRmMzIge1xuICBwdWJsaWMgaW50ZXJpbTogVWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KDMpO1xuXG4gIC8qKlxuICAgKiBDbGVhcnMgaW50ZXJpbSBieXRlcyBhbmQgcmVzZXRzIGRlY29kZXIgdG8gY2xlYW4gc3RhdGUuXG4gICAqL1xuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5pbnRlcmltLmZpbGwoMCk7XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlcyBVVEY4IGJ5dGUgc2VxdWVuY2VzIGluIGBpbnB1dGAgdG8gVVRGMzIgY29kZXBvaW50cyBpbiBgdGFyZ2V0YC5cbiAgICogVGhlIG1ldGhvZHMgYXNzdW1lcyBzdHJlYW0gaW5wdXQgYW5kIHdpbGwgc3RvcmUgcGFydGx5IHRyYW5zbWl0dGVkIGJ5dGVzXG4gICAqIGFuZCBkZWNvZGUgdGhlbSB3aXRoIHRoZSBuZXh0IGRhdGEgY2h1bmsuXG4gICAqIE5vdGU6IFRoZSBtZXRob2QgZG9lcyBubyBib3VuZCBjaGVja3MgZm9yIHRhcmdldCwgdGhlcmVmb3JlIG1ha2Ugc3VyZVxuICAgKiB0aGUgcHJvdmlkZWQgZGF0YSBjaHVuayBkb2VzIG5vdCBleGNlZWQgdGhlIHNpemUgb2YgYHRhcmdldGAuXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB3cml0dGVuIGNvZGVwb2ludHMgaW4gYHRhcmdldGAuXG4gICAqL1xuICBwdWJsaWMgZGVjb2RlKGlucHV0OiBVaW50OEFycmF5LCB0YXJnZXQ6IFVpbnQzMkFycmF5KTogbnVtYmVyIHtcbiAgICBjb25zdCBsZW5ndGggPSBpbnB1dC5sZW5ndGg7XG5cbiAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgbGV0IHNpemUgPSAwO1xuICAgIGxldCBieXRlMTogbnVtYmVyO1xuICAgIGxldCBieXRlMjogbnVtYmVyO1xuICAgIGxldCBieXRlMzogbnVtYmVyO1xuICAgIGxldCBieXRlNDogbnVtYmVyO1xuICAgIGxldCBjb2RlcG9pbnQgPSAwO1xuICAgIGxldCBzdGFydFBvcyA9IDA7XG5cbiAgICAvLyBoYW5kbGUgbGVmdG92ZXIgYnl0ZXNcbiAgICBpZiAodGhpcy5pbnRlcmltWzBdKSB7XG4gICAgICBsZXQgZGlzY2FyZEludGVyaW0gPSBmYWxzZTtcbiAgICAgIGxldCBjcCA9IHRoaXMuaW50ZXJpbVswXTtcbiAgICAgIGNwICY9ICgoKChjcCAmIDB4RTApID09PSAweEMwKSkgPyAweDFGIDogKCgoY3AgJiAweEYwKSA9PT0gMHhFMCkpID8gMHgwRiA6IDB4MDcpO1xuICAgICAgbGV0IHBvcyA9IDA7XG4gICAgICBsZXQgdG1wOiBudW1iZXI7XG4gICAgICB3aGlsZSAoKHRtcCA9IHRoaXMuaW50ZXJpbVsrK3Bvc10gJiAweDNGKSAmJiBwb3MgPCA0KSB7XG4gICAgICAgIGNwIDw8PSA2O1xuICAgICAgICBjcCB8PSB0bXA7XG4gICAgICB9XG4gICAgICAvLyBtaXNzaW5nIGJ5dGVzIC0gcmVhZCBhaGVhZCBmcm9tIGlucHV0XG4gICAgICBjb25zdCB0eXBlID0gKCgodGhpcy5pbnRlcmltWzBdICYgMHhFMCkgPT09IDB4QzApKSA/IDIgOiAoKCh0aGlzLmludGVyaW1bMF0gJiAweEYwKSA9PT0gMHhFMCkpID8gMyA6IDQ7XG4gICAgICBjb25zdCBtaXNzaW5nID0gdHlwZSAtIHBvcztcbiAgICAgIHdoaWxlIChzdGFydFBvcyA8IG1pc3NpbmcpIHtcbiAgICAgICAgaWYgKHN0YXJ0UG9zID49IGxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHRtcCA9IGlucHV0W3N0YXJ0UG9zKytdO1xuICAgICAgICBpZiAoKHRtcCAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICAgICAgLy8gd3JvbmcgY29udGludWF0aW9uLCBkaXNjYXJkIGludGVyaW0gYnl0ZXMgY29tcGxldGVseVxuICAgICAgICAgIHN0YXJ0UG9zLS07XG4gICAgICAgICAgZGlzY2FyZEludGVyaW0gPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIG5lZWQgdG8gc2F2ZSBzbyB3ZSBjYW4gY29udGludWUgc2hvcnQgaW5wdXRzIGluIG5leHQgY2FsbFxuICAgICAgICAgIHRoaXMuaW50ZXJpbVtwb3MrK10gPSB0bXA7XG4gICAgICAgICAgY3AgPDw9IDY7XG4gICAgICAgICAgY3AgfD0gdG1wICYgMHgzRjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFkaXNjYXJkSW50ZXJpbSkge1xuICAgICAgICAvLyBmaW5hbCB0ZXN0IGlzIHR5cGUgZGVwZW5kZW50XG4gICAgICAgIGlmICh0eXBlID09PSAyKSB7XG4gICAgICAgICAgaWYgKGNwIDwgMHg4MCkge1xuICAgICAgICAgICAgLy8gd3Jvbmcgc3RhcnRlciBieXRlXG4gICAgICAgICAgICBzdGFydFBvcy0tO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGNwO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAzKSB7XG4gICAgICAgICAgaWYgKGNwIDwgMHgwODAwIHx8IChjcCA+PSAweEQ4MDAgJiYgY3AgPD0gMHhERkZGKSB8fCBjcCA9PT0gMHhGRUZGKSB7XG4gICAgICAgICAgICAvLyBpbGxlZ2FsIGNvZGVwb2ludCBvciBCT01cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBjcDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGNwIDwgMHgwMTAwMDAgfHwgY3AgPiAweDEwRkZGRikge1xuICAgICAgICAgICAgLy8gaWxsZWdhbCBjb2RlcG9pbnRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBjcDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuaW50ZXJpbS5maWxsKDApO1xuICAgIH1cblxuICAgIC8vIGxvb3AgdGhyb3VnaCBpbnB1dFxuICAgIGNvbnN0IGZvdXJTdG9wID0gbGVuZ3RoIC0gNDtcbiAgICBsZXQgaSA9IHN0YXJ0UG9zO1xuICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEFTQ0lJIHNob3J0Y3V0IHdpdGggbG9vcCB1bnJvbGxlZCB0byA0IGNvbnNlY3V0aXZlIEFTQ0lJIGNoYXJzLlxuICAgICAgICogVGhpcyBpcyBhIGNvbXByb21pc2UgYmV0d2VlbiBzcGVlZCBnYWluIGZvciBBU0NJSVxuICAgICAgICogYW5kIHBlbmFsdHkgZm9yIG5vbiBBU0NJSTpcbiAgICAgICAqIEZvciBiZXN0IEFTQ0lJIHBlcmZvcm1hbmNlIHRoZSBjaGFyIHNob3VsZCBiZSBzdG9yZWQgZGlyZWN0bHkgaW50byB0YXJnZXQsXG4gICAgICAgKiBidXQgZXZlbiBhIHNpbmdsZSBhdHRlbXB0IHRvIHdyaXRlIHRvIHRhcmdldCBhbmQgY29tcGFyZSBhZnRlcndhcmRzXG4gICAgICAgKiBwZW5hbGl6ZXMgbm9uIEFTQ0lJIHJlYWxseSBiYWQgKC01MCUpLCB0aHVzIHdlIGxvYWQgdGhlIGNoYXIgaW50byBieXRlWCBmaXJzdCxcbiAgICAgICAqIHdoaWNoIHJlZHVjZXMgQVNDSUkgcGVyZm9ybWFuY2UgYnkgfjE1JS5cbiAgICAgICAqIFRoaXMgdHJpYWwgZm9yIEFTQ0lJIHJlZHVjZXMgbm9uIEFTQ0lJIHBlcmZvcm1hbmNlIGJ5IH4xMCUgd2hpY2ggc2VlbXMgYWNjZXB0aWJsZVxuICAgICAgICogY29tcGFyZWQgdG8gdGhlIGdhaW5zLlxuICAgICAgICogTm90ZSB0aGF0IHRoaXMgb3B0aW1pemF0aW9uIG9ubHkgdGFrZXMgcGxhY2UgZm9yIDQgY29uc2VjdXRpdmUgQVNDSUkgY2hhcnMsXG4gICAgICAgKiBmb3IgYW55IHNob3J0ZXIgaXQgYmFpbHMgb3V0LiBXb3JzdCBjYXNlIC0gYWxsIDQgYnl0ZXMgYmVpbmcgcmVhZCBidXRcbiAgICAgICAqIHRocm93biBhd2F5IGR1ZSB0byB0aGUgbGFzdCBiZWluZyBhIG5vbiBBU0NJSSBjaGFyICgtMTAlIHBlcmZvcm1hbmNlKS5cbiAgICAgICAqL1xuICAgICAgd2hpbGUgKGkgPCBmb3VyU3RvcFxuICAgICAgICAmJiAhKChieXRlMSA9IGlucHV0W2ldKSAmIDB4ODApXG4gICAgICAgICYmICEoKGJ5dGUyID0gaW5wdXRbaSArIDFdKSAmIDB4ODApXG4gICAgICAgICYmICEoKGJ5dGUzID0gaW5wdXRbaSArIDJdKSAmIDB4ODApXG4gICAgICAgICYmICEoKGJ5dGU0ID0gaW5wdXRbaSArIDNdKSAmIDB4ODApKVxuICAgICAge1xuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGJ5dGUxO1xuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGJ5dGUyO1xuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGJ5dGUzO1xuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGJ5dGU0O1xuICAgICAgICBpICs9IDQ7XG4gICAgICB9XG5cbiAgICAgIC8vIHJlcmVhZCBieXRlMVxuICAgICAgYnl0ZTEgPSBpbnB1dFtpKytdO1xuXG4gICAgICAvLyAxIGJ5dGVcbiAgICAgIGlmIChieXRlMSA8IDB4ODApIHtcbiAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBieXRlMTtcblxuICAgICAgICAvLyAyIGJ5dGVzXG4gICAgICB9IGVsc2UgaWYgKChieXRlMSAmIDB4RTApID09PSAweEMwKSB7XG4gICAgICAgIGlmIChpID49IGxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVswXSA9IGJ5dGUxO1xuICAgICAgICAgIHJldHVybiBzaXplO1xuICAgICAgICB9XG4gICAgICAgIGJ5dGUyID0gaW5wdXRbaSsrXTtcbiAgICAgICAgaWYgKChieXRlMiAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICAgICAgLy8gd3JvbmcgY29udGludWF0aW9uXG4gICAgICAgICAgaS0tO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvZGVwb2ludCA9IChieXRlMSAmIDB4MUYpIDw8IDYgfCAoYnl0ZTIgJiAweDNGKTtcbiAgICAgICAgaWYgKGNvZGVwb2ludCA8IDB4ODApIHtcbiAgICAgICAgICAvLyB3cm9uZyBzdGFydGVyIGJ5dGVcbiAgICAgICAgICBpLS07XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBjb2RlcG9pbnQ7XG5cbiAgICAgICAgLy8gMyBieXRlc1xuICAgICAgfSBlbHNlIGlmICgoYnl0ZTEgJiAweEYwKSA9PT0gMHhFMCkge1xuICAgICAgICBpZiAoaSA+PSBsZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmludGVyaW1bMF0gPSBieXRlMTtcbiAgICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBieXRlMiA9IGlucHV0W2krK107XG4gICAgICAgIGlmICgoYnl0ZTIgJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgICAgIC8vIHdyb25nIGNvbnRpbnVhdGlvblxuICAgICAgICAgIGktLTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA+PSBsZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmludGVyaW1bMF0gPSBieXRlMTtcbiAgICAgICAgICB0aGlzLmludGVyaW1bMV0gPSBieXRlMjtcbiAgICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBieXRlMyA9IGlucHV0W2krK107XG4gICAgICAgIGlmICgoYnl0ZTMgJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgICAgIC8vIHdyb25nIGNvbnRpbnVhdGlvblxuICAgICAgICAgIGktLTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb2RlcG9pbnQgPSAoYnl0ZTEgJiAweDBGKSA8PCAxMiB8IChieXRlMiAmIDB4M0YpIDw8IDYgfCAoYnl0ZTMgJiAweDNGKTtcbiAgICAgICAgaWYgKGNvZGVwb2ludCA8IDB4MDgwMCB8fCAoY29kZXBvaW50ID49IDB4RDgwMCAmJiBjb2RlcG9pbnQgPD0gMHhERkZGKSB8fCBjb2RlcG9pbnQgPT09IDB4RkVGRikge1xuICAgICAgICAgIC8vIGlsbGVnYWwgY29kZXBvaW50IG9yIEJPTSwgbm8gaS0tIGhlcmVcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGNvZGVwb2ludDtcblxuICAgICAgICAvLyA0IGJ5dGVzXG4gICAgICB9IGVsc2UgaWYgKChieXRlMSAmIDB4RjgpID09PSAweEYwKSB7XG4gICAgICAgIGlmIChpID49IGxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVswXSA9IGJ5dGUxO1xuICAgICAgICAgIHJldHVybiBzaXplO1xuICAgICAgICB9XG4gICAgICAgIGJ5dGUyID0gaW5wdXRbaSsrXTtcbiAgICAgICAgaWYgKChieXRlMiAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICAgICAgLy8gd3JvbmcgY29udGludWF0aW9uXG4gICAgICAgICAgaS0tO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpID49IGxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVswXSA9IGJ5dGUxO1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVsxXSA9IGJ5dGUyO1xuICAgICAgICAgIHJldHVybiBzaXplO1xuICAgICAgICB9XG4gICAgICAgIGJ5dGUzID0gaW5wdXRbaSsrXTtcbiAgICAgICAgaWYgKChieXRlMyAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICAgICAgLy8gd3JvbmcgY29udGludWF0aW9uXG4gICAgICAgICAgaS0tO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpID49IGxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVswXSA9IGJ5dGUxO1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVsxXSA9IGJ5dGUyO1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVsyXSA9IGJ5dGUzO1xuICAgICAgICAgIHJldHVybiBzaXplO1xuICAgICAgICB9XG4gICAgICAgIGJ5dGU0ID0gaW5wdXRbaSsrXTtcbiAgICAgICAgaWYgKChieXRlNCAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICAgICAgLy8gd3JvbmcgY29udGludWF0aW9uXG4gICAgICAgICAgaS0tO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvZGVwb2ludCA9IChieXRlMSAmIDB4MDcpIDw8IDE4IHwgKGJ5dGUyICYgMHgzRikgPDwgMTIgfCAoYnl0ZTMgJiAweDNGKSA8PCA2IHwgKGJ5dGU0ICYgMHgzRik7XG4gICAgICAgIGlmIChjb2RlcG9pbnQgPCAweDAxMDAwMCB8fCBjb2RlcG9pbnQgPiAweDEwRkZGRikge1xuICAgICAgICAgIC8vIGlsbGVnYWwgY29kZXBvaW50LCBubyBpLS0gaGVyZVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldFtzaXplKytdID0gY29kZXBvaW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWxsZWdhbCBieXRlLCBqdXN0IHNraXBcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNpemU7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgSUxvZ1NlcnZpY2UsIElPcHRpb25zU2VydmljZSwgTG9nTGV2ZWxFbnVtIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxudHlwZSBMb2dUeXBlID0gKG1lc3NhZ2U/OiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSkgPT4gdm9pZDtcblxuaW50ZXJmYWNlIElDb25zb2xlIHtcbiAgbG9nOiBMb2dUeXBlO1xuICBlcnJvcjogTG9nVHlwZTtcbiAgaW5mbzogTG9nVHlwZTtcbiAgdHJhY2U6IExvZ1R5cGU7XG4gIHdhcm46IExvZ1R5cGU7XG59XG5cbi8vIGNvbnNvbGUgaXMgYXZhaWxhYmxlIG9uIGJvdGggbm9kZS5qcyBhbmQgYnJvd3NlciBjb250ZXh0cyBidXQgdGhlIGNvbW1vblxuLy8gbW9kdWxlIGRvZXNuJ3QgZGVwZW5kIG9uIHRoZW0gc28gd2UgbmVlZCB0byBleHBsaWNpdGx5IGRlY2xhcmUgaXQuXG5kZWNsYXJlIGNvbnN0IGNvbnNvbGU6IElDb25zb2xlO1xuXG5jb25zdCBvcHRpb25zS2V5VG9Mb2dMZXZlbDogeyBba2V5OiBzdHJpbmddOiBMb2dMZXZlbEVudW0gfSA9IHtcbiAgdHJhY2U6IExvZ0xldmVsRW51bS5UUkFDRSxcbiAgZGVidWc6IExvZ0xldmVsRW51bS5ERUJVRyxcbiAgaW5mbzogTG9nTGV2ZWxFbnVtLklORk8sXG4gIHdhcm46IExvZ0xldmVsRW51bS5XQVJOLFxuICBlcnJvcjogTG9nTGV2ZWxFbnVtLkVSUk9SLFxuICBvZmY6IExvZ0xldmVsRW51bS5PRkZcbn07XG5cbmNvbnN0IExPR19QUkVGSVggPSAneHRlcm0uanM6ICc7XG5cbmV4cG9ydCBjbGFzcyBMb2dTZXJ2aWNlIGV4dGVuZHMgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElMb2dTZXJ2aWNlIHtcbiAgcHVibGljIHNlcnZpY2VCcmFuZDogYW55O1xuXG4gIHByaXZhdGUgX2xvZ0xldmVsOiBMb2dMZXZlbEVudW0gPSBMb2dMZXZlbEVudW0uT0ZGO1xuICBwdWJsaWMgZ2V0IGxvZ0xldmVsKCk6IExvZ0xldmVsRW51bSB7IHJldHVybiB0aGlzLl9sb2dMZXZlbDsgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJT3B0aW9uc1NlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX3VwZGF0ZUxvZ0xldmVsKCk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9vcHRpb25zU2VydmljZS5vblNwZWNpZmljT3B0aW9uQ2hhbmdlKCdsb2dMZXZlbCcsICgpID0+IHRoaXMuX3VwZGF0ZUxvZ0xldmVsKCkpKTtcblxuICAgIC8vIEZvciB0cmFjZSBsb2dnaW5nLCBhc3N1bWUgdGhlIGxhdGVzdCBjcmVhdGVkIGxvZyBzZXJ2aWNlIGlzIHZhbGlkXG4gICAgdHJhY2VMb2dnZXIgPSB0aGlzO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlTG9nTGV2ZWwoKTogdm9pZCB7XG4gICAgdGhpcy5fbG9nTGV2ZWwgPSBvcHRpb25zS2V5VG9Mb2dMZXZlbFt0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmxvZ0xldmVsXTtcbiAgfVxuXG4gIHByaXZhdGUgX2V2YWxMYXp5T3B0aW9uYWxQYXJhbXMob3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZCB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcHRpb25hbFBhcmFtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb25hbFBhcmFtc1tpXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvcHRpb25hbFBhcmFtc1tpXSA9IG9wdGlvbmFsUGFyYW1zW2ldKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbG9nKHR5cGU6IExvZ1R5cGUsIG1lc3NhZ2U6IHN0cmluZywgb3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZCB7XG4gICAgdGhpcy5fZXZhbExhenlPcHRpb25hbFBhcmFtcyhvcHRpb25hbFBhcmFtcyk7XG4gICAgdHlwZS5jYWxsKGNvbnNvbGUsICh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlciA/ICcnIDogTE9HX1BSRUZJWCkgKyBtZXNzYWdlLCAuLi5vcHRpb25hbFBhcmFtcyk7XG4gIH1cblxuICBwdWJsaWMgdHJhY2UobWVzc2FnZTogc3RyaW5nLCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbG9nTGV2ZWwgPD0gTG9nTGV2ZWxFbnVtLlRSQUNFKSB7XG4gICAgICB0aGlzLl9sb2codGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5sb2dnZXI/LnRyYWNlLmJpbmQodGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5sb2dnZXIpID8/IGNvbnNvbGUubG9nLCBtZXNzYWdlLCBvcHRpb25hbFBhcmFtcyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRlYnVnKG1lc3NhZ2U6IHN0cmluZywgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xvZ0xldmVsIDw9IExvZ0xldmVsRW51bS5ERUJVRykge1xuICAgICAgdGhpcy5fbG9nKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyPy5kZWJ1Zy5iaW5kKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyKSA/PyBjb25zb2xlLmxvZywgbWVzc2FnZSwgb3B0aW9uYWxQYXJhbXMpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpbmZvKG1lc3NhZ2U6IHN0cmluZywgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xvZ0xldmVsIDw9IExvZ0xldmVsRW51bS5JTkZPKSB7XG4gICAgICB0aGlzLl9sb2codGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5sb2dnZXI/LmluZm8uYmluZCh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcikgPz8gY29uc29sZS5pbmZvLCBtZXNzYWdlLCBvcHRpb25hbFBhcmFtcyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHdhcm4obWVzc2FnZTogc3RyaW5nLCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbG9nTGV2ZWwgPD0gTG9nTGV2ZWxFbnVtLldBUk4pIHtcbiAgICAgIHRoaXMuX2xvZyh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcj8ud2Fybi5iaW5kKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyKSA/PyBjb25zb2xlLndhcm4sIG1lc3NhZ2UsIG9wdGlvbmFsUGFyYW1zKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZXJyb3IobWVzc2FnZTogc3RyaW5nLCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbG9nTGV2ZWwgPD0gTG9nTGV2ZWxFbnVtLkVSUk9SKSB7XG4gICAgICB0aGlzLl9sb2codGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5sb2dnZXI/LmVycm9yLmJpbmQodGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5sb2dnZXIpID8/IGNvbnNvbGUuZXJyb3IsIG1lc3NhZ2UsIG9wdGlvbmFsUGFyYW1zKTtcbiAgICB9XG4gIH1cbn1cblxubGV0IHRyYWNlTG9nZ2VyOiBJTG9nU2VydmljZTtcbmV4cG9ydCBmdW5jdGlvbiBzZXRUcmFjZUxvZ2dlcihsb2dnZXI6IElMb2dTZXJ2aWNlKTogdm9pZCB7XG4gIHRyYWNlTG9nZ2VyID0gbG9nZ2VyO1xufVxuXG4vKipcbiAqIEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gYXV0b21hdGljYWxseSBsb2cgdHJhY2UgY2FsbHMgdG8gdGhlIGRlY29yYXRlZCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYWNlQ2FsbChfdGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjcmlwdG9yOiBhbnkpOiBhbnkge1xuICBpZiAodHlwZW9mIGRlc2NyaXB0b3IudmFsdWUgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBzdXBwb3J0ZWQnKTtcbiAgfVxuICBjb25zdCBmbktleSA9ICd2YWx1ZSc7XG4gIGNvbnN0IGZuID0gZGVzY3JpcHRvci52YWx1ZTtcbiAgZGVzY3JpcHRvcltmbktleV0gPSBmdW5jdGlvbiAoLi4uYXJnczogYW55W10pIHtcbiAgICAvLyBFYXJseSBleGl0XG4gICAgaWYgKHRyYWNlTG9nZ2VyLmxvZ0xldmVsICE9PSBMb2dMZXZlbEVudW0uVFJBQ0UpIHtcbiAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9XG5cbiAgICB0cmFjZUxvZ2dlci50cmFjZShgR2x5cGhSZW5kZXJlciMke2ZuLm5hbWV9KCR7YXJncy5tYXAoZSA9PiBKU09OLnN0cmluZ2lmeShlKSkuam9pbignLCAnKX0pYCk7XG4gICAgY29uc3QgcmVzdWx0ID0gZm4uYXBwbHkodGhpcywgYXJncyk7XG4gICAgdHJhY2VMb2dnZXIudHJhY2UoYEdseXBoUmVuZGVyZXIjJHtmbi5uYW1lfSByZXR1cm5gLCByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICpcbiAqIFRoaXMgd2FzIGhlYXZpbHkgaW5zcGlyZWQgZnJvbSBtaWNyb3NvZnQvdnNjb2RlJ3MgZGVwZW5kZW5jeSBpbmplY3Rpb24gc3lzdGVtIChNSVQpLlxuICovXG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuaW1wb3J0IHsgSVNlcnZpY2VJZGVudGlmaWVyIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuY29uc3QgRElfVEFSR0VUID0gJ2RpJHRhcmdldCc7XG5jb25zdCBESV9ERVBFTkRFTkNJRVMgPSAnZGkkZGVwZW5kZW5jaWVzJztcblxuZXhwb3J0IGNvbnN0IHNlcnZpY2VSZWdpc3RyeTogTWFwPHN0cmluZywgSVNlcnZpY2VJZGVudGlmaWVyPGFueT4+ID0gbmV3IE1hcCgpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VydmljZURlcGVuZGVuY2llcyhjdG9yOiBhbnkpOiB7IGlkOiBJU2VydmljZUlkZW50aWZpZXI8YW55PiwgaW5kZXg6IG51bWJlciwgb3B0aW9uYWw6IGJvb2xlYW4gfVtdIHtcbiAgcmV0dXJuIGN0b3JbRElfREVQRU5ERU5DSUVTXSB8fCBbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlY29yYXRvcjxUPihpZDogc3RyaW5nKTogSVNlcnZpY2VJZGVudGlmaWVyPFQ+IHtcbiAgaWYgKHNlcnZpY2VSZWdpc3RyeS5oYXMoaWQpKSB7XG4gICAgcmV0dXJuIHNlcnZpY2VSZWdpc3RyeS5nZXQoaWQpITtcbiAgfVxuXG4gIGNvbnN0IGRlY29yYXRvcjogYW55ID0gZnVuY3Rpb24gKHRhcmdldDogRnVuY3Rpb24sIGtleTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogYW55IHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCAhPT0gMykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdASVNlcnZpY2VOYW1lLWRlY29yYXRvciBjYW4gb25seSBiZSB1c2VkIHRvIGRlY29yYXRlIGEgcGFyYW1ldGVyJyk7XG4gICAgfVxuXG4gICAgc3RvcmVTZXJ2aWNlRGVwZW5kZW5jeShkZWNvcmF0b3IsIHRhcmdldCwgaW5kZXgpO1xuICB9O1xuXG4gIGRlY29yYXRvci50b1N0cmluZyA9ICgpID0+IGlkO1xuXG4gIHNlcnZpY2VSZWdpc3RyeS5zZXQoaWQsIGRlY29yYXRvcik7XG4gIHJldHVybiBkZWNvcmF0b3I7XG59XG5cbmZ1bmN0aW9uIHN0b3JlU2VydmljZURlcGVuZGVuY3koaWQ6IEZ1bmN0aW9uLCB0YXJnZXQ6IEZ1bmN0aW9uLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gIGlmICgodGFyZ2V0IGFzIGFueSlbRElfVEFSR0VUXSA9PT0gdGFyZ2V0KSB7XG4gICAgKHRhcmdldCBhcyBhbnkpW0RJX0RFUEVOREVOQ0lFU10ucHVzaCh7IGlkLCBpbmRleCB9KTtcbiAgfSBlbHNlIHtcbiAgICAodGFyZ2V0IGFzIGFueSlbRElfREVQRU5ERU5DSUVTXSA9IFt7IGlkLCBpbmRleCB9XTtcbiAgICAodGFyZ2V0IGFzIGFueSlbRElfVEFSR0VUXSA9IHRhcmdldDtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJRXZlbnQsIElFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IElCdWZmZXIsIElCdWZmZXJTZXQgfSBmcm9tICdjb21tb24vYnVmZmVyL1R5cGVzJztcbmltcG9ydCB7IElEZWNQcml2YXRlTW9kZXMsIElDb3JlTW91c2VFdmVudCwgQ29yZU1vdXNlRW5jb2RpbmcsIElDb3JlTW91c2VQcm90b2NvbCwgQ29yZU1vdXNlRXZlbnRUeXBlLCBJQ2hhcnNldCwgSVdpbmRvd09wdGlvbnMsIElNb2RlcywgSUF0dHJpYnV0ZURhdGEsIFNjcm9sbFNvdXJjZSwgSURpc3Bvc2FibGUsIElDb2xvciwgQ3Vyc29yU3R5bGUsIEN1cnNvckluYWN0aXZlU3R5bGUsIElPc2NMaW5rRGF0YSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVEZWNvcmF0b3IgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IElEZWNvcmF0aW9uT3B0aW9ucywgSURlY29yYXRpb24sIElMaW5rSGFuZGxlciwgSVdpbmRvd3NQdHksIElMb2dnZXIgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuXG5leHBvcnQgY29uc3QgSUJ1ZmZlclNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUJ1ZmZlclNlcnZpY2U+KCdCdWZmZXJTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElCdWZmZXJTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgcmVhZG9ubHkgY29sczogbnVtYmVyO1xuICByZWFkb25seSByb3dzOiBudW1iZXI7XG4gIHJlYWRvbmx5IGJ1ZmZlcjogSUJ1ZmZlcjtcbiAgcmVhZG9ubHkgYnVmZmVyczogSUJ1ZmZlclNldDtcbiAgaXNVc2VyU2Nyb2xsaW5nOiBib29sZWFuO1xuICBvblJlc2l6ZTogSUV2ZW50PHsgY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIgfT47XG4gIG9uU2Nyb2xsOiBJRXZlbnQ8bnVtYmVyPjtcbiAgc2Nyb2xsKGVyYXNlQXR0cjogSUF0dHJpYnV0ZURhdGEsIGlzV3JhcHBlZD86IGJvb2xlYW4pOiB2b2lkO1xuICBzY3JvbGxMaW5lcyhkaXNwOiBudW1iZXIsIHN1cHByZXNzU2Nyb2xsRXZlbnQ/OiBib29sZWFuLCBzb3VyY2U/OiBTY3JvbGxTb3VyY2UpOiB2b2lkO1xuICByZXNpemUoY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIpOiB2b2lkO1xuICByZXNldCgpOiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgSUNvcmVNb3VzZVNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUNvcmVNb3VzZVNlcnZpY2U+KCdDb3JlTW91c2VTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElDb3JlTW91c2VTZXJ2aWNlIHtcbiAgYWN0aXZlUHJvdG9jb2w6IHN0cmluZztcbiAgYWN0aXZlRW5jb2Rpbmc6IHN0cmluZztcbiAgYXJlTW91c2VFdmVudHNBY3RpdmU6IGJvb2xlYW47XG4gIGFkZFByb3RvY29sKG5hbWU6IHN0cmluZywgcHJvdG9jb2w6IElDb3JlTW91c2VQcm90b2NvbCk6IHZvaWQ7XG4gIGFkZEVuY29kaW5nKG5hbWU6IHN0cmluZywgZW5jb2Rpbmc6IENvcmVNb3VzZUVuY29kaW5nKTogdm9pZDtcbiAgcmVzZXQoKTogdm9pZDtcblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSBtb3VzZSBldmVudCB0byBiZSBzZW50LlxuICAgKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGV2ZW50IHBhc3NlZCBhbGwgcHJvdG9jb2wgcmVzdHJpY3Rpb25zIGFuZCBhIHJlcG9ydFxuICAgKiB3YXMgc2VudCwgb3RoZXJ3aXNlIGZhbHNlLiBUaGUgcmV0dXJuIHZhbHVlIG1heSBiZSB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyXG4gICAqIHRoZSBkZWZhdWx0IGV2ZW50IGFjdGlvbiBpbiB0aGUgYm93c2VyIGNvbXBvbmVudCBzaG91bGQgYmUgb21pdHRlZC5cbiAgICpcbiAgICogTm90ZTogVGhlIG1ldGhvZCB3aWxsIGNoYW5nZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIGV2ZW50IG9iamVjdFxuICAgKiB0byBmdWxsZmlsbCBwcm90b2NvbCBhbmQgZW5jb2RpbmcgcmVzdHJpY3Rpb25zLlxuICAgKi9cbiAgdHJpZ2dlck1vdXNlRXZlbnQoZXZlbnQ6IElDb3JlTW91c2VFdmVudCk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEV2ZW50IHRvIGFubm91bmNlIGNoYW5nZXMgaW4gbW91c2UgdHJhY2tpbmcuXG4gICAqL1xuICBvblByb3RvY29sQ2hhbmdlOiBJRXZlbnQ8Q29yZU1vdXNlRXZlbnRUeXBlPjtcblxuICAvKipcbiAgICogSHVtYW4gcmVhZGFibGUgdmVyc2lvbiBvZiBtb3VzZSBldmVudHMuXG4gICAqL1xuICBleHBsYWluRXZlbnRzKGV2ZW50czogQ29yZU1vdXNlRXZlbnRUeXBlKTogeyBbZXZlbnQ6IHN0cmluZ106IGJvb2xlYW4gfTtcbn1cblxuZXhwb3J0IGNvbnN0IElDb3JlU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJQ29yZVNlcnZpY2U+KCdDb3JlU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJQ29yZVNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSW5pdGlhbGx5IHRoZSBjdXJzb3Igd2lsbCBub3QgYmUgdmlzaWJsZSB1bnRpbCB0aGUgZmlyc3QgdGltZSB0aGUgdGVybWluYWxcbiAgICogaXMgZm9jdXNlZC5cbiAgICovXG4gIGlzQ3Vyc29ySW5pdGlhbGl6ZWQ6IGJvb2xlYW47XG4gIGlzQ3Vyc29ySGlkZGVuOiBib29sZWFuO1xuXG4gIHJlYWRvbmx5IG1vZGVzOiBJTW9kZXM7XG4gIHJlYWRvbmx5IGRlY1ByaXZhdGVNb2RlczogSURlY1ByaXZhdGVNb2RlcztcblxuICByZWFkb25seSBvbkRhdGE6IElFdmVudDxzdHJpbmc+O1xuICByZWFkb25seSBvblVzZXJJbnB1dDogSUV2ZW50PHZvaWQ+O1xuICByZWFkb25seSBvbkJpbmFyeTogSUV2ZW50PHN0cmluZz47XG4gIHJlYWRvbmx5IG9uUmVxdWVzdFNjcm9sbFRvQm90dG9tOiBJRXZlbnQ8dm9pZD47XG5cbiAgcmVzZXQoKTogdm9pZDtcblxuICAvKipcbiAgICogVHJpZ2dlcnMgdGhlIG9uRGF0YSBldmVudCBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdGhhdCBpcyBiZWluZyBlbWl0dGVkLlxuICAgKiBAcGFyYW0gd2FzVXNlcklucHV0IFdoZXRoZXIgdGhlIGRhdGEgb3JpZ2luYXRlZCBmcm9tIHRoZSB1c2VyIChhcyBvcHBvc2VkIHRvXG4gICAqIHJlc3VsdGluZyBmcm9tIHBhcnNpbmcgaW5jb21pbmcgZGF0YSkuIFdoZW4gdHJ1ZSB0aGlzIHdpbGwgYWxzbzpcbiAgICogLSBTY3JvbGwgdG8gdGhlIGJvdHRvbSBvZiB0aGUgYnVmZmVyIGlmIG9wdGlvbiBzY3JvbGxPblVzZXJJbnB1dCBpcyB0cnVlLlxuICAgKiAtIEZpcmUgdGhlIGBvblVzZXJJbnB1dGAgZXZlbnQgKHNvIHNlbGVjdGlvbiBjYW4gYmUgY2xlYXJlZCkuXG4gICAqL1xuICB0cmlnZ2VyRGF0YUV2ZW50KGRhdGE6IHN0cmluZywgd2FzVXNlcklucHV0PzogYm9vbGVhbik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIHRoZSBvbkJpbmFyeSBldmVudCBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdGhhdCBpcyBiZWluZyBlbWl0dGVkLlxuICAgKi9cbiAgdHJpZ2dlckJpbmFyeUV2ZW50KGRhdGE6IHN0cmluZyk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjb25zdCBJQ2hhcnNldFNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUNoYXJzZXRTZXJ2aWNlPignQ2hhcnNldFNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSUNoYXJzZXRTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgY2hhcnNldDogSUNoYXJzZXQgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGdsZXZlbDogbnVtYmVyO1xuXG4gIHJlc2V0KCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgRyBsZXZlbCBvZiB0aGUgdGVybWluYWwuXG4gICAqIEBwYXJhbSBnXG4gICAqL1xuICBzZXRnTGV2ZWwoZzogbnVtYmVyKTogdm9pZDtcblxuICAvKipcbiAgICogU2V0IHRoZSBjaGFyc2V0IGZvciB0aGUgZ2l2ZW4gRyBsZXZlbCBvZiB0aGUgdGVybWluYWwuXG4gICAqIEBwYXJhbSBnXG4gICAqIEBwYXJhbSBjaGFyc2V0XG4gICAqL1xuICBzZXRnQ2hhcnNldChnOiBudW1iZXIsIGNoYXJzZXQ6IElDaGFyc2V0IHwgdW5kZWZpbmVkKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VydmljZUlkZW50aWZpZXI8VD4ge1xuICAoLi4uYXJnczogYW55W10pOiB2b2lkO1xuICB0eXBlOiBUO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElCcmFuZGVkU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xufVxuXG50eXBlIEdldExlYWRpbmdOb25TZXJ2aWNlQXJnczxUQXJncyBleHRlbmRzIGFueVtdPiA9IFRBcmdzIGV4dGVuZHMgW10gPyBbXVxuICA6IFRBcmdzIGV4dGVuZHMgWy4uLmluZmVyIFRGaXJzdCwgaW5mZXIgVExhc3RdID8gVExhc3QgZXh0ZW5kcyBJQnJhbmRlZFNlcnZpY2UgPyBHZXRMZWFkaW5nTm9uU2VydmljZUFyZ3M8VEZpcnN0PiA6IFRBcmdzXG4gICAgOiBuZXZlcjtcblxuZXhwb3J0IGNvbnN0IElJbnN0YW50aWF0aW9uU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJSW5zdGFudGlhdGlvblNlcnZpY2U+KCdJbnN0YW50aWF0aW9uU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJSW5zdGFudGlhdGlvblNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICBzZXRTZXJ2aWNlPFQ+KGlkOiBJU2VydmljZUlkZW50aWZpZXI8VD4sIGluc3RhbmNlOiBUKTogdm9pZDtcbiAgZ2V0U2VydmljZTxUPihpZDogSVNlcnZpY2VJZGVudGlmaWVyPFQ+KTogVCB8IHVuZGVmaW5lZDtcbiAgY3JlYXRlSW5zdGFuY2U8Q3RvciBleHRlbmRzIG5ldyAoLi4uYXJnczogYW55W10pID0+IGFueSwgUiBleHRlbmRzIEluc3RhbmNlVHlwZTxDdG9yPj4odDogQ3RvciwgLi4uYXJnczogR2V0TGVhZGluZ05vblNlcnZpY2VBcmdzPENvbnN0cnVjdG9yUGFyYW1ldGVyczxDdG9yPj4pOiBSO1xufVxuXG5leHBvcnQgZW51bSBMb2dMZXZlbEVudW0ge1xuICBUUkFDRSA9IDAsXG4gIERFQlVHID0gMSxcbiAgSU5GTyA9IDIsXG4gIFdBUk4gPSAzLFxuICBFUlJPUiA9IDQsXG4gIE9GRiA9IDVcbn1cblxuZXhwb3J0IGNvbnN0IElMb2dTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElMb2dTZXJ2aWNlPignTG9nU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJTG9nU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHJlYWRvbmx5IGxvZ0xldmVsOiBMb2dMZXZlbEVudW07XG5cbiAgdHJhY2UobWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkO1xuICBkZWJ1ZyhtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG4gIGluZm8obWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkO1xuICB3YXJuKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZDtcbiAgZXJyb3IobWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgSU9wdGlvbnNTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElPcHRpb25zU2VydmljZT4oJ09wdGlvbnNTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElPcHRpb25zU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBSZWFkIG9ubHkgYWNjZXNzIHRvIHRoZSByYXcgb3B0aW9ucyBvYmplY3QsIHRoaXMgaXMgYW4gaW50ZXJuYWwtb25seSBmYXN0IHBhdGggZm9yIGFjY2Vzc2luZ1xuICAgKiBzaW5nbGUgb3B0aW9ucyB3aXRob3V0IGFueSB2YWxpZGF0aW9uIGFzIHdlIHRydXN0IFR5cGVTY3JpcHQgdG8gZW5mb3JjZSBjb3JyZWN0IHVzYWdlXG4gICAqIGludGVybmFsbHkuXG4gICAqL1xuICByZWFkb25seSByYXdPcHRpb25zOiBSZXF1aXJlZDxJVGVybWluYWxPcHRpb25zPjtcblxuICAvKipcbiAgICogT3B0aW9ucyBhcyBleHBvc2VkIHRocm91Z2ggdGhlIHB1YmxpYyBBUEksIHRoaXMgcHJvcGVydHkgdXNlcyBnZXR0ZXJzIGFuZCBzZXR0ZXJzIHdpdGhcbiAgICogdmFsaWRhdGlvbiB3aGljaCBtYWtlcyBpdCBzYWZlciBidXQgc2xvd2VyLiB7QGxpbmsgcmF3T3B0aW9uc30gc2hvdWxkIGJlIHVzZWQgZm9yIHByZXR0eSBtdWNoXG4gICAqIGFsbCBpbnRlcm5hbCB1c2FnZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy5cbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbnM6IFJlcXVpcmVkPElUZXJtaW5hbE9wdGlvbnM+O1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIGZvciB3aGVuIGFueSBvcHRpb24gY2hhbmdlcy5cbiAgICovXG4gIHJlYWRvbmx5IG9uT3B0aW9uQ2hhbmdlOiBJRXZlbnQ8a2V5b2YgSVRlcm1pbmFsT3B0aW9ucz47XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIHdoZW4gYSBzcGVjaWZpYyBvcHRpb24gY2hhbmdlcywgdGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGlzXG4gICAqIHByZWZlcnJlZCBvdmVyIHtAbGluayBvbk9wdGlvbkNoYW5nZX0gd2hlbiBvbmx5IGEgc2luZ2xlIG9wdGlvbiBpcyBiZWluZyBsaXN0ZW5lZCB0by5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgb25TcGVjaWZpY09wdGlvbkNoYW5nZTxUIGV4dGVuZHMga2V5b2YgSVRlcm1pbmFsT3B0aW9ucz4oa2V5OiBULCBsaXN0ZW5lcjogKGFyZzE6IFJlcXVpcmVkPElUZXJtaW5hbE9wdGlvbnM+W1RdKSA9PiBhbnkpOiBJRGlzcG9zYWJsZTtcblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciBmb3Igd2hlbiBhIHNldCBvZiBzcGVjaWZpYyBvcHRpb25zIGNoYW5nZSwgdGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZFxuICAgKiB0aGF0IGlzIHByZWZlcnJlZCBvdmVyIHtAbGluayBvbk9wdGlvbkNoYW5nZX0gd2hlbiBtdWx0aXBsZSBvcHRpb25zIGFyZSBiZWluZyBsaXN0ZW5lZCB0byBhbmRcbiAgICogaGFuZGxlZCB0aGUgc2FtZSB3YXkuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gIG9uTXVsdGlwbGVPcHRpb25DaGFuZ2Uoa2V5czogKGtleW9mIElUZXJtaW5hbE9wdGlvbnMpW10sIGxpc3RlbmVyOiAoKSA9PiBhbnkpOiBJRGlzcG9zYWJsZTtcbn1cblxuZXhwb3J0IHR5cGUgRm9udFdlaWdodCA9ICdub3JtYWwnIHwgJ2JvbGQnIHwgJzEwMCcgfCAnMjAwJyB8ICczMDAnIHwgJzQwMCcgfCAnNTAwJyB8ICc2MDAnIHwgJzcwMCcgfCAnODAwJyB8ICc5MDAnIHwgbnVtYmVyO1xuZXhwb3J0IHR5cGUgTG9nTGV2ZWwgPSAndHJhY2UnIHwgJ2RlYnVnJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvcicgfCAnb2ZmJztcblxuZXhwb3J0IGludGVyZmFjZSBJVGVybWluYWxPcHRpb25zIHtcbiAgYWxsb3dQcm9wb3NlZEFwaT86IGJvb2xlYW47XG4gIGFsbG93VHJhbnNwYXJlbmN5PzogYm9vbGVhbjtcbiAgYWx0Q2xpY2tNb3Zlc0N1cnNvcj86IGJvb2xlYW47XG4gIGNvbHM/OiBudW1iZXI7XG4gIGNvbnZlcnRFb2w/OiBib29sZWFuO1xuICBjdXJzb3JCbGluaz86IGJvb2xlYW47XG4gIGN1cnNvclN0eWxlPzogQ3Vyc29yU3R5bGU7XG4gIGN1cnNvcldpZHRoPzogbnVtYmVyO1xuICBjdXJzb3JJbmFjdGl2ZVN0eWxlPzogQ3Vyc29ySW5hY3RpdmVTdHlsZTtcbiAgY3VzdG9tR2x5cGhzPzogYm9vbGVhbjtcbiAgZGlzYWJsZVN0ZGluPzogYm9vbGVhbjtcbiAgZG9jdW1lbnRPdmVycmlkZT86IGFueSB8IG51bGw7XG4gIGRyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzPzogYm9vbGVhbjtcbiAgZmFzdFNjcm9sbE1vZGlmaWVyPzogJ25vbmUnIHwgJ2FsdCcgfCAnY3RybCcgfCAnc2hpZnQnO1xuICBmYXN0U2Nyb2xsU2Vuc2l0aXZpdHk/OiBudW1iZXI7XG4gIGZvbnRTaXplPzogbnVtYmVyO1xuICBmb250RmFtaWx5Pzogc3RyaW5nO1xuICBmb250V2VpZ2h0PzogRm9udFdlaWdodDtcbiAgZm9udFdlaWdodEJvbGQ/OiBGb250V2VpZ2h0O1xuICBpZ25vcmVCcmFja2V0ZWRQYXN0ZU1vZGU/OiBib29sZWFuO1xuICBsZXR0ZXJTcGFjaW5nPzogbnVtYmVyO1xuICBsaW5lSGVpZ2h0PzogbnVtYmVyO1xuICBsaW5rSGFuZGxlcj86IElMaW5rSGFuZGxlciB8IG51bGw7XG4gIGxvZ0xldmVsPzogTG9nTGV2ZWw7XG4gIGxvZ2dlcj86IElMb2dnZXIgfCBudWxsO1xuICBtYWNPcHRpb25Jc01ldGE/OiBib29sZWFuO1xuICBtYWNPcHRpb25DbGlja0ZvcmNlc1NlbGVjdGlvbj86IGJvb2xlYW47XG4gIG1pbmltdW1Db250cmFzdFJhdGlvPzogbnVtYmVyO1xuICByZXNjYWxlT3ZlcmxhcHBpbmdHbHlwaHM/OiBib29sZWFuO1xuICByaWdodENsaWNrU2VsZWN0c1dvcmQ/OiBib29sZWFuO1xuICByb3dzPzogbnVtYmVyO1xuICBzY3JlZW5SZWFkZXJNb2RlPzogYm9vbGVhbjtcbiAgc2Nyb2xsYmFjaz86IG51bWJlcjtcbiAgc2Nyb2xsT25Vc2VySW5wdXQ/OiBib29sZWFuO1xuICBzY3JvbGxTZW5zaXRpdml0eT86IG51bWJlcjtcbiAgc21vb3RoU2Nyb2xsRHVyYXRpb24/OiBudW1iZXI7XG4gIHRhYlN0b3BXaWR0aD86IG51bWJlcjtcbiAgdGhlbWU/OiBJVGhlbWU7XG4gIHdpbmRvd3NNb2RlPzogYm9vbGVhbjtcbiAgd2luZG93c1B0eT86IElXaW5kb3dzUHR5O1xuICB3aW5kb3dPcHRpb25zPzogSVdpbmRvd09wdGlvbnM7XG4gIHdvcmRTZXBhcmF0b3I/OiBzdHJpbmc7XG4gIG92ZXJ2aWV3UnVsZXJXaWR0aD86IG51bWJlcjtcblxuICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIGNhbmNlbEV2ZW50czogYm9vbGVhbjtcbiAgdGVybU5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVGhlbWUge1xuICBmb3JlZ3JvdW5kPzogc3RyaW5nO1xuICBiYWNrZ3JvdW5kPzogc3RyaW5nO1xuICBjdXJzb3I/OiBzdHJpbmc7XG4gIGN1cnNvckFjY2VudD86IHN0cmluZztcbiAgc2VsZWN0aW9uRm9yZWdyb3VuZD86IHN0cmluZztcbiAgc2VsZWN0aW9uQmFja2dyb3VuZD86IHN0cmluZztcbiAgc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kPzogc3RyaW5nO1xuICBibGFjaz86IHN0cmluZztcbiAgcmVkPzogc3RyaW5nO1xuICBncmVlbj86IHN0cmluZztcbiAgeWVsbG93Pzogc3RyaW5nO1xuICBibHVlPzogc3RyaW5nO1xuICBtYWdlbnRhPzogc3RyaW5nO1xuICBjeWFuPzogc3RyaW5nO1xuICB3aGl0ZT86IHN0cmluZztcbiAgYnJpZ2h0QmxhY2s/OiBzdHJpbmc7XG4gIGJyaWdodFJlZD86IHN0cmluZztcbiAgYnJpZ2h0R3JlZW4/OiBzdHJpbmc7XG4gIGJyaWdodFllbGxvdz86IHN0cmluZztcbiAgYnJpZ2h0Qmx1ZT86IHN0cmluZztcbiAgYnJpZ2h0TWFnZW50YT86IHN0cmluZztcbiAgYnJpZ2h0Q3lhbj86IHN0cmluZztcbiAgYnJpZ2h0V2hpdGU/OiBzdHJpbmc7XG4gIGV4dGVuZGVkQW5zaT86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY29uc3QgSU9zY0xpbmtTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElPc2NMaW5rU2VydmljZT4oJ09zY0xpbmtTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElPc2NMaW5rU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgbGluayB0byB0aGUgc2VydmljZSwgcmV0dXJuaW5nIHRoZSBsaW5rIElELiBUaGUgbGluayBkYXRhIGlzIG1hbmFnZWQgYnkgdGhpc1xuICAgKiBzZXJ2aWNlIGFuZCB3aWxsIGJlIGZyZWVkIHdoZW4gdGhpcyBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiBpcyB0cmltbWVkIG9mZiB0aGUgYnVmZmVyLlxuICAgKi9cbiAgcmVnaXN0ZXJMaW5rKGxpbmtEYXRhOiBJT3NjTGlua0RhdGEpOiBudW1iZXI7XG4gIC8qKlxuICAgKiBBZGRzIGEgbGluZSB0byBhIGxpbmsgaWYgbmVlZGVkLlxuICAgKi9cbiAgYWRkTGluZVRvTGluayhsaW5rSWQ6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZDtcbiAgLyoqIEdldCB0aGUgbGluayBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIGxpbmsgSUQuICovXG4gIGdldExpbmtEYXRhKGxpbmtJZDogbnVtYmVyKTogSU9zY0xpbmtEYXRhIHwgdW5kZWZpbmVkO1xufVxuXG4vKlxuICogV2lkdGggYW5kIEdyYXBoZW1lX0NsdXN0ZXJfQnJlYWsgcHJvcGVydGllcyBvZiBhIGNoYXJhY3RlciBhcyBhIGJpdCBtYXNrLlxuICpcbiAqIGJpdCAwOiBzaG91bGRKb2luIC0gc2hvdWxkIGNvbWJpbmUgd2l0aCBwcmVjZWRpbmcgY2hhcmFjdGVyLlxuICogYml0IDEuLjI6IHdjd2lkdGggLSBzZWUgVW5pY29kZUNoYXJXaWR0aC5cbiAqIGJpdCAzLi4zMTogY2xhc3Mgb2YgY2hhcmFjdGVyIChjdXJyZW50bHkgb25seSA0IGJpdHMgYXJlIHVzZWQpLlxuICogICBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lZCBncmFwaGVtZSBjbHVzdGVyaW5nIC0gaS5lLiB3aGljaCBjb2RlcG9pbnRzXG4gKiAgIGFyZSB0byBiZSBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIGNvbXBvdW5kIGNoYXJhY3Rlci5cbiAqXG4gKiBVc2UgdGhlIFVuaWNvZGVTZXJ2aWNlIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eVZhbHVlIHRvIGNyZWF0ZSBhXG4gKiBVbmljb2RlQ2hhclByb3BlcnRpZXM7IHVzZSBleHRyYWN0U2hvdWxkSm9pbiwgZXh0cmFjdFdpZHRoLCBhbmRcbiAqIGV4dHJhY3RDaGFyS2luZCB0byBleHRyYWN0IHRoZSBjb21wb25lbnRzLlxuICovXG5leHBvcnQgdHlwZSBVbmljb2RlQ2hhclByb3BlcnRpZXMgPSBudW1iZXI7XG5cbi8qKlxuICogV2lkdGggaW4gY29sdW1ucyBvZiBhIGNoYXJhY3Rlci5cbiAqIEluIGEgQ0pLIGNvbnRleHQsIFwiaGFsZi13aWR0aFwiIGNoYXJhY3RlcnMgKHN1Y2ggYXMgTGF0aW4pIGFyZSB3aWR0aCAxLFxuICogd2hpbGUgXCJmdWxsLXdpZHRoXCIgY2hhcmFjdGVycyAoc3VjaCBhcyBLYW5qaSkgYXJlIDIgY29sdW1ucyB3aWRlLlxuICogQ29tYmluaW5nIGNoYXJhY3RlcnMgKHN1Y2ggYXMgYWNjZW50cykgYXJlIHdpZHRoIDAuXG4gKi9cbmV4cG9ydCB0eXBlIFVuaWNvZGVDaGFyV2lkdGggPSAwIHwgMSB8IDI7XG5cbmV4cG9ydCBjb25zdCBJVW5pY29kZVNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SVVuaWNvZGVTZXJ2aWNlPignVW5pY29kZVNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSVVuaWNvZGVTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG4gIC8qKiBSZWdpc3RlciBhbiBVbmljb2RlIHZlcnNpb24gcHJvdmlkZXIuICovXG4gIHJlZ2lzdGVyKHByb3ZpZGVyOiBJVW5pY29kZVZlcnNpb25Qcm92aWRlcik6IHZvaWQ7XG4gIC8qKiBSZWdpc3RlcmVkIFVuaWNvZGUgdmVyc2lvbnMuICovXG4gIHJlYWRvbmx5IHZlcnNpb25zOiBzdHJpbmdbXTtcbiAgLyoqIEN1cnJlbnRseSBhY3RpdmUgdmVyc2lvbi4gKi9cbiAgYWN0aXZlVmVyc2lvbjogc3RyaW5nO1xuICAvKiogRXZlbnQgdHJpZ2dlcmVkLCB3aGVuIGFjdGl2YXRlIHZlcnNpb24gY2hhbmdlZC4gKi9cbiAgcmVhZG9ubHkgb25DaGFuZ2U6IElFdmVudDxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBVbmljb2RlIHZlcnNpb24gZGVwZW5kZW50XG4gICAqL1xuICB3Y3dpZHRoKGNvZGVwb2ludDogbnVtYmVyKTogVW5pY29kZUNoYXJXaWR0aDtcbiAgZ2V0U3RyaW5nQ2VsbFdpZHRoKHM6IHN0cmluZyk6IG51bWJlcjtcbiAgLyoqXG4gICAqIFJldHVybiBjaGFyYWN0ZXIgd2lkdGggYW5kIHR5cGUgZm9yIGdyYXBoZW1lIGNsdXN0ZXJpbmcuXG4gICAqIElmIHByZWNlZGluZyAhPSAwLCBpdCBpcyB0aGUgcmV0dXJuIGNvZGUgZnJvbSB0aGUgcHJldmlvdXMgY2hhcmFjdGVyO1xuICAgKiBpbiB0aGF0IGNhc2UgdGhlIHJlc3VsdCBzcGVjaWZpZXMgaWYgdGhlIGNoYXJhY3RlcnMgc2hvdWxkIGJlIGpvaW5lZC5cbiAgICovXG4gIGNoYXJQcm9wZXJ0aWVzKGNvZGVwb2ludDogbnVtYmVyLCBwcmVjZWRpbmc6IFVuaWNvZGVDaGFyUHJvcGVydGllcyk6IFVuaWNvZGVDaGFyUHJvcGVydGllcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVW5pY29kZVZlcnNpb25Qcm92aWRlciB7XG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbiAgd2N3aWR0aCh1Y3M6IG51bWJlcik6IFVuaWNvZGVDaGFyV2lkdGg7XG4gIGNoYXJQcm9wZXJ0aWVzKGNvZGVwb2ludDogbnVtYmVyLCBwcmVjZWRpbmc6IFVuaWNvZGVDaGFyUHJvcGVydGllcyk6IFVuaWNvZGVDaGFyUHJvcGVydGllcztcbn1cblxuZXhwb3J0IGNvbnN0IElEZWNvcmF0aW9uU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJRGVjb3JhdGlvblNlcnZpY2U+KCdEZWNvcmF0aW9uU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJRGVjb3JhdGlvblNlcnZpY2UgZXh0ZW5kcyBJRGlzcG9zYWJsZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuICByZWFkb25seSBkZWNvcmF0aW9uczogSXRlcmFibGVJdGVyYXRvcjxJSW50ZXJuYWxEZWNvcmF0aW9uPjtcbiAgcmVhZG9ubHkgb25EZWNvcmF0aW9uUmVnaXN0ZXJlZDogSUV2ZW50PElJbnRlcm5hbERlY29yYXRpb24+O1xuICByZWFkb25seSBvbkRlY29yYXRpb25SZW1vdmVkOiBJRXZlbnQ8SUludGVybmFsRGVjb3JhdGlvbj47XG4gIHJlZ2lzdGVyRGVjb3JhdGlvbihkZWNvcmF0aW9uT3B0aW9uczogSURlY29yYXRpb25PcHRpb25zKTogSURlY29yYXRpb24gfCB1bmRlZmluZWQ7XG4gIHJlc2V0KCk6IHZvaWQ7XG4gIC8qKlxuICAgKiBUcmlnZ2VyIGEgY2FsbGJhY2sgb3ZlciB0aGUgZGVjb3JhdGlvbiBhdCBhIGNlbGwgKGluIG5vIHBhcnRpY3VsYXIgb3JkZXIpLiBUaGlzIHVzZXMgYSBjYWxsYmFja1xuICAgKiBpbnN0ZWFkIG9mIGFuIGl0ZXJhdG9yIGFzIGl0J3MgdHlwaWNhbGx5IHVzZWQgaW4gaG90IGNvZGUgcGF0aHMuXG4gICAqL1xuICBmb3JFYWNoRGVjb3JhdGlvbkF0Q2VsbCh4OiBudW1iZXIsIGxpbmU6IG51bWJlciwgbGF5ZXI6ICdib3R0b20nIHwgJ3RvcCcgfCB1bmRlZmluZWQsIGNhbGxiYWNrOiAoZGVjb3JhdGlvbjogSUludGVybmFsRGVjb3JhdGlvbikgPT4gdm9pZCk6IHZvaWQ7XG59XG5leHBvcnQgaW50ZXJmYWNlIElJbnRlcm5hbERlY29yYXRpb24gZXh0ZW5kcyBJRGVjb3JhdGlvbiB7XG4gIHJlYWRvbmx5IG9wdGlvbnM6IElEZWNvcmF0aW9uT3B0aW9ucztcbiAgcmVhZG9ubHkgYmFja2dyb3VuZENvbG9yUkdCOiBJQ29sb3IgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGZvcmVncm91bmRDb2xvclJHQjogSUNvbG9yIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBvblJlbmRlckVtaXR0ZXI6IElFdmVudEVtaXR0ZXI8SFRNTEVsZW1lbnQ+O1xufVxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBJVGVybWluYWxBZGRvbiwgVGVybWluYWwgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuaW1wb3J0IHR5cGUgeyBXZWJnbEFkZG9uIGFzIElXZWJnbEFwaSB9IGZyb20gJ0B4dGVybS9hZGRvbi13ZWJnbCc7XG5pbXBvcnQgeyBJQ2hhcmFjdGVySm9pbmVyU2VydmljZSwgSUNoYXJTaXplU2VydmljZSwgSUNvcmVCcm93c2VyU2VydmljZSwgSVJlbmRlclNlcnZpY2UsIElUaGVtZVNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IElUZXJtaW5hbCB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBmb3J3YXJkRXZlbnQgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IERpc3Bvc2FibGUsIHRvRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgZ2V0U2FmYXJpVmVyc2lvbiwgaXNTYWZhcmkgfSBmcm9tICdjb21tb24vUGxhdGZvcm0nO1xuaW1wb3J0IHsgSUNvcmVTZXJ2aWNlLCBJRGVjb3JhdGlvblNlcnZpY2UsIElMb2dTZXJ2aWNlLCBJT3B0aW9uc1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgSVdlYkdMMlJlbmRlcmluZ0NvbnRleHQgfSBmcm9tICcuL1R5cGVzJztcbmltcG9ydCB7IFdlYmdsUmVuZGVyZXIgfSBmcm9tICcuL1dlYmdsUmVuZGVyZXInO1xuaW1wb3J0IHsgc2V0VHJhY2VMb2dnZXIgfSBmcm9tICdjb21tb24vc2VydmljZXMvTG9nU2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBXZWJnbEFkZG9uIGV4dGVuZHMgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElUZXJtaW5hbEFkZG9uICwgSVdlYmdsQXBpIHtcbiAgcHJpdmF0ZSBfdGVybWluYWw/OiBUZXJtaW5hbDtcbiAgcHJpdmF0ZSBfcmVuZGVyZXI/OiBXZWJnbFJlbmRlcmVyO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29uQ2hhbmdlVGV4dHVyZUF0bGFzID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPEhUTUxDYW52YXNFbGVtZW50PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uQ2hhbmdlVGV4dHVyZUF0bGFzID0gdGhpcy5fb25DaGFuZ2VUZXh0dXJlQXRsYXMuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uQWRkVGV4dHVyZUF0bGFzQ2FudmFzID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPEhUTUxDYW52YXNFbGVtZW50PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uQWRkVGV4dHVyZUF0bGFzQ2FudmFzID0gdGhpcy5fb25BZGRUZXh0dXJlQXRsYXNDYW52YXMuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uUmVtb3ZlVGV4dHVyZUF0bGFzQ2FudmFzID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPEhUTUxDYW52YXNFbGVtZW50PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uUmVtb3ZlVGV4dHVyZUF0bGFzQ2FudmFzID0gdGhpcy5fb25SZW1vdmVUZXh0dXJlQXRsYXNDYW52YXMuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uQ29udGV4dExvc3MgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkNvbnRleHRMb3NzID0gdGhpcy5fb25Db250ZXh0TG9zcy5ldmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9wcmVzZXJ2ZURyYXdpbmdCdWZmZXI/OiBib29sZWFuXG4gICkge1xuICAgIGlmIChpc1NhZmFyaSAmJiBnZXRTYWZhcmlWZXJzaW9uKCkgPCAxNikge1xuICAgICAgLy8gUGVyZm9ybSBhbiBleHRyYSBjaGVjayB0byBkZXRlcm1pbmUgaWYgV2ViZ2wyIGlzIG1hbnVhbGx5IGVuYWJsZWQgaW4gZGV2ZWxvcGVyIHNldHRpbmdzXG4gICAgICBjb25zdCBjb250ZXh0QXR0cmlidXRlcyA9IHtcbiAgICAgICAgYW50aWFsaWFzOiBmYWxzZSxcbiAgICAgICAgZGVwdGg6IGZhbHNlLFxuICAgICAgICBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IHRydWVcbiAgICAgIH07XG4gICAgICBjb25zdCBnbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpLmdldENvbnRleHQoJ3dlYmdsMicsIGNvbnRleHRBdHRyaWJ1dGVzKSBhcyBJV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcbiAgICAgIGlmICghZ2wpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZWJnbDIgaXMgb25seSBzdXBwb3J0ZWQgb24gU2FmYXJpIDE2IGFuZCBhYm92ZScpO1xuICAgICAgfVxuICAgIH1cbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIGFjdGl2YXRlKHRlcm1pbmFsOiBUZXJtaW5hbCk6IHZvaWQge1xuICAgIGNvbnN0IGNvcmUgPSAodGVybWluYWwgYXMgYW55KS5fY29yZSBhcyBJVGVybWluYWw7XG4gICAgaWYgKCF0ZXJtaW5hbC5lbGVtZW50KSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyKGNvcmUub25XaWxsT3BlbigoKSA9PiB0aGlzLmFjdGl2YXRlKHRlcm1pbmFsKSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3Rlcm1pbmFsID0gdGVybWluYWw7XG4gICAgY29uc3QgY29yZVNlcnZpY2U6IElDb3JlU2VydmljZSA9IGNvcmUuY29yZVNlcnZpY2U7XG4gICAgY29uc3Qgb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZSA9IGNvcmUub3B0aW9uc1NlcnZpY2U7XG5cbiAgICBjb25zdCB1bnNhZmVDb3JlID0gY29yZSBhcyBhbnk7XG4gICAgY29uc3QgcmVuZGVyU2VydmljZTogSVJlbmRlclNlcnZpY2UgPSB1bnNhZmVDb3JlLl9yZW5kZXJTZXJ2aWNlO1xuICAgIGNvbnN0IGNoYXJhY3RlckpvaW5lclNlcnZpY2U6IElDaGFyYWN0ZXJKb2luZXJTZXJ2aWNlID0gdW5zYWZlQ29yZS5fY2hhcmFjdGVySm9pbmVyU2VydmljZTtcbiAgICBjb25zdCBjaGFyU2l6ZVNlcnZpY2U6IElDaGFyU2l6ZVNlcnZpY2UgPSB1bnNhZmVDb3JlLl9jaGFyU2l6ZVNlcnZpY2U7XG4gICAgY29uc3QgY29yZUJyb3dzZXJTZXJ2aWNlOiBJQ29yZUJyb3dzZXJTZXJ2aWNlID0gdW5zYWZlQ29yZS5fY29yZUJyb3dzZXJTZXJ2aWNlO1xuICAgIGNvbnN0IGRlY29yYXRpb25TZXJ2aWNlOiBJRGVjb3JhdGlvblNlcnZpY2UgPSB1bnNhZmVDb3JlLl9kZWNvcmF0aW9uU2VydmljZTtcbiAgICBjb25zdCBsb2dTZXJ2aWNlOiBJTG9nU2VydmljZSA9IHVuc2FmZUNvcmUuX2xvZ1NlcnZpY2U7XG4gICAgY29uc3QgdGhlbWVTZXJ2aWNlOiBJVGhlbWVTZXJ2aWNlID0gdW5zYWZlQ29yZS5fdGhlbWVTZXJ2aWNlO1xuXG4gICAgLy8gU2V0IHRyYWNlIGxvZ2dlciBqdXN0IGluIGNhc2UgaXQgaGFzbid0IGJlZW4geWV0IHdoaWNoIGNvdWxkIGhhcHBlbiB3aGVuIHRoZSBhZGRvbiBpc1xuICAgIC8vIGJ1bmRsZWQgc2VwYXJhdGVseSB0byB0aGUgY29yZSBtb2R1bGVcbiAgICBzZXRUcmFjZUxvZ2dlcihsb2dTZXJ2aWNlKTtcblxuICAgIHRoaXMuX3JlbmRlcmVyID0gdGhpcy5yZWdpc3RlcihuZXcgV2ViZ2xSZW5kZXJlcihcbiAgICAgIHRlcm1pbmFsLFxuICAgICAgY2hhcmFjdGVySm9pbmVyU2VydmljZSxcbiAgICAgIGNoYXJTaXplU2VydmljZSxcbiAgICAgIGNvcmVCcm93c2VyU2VydmljZSxcbiAgICAgIGNvcmVTZXJ2aWNlLFxuICAgICAgZGVjb3JhdGlvblNlcnZpY2UsXG4gICAgICBvcHRpb25zU2VydmljZSxcbiAgICAgIHRoZW1lU2VydmljZSxcbiAgICAgIHRoaXMuX3ByZXNlcnZlRHJhd2luZ0J1ZmZlclxuICAgICkpO1xuICAgIHRoaXMucmVnaXN0ZXIoZm9yd2FyZEV2ZW50KHRoaXMuX3JlbmRlcmVyLm9uQ29udGV4dExvc3MsIHRoaXMuX29uQ29udGV4dExvc3MpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGZvcndhcmRFdmVudCh0aGlzLl9yZW5kZXJlci5vbkNoYW5nZVRleHR1cmVBdGxhcywgdGhpcy5fb25DaGFuZ2VUZXh0dXJlQXRsYXMpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGZvcndhcmRFdmVudCh0aGlzLl9yZW5kZXJlci5vbkFkZFRleHR1cmVBdGxhc0NhbnZhcywgdGhpcy5fb25BZGRUZXh0dXJlQXRsYXNDYW52YXMpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGZvcndhcmRFdmVudCh0aGlzLl9yZW5kZXJlci5vblJlbW92ZVRleHR1cmVBdGxhc0NhbnZhcywgdGhpcy5fb25SZW1vdmVUZXh0dXJlQXRsYXNDYW52YXMpKTtcbiAgICByZW5kZXJTZXJ2aWNlLnNldFJlbmRlcmVyKHRoaXMuX3JlbmRlcmVyKTtcblxuICAgIHRoaXMucmVnaXN0ZXIodG9EaXNwb3NhYmxlKCgpID0+IHtcbiAgICAgIGNvbnN0IHJlbmRlclNlcnZpY2U6IElSZW5kZXJTZXJ2aWNlID0gKHRoaXMuX3Rlcm1pbmFsIGFzIGFueSkuX2NvcmUuX3JlbmRlclNlcnZpY2U7XG4gICAgICByZW5kZXJTZXJ2aWNlLnNldFJlbmRlcmVyKCh0aGlzLl90ZXJtaW5hbCBhcyBhbnkpLl9jb3JlLl9jcmVhdGVSZW5kZXJlcigpKTtcbiAgICAgIHJlbmRlclNlcnZpY2UuaGFuZGxlUmVzaXplKHRlcm1pbmFsLmNvbHMsIHRlcm1pbmFsLnJvd3MpO1xuICAgIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdGV4dHVyZUF0bGFzKCk6IEhUTUxDYW52YXNFbGVtZW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcmVuZGVyZXI/LnRleHR1cmVBdGxhcztcbiAgfVxuXG4gIHB1YmxpYyBjbGVhclRleHR1cmVBdGxhcygpOiB2b2lkIHtcbiAgICB0aGlzLl9yZW5kZXJlcj8uY2xlYXJUZXh0dXJlQXRsYXMoKTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbInJvb3QiLCJmYWN0b3J5IiwiZXhwb3J0cyIsIm1vZHVsZSIsImRlZmluZSIsImFtZCIsInNlbGYiLCJJTkRJQ0VTX1BFUl9DRUxMIiwiQllURVNfUEVSX0NFTEwiLCJGbG9hdDMyQXJyYXkiLCJCWVRFU19QRVJfRUxFTUVOVCIsIiRnbHlwaCIsIiRpIiwiJGxlZnRDZWxsUGFkZGluZyIsIiRjbGlwcGVkUGl4ZWxzIiwiR2x5cGhSZW5kZXJlciIsIkRpc3Bvc2FibGUiLCJjb25zdHJ1Y3RvciIsIl90ZXJtaW5hbCIsIl9nbCIsIl9kaW1lbnNpb25zIiwiX29wdGlvbnNTZXJ2aWNlIiwic3VwZXIiLCJfYWN0aXZlQnVmZmVyIiwiX3ZlcnRpY2VzIiwiY291bnQiLCJhdHRyaWJ1dGVzIiwiYXR0cmlidXRlc0J1ZmZlcnMiLCJnbCIsInRoaXMiLCJ1bmRlZmluZWQiLCJUZXh0dXJlQXRsYXMiLCJtYXhBdGxhc1BhZ2VzIiwiTWF0aCIsIm1pbiIsInRocm93SWZGYWxzeSIsImdldFBhcmFtZXRlciIsIk1BWF9URVhUVVJFX0lNQUdFX1VOSVRTIiwibWF4VGV4dHVyZVNpemUiLCJNQVhfVEVYVFVSRV9TSVpFIiwiX3Byb2dyYW0iLCJjcmVhdGVQcm9ncmFtIiwibWF4RnJhZ21lbnRTaGFkZXJUZXh0dXJlVW5pdHMiLCJ0ZXh0dXJlQ29uZGl0aW9uYWxzIiwiaSIsImNyZWF0ZUZyYWdtZW50U2hhZGVyU291cmNlIiwicmVnaXN0ZXIiLCJ0b0Rpc3Bvc2FibGUiLCJkZWxldGVQcm9ncmFtIiwiX3Byb2plY3Rpb25Mb2NhdGlvbiIsImdldFVuaWZvcm1Mb2NhdGlvbiIsIl9yZXNvbHV0aW9uTG9jYXRpb24iLCJfdGV4dHVyZUxvY2F0aW9uIiwiX3ZlcnRleEFycmF5T2JqZWN0IiwiY3JlYXRlVmVydGV4QXJyYXkiLCJiaW5kVmVydGV4QXJyYXkiLCJ1bml0UXVhZFZlcnRpY2VzIiwidW5pdFF1YWRWZXJ0aWNlc0J1ZmZlciIsImNyZWF0ZUJ1ZmZlciIsImRlbGV0ZUJ1ZmZlciIsImJpbmRCdWZmZXIiLCJBUlJBWV9CVUZGRVIiLCJidWZmZXJEYXRhIiwiU1RBVElDX0RSQVciLCJlbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSIsInZlcnRleEF0dHJpYlBvaW50ZXIiLCJGTE9BVCIsInVuaXRRdWFkRWxlbWVudEluZGljZXMiLCJVaW50OEFycmF5IiwiZWxlbWVudEluZGljZXNCdWZmZXIiLCJFTEVNRU5UX0FSUkFZX0JVRkZFUiIsIl9hdHRyaWJ1dGVzQnVmZmVyIiwidmVydGV4QXR0cmliRGl2aXNvciIsInVzZVByb2dyYW0iLCJ0ZXh0dXJlVW5pdHMiLCJJbnQzMkFycmF5IiwidW5pZm9ybTFpdiIsInVuaWZvcm1NYXRyaXg0ZnYiLCJQUk9KRUNUSU9OX01BVFJJWCIsIl9hdGxhc1RleHR1cmVzIiwiZ2xUZXh0dXJlIiwiR0xUZXh0dXJlIiwiY3JlYXRlVGV4dHVyZSIsImRlbGV0ZVRleHR1cmUiLCJ0ZXh0dXJlIiwiYWN0aXZlVGV4dHVyZSIsIlRFWFRVUkUwIiwiYmluZFRleHR1cmUiLCJURVhUVVJFXzJEIiwidGV4UGFyYW1ldGVyaSIsIlRFWFRVUkVfV1JBUF9TIiwiQ0xBTVBfVE9fRURHRSIsIlRFWFRVUkVfV1JBUF9UIiwidGV4SW1hZ2UyRCIsIlJHQkEiLCJVTlNJR05FRF9CWVRFIiwiZW5hYmxlIiwiQkxFTkQiLCJibGVuZEZ1bmMiLCJTUkNfQUxQSEEiLCJPTkVfTUlOVVNfU1JDX0FMUEhBIiwiaGFuZGxlUmVzaXplIiwiYmVnaW5GcmFtZSIsIl9hdGxhcyIsInVwZGF0ZUNlbGwiLCJ4IiwieSIsImNvZGUiLCJiZyIsImZnIiwiZXh0IiwiY2hhcnMiLCJ3aWR0aCIsImxhc3RCZyIsIl91cGRhdGVDZWxsIiwiYXJyYXkiLCJjb2xzIiwiTlVMTF9DRUxMX0NPREUiLCJsZW5ndGgiLCJnZXRSYXN0ZXJpemVkR2x5cGhDb21iaW5lZENoYXIiLCJnZXRSYXN0ZXJpemVkR2x5cGgiLCJmbG9vciIsImRldmljZSIsImNlbGwiLCJjaGFyIiwib2Zmc2V0IiwibGVmdCIsInRvcCIsInNpemUiLCJjYW52YXMiLCJoZWlnaHQiLCJ0ZXh0dXJlUGFnZSIsInRleHR1cmVQb3NpdGlvbkNsaXBTcGFjZSIsInBhZ2VzIiwic2l6ZUNsaXBTcGFjZSIsInJhd09wdGlvbnMiLCJyZXNjYWxlT3ZlcmxhcHBpbmdHbHlwaHMiLCJhbGxvd1Jlc2NhbGluZyIsImZpbGwiLCJjbGVhciIsInRlcm1pbmFsIiwibmV3Q291bnQiLCJyb3dzIiwidmlld3BvcnQiLCJ1bmlmb3JtMmYiLCJyZW5kZXIiLCJyZW5kZXJNb2RlbCIsImFjdGl2ZUJ1ZmZlciIsImJ1ZmZlckxlbmd0aCIsImxpbmVMZW5ndGhzIiwic2kiLCJzdWIiLCJzdWJhcnJheSIsInNldCIsIlNUUkVBTV9EUkFXIiwidmVyc2lvbiIsIl9iaW5kQXRsYXNQYWdlVGV4dHVyZSIsImRyYXdFbGVtZW50c0luc3RhbmNlZCIsIlRSSUFOR0xFX1NUUklQIiwic2V0QXRsYXMiLCJhdGxhcyIsImdlbmVyYXRlTWlwbWFwIiwic2V0RGltZW5zaW9ucyIsImRpbWVuc2lvbnMiLCJCWVRFU19QRVJfUkVDVEFOR0xFIiwiVmVydGljZXMiLCIkcmdiYSIsIiR4MSIsIiR5MSIsIiRyIiwiJGciLCIkYiIsIiRhIiwiUmVjdGFuZ2xlUmVuZGVyZXIiLCJfdGhlbWVTZXJ2aWNlIiwiX3ZlcnRpY2VzQ3Vyc29yIiwiX3VwZGF0ZUNhY2hlZENvbG9ycyIsImNvbG9ycyIsIm9uQ2hhbmdlQ29sb3JzIiwiZSIsIl91cGRhdGVWaWV3cG9ydFJlY3RhbmdsZSIsInJlbmRlckJhY2tncm91bmRzIiwiX3JlbmRlclZlcnRpY2VzIiwicmVuZGVyQ3Vyc29yIiwidmVydGljZXMiLCJEWU5BTUlDX0RSQVciLCJfYmdGbG9hdCIsIl9jb2xvclRvRmxvYXQzMkFycmF5IiwiYmFja2dyb3VuZCIsIl9jdXJzb3JGbG9hdCIsImN1cnNvciIsIl9hZGRSZWN0YW5nbGVGbG9hdCIsInVwZGF0ZUJhY2tncm91bmRzIiwibW9kZWwiLCJjdXJyZW50U3RhcnRYIiwiY3VycmVudEJnIiwiY3VycmVudEZnIiwiY3VycmVudEludmVyc2UiLCJtb2RlbEluZGV4IiwiaW52ZXJzZSIsInJlY3RhbmdsZUNvdW50IiwiUkVOREVSX01PREVMX0lORElDSUVTX1BFUl9DRUxMIiwiY2VsbHMiLCJSRU5ERVJfTU9ERUxfQkdfT0ZGU0VUIiwiUkVOREVSX01PREVMX0ZHX09GRlNFVCIsIl91cGRhdGVSZWN0YW5nbGUiLCJ1cGRhdGVDdXJzb3IiLCJzdHlsZSIsImRwciIsImN1cnNvcldpZHRoIiwic3RhcnRYIiwiZW5kWCIsImFuc2kiLCJyZ2JhIiwiZm9yZWdyb3VuZCIsImV4cGFuZEZsb2F0MzJBcnJheSIsIl9hZGRSZWN0YW5nbGUiLCJ4MSIsInkxIiwiciIsImciLCJiIiwiYSIsImNvbG9yIiwiUkVOREVSX01PREVMX0VYVF9PRkZTRVQiLCJDT01CSU5FRF9DSEFSX0JJVF9NQVNLIiwiVWludDMyQXJyYXkiLCJzZWxlY3Rpb24iLCJjcmVhdGVTZWxlY3Rpb25SZW5kZXJNb2RlbCIsInJlc2l6ZSIsImluZGV4Q291bnQiLCJXZWJnbFJlbmRlcmVyIiwiX2NoYXJhY3RlckpvaW5lclNlcnZpY2UiLCJfY2hhclNpemVTZXJ2aWNlIiwiX2NvcmVCcm93c2VyU2VydmljZSIsIl9jb3JlU2VydmljZSIsIl9kZWNvcmF0aW9uU2VydmljZSIsInByZXNlcnZlRHJhd2luZ0J1ZmZlciIsIl9jdXJzb3JCbGlua1N0YXRlTWFuYWdlciIsIk11dGFibGVEaXNwb3NhYmxlIiwiX2NoYXJBdGxhc0Rpc3Bvc2FibGUiLCJfb2JzZXJ2ZXJEaXNwb3NhYmxlIiwiX21vZGVsIiwiUmVuZGVyTW9kZWwiLCJfd29ya0NlbGwiLCJDZWxsRGF0YSIsIl93b3JrQ2VsbDIiLCJfcmVjdGFuZ2xlUmVuZGVyZXIiLCJfZ2x5cGhSZW5kZXJlciIsIl9vbkNoYW5nZVRleHR1cmVBdGxhcyIsIkV2ZW50RW1pdHRlciIsIm9uQ2hhbmdlVGV4dHVyZUF0bGFzIiwiZXZlbnQiLCJfb25BZGRUZXh0dXJlQXRsYXNDYW52YXMiLCJvbkFkZFRleHR1cmVBdGxhc0NhbnZhcyIsIl9vblJlbW92ZVRleHR1cmVBdGxhc0NhbnZhcyIsIm9uUmVtb3ZlVGV4dHVyZUF0bGFzQ2FudmFzIiwiX29uUmVxdWVzdFJlZHJhdyIsIm9uUmVxdWVzdFJlZHJhdyIsIl9vbkNvbnRleHRMb3NzIiwib25Db250ZXh0TG9zcyIsIl9oYW5kbGVDb2xvckNoYW5nZSIsIl9jZWxsQ29sb3JSZXNvbHZlciIsIkNlbGxDb2xvclJlc29sdmVyIiwiX2NvcmUiLCJfcmVuZGVyTGF5ZXJzIiwiTGlua1JlbmRlckxheWVyIiwic2NyZWVuRWxlbWVudCIsImxpbmtpZmllciIsImNyZWF0ZVJlbmRlckRpbWVuc2lvbnMiLCJfZGV2aWNlUGl4ZWxSYXRpbyIsIl91cGRhdGVEaW1lbnNpb25zIiwiX3VwZGF0ZUN1cnNvckJsaW5rIiwib25PcHRpb25DaGFuZ2UiLCJfaGFuZGxlT3B0aW9uc0NoYW5nZWQiLCJfY2FudmFzIiwibWFpbkRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImNvbnRleHRBdHRyaWJ1dGVzIiwiYW50aWFsaWFzIiwiZGVwdGgiLCJnZXRDb250ZXh0IiwiRXJyb3IiLCJhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIiLCJjb25zb2xlIiwibG9nIiwicHJldmVudERlZmF1bHQiLCJfY29udGV4dFJlc3RvcmF0aW9uVGltZW91dCIsInNldFRpbWVvdXQiLCJ3YXJuIiwiZmlyZSIsImNsZWFyVGltZW91dCIsInJlbW92ZVRlcm1pbmFsRnJvbUNhY2hlIiwiX2luaXRpYWxpemVXZWJHTFN0YXRlIiwiX3JlcXVlc3RSZWRyYXdWaWV3cG9ydCIsInZhbHVlIiwib2JzZXJ2ZURldmljZVBpeGVsRGltZW5zaW9ucyIsIndpbmRvdyIsInciLCJoIiwiX3NldENhbnZhc0RldmljZVBpeGVsRGltZW5zaW9ucyIsIm9uV2luZG93Q2hhbmdlIiwiYXBwZW5kQ2hpbGQiLCJfaXNBdHRhY2hlZCIsImRvY3VtZW50IiwiYm9keSIsImNvbnRhaW5zIiwibCIsImRpc3Bvc2UiLCJwYXJlbnRFbGVtZW50IiwicmVtb3ZlQ2hpbGQiLCJ0ZXh0dXJlQXRsYXMiLCJfY2hhckF0bGFzIiwiX3JlZnJlc2hDaGFyQXRsYXMiLCJfY2xlYXJNb2RlbCIsImhhbmRsZURldmljZVBpeGVsUmF0aW9DaGFuZ2UiLCJjc3MiLCJoYW5kbGVDaGFyU2l6ZUNoYW5nZWQiLCJoYW5kbGVCbHVyIiwicGF1c2UiLCJoYW5kbGVGb2N1cyIsInJlc3VtZSIsImhhbmRsZVNlbGVjdGlvbkNoYW5nZWQiLCJzdGFydCIsImVuZCIsImNvbHVtblNlbGVjdE1vZGUiLCJ1cGRhdGUiLCJoYW5kbGVDdXJzb3JNb3ZlIiwicmVzdGFydEJsaW5rQW5pbWF0aW9uIiwiYWNxdWlyZVRleHR1cmVBdGxhcyIsImdldERpc3Bvc2VBcnJheURpc3Bvc2FibGUiLCJmb3J3YXJkRXZlbnQiLCJ3YXJtVXAiLCJjbGVhckdseXBoUmVuZGVyZXIiLCJjbGVhclRleHR1cmVBdGxhcyIsImNsZWFyVGV4dHVyZSIsInJlc2V0IiwicmVnaXN0ZXJDaGFyYWN0ZXJKb2luZXIiLCJoYW5kbGVyIiwiZGVyZWdpc3RlckNoYXJhY3RlckpvaW5lciIsImpvaW5lcklkIiwicmVuZGVyUm93cyIsImhhbmRsZUdyaWRDaGFuZ2VkIiwiX3VwZGF0ZU1vZGVsIiwiaXNDdXJzb3JWaXNpYmxlIiwib3B0aW9ucyIsImN1cnNvckJsaW5rIiwiQ3Vyc29yQmxpbmtTdGF0ZU1hbmFnZXIiLCJfcmVxdWVzdFJlZHJhd0N1cnNvciIsInJvdyIsImxpbmUiLCJqb2luZWRSYW5nZXMiLCJpc0pvaW5lZCIsImxhc3RDaGFyWCIsInJhbmdlIiwiaiIsImNsYW1wIiwiY3Vyc29yWSIsImJ1ZmZlciIsImFjdGl2ZSIsImJhc2VZIiwidmlld3BvcnRSZWxhdGl2ZUN1cnNvclkiLCJ5ZGlzcCIsImN1cnNvclgiLCJsYXN0Q3Vyc29yWCIsImlzQ3Vyc29ySW5pdGlhbGl6ZWQiLCJpc0N1cnNvckhpZGRlbiIsIm1vZGVsVXBkYXRlZCIsImxpbmVzIiwiZ2V0IiwiZ2V0Sm9pbmVkQ2hhcmFjdGVycyIsInJlc3VsdCIsImxvYWRDZWxsIiwic2hpZnQiLCJKb2luZWRDZWxsRGF0YSIsInRyYW5zbGF0ZVRvU3RyaW5nIiwiZ2V0Q2hhcnMiLCJnZXRDb2RlIiwicmVzb2x2ZSIsImdldFdpZHRoIiwiaXNGb2N1c2VkIiwiY3Vyc29yU3R5bGUiLCJjdXJzb3JJbmFjdGl2ZVN0eWxlIiwiY3Vyc29yQWNjZW50IiwiTlVMTF9DRUxMX0NIQVIiLCJjZWlsIiwibGluZUhlaWdodCIsInJvdW5kIiwibGV0dGVyU3BhY2luZyIsIkF0dHJpYnV0ZURhdGEiLCJmaXJzdENlbGwiLCJjb250ZW50IiwiY29tYmluZWREYXRhIiwiX3dpZHRoIiwiaXNDb21iaW5lZCIsInNldEZyb21DaGFyRGF0YSIsImdldEFzQ2hhckRhdGEiLCJtYXgiLCJjcmVhdGVTaGFkZXIiLCJ0eXBlIiwic291cmNlIiwic2hhZGVyIiwic2hhZGVyU291cmNlIiwiY29tcGlsZVNoYWRlciIsImdldFNoYWRlclBhcmFtZXRlciIsIkNPTVBJTEVfU1RBVFVTIiwiZXJyb3IiLCJnZXRTaGFkZXJJbmZvTG9nIiwiZGVsZXRlU2hhZGVyIiwidmVydGV4U291cmNlIiwiZnJhZ21lbnRTb3VyY2UiLCJwcm9ncmFtIiwiYXR0YWNoU2hhZGVyIiwiVkVSVEVYX1NIQURFUiIsIkZSQUdNRU5UX1NIQURFUiIsImxpbmtQcm9ncmFtIiwiZ2V0UHJvZ3JhbVBhcmFtZXRlciIsIkxJTktfU1RBVFVTIiwiZ2V0UHJvZ3JhbUluZm9Mb2ciLCJuZXdMZW5ndGgiLCJuZXdBcnJheSIsIkJhc2VSZW5kZXJMYXllciIsIl9jb250YWluZXIiLCJpZCIsInpJbmRleCIsIl9hbHBoYSIsIl9kZXZpY2VDaGFyV2lkdGgiLCJfZGV2aWNlQ2hhckhlaWdodCIsIl9kZXZpY2VDZWxsV2lkdGgiLCJfZGV2aWNlQ2VsbEhlaWdodCIsIl9kZXZpY2VDaGFyTGVmdCIsIl9kZXZpY2VDaGFyVG9wIiwiY2xhc3NMaXN0IiwiYWRkIiwidG9TdHJpbmciLCJfaW5pdENhbnZhcyIsInJlbW92ZSIsIl9jdHgiLCJhbHBoYSIsIl9jbGVhckFsbCIsInN0YXJ0Um93IiwiZW5kUm93IiwiX3NldFRyYW5zcGFyZW5jeSIsIm9sZENhbnZhcyIsImNsb25lTm9kZSIsInJlcGxhY2VDaGlsZCIsImNvbG9yU2V0IiwiZGltIiwiX2ZpbGxCb3R0b21MaW5lQXRDZWxscyIsImZpbGxSZWN0IiwiY2xlYXJSZWN0IiwiZmlsbFN0eWxlIiwiX2NsZWFyQ2VsbHMiLCJfZmlsbENoYXJUcnVlQ29sb3IiLCJmb250IiwiX2dldEZvbnQiLCJ0ZXh0QmFzZWxpbmUiLCJURVhUX0JBU0VMSU5FIiwiX2NsaXBDZWxsIiwiZmlsbFRleHQiLCJiZWdpblBhdGgiLCJyZWN0IiwiY2xpcCIsImlzQm9sZCIsImlzSXRhbGljIiwiZm9udFdlaWdodEJvbGQiLCJmb250V2VpZ2h0IiwiZm9udFNpemUiLCJmb250RmFtaWx5IiwiY29udGFpbmVyIiwibGlua2lmaWVyMiIsImNvcmVCcm93c2VyU2VydmljZSIsIm9wdGlvbnNTZXJ2aWNlIiwidGhlbWVTZXJ2aWNlIiwib25TaG93TGlua1VuZGVybGluZSIsIl9oYW5kbGVTaG93TGlua1VuZGVybGluZSIsIm9uSGlkZUxpbmtVbmRlcmxpbmUiLCJfaGFuZGxlSGlkZUxpbmtVbmRlcmxpbmUiLCJfc3RhdGUiLCJfY2xlYXJDdXJyZW50TGluayIsIm1pZGRsZVJvd0NvdW50IiwieTIiLCJ4MiIsIklOVkVSVEVEX0RFRkFVTFRfQ09MT1IiLCJpczI1NkNvbG9yIiwibm9kZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJkaXNwb3NlZCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCIkY29sb3JzIiwiJGZnIiwiJGJnIiwiJGhhc0ZnIiwiJGhhc0JnIiwiJGlzU2VsZWN0ZWQiLCIkdmFyaWFudE9mZnNldCIsIl9vcHRpb25TZXJ2aWNlIiwiX3NlbGVjdGlvblJlbmRlck1vZGVsIiwiZGV2aWNlQ2VsbFdpZHRoIiwiZXh0ZW5kZWQiLCJ1bmRlcmxpbmVTdHlsZSIsImxpbmVXaWR0aCIsImZvckVhY2hEZWNvcmF0aW9uQXRDZWxsIiwiZCIsImJhY2tncm91bmRDb2xvclJHQiIsImZvcmVncm91bmRDb2xvclJHQiIsImlzQ2VsbFNlbGVjdGVkIiwiYmxlbmQiLCJzZWxlY3Rpb25CYWNrZ3JvdW5kT3BhcXVlIiwic2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kT3BhcXVlIiwic2VsZWN0aW9uRm9yZWdyb3VuZCIsInRyZWF0R2x5cGhBc0JhY2tncm91bmRDb2xvciIsImNoYXJBdGxhc0NhY2hlIiwiZGV2aWNlQ2VsbEhlaWdodCIsImRldmljZUNoYXJXaWR0aCIsImRldmljZUNoYXJIZWlnaHQiLCJkZXZpY2VQaXhlbFJhdGlvIiwibmV3Q29uZmlnIiwiZ2VuZXJhdGVDb25maWciLCJlbnRyeSIsIm93bmVkQnlJbmRleCIsIm93bmVkQnkiLCJpbmRleE9mIiwiY29uZmlnRXF1YWxzIiwiY29uZmlnIiwic3BsaWNlIiwicHVzaCIsImNvcmUiLCJuZXdFbnRyeSIsInVuaWNvZGVTZXJ2aWNlIiwiaW5kZXgiLCJjbG9uZWRDb2xvcnMiLCJOVUxMX0NPTE9SIiwic2VsZWN0aW9uQmFja2dyb3VuZFRyYW5zcGFyZW50Iiwic2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQiLCJzbGljZSIsImNvbnRyYXN0Q2FjaGUiLCJoYWxmQ29udHJhc3RDYWNoZSIsImN1c3RvbUdseXBocyIsImFsbG93VHJhbnNwYXJlbmN5IiwiZHJhd0JvbGRUZXh0SW5CcmlnaHRDb2xvcnMiLCJtaW5pbXVtQ29udHJhc3RSYXRpbyIsImNvbG9yQ29kZSIsIkRJTV9PUEFDSVRZIiwiaXNGaXJlZm94IiwiaXNMZWdhY3lFZGdlIiwiX3JlbmRlckNhbGxiYWNrIiwiX3Jlc3RhcnRJbnRlcnZhbCIsImlzUGF1c2VkIiwiX2JsaW5rU3RhcnRUaW1lb3V0IiwiX2JsaW5rSW50ZXJ2YWwiLCJjbGVhckludGVydmFsIiwiX2FuaW1hdGlvbkZyYW1lIiwiY2FuY2VsQW5pbWF0aW9uRnJhbWUiLCJfYW5pbWF0aW9uVGltZVJlc3RhcnRlZCIsIkRhdGUiLCJub3ciLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJ0aW1lVG9TdGFydCIsIkJMSU5LX0lOVEVSVkFMIiwidGltZSIsInNldEludGVydmFsIiwiYmxvY2tFbGVtZW50RGVmaW5pdGlvbnMiLCJwYXR0ZXJuQ2hhcmFjdGVyRGVmaW5pdGlvbnMiLCJib3hEcmF3aW5nRGVmaW5pdGlvbnMiLCJ4cCIsInlwIiwicG93ZXJsaW5lRGVmaW5pdGlvbnMiLCJyaWdodFBhZGRpbmciLCJsZWZ0UGFkZGluZyIsImN0eCIsImMiLCJ4T2Zmc2V0IiwieU9mZnNldCIsImJsb2NrRWxlbWVudERlZmluaXRpb24iLCJjaGFyRGVmaW5pdGlvbiIsImJveCIsInhFaWdodGgiLCJ5RWlnaHRoIiwiZHJhd0Jsb2NrRWxlbWVudENoYXIiLCJwYXR0ZXJuRGVmaW5pdGlvbiIsInBhdHRlcm5TZXQiLCJjYWNoZWRQYXR0ZXJucyIsIk1hcCIsInBhdHRlcm4iLCJ0bXBDYW52YXMiLCJvd25lckRvY3VtZW50IiwidG1wQ3R4IiwiaW1hZ2VEYXRhIiwiSW1hZ2VEYXRhIiwic3RhcnRzV2l0aCIsInBhcnNlSW50Iiwic3Vic3RyaW5nIiwic3BsaXQiLCJtYXAiLCJwYXJzZUZsb2F0IiwiZGF0YSIsInB1dEltYWdlRGF0YSIsImNyZWF0ZVBhdHRlcm4iLCJkcmF3UGF0dGVybkNoYXIiLCJib3hEcmF3aW5nRGVmaW5pdGlvbiIsInN0cm9rZVN0eWxlIiwiaW5zdHJ1Y3Rpb25zIiwiT2JqZWN0IiwiZW50cmllcyIsImFjdHVhbEluc3RydWN0aW9ucyIsIk51bWJlciIsImluc3RydWN0aW9uIiwiZiIsInN2Z1RvQ2FudmFzSW5zdHJ1Y3Rpb25NYXAiLCJhcmdzIiwidHJhbnNsYXRlQXJncyIsInN0cm9rZSIsImNsb3NlUGF0aCIsImRyYXdCb3hEcmF3aW5nQ2hhciIsInBvd2VybGluZURlZmluaXRpb24iLCJjbGlwUmVnaW9uIiwiUGF0aDJEIiwiY3NzTGluZVdpZHRoIiwiZHJhd1Bvd2VybGluZUNoYXIiLCJiZXppZXJDdXJ2ZVRvIiwibGluZVRvIiwibW92ZVRvIiwiY2VsbFdpZHRoIiwiY2VsbEhlaWdodCIsImRvQ2xhbXAiLCJlbGVtZW50IiwicGFyZW50V2luZG93IiwiY2FsbGJhY2siLCJvYnNlcnZlciIsIlJlc2l6ZU9ic2VydmVyIiwiZmluZCIsInRhcmdldCIsImRpc2Nvbm5lY3QiLCJkZXZpY2VQaXhlbENvbnRlbnRCb3hTaXplIiwiaW5saW5lU2l6ZSIsImJsb2NrU2l6ZSIsIm9ic2VydmUiLCJpc1Bvd2VybGluZUdseXBoIiwiY29kZXBvaW50IiwiaXNFbW9qaSIsImdseXBoU2l6ZVgiLCJpc05lcmRGb250R2x5cGgiLCJpc0JveE9yQmxvY2tHbHlwaCIsImN1cnJlbnRPZmZzZXQiLCJTZWxlY3Rpb25SZW5kZXJNb2RlbCIsImhhc1NlbGVjdGlvbiIsInZpZXdwb3J0U3RhcnRSb3ciLCJ2aWV3cG9ydEVuZFJvdyIsInZpZXdwb3J0Q2FwcGVkU3RhcnRSb3ciLCJ2aWV3cG9ydENhcHBlZEVuZFJvdyIsInN0YXJ0Q29sIiwiZW5kQ29sIiwic2VsZWN0aW9uU3RhcnQiLCJzZWxlY3Rpb25FbmQiLCJ2aWV3cG9ydFkiLCJidWZmZXJzIiwiTlVMTF9SQVNURVJJWkVEX0dMWVBIIiwidGV4dHVyZVBvc2l0aW9uIiwiX3BhZ2VzIiwiX2RvY3VtZW50IiwiX2NvbmZpZyIsIl91bmljb2RlU2VydmljZSIsIl9kaWRXYXJtVXAiLCJfY2FjaGVNYXAiLCJGb3VyS2V5TWFwIiwiX2NhY2hlTWFwQ29tYmluZWQiLCJfYWN0aXZlUGFnZXMiLCJfd29ya0JvdW5kaW5nQm94IiwiYm90dG9tIiwicmlnaHQiLCJfd29ya0F0dHJpYnV0ZURhdGEiLCJfdGV4dHVyZVNpemUiLCJfcmVxdWVzdENsZWFyTW9kZWwiLCJfY3JlYXRlTmV3UGFnZSIsIl90bXBDYW52YXMiLCJjcmVhdGVDYW52YXMiLCJUTVBfQ0FOVkFTX0dMWVBIX1BBRERJTkciLCJfdG1wQ3R4Iiwid2lsbFJlYWRGcmVxdWVudGx5IiwicGFnZSIsIl9kb1dhcm1VcCIsInF1ZXVlIiwiSWRsZVRhc2tRdWV1ZSIsImVucXVldWUiLCJERUZBVUxUX0NPTE9SIiwiREVGQVVMVF9FWFQiLCJyYXN0ZXJpemVkR2x5cGgiLCJfZHJhd1RvQ2FjaGUiLCJjdXJyZW50Um93IiwicGFnZXNCeVNpemUiLCJmaWx0ZXIiLCJzb3J0IiwicGVyY2VudGFnZVVzZWQiLCJzYW1lU2l6ZUkiLCJtZXJnaW5nUGFnZXMiLCJzb3J0ZWRNZXJnaW5nUGFnZXNJbmRleGVzIiwiZ2x5cGhzIiwibWVyZ2VkUGFnZUluZGV4IiwibWVyZ2VkUGFnZSIsIl9tZXJnZVBhZ2VzIiwiX2RlbGV0ZVBhZ2UiLCJuZXdQYWdlIiwiQXRsYXNQYWdlIiwibWVyZ2VkU2l6ZSIsInAiLCJkcmF3SW1hZ2UiLCJwYWdlSW5kZXgiLCJhZGp1c3RpbmdQYWdlIiwicmVzdHJpY3RUb0NlbGxIZWlnaHQiLCJfZ2V0RnJvbUNhY2hlTWFwIiwiY2FjaGVNYXAiLCJrZXkiLCJfZ2V0Q29sb3JGcm9tQW5zaUluZGV4IiwiaWR4IiwiX2dldEJhY2tncm91bmRDb2xvciIsImJnQ29sb3JNb2RlIiwiYmdDb2xvciIsImFyciIsInRvQ29sb3JSR0IiLCJjaGFubmVscyIsInRvQ29sb3IiLCJvcGFxdWUiLCJfZ2V0Rm9yZWdyb3VuZENvbG9yIiwiZmdDb2xvck1vZGUiLCJmZ0NvbG9yIiwiYm9sZCIsImV4Y2x1ZGVGcm9tQ29udHJhc3RSYXRpb0RlbWFuZHMiLCJtaW5pbXVtQ29udHJhc3RDb2xvciIsIl9nZXRNaW5pbXVtQ29udHJhc3RDb2xvciIsIm11bHRpcGx5T3BhY2l0eSIsIl9yZXNvbHZlQmFja2dyb3VuZFJnYmEiLCJfcmVzb2x2ZUZvcmVncm91bmRSZ2JhIiwiY2FjaGUiLCJfZ2V0Q29udHJhc3RDYWNoZSIsImFkanVzdGVkQ29sb3IiLCJnZXRDb2xvciIsImJnUmdiYSIsImZnUmdiYSIsImVuc3VyZUNvbnRyYXN0UmF0aW8iLCJzZXRDb2xvciIsImNvZGVPckNoYXJzIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwiYWxsb3dlZFdpZHRoIiwiYWxsb3dlZEhlaWdodCIsInNhdmUiLCJpc0ludmlzaWJsZSIsImlzSW52ZXJzZSIsImlzRGltIiwiaXRhbGljIiwidW5kZXJsaW5lIiwiaXNVbmRlcmxpbmUiLCJzdHJpa2V0aHJvdWdoIiwiaXNTdHJpa2V0aHJvdWdoIiwib3ZlcmxpbmUiLCJpc092ZXJsaW5lIiwiZ2V0RmdDb2xvciIsImdldEZnQ29sb3JNb2RlIiwiZ2V0QmdDb2xvciIsImdldEJnQ29sb3JNb2RlIiwidGVtcCIsInRlbXAyIiwiYmFja2dyb3VuZENvbG9yIiwiZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uIiwiZm9udFN0eWxlIiwicG93ZXJsaW5lR2x5cGgiLCJjaGFyQ29kZUF0IiwicmVzdHJpY3RlZFBvd2VybGluZUdseXBoIiwiaXNSZXN0cmljdGVkUG93ZXJsaW5lR2x5cGgiLCJmb3JlZ3JvdW5kQ29sb3IiLCJwYWRkaW5nIiwiY3VzdG9tR2x5cGgiLCJ0cnlEcmF3Q3VzdG9tQ2hhciIsImNoV2lkdGgiLCJlbmFibGVDbGVhclRocmVzaG9sZENoZWNrIiwid2N3aWR0aCIsImdldFN0cmluZ0NlbGxXaWR0aCIsImlzVW5kZXJsaW5lQ29sb3JEZWZhdWx0IiwiaXNVbmRlcmxpbmVDb2xvclJHQiIsImdldFVuZGVybGluZUNvbG9yIiwiam9pbiIsInhMZWZ0IiwieVRvcCIsInlNaWQiLCJ5Qm90IiwibmV4dE9mZnNldCIsImdldFVuZGVybGluZVZhcmlhbnRPZmZzZXQiLCJ4Q2hMZWZ0IiwieENoUmlnaHQiLCJ4Q2hNaWQiLCJ5Q3VybHlCb3QiLCJ5Q3VybHlUb3AiLCJvZmZzZXRXaWR0aCIsInNldExpbmVEYXNoIiwiY29tcHV0ZU5leHRWYXJpYW50T2Zmc2V0IiwibGluZVJhdGlvIiwiZ2FwUmF0aW8iLCJ4Q2hXaWR0aCIsImdhcCIsInJlc3RvcmUiLCJtZXRyaWNzIiwibWVhc3VyZVRleHQiLCJhY3R1YWxCb3VuZGluZ0JveERlc2NlbnQiLCJzdHJva2VUZXh0IiwiaXNCZXlvbmRDZWxsQm91bmRzIiwiY2xlYXJDb2xvciIsImdldEltYWdlRGF0YSIsImlzRW1wdHkiLCJjaGVja0NvbXBsZXRlbHlUcmFuc3BhcmVudCIsIl9maW5kR2x5cGhCb3VuZGluZ0JveCIsImFjdGl2ZVBhZ2UiLCJhY3RpdmVSb3ciLCJmaXhlZFJvd3MiLCJ3YXNQYWdlQW5kUm93Rm91bmQiLCJjYW5kaWRhdGVQYWdlIiwiYWRkR2x5cGgiLCJib3VuZGluZ0JveCIsInJlc3RyaWN0ZWRHbHlwaCIsImZvdW5kIiwiYWxwaGFPZmZzZXQiLCJfdXNlZFBpeGVscyIsIl9nbHlwaHMiLCJnbHlwaCIsInNvdXJjZVBhZ2VzIiwiZW5hYmxlVGhyZXNob2xkQ2hlY2siLCJmZ1IiLCJmZ0ciLCJmZ0IiLCJ0aHJlc2hvbGQiLCJhYnMiLCJyZ2IiLCJ0b1BhZGRlZEhleCIsInMiLCJjb250cmFzdFJhdGlvIiwibDEiLCJsMiIsInRvQ3NzIiwidG9SZ2JhIiwib3BhY2l0eSIsInRvQ2hhbm5lbHMiLCJiZ1IiLCJiZ0ciLCJiZ0IiLCJpc09wYXF1ZSIsInJhdGlvIiwicmdiYUNvbG9yIiwiZmFjdG9yIiwiJGN0eCIsIiRsaXRtdXNDb2xvciIsImNyZWF0ZUxpbmVhckdyYWRpZW50IiwibWF0Y2giLCJyZXBlYXQiLCJyZ2JhTWF0Y2giLCJyZWxhdGl2ZUx1bWluYW5jZTIiLCJycyIsImdzIiwiYnMiLCJwb3ciLCJyZWxhdGl2ZUx1bWluYW5jZSIsInJlZHVjZUx1bWluYW5jZSIsImNyIiwiaW5jcmVhc2VMdW1pbmFuY2UiLCJiZ0wiLCJmZ0wiLCJyZXN1bHRBIiwicmVzdWx0QVJhdGlvIiwicmVzdWx0QiIsIl9saXN0ZW5lcnMiLCJfZGlzcG9zZWQiLCJfZXZlbnQiLCJsaXN0ZW5lciIsImFyZzEiLCJhcmcyIiwiY2FsbCIsImNsZWFyTGlzdGVuZXJzIiwiZnJvbSIsInRvIiwiZGlzcG9zZUFycmF5IiwiZGlzcG9zYWJsZXMiLCJfZGlzcG9zYWJsZXMiLCJfaXNEaXNwb3NlZCIsInVucmVnaXN0ZXIiLCJfdmFsdWUiLCJUd29LZXlNYXAiLCJfZGF0YSIsImZpcnN0Iiwic2Vjb25kIiwidGhpcmQiLCJmb3VydGgiLCJpc05vZGUiLCJwcm9jZXNzIiwidXNlckFnZW50IiwibmF2aWdhdG9yIiwicGxhdGZvcm0iLCJpbmNsdWRlcyIsImlzU2FmYXJpIiwidGVzdCIsIm1ham9yVmVyc2lvbiIsImlzTWFjIiwiaXNJcGFkIiwiaXNJcGhvbmUiLCJpc1dpbmRvd3MiLCJpc0xpbnV4IiwiaXNDaHJvbWVPUyIsIlRhc2tRdWV1ZSIsIl90YXNrcyIsIl9pIiwidGFzayIsIl9zdGFydCIsImZsdXNoIiwiX2lkbGVDYWxsYmFjayIsIl9jYW5jZWxDYWxsYmFjayIsIl9yZXF1ZXN0Q2FsbGJhY2siLCJfcHJvY2VzcyIsImJpbmQiLCJkZWFkbGluZSIsInRhc2tEdXJhdGlvbiIsImxvbmdlc3RUYXNrIiwibGFzdERlYWRsaW5lUmVtYWluaW5nIiwidGltZVJlbWFpbmluZyIsImRlYWRsaW5lUmVtYWluaW5nIiwiUHJpb3JpdHlUYXNrUXVldWUiLCJfY3JlYXRlRGVhZGxpbmUiLCJpZGVudGlmaWVyIiwiZHVyYXRpb24iLCJyZXF1ZXN0SWRsZUNhbGxiYWNrIiwiY2FuY2VsSWRsZUNhbGxiYWNrIiwiX3F1ZXVlIiwiRXh0ZW5kZWRBdHRycyIsImZyb21Db2xvclJHQiIsImNsb25lIiwibmV3T2JqIiwiaGFzRXh0ZW5kZWRBdHRycyIsImlzQmxpbmsiLCJpc1Byb3RlY3RlZCIsImlzRmdSR0IiLCJpc0JnUkdCIiwiaXNGZ1BhbGV0dGUiLCJpc0JnUGFsZXR0ZSIsImlzRmdEZWZhdWx0IiwiaXNCZ0RlZmF1bHQiLCJpc0F0dHJpYnV0ZURlZmF1bHQiLCJ1cGRhdGVFeHRlbmRlZCIsInVuZGVybGluZUNvbG9yIiwiZ2V0VW5kZXJsaW5lQ29sb3JNb2RlIiwiaXNVbmRlcmxpbmVDb2xvclBhbGV0dGUiLCJnZXRVbmRlcmxpbmVTdHlsZSIsInVuZGVybGluZVZhcmlhbnRPZmZzZXQiLCJfdXJsSWQiLCJfZXh0IiwidXJsSWQiLCJ2YWwiLCJmcm9tQ2hhckRhdGEiLCJvYmoiLCJzdHJpbmdGcm9tQ29kZVBvaW50IiwiQ0hBUl9EQVRBX0FUVFJfSU5ERVgiLCJjb21iaW5lZCIsIkNIQVJfREFUQV9DSEFSX0lOREVYIiwiQ0hBUl9EQVRBX1dJRFRIX0lOREVYIiwiREVGQVVMVF9BVFRSIiwiQ0hBUl9EQVRBX0NPREVfSU5ERVgiLCJOVUxMX0NFTExfV0lEVEgiLCJXSElURVNQQUNFX0NFTExfQ0hBUiIsIldISVRFU1BBQ0VfQ0VMTF9XSURUSCIsIldISVRFU1BBQ0VfQ0VMTF9DT0RFIiwiY29kZVBvaW50IiwiX2ludGVyaW0iLCJkZWNvZGUiLCJpbnB1dCIsInN0YXJ0UG9zIiwiaW50ZXJpbSIsImJ5dGUxIiwiYnl0ZTIiLCJieXRlMyIsImJ5dGU0IiwiZGlzY2FyZEludGVyaW0iLCJjcCIsInRtcCIsInBvcyIsIm1pc3NpbmciLCJmb3VyU3RvcCIsIm9wdGlvbnNLZXlUb0xvZ0xldmVsIiwidHJhY2UiLCJMb2dMZXZlbEVudW0iLCJUUkFDRSIsImRlYnVnIiwiREVCVUciLCJpbmZvIiwiSU5GTyIsIldBUk4iLCJFUlJPUiIsIm9mZiIsIk9GRiIsInRyYWNlTG9nZ2VyIiwiTG9nU2VydmljZSIsImxvZ0xldmVsIiwiX2xvZ0xldmVsIiwiX3VwZGF0ZUxvZ0xldmVsIiwib25TcGVjaWZpY09wdGlvbkNoYW5nZSIsIl9ldmFsTGF6eU9wdGlvbmFsUGFyYW1zIiwib3B0aW9uYWxQYXJhbXMiLCJfbG9nIiwibWVzc2FnZSIsImxvZ2dlciIsIklPcHRpb25zU2VydmljZSIsIl90YXJnZXQiLCJkZXNjcmlwdG9yIiwiZm4iLCJhcHBseSIsIm5hbWUiLCJKU09OIiwic3RyaW5naWZ5IiwiRElfVEFSR0VUIiwiRElfREVQRU5ERU5DSUVTIiwic2VydmljZVJlZ2lzdHJ5IiwiY3RvciIsImhhcyIsImRlY29yYXRvciIsImFyZ3VtZW50cyIsInN0b3JlU2VydmljZURlcGVuZGVuY3kiLCJJQnVmZmVyU2VydmljZSIsImNyZWF0ZURlY29yYXRvciIsIklDb3JlTW91c2VTZXJ2aWNlIiwiSUNvcmVTZXJ2aWNlIiwiSUNoYXJzZXRTZXJ2aWNlIiwiSUluc3RhbnRpYXRpb25TZXJ2aWNlIiwiSUxvZ1NlcnZpY2UiLCJJT3NjTGlua1NlcnZpY2UiLCJJVW5pY29kZVNlcnZpY2UiLCJJRGVjb3JhdGlvblNlcnZpY2UiLCJfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18iLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJjYWNoZWRNb2R1bGUiLCJfX3dlYnBhY2tfbW9kdWxlc19fIiwiV2ViZ2xBZGRvbiIsIl9wcmVzZXJ2ZURyYXdpbmdCdWZmZXIiLCJnZXRTYWZhcmlWZXJzaW9uIiwiYWN0aXZhdGUiLCJvbldpbGxPcGVuIiwiY29yZVNlcnZpY2UiLCJ1bnNhZmVDb3JlIiwicmVuZGVyU2VydmljZSIsIl9yZW5kZXJTZXJ2aWNlIiwiY2hhcmFjdGVySm9pbmVyU2VydmljZSIsImNoYXJTaXplU2VydmljZSIsImRlY29yYXRpb25TZXJ2aWNlIiwibG9nU2VydmljZSIsIl9sb2dTZXJ2aWNlIiwic2V0VHJhY2VMb2dnZXIiLCJfcmVuZGVyZXIiLCJzZXRSZW5kZXJlciIsIl9jcmVhdGVSZW5kZXJlciJdLCJzb3VyY2VSb290IjoiIn0=
|