textmode.js 0.1.3 → 0.1.4-beta.1
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/textmode.esm.js +5 -5
- package/dist/textmode.esm.min.js +126 -126
- package/dist/textmode.umd.js +2 -2
- package/dist/textmode.umd.min.js +12 -12
- package/package.json +1 -1
package/dist/textmode.umd.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
`,r+="↓".repeat(24)+`
|
|
7
7
|
`,r}static formatValue(e){if(e===null)return"null";if(e===void 0)return"undefined";if(typeof e=="string")return`"${e}"`;if(typeof e=="number"||typeof e=="boolean")return String(e);if(Array.isArray(e))return e.length===0?"[]":e.length<=5?`[${e.map(t=>C.formatValue(t)).join(", ")}]`:`[${e.slice(0,3).map(t=>C.formatValue(t)).join(", ")}, ... +${e.length-3} more]`;if(typeof e=="object"){const t=Object.keys(e);return t.length===0?"{}":t.length<=3?`{ ${t.map(s=>`${s}: ${C.formatValue(e[s])}`).join(", ")} }`:`{ ${t.slice(0,2).map(i=>`${i}: ${C.formatValue(e[i])}`).join(", ")}, ... +${t.length-2} more }`}return String(e)}}var x=(a=>(a[a.SILENT=0]="SILENT",a[a.WARNING=1]="WARNING",a[a.ERROR=2]="ERROR",a[a.THROW=3]="THROW",a))(x||{});const b=class b{constructor(){n(this,"_options",{globalLevel:3})}static getInstance(){return b._instance||(b._instance=new b),b._instance}_handle(A,e,t){const r="[textmode.js]";switch(this._options.globalLevel){case 0:return!1;case 1:return console.group(`%c${r} Oops! (╯°□°)╯︵ Something went wrong in your code.`,"color: #f44336; font-weight: bold; background: #ffebee; padding: 2px 6px; border-radius: 3px;"),console.warn(C.createFormattedMessage(A,e)),console.groupEnd(),!1;case 2:return console.group(`%c${r} Oops! (╯°□°)╯︵ Something went wrong in your code.`,"color: #f44336; font-weight: bold; background: #ffebee; padding: 2px 6px; border-radius: 3px;"),console.error(C.createFormattedMessage(A,e)),console.groupEnd(),!1;case 3:default:const i=new C(A,t,e);throw console.group(`%c${r} Oops! (╯°□°)╯︵ Something went wrong in your code.`,"color: #d32f2f; font-weight: bold; background: #ffcdd2; padding: 2px 6px; border-radius: 3px;"),i}}validate(A,e,t){return A?!0:(this._handle(e,t),!1)}setGlobalLevel(A){this._options.globalLevel=A}};n(b,"_instance",null);let U=b;const D=U.getInstance();class rA{constructor(A,e,t=e,r={}){n(this,"gl");n(this,"_framebuffer");n(this,"_texture");n(this,"_width");n(this,"_height");n(this,"options");n(this,"previousState",null);n(this,"_pixels",null);this.gl=A,this._width=e,this._height=t,this.options={filter:"nearest",wrap:"clamp",format:"rgba",type:"unsigned_byte",...r},this._texture=this.createTexture(),this._framebuffer=A.createFramebuffer(),this.attachTexture()}createTexture(){const{gl:A}=this,e=A.createTexture();A.bindTexture(A.TEXTURE_2D,e);const t=this.options.filter==="linear"?A.LINEAR:A.NEAREST,r=this.options.wrap==="repeat"?A.REPEAT:A.CLAMP_TO_EDGE;return A.texParameteri(A.TEXTURE_2D,A.TEXTURE_MIN_FILTER,t),A.texParameteri(A.TEXTURE_2D,A.TEXTURE_MAG_FILTER,t),A.texParameteri(A.TEXTURE_2D,A.TEXTURE_WRAP_S,r),A.texParameteri(A.TEXTURE_2D,A.TEXTURE_WRAP_T,r),this.updateTextureSize(),e}updateTextureSize(){const{gl:A}=this,e=A.RGBA,t=A.RGBA,r=this.options.type==="float"?A.FLOAT:A.UNSIGNED_BYTE;A.texImage2D(A.TEXTURE_2D,0,e,this._width,this._height,0,t,r,null)}attachTexture(){const{gl:A}=this;A.bindFramebuffer(A.FRAMEBUFFER,this._framebuffer),A.framebufferTexture2D(A.FRAMEBUFFER,A.COLOR_ATTACHMENT0,A.TEXTURE_2D,this._texture,0),A.bindFramebuffer(A.FRAMEBUFFER,null)}update(A){const{gl:e}=this;A instanceof HTMLVideoElement&&A.readyState<2||(e.bindTexture(e.TEXTURE_2D,this._texture),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,A),e.bindTexture(e.TEXTURE_2D,null))}updatePixels(A,e,t){const{gl:r}=this;r.bindTexture(r.TEXTURE_2D,this._texture),r.texImage2D(r.TEXTURE_2D,0,r.RGBA,e,t,0,r.RGBA,r.UNSIGNED_BYTE,A),r.bindTexture(r.TEXTURE_2D,null)}resize(A,e){const{gl:t}=this;this._width=A,this._height=e,t.bindTexture(t.TEXTURE_2D,this._texture),this.updateTextureSize(),t.bindTexture(t.TEXTURE_2D,null)}begin(){const{gl:A}=this;this.previousState={framebuffer:A.getParameter(A.FRAMEBUFFER_BINDING),viewport:A.getParameter(A.VIEWPORT)},A.bindFramebuffer(A.FRAMEBUFFER,this._framebuffer),A.viewport(0,0,this._width,this._height)}end(){if(!this.previousState)return;const{gl:A}=this;A.bindFramebuffer(A.FRAMEBUFFER,this.previousState.framebuffer),A.viewport(...this.previousState.viewport),this.previousState=null}loadPixels(){const{gl:A}=this;this._pixels||(this._pixels=new Uint8Array(this._width*this._height*4));const e=A.getParameter(A.FRAMEBUFFER_BINDING);A.bindFramebuffer(A.FRAMEBUFFER,this._framebuffer),A.readPixels(0,0,this._width,this._height,A.RGBA,A.UNSIGNED_BYTE,this._pixels),A.bindFramebuffer(A.FRAMEBUFFER,e)}get(A,e,t,r){const{gl:i}=this;if(A===void 0&&e===void 0){const s=new Uint8Array(this._width*this._height*4),o=i.getParameter(i.FRAMEBUFFER_BINDING);return i.bindFramebuffer(i.FRAMEBUFFER,this._framebuffer),i.readPixels(0,0,this._width,this._height,i.RGBA,i.UNSIGNED_BYTE,s),i.bindFramebuffer(i.FRAMEBUFFER,o),s}else if(t===void 0&&r===void 0){(A<0||e<0||A>=this._width||e>=this._height)&&(console.warn("The x and y values passed to Framebuffer.get are outside of its range and will be clamped."),A=Math.max(0,Math.min(A,this._width-1)),e=Math.max(0,Math.min(e,this._height-1)));const s=new Uint8Array(4),o=i.getParameter(i.FRAMEBUFFER_BINDING);return i.bindFramebuffer(i.FRAMEBUFFER,this._framebuffer),i.readPixels(A,e,1,1,i.RGBA,i.UNSIGNED_BYTE,s),i.bindFramebuffer(i.FRAMEBUFFER,o),[s[0],s[1],s[2],s[3]]}else{A=Math.max(0,Math.min(A,this._width-1)),e=Math.max(0,Math.min(e,this._height-1)),t=Math.max(1,Math.min(t,this._width-A)),r=Math.max(1,Math.min(r,this._height-e));const s=new Uint8Array(t*r*4),o=i.getParameter(i.FRAMEBUFFER_BINDING);return i.bindFramebuffer(i.FRAMEBUFFER,this._framebuffer),i.readPixels(A,e,t,r,i.RGBA,i.UNSIGNED_BYTE,s),i.bindFramebuffer(i.FRAMEBUFFER,o),s}}get framebuffer(){return this._framebuffer}get texture(){return this._texture}get width(){return this._width}get height(){return this._height}get pixels(){return this._pixels}}class ${constructor(A,e,t){n(this,"gl");n(this,"x");n(this,"y");this.gl=A,this.x=e,this.y=t}}class T{constructor(A,e,t,r,i){n(this,"gl");n(this,"vertexBuffer");n(this,"vertexCount",6);n(this,"bytesPerVertex");this.gl=A,this.bytesPerVertex=16;const s=A.getParameter(A.VIEWPORT),o=s[2],g=s[3],B=A.getParameter(A.FRAMEBUFFER_BINDING)!==null,E=e/o*2-1,Q=(e+r)/o*2-1;let l,c;B?(l=t/g*2-1,c=(t+i)/g*2-1):(l=1-t/g*2,c=1-(t+i)/g*2);let d,u,P,I;d=E,P=Q,u=l,I=c;const m=this.generateVertices(d,u,P,I);this.vertexBuffer=A.createBuffer(),A.bindBuffer(A.ARRAY_BUFFER,this.vertexBuffer),A.bufferData(A.ARRAY_BUFFER,m,A.STATIC_DRAW)}generateVertices(A,e,t,r){return new Float32Array([A,r,0,1,t,r,1,1,A,e,0,0,A,e,0,0,t,r,1,1,t,e,1,0])}render(){this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.vertexBuffer);const A=this.gl.getParameter(this.gl.CURRENT_PROGRAM);let e=this.gl.getAttribLocation(A,"a_position"),t=this.gl.getAttribLocation(A,"a_texCoord");this.gl.enableVertexAttribArray(e),this.gl.vertexAttribPointer(e,2,this.gl.FLOAT,!1,this.bytesPerVertex,0),this.gl.enableVertexAttribArray(t),this.gl.vertexAttribPointer(t,2,this.gl.FLOAT,!1,this.bytesPerVertex,8),this.gl.drawArrays(this.gl.TRIANGLES,0,this.vertexCount),this.gl.disableVertexAttribArray(e),this.gl.disableVertexAttribArray(t)}}class iA extends ${constructor(e,t,r,i,s){super(e,t,r);n(this,"width");n(this,"height");this.width=i,this.height=s}renderFill(){new T(this.gl,this.x,this.y,this.width,this.height).render()}renderStroke(e){if(e<=0)return;const t=new T(this.gl,this.x,this.y,this.width,e),r=new T(this.gl,this.x+this.width-e,this.y,e,this.height),i=new T(this.gl,this.x,this.y+this.height-e,this.width,e),s=new T(this.gl,this.x,this.y,e,this.height);t.render(),r.render(),i.render(),s.render()}}class sA{constructor(A,e,t,r,i,s){n(this,"gl");n(this,"vertexBuffer");n(this,"vertexCount",6);n(this,"bytesPerVertex");this.gl=A,this.bytesPerVertex=16;const o=A.getParameter(A.VIEWPORT),g=o[2],B=o[3],E=A.getParameter(A.FRAMEBUFFER_BINDING)!==null,Q=r-e,l=i-t,c=Math.sqrt(Q*Q+l*l);if(c===0){const XA=this.generateVertices(0,0,0,0);this.vertexBuffer=A.createBuffer(),A.bindBuffer(A.ARRAY_BUFFER,this.vertexBuffer),A.bufferData(A.ARRAY_BUFFER,XA,A.STATIC_DRAW);return}const d=Q/c,P=-(l/c),I=d,m=s/2,w=e+P*m,G=t+I*m,F=e-P*m,v=t-I*m,H=r+P*m,R=i+I*m,kA=r-P*m,tA=i-I*m,VA=w/g*2-1,OA=F/g*2-1,zA=H/g*2-1,HA=kA/g*2-1;let L,X,N,W;E?(L=G/B*2-1,X=v/B*2-1,N=R/B*2-1,W=tA/B*2-1):(L=1-G/B*2,X=1-v/B*2,N=1-R/B*2,W=1-tA/B*2);const LA=this.generateLineVertices(VA,L,OA,X,zA,N,HA,W);this.vertexBuffer=A.createBuffer(),A.bindBuffer(A.ARRAY_BUFFER,this.vertexBuffer),A.bufferData(A.ARRAY_BUFFER,LA,A.STATIC_DRAW)}generateVertices(A,e,t,r){return new Float32Array([A,r,0,1,t,r,1,1,A,e,0,0,A,e,0,0,t,r,1,1,t,e,1,0])}generateLineVertices(A,e,t,r,i,s,o,g){return new Float32Array([A,e,0,0,t,r,0,1,i,s,1,0,t,r,0,1,o,g,1,1,i,s,1,0])}render(){this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.vertexBuffer);const A=this.gl.getParameter(this.gl.CURRENT_PROGRAM);let e=this.gl.getAttribLocation(A,"a_position"),t=this.gl.getAttribLocation(A,"a_texCoord");this.gl.enableVertexAttribArray(e),this.gl.vertexAttribPointer(e,2,this.gl.FLOAT,!1,this.bytesPerVertex,0),this.gl.enableVertexAttribArray(t),this.gl.vertexAttribPointer(t,2,this.gl.FLOAT,!1,this.bytesPerVertex,8),this.gl.drawArrays(this.gl.TRIANGLES,0,this.vertexCount),this.gl.disableVertexAttribArray(e),this.gl.disableVertexAttribArray(t)}}class oA extends ${constructor(e,t,r,i,s){super(e,t,r);n(this,"x2");n(this,"y2");this.x2=i,this.y2=s}renderFill(){}renderStroke(e){if(e<=0)return;new sA(this.gl,this.x,this.y,this.x2,this.y2,e).render()}}class p{constructor(A,e,t){n(this,"gl");n(this,"program");n(this,"uniformLocations",new Map);n(this,"attributeLocations",new Map);n(this,"textureUnitCounter",0);this.gl=A,this.program=this.createProgram(e,t),this.cacheLocations()}createProgram(A,e){const t=this.createShader(this.gl.VERTEX_SHADER,A),r=this.createShader(this.gl.FRAGMENT_SHADER,e),i=this.gl.createProgram();if(this.gl.attachShader(i,t),this.gl.attachShader(i,r),this.gl.linkProgram(i),!this.gl.getProgramParameter(i,this.gl.LINK_STATUS)){const s=this.gl.getProgramInfoLog(i);throw new Error(`Shader program link error: ${s}`)}return this.gl.deleteShader(t),this.gl.deleteShader(r),i}createShader(A,e){const t=this.gl.createShader(A);if(this.gl.shaderSource(t,e),this.gl.compileShader(t),!this.gl.getShaderParameter(t,this.gl.COMPILE_STATUS)){const r=this.gl.getShaderInfoLog(t);throw this.gl.deleteShader(t),new Error(`Shader compilation error: ${r}`)}return t}cacheLocations(){const A=this.gl.getProgramParameter(this.program,this.gl.ACTIVE_UNIFORMS);for(let t=0;t<A;t++){const r=this.gl.getActiveUniform(this.program,t);if(r){const i=this.gl.getUniformLocation(this.program,r.name);i&&this.uniformLocations.set(r.name,i)}}const e=this.gl.getProgramParameter(this.program,this.gl.ACTIVE_ATTRIBUTES);for(let t=0;t<e;t++){const r=this.gl.getActiveAttrib(this.program,t);if(r){const i=this.gl.getAttribLocation(this.program,r.name);this.attributeLocations.set(r.name,i)}}}use(){this.gl.useProgram(this.program),this.resetTextureUnits()}setUniform(A,e){const t=this.uniformLocations.get(A);if(!t)return;const r=this.getUniformInfo(A);if(typeof e=="number")r&&r.type===this.gl.INT?this.gl.uniform1i(t,Math.floor(e)):this.gl.uniform1f(t,e);else if(typeof e=="boolean")this.gl.uniform1i(t,e?1:0);else if(Array.isArray(e))if(r&&(r.type===this.gl.INT_VEC2||r.type===this.gl.INT_VEC3||r.type===this.gl.INT_VEC4)){const i=e.map(s=>Math.floor(s));switch(i.length){case 2:this.gl.uniform2iv(t,i);break;case 3:this.gl.uniform3iv(t,i);break;case 4:this.gl.uniform4iv(t,i);break;default:console.warn(`Unsupported array length ${i.length} for uniform '${A}'`)}}else switch(e.length){case 2:this.gl.uniform2f(t,e[0],e[1]);break;case 3:this.gl.uniform3f(t,e[0],e[1],e[2]);break;case 4:this.gl.uniform4f(t,e[0],e[1],e[2],e[3]);break;default:console.warn(`Unsupported array length ${e.length} for uniform '${A}'`)}else if(e instanceof WebGLTexture){const i=this.getNextTextureUnit();this.gl.uniform1i(t,i),this.gl.activeTexture(this.gl.TEXTURE0+i),this.gl.bindTexture(this.gl.TEXTURE_2D,e)}else if(e&&typeof e=="object"&&"texture"in e){const i=this.getNextTextureUnit();this.gl.uniform1i(t,i),this.gl.activeTexture(this.gl.TEXTURE0+i),this.gl.bindTexture(this.gl.TEXTURE_2D,e.texture)}else console.warn(`Unsupported uniform type for '${A}':`,typeof e)}getUniformInfo(A){const e=this.gl.getProgramParameter(this.program,this.gl.ACTIVE_UNIFORMS);for(let t=0;t<e;t++){const r=this.gl.getActiveUniform(this.program,t);if(r&&r.name===A)return r}return null}getNextTextureUnit(){return this.textureUnitCounter++}hasUniform(A){return this.uniformLocations.has(A)}hasAttribute(A){return this.attributeLocations.has(A)}get glProgram(){return this.program}resetTextureUnits(){this.textureUnitCounter=0}}var _="attribute vec2 a_position;attribute vec2 a_texCoord;varying vec2 v_uv;uniform float u_rotation;uniform vec2 u_center;uniform float u_aspectRatio;mat2 rotate2D(float angle){float s=sin(angle);float c=cos(angle);return mat2(c,-s,s,c);}void main(){v_uv=a_texCoord;vec2 pos=a_position;pos-=u_center;pos.x*=u_aspectRatio;pos=rotate2D(-u_rotation)*pos;pos.x/=u_aspectRatio;pos+=u_center;gl_Position=vec4(pos,0.0,1.0);}",nA="precision lowp float;uniform sampler2D u_texture;varying vec2 v_uv;void main(){gl_FragColor=texture2D(u_texture,v_uv);}",aA="precision lowp float;uniform vec4 u_color;void main(){gl_FragColor=u_color;}";class gA{constructor(A){n(this,"gl");n(this,"imageShader");n(this,"solidColorShader");n(this,"currentShader",null);n(this,"currentFillColor",[1,1,1,1]);n(this,"fillMode",!0);n(this,"currentStrokeColor",[0,0,0,1]);n(this,"currentStrokeWeight",1);n(this,"strokeMode",!0);n(this,"currentRotation",0);n(this,"stateStack",[]);this.gl=A,this.imageShader=new p(this.gl,_,nA),this.solidColorShader=new p(this.gl,_,aA),this.gl.enable(this.gl.BLEND),this.gl.blendEquation(this.gl.FUNC_ADD),this.gl.blendFunc(this.gl.ONE,this.gl.ONE_MINUS_SRC_ALPHA)}shader(A){this.currentShader=A,A.use()}fill(A,e,t,r){if(this.fillMode=!0,e===void 0&&t===void 0&&r===void 0){const i=A/255;this.currentFillColor=[i,i,i,1]}else if(t!==void 0&&r===void 0)this.currentFillColor=[A/255,e/255,t/255,1];else if(t!==void 0&&r!==void 0)this.currentFillColor=[A/255,e/255,t/255,r/255];else throw new Error("Invalid fill parameters. Use fill(gray), fill(r,g,b), or fill(r,g,b,a)")}stroke(A,e,t,r){if(this.strokeMode=!0,e===void 0&&t===void 0&&r===void 0){const i=A/255;this.currentStrokeColor=[i,i,i,1]}else if(t!==void 0&&r===void 0)this.currentStrokeColor=[A/255,e/255,t/255,1];else if(t!==void 0&&r!==void 0)this.currentStrokeColor=[A/255,e/255,t/255,r/255];else throw new Error("Invalid stroke parameters. Use stroke(gray), stroke(r,g,b), or stroke(r,g,b,a)")}strokeWeight(A){if(A<0)throw new Error("Stroke weight must be non-negative");this.currentStrokeWeight=A}noStroke(){this.strokeMode=!1}noFill(){this.fillMode=!1}rotate(A){this.currentRotation=A}push(){this.stateStack.push({fillColor:[...this.currentFillColor],fillMode:this.fillMode,strokeColor:[...this.currentStrokeColor],strokeWeight:this.currentStrokeWeight,strokeMode:this.strokeMode,rotation:this.currentRotation})}pop(){const A=this.stateStack.pop();A?(this.currentFillColor=A.fillColor,this.fillMode=A.fillMode,this.currentStrokeColor=A.strokeColor,this.currentStrokeWeight=A.strokeWeight,this.strokeMode=A.strokeMode,this.currentRotation=A.rotation):console.warn("pop() called without matching push()")}reset(){this.currentShader=null,this.stateStack=[],this.currentRotation=0,this.fillMode=!0,this.strokeMode=!0,this.currentFillColor=[1,1,1,1],this.currentStrokeColor=[0,0,0,1],this.currentStrokeWeight=1}createShader(A,e){return new p(this.gl,A,e)}setUniform(A,e){this.currentShader.setUniform(A,e)}rect(A,e,t,r){const i=new iA(this.gl,A,e,t,r);if(this.currentShader!==null){if(this.currentRotation!==0){const{centerX:Q,centerY:l,radians:c,aspectRatio:d}=this.calculateRotationParams(A,e,t,r);this.setUniform("u_rotation",c),this.setUniform("u_center",[Q,l]),this.setUniform("u_aspectRatio",d)}else this.setUniform("u_rotation",0),this.setUniform("u_center",[0,0]),this.setUniform("u_aspectRatio",1);i.renderFill(),this.currentShader=null;return}const s=this.solidColorShader,{centerX:o,centerY:g,radians:B,aspectRatio:E}=this.calculateRotationParams(A,e,t,r);this.fillMode&&(this.shader(s),this.setUniform("u_color",this.currentFillColor),this.setUniform("u_rotation",B),this.setUniform("u_center",[o,g]),this.setUniform("u_aspectRatio",E),i.renderFill()),this.strokeMode&&(this.shader(s),this.setUniform("u_color",this.currentStrokeColor),this.setUniform("u_rotation",B),this.setUniform("u_center",[o,g]),this.setUniform("u_aspectRatio",E),i.renderStroke(this.currentStrokeWeight)),this.currentShader=null}line(A,e,t,r){if(!this.strokeMode)return;const i=new oA(this.gl,A,e,t,r);if(this.currentShader!==null){if(this.currentRotation!==0){const u=(A+t)/2,P=(e+r)/2,I=Math.abs(t-A),m=Math.abs(r-e),{centerX:w,centerY:G,radians:F,aspectRatio:v}=this.calculateRotationParams(u-I/2,P-m/2,I,m);this.setUniform("u_rotation",F),this.setUniform("u_center",[w,G]),this.setUniform("u_aspectRatio",v)}else this.setUniform("u_rotation",0),this.setUniform("u_center",[0,0]),this.setUniform("u_aspectRatio",1);i.renderStroke(this.currentStrokeWeight),this.currentShader=null;return}const s=this.solidColorShader,o=(A+t)/2,g=(e+r)/2,B=Math.abs(t-A),E=Math.abs(r-e),{centerX:Q,centerY:l,radians:c,aspectRatio:d}=this.calculateRotationParams(o-B/2,g-E/2,B,E);this.shader(s),this.setUniform("u_color",this.currentStrokeColor),this.setUniform("u_rotation",c),this.setUniform("u_center",[Q,l]),this.setUniform("u_aspectRatio",d),i.renderStroke(this.currentStrokeWeight),this.currentShader=null}calculateRotationParams(A,e,t,r){const i=this.gl.getParameter(this.gl.VIEWPORT),s=i[2],o=i[3],g=s/o,B=this.gl.getParameter(this.gl.FRAMEBUFFER_BINDING)!==null,E=A+t/2,Q=e+r/2,l=E/s*2-1;let c;B?c=Q/o*2-1:c=1-Q/o*2;const d=this.currentRotation*Math.PI/180;return{centerX:l,centerY:c,radians:d,aspectRatio:g}}createFramebuffer(A,e,t={}){return new rA(this.gl,A,e,t)}background(A,e=A,t=A,r=255){this.clear(A/255,e/255,t/255,r/255)}clear(A=0,e=0,t=0,r=0){this.gl.clearColor(A,e,t,r),this.gl.clear(this.gl.COLOR_BUFFER_BIT)}resetViewport(){this.gl.viewport(0,0,this.gl.canvas.width,this.gl.canvas.height)}get context(){return this.gl}image(A,e,t,r,i){this.shader(this.imageShader),this.setUniform("u_texture",A.texture);const{centerX:s,centerY:o,radians:g,aspectRatio:B}=this.calculateRotationParams(e,t,r??A.width,i??A.height);this.setUniform("u_rotation",g),this.setUniform("u_center",[s,o]),this.setUniform("u_aspectRatio",B),this.rect(e,t,r??A.width,i??A.height)}}var h={};h.parse=function(a){var A=function(i,s,o,g){var B=h.T,E={cmap:B.cmap,head:B.head,hhea:B.hhea,maxp:B.maxp,hmtx:B.hmtx,loca:B.loca,glyf:B.glyf},Q={_data:i,_index:s,_offset:o};for(var l in E){var c=h.findTable(i,l,o);if(c){var d=c[0],u=g[d];u==null&&(u=E[l].parseTab(i,d,c[1],Q)),Q[l]=g[d]=u}}return Q},e=new Uint8Array(a),t={},r=A(e,0,0,t);return[r]},h.findTable=function(a,A,e){for(var t=h.B,r=t.readUshort(a,e+4),i=e+12,s=0;s<r;s++){var o=t.readASCII(a,i,4);t.readUint(a,i+4);var g=t.readUint(a,i+8),B=t.readUint(a,i+12);if(o==A)return[g,B];i+=16}return null},h.T={},h.B={readShort:function(a,A){var e=h.B.t.uint16;return e[0]=a[A]<<8|a[A+1],h.B.t.int16[0]},readUshort:function(a,A){return a[A]<<8|a[A+1]},readUshorts:function(a,A,e){for(var t=[],r=0;r<e;r++)t.push(h.B.readUshort(a,A+r*2));return t},readUint:function(a,A){var e=h.B.t.uint8;return e[3]=a[A],e[2]=a[A+1],e[1]=a[A+2],e[0]=a[A+3],h.B.t.uint32[0]},readASCII:function(a,A,e){for(var t="",r=0;r<e;r++)t+=String.fromCharCode(a[A+r]);return t},t:function(){var a=new ArrayBuffer(8);return{uint8:new Uint8Array(a),int16:new Int16Array(a),uint16:new Uint16Array(a),uint32:new Uint32Array(a)}}()},h.T.cmap={parseTab:function(a,A,e){var t={tables:[],ids:{},off:A};a=new Uint8Array(a.buffer,A,e),A=0;var r=h.B,i=r.readUshort,s=h.T.cmap;i(a,A),A+=2;var o=i(a,A);A+=2;for(var g=[],B=0;B<o;B++){var E=i(a,A);A+=2;var Q=i(a,A);A+=2;var l=r.readUint(a,A);A+=4;var c="p"+E+"e"+Q,d=g.indexOf(l);if(d==-1){d=t.tables.length;var u={};g.push(l);var P=u.format=i(a,l);P==4?u=s.parse4(a,l,u):P==12&&(u=s.parse12(a,l,u)),t.tables.push(u)}t.ids[c]!=null&&console.log("multiple tables for one platform+encoding: "+c),t.ids[c]=d}return t},parse4:function(a,A,e){var t=h.B,r=t.readUshort,i=t.readUshorts,s=A;A+=2;var o=r(a,A);A+=2,r(a,A),A+=2;var g=r(a,A);A+=2;var B=g>>>1;e.searchRange=r(a,A),A+=2,e.entrySelector=r(a,A),A+=2,e.rangeShift=r(a,A),A+=2,e.endCount=i(a,A,B),A+=B*2,A+=2,e.startCount=i(a,A,B),A+=B*2,e.idDelta=[];for(var E=0;E<B;E++)e.idDelta.push(t.readShort(a,A)),A+=2;return e.idRangeOffset=i(a,A,B),A+=B*2,e.glyphIdArray=i(a,A,s+o-A>>1),e},parse12:function(a,A,e){var t=h.B,r=t.readUint;A+=4,r(a,A),A+=4,r(a,A),A+=4;var i=r(a,A)*3;A+=4;for(var s=e.groups=new Uint32Array(i),o=0;o<i;o+=3)s[o]=r(a,A+(o<<2)),s[o+1]=r(a,A+(o<<2)+4),s[o+2]=r(a,A+(o<<2)+8);return e}},h.T.head={parseTab:function(a,A,e){var t=h.B,r={};return A+=18,r.unitsPerEm=t.readUshort(a,A),A+=2,A+=16,r.xMin=t.readShort(a,A),A+=2,r.yMin=t.readShort(a,A),A+=2,r.xMax=t.readShort(a,A),A+=2,r.yMax=t.readShort(a,A),A+=2,A+=6,r.indexToLocFormat=t.readShort(a,A),r}},h.T.hhea={parseTab:function(a,A,e){var t=h.B,r={};A+=4;for(var i=["ascender","descender","lineGap","advanceWidthMax","minLeftSideBearing","minRightSideBearing","xMaxExtent","caretSlopeRise","caretSlopeRun","caretOffset","res0","res1","res2","res3","metricDataFormat","numberOfHMetrics"],s=0;s<i.length;s++){var o=i[s],g=o=="advanceWidthMax"||o=="numberOfHMetrics"?t.readUshort:t.readShort;r[o]=g(a,A+s*2)}return r}},h.T.hmtx={parseTab:function(a,A,e,t){for(var r=h.B,i=[],s=[],o=t.maxp.numGlyphs,g=t.hhea.numberOfHMetrics,B=0,E=0,Q=0;Q<g;)B=r.readUshort(a,A+(Q<<2)),E=r.readShort(a,A+(Q<<2)+2),i.push(B),s.push(E),Q++;for(;Q<o;)i.push(B),s.push(E),Q++;return{aWidth:i,lsBearing:s}}},h.T.maxp={parseTab:function(a,A,e){var t=h.B,r=t.readUshort,i={};return t.readUint(a,A),A+=4,i.numGlyphs=r(a,A),A+=2,i}},h.T.loca={parseTab:function(a,A,e,t){var r=h.B,i=[],s=t.head.indexToLocFormat,o=t.maxp.numGlyphs+1;if(s==0)for(var g=0;g<o;g++)i.push(r.readUshort(a,A+(g<<1))<<1);if(s==1)for(var g=0;g<o;g++)i.push(r.readUint(a,A+(g<<2)));return i}},h.T.glyf={parseTab:function(a,A,e,t){for(var r=[],i=t.maxp.numGlyphs,s=0;s<i;s++)r.push(null);return r},_parseGlyf:function(a,A){var e=h.B,t=a._data,r=a.loca;if(r[A]==r[A+1])return null;var i=h.findTable(t,"glyf",a._offset)[0]+r[A],s={};if(s.noc=e.readShort(t,i),i+=2,s.xMin=e.readShort(t,i),i+=2,s.yMin=e.readShort(t,i),i+=2,s.xMax=e.readShort(t,i),i+=2,s.yMax=e.readShort(t,i),i+=2,s.xMin>=s.xMax||s.yMin>=s.yMax)return null;if(s.noc>0){s.endPts=[];for(var o=0;o<s.noc;o++)s.endPts.push(e.readUshort(t,i)),i+=2;var g=e.readUshort(t,i);if(i+=2,t.length-i<g)return null;i+=g;var B=s.endPts[s.noc-1]+1;s.flags=[];for(var o=0;o<B;o++){var E=t[i];if(i++,s.flags.push(E),E&8){var Q=t[i];i++;for(var l=0;l<Q;l++)s.flags.push(E),o++}}s.xs=[];for(var o=0;o<B;o++){var c=(s.flags[o]&2)!=0,d=(s.flags[o]&16)!=0;c?(s.xs.push(d?t[i]:-t[i]),i++):d?s.xs.push(0):(s.xs.push(e.readShort(t,i)),i+=2)}s.ys=[];for(var o=0;o<B;o++){var c=(s.flags[o]&4)!=0,d=(s.flags[o]&32)!=0;c?(s.ys.push(d?t[i]:-t[i]),i++):d?s.ys.push(0):(s.ys.push(e.readShort(t,i)),i+=2)}for(var u=0,P=0,o=0;o<B;o++)u+=s.xs[o],P+=s.ys[o],s.xs[o]=u,s.ys[o]=P}else s.parts=[];return s}},typeof module<"u"&&module.exports?module.exports=h:typeof window<"u"&&(window.Typr=h);const BA=`data:font/truetype;charset=utf-8;base64,AAEAAAAKAIAAAwAgT1MvMs+QEyQAAAEoAAAAYGNtYXAg7yVJAAAFjAAACSBnbHlmuHLTdAAAErQAAGi0aGVhZFvXdUwAAACsAAAANmhoZWELAQUCAAAA5AAAACRobXR4BACDgAAAAYgAAAQEbG9jYQAy54AAAA6sAAAECG1heHABIgCCAAABCAAAACBuYW1lVs/OSgAAe2gAAAOicG9zdABpADQAAH8MAAAAIAABAAAAAQAAzOWHqV8PPPUAAAQAAAAAAHxiGCcAAAAAfGIYJwAAAAAEAAQAAAAACAACAAEAAAAAAAEAAAQAAAAAAAQAAAAAAAcAAAEAAAAAAAAAAAAAAAAAAAEBAAEAAAEBAIAAIAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgQAAZAABQAEAgACAAAAAAACAAIAAAACAAAzAMwAAAAABAAAAAAAAACAAACLAABw4wAAAAAAAAAAWUFMLgBAACAmawQAAAAAAAQAAAAAAAFRAAAAAAMABAAAAAAgAAAEAAAABAAAAAQAAAAEAAGABAABAAQAAIAEAACABAAAgAQAAIAEAAGABAABAAQAAQAEAACABAABAAQAAIAEAACABAABAAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAABAAQAAIAEAAEABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAABAAQAAIAEAAEABAAAgAQAAIAEAAEABAAAgAQAAIAEAACABAAAgAQAAIAEAAEABAAAgAQAAIAEAAGABAAAgAQAAIAEAAGABAAAgAQAAIAEAACABAAAgAQAAIAEAAEABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAABgAQAAQAEAACABAAAAAQAAgAEAACABAAAgAQAAIAEAACABAACAAQAAAAEAAIABAABgAQAAgAEAACABAAAgAQAAAAEAACABAAAAAQAAAAEAAAABAAAAAQAAAAEAAIABAADAAQAAAAEAAAABAAAgAQAAYAEAAAABAAAAAQAAIAEAAAABAAAgAQAAIAEAACABAAAAAQAAIAEAAAABAAAAAQAAIAEAAGABAAAAAQAAAAEAAAABAAAAAQAAIAEAACABAAAAAQAAIAEAACABAAAAAQAAIAEAACABAAAgAQAAAAEAACABAAAAAQAAAAEAAEABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAACAAQAAIAEAAAABAAAAAQAAAAEAACABAABAAQAAQAEAAEABAABAAQAAIAEAACABAAAAAQAAAAEAAAABAABAAQAAAAEAACABAAAAAQAAAAEAAIABAAAgAQAAAAEAAAABAAAAAQAAAAEAAAABAABgAQAAAAEAAAABAABgAQAAAAEAAGABAABgAQAAYAEAAAABAAAAAQAAAAEAAAABAABgAQAAYAEAAAABAAAAAQAAAAEAAAABAABgAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAABgAQAAAAEAAGABAABgAQAAAAEAAAABAABgAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAYAEAAAABAAAAAQAAQAEAACABAAAAAQAAAAEAAAABAAAgAQAAIAEAACABAAAgAQAAIAEAAAABAABAAQAAIAEAACABAAAgAQAAIAEAAEABAAAgAQAAIAEAACABAAAgAQAAIAEAAEABAAAgAAAAAIAAAADAAAAFAADAAEAAASaAAQEhgAAAJ4AgAAGAB4AfgCjAKUApwCsALIAtwC9AL8AxwDJANEA1gDcAOIA7wD0APcA/AD/AZIDkwOYA6MDpgOpA7EDtQPAA8QDxiAiIDwgfyCnIZUhqCIaIh8iKSJIImEiZSMCIxAjISUAJQIlDCUQJRQlGCUcJSQlLCU0JTwlbCWAJYQliCWMJZMloSWsJbIluiW8JcQlyyXZJjwmQCZCJmAmYyZmJmv//wAAACAAoQClAKcAqgCwALUAugC/AMQAyQDRANYA3ADfAOQA8QD2APkA/wGSA5MDmAOjA6YDqQOxA7QDwAPDA8YgIiA8IH8gpyGQIagiGSIeIikiSCJhImQjAiMQIyAlACUCJQwlECUUJRglHCUkJSwlNCU8JVAlgCWEJYgljCWQJaAlrCWyJbolvCXEJcsl2CY6JkAmQiZgJmMmZSZq////4v/A/7//vv+8/7n/t/+1/7T/sP+v/6j/pP+f/53/nP+b/5r/mf+X/wX9Bf0B/Pf89fzz/Oz86vzg/N783eCC4GngJ+AA3xjfBt6W3pPeit5s3lTeUt223andmtu827vbstuv26zbqdum25/bmNuR24rbd9tk22HbXttb21jbTNtC2z3bNts12y7bKNsc2rzaudq42pvamdqY2pUAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEhgAAAJ4AgAAGAB4AfgCjAKUApwCsALIAtwC9AL8AxwDJANEA1gDcAOIA7wD0APcA/AD/AZIDkwOYA6MDpgOpA7EDtQPAA8QDxiAiIDwgfyCnIZUhqCIaIh8iKSJIImEiZSMCIxAjISUAJQIlDCUQJRQlGCUcJSQlLCU0JTwlbCWAJYQliCWMJZMloSWsJbIluiW8JcQlyyXZJjwmQCZCJmAmYyZmJmv//wAAACAAoQClAKcAqgCwALUAugC/AMQAyQDRANYA3ADfAOQA8QD2APkA/wGSA5MDmAOjA6YDqQOxA7QDwAPDA8YgIiA8IH8gpyGQIagiGSIeIikiSCJhImQjAiMQIyAlACUCJQwlECUUJRglHCUkJSwlNCU8JVAlgCWEJYgljCWQJaAlrCWyJbolvCXEJcsl2CY6JkAmQiZgJmMmZSZq////4v/A/7//vv+8/7n/t/+1/7T/sP+v/6j/pP+f/53/nP+b/5r/mf+X/wX9Bf0B/Pf89fzz/Oz86vzg/N783eCC4GngJ+AA3xjfBt6W3pPeit5s3lTeUt223andmtu827vbstuv26zbqdum25/bmNuR24rbd9tk22HbXttb21jbTNtC2z3bNts12y7bKNsc2rzaudq42pvamdqY2pUAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAABwAAABIAAAAegAAALwAAADuAAAA9wAAARQAAAExAAABWgAAAW0AAAF7AAABhAAAAY0AAAGvAAAB0gAAAecAAAIOAAACNQAAAk8AAAJsAAACjgAAAqYAAALOAAAC5gAAAvQAAAMHAAADLgAAAzwAAANjAAADhQAAA6UAAAPCAAAD4AAAA/0AAAQaAAAEPAAABEwAAARrAAAEfgAABJEAAASpAAAE0AAABNsAAAT4AAAFFQAABS0AAAVDAAAFZQAABYcAAAWuAAAFvAAABc8AAAXnAAAGBAAABisAAAZDAAAGZQAABnMAAAaVAAAGowAABsUAAAbOAAAG3gAABvYAAAcMAAAHKQAABz8AAAdaAAAHbQAAB4oAAAedAAAHqwAAB8MAAAfgAAAH7gAACAsAAAgjAAAIOwAACFEAAAhsAAAIfAAACJkAAAi2AAAIzgAACOYAAAkDAAAJKgAACUIAAAlfAAAJfAAACYUAAAmiAAAJugAACdcAAAngAAAKBwAACi4AAApgAAAKeQAACokAAAq4AAAKwQAACs8AAArYAAAK8QAACw4AAAshAAALSAAAC1gAAAt1AAALjQAAC5sAAAu0AAALzQAAC9YAAAvhAAAL6gAAC/4AAAwRAAAMJAAADDQAAAxHAAAMUgAADGoAAAyCAAAMlwAADKUAAAy/AAAM0gAADN0AAAz8AAANDwAADSkAAA0yAAANTAAADVUAAA1jAAANfAAADYcAAA2VAAANqQAADcIAAA3mAAAN7wAADg4AAA4XAAAOQQAADloAAA5qAAAOcwAADoYAAA6PAAAOogAADrIAAA7FAAAPCwAADxsAAA8uAAAPRwAAD1AAAA+HAAAPoAAAD6kAAA/CAAAP3wAAD/wAABAZAAAQNgAAEE4AABBfAAAQlQAAEJ4AABCxAAAQugAAEOEAABEnAAARUwAAEWYAABF+AAARlgAAEbgAABJrAAASfgAAEpEAABKpAAASwQAAEswAABLcAAATCAAAExMAABMrAAATQwAAE1sAABNzAAATmgAAE8YAABPeAAAT5wAAE/AAABQSAAAUKgAAFEIAABRaAAAUYwAAFGwAABSOAAAUngAAFLsAABTYAAAU/wAAFSEAABVNAAAVZQAAFX0AABWVAAAVngAAFacAABXTAAAWBAAAFg0AABYvAAAWOgAAFkUAABZxAAAWhAAAFpIAABagAAAWrgAAFrwAABbVAAAW7QAAFxkAABd0AAAXzwAAF/wAABgUAAAYJQAAGC4AABhBAAAYXgAAGHEAABiYAAAYvAAAGOAAABkYAAAZPwAAGWYAABmNAAAZtAAAGdYAABn9AAAaEAAAGi0AAIBgACAAoAEAAADAAcAAAEBAQEBAQEBAYABAAAA/wAAAAEAAAD/AAQAAAD+AAAA/4AAAP8AAAAAAgEAAoADgAQAAAMABwAAAQEBAQEBAQEBAAEAAAD/AAGAAQAAAP8ABAAAAP6AAAABgAAA/oAAAAACAIAAgAQAA4AAGwAfAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQAAAACAAAABAAAAAIAAAP+AAAAAgAAA/4AAAP8AAAD/gAAA/wAAAP+AAAAAgAAA/4AAAACAAQAAAACAAAADgAAA/4AAAACAAAD/gAAA/4AAAP8AAAD/gAAA/4AAAACAAAD/gAAAAIAAAACAAAABAAAAAIAAAP+A/wAAAAEAAAMAgACABAAEAAAbAB8AIwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgAAgAAAAQAAAP8AAAABAAAAAIAAAP+AAAD/AAAA/4AAAP8AAAABAAAA/wAAAP+AAAAAgAAAAQD/gAAAAIAAAACAAAAAgAAABAAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAD/gP+AAAAAgP8A/4AAAACAAAAABQCAAIAEAAOAAAUAHQAjACkALwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAAA/4AAAP+AAgABAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACA/YAAgAAAAIAAAP8AAoABAAAA/4AAAP+A/4AAgAAAAIAAAP8AA4AAAP8AAAAAgAAAAIAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAP+AAAD/gAAAAAAAAP8AAAAAgAAAAAAAAP+AAAD/gAAAAAAAAwCAAIAEAAQAABcAHQAjAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/4AAAACAAAAAgAAA/4AAAACAAAD9AAAA/4AAAACAAAD/gAAAAIAAgAAAAIAAAACAAAD/AAAAAQAAAP+AAAAEAAAA/4AAAP8AAAD/gAAAAIAAAP8AAAD/gAAA/4AAAACAAAABAAAAAIAAAAEAAAAAAP+AAAD/gAAAAQD+gP8AAAAAgAAAAIAAAAABAYACgAKABAAAAwAAAQEBAQGAAQAAAP8ABAAAAP6AAAAAAAABAQAAgAMABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQECAAEAAAD/gAAA/4AAAACAAAAAgAAA/wAAAP+AAAD/gAAAAIAAAACABAAAAP+AAAD/gAAA/oAAAP+AAAD/gAAAAIAAAACAAAABgAAAAIAAAAAAAAEBAACAAwAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQAAAACAAAAAgAAA/4AAAP+AAAD/AAAAAIAAAACAAAD/gAAA/4AEAAAA/4AAAP+AAAD+gAAA/4AAAP+AAAAAgAAAAIAAAAGAAAAAgAAAAAAABQCAAYADgAQAAAMABwATABcAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAIAAAP+AAYAAgAAA/4D/AAEAAAABAAAA/wAAAP8AAAD/AAAAAQD/gACAAAD/gAGAAIAAAP+ABAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAAAIAAAP+AAAAAAAABAQAAgAOAAwAACwAAAQEBAQEBAQEBAQEBAgAAgAAAAQAAAP8AAAD/gAAA/wAAAAEAAwAAAP8AAAD/gAAA/wAAAAEAAAAAgAAAAAAAAQCAAAACAAGAAAcAAAEBAQEBAQEBAQABAAAA/4AAAP8AAAAAgAGAAAD/AAAA/4AAAACAAAAAAAABAIABgAOAAgAAAwAAAQEBAQCAAwAAAP0AAgAAAP+AAAAAAAABAQAAgAIAAYAAAwAAAQEBAQEAAQAAAP8AAYAAAP8AAAAAAAABAIAAgAQAA4AAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAwABAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAA4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAwCAAIADgAQAAAsAEQAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/4AAAP4AAAD/gAAAAIAAgAAAAIAAAACAAAD/gAAA/4AAAAEAAAAEAAAA/4AAAP2AAAD/gAAAAIAAAAKAAAAAAP8AAAAAgAAAAID/AP+AAAD/AAAAAYAAAAABAIAAgAOABAAADQAAAQEBAQEBAQEBAQEBAQEBgAEAAAABAAAA/QAAAAEAAAD/AAAAAIAAAACABAAAAP0AAAD/gAAAAIAAAAGAAAAAgAAAAIAAAAABAIAAgAOABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAA/4AAAP+AAAABgAAA/QAAAACAAAAAgAAAAIAAAACAAAD/AAAA/wAAAACABAAAAP+AAAD/AAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAABAAAA/wAAAAEAAAAAAAABAIAAgAOABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAAAIAAAP+AAAD+AAAA/4AAAAEAAAABAAAA/wAAAAEAAAD/AAAA/wAAAACABAAAAP+AAAD/AAAA/4AAAP8AAAD/gAAAAIAAAACAAAD/gAAAAQAAAACAAAABAAAA/4AAAACAAAAAAAABAIAAgAOABAAAEQAAAQEBAQEBAQEBAQEBAQEBAQEBAYABAAAA/4AAAP+AAAABAAAAAQAAAP8AAAD+AAAAAIAAAACABAAAAP+AAAD/gAAA/wAAAAEAAAD9gAAAAQAAAAGAAAAAgAAAAAEAgACAA4AEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAwAAAP4AAAABgAAAAIAAAP+AAAD+AAAA/4AAAAEAAAABAAAA/gAEAAAA/4AAAP8AAAD/gAAA/wAAAP+AAAAAgAAAAIAAAP+AAAABAAAAAAAAAgCAAIADgAQAABMAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP8AAAD/AAAAAYAAAACAAAD/gAAA/gAAAP+AAAAAgACAAAABAAAABAAAAP+AAAD/gAAAAIAAAP8AAAD/gAAA/wAAAP+AAAAAgAAAAoAAAP6A/wAAAAEAAAEAgACAA4AEAAAPAAABAQEBAQEBAQEBAQEBAQEBAIADAAAA/4AAAP+AAAD/AAAAAIAAAACAAAD+gAAA/4AEAAAA/oAAAP+AAAD+gAAAAYAAAACAAAABAAAA/4AAAAAAAAMAgACAA4AEAAATABcAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAAAIAAAP+AAAD+AAAA/4AAAACAAAD/gAAAAIAAgAAAAQAAAP8AAAABAAAABAAAAP+AAAD/AAAA/4AAAP8AAAD/gAAAAIAAAAEAAAAAgAAAAQAAAAAA/wAAAAEA/oD/AAAAAQAAAAACAIAAgAOABAAACwAPAAABAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP8AAAD+gAAA/4AAAACAAIAAAAEAAAAEAAAA/4AAAP0AAAABAAAAAIAAAAGAAAAAAP6AAAABgAACAQABAAIAA4AAAwAHAAABAQEBAQEBAQEAAQAAAP8AAAABAAAA/wADgAAA/wAAAP+AAAD/AAAAAAIAgACAAgADgAADAAsAAAEBAQEBAQEBAQEBAQEAAQAAAP8AAAABAAAA/4AAAP8AAAAAgAOAAAD/AAAA/4AAAP8AAAD/gAAAAIAAAAABAQAAgAOABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQKAAQAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACABAAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAAAACAIABgAOAAwAAAwAHAAABAQEBAQEBAQCAAwAAAP0AAAADAAAA/QADAAAA/4AAAP+AAAD/gAAAAAEAgACAAwAEAAAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIABAAAAAIAAAACAAAAAgAAA/4AAAP+AAAD/gAAA/wAAAACAAAAAgAAAAIAAAP+AAAD/gAAA/4AEAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAAAAAAIAgACAA4AEAAATABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAA/4AAAP8AAAAAgAAAAIAAAP8AAAD/AAAAAIAAgAEAAAD/AAQAAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAA/4AAAACAAAD+AAAA/wAAAAACAIAAgAOABAAAEQAVAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP6AAAAAgAAA/wAAAAGAAAD+AAAA/4AAAACAAgAAgAAA/4AEAAAA/4AAAP6AAAABAAAAAIAAAP2AAAD/gAAAAIAAAAKAAAD+AAAA/4AAAAAAAAIAgACAA4AEAAAPABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAYABAAAAAIAAAACAAAD/AAAA/wAAAP8AAAAAgAAAAIAAAAAAAQAAAAQAAAD/gAAA/4AAAP2AAAABAAAA/wAAAAKAAAAAgAAA/4D/AAAAAQAAAwCAAIADgAQAAAsADwATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAoAAAACAAAD/gAAAAIAAAP+AAAD9gAEAAAABAAAA/wAAAAEAAAAEAAAA/4AAAP8AAAD/gAAA/wAAAP+AAAADAP8AAAABAP6A/wAAAAEAAAAAAQCAAIADgAQAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP8AAAD/AAAAAQAAAAEAAAD/gAAA/gAAAP+AAAAAgAQAAAD/gAAA/4AAAACAAAD9gAAAAIAAAP+AAAD/gAAAAIAAAAKAAAAAAAACAIAAgAOABAAACwATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAgAAAACAAAAAgAAA/4AAAP+AAAD+AAEAAAAAgAAAAIAAAP+AAAAEAAAA/4AAAP+AAAD+gAAA/4AAAP+AAAADAP2AAAAAgAAAAYAAAACAAAEAgACAA4AEAAAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP8AAAABAAAA/wAAAAEAAAABAAAA/4AAAP4AAAD/gAAAAIAEAAAA/4AAAP+AAAAAgAAA/wAAAP+AAAD/AAAAAIAAAP+AAAD/gAAAAIAAAAKAAAAAAAABAIAAgAOABAAACQAAAQEBAQEBAQEBAQCAAwAAAP4AAAABAAAA/wAAAP8ABAAAAP+AAAD/AAAA/4AAAP6AAAAAAQCAAIADgAQAABUAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP8AAAABAAAA/4AAAAGAAAD/gAAA/gAAAP+AAAAAgAQAAAD/gAAA/4AAAACAAAD9gAAAAQAAAACAAAD+gAAA/4AAAACAAAACgAAAAAEAgACAA4AEAAALAAABAQEBAQEBAQEBAQEAgAEAAAABAAAAAQAAAP8AAAD/AAAA/wAEAAAA/gAAAAIAAAD8gAAAAQAAAP8AAAAAAAABAIAAgAOABAAACwAAAQEBAQEBAQEBAQEBAIADAAAA/wAAAAEAAAD9AAAAAQAAAP8ABAAAAP+AAAD9gAAA/4AAAACAAAACgAAAAAAAAQCAAIAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEBAAMAAAD/gAAA/4AAAP4AAAD/gAAAAQAAAAEAAAD+gAQAAAD/gAAA/YAAAP+AAAAAgAAAAQAAAP8AAAACgAAAAAAAAQCAAIADgAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAAAgAAAAIAAAAEAAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/AAQAAAD/AAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAD/AAAAAAAAAQCAAIADgAQAAAUAAAEBAQEBAQCAAQAAAAIAAAD9AAQAAAD9AAAA/4AAAAABAIAAgAQABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAAAgAAAAIAAAACAAAABAAAA/wAAAP+AAAD/gAAA/4AAAP8ABAAAAP+AAAD/gAAAAIAAAACAAAD8gAAAAgAAAP+AAAAAgAAA/gAAAAAAAAEAgACABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAQAAAACAAAAAgAAAAIAAAAEAAAD/AAAA/4AAAP+AAAD/gAAA/wAEAAAA/4AAAP+AAAD/gAAAAYAAAPyAAAABAAAAAIAAAACAAAD+AAAAAAAAAgCAAIADgAQAAAsADwAAAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAA/gAAAP+AAAAAgACAAAABAAAABAAAAP+AAAD9gAAA/4AAAACAAAACgAAAAAD9gAAAAoAAAgCAAIADgAQAAAkADQAAAQEBAQEBAQEBAQEBAQEAgAKAAAAAgAAA/4AAAP6AAAD/AAEAAAABAAAABAAAAP+AAAD+gAAA/4AAAP8AAAADAP6AAAABgAAAAAIAgACABAAEAAAPABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAAAgAAA/4AAAP+AAAD+AAAA/4AAAACAAIAAAAEAAAD/gAAAAIAAAAQAAAD/gAAA/gAAAP8AAAAAgAAA/4AAAACAAAACgAAAAAD9gAAAAIAAAACAAAABgAACAIAAgAOABAAAEwAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAKAAAAAgAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP8AAQAAAAEAAAAEAAAA/4AAAP8AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAD/AAAAAwD/AAAAAQAAAQCAAIADgAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP8AAAABgAAAAIAAAP+AAAD+AAAA/4AAAAEAAAABAAAA/oAAAP+AAAAAgAQAAAD/gAAA/4AAAACAAAD/AAAA/4AAAP8AAAD/gAAAAIAAAACAAAD/gAAAAQAAAACAAAABAAAAAAAAAQCAAIADgAQAAAcAAAEBAQEBAQEBAIADAAAA/wAAAP8AAAD/AAQAAAD/gAAA/QAAAAMAAAAAAAABAIAAgAOABAAACwAAAQEBAQEBAQEBAQEBAIABAAAAAQAAAAEAAAD/gAAA/gAAAP+ABAAAAP0AAAADAAAA/QAAAP+AAAAAgAAAAAAAAQCAAIADgAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEAgAEAAAABAAAAAQAAAP+AAAD/gAAA/wAAAP+AAAD/gAQAAAD+AAAAAgAAAP4AAAD/AAAA/4AAAACAAAABAAAAAAAAAQCAAIAEAAQAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAIABAAAAAIAAAACAAAAAgAAAAQAAAP8AAAD/gAAA/4AAAP+AAAD/AAQAAAD+AAAAAIAAAP+AAAACAAAA/IAAAACAAAAAgAAA/4AAAP+AAAAAAAABAIAAgAOABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCAAQAAAAEAAAABAAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/AAAA/wAAAACAAAAAgAAA/4AAAP+ABAAAAP8AAAABAAAA/wAAAP+AAAD/gAAA/4AAAP8AAAABAAAA/wAAAAEAAAAAgAAAAIAAAACAAAAAAAABAIAAgAOABAAADwAAAQEBAQEBAQEBAQEBAQEBAQCAAQAAAAEAAAABAAAA/4AAAP+AAAD/AAAA/4AAAP+ABAAAAP6AAAABgAAA/oAAAP+AAAD+gAAAAYAAAACAAAAAAAABAIAAgAOABAAAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIADAAAA/4AAAP+AAAD/gAAA/4AAAAIAAAD9AAAAAIAAAACAAAAAgAAAAIAAAP4ABAAAAP8AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAAEAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQEAAIADAAQAAAcAAAEBAQEBAQEBAQACAAAA/wAAAAEAAAD+AAQAAAD/gAAA/YAAAP+AAAAAAAABAIAAgAQAA4AAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIABAAAAAIAAAACAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AA4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQEAAIADAAQAAAcAAAEBAQEBAQEBAQACAAAA/gAAAAEAAAD/AAQAAAD8gAAAAIAAAAKAAAAAAAABAIACAAQABAAAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgAAgAAAAIAAAACAAAAAgAAA/wAAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAACABAAAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAP+AAAD/gAAAAIAAAACAAAAAgAAAAAAAAQCAAIADgAEAAAMAAAEBAQEAgAMAAAD9AAEAAAD/gAAAAAAAAQEAAoACgAQAAAkAAAEBAQEBAQEBAQEBAAEAAAAAgAAA/4AAAP+AAAD/gAQAAAD/gAAA/wAAAACAAAAAgAAAAAEAgACAA4ADAAAPAAABAQEBAQEBAQEBAQEBAQEBAQACgAAA/4AAAP+AAAD/AAAAAQAAAP6AAAD/gAAAAIADAAAA/YAAAACAAAABgAAA/oAAAP+AAAAAgAAAAYAAAAAAAAIAgACAA4AEAAAJAA0AAAEBAQEBAQEBAQEBAQEBAIABAAAAAYAAAACAAAD/gAAA/YABAAAAAQAAAAQAAAD/AAAA/4AAAP6AAAD/gAAAAgD+gAAAAYAAAAABAIAAgAOAAwAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP8AAAABAAAAAQAAAP+AAAD+AAAA/4AAAACAAwAAAP+AAAD/gAAAAIAAAP6AAAAAgAAA/4AAAP+AAAAAgAAAAYAAAAAAAAIAgACAA4AEAAAJAA0AAAEBAQEBAQEBAQEBAQEBAoABAAAA/YAAAP+AAAAAgAAAAYD/AAAAAQAAAAQAAAD8gAAAAIAAAAGAAAAAgAAA/4D+gAAAAYAAAAACAIAAgAOAAwAADQARAAABAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/gAAAAGAAAD+AAAA/4AAAACAAIAAAAEAAAADAAAA/4AAAP8AAAD/gAAA/4AAAACAAAABgAAAAAD/gAAAAIAAAAABAQAAgAOAA4AACwAAAQEBAQEBAQEBAQEBAYACAAAA/oAAAAEAAAD/AAAA/wAAAACAA4AAAP+AAAD/AAAA/4AAAP8AAAACgAAAAAAAAgCAAIADgAOAAA8AEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/4AAAP4AAAABgAAA/oAAAP+AAAAAgACAAAABAAAAA4AAAP+AAAD+AAAA/4AAAACAAAAAgAAAAIAAAAEAAAAAAP8AAAABAAABAIAAgAOABAAACwAAAQEBAQEBAQEBAQEBAIABAAAAAYAAAACAAAD/AAAA/wAAAP8ABAAAAP8AAAD/gAAA/gAAAAIAAAD+AAAAAAAAAgGAAIACgAQAAAMABwAAAQEBAQEBAQEBgAEAAAD/AAAAAQAAAP8ABAAAAP+AAAD/gAAA/YAAAAACAIAAgAOABAAAAwAPAAABAQEBAQEBAQEBAQEBAQEBAoABAAAA/wAAAAEAAAD/gAAA/gAAAP+AAAABAAAAAQAEAAAA/4AAAP+AAAD+AAAA/4AAAACAAAABAAAA/wAAAAABAIAAgAOAA4AAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAAAgAAAAQAAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP8AA4AAAP8AAAAAgAAA/4AAAP8AAAD/gAAA/4AAAACAAAAAgAAA/wAAAAAAAAEBgACAAwAEAAAHAAABAQEBAQEBAQGAAQAAAACAAAD/AAAA/4AEAAAA/QAAAP+AAAAAgAAAAAAAAQCAAIAEAAMAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAAAAIAAAAEAAAAAgAAA/wAAAP+AAAD/gAAA/4AAAP8AAAAAgAMAAAD/gAAAAIAAAP+AAAD+AAAAAYAAAP+AAAAAgAAA/oAAAAIAAAAAAAABAIAAgAOAAwAADwAAAQEBAQEBAQEBAQEBAQEBAQCAAQAAAACAAAABAAAAAIAAAP8AAAD/gAAA/4AAAP8AAwAAAP+AAAAAgAAA/4AAAP4AAAABgAAA/4AAAP8AAAAAAAACAIAAgAOAAwAACwAPAAABAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP+AAAD+AAAA/4AAAACAAIAAAAEAAAADAAAA/4AAAP6AAAD/gAAAAIAAAAGAAAAAAP6AAAABgAACAIAAgAOAAwAACQANAAABAQEBAQEBAQEBAQEBAQCAAoAAAACAAAD/gAAA/oAAAP8AAQAAAAEAAAADAAAA/4AAAP+AAAD/gAAA/wAAAAIA/4AAAACAAAAAAgCAAIAEAAMAAA0AEQAAAQEBAQEBAQEBAQEBAQEBAQEBAQACgAAAAIAAAP+AAAD/AAAA/oAAAP+AAAAAgACAAAABAAAAAwAAAP6AAAD/gAAA/4AAAAEAAAAAgAAAAIAAAAAA/4AAAACAAAAAAQEAAIADgAMAAAkAAAEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP+AAAD/AAMAAAD/gAAA/wAAAAEAAAD+AAAAAAEAgACABAADAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEAAoAAAP6AAAABgAAAAIAAAP+AAAD9AAAAAgAAAP6AAAD/gAAAAIADAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAgAAAAAAAAQCAAIADgAOAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAAAAQAAAP8AAAAAgAAAAQAAAP+AAAD+gAAA/4AAAP+AAAAAgAOAAAD/gAAA/4AAAP6AAAAAgAAA/4AAAP+AAAAAgAAAAYAAAACAAAAAAAABAIAAgAOAAwAADwAAAQEBAQEBAQEBAQEBAQEBAQCAAQAAAACAAAAAgAAAAQAAAP+AAAD/gAAA/oAAAP+AAwAAAP4AAAAAgAAAAYAAAP2AAAAAgAAA/4AAAACAAAAAAAABAIAAgAOAAwAADwAAAQEBAQEBAQEBAQEBAQEBAQCAAQAAAAEAAAABAAAA/4AAAP+AAAD/AAAA/4AAAP+AAwAAAP6AAAABgAAA/oAAAP+AAAD/gAAAAIAAAACAAAAAAAABAIAAgAQAAwAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAAAgAAAAIAAAACAAAABAAAA/4AAAP8AAAD/gAAA/wAAAP+AAwAAAP6AAAAAgAAA/4AAAAGAAAD+AAAA/4AAAACAAAD/gAAAAIAAAAAAAAEAgACAA4ADAAAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIABAAAAAQAAAAEAAAD/gAAA/4AAAACAAAAAgAAA/wAAAP8AAAD/AAAAAIAAAACAAAD/gAAA/4ADAAAA/4AAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAD/gAAAAIAAAACAAAAAgAAAAIAAAAAAAAEAgACAA4ADAAAPAAABAQEBAQEBAQEBAQEBAQEBAIABAAAAAQAAAAEAAAD/gAAA/gAAAAGAAAD+gAAA/4ADAAAA/wAAAAEAAAD+AAAA/4AAAACAAAAAgAAAAIAAAAAAAAEAgACAA4ADAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAwAAAP+AAAD/gAAA/4AAAAGAAAD9AAAAAIAAAACAAAAAgAAA/oADAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAgAAAAAAAAQCAAIADAAQAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAYABgAAA/wAAAP+AAAAAgAAAAQAAAP6AAAD/gAAA/4AAAACAAAAAgAQAAAD/gAAA/wAAAP+AAAD/AAAA/4AAAACAAAABAAAAAIAAAAEAAAAAAAABAYAAgAKABAAAAwAAAQEBAQGAAQAAAP8ABAAAAPyAAAAAAAABAQAAgAOABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAGAAAAAgAAAAIAAAP+AAAD/gAAA/oAAAAEAAAAAgAAA/4AAAP8ABAAAAP+AAAD/AAAA/4AAAP8AAAD/gAAAAIAAAAEAAAAAgAAAAQAAAAAAAAEAgAGAA4ADAAAPAAABAQEBAQEBAQEBAQEBAQEBAQABAAAAAQAAAACAAAD/gAAA/wAAAP8AAAD/gAAAAIADAAAA/4AAAACAAAD/AAAA/4AAAACAAAD/gAAAAQAAAAAAAAEAAAAABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQAAAYAAAAEAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/AAAA/wAEAAAA/4AAAP+AAAD/gAAA/wAAAP6AAAABAAAAAQAAAACAAAAAgAAAAAAAAQIAAAAEAAQAAAMAAAEBAQECAAIAAAD+AAQAAAD8AAAAAAAAAgCAAIADgAQAABcAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQGAAYAAAP8AAAABAAAA/4AAAP+AAAABgAAA/QAAAACAAAAAgAAA/wAAAACAAAAAgAGAAIAAAP+ABAAAAP+AAAD/AAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAABAAAAAAAAAP+AAAAAAQCAAIADgAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAABAAAAAQAAAP+AAAAAgAAA/wAAAAEAAAD/AAAA/wAAAP8AAAABAAAA/wAAAACAAAD/gAQAAAD+gAAAAYAAAP8AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAABACAAIAEAAQAABcAGwAfACMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAoAAAP4AAAABgAAAAIAAAACAAAD/gAAA/YAAAAIAAAD+gAAA/4AAAP+AAAAAgAEAAAAAgAAAAQAAgAAA/4D9AACAAAD/gAQAAAD/gAAA/4AAAP+AAAD/gAAA/wAAAP+AAAAAgAAAAIAAAACAAAAAgAAAAQAAAP8A/4AAAACAAQAAAP+AAAD+gAAA/4AAAAAEAIAAgAQAA4AAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQCAAIAAAP+AAQAAgAAA/4ABAACAAAD/gAEAAIAAAP+AA4AAAP0AAAADAAAA/QAAAAMAAAD9AAAAAwAAAP0AAAAAAQIAAAAEAAQAAAkAAAEBAQEBAQEBAQEDgACAAAD+AAAAAIAAAACAAAAAgAQAAAD8AAAAAQAAAAEAAAABAAAAAAgAAAAABAAEAAADAAcACwAPABMAFwAbAB8AAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAABAAAA/wACAAEAAAD/AP8AAQAAAP8AAgABAAAA/wD9AAEAAAD/AAIAAQAAAP8A/wABAAAA/wACAAEAAAD/AAQAAAD/AAAAAQAAAP8AAAAAAAAA/wAAAAEAAAD/AAAAAAAAAP8AAAABAAAA/wAAAAAAAAD/AAAAAQAAAP8AAAAAAQIAAAADAAQAAAMAAAEBAQECAAEAAAD/AAQAAAD8AAAAAAAAAgGAAIACgAQAAAMABwAAAQEBAQEBAQEBgAEAAAD/AAAAAQAAAP8ABAAAAP6AAAD/gAAA/oAAAAABAgAAAAQAAgAAAwAAAQEBAQIAAgAAAP4AAgAAAP4AAAAAAAAEAIAAAAQABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQCAAIAAAP+AAQAAgAAA/4ABAACAAAD/gAEAAIAAAP+ABAAAAPwAAAAEAAAA/AAAAAQAAAD8AAAABAAAAPwAAAAAAQCAAIADgAOAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAoABAAAA/oAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAAEAAAD/gAOAAAD+AAAA/wAAAACAAAAAgAAAAIAAAACAAAAAgAAA/wAAAAEAAAAAAAABAAAAAAQABAAACwAAAQEBAQEBAQEBAQEBAAAEAAAA/gAAAP+AAAD/gAAA/4AAAP+ABAAAAPwAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQCAAIAEAAOAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAOAAAD/gAAAAIAAAP8AAAABAAAA/oAAAAGAAAD9AAAAAIAAAP+AAAABAAAA/wAAAAGAAAD+gAAAAAAAAQAAAAACAAQAAAkAAAEBAQEBAQEBAQEAAACAAAAAgAAAAIAAAACAAAD+AAQAAAD/AAAA/wAAAP8AAAD/AAAAAAEAAAAABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQKAAYAAAP8AAAD/AAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAQAEAAAA/wAAAP+AAAD/gAAA/wAAAP8AAAABgAAAAQAAAACAAAAAgAAAAAAAAQAAAAAEAAIAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAAAgAAAAIAAAACAAAD8AAAAAIAAAACAAAAAgAIAAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAAAAAgAAAAAEAAQAAAMABwAAAQEBAQEBAQEAAAIAAAD+AAIAAgAAAP4ABAAAAP4AAAAAAAAA/gAAAAAEAAACAAQABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAP8AAgABAAAA/wD/AAEAAAD/AAIAAQAAAP8ABAAAAP8AAAABAAAA/wAAAAAAAAD/AAAAAQAAAP8AAAAABAIAAAAEAAQAAAMABwALAA8AAAEBAQEBAQEBAQEBAQEBAQECAAEAAAD/AAEAAQAAAP8A/wABAAAA/wABAAEAAAD/AAQAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAEDAAAABAAEAAADAAABAQEBAwABAAAA/wAEAAAA/AAAAAAAAAEAAAAABAAEAAAFAAABAQEBAQEAAAQAAAD9AAAA/wAEAAAA/wAAAP0AAAAAAQAAAAABAAQAAAMAAAEBAQEAAAEAAAD/AAQAAAD8AAAAAAAAAwCAAIADAAOAAAMABwALAAABAQEBAQEBAQEBAQEAgACAAAD/gAEAAIAAAP+AAQAAgAAA/4ADgAAA/QAAAAMAAAD9AAAAAwAAAP0AAAAAAAABAYABgAQABAAACwAAAQEBAQEBAQEBAQEBAYABAAAAAIAAAAEAAAD+gAAA/4AAAP+ABAAAAP8AAAD/gAAA/wAAAACAAAAAgAAAAAAAAQAAAYACgAQAAAsAAAEBAQEBAQEBAQEBAQGAAQAAAP+AAAD/gAAA/oAAAAEAAAAAgAQAAAD+gAAA/4AAAP+AAAABAAAAAIAAAAAAAAEAAAAABAAEAAAJAAABAQEBAQEBAQEBAwABAAAA/AAAAAEAAAABAAAAAQAEAAAA/AAAAAKAAAAAgAAAAIAAAAABAIAAgAMABAAACwAAAQEBAQEBAQEBAQEBAgABAAAA/4AAAP6AAAD/gAAAAIAAAAEABAAAAP0AAAD/gAAAAIAAAAEAAAAAgAAAAAAAAQAAAAAEAAQAAAUAAAEBAQEBAQAAAQAAAAMAAAD8AAQAAAD9AAAA/wAAAAACAIAAgAMAAoAACwAPAAABAQEBAQEBAQEBAQEBAQEBAQABgAAAAIAAAP+AAAD+gAAAAQAAAP8A/4AAgAAA/4ACgAAA/4AAAP8AAAD/gAAAAIAAAAEAAAAAAAAA/wAAAAACAIAAgAMABAAACwAPAAABAQEBAQEBAQEBAQEBAQEBAgABAAAA/4AAAP6AAAABAAAA/wAAAAEA/oAAgAAA/4AEAAAA/QAAAP+AAAAAgAAAAQAAAACAAAD/gAAA/wAAAAABAIAAgAQABAAADQAAAQEBAQEBAQEBAQEBAQECAAIAAAD/AAAA/4AAAP6AAAD/gAAAAIAAAAEABAAAAP+AAAD9gAAA/4AAAACAAAABAAAAAIAAAAACAAAAAAQABAAAAwAHAAABAQEBAQEBAQAABAAAAPwAAQAAAAIAAAAEAAAA/AAAAAMA/gAAAAIAAAEAgACABAAEAAARAAABAQEBAQEBAQEBAQEBAQEBAQECAAIAAAD/AAAAAQAAAP8AAAD/gAAA/oAAAP+AAAAAgAAAAQAEAAAA/4AAAP+AAAD/gAAA/oAAAP+AAAAAgAAAAQAAAACAAAAAAQAAAAACgAKAAAsAAAEBAQEBAQEBAQEBAQAAAYAAAACAAAAAgAAA/wAAAP+AAAD/AAKAAAD/gAAA/4AAAP6AAAABAAAAAIAAAAAAAAEAAAAABAAEAAAFAAABAQEBAQEAAAQAAAD/AAAA/QAEAAAA/AAAAAMAAAAAAQCAAIAEAAQAABUAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAAIAAAD/AAAAAQAAAP8AAAABAAAA/wAAAP+AAAD+gAAA/4AAAACAAAABAAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAAEAAAAAgAAAAAEBgAAABAACgAALAAABAQEBAQEBAQEBAQECgAGAAAD/AAAA/4AAAP8AAAAAgAAAAIACgAAA/wAAAP+AAAD/AAAAAYAAAACAAAAAAAABAAAAAAQABAAAEQAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAPwABAAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAAEAAAAABAABAAADAAABAQEBAAAEAAAA/AABAAAA/wAAAAAAAAEAAAAABAAEAAARAAABAQEBAQEBAQEBAQEBAQEBAQEDgACAAAD8AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAEAAAA/AAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAAQAAAgAEAAQAAAMAAAEBAQEAAAQAAAD8AAQAAAD+AAAAAAAAAgCAAIACAAOAAAMABwAAAQEBAQEBAQEAgACAAAD/gAEAAIAAAP+AA4AAAP0AAAADAAAA/QAAAAAEAIAAgAQABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQCAA4AAAPyAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAABAAAAPyAAAADAP+AAAAAgP8A/4AAAACA/wD/gAAAAIAAAQAAAAAEAAQAAAUAAAEBAQEBAQMAAQAAAPwAAAADAAQAAAD8AAAAAQAAAAACAIAAgAQABAAAAwAHAAABAQEBAQEBAQCAA4AAAPyAAYAAAACAAAAEAAAA/IAAAAIA/4AAAACAAAMAgACABAAEAAADAAcACwAAAQEBAQEBAQEBAQEBAIADgAAA/IAAgAAAAIAAAAGAAAAAgAAABAAAAPyAAAADAP+AAAAAgP4A/4AAAACAAAAABAAAAIAEAAQAAAMABwALAA8AAAEBAQEBAQEBAQEBAQEBAQEAAAQAAAD8AAAABAAAAPwAAAAEAAAA/AAAAAQAAAD8AAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAAYAgACABAAEAAADAAcACwAPABMAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIADgAAA/IAAgAAAAIAAAAGAAAAAgAAA/oAAAACAAAD+gAAAAIAAAAGAAAAAgAAABAAAAPyAAAADAP+AAAAAgAAA/4AAAACA/wD/gAAAAID/AP+AAAAAgAAA/4AAAACAAAEAgACAAQADgAADAAABAQEBAIAAgAAA/4ADgAAA/QAAAAAAAAUAgACABAAEAAADAAcACwAPABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAIADgAAA/IAAgAAAAIAAAAGAAAAAgAAA/YAAAACAAAABgAAAAIAAAAQAAAD8gAAAAwD/gAAAAIAAAP+AAAAAgP4A/4AAAACAAAD/gAAAAIAAAAABAAADAAQABAAAAwAAAQEBAQAABAAAAPwABAAAAP8AAAAAAAAHAIAAgAQABAAAAwAHAAsADwATABcAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCAA4AAAPyAAIAAAACAAAABgAAAAIAAAP2AAAAAgAAAAYAAAACAAAD9gAAAAIAAAAGAAAAAgAAABAAAAPyAAAADAP+AAAAAgAAA/4AAAACA/wD/gAAAAIAAAP+AAAAAgP8A/4AAAACAAAD/gAAAAIAAAAAEAAAAAAQAAgAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAP8AAgABAAAA/wD/AAEAAAD/AAIAAQAAAP8AAgAAAP8AAAABAAAA/wAAAAAAAAD/AAAAAQAAAP8AAAAAAQAAAAAEAAQAAAkAAAEBAQEBAQEBAQEAAAEAAAABAAAAAQAAAAEAAAD8AAQAAAD/gAAA/4AAAP+AAAD9gAAAAAEBAAAAAgAEAAADAAABAQEBAQABAAAA/wAEAAAA/AAAAAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQECgAGAAAD8AAAAAIAAAACAAAAAgAAAAQAEAAAA/AAAAAGAAAABAAAAAIAAAACAAAAAAAABAAABAAQAAgAAAwAAAQEBAQAABAAAAPwAAgAAAP8AAAAAAAABAAAAAAQABAAACwAAAQEBAQEBAQEBAQEBAgACAAAA/AAAAACAAAAAgAAAAIAAAACABAAAAPwAAAACAAAAAIAAAACAAAAAgAAAAAAAAQAAAAAEAAIAAAkAAAEBAQEBAQEBAQEDAAEAAAD8AAAAAQAAAAEAAAABAAIAAAD+AAAAAIAAAACAAAAAgAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEAAAIAAAAAgAAAAIAAAACAAAAAgAAA/AAEAAAA/4AAAP+AAAD/gAAA/4AAAP4AAAAAAAADAAAAAAQABAAAGwAnADMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAEAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAIAAYAAAACAAAD/gAAA/4AAAP+AAAD/gP4AAIAAAACAAAAAgAAAAIAAAP6AAAD/gAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAQAAAP+AAAD+gAAAAIAAAACAAAAAgAAA/oAAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAAAAAQAAAAAEAAIAAAkAAAEBAQEBAQEBAQEAAAEAAAABAAAAAQAAAAEAAAD8AAIAAAD/gAAA/4AAAP+AAAD/gAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEAAAGAAAABAAAAAIAAAACAAAAAgAAA/AAEAAAA/4AAAP+AAAD/gAAA/wAAAP6AAAAAAAAEAAAAgAQABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQCAAYAAAP6AAgABgAAA/oD9gAGAAAD+gAIAAYAAAP6ABAAAAP6AAAABgAAA/oAAAP+AAAD+gAAAAYAAAP6AAAAAAQIAAgAEAAQAAAMAAAEBAQECAAIAAAD+AAQAAAD+AAAAAAAABACAAIAEAAQAAAMABwAjACcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAAD/AAGAAQAAAP8A/gAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4ABgACAAAD/gAQAAAD/gAAAAIAAAP+AAAAAAAAA/wAAAP+AAAD/gAAAAIAAAACAAAABAAAA/oAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAAGAAAD/gAAAAAQAAAAABAAEAAADAAcACwAPAAABAQEBAQEBAQEBAQEBAQEBAAAAgAAA/4ADgACAAAD/gPyAAIAAAP+AA4AAgAAA/4AEAAAA/4AAAACAAAD/gAAA/QAAAP+AAAAAgAAA/4AAAAABAAAAAAIAAgAAAwAAAQEBAQAAAgAAAP4AAgAAAP4AAAAAAAAEAAAAAAIABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAP8AAQABAAAA/wD/AAEAAAD/AAEAAQAAAP8ABAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAQCAAQADgAOAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAYABAAAA/4AAAAGAAAD+gAAAAIAAAP8AAAD/gAAA/4AAAACAAAAAgAOAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAAAABAQABAAOABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQECAACAAAAAgAAAAIAAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACABAAAAP+AAAD/gAAA/wAAAACAAAD+gAAAAYAAAP+AAAABAAAAAIAAAAAAAAEBAAEABAADgAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQIAAQAAAACAAAAAgAAA/4AAAP+AAAD/AAAAAIAAAP6AAAABgAAA/4ADgAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAgAAAAAAAAQEAAIADgAOAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAgAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAOAAAD+gAAAAIAAAP8AAAD/gAAA/4AAAACAAAAAgAAAAQAAAP+AAAAAAAABAQAAgAOABAAADwAAAQEBAQEBAQEBAQEBAQEBAQIAAIAAAACAAAAAgAAA/4AAAP6AAAD/gAAAAIAAAACABAAAAP8AAAD/AAAA/wAAAP+AAAAAgAAAAQAAAAEAAAAAAAACAIAAgAOAA4AAAwAJAAABAQEBAQEBAQEBAIADAAAA/QAAgAAAAgAAAP8AAAADgAAA/QAAAAKA/gAAAAEAAAABAAAAAAIAgACABAAEAAAbACcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAACAAAAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAAD/gAAAAIAAAACAAAAAgAAA/4AAAAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAA/4D/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAEAAAIABAADAAADAAABAQEBAAAEAAAA/AADAAAA/wAAAAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEAAAQAAAD/gAAA/4AAAP+AAAD/gAAA/gAEAAAA/gAAAP+AAAD/gAAA/4AAAP+AAAAAAAABAAACAAIABAAAAwAAAQEBAQAAAgAAAP4ABAAAAP4AAAAAAAACAQAAgAOAA4AAFwAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAYABgAAAAIAAAP8AAAAAgAAAAIAAAP8AAAD/gAAA/wAAAACAAAAAgAAA/wAAAACAAIAAAACAAAADgAAA/wAAAP+AAAD/gAAA/4AAAP+AAAAAgAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgP+AAAAAgAADAAAAAAQABAAACwAnADMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAGAAAD/gAAA/4AAAP+AAAD/gAAAAIACgAEAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgACAAIAAAP+AAAD+gAAAAIAAAACAAAAAgAQAAAD/gAAA/4AAAP+AAAD/gAAAAYAAAACAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAIAAAACAAAAAgAAA/oAAAP6AAAD/gAAAAIAAAACAAAAAgAAAAAAAAgCAAIADgAQAAA8AHwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAAABAAAAAIAAAP+AAAD/AAAA/wAAAP+AAAAAgAAAAQAAAAEAAAAAgAAA/4AAAP8AAAD/AAAA/4AAAACABAAAAP+AAAAAgAAA/wAAAP+AAAAAgAAA/4AAAAEAAAD+gAAA/4AAAACAAAD/AAAA/4AAAACAAAD/gAAAAQAAAAABAAAAAAQAA4AACwAAAQEBAQEBAQEBAQEBAQACAAAAAIAAAACAAAD8AAAAAIAAAACAA4AAAP+AAAD/gAAA/YAAAAKAAAAAgAAAAAAAAQAAAAACAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEAAACAAAAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAQAAAD/gAAA/4AAAP+AAAD/AAAA/4AAAP+AAAD/gAAAAAAAAQIAAAAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEDgACAAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAQAAAD8AAAAAIAAAACAAAAAgAAAAQAAAACAAAAAgAAAAAAAAQCAAIAEAAQAABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIAAIAAAACAAAAAgAAAAIAAAP+AAAD/AAAA/4AAAP8AAAD/gAAAAIAAAACAAAAAgAQAAAD/gAAA/4AAAP+AAAD/gAAA/oAAAAEAAAD/AAAAAYAAAACAAAAAgAAAAIAAAAAAACAAAAAABAAEAAADAAcACwAPABMAFwAbAB8AIwAnACsALwAzADcAOwA/AEMARwBLAE8AUwBXAFsAXwBjAGcAawBvAHMAdwB7AH8AAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAgAAA/4ABAACAAAD/gAEAAIAAAP+AAQAAgAAA/4D9gACAAAD/gAEAAIAAAP+AAQAAgAAA/4ABAACAAAD/gPyAAIAAAP+AAQAAgAAA/4ABAACAAAD/gAEAAIAAAP+A/YAAgAAA/4ABAACAAAD/gAEAAIAAAP+AAQAAgAAA/4D8gACAAAD/gAEAAIAAAP+AAQAAgAAA/4ABAACAAAD/gP2AAIAAAP+AAQAAgAAA/4ABAACAAAD/gAEAAIAAAP+A/IAAgAAA/4ABAACAAAD/gAEAAIAAAP+AAQAAgAAA/4D9gACAAAD/gAEAAIAAAP+AAQAAgAAA/4ABAACAAAD/gAQAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAAQAAAAAEAAQAAAsAAAEBAQEBAQEBAQEBAQAABAAAAP6AAAD/AAAA/4AAAP+AAAD/gAQAAAD8AAAAAIAAAACAAAAAgAAAAQAAAAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEAAAQAAAD/gAAA/4AAAP+AAAD/AAAA/oAEAAAA/oAAAP8AAAD/gAAA/4AAAP+AAAAAAAABAAABgAKABAAADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+ABAAAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAACAAAAAAAABAAAAAAKABAAADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+ABAAAAP+AAAD/gAAA/4AAAP2AAAACAAAAAIAAAACAAAAAAAABAYAAAAQAAoAABQAAAQEBAQEBAYACgAAA/oAAAP8AAoAAAP8AAAD+gAAAAAEAAAAABAAEAAAJAAABAQEBAQEBAQEBAAACgAAAAIAAAACAAAAAgAAA/AAEAAAA/wAAAP8AAAD/AAAA/wAAAAACAAAAAAQABAAAGwAfAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQGAAQAAAACAAAAAgAAAAIAAAP+AAAD/gAAA/4AAAP8AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAAAEAAAAEAAAA/4AAAP+AAAD/gAAA/wAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAAEAAAAAgAAAAIAAAP8A/wAAAAEAAAEBgAGABAAEAAAFAAABAQEBAQEBgAEAAAABgAAA/YAEAAAA/oAAAP8AAAAAAQAAAAACgAKAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAKAAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQGAAAAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAQAAAD/AAAA/4AAAP+AAAD+AAAAAoAAAACAAAAAgAAAAAAAAQGAAAAEAAKAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAKAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAAAAAQGAAYAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAQAAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQAAAAAEAAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAEAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQAAAAAEAAQAAB8AAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAABAAAAAIAAAAEAAAAAgAAAAQAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAP+AAAD/gAQAAAD/gAAA/4AAAACAAAAAgAAA/wAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAAEAAAAAgAAAAQAAAACAAAAAAAABAAABgAQABAAADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAgAAAP2AAAD/gAAA/4AAAP+ABAAAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAACAAAAAAAABAAABgAQAAoAAAwAAAQEBAQAABAAAAPwAAoAAAP8AAAAAAAABAYAAAAKABAAAAwAAAQEBAQGAAQAAAP8ABAAAAPwAAAAAAAABAYAAAAQABAAAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAwABAAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACABAAAAP8AAAD/gAAA/wAAAP+AAAD/AAAAAIAAAACAAAAAgAAAAQAAAACAAAAAgAAAAAAAAQAAAAAEAAKAAA8AAAEBAQEBAQEBAQEBAQEBAQEAAAKAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD+AAKAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAAAAAQAAAYAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD9gAAAAgAAAACAAAAAgAQAAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQAAAgAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEAAAQAAAD/gAAA/4AAAP+AAAD/AAAA/4AAAP+AAAD/gAQAAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAAAAAQAAAYACgAKAAAMAAAEBAQEAAAKAAAD9gAKAAAD/AAAAAAAAAQGAAAACgAKAAAMAAAEBAQEBgAEAAAD/AAKAAAD9gAAAAAAAAQAAAYAEAAQAABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAABAAAAAIAAAAEAAAD/gAAA/4AAAP+AAAD/AAAA/4AAAP+AAAD/gAQAAAD/gAAA/4AAAACAAAAAgAAA/wAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAAAAAAEAAAAABAAEAAAJAAABAQEBAQEBAQEBAYACgAAA/AAAAACAAAAAgAAAAIAEAAAA/AAAAAEAAAABAAAAAQAAAAABAAAAAAQABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD/AAAA/oAAAAEAAAABAAAAAIAAAACABAAAAP6AAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAQAAAAAAAAEAAAAABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAQAAAAEAAAD+gAAA/wAAAP+AAAD/gAAA/4AEAAAA/wAAAP8AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAACAAAABAAAAAAAAAQAAAAAEAAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAQAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQAAAAACgAQAABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAIAAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAP+AAAD/gAQAAAD/gAAA/4AAAP+AAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAABAAAAAIAAAAAAAAEAAAAABAAEAAAfAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAP8AAAD/gAAA/wAAAP+AAAD/AAAAAIAAAACAAAD/gAAA/4AEAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/wAAAACAAAAAgAAA/4AAAP+AAAABAAAAAIAAAAEAAAAAgAAAAAAAAQAAAAACgAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAQAAAD9gAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQGAAAAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAQAAAD+AAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAAAAAQAAAAAEAAKAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAKAAAD+AAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAKAAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQGAAYACgAQAAAMAAAEBAQEBgAEAAAD/AAQAAAD9gAAAAAAAAQGAAYAEAAKAAAMAAAEBAQEBgAKAAAD9gAKAAAD/AAAAAAAAAQAAAAAEAAQAAB8AAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAwABAAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/wAAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAQAAAD/AAAA/4AAAP8AAAD/gAAA/wAAAACAAAAAgAAA/4AAAP+AAAABAAAAAIAAAACAAAAAgAAAAIAAAACAAAAAAAABAAAAAAQABAAAIwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAABAAAAAIAAAAEAAAAAgAAAAQAAAP+AAAD/gAAAAIAAAACAAAD/AAAA/4AAAP8AAAD/gAAA/wAAAACAAAAAgAAA/4AAAP+ABAAAAP+AAAD/gAAAAIAAAACAAAD/AAAA/4AAAP8AAAD/gAAA/wAAAACAAAAAgAAA/4AAAP+AAAABAAAAAIAAAAEAAAAAgAAAAAAAAQGAAYACgAKAAAMAAAEBAQEBgAEAAAD/AAKAAAD/AAAAAAAAAQAAAAAEAAKAABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQGAAQAAAACAAAAAgAAAAIAAAP8AAAD/gAAA/wAAAP+AAAD/AAAAAIAAAACAAAAAgAKAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAD/gAAA/4AAAAEAAAAAgAAAAIAAAAAAAAEAAAGAAoAEAAAFAAABAQEBAQEBgAEAAAD9gAAAAYAEAAAA/YAAAAEAAAAAAQAAAAACgAKAAAUAAAEBAQEBAQAAAoAAAP8AAAD+gAKAAAD9gAAAAYAAAAABAAAAAAQABAAAHwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAEAAAAAgAAAAQAAAACAAAABAAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+ABAAAAP+AAAD/gAAAAIAAAACAAAD/AAAA/4AAAP8AAAD/gAAA/wAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEBgAEAAAABgAAA/oAAAP8AAAD+gAAAAYAEAAAA/oAAAP8AAAD+gAAAAYAAAAEAAAAAAAABAAAAAAQAAoAABwAAAQEBAQEBAQEAAAQAAAD+gAAA/wAAAP6AAoAAAP8AAAD+gAAAAYAAAAAAAAEBgAAABAAEAAAHAAABAQEBAQEBAQGAAQAAAAGAAAD+gAAA/wAEAAAA/oAAAP8AAAD+gAAAAAAAAQAAAAACgAQAAAcAAAEBAQEBAQEBAYABAAAA/wAAAP6AAAABgAQAAAD8AAAAAYAAAAEAAAAAAAABAAABgAQABAAABwAAAQEBAQEBAQEBgAEAAAABgAAA/AAAAAGABAAAAP6AAAD/AAAAAQAAAAAAAAQBAAEAAwADAAADAAcACwAPAAABAQEBAQEBAQEBAQEBAQEBAYABAAAA/wD/gACAAAD/gAGAAIAAAP+A/wABAAAA/wADAAAA/4AAAAAAAAD/AAAAAQAAAP8AAAAAAAAA/4AAAAACAIAAgAOAA4AACwAPAAABAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP+AAAD+AAAA/4AAAACAAIAAAAEAAAADgAAA/4AAAP4AAAD/gAAAAIAAAAIAAAD/gP8AAAABAAACAAAAAAQABAAAEwAfAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAAAgAAA/4AAAP+AAAD+AAAA/4AAAP+AAAAAgAAAAIAAgAAA/4AAAACAAAABAAAAAIAAAP+AAAAEAAAA/4AAAP+AAAD+AAAA/4AAAP+AAAAAgAAAAIAAAAIAAAAAgAAA/4D/gAAA/wAAAP+AAAAAgAAAAQAAAACAABAAAAAABAAEAAADAAcACwAPABMAFwAbAB8AIwAnACsALwAzADcAOwA/AAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAYAAgAAA/4ACAACAAAD/gP2AAIAAAP+AAgAAgAAA/4D9gACAAAD/gAIAAIAAAP+A/YAAgAAA/4ACAACAAAD/gP+AAIAAAP+AAgAAgAAA/4D9gACAAAD/gAIAAIAAAP+A/YAAgAAA/4ACAACAAAD/gP2AAIAAAP+AAgAAgAAA/4AEAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAQAAAAAAQABAAAAwAHAAsADwATABcAGwAfACMAJwArAC8AMwA3ADsAPwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAIAAAP+AAgAAgAAA/4D+gACAAAD/gAIAAIAAAP+A/oAAgAAA/4ACAACAAAD/gP6AAIAAAP+AAgAAgAAA/4D8gACAAAD/gAIAAIAAAP+A/oAAgAAA/4ACAACAAAD/gP6AAIAAAP+AAgAAgAAA/4D+gACAAAD/gAIAAIAAAP+ABAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAwCAAIADgAQAABcAGwAfAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIAAIAAAAEAAAD/AAAAAIAAAP+AAAABAAAA/wAAAP+AAAD/AAAA/4AAAACAAAABAP+AAAAAgAAA/4AAAACAAAAEAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAYAAAACAAAD/gP+AAAAAgP8A/4AAAACAAAAAAQCAAIADgAOAAA8AAAEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/4AAAP+AAAD/AAAA/4AAAP+AAAAAgAOAAAD/gAAA/wAAAP+AAAD/AAAAAQAAAACAAAABAAAAAAAAAgCAAIADgAOAAAMACQAAAQEBAQEBAQEBAQCAAwAAAP0AAYAAAP8AAAACAAAAA4AAAP0AAAACgP8AAAD/AAAAAgAAAAABAIAAgAOAA4AAAwAAAQEBAQCAAwAAAP0AA4AAAP0AAAAAAAACAIAAgAOAA4AAAwALAAABAQEBAQEBAQEBAQEAgAMAAAD9AACAAAACAAAA/4AAAP8AAAADgAAA/QAAAAKA/gAAAAIAAAD/AAAAAQAAAQAAAAAEAAQAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAACAAAD/gAAA/4AAAP4AAAD/gAAA/4AAAACAAAAAgAQAAAD/gAAA/4AAAP4AAAD/gAAA/4AAAACAAAAAgAAAAgAAAACAAAAAAAABAQABAAMAAwAACwAAAQEBAQEBAQEBAQEBAYABAAAAAIAAAP+AAAD/AAAA/4AAAACAAwAAAP+AAAD/AAAA/4AAAACAAAABAAAAAAAAAQCAAQAEAAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAACAAAAAgAAAAQAAAP+AAAD/gAAAAIAAAP8AAAD/gAAA/wAAAACAAAD/gAAA/4AAAAEAAAAAgAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAABgCAAIAEAAQAAAMABwALAA8AEwAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAOAAAD8gAEAAAAAgAAAAIAAAACAAAD+AAAAAIAAAAGAAAAAgAAA/gAAAAGAAAAEAAAA/IAAAAMA/wAAAAEAAAD/AAAAAQD+gP+AAAAAgAAA/4AAAACA/4D/gAAAAIAABgCAAIAEAAQAAAMABwALAA8AEwAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAOAAAD8gAEAAAAAgAAAAIAAAACAAAD+gAAAAYAAAP4AAAAAgAAAAYAAAACAAAAEAAAA/IAAAAMA/wAAAAEAAAD/AAAAAQD+gP+AAAAAgP+A/4AAAACAAAD/gAAAAIAABgCAAIAEAAQAABMAFwAbAB8AIwAnAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgAAgAAAAIAAAAEAAAD/AAAA/4AAAP+AAAD/gAAA/wAAAAEAAAAAgAAAAAAAgAAA/oAAgAAA/4ACAACAAAD/gP4AAIAAAP+AAgAAgAAA/4AEAAAA/wAAAP+AAAD/gAAA/4AAAP8AAAABAAAAAIAAAACAAAAAgAAA/4D/gAAAAIABAAAA/4AAAACAAAD/gAAA/oAAAP+AAAAAgAAA/4AAAAACAQAAgAOABAAAFwAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAYABgAAAAIAAAP+AAAD/gAAAAIAAAP+AAAD/gAAA/4AAAACAAAD/gAAAAQAAAP8A/4AAgAAA/4AEAAAA/4AAAP8AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAIAAAAEAAAAAAAAA/wAAAAACAIAAgAQABAAAFwAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAYACgAAA/4AAAP+AAAD/gAAAAIAAAP+AAAD+gAAAAQAAAP8AAAABAAAAAIAAAP8A/wAAgAAA/4AEAAAA/gAAAAEAAAD/gAAA/4AAAP8AAAD/gAAAAIAAAAEAAAAAgAAAAIAAAACAAAD+gAAA/wAAAAABAIAAgAQABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIAAIAAAACAAAAAgAAAAIAAAP8AAAD/gAAAAIAAAP6AAAAAgAAA/4AAAP8AAAAAgAAAAIAAAACABAAAAP+AAAD/gAAA/4AAAP8AAAAAgAAA/wAAAP+AAAAAgAAAAQAAAP+AAAABAAAAAIAAAACAAAAAAAABAIAAgAQABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQGAAYAAAP+AAAAAgAAAAQAAAP8AAAD/gAAAAIAAAP6AAAAAgAAA/4AAAP8AAAABAAAAAIAAAP+ABAAAAP8AAAD/gAAAAIAAAP6AAAAAgAAA/wAAAP+AAAAAgAAAAQAAAP+AAAABgAAA/4AAAACAAAAAAAABAIAAgAQABAAAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAAAAIAAAAEAAAAAgAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACABAAAAP+AAAAAgAAA/4AAAP6AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAABgAAAAAAAAQCAAIAEAAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAACAAAAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQEAAIADgAQAAAsAAAEBAQEBAQEBAQEBAQIAAYAAAP8AAAD/gAAA/wAAAACAAAAAgAQAAAD/AAAA/gAAAP+AAAABAAAAAIAAAAAAAAEAgACABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQGAAoAAAP+AAAD/AAAAAIAAAACAAAD+gAAA/4AAAP8AAAAAgAAAAIAEAAAA/QAAAP+AAAABAAAAAIAAAAEAAAD+AAAA/4AAAAEAAAAAgAAAAAAAAAAYASYAAQAAAAAAAAAIAAAAAQAAAAAAAQAIAAgAAQAAAAAAAgAHABAAAQAAAAAAAwAIABcAAQAAAAAABAAQAB8AAQAAAAAABQALAC8AAQAAAAAABgAIADoAAQAAAAAACQAJAEIAAQAAAAAACgA6AEsAAQAAAAAADQARAIUAAQAAAAAADgAyAJYAAQAAAAAAEwAMAMgAAwABBAkAAAAQANQAAwABBAkAAQAQAOQAAwABBAkAAgAOAPQAAwABBAkAAwAQAQIAAwABBAkABAAgARIAAwABBAkABQAWATIAAwABBAkABgAQAUgAAwABBAkACQASAVgAAwABBAkACgB0AWoAAwABBAkADQAiAd4AAwABBAkADgBkAgAAAwABBAkAEwAYAmQoYykgMjAyMlVyc2FGb250UmVndWxhclVyc2FGb250VXJzYUZvbnQgUmVndWxhclZlcnNpb24gMS4wVXJzYUZvbnRVcnNhRnJhbmtBbiBvcGVuIGxpY2VuY2UgZ2VuZXJhbCBwdXJwb3NlIHRleHRtb2RlIGZvbnQgYnkgVXJzYUZyYW5rQ0MwIDEuMCBVbml2ZXJzYWxodHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wL0hlbGxvIFdvcmxkIQAoAGMAKQAgADIAMAAyADIAVQByAHMAYQBGAG8AbgB0AFIAZQBnAHUAbABhAHIAVQByAHMAYQBGAG8AbgB0AFUAcgBzAGEARgBvAG4AdAAgAFIAZQBnAHUAbABhAHIAVgBlAHIAcwBpAG8AbgAgADEALgAwAFUAcgBzAGEARgBvAG4AdABVAHIAcwBhAEYAcgBhAG4AawBBAG4AIABvAHAAZQBuACAAbABpAGMAZQBuAGMAZQAgAGcAZQBuAGUAcgBhAGwAIABwAHUAcgBwAG8AcwBlACAAdABlAHgAdABtAG8AZABlACAAZgBvAG4AdAAgAGIAeQAgAFUAcgBzAGEARgByAGEAbgBrAEMAQwAwACAAMQAuADAAIABVAG4AaQB2AGUAcgBzAGEAbABoAHQAdABwAHMAOgAvAC8AYwByAGUAYQB0AGkAdgBlAGMAbwBtAG0AbwBuAHMALgBvAHIAZwAvAHAAdQBiAGwAaQBjAGQAbwBtAGEAaQBuAC8AegBlAHIAbwAvADEALgAwAC8ASABlAGwAbABvACAAVwBvAHIAbABkACEAAAADAAAAAAAAAGYAMwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\r
|
|
8
|
-
`;class EA{extractCharacters(A){var t;const e=[];return(t=A==null?void 0:A.cmap)!=null&&t.tables?(A.cmap.tables.forEach(r=>{if(r.format===4){const i=this._extractCharactersFromFormat4Table(r);e.push(...i)}else if(r.format===12){const i=this._extractCharactersFromFormat12Table(r);e.push(...i)}}),[...new Set(e)]):[]}_extractCharactersFromFormat4Table(A){const e=[];if(!A.startCount||!A.endCount||!A.idRangeOffset||!A.idDelta)return e;for(let t=0;t<A.startCount.length;t++){const r=A.startCount[t],i=A.endCount[t];if(!(r===65535&&i===65535)){for(let s=r;s<=i;s++)if(this._calculateGlyphIndexFormat4(A,s,t)>0){const g=String.fromCodePoint(s);e.push(g)}}}return e}_extractCharactersFromFormat12Table(A){const e=[];if(!A.groups)return e;for(let t=0;t<A.groups.length;t+=3){const r=A.groups[t],i=A.groups[t+1],s=A.groups[t+2];for(let o=r;o<=i;o++)if(s+(o-r)>0){const B=String.fromCodePoint(o);e.push(B)}}return e}_calculateGlyphIndexFormat4(A,e,t){if(A.idRangeOffset[t]===0)return e+A.idDelta[t]&65535;{const r=A.idRangeOffset[t]/2+(e-A.startCount[t])-(A.startCount.length-t);if(r>=0&&A.glyphIdArray&&r<A.glyphIdArray.length){const i=A.glyphIdArray[r];if(i!==0)return i+A.idDelta[t]&65535}}return 0}filterProblematicCharacters(A){return A.filter(e=>this._isValidCharacter(e))}_isValidCharacter(A){const e=A.codePointAt(0)||0;return!(e>=0&&e<=31&&e!==9&&e!==10&&e!==13||e>=127&&e<=159)}}class QA{constructor(A){n(this,"_textureCanvas");n(this,"_textureContext");n(this,"_renderer");this._renderer=A,this._textureCanvas=document.createElement("canvas"),this._textureContext=this._textureCanvas.getContext("2d",{willReadFrequently:!0,alpha:!1})}createTextureAtlas(A,e,t,r){const i=A.length,s=Math.ceil(Math.sqrt(i)),o=Math.ceil(i/s),g=e.width*s,B=e.height*o;this._setupCanvas(g,B,t,r),this._renderCharactersToCanvas(A,e,s,t),this._applyBlackWhiteThreshold();const E=this._renderer.createFramebuffer(g,B,{filter:"nearest"});return E.update(this._textureCanvas),{framebuffer:E,columns:s,rows:o}}_setupCanvas(A,e,t,r){this._textureCanvas.width=A,this._textureCanvas.height=e,this._textureCanvas.style.width=A+"px",this._textureCanvas.style.height=A+"px",this._textureContext.imageSmoothingEnabled=!1,this._textureCanvas.style.imageRendering="pixelated",this._textureContext.fillStyle="black",this._textureContext.fillRect(0,0,A,e),this._textureContext.font=`${t}px ${r}`,this._textureContext.textBaseline="top",this._textureContext.textAlign="left",this._textureContext.fillStyle="white"}_renderCharactersToCanvas(A,e,t,r){for(let i=0;i<A.length;i++){const s=i%t,o=Math.floor(i/t),g=s*e.width+e.width*.5,B=o*e.height+e.height*.5,E=Math.round(g-e.width*.5),Q=Math.round(B-r*.5);this._textureContext.fillText(A[i].character,E,Q)}}_applyBlackWhiteThreshold(A=128){const e=this._textureContext.getImageData(0,0,this._textureCanvas.width,this._textureCanvas.height),t=e.data;for(let r=0;r<t.length;r+=4){const i=.299*t[r]+.587*t[r+1]+.114*t[r+2],s=A+32,o=i>s?255:0;t[r]=o,t[r+1]=o,t[r+2]=o}this._textureContext.putImageData(e,0,0)}}class lA{constructor(){n(this,"_tempCanvas");n(this,"_tempContext");this._tempCanvas=document.createElement("canvas"),this._tempContext=this._tempCanvas.getContext("2d")}calculateMaxGlyphDimensions(A,e,t){this._tempContext.font=`${e}px ${t}`;let r=0,i=0;for(const s of A){const o=this._tempContext.measureText(s),g=o.width,B=o.actualBoundingBoxAscent+o.actualBoundingBoxDescent;g>0&&(r=Math.max(r,g),i=Math.max(i,B))}return{width:Math.ceil(r),height:Math.ceil(i)}}}class hA{createCharacterObjects(A,e){return A.map((t,r)=>{const i=t.codePointAt(0)||0,s=this._generateCharacterColor(r);let o=0;if(e.hmtx&&e.hmtx.aWidth){const g=this._getGlyphIndex(e,i);g>0&&e.hmtx.aWidth[g]!==void 0&&(o=e.hmtx.aWidth[g])}return{character:t,unicode:i,color:s,advanceWidth:o}})}_getGlyphIndex(A,e){const t=A.cmap;if(!t||!t.tables)return 0;for(const r of t.tables)if(r.format===4){for(let i=0;i<r.startCount.length;i++)if(e>=r.startCount[i]&&e<=r.endCount[i]){if(r.idRangeOffset[i]===0)return e+r.idDelta[i]&65535;{const s=r.idRangeOffset[i]/2+(e-r.startCount[i])-(r.startCount.length-i);if(s>=0&&s<r.glyphIdArray.length){const o=r.glyphIdArray[s];if(o!==0)return o+r.idDelta[i]&65535}}}}return 0}_generateCharacterColor(A){const e=A%256,t=Math.floor(A/256)%256,r=Math.floor(A/65536)%256;return[e,t,r]}getCharacterColor(A,e){if(!D.validate(typeof A=="string"&&A.length===1,"Character must be a single character string.",{method:"getCharacterColor",providedValue:A}))return[0,0,0];const t=e.find(r=>r.character===A);return t?t.color:[0,0,0]}getCharacterColors(A,e){return D.validate(typeof A=="string"&&A.length>0,"Characters must be a string with at least one character.",{method:"getCharacterColors",providedValue:A})?A.split("").map(t=>this.getCharacterColor(t,e)||[0,0,0]):[[0,0,0]]}}class J{constructor(A,e=16){n(this,"_font");n(this,"_characters",[]);n(this,"_fontFramebuffer");n(this,"_fontSize",16);n(this,"_textureColumns",0);n(this,"_textureRows",0);n(this,"_maxGlyphDimensions",{width:0,height:0});n(this,"_fontFace");n(this,"_fontFamilyName","UrsaFont");n(this,"_characterExtractor");n(this,"_textureAtlas");n(this,"_metricsCalculator");n(this,"_characterColorMapper");this._fontSize=e,this._characterExtractor=new EA,this._textureAtlas=new QA(A),this._metricsCalculator=new lA,this._characterColorMapper=new hA}async initialize(A){let e;if(A){const t=await fetch(A);if(!t.ok)throw new C(`Failed to load font file: ${t.status} ${t.statusText}`);e=await t.arrayBuffer()}else e=await(await fetch(BA)).arrayBuffer();await this._loadFontFace(e),this._font=h.parse(e)[0],await this._initializeFont()}setFontSize(A){if(A===void 0)return this._fontSize;this._fontSize=A,this._maxGlyphDimensions=this._metricsCalculator.calculateMaxGlyphDimensions(this._characters.map(t=>t.character),this._fontSize,this._fontFamilyName);const e=this._textureAtlas.createTextureAtlas(this._characters,this._maxGlyphDimensions,this._fontSize,this._fontFamilyName);this._fontFramebuffer=e.framebuffer,this._textureColumns=e.columns,this._textureRows=e.rows}async loadFont(A){try{const e=await fetch(A);if(!e.ok)throw new C(`Failed to load font file: ${e.status} ${e.statusText}`);const t=await e.arrayBuffer();await this._loadFontFace(t);const r=h.parse(t);if(!r||r.length===0)throw new Error("Failed to parse font file");this._font=r[0],await this._initializeFont()}catch(e){throw new C(`Failed to load font: ${e instanceof Error?e.message:"Unknown error"}`,e)}}async _loadFontFace(A){const e=Date.now();this._fontFamilyName=this._fontFamilyName==="UrsaFont"?"UrsaFont":`CustomFont_${e}`,this._fontFace=new FontFace(this._fontFamilyName,A),await this._fontFace.load(),document.fonts.add(this._fontFace)}async _initializeFont(){const A=this._characterExtractor.extractCharacters(this._font),e=this._characterExtractor.filterProblematicCharacters(A);this._characters=this._characterColorMapper.createCharacterObjects(e,this._font),this._maxGlyphDimensions=this._metricsCalculator.calculateMaxGlyphDimensions(e,this._fontSize,this._fontFamilyName);const t=this._textureAtlas.createTextureAtlas(this._characters,this._maxGlyphDimensions,this._fontSize,this._fontFamilyName);this._fontFramebuffer=t.framebuffer,this._textureColumns=t.columns,this._textureRows=t.rows}getCharacterColor(A){return this._characterColorMapper.getCharacterColor(A,this._characters)}getCharacterColors(A){return this._characterColorMapper.getCharacterColors(A,this._characters)}hasAllCharacters(A){if(typeof A!="string"||A.length===0)return!1;const e=new Set(this._characters.map(t=>t.character));for(const t of A)if(!e.has(t))return!1;return!0}get fontFramebuffer(){return this._fontFramebuffer}get characters(){return this._characters}get textureColumns(){return this._textureColumns}get textureRows(){return this._textureRows}get maxGlyphDimensions(){return this._maxGlyphDimensions}get fontSize(){return this._fontSize}get font(){return this._font}}class K{constructor(A,e,t){n(this,"_cols");n(this,"_rows");n(this,"_width");n(this,"_height");n(this,"_offsetX");n(this,"_offsetY");n(this,"_fixedDimensions",!1);n(this,"_canvas");n(this,"_cellWidth");n(this,"_cellHeight");this._canvas=A,this._cellWidth=e,this._cellHeight=t,this.reset()}reset(){if(!this._fixedDimensions){const A=this._canvas.getBoundingClientRect();let e=Math.round(A.width),t=Math.round(A.height);[this._cols,this._rows]=[Math.floor(e/this._cellWidth),Math.floor(t/this._cellHeight)]}this._resizeGrid()}_resizeGrid(){const A=this._canvas.getBoundingClientRect();let e=Math.round(A.width),t=Math.round(A.height);this._width=this._cols*this._cellWidth,this._height=this._rows*this._cellHeight,this._offsetX=Math.floor((e-this._width)/2),this._offsetY=Math.floor((t-this._height)/2)}resizeCellPixelDimensions(A,e){[this._cellWidth,this._cellHeight]=[A,e],this.reset()}resizeGridDimensions(A,e){this._fixedDimensions=!0,[this._cols,this._rows]=[A,e],this._resizeGrid()}resetGridDimensions(){this._fixedDimensions=!1,this.reset()}resize(){this._fixedDimensions?this._resizeGrid():this.reset()}fixedDimensions(A){if(A===void 0)return this._fixedDimensions;this._fixedDimensions=A}get cellWidth(){return this._cellWidth}get cellHeight(){return this._cellHeight}get cols(){return this._cols}get rows(){return this._rows}get width(){return this._width}get height(){return this._height}get offsetX(){return this._offsetX}get offsetY(){return this._offsetY}}class j{constructor(A,e=!1,t={}){n(this,"_canvas");n(this,"captureSource");n(this,"_isStandalone");this.captureSource=A,this._isStandalone=e,this._canvas=this.createCanvas(t.width,t.height)}createCanvas(A,e){var r;const t=document.createElement("canvas");if(t.className="textmodeCanvas",this._isStandalone)t.width=A||800,t.height=e||600,t.style.width=A+"px",t.style.height=e+"px",document.body.appendChild(t);else{const i=this.captureSource.getBoundingClientRect();let s=Math.round(i.width),o=Math.round(i.height);if(this.captureSource instanceof HTMLVideoElement){const E=this.captureSource;(s===0||o===0)&&E.videoWidth>0&&E.videoHeight>0&&(s=E.videoWidth,o=E.videoHeight)}t.width=s,t.height=o,t.style.width=s+"px",t.style.height=o+"px",t.style.position="absolute",t.style.pointerEvents="none";const g=window.getComputedStyle(this.captureSource);let B=parseInt(g.zIndex||"0",10);isNaN(B)&&(B=0),t.style.zIndex=(B+1).toString(),this.positionOverlayCanvas(t),(r=this.captureSource.parentNode)==null||r.insertBefore(t,this.captureSource.nextSibling)}return t}positionOverlayCanvas(A){const e=this.captureSource.getBoundingClientRect();let t=this.captureSource.offsetParent;if(t&&t!==document.body){const r=t.getBoundingClientRect();A.style.top=e.top-r.top+"px",A.style.left=e.left-r.left+"px"}else A.style.top=e.top+window.scrollY+"px",A.style.left=e.left+window.scrollX+"px"}resize(A,e){if(this._isStandalone)this._canvas.width=A??this._canvas.width,this._canvas.height=e??this._canvas.height,this._canvas.style.width=(A??this._canvas.width)+"px",this._canvas.style.height=(e??this._canvas.height)+"px";else{const t=this.captureSource.getBoundingClientRect();let r=Math.round(t.width),i=Math.round(t.height);if(this.captureSource instanceof HTMLVideoElement){const s=this.captureSource;(r===0||i===0)&&s.videoWidth>0&&s.videoHeight>0&&(r=s.videoWidth,i=s.videoHeight)}this._canvas.width=r,this._canvas.height=i,this._canvas.style.width=r+"px",this._canvas.style.height=i+"px",this.positionOverlayCanvas(this._canvas)}}getWebGLContext(){const A={alpha:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!0,antialias:!1,depth:!1,stencil:!1,powerPreference:"high-performance"},e=this._canvas.getContext("webgl2",A)||this._canvas.getContext("webgl",A);if(!e)throw new C("WebGL context could not be created. Ensure your browser supports WebGL.");return e}get canvas(){return this._canvas}get width(){return this._canvas.width}get height(){return this._canvas.height}}class y{constructor(A,e,t,r={}){n(this,"renderer");n(this,"fontManager");n(this,"grid");n(this,"_characterFramebuffer");n(this,"_primaryColorFramebuffer");n(this,"_secondaryColorFramebuffer");n(this,"_rotationFramebuffer");n(this,"_transformFramebuffer");n(this,"_options");this.renderer=A,this.fontManager=e,this.grid=t,this._options=r,this._characterFramebuffer=this.renderer.createFramebuffer(this.grid.cols,this.grid.rows),this._primaryColorFramebuffer=this.renderer.createFramebuffer(this.grid.cols,this.grid.rows),this._secondaryColorFramebuffer=this.renderer.createFramebuffer(this.grid.cols,this.grid.rows),this._rotationFramebuffer=this.renderer.createFramebuffer(this.grid.cols,this.grid.rows),this._transformFramebuffer=this.renderer.createFramebuffer(this.grid.cols,this.grid.rows)}resize(){this._characterFramebuffer.resize(this.grid.cols,this.grid.rows),this._primaryColorFramebuffer.resize(this.grid.cols,this.grid.rows),this._secondaryColorFramebuffer.resize(this.grid.cols,this.grid.rows),this._rotationFramebuffer.resize(this.grid.cols,this.grid.rows),this._transformFramebuffer.resize(this.grid.cols,this.grid.rows)}enabled(A){this._options.enabled=A}enable(){this.enabled(!0)}disable(){this.enabled(!1)}get characterFramebuffer(){return this._characterFramebuffer}get primaryColorFramebuffer(){return this._primaryColorFramebuffer}get secondaryColorFramebuffer(){return this._secondaryColorFramebuffer}get rotationFramebuffer(){return this._rotationFramebuffer}get transformFramebuffer(){return this._transformFramebuffer}get options(){return this._options}}class cA{constructor(A,e){n(this,"_framebuffer");n(this,"_renderer");n(this,"_colors");this._renderer=A,this._colors=e;const t=Math.max(this._colors.length,1);this._framebuffer=this._renderer.createFramebuffer(t,1),this._updateFramebuffer()}_updateFramebuffer(){if(!this._framebuffer)return;const A=Math.max(this._colors.length,1),e=1;this._framebuffer.width!==A&&this._framebuffer.resize(A,e);const t=new Uint8Array(A*e*4);for(let r=0;r<A;r++){const i=r<this._colors.length?this._colors[r]:[0,0,0],s=r*4;t[s]=i[0],t[s+1]=i[1],t[s+2]=i[2],t[s+3]=255}this._framebuffer.updatePixels(t,A,e)}setColors(A){this._colors=A,this._updateFramebuffer()}get colors(){return this._colors}get framebuffer(){return this._framebuffer}get texture(){return this._framebuffer.texture}}class Y extends y{constructor(e,t,r,i={}){super(e,t,r,i);n(this,"palette");this.palette=new cA(this.renderer,this.fontManager.getCharacterColors(" .:-=+*%@#"))}characters(e){D.validate(this.fontManager.hasAllCharacters(e),"One or more characters do not exist in the current font.",{method:"characters",providedValue:e})&&(this._options.characters=e,this.palette.setColors(this.fontManager.getCharacterColors(e)))}characterColor(e,t=e,r=e,i=255){D.validate([e,t,r,i].every(s=>s>=0&&s<=255),"Character color values must be between 0 and 255",{method:"characterColor",providedValues:{r:e,g:t,b:r,a:i}})&&(this._options.characterColor=[e,t,r,i])}characterColorMode(e){D.validate(["sampled","fixed"].includes(e),"Invalid character color mode. Must be 'sampled' or 'fixed'.",{method:"characterColorMode",providedValue:e})&&(this._options.characterColorMode=e)}cellColor(e,t=e,r=e,i=255){D.validate([e,t,r,i].every(s=>s>=0&&s<=255),"Cell color values must be between 0 and 255",{method:"cellColor",providedValues:{r:e,g:t,b:r,a:i}})&&(this._options.cellColor=[e,t,r,i])}cellColorMode(e){D.validate(["sampled","fixed"].includes(e),"Invalid cell color mode. Must be 'sampled' or 'fixed'.",{method:"cellColorMode",providedValue:e})&&(this._options.cellColorMode=e)}invert(e){D.validate(typeof e=="boolean"||typeof e=="number"&&Number.isInteger(e),"Invert must be a boolean value or an integer (0 for false, any other number for true).",{method:"invert",providedValue:e})&&(this._options.invert=!!e)}rotation(e){if(!D.validate(typeof e=="number","Rotation angle must be a number.",{method:"rotation",providedValue:e}))return;e=e%360,e<0&&(e+=360);const t=e*255/360,r=Math.floor(t)/255,i=Math.round(t-r);this._options.rotation=[r,i,0,1]}flipHorizontally(e){D.validate(typeof e=="boolean"||typeof e=="number"&&Number.isInteger(e),"Flip horizontally must be a boolean value or an integer (0 for false, any other number for true).",{method:"flipHorizontally",providedValue:e})&&(this._options.flipHorizontally=!!e)}flipVertically(e){D.validate(typeof e=="boolean"||typeof e=="number"&&Number.isInteger(e),"Flip vertically must be a boolean value or an integer (0 for false, any other number for true).",{method:"flipVertically",providedValue:e})&&(this._options.flipVertically=!!e)}}var uA="precision lowp float;uniform sampler2D u_sketchTexture;uniform vec2 u_gridCellDimensions;uniform vec2 u_brightnessRange;varying vec2 v_uv;void main(){vec2 cellCenter=(floor(v_uv*u_gridCellDimensions)+vec2(0.5))/u_gridCellDimensions;vec4 color=texture2D(u_sketchTexture,cellCenter);float brightness=dot(color.rgb,vec3(0.299,0.587,0.114));float brightnessValue=brightness*255.0;if(brightnessValue>=u_brightnessRange.x&&brightnessValue<=u_brightnessRange.y){gl_FragColor=color;}else{gl_FragColor=vec4(0.0);}}",dA="precision lowp float;uniform sampler2D u_sampleTexture;uniform vec4 u_fillColor;uniform bool u_useFixedColor;varying vec2 v_uv;void main(){vec4 sampleColor=texture2D(u_sampleTexture,v_uv);if(sampleColor.a>0.0){if(u_useFixedColor){gl_FragColor=u_fillColor;}else{gl_FragColor=sampleColor;}}else{gl_FragColor=vec4(0.0);}}",CA="precision lowp float;uniform sampler2D u_sampleTexture;uniform bool u_invert;uniform bool u_flipHorizontally;uniform bool u_flipVertically;varying vec2 v_uv;void main(){vec4 sampleColor=texture2D(u_sampleTexture,v_uv);if(sampleColor.a>0.0){float invertValue=u_invert ? 1.0 : 0.0;float flipHValue=u_flipHorizontally ? 1.0 : 0.0;float flipVValue=u_flipVertically ? 1.0 : 0.0;gl_FragColor=vec4(invertValue,flipHValue,flipVValue,1.0);}else{gl_FragColor=vec4(0.0);}}",fA="precision lowp float;uniform sampler2D u_sampleTexture;uniform vec4 u_rotationColor;varying vec2 v_uv;void main(){vec4 sampleColor=texture2D(u_sampleTexture,v_uv);if(sampleColor.a>0.0){gl_FragColor=u_rotationColor;}else{gl_FragColor=vec4(0.0);}}",DA="precision lowp float;uniform sampler2D u_colorSampleFramebuffer;uniform sampler2D u_charPaletteTexture;uniform vec2 u_charPaletteSize;uniform vec2 u_brightnessRange;varying vec2 v_uv;void main(){vec4 color=texture2D(u_colorSampleFramebuffer,v_uv);if(color.a==0.0){gl_FragColor=vec4(0.0);return;}float brightness=dot(color.rgb,vec3(0.299,0.587,0.114))*255.0;vec2 range=u_brightnessRange;if(brightness<range.x||brightness>range.y){gl_FragColor=vec4(0.0);return;}float t=(brightness-range.x)/(range.y-range.x);float idx=clamp(floor(t*u_charPaletteSize.x),0.0,u_charPaletteSize.x-1.0);vec3 charColor=texture2D(u_charPaletteTexture,vec2((idx+0.5)/u_charPaletteSize.x,0.0)).rgb;gl_FragColor=vec4(charColor,1.0);}";const mA={enabled:!0,characters:" .:-=+*%@#",characterColor:[255,255,255,255],characterColorMode:"sampled",cellColor:[0,0,0,255],cellColorMode:"fixed",invert:!1,rotation:[0,0,0,255],flipHorizontally:!1,flipVertically:!1,brightnessRange:[0,255]};class k extends Y{constructor(e,t,r){super(e,t,r,{...mA});n(this,"sampleShader");n(this,"colorFillShader");n(this,"charMappingShader");n(this,"transformFillShader");n(this,"rotationFillShader");n(this,"sampleFramebuffer");this.sampleShader=new p(e.context,_,uA),this.colorFillShader=new p(e.context,_,dA),this.transformFillShader=new p(e.context,_,CA),this.rotationFillShader=new p(e.context,_,fA),this.charMappingShader=new p(e.context,_,DA),this.sampleFramebuffer=this.renderer.createFramebuffer(this.grid.cols,this.grid.rows)}convert(e){this.sampleFramebuffer.begin(),this.renderer.clear(),this.renderer.shader(this.sampleShader),this.renderer.setUniform("u_sketchTexture",e),this.renderer.setUniform("u_gridCellDimensions",[this.grid.cols,this.grid.rows]),this.renderer.setUniform("u_brightnessRange",this._options.brightnessRange),this.renderer.rect(0,0,this.grid.cols,this.grid.rows),this.sampleFramebuffer.end(),this._primaryColorFramebuffer.begin(),this.renderer.clear(),this.renderer.shader(this.colorFillShader),this.renderer.setUniform("u_sampleTexture",this.sampleFramebuffer.texture),this.renderer.setUniform("u_fillColor",this._options.characterColor),this.renderer.setUniform("u_useFixedColor",this._options.characterColorMode==="fixed"),this.renderer.rect(0,0,this.grid.cols,this.grid.rows),this._primaryColorFramebuffer.end(),this._secondaryColorFramebuffer.begin(),this.renderer.clear(),this.renderer.shader(this.colorFillShader),this.renderer.setUniform("u_sampleTexture",this.sampleFramebuffer.texture),this.renderer.setUniform("u_fillColor",this._options.cellColor),this.renderer.setUniform("u_useFixedColor",this._options.cellColorMode==="fixed"),this.renderer.rect(0,0,this.grid.cols,this.grid.rows),this._secondaryColorFramebuffer.end(),this._transformFramebuffer.begin(),this.renderer.clear(),this.renderer.shader(this.transformFillShader),this.renderer.setUniform("u_sampleTexture",this.sampleFramebuffer.texture),this.renderer.setUniform("u_invert",this._options.invert),this.renderer.setUniform("u_flipHorizontally",this._options.flipHorizontally),this.renderer.setUniform("u_flipVertically",this._options.flipVertically),this.renderer.rect(0,0,this.grid.cols,this.grid.rows),this._transformFramebuffer.end(),this._rotationFramebuffer.begin(),this.renderer.clear(),this.renderer.shader(this.rotationFillShader),this.renderer.setUniform("u_sampleTexture",this.sampleFramebuffer.texture),this.renderer.setUniform("u_rotationColor",this._options.rotation),this.renderer.rect(0,0,this.grid.cols,this.grid.rows),this._rotationFramebuffer.end(),this._characterFramebuffer.begin(),this.renderer.clear(0,0,0,0),this.renderer.shader(this.charMappingShader),this.renderer.setUniform("u_colorSampleFramebuffer",this.sampleFramebuffer.texture),this.renderer.setUniform("u_charPaletteTexture",this.palette.texture),this.renderer.setUniform("u_charPaletteSize",[this.palette.colors.length,1]),this.renderer.setUniform("u_brightnessRange",this._options.brightnessRange),this.renderer.rect(0,0,this.grid.cols,this.grid.rows),this._characterFramebuffer.end()}resize(){super.resize(),this.sampleFramebuffer.resize(this.grid.cols,this.grid.rows)}brightnessRange(e){D.validate(Array.isArray(e)&&e.length===2&&e.every(t=>typeof t=="number"&&t>=0&&t<=255),"Brightness range must be an array of two numbers between 0 and 255.",{method:"brightnessRange",providedValue:e})&&(this._options.brightnessRange=e)}}const PA=Object.freeze(Object.defineProperty({__proto__:null,TextmodeBrightnessConverter:k,TextmodeConverter:y,TextmodeFeatureConverter:Y},Symbol.toStringTag,{value:"Module"}));var IA="precision mediump float;uniform sampler2D u_characterTexture;uniform vec2 u_charsetDimensions;uniform sampler2D u_primaryColorTexture;uniform sampler2D u_secondaryColorTexture;uniform sampler2D u_transformTexture;uniform sampler2D u_asciiCharacterTexture;uniform sampler2D u_rotationTexture;uniform sampler2D u_captureTexture;uniform vec2 u_captureDimensions;uniform int u_backgroundMode;uniform vec2 u_gridCellDimensions;uniform vec2 u_gridPixelDimensions;mat2 rotate2D(float angle){float s=sin(angle);float c=cos(angle);return mat2(c,-s,s,c);}void main(){vec2 adjustedCoord=gl_FragCoord.xy/u_gridPixelDimensions;vec2 gridCoord=adjustedCoord*u_gridCellDimensions;vec2 cellCoord=floor(gridCoord);vec2 charIndexTexCoord=(cellCoord+0.5)/u_gridCellDimensions;vec4 primaryColor=texture2D(u_primaryColorTexture,charIndexTexCoord);vec4 secondaryColor=texture2D(u_secondaryColorTexture,charIndexTexCoord);vec4 transformColor=texture2D(u_transformTexture,charIndexTexCoord);bool isInverted=transformColor.r>0.5;bool flipHorizontal=transformColor.g>0.5;bool flipVertical=transformColor.b>0.5;vec4 encodedIndexVec=texture2D(u_asciiCharacterTexture,charIndexTexCoord);if(encodedIndexVec.a<0.01){gl_FragColor=(u_backgroundMode==0)? vec4(0.0):texture2D(u_captureTexture,gl_FragCoord.xy/u_captureDimensions);return;}int charIndex=int(encodedIndexVec.r*255.0+0.5)+int(encodedIndexVec.g*255.0+0.5)*256;int charCol=int(mod(float(charIndex),u_charsetDimensions.x));int charRow=charIndex/int(u_charsetDimensions.x);vec2 charCoord=vec2(charCol,charRow)/u_charsetDimensions;vec4 rotationColor=texture2D(u_rotationTexture,charIndexTexCoord);float scaledAngle=rotationColor.r*255.0+rotationColor.g;float rotationAngle=(scaledAngle*360.0/255.0)*0.017453292;vec2 fractionalPart=fract(gridCoord)-0.5;if(flipHorizontal)fractionalPart.x=-fractionalPart.x;if(flipVertical)fractionalPart.y=-fractionalPart.y;fractionalPart=rotate2D(rotationAngle)*fractionalPart+0.5;vec2 cellSize=1.0/u_charsetDimensions;vec2 texCoord=charCoord+fractionalPart*cellSize;vec2 cellMax=charCoord+cellSize;if(any(lessThan(texCoord,charCoord))||any(greaterThan(texCoord,cellMax))){gl_FragColor=isInverted ? primaryColor : secondaryColor;return;}vec4 charTexel=texture2D(u_characterTexture,texCoord);if(isInverted)charTexel.rgb=1.0-charTexel.rgb;gl_FragColor=mix(secondaryColor,primaryColor,charTexel);}";class Z{constructor(A,e,t){n(this,"renderer");n(this,"font");n(this,"grid");n(this,"converters");n(this,"_resultFramebuffer");n(this,"_asciiShader");n(this,"_characterFramebuffer");n(this,"_primaryColorFramebuffer");n(this,"_secondaryColorFramebuffer");n(this,"_rotationFramebuffer");n(this,"_transformFramebuffer");this.renderer=A,this.font=e,this.grid=t,this._asciiShader=this.renderer.createShader(_,IA),this.converters=[{name:"brightness",converter:new k(A,e,t)},{name:"custom",converter:new y(A,e,t)}],this._characterFramebuffer=this.renderer.createFramebuffer(t.cols,t.rows),this._primaryColorFramebuffer=this.renderer.createFramebuffer(t.cols,t.rows),this._secondaryColorFramebuffer=this.renderer.createFramebuffer(t.cols,t.rows),this._rotationFramebuffer=this.renderer.createFramebuffer(t.cols,t.rows),this._transformFramebuffer=this.renderer.createFramebuffer(t.cols,t.rows),this._resultFramebuffer=this.renderer.createFramebuffer(this.grid.width,this.grid.height)}render(A){for(const t of this.converters){const r=t.converter;r.options.enabled&&r instanceof Y&&r.convert(A)}const e=(t,r)=>{t.begin(),this.renderer.clear();for(const i of this.converters){const s=i.converter;s.options.enabled&&this.renderer.image(r(s),0,0)}t.end()};e(this._characterFramebuffer,t=>t.characterFramebuffer),e(this._primaryColorFramebuffer,t=>t.primaryColorFramebuffer),e(this._secondaryColorFramebuffer,t=>t.secondaryColorFramebuffer),e(this._rotationFramebuffer,t=>t.rotationFramebuffer),e(this._transformFramebuffer,t=>t.transformFramebuffer),this._resultFramebuffer.begin(),this.renderer.clear(),this.renderer.shader(this._asciiShader),this.renderer.setUniform("u_characterTexture",this.font.fontFramebuffer),this.renderer.setUniform("u_charsetDimensions",[this.font.textureColumns,this.font.textureRows]),this.renderer.setUniform("u_asciiCharacterTexture",this._characterFramebuffer.texture),this.renderer.setUniform("u_primaryColorTexture",this._primaryColorFramebuffer.texture),this.renderer.setUniform("u_secondaryColorTexture",this._secondaryColorFramebuffer.texture),this.renderer.setUniform("u_transformTexture",this._transformFramebuffer.texture),this.renderer.setUniform("u_rotationTexture",this._rotationFramebuffer.texture),this.renderer.setUniform("u_captureTexture",A.texture),this.renderer.setUniform("u_backgroundMode",!1),this.renderer.setUniform("u_captureDimensions",[A.width,A.height]),this.renderer.setUniform("u_gridCellDimensions",[this.grid.cols,this.grid.rows]),this.renderer.setUniform("u_gridPixelDimensions",[this.grid.width,this.grid.height]),this.renderer.rect(0,0,this._resultFramebuffer.width,this._resultFramebuffer.height),this._resultFramebuffer.end()}get(A){if(!D.validate(typeof A=="string"&&A.length>0,"Converter name must be a non-empty string.",{method:"converter",providedValue:A}))return;const e=this.converters.find(r=>r.name===A),t=e==null?void 0:e.converter;if(D.validate(t instanceof y,`Converter "${A}" is not a valid TextmodeConverter.`,{method:"converter",providedValue:A,converterInstance:t}))return t}add(A,e){if(!D.validate(typeof A=="string"&&A.length>0,"Converter name must be a non-empty string.",{method:"add",providedValue:A})||!D.validate(e==="brightness"||e==="custom",`Converter type must be either "brightness" or "custom". Provided: ${e}`,{method:"add",providedValue:e}))return;let t;return e==="brightness"?t=new k(this.renderer,this.font,this.grid):t=new y(this.renderer,this.font,this.grid),this.converters.push({name:A,converter:t}),t}remove(A){if(!D.validate(typeof A=="string"||A instanceof y,"Parameter must be either a string (converter name) or a TextmodeConverter instance.",{method:"remove",providedValue:A}))return;let e=-1;if(typeof A=="string"){if(!D.validate(A.length>0,"Converter name must be a non-empty string.",{method:"remove",providedValue:A}))return;e=this.converters.findIndex(t=>t.name===A)}else e=this.converters.findIndex(t=>t.converter===A);D.validate(e!==-1,typeof A=="string"?`Converter with name "${A}" not found in pipeline.`:"Converter instance not found in pipeline.",{method:"remove",providedValue:A,convertersCount:this.converters.length})&&this.converters.splice(e,1)}get texture(){return this._resultFramebuffer}resize(){this._resultFramebuffer.resize(this.grid.width,this.grid.height),this._characterFramebuffer.resize(this.grid.cols,this.grid.rows),this._primaryColorFramebuffer.resize(this.grid.cols,this.grid.rows),this._secondaryColorFramebuffer.resize(this.grid.cols,this.grid.rows),this._rotationFramebuffer.resize(this.grid.cols,this.grid.rows),this._transformFramebuffer.resize(this.grid.cols,this.grid.rows);for(const A of this.converters)A.converter.resize()}hasEnabledConverters(){return this.converters.some(A=>A.converter.options.enabled)}disable(){for(const A of this.converters)A.converter.disable()}enable(){for(const A of this.converters)A.converter.enable()}get characterFramebuffer(){return this._characterFramebuffer}get primaryColorFramebuffer(){return this._primaryColorFramebuffer}get secondaryColorFramebuffer(){return this._secondaryColorFramebuffer}get rotationFramebuffer(){return this._rotationFramebuffer}get transformFramebuffer(){return this._transformFramebuffer}}class V{extractFramebufferData(A){const e=A.get("brightness"),t=e==null?void 0:e.characterFramebuffer,r=e==null?void 0:e.primaryColorFramebuffer,i=e==null?void 0:e.secondaryColorFramebuffer,s=e==null?void 0:e.transformFramebuffer,o=e==null?void 0:e.rotationFramebuffer;return t==null||t.loadPixels(),r==null||r.loadPixels(),i==null||i.loadPixels(),s==null||s.loadPixels(),o==null||o.loadPixels(),{characterPixels:(t==null?void 0:t.pixels)||new Uint8Array(0),primaryColorPixels:(r==null?void 0:r.pixels)||new Uint8Array(0),secondaryColorPixels:(i==null?void 0:i.pixels)||new Uint8Array(0),transformPixels:(s==null?void 0:s.pixels)||new Uint8Array(0),rotationPixels:(o==null?void 0:o.pixels)||new Uint8Array(0)}}getCharacterIndex(A,e){const t=A[e],r=A[e+1];return t+(r<<8)}pixelsToRGBA(A,e){return{r:A[e],g:A[e+1],b:A[e+2],a:A[e+3]}}}class O{createBlob(A,e){return new Blob([A],{type:e})}downloadFile(A,e,t){try{const r=this.createBlob(A,t),i=URL.createObjectURL(r),s=document.createElement("a");s.href=i,s.download=e,s.style.display="none",s.rel="noopener",document.body.appendChild(s),s.click(),document.body.removeChild(s),URL.revokeObjectURL(i)}catch(r){throw console.error("Failed to download file:",r),new Error(`File download failed: ${r instanceof Error?r.message:"Unknown error"}`)}}generateTimestamp(){return new Date().toISOString().slice(0,19).replace(/:/g,"-")}generateDateTimeString(){const A=new Date,e=A.toISOString().split("T")[0],t=A.toTimeString().split(" ")[0].replace(/:/g,"-");return{date:e,time:t}}sanitizeFilename(A){return A.replace(/[<>:"/\\|?*]/g,"_").replace(/\s+/g,"_").replace(/_{2,}/g,"_").replace(/^_+|_+$/g,"").substring(0,255)}generateDefaultFilename(){return`'textmode-export'-${this.generateTimestamp()}`}}class wA extends V{extractTransformData(A,e,t){const r=A[t],i=A[t+1],s=A[t+2],o=r===255,g=i===255,B=s===255,E=e[t],Q=e[t+1],l=E+Q/255,c=Math.round(l*360/255*100)/100;return{isInverted:o,flipHorizontal:g,flipVertical:B,rotation:c}}calculateCellPosition(A,e,t){return{x:A,y:e,cellX:A*t.cellWidth,cellY:e*t.cellHeight}}extractSVGCellData(A,e){const t=[];let r=0;for(let i=0;i<e.rows;i++)for(let s=0;s<e.cols;s++){const o=r*4,g=this.getCharacterIndex(A.characterPixels,o);let B=this.pixelsToRGBA(A.primaryColorPixels,o),E=this.pixelsToRGBA(A.secondaryColorPixels,o);const Q=this.extractTransformData(A.transformPixels,A.rotationPixels,o);if(Q.isInverted){const c=B;B=E,E=c}const l=this.calculateCellPosition(s,i,e);t.push({charIndex:g,primaryColor:B,secondaryColor:E,transform:Q,position:l}),r++}return t}}class pA{getGlyphIndex(A,e){const t=A.cmap;if(!t||!t.tables)return 0;for(const r of t.tables)if(r.format===4){for(let i=0;i<r.startCount.length;i++)if(e>=r.startCount[i]&&e<=r.endCount[i]){if(r.idRangeOffset[i]===0)return e+r.idDelta[i]&65535;{const s=r.idRangeOffset[i]/2+(e-r.startCount[i])-(r.startCount.length-i);if(s>=0&&s<r.glyphIdArray.length){const o=r.glyphIdArray[s];if(o!==0)return o+r.idDelta[i]&65535}}}}return 0}createEmptyPath(){return{getBoundingBox:()=>({x1:0,y1:0,x2:0,y2:0}),toSVG:()=>""}}createGlyphPath(A,e,t,r,i){if(!e||!e.xs||e.xs.length===0)return this.createEmptyPath();const s=i/A.head.unitsPerEm;return{getBoundingBox:()=>({x1:t+e.xMin*s,y1:r+-e.yMax*s,x2:t+e.xMax*s,y2:r+-e.yMin*s}),toSVG:()=>this.glyphToSVGPath(e,t,r,s)}}glyphToSVGPath(A,e,t,r){if(!A||!A.xs)return"";const{xs:i,ys:s,endPts:o,flags:g}=A;if(!i||!s||!o||!g)return"";let B="",E=0;for(let Q=0;Q<o.length;Q++){const l=o[Q];if(!(l<E)){if(l>=E){const c=e+i[E]*r,d=t-s[E]*r;B+=`M${c.toFixed(2)},${d.toFixed(2)}`;let u=E+1;for(;u<=l;)if((g[u]&1)!==0){const I=e+i[u]*r,m=t-s[u]*r;B+=`L${I.toFixed(2)},${m.toFixed(2)}`,u++}else{const I=e+i[u]*r,m=t-s[u]*r;let w=u+1>l?E:u+1;if((g[w]&1)!==0){const F=e+i[w]*r,v=t-s[w]*r;B+=`Q${I.toFixed(2)},${m.toFixed(2)} ${F.toFixed(2)},${v.toFixed(2)}`,u=w+1}else{const F=e+i[w]*r,v=t-s[w]*r,H=(I+F)/2,R=(m+v)/2;B+=`Q${I.toFixed(2)},${m.toFixed(2)} ${H.toFixed(2)},${R.toFixed(2)}`,u=w}}B+="Z"}E=l+1}}return B}generateCharacterPath(A,e,t,r,i){try{const s=A.codePointAt(0)||0,o=this.getGlyphIndex(e,s);if(o===0)return this.createEmptyPath();let g=null;try{e.glyf&&e.glyf[o]!==null?g=e.glyf[o]:h&&h.T&&h.T.glyf&&h.T.glyf._parseGlyf&&(g=h.T.glyf._parseGlyf(e,o),e.glyf&&g&&(e.glyf[o]=g))}catch(B){console.warn(`Failed to parse glyph ${o}:`,B)}return g?this.createGlyphPath(e,g,t,r,i):this.createEmptyPath()}catch(s){return console.warn(`Failed to generate path for character "${A}":`,s),this.createEmptyPath()}}generatePositionedCharacterPath(A,e,t,r,i,s,o,g){try{const B=o/e.head.unitsPerEm,E=g*B,Q=t+(i-E)/2,l=r+(s+o*.7)/2;return this.generateCharacterPath(A,e,Q,l,o).toSVG()||null}catch(B){return console.warn(`Failed to generate positioned character path for "${A}":`,B),null}}}class _A{constructor(){n(this,"pathGenerator");this.pathGenerator=new pA}generateSVGHeader(A){return`<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
8
|
+
`;class EA{extractCharacters(A){var t;const e=[];return(t=A==null?void 0:A.cmap)!=null&&t.tables?(A.cmap.tables.forEach(r=>{if(r.format===4){const i=this._extractCharactersFromFormat4Table(r);e.push(...i)}else if(r.format===12){const i=this._extractCharactersFromFormat12Table(r);e.push(...i)}}),[...new Set(e)]):[]}_extractCharactersFromFormat4Table(A){const e=[];if(!A.startCount||!A.endCount||!A.idRangeOffset||!A.idDelta)return e;for(let t=0;t<A.startCount.length;t++){const r=A.startCount[t],i=A.endCount[t];if(!(r===65535&&i===65535)){for(let s=r;s<=i;s++)if(this._calculateGlyphIndexFormat4(A,s,t)>0){const g=String.fromCodePoint(s);e.push(g)}}}return e}_extractCharactersFromFormat12Table(A){const e=[];if(!A.groups)return e;for(let t=0;t<A.groups.length;t+=3){const r=A.groups[t],i=A.groups[t+1],s=A.groups[t+2];for(let o=r;o<=i;o++)if(s+(o-r)>0){const B=String.fromCodePoint(o);e.push(B)}}return e}_calculateGlyphIndexFormat4(A,e,t){if(A.idRangeOffset[t]===0)return e+A.idDelta[t]&65535;{const r=A.idRangeOffset[t]/2+(e-A.startCount[t])-(A.startCount.length-t);if(r>=0&&A.glyphIdArray&&r<A.glyphIdArray.length){const i=A.glyphIdArray[r];if(i!==0)return i+A.idDelta[t]&65535}}return 0}filterProblematicCharacters(A){return A.filter(e=>this._isValidCharacter(e))}_isValidCharacter(A){const e=A.codePointAt(0)||0;return!(e>=0&&e<=31&&e!==9&&e!==10&&e!==13||e>=127&&e<=159)}}class QA{constructor(A){n(this,"_textureCanvas");n(this,"_textureContext");n(this,"_renderer");this._renderer=A,this._textureCanvas=document.createElement("canvas"),this._textureContext=this._textureCanvas.getContext("2d",{willReadFrequently:!0,alpha:!1})}createTextureAtlas(A,e,t,r){const i=A.length,s=Math.ceil(Math.sqrt(i)),o=Math.ceil(i/s),g=e.width*s,B=e.height*o;this._setupCanvas(g,B,t,r),this._renderCharactersToCanvas(A,e,s,t),this._applyBlackWhiteThreshold();const E=this._renderer.createFramebuffer(g,B,{filter:"nearest"});return E.update(this._textureCanvas),{framebuffer:E,columns:s,rows:o}}_setupCanvas(A,e,t,r){this._textureCanvas.width=A,this._textureCanvas.height=e,this._textureCanvas.style.width=A+"px",this._textureCanvas.style.height=A+"px",this._textureContext.imageSmoothingEnabled=!1,this._textureCanvas.style.imageRendering="pixelated",this._textureContext.fillStyle="black",this._textureContext.fillRect(0,0,A,e),this._textureContext.font=`${t}px ${r}`,this._textureContext.textBaseline="top",this._textureContext.textAlign="left",this._textureContext.fillStyle="white"}_renderCharactersToCanvas(A,e,t,r){for(let i=0;i<A.length;i++){const s=i%t,o=Math.floor(i/t),g=s*e.width+e.width*.5,B=o*e.height+e.height*.5,E=Math.round(g-e.width*.5),Q=Math.round(B-r*.5);this._textureContext.fillText(A[i].character,E,Q)}}_applyBlackWhiteThreshold(A=128){const e=this._textureContext.getImageData(0,0,this._textureCanvas.width,this._textureCanvas.height),t=e.data;for(let r=0;r<t.length;r+=4){const i=.299*t[r]+.587*t[r+1]+.114*t[r+2],s=A+32,o=i>s?255:0;t[r]=o,t[r+1]=o,t[r+2]=o}this._textureContext.putImageData(e,0,0)}}class lA{constructor(){n(this,"_tempCanvas");n(this,"_tempContext");this._tempCanvas=document.createElement("canvas"),this._tempContext=this._tempCanvas.getContext("2d")}calculateMaxGlyphDimensions(A,e,t){this._tempContext.font=`${e}px ${t}`;let r=0,i=0;for(const s of A){const o=this._tempContext.measureText(s),g=o.width,B=o.actualBoundingBoxAscent+o.actualBoundingBoxDescent;g>0&&(r=Math.max(r,g),i=Math.max(i,B))}return{width:Math.ceil(r),height:Math.ceil(i)}}}class hA{createCharacterObjects(A,e){return A.map((t,r)=>{const i=t.codePointAt(0)||0,s=this._generateCharacterColor(r);let o=0;if(e.hmtx&&e.hmtx.aWidth){const g=this._getGlyphIndex(e,i);g>0&&e.hmtx.aWidth[g]!==void 0&&(o=e.hmtx.aWidth[g])}return{character:t,unicode:i,color:s,advanceWidth:o}})}_getGlyphIndex(A,e){const t=A.cmap;if(!t||!t.tables)return 0;for(const r of t.tables)if(r.format===4){for(let i=0;i<r.startCount.length;i++)if(e>=r.startCount[i]&&e<=r.endCount[i]){if(r.idRangeOffset[i]===0)return e+r.idDelta[i]&65535;{const s=r.idRangeOffset[i]/2+(e-r.startCount[i])-(r.startCount.length-i);if(s>=0&&s<r.glyphIdArray.length){const o=r.glyphIdArray[s];if(o!==0)return o+r.idDelta[i]&65535}}}}return 0}_generateCharacterColor(A){const e=A%256,t=Math.floor(A/256)%256,r=Math.floor(A/65536)%256;return[e,t,r]}getCharacterColor(A,e){if(!D.validate(typeof A=="string"&&A.length===1,"Character must be a single character string.",{method:"getCharacterColor",providedValue:A}))return[0,0,0];const t=e.find(r=>r.character===A);return t?t.color:[0,0,0]}getCharacterColors(A,e){return D.validate(typeof A=="string"&&A.length>0,"Characters must be a string with at least one character.",{method:"getCharacterColors",providedValue:A})?A.split("").map(t=>this.getCharacterColor(t,e)||[0,0,0]):[[0,0,0]]}}class J{constructor(A,e=16){n(this,"_font");n(this,"_characters",[]);n(this,"_fontFramebuffer");n(this,"_fontSize",16);n(this,"_textureColumns",0);n(this,"_textureRows",0);n(this,"_maxGlyphDimensions",{width:0,height:0});n(this,"_fontFace");n(this,"_fontFamilyName","UrsaFont");n(this,"_characterExtractor");n(this,"_textureAtlas");n(this,"_metricsCalculator");n(this,"_characterColorMapper");this._fontSize=e,this._characterExtractor=new EA,this._textureAtlas=new QA(A),this._metricsCalculator=new lA,this._characterColorMapper=new hA}async initialize(A){let e;if(A){const t=await fetch(A);if(!t.ok)throw new C(`Failed to load font file: ${t.status} ${t.statusText}`);e=await t.arrayBuffer()}else e=await(await fetch(BA)).arrayBuffer();await this._loadFontFace(e),this._font=h.parse(e)[0],await this._initializeFont()}setFontSize(A){if(A===void 0)return this._fontSize;this._fontSize=A,this._maxGlyphDimensions=this._metricsCalculator.calculateMaxGlyphDimensions(this._characters.map(t=>t.character),this._fontSize,this._fontFamilyName);const e=this._textureAtlas.createTextureAtlas(this._characters,this._maxGlyphDimensions,this._fontSize,this._fontFamilyName);this._fontFramebuffer=e.framebuffer,this._textureColumns=e.columns,this._textureRows=e.rows}async loadFont(A){try{const e=await fetch(A);if(!e.ok)throw new C(`Failed to load font file: ${e.status} ${e.statusText}`);const t=await e.arrayBuffer();await this._loadFontFace(t);const r=h.parse(t);if(!r||r.length===0)throw new Error("Failed to parse font file");this._font=r[0],await this._initializeFont()}catch(e){throw new C(`Failed to load font: ${e instanceof Error?e.message:"Unknown error"}`,e)}}async _loadFontFace(A){const e=Date.now();this._fontFamilyName=this._fontFamilyName==="UrsaFont"?"UrsaFont":`CustomFont_${e}`,this._fontFace=new FontFace(this._fontFamilyName,A),await this._fontFace.load(),document.fonts.add(this._fontFace)}async _initializeFont(){const A=this._characterExtractor.extractCharacters(this._font),e=this._characterExtractor.filterProblematicCharacters(A);this._characters=this._characterColorMapper.createCharacterObjects(e,this._font),this._maxGlyphDimensions=this._metricsCalculator.calculateMaxGlyphDimensions(e,this._fontSize,this._fontFamilyName);const t=this._textureAtlas.createTextureAtlas(this._characters,this._maxGlyphDimensions,this._fontSize,this._fontFamilyName);this._fontFramebuffer=t.framebuffer,this._textureColumns=t.columns,this._textureRows=t.rows}getCharacterColor(A){return this._characterColorMapper.getCharacterColor(A,this._characters)}getCharacterColors(A){return this._characterColorMapper.getCharacterColors(A,this._characters)}hasAllCharacters(A){if(typeof A!="string"||A.length===0)return!1;const e=new Set(this._characters.map(t=>t.character));for(const t of A)if(!e.has(t))return!1;return!0}get fontFramebuffer(){return this._fontFramebuffer}get characters(){return this._characters}get textureColumns(){return this._textureColumns}get textureRows(){return this._textureRows}get maxGlyphDimensions(){return this._maxGlyphDimensions}get fontSize(){return this._fontSize}get font(){return this._font}}class K{constructor(A,e,t){n(this,"_cols");n(this,"_rows");n(this,"_width");n(this,"_height");n(this,"_offsetX");n(this,"_offsetY");n(this,"_fixedDimensions",!1);n(this,"_canvas");n(this,"_cellWidth");n(this,"_cellHeight");this._canvas=A,this._cellWidth=e,this._cellHeight=t,this.reset()}reset(){if(!this._fixedDimensions){const A=this._canvas.getBoundingClientRect();let e=Math.round(A.width),t=Math.round(A.height);[this._cols,this._rows]=[Math.floor(e/this._cellWidth),Math.floor(t/this._cellHeight)]}this._resizeGrid()}_resizeGrid(){const A=this._canvas.getBoundingClientRect();let e=Math.round(A.width),t=Math.round(A.height);this._width=this._cols*this._cellWidth,this._height=this._rows*this._cellHeight,this._offsetX=Math.floor((e-this._width)/2),this._offsetY=Math.floor((t-this._height)/2)}resizeCellPixelDimensions(A,e){[this._cellWidth,this._cellHeight]=[A,e],this.reset()}resizeGridDimensions(A,e){this._fixedDimensions=!0,[this._cols,this._rows]=[A,e],this._resizeGrid()}resetGridDimensions(){this._fixedDimensions=!1,this.reset()}resize(){this._fixedDimensions?this._resizeGrid():this.reset()}fixedDimensions(A){if(A===void 0)return this._fixedDimensions;this._fixedDimensions=A}get cellWidth(){return this._cellWidth}get cellHeight(){return this._cellHeight}get cols(){return this._cols}get rows(){return this._rows}get width(){return this._width}get height(){return this._height}get offsetX(){return this._offsetX}get offsetY(){return this._offsetY}}class j{constructor(A,e=!1,t={}){n(this,"_canvas");n(this,"captureSource");n(this,"_isStandalone");this.captureSource=A,this._isStandalone=e,this._canvas=this.createCanvas(t.width,t.height)}createCanvas(A,e){var r;const t=document.createElement("canvas");if(t.className="textmodeCanvas",this._isStandalone)t.width=A||800,t.height=e||600,document.body.appendChild(t);else{const i=this.captureSource.getBoundingClientRect();let s=Math.round(i.width),o=Math.round(i.height);if(this.captureSource instanceof HTMLVideoElement){const E=this.captureSource;(s===0||o===0)&&E.videoWidth>0&&E.videoHeight>0&&(s=E.videoWidth,o=E.videoHeight)}t.width=s,t.height=o,t.style.position="absolute",t.style.pointerEvents="none";const g=window.getComputedStyle(this.captureSource);let B=parseInt(g.zIndex||"0",10);isNaN(B)&&(B=0),t.style.zIndex=(B+1).toString(),this.positionOverlayCanvas(t),(r=this.captureSource.parentNode)==null||r.insertBefore(t,this.captureSource.nextSibling)}return t}positionOverlayCanvas(A){const e=this.captureSource.getBoundingClientRect();let t=this.captureSource.offsetParent;if(t&&t!==document.body){const r=t.getBoundingClientRect();A.style.top=e.top-r.top+"px",A.style.left=e.left-r.left+"px"}else A.style.top=e.top+window.scrollY+"px",A.style.left=e.left+window.scrollX+"px"}resize(A,e){if(this._isStandalone)this._canvas.width=A??this._canvas.width,this._canvas.height=e??this._canvas.height;else{const t=this.captureSource.getBoundingClientRect();let r=Math.round(t.width),i=Math.round(t.height);if(this.captureSource instanceof HTMLVideoElement){const s=this.captureSource;(r===0||i===0)&&s.videoWidth>0&&s.videoHeight>0&&(r=s.videoWidth,i=s.videoHeight)}this._canvas.width=r,this._canvas.height=i,this.positionOverlayCanvas(this._canvas)}}getWebGLContext(){const A={alpha:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!0,antialias:!1,depth:!1,stencil:!1,powerPreference:"high-performance"},e=this._canvas.getContext("webgl2",A)||this._canvas.getContext("webgl",A);if(!e)throw new C("WebGL context could not be created. Ensure your browser supports WebGL.");return e}get canvas(){return this._canvas}get width(){return this._canvas.width}get height(){return this._canvas.height}}class y{constructor(A,e,t,r={}){n(this,"renderer");n(this,"fontManager");n(this,"grid");n(this,"_characterFramebuffer");n(this,"_primaryColorFramebuffer");n(this,"_secondaryColorFramebuffer");n(this,"_rotationFramebuffer");n(this,"_transformFramebuffer");n(this,"_options");this.renderer=A,this.fontManager=e,this.grid=t,this._options=r,this._characterFramebuffer=this.renderer.createFramebuffer(this.grid.cols,this.grid.rows),this._primaryColorFramebuffer=this.renderer.createFramebuffer(this.grid.cols,this.grid.rows),this._secondaryColorFramebuffer=this.renderer.createFramebuffer(this.grid.cols,this.grid.rows),this._rotationFramebuffer=this.renderer.createFramebuffer(this.grid.cols,this.grid.rows),this._transformFramebuffer=this.renderer.createFramebuffer(this.grid.cols,this.grid.rows)}resize(){this._characterFramebuffer.resize(this.grid.cols,this.grid.rows),this._primaryColorFramebuffer.resize(this.grid.cols,this.grid.rows),this._secondaryColorFramebuffer.resize(this.grid.cols,this.grid.rows),this._rotationFramebuffer.resize(this.grid.cols,this.grid.rows),this._transformFramebuffer.resize(this.grid.cols,this.grid.rows)}enabled(A){this._options.enabled=A}enable(){this.enabled(!0)}disable(){this.enabled(!1)}get characterFramebuffer(){return this._characterFramebuffer}get primaryColorFramebuffer(){return this._primaryColorFramebuffer}get secondaryColorFramebuffer(){return this._secondaryColorFramebuffer}get rotationFramebuffer(){return this._rotationFramebuffer}get transformFramebuffer(){return this._transformFramebuffer}get options(){return this._options}}class cA{constructor(A,e){n(this,"_framebuffer");n(this,"_renderer");n(this,"_colors");this._renderer=A,this._colors=e;const t=Math.max(this._colors.length,1);this._framebuffer=this._renderer.createFramebuffer(t,1),this._updateFramebuffer()}_updateFramebuffer(){if(!this._framebuffer)return;const A=Math.max(this._colors.length,1),e=1;this._framebuffer.width!==A&&this._framebuffer.resize(A,e);const t=new Uint8Array(A*e*4);for(let r=0;r<A;r++){const i=r<this._colors.length?this._colors[r]:[0,0,0],s=r*4;t[s]=i[0],t[s+1]=i[1],t[s+2]=i[2],t[s+3]=255}this._framebuffer.updatePixels(t,A,e)}setColors(A){this._colors=A,this._updateFramebuffer()}get colors(){return this._colors}get framebuffer(){return this._framebuffer}get texture(){return this._framebuffer.texture}}class Y extends y{constructor(e,t,r,i={}){super(e,t,r,i);n(this,"palette");this.palette=new cA(this.renderer,this.fontManager.getCharacterColors(" .:-=+*%@#"))}characters(e){D.validate(this.fontManager.hasAllCharacters(e),"One or more characters do not exist in the current font.",{method:"characters",providedValue:e})&&(this._options.characters=e,this.palette.setColors(this.fontManager.getCharacterColors(e)))}characterColor(e,t=e,r=e,i=255){D.validate([e,t,r,i].every(s=>s>=0&&s<=255),"Character color values must be between 0 and 255",{method:"characterColor",providedValues:{r:e,g:t,b:r,a:i}})&&(this._options.characterColor=[e,t,r,i])}characterColorMode(e){D.validate(["sampled","fixed"].includes(e),"Invalid character color mode. Must be 'sampled' or 'fixed'.",{method:"characterColorMode",providedValue:e})&&(this._options.characterColorMode=e)}cellColor(e,t=e,r=e,i=255){D.validate([e,t,r,i].every(s=>s>=0&&s<=255),"Cell color values must be between 0 and 255",{method:"cellColor",providedValues:{r:e,g:t,b:r,a:i}})&&(this._options.cellColor=[e,t,r,i])}cellColorMode(e){D.validate(["sampled","fixed"].includes(e),"Invalid cell color mode. Must be 'sampled' or 'fixed'.",{method:"cellColorMode",providedValue:e})&&(this._options.cellColorMode=e)}invert(e){D.validate(typeof e=="boolean"||typeof e=="number"&&Number.isInteger(e),"Invert must be a boolean value or an integer (0 for false, any other number for true).",{method:"invert",providedValue:e})&&(this._options.invert=!!e)}rotation(e){if(!D.validate(typeof e=="number","Rotation angle must be a number.",{method:"rotation",providedValue:e}))return;e=e%360,e<0&&(e+=360);const t=e*255/360,r=Math.floor(t)/255,i=Math.round(t-r);this._options.rotation=[r,i,0,1]}flipHorizontally(e){D.validate(typeof e=="boolean"||typeof e=="number"&&Number.isInteger(e),"Flip horizontally must be a boolean value or an integer (0 for false, any other number for true).",{method:"flipHorizontally",providedValue:e})&&(this._options.flipHorizontally=!!e)}flipVertically(e){D.validate(typeof e=="boolean"||typeof e=="number"&&Number.isInteger(e),"Flip vertically must be a boolean value or an integer (0 for false, any other number for true).",{method:"flipVertically",providedValue:e})&&(this._options.flipVertically=!!e)}}var uA="precision lowp float;uniform sampler2D u_sketchTexture;uniform vec2 u_gridCellDimensions;uniform vec2 u_brightnessRange;varying vec2 v_uv;void main(){vec2 cellCenter=(floor(v_uv*u_gridCellDimensions)+vec2(0.5))/u_gridCellDimensions;vec4 color=texture2D(u_sketchTexture,cellCenter);float brightness=dot(color.rgb,vec3(0.299,0.587,0.114));float brightnessValue=brightness*255.0;if(brightnessValue>=u_brightnessRange.x&&brightnessValue<=u_brightnessRange.y){gl_FragColor=color;}else{gl_FragColor=vec4(0.0);}}",dA="precision lowp float;uniform sampler2D u_sampleTexture;uniform vec4 u_fillColor;uniform bool u_useFixedColor;varying vec2 v_uv;void main(){vec4 sampleColor=texture2D(u_sampleTexture,v_uv);if(sampleColor.a>0.0){if(u_useFixedColor){gl_FragColor=u_fillColor;}else{gl_FragColor=sampleColor;}}else{gl_FragColor=vec4(0.0);}}",CA="precision lowp float;uniform sampler2D u_sampleTexture;uniform bool u_invert;uniform bool u_flipHorizontally;uniform bool u_flipVertically;varying vec2 v_uv;void main(){vec4 sampleColor=texture2D(u_sampleTexture,v_uv);if(sampleColor.a>0.0){float invertValue=u_invert ? 1.0 : 0.0;float flipHValue=u_flipHorizontally ? 1.0 : 0.0;float flipVValue=u_flipVertically ? 1.0 : 0.0;gl_FragColor=vec4(invertValue,flipHValue,flipVValue,1.0);}else{gl_FragColor=vec4(0.0);}}",fA="precision lowp float;uniform sampler2D u_sampleTexture;uniform vec4 u_rotationColor;varying vec2 v_uv;void main(){vec4 sampleColor=texture2D(u_sampleTexture,v_uv);if(sampleColor.a>0.0){gl_FragColor=u_rotationColor;}else{gl_FragColor=vec4(0.0);}}",DA="precision lowp float;uniform sampler2D u_colorSampleFramebuffer;uniform sampler2D u_charPaletteTexture;uniform vec2 u_charPaletteSize;uniform vec2 u_brightnessRange;varying vec2 v_uv;void main(){vec4 color=texture2D(u_colorSampleFramebuffer,v_uv);if(color.a==0.0){gl_FragColor=vec4(0.0);return;}float brightness=dot(color.rgb,vec3(0.299,0.587,0.114))*255.0;vec2 range=u_brightnessRange;if(brightness<range.x||brightness>range.y){gl_FragColor=vec4(0.0);return;}float t=(brightness-range.x)/(range.y-range.x);float idx=clamp(floor(t*u_charPaletteSize.x),0.0,u_charPaletteSize.x-1.0);vec3 charColor=texture2D(u_charPaletteTexture,vec2((idx+0.5)/u_charPaletteSize.x,0.0)).rgb;gl_FragColor=vec4(charColor,1.0);}";const mA={enabled:!0,characters:" .:-=+*%@#",characterColor:[255,255,255,255],characterColorMode:"sampled",cellColor:[0,0,0,255],cellColorMode:"fixed",invert:!1,rotation:[0,0,0,255],flipHorizontally:!1,flipVertically:!1,brightnessRange:[0,255]};class k extends Y{constructor(e,t,r){super(e,t,r,{...mA});n(this,"sampleShader");n(this,"colorFillShader");n(this,"charMappingShader");n(this,"transformFillShader");n(this,"rotationFillShader");n(this,"sampleFramebuffer");this.sampleShader=new p(e.context,_,uA),this.colorFillShader=new p(e.context,_,dA),this.transformFillShader=new p(e.context,_,CA),this.rotationFillShader=new p(e.context,_,fA),this.charMappingShader=new p(e.context,_,DA),this.sampleFramebuffer=this.renderer.createFramebuffer(this.grid.cols,this.grid.rows)}convert(e){this.sampleFramebuffer.begin(),this.renderer.clear(),this.renderer.shader(this.sampleShader),this.renderer.setUniform("u_sketchTexture",e),this.renderer.setUniform("u_gridCellDimensions",[this.grid.cols,this.grid.rows]),this.renderer.setUniform("u_brightnessRange",this._options.brightnessRange),this.renderer.rect(0,0,this.grid.cols,this.grid.rows),this.sampleFramebuffer.end(),this._primaryColorFramebuffer.begin(),this.renderer.clear(),this.renderer.shader(this.colorFillShader),this.renderer.setUniform("u_sampleTexture",this.sampleFramebuffer.texture),this.renderer.setUniform("u_fillColor",this._options.characterColor),this.renderer.setUniform("u_useFixedColor",this._options.characterColorMode==="fixed"),this.renderer.rect(0,0,this.grid.cols,this.grid.rows),this._primaryColorFramebuffer.end(),this._secondaryColorFramebuffer.begin(),this.renderer.clear(),this.renderer.shader(this.colorFillShader),this.renderer.setUniform("u_sampleTexture",this.sampleFramebuffer.texture),this.renderer.setUniform("u_fillColor",this._options.cellColor),this.renderer.setUniform("u_useFixedColor",this._options.cellColorMode==="fixed"),this.renderer.rect(0,0,this.grid.cols,this.grid.rows),this._secondaryColorFramebuffer.end(),this._transformFramebuffer.begin(),this.renderer.clear(),this.renderer.shader(this.transformFillShader),this.renderer.setUniform("u_sampleTexture",this.sampleFramebuffer.texture),this.renderer.setUniform("u_invert",this._options.invert),this.renderer.setUniform("u_flipHorizontally",this._options.flipHorizontally),this.renderer.setUniform("u_flipVertically",this._options.flipVertically),this.renderer.rect(0,0,this.grid.cols,this.grid.rows),this._transformFramebuffer.end(),this._rotationFramebuffer.begin(),this.renderer.clear(),this.renderer.shader(this.rotationFillShader),this.renderer.setUniform("u_sampleTexture",this.sampleFramebuffer.texture),this.renderer.setUniform("u_rotationColor",this._options.rotation),this.renderer.rect(0,0,this.grid.cols,this.grid.rows),this._rotationFramebuffer.end(),this._characterFramebuffer.begin(),this.renderer.clear(0,0,0,0),this.renderer.shader(this.charMappingShader),this.renderer.setUniform("u_colorSampleFramebuffer",this.sampleFramebuffer.texture),this.renderer.setUniform("u_charPaletteTexture",this.palette.texture),this.renderer.setUniform("u_charPaletteSize",[this.palette.colors.length,1]),this.renderer.setUniform("u_brightnessRange",this._options.brightnessRange),this.renderer.rect(0,0,this.grid.cols,this.grid.rows),this._characterFramebuffer.end()}resize(){super.resize(),this.sampleFramebuffer.resize(this.grid.cols,this.grid.rows)}brightnessRange(e){D.validate(Array.isArray(e)&&e.length===2&&e.every(t=>typeof t=="number"&&t>=0&&t<=255),"Brightness range must be an array of two numbers between 0 and 255.",{method:"brightnessRange",providedValue:e})&&(this._options.brightnessRange=e)}}const PA=Object.freeze(Object.defineProperty({__proto__:null,TextmodeBrightnessConverter:k,TextmodeConverter:y,TextmodeFeatureConverter:Y},Symbol.toStringTag,{value:"Module"}));var IA="precision mediump float;uniform sampler2D u_characterTexture;uniform vec2 u_charsetDimensions;uniform sampler2D u_primaryColorTexture;uniform sampler2D u_secondaryColorTexture;uniform sampler2D u_transformTexture;uniform sampler2D u_asciiCharacterTexture;uniform sampler2D u_rotationTexture;uniform sampler2D u_captureTexture;uniform vec2 u_captureDimensions;uniform int u_backgroundMode;uniform vec2 u_gridCellDimensions;uniform vec2 u_gridPixelDimensions;mat2 rotate2D(float angle){float s=sin(angle);float c=cos(angle);return mat2(c,-s,s,c);}void main(){vec2 adjustedCoord=gl_FragCoord.xy/u_gridPixelDimensions;vec2 gridCoord=adjustedCoord*u_gridCellDimensions;vec2 cellCoord=floor(gridCoord);vec2 charIndexTexCoord=(cellCoord+0.5)/u_gridCellDimensions;vec4 primaryColor=texture2D(u_primaryColorTexture,charIndexTexCoord);vec4 secondaryColor=texture2D(u_secondaryColorTexture,charIndexTexCoord);vec4 transformColor=texture2D(u_transformTexture,charIndexTexCoord);bool isInverted=transformColor.r>0.5;bool flipHorizontal=transformColor.g>0.5;bool flipVertical=transformColor.b>0.5;vec4 encodedIndexVec=texture2D(u_asciiCharacterTexture,charIndexTexCoord);if(encodedIndexVec.a<0.01){gl_FragColor=(u_backgroundMode==0)? vec4(0.0):texture2D(u_captureTexture,gl_FragCoord.xy/u_captureDimensions);return;}int charIndex=int(encodedIndexVec.r*255.0+0.5)+int(encodedIndexVec.g*255.0+0.5)*256;int charCol=int(mod(float(charIndex),u_charsetDimensions.x));int charRow=charIndex/int(u_charsetDimensions.x);vec2 charCoord=vec2(charCol,charRow)/u_charsetDimensions;vec4 rotationColor=texture2D(u_rotationTexture,charIndexTexCoord);float scaledAngle=rotationColor.r*255.0+rotationColor.g;float rotationAngle=(scaledAngle*360.0/255.0)*0.017453292;vec2 fractionalPart=fract(gridCoord)-0.5;if(flipHorizontal)fractionalPart.x=-fractionalPart.x;if(flipVertical)fractionalPart.y=-fractionalPart.y;fractionalPart=rotate2D(rotationAngle)*fractionalPart+0.5;vec2 cellSize=1.0/u_charsetDimensions;vec2 texCoord=charCoord+fractionalPart*cellSize;vec2 cellMax=charCoord+cellSize;if(any(lessThan(texCoord,charCoord))||any(greaterThan(texCoord,cellMax))){gl_FragColor=isInverted ? primaryColor : secondaryColor;return;}vec4 charTexel=texture2D(u_characterTexture,texCoord);if(isInverted)charTexel.rgb=1.0-charTexel.rgb;gl_FragColor=mix(secondaryColor,primaryColor,charTexel);}";class Z{constructor(A,e,t){n(this,"renderer");n(this,"font");n(this,"grid");n(this,"converters");n(this,"_resultFramebuffer");n(this,"_asciiShader");n(this,"_characterFramebuffer");n(this,"_primaryColorFramebuffer");n(this,"_secondaryColorFramebuffer");n(this,"_rotationFramebuffer");n(this,"_transformFramebuffer");this.renderer=A,this.font=e,this.grid=t,this._asciiShader=this.renderer.createShader(_,IA),this.converters=[{name:"brightness",converter:new k(A,e,t)},{name:"custom",converter:new y(A,e,t)}],this._characterFramebuffer=this.renderer.createFramebuffer(t.cols,t.rows),this._primaryColorFramebuffer=this.renderer.createFramebuffer(t.cols,t.rows),this._secondaryColorFramebuffer=this.renderer.createFramebuffer(t.cols,t.rows),this._rotationFramebuffer=this.renderer.createFramebuffer(t.cols,t.rows),this._transformFramebuffer=this.renderer.createFramebuffer(t.cols,t.rows),this._resultFramebuffer=this.renderer.createFramebuffer(this.grid.width,this.grid.height)}render(A){for(const t of this.converters){const r=t.converter;r.options.enabled&&r instanceof Y&&r.convert(A)}const e=(t,r)=>{t.begin(),this.renderer.clear();for(const i of this.converters){const s=i.converter;s.options.enabled&&this.renderer.image(r(s),0,0)}t.end()};e(this._characterFramebuffer,t=>t.characterFramebuffer),e(this._primaryColorFramebuffer,t=>t.primaryColorFramebuffer),e(this._secondaryColorFramebuffer,t=>t.secondaryColorFramebuffer),e(this._rotationFramebuffer,t=>t.rotationFramebuffer),e(this._transformFramebuffer,t=>t.transformFramebuffer),this._resultFramebuffer.begin(),this.renderer.clear(),this.renderer.shader(this._asciiShader),this.renderer.setUniform("u_characterTexture",this.font.fontFramebuffer),this.renderer.setUniform("u_charsetDimensions",[this.font.textureColumns,this.font.textureRows]),this.renderer.setUniform("u_asciiCharacterTexture",this._characterFramebuffer.texture),this.renderer.setUniform("u_primaryColorTexture",this._primaryColorFramebuffer.texture),this.renderer.setUniform("u_secondaryColorTexture",this._secondaryColorFramebuffer.texture),this.renderer.setUniform("u_transformTexture",this._transformFramebuffer.texture),this.renderer.setUniform("u_rotationTexture",this._rotationFramebuffer.texture),this.renderer.setUniform("u_captureTexture",A.texture),this.renderer.setUniform("u_backgroundMode",!1),this.renderer.setUniform("u_captureDimensions",[A.width,A.height]),this.renderer.setUniform("u_gridCellDimensions",[this.grid.cols,this.grid.rows]),this.renderer.setUniform("u_gridPixelDimensions",[this.grid.width,this.grid.height]),this.renderer.rect(0,0,this._resultFramebuffer.width,this._resultFramebuffer.height),this._resultFramebuffer.end()}get(A){if(!D.validate(typeof A=="string"&&A.length>0,"Converter name must be a non-empty string.",{method:"converter",providedValue:A}))return;const e=this.converters.find(r=>r.name===A),t=e==null?void 0:e.converter;if(D.validate(t instanceof y,`Converter "${A}" is not a valid TextmodeConverter.`,{method:"converter",providedValue:A,converterInstance:t}))return t}add(A,e){if(!D.validate(typeof A=="string"&&A.length>0,"Converter name must be a non-empty string.",{method:"add",providedValue:A})||!D.validate(e==="brightness"||e==="custom",`Converter type must be either "brightness" or "custom". Provided: ${e}`,{method:"add",providedValue:e}))return;let t;return e==="brightness"?t=new k(this.renderer,this.font,this.grid):t=new y(this.renderer,this.font,this.grid),this.converters.push({name:A,converter:t}),t}remove(A){if(!D.validate(typeof A=="string"||A instanceof y,"Parameter must be either a string (converter name) or a TextmodeConverter instance.",{method:"remove",providedValue:A}))return;let e=-1;if(typeof A=="string"){if(!D.validate(A.length>0,"Converter name must be a non-empty string.",{method:"remove",providedValue:A}))return;e=this.converters.findIndex(t=>t.name===A)}else e=this.converters.findIndex(t=>t.converter===A);D.validate(e!==-1,typeof A=="string"?`Converter with name "${A}" not found in pipeline.`:"Converter instance not found in pipeline.",{method:"remove",providedValue:A,convertersCount:this.converters.length})&&this.converters.splice(e,1)}get texture(){return this._resultFramebuffer}resize(){this._resultFramebuffer.resize(this.grid.width,this.grid.height),this._characterFramebuffer.resize(this.grid.cols,this.grid.rows),this._primaryColorFramebuffer.resize(this.grid.cols,this.grid.rows),this._secondaryColorFramebuffer.resize(this.grid.cols,this.grid.rows),this._rotationFramebuffer.resize(this.grid.cols,this.grid.rows),this._transformFramebuffer.resize(this.grid.cols,this.grid.rows);for(const A of this.converters)A.converter.resize()}hasEnabledConverters(){return this.converters.some(A=>A.converter.options.enabled)}disable(){for(const A of this.converters)A.converter.disable()}enable(){for(const A of this.converters)A.converter.enable()}get characterFramebuffer(){return this._characterFramebuffer}get primaryColorFramebuffer(){return this._primaryColorFramebuffer}get secondaryColorFramebuffer(){return this._secondaryColorFramebuffer}get rotationFramebuffer(){return this._rotationFramebuffer}get transformFramebuffer(){return this._transformFramebuffer}}class V{extractFramebufferData(A){const e=A.get("brightness"),t=e==null?void 0:e.characterFramebuffer,r=e==null?void 0:e.primaryColorFramebuffer,i=e==null?void 0:e.secondaryColorFramebuffer,s=e==null?void 0:e.transformFramebuffer,o=e==null?void 0:e.rotationFramebuffer;return t==null||t.loadPixels(),r==null||r.loadPixels(),i==null||i.loadPixels(),s==null||s.loadPixels(),o==null||o.loadPixels(),{characterPixels:(t==null?void 0:t.pixels)||new Uint8Array(0),primaryColorPixels:(r==null?void 0:r.pixels)||new Uint8Array(0),secondaryColorPixels:(i==null?void 0:i.pixels)||new Uint8Array(0),transformPixels:(s==null?void 0:s.pixels)||new Uint8Array(0),rotationPixels:(o==null?void 0:o.pixels)||new Uint8Array(0)}}getCharacterIndex(A,e){const t=A[e],r=A[e+1];return t+(r<<8)}pixelsToRGBA(A,e){return{r:A[e],g:A[e+1],b:A[e+2],a:A[e+3]}}}class O{createBlob(A,e){return new Blob([A],{type:e})}downloadFile(A,e,t){try{const r=this.createBlob(A,t),i=URL.createObjectURL(r),s=document.createElement("a");s.href=i,s.download=e,s.style.display="none",s.rel="noopener",document.body.appendChild(s),s.click(),document.body.removeChild(s),URL.revokeObjectURL(i)}catch(r){throw console.error("Failed to download file:",r),new Error(`File download failed: ${r instanceof Error?r.message:"Unknown error"}`)}}generateTimestamp(){return new Date().toISOString().slice(0,19).replace(/:/g,"-")}generateDateTimeString(){const A=new Date,e=A.toISOString().split("T")[0],t=A.toTimeString().split(" ")[0].replace(/:/g,"-");return{date:e,time:t}}sanitizeFilename(A){return A.replace(/[<>:"/\\|?*]/g,"_").replace(/\s+/g,"_").replace(/_{2,}/g,"_").replace(/^_+|_+$/g,"").substring(0,255)}generateDefaultFilename(){return`'textmode-export'-${this.generateTimestamp()}`}}class wA extends V{extractTransformData(A,e,t){const r=A[t],i=A[t+1],s=A[t+2],o=r===255,g=i===255,B=s===255,E=e[t],Q=e[t+1],l=E+Q/255,c=Math.round(l*360/255*100)/100;return{isInverted:o,flipHorizontal:g,flipVertical:B,rotation:c}}calculateCellPosition(A,e,t){return{x:A,y:e,cellX:A*t.cellWidth,cellY:e*t.cellHeight}}extractSVGCellData(A,e){const t=[];let r=0;for(let i=0;i<e.rows;i++)for(let s=0;s<e.cols;s++){const o=r*4,g=this.getCharacterIndex(A.characterPixels,o);let B=this.pixelsToRGBA(A.primaryColorPixels,o),E=this.pixelsToRGBA(A.secondaryColorPixels,o);const Q=this.extractTransformData(A.transformPixels,A.rotationPixels,o);if(Q.isInverted){const c=B;B=E,E=c}const l=this.calculateCellPosition(s,i,e);t.push({charIndex:g,primaryColor:B,secondaryColor:E,transform:Q,position:l}),r++}return t}}class pA{getGlyphIndex(A,e){const t=A.cmap;if(!t||!t.tables)return 0;for(const r of t.tables)if(r.format===4){for(let i=0;i<r.startCount.length;i++)if(e>=r.startCount[i]&&e<=r.endCount[i]){if(r.idRangeOffset[i]===0)return e+r.idDelta[i]&65535;{const s=r.idRangeOffset[i]/2+(e-r.startCount[i])-(r.startCount.length-i);if(s>=0&&s<r.glyphIdArray.length){const o=r.glyphIdArray[s];if(o!==0)return o+r.idDelta[i]&65535}}}}return 0}createEmptyPath(){return{getBoundingBox:()=>({x1:0,y1:0,x2:0,y2:0}),toSVG:()=>""}}createGlyphPath(A,e,t,r,i){if(!e||!e.xs||e.xs.length===0)return this.createEmptyPath();const s=i/A.head.unitsPerEm;return{getBoundingBox:()=>({x1:t+e.xMin*s,y1:r+-e.yMax*s,x2:t+e.xMax*s,y2:r+-e.yMin*s}),toSVG:()=>this.glyphToSVGPath(e,t,r,s)}}glyphToSVGPath(A,e,t,r){if(!A||!A.xs)return"";const{xs:i,ys:s,endPts:o,flags:g}=A;if(!i||!s||!o||!g)return"";let B="",E=0;for(let Q=0;Q<o.length;Q++){const l=o[Q];if(!(l<E)){if(l>=E){const c=e+i[E]*r,d=t-s[E]*r;B+=`M${c.toFixed(2)},${d.toFixed(2)}`;let u=E+1;for(;u<=l;)if((g[u]&1)!==0){const I=e+i[u]*r,m=t-s[u]*r;B+=`L${I.toFixed(2)},${m.toFixed(2)}`,u++}else{const I=e+i[u]*r,m=t-s[u]*r;let w=u+1>l?E:u+1;if((g[w]&1)!==0){const F=e+i[w]*r,v=t-s[w]*r;B+=`Q${I.toFixed(2)},${m.toFixed(2)} ${F.toFixed(2)},${v.toFixed(2)}`,u=w+1}else{const F=e+i[w]*r,v=t-s[w]*r,H=(I+F)/2,R=(m+v)/2;B+=`Q${I.toFixed(2)},${m.toFixed(2)} ${H.toFixed(2)},${R.toFixed(2)}`,u=w}}B+="Z"}E=l+1}}return B}generateCharacterPath(A,e,t,r,i){try{const s=A.codePointAt(0)||0,o=this.getGlyphIndex(e,s);if(o===0)return this.createEmptyPath();let g=null;try{e.glyf&&e.glyf[o]!==null?g=e.glyf[o]:h&&h.T&&h.T.glyf&&h.T.glyf._parseGlyf&&(g=h.T.glyf._parseGlyf(e,o),e.glyf&&g&&(e.glyf[o]=g))}catch(B){console.warn(`Failed to parse glyph ${o}:`,B)}return g?this.createGlyphPath(e,g,t,r,i):this.createEmptyPath()}catch(s){return console.warn(`Failed to generate path for character "${A}":`,s),this.createEmptyPath()}}generatePositionedCharacterPath(A,e,t,r,i,s,o,g){try{const B=o/e.head.unitsPerEm,E=g*B,Q=t+(i-E)/2,l=r+(s+o*.7)/2;return this.generateCharacterPath(A,e,Q,l,o).toSVG()||null}catch(B){return console.warn(`Failed to generate positioned character path for "${A}":`,B),null}}}class _A{constructor(){n(this,"pathGenerator");this.pathGenerator=new pA}generateSVGHeader(A){return`<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
9
9
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
10
10
|
<svg width="${A.width}" height="${A.height}" viewBox="0 0 ${A.width} ${A.height}"
|
|
11
11
|
xmlns="http://www.w3.org/2000/svg" version="1.1">
|
|
@@ -23,4 +23,4 @@
|
|
|
23
23
|
<g id="ascii-cells">`;for(const s of A)i+=this.generateCellContent(s,e,t,r);return i+=this.generateSVGFooter(),i}optimizeSVGContent(A){return A.replace(/<path[^>]*d=""[^>]*\/>/g,"").replace(/\n\s*\n/g,`
|
|
24
24
|
`).replace(/[ \t]+$/gm,"")}}class vA extends O{createSVGBlob(A){return this.createBlob(A,"image/svg+xml;charset=utf-8")}downloadSVG(A,e){try{this.downloadFile(A,this.sanitizeFilename(e)+".svg","image/svg+xml;charset=utf-8")}catch(t){throw console.error("Failed to download SVG file:",t),new Error(`SVG download failed: ${t instanceof Error?t.message:"Unknown error"}`)}}saveSVG(A,e){this.downloadSVG(A,e||this.generateDefaultFilename())}}class q{constructor(){n(this,"dataExtractor");n(this,"contentGenerator");n(this,"fileHandler");this.dataExtractor=new wA,this.contentGenerator=new _A,this.fileHandler=new vA}applyDefaultOptions(A){return{includeBackgroundRectangles:A.includeBackgroundRectangles??!0,drawMode:A.drawMode??"fill",strokeWidth:A.strokeWidth??1,backgroundColor:A.backgroundColor??[0,0,0,0]}}generateSVG(A,e={}){const t=this.applyDefaultOptions(e),r=this.dataExtractor.extractFramebufferData(A.pipeline),i=this.dataExtractor.extractSVGCellData(r,A.grid),s=this.contentGenerator.generateSVGContent(i,A.grid,A.font,t);return this.contentGenerator.optimizeSVGContent(s)}saveSVG(A,e={}){try{const t=this.generateSVG(A,e),r=e.filename||this.fileHandler.generateDefaultFilename();this.fileHandler.saveSVG(t,r)}catch(t){throw console.error("Failed to save SVG:",t),new Error(`SVG save failed: ${t instanceof Error?t.message:"Unknown error"}`)}}}class xA extends V{extractCharacterGrid(A,e,t,r=" "){var o;const i=[];let s=0;for(let g=0;g<e.rows;g++){const B=[];for(let E=0;E<e.cols;E++){const Q=s*4,l=this.getCharacterIndex(A.characterPixels,Q),c=((o=t.characters[l])==null?void 0:o.character)||r;B.push(c),s++}i.push(B)}return i}}class bA{generateTXTContent(A,e){const t=[];for(const i of A){let s=i.join("");e.preserveTrailingSpaces||(s=s.replace(/\s+$/,"")),t.push(s)}const r=e.lineEnding==="crlf"?`\r
|
|
25
25
|
`:`
|
|
26
|
-
`;return t.join(r)}}class FA extends O{saveTXT(A,e){try{const t=this.ensureValidFilename(e);this.downloadFile(A,t,"text/plain;charset=utf-8")}catch(t){throw console.error("Failed to save TXT file:",t),new Error(`TXT file save failed: ${t instanceof Error?t.message:"Unknown error"}`)}}ensureValidFilename(A){let e=this.sanitizeFilename(A);return e===".txt"||e.length<=4?this.generateDefaultFilename():e}}class AA{constructor(){n(this,"dataExtractor");n(this,"contentGenerator");n(this,"fileHandler");this.dataExtractor=new xA,this.contentGenerator=new bA,this.fileHandler=new FA}applyDefaultOptions(A){return{preserveTrailingSpaces:A.preserveTrailingSpaces??!1,lineEnding:A.lineEnding??"lf",emptyCharacter:A.emptyCharacter??" "}}generateTXT(A,e={}){const t=this.applyDefaultOptions(e),r=this.dataExtractor.extractFramebufferData(A.pipeline),i=this.dataExtractor.extractCharacterGrid(r,A.grid,A.font,t.emptyCharacter);return this.contentGenerator.generateTXTContent(i,t)}saveTXT(A,e={}){try{const t=this.generateTXT(A,e),r=e.filename||this.fileHandler.generateDefaultFilename();this.fileHandler.saveTXT(t,r)}catch(t){throw console.error("Failed to save TXT:",t),new Error(`TXT save failed: ${t instanceof Error?t.message:"Unknown error"}`)}}}class yA extends V{captureCanvasData(A,e=1,t="transparent"){const r=A.canvas;if(e===1&&t==="transparent")return r;const i=document.createElement("canvas"),s=i.getContext("2d"),o=Math.round(r.width*e),g=Math.round(r.height*e);return i.width=o,i.height=g,t!=="transparent"&&(s.fillStyle=t,s.fillRect(0,0,o,g)),s.imageSmoothingEnabled=!1,s.drawImage(r,0,0,r.width,r.height,0,0,o,g),i}}class TA{generateImageData(A,e){const t=this.getMimeType(e.format);return e.format==="png"?A.toDataURL(t):A.toDataURL(t,e.quality)}async generateImageBlob(A,e){return new Promise((t,r)=>{const i=this.getMimeType(e.format),s=o=>{o?t(o):r(new Error(`Failed to generate ${e.format.toUpperCase()} blob`))};e.format==="png"?A.toBlob(s,i):A.toBlob(s,i,e.quality)})}getMimeType(A){switch(A){case"png":return"image/png";case"jpg":return"image/jpeg";case"webp":return"image/webp";default:throw new Error(`Unsupported image format: ${A}`)}}}const eA={png:"image/png",jpg:"image/jpeg",webp:"image/webp"},z={png:".png",jpg:".jpg",webp:".webp"};class SA extends O{saveImage(A,e,t){try{const r=z[t];typeof A=="string"?this.saveImageFromDataURL(A,this.sanitizeFilename(e)+r):this.saveImageFromBlob(A,this.sanitizeFilename(e)+r)}catch(r){throw console.error(`Failed to save ${t.toUpperCase()} image:`,r),new Error(`Image save failed: ${r instanceof Error?r.message:"Unknown error"}`)}}saveImageFromDataURL(A,e){const t=document.createElement("a");t.href=A,t.download=e,t.style.display="none",t.rel="noopener",document.body.appendChild(t),t.click(),document.body.removeChild(t)}saveImageFromBlob(A,e){const t=URL.createObjectURL(A);try{const r=document.createElement("a");r.href=t,r.download=e,r.style.display="none",r.rel="noopener",document.body.appendChild(r),r.click(),document.body.removeChild(r)}finally{URL.revokeObjectURL(t)}}validateSaveSupport(A){return A in eA&&A in z}getMimeType(A){return eA[A]}getFileExtension(A){return z[A]}}class MA{constructor(){n(this,"dataExtractor");n(this,"contentGenerator");n(this,"fileHandler");this.dataExtractor=new yA,this.contentGenerator=new TA,this.fileHandler=new SA}applyDefaultOptions(A){return{format:A.format??"png",quality:A.quality??1,scale:A.scale??1,backgroundColor:A.backgroundColor??"transparent"}}validateOptions(A){if(console.log("Validating image export options:",A),!this.fileHandler.validateSaveSupport(A.format))throw new Error(`Saving '${A.format}' files is not supported`);if(A.quality<0||A.quality>1)throw new Error("Image quality must be between 0.0 and 1.0");if(A.scale<=0)throw new Error("Scale factor must be greater than 0");A.scale>10&&console.warn("Large scale factors may result in very large files and slow performance"),A.format==="jpg"&&A.backgroundColor==="transparent"&&(A.backgroundColor="black")}generateImage(A,e={}){const t=this.applyDefaultOptions(e);if(this.validateOptions(t),t.scale===1&&t.backgroundColor==="transparent")return this.contentGenerator.generateImageData(A.canvas,t);const r=this.dataExtractor.captureCanvasData(A,t.scale,t.backgroundColor);return this.contentGenerator.generateImageData(r,t)}async generateImageBlob(A,e={}){const t=this.applyDefaultOptions(e);if(this.validateOptions(t),t.scale===1&&t.backgroundColor==="transparent")return await this.contentGenerator.generateImageBlob(A.canvas,t);const r=this.dataExtractor.captureCanvasData(A,t.scale,t.backgroundColor);return await this.contentGenerator.generateImageBlob(r,t)}async saveImage(A,e={}){try{const t=await this.generateImageBlob(A,e),r=e.format??"png",i=e.filename||this.fileHandler.generateDefaultFilename();this.fileHandler.saveImage(t,i,r)}catch(t){throw console.error("Failed to save image:",t),new Error(`Image save failed: ${t instanceof Error?t.message:"Unknown error"}`)}}}class S{constructor(A=null,e={}){n(this,"captureSource");n(this,"textmodeCanvas");n(this,"_renderer");n(this,"_canvasFramebuffer");n(this,"_font");n(this,"_grid");n(this,"resizeObserver");n(this,"_mode");n(this,"_frameRateLimit");n(this,"animationFrameId",null);n(this,"lastFrameTime",0);n(this,"frameInterval");n(this,"_frameRate",0);n(this,"lastRenderTime",0);n(this,"_frameCount",0);n(this,"frameTimeHistory",[]);n(this,"frameTimeHistorySize",10);n(this,"_pipeline");n(this,"_standalone",!1);n(this,"_drawCallback",()=>{});n(this,"_resizedCallback",()=>{});this.captureSource=A,this._standalone=A===null,this._mode=e.renderMode??"auto",this._frameRateLimit=e.frameRate??60,this.frameInterval=1e3/this._frameRateLimit}static async create(A=null,e={}){const t=new S(A,e),r=t._standalone?e:void 0;t.textmodeCanvas=new j(t.captureSource,t._standalone,r),t._renderer=new gA(t.textmodeCanvas.getWebGLContext());let i,s;t._standalone?(i=e.width||800,s=e.height||600):(i=t.textmodeCanvas.width||800,s=t.textmodeCanvas.height||600),t._canvasFramebuffer=t._renderer.createFramebuffer(i,s),t._font=new J(t._renderer,e.fontSize??16),await t._font.initialize(e.fontSource);const o=t._font.maxGlyphDimensions;return t._grid=new K(t.textmodeCanvas.canvas,o.width,o.height),t._pipeline=new Z(t._renderer,t._font,t._grid),t.setupEventListeners(),t.startAutoRendering(),t}setupEventListeners(){window.addEventListener("resize",()=>{this._standalone?this._resizedCallback():this.resize()}),window.ResizeObserver&&this.captureSource&&!this._standalone&&(this.resizeObserver=new ResizeObserver(()=>{this.resize()}),this.resizeObserver.observe(this.captureSource))}toString(A={}){return new AA().generateTXT(this,A)}saveStrings(A={}){new AA().saveTXT(this,A)}toSVG(A={}){return new q().generateSVG(this,A)}saveSVG(A={}){new q().saveSVG(this,A)}async saveCanvas(A,e="png",t={}){await new MA().saveImage(this.textmodeCanvas,{...t,filename:A,format:e})}async loadFont(A){return this._font.loadFont(A).then(()=>{const e=this._font.maxGlyphDimensions;this._grid.resizeCellPixelDimensions(e.width,e.height),this._pipeline.resize()})}render(){this.measureFrameRate(),this._frameCount++,this._standalone||this._canvasFramebuffer.update(this.captureSource),this._canvasFramebuffer.begin(),this._drawCallback(),this._renderer.reset(),this._canvasFramebuffer.end(),this._pipeline.render(this._canvasFramebuffer),this._pipeline.hasEnabledConverters()?(this._renderer.background(0),this._renderer.image(this._pipeline.texture,this._grid.offsetX,this._grid.offsetY,this._pipeline.texture.width,this._pipeline.texture.height)):(this._renderer.clear(),this._renderer.image(this._canvasFramebuffer,this._grid.offsetX,this._grid.offsetY,this._canvasFramebuffer.width,this._canvasFramebuffer.height))}resize(){this.textmodeCanvas.resize(),this._canvasFramebuffer.resize(this.textmodeCanvas.width,this.textmodeCanvas.height),this._grid.resize(),this._pipeline.resize(),this._renderer.resetViewport(),this._mode!=="manual"&&this.render()}startAutoRendering(){if(this._mode!=="auto")return;this.lastFrameTime=performance.now();const A=e=>{const t=e-this.lastFrameTime;t>=this.frameInterval&&(this.render(),this.lastFrameTime=e-t%this.frameInterval),this.animationFrameId=requestAnimationFrame(A)};this.animationFrameId=requestAnimationFrame(A)}measureFrameRate(){const A=performance.now();if(this.lastRenderTime>0){const e=A-this.lastRenderTime;this.frameTimeHistory.push(e),this.frameTimeHistory.length>this.frameTimeHistorySize&&this.frameTimeHistory.shift();const t=this.frameTimeHistory.reduce((r,i)=>r+i,0)/this.frameTimeHistory.length;this._frameRate=1e3/t}this.lastRenderTime=A}stopAutoRendering(){this.animationFrameId&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null)}renderMode(A){this._mode!==A&&(this.stopAutoRendering(),this._mode=A,A==="auto"&&this.startAutoRendering())}frameRate(A){if(A===void 0)return this._frameRate;this._frameRateLimit=A,this.frameInterval=1e3/A,this._mode==="auto"&&(this.stopAutoRendering(),this.startAutoRendering())}fontSize(A){D.validate(typeof A=="number"&&A>0,"Font size must be a positive number greater than 0.",{method:"fontSize",providedValue:A})&&this._font.fontSize!==A&&(this._font.setFontSize(A),this._grid.resizeCellPixelDimensions(this._font.maxGlyphDimensions.width,this._font.maxGlyphDimensions.height),this._pipeline.resize(),this._renderer.resetViewport())}draw(A){this._drawCallback=A}windowResized(A){this._resizedCallback=A}resizeCanvas(A,e){this.textmodeCanvas.resize(A,e),this._canvasFramebuffer.resize(this.textmodeCanvas.width,this.textmodeCanvas.height),this._grid.resize(),this._pipeline.resize(),this._renderer.resetViewport(),this._mode!=="manual"&&this.render()}converter(A){return this._pipeline.get(A)}fill(A,e,t,r){this._renderer.fill(A,e,t,r)}stroke(A,e,t,r){this._renderer.stroke(A,e,t,r)}strokeWeight(A){this._renderer.strokeWeight(A)}noStroke(){this._renderer.noStroke()}noFill(){this._renderer.noFill()}rotate(A){this._renderer.rotate(A)}push(){this._renderer.push()}pop(){this._renderer.pop()}rect(A,e,t=1,r=1){this._renderer.rect(A,e,t,r)}line(A,e,t,r){this._renderer.line(A,e,t,r)}background(A,e=A,t=A,r=255){this._renderer.background(A,e,t,r)}createShader(A,e){return this._renderer.createShader(A,e)}shader(A){this._renderer.shader(A)}setUniform(A,e){this._renderer.setUniform(A,e)}get grid(){return this._grid}get font(){return this._font}get mode(){return this._mode}get pipeline(){return this._pipeline}get frameCount(){return this._frameCount}get width(){return this.textmodeCanvas.width}get height(){return this.textmodeCanvas.height}}class M{static async create(A,e={}){if(A instanceof HTMLCanvasElement||A instanceof HTMLVideoElement)return S.create(A,e);{const t=A||{};return S.create(null,t)}}static setErrorLevel(A){D.setGlobalLevel(A)}static get version(){return"0.1.2"}constructor(){throw new Error("Textmode is a static class and cannot be instantiated.")}}const GA=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"})),RA=M.create,UA=M.setErrorLevel,YA=M.version;f.TextmodeCanvas=j,f.TextmodeConversionPipeline=Z,f.TextmodeErrorLevel=x,f.TextmodeFont=J,f.TextmodeGrid=K,f.Textmodifier=S,f.converters=PA,f.create=RA,f.default=M,f.export=GA,f.setErrorLevel=UA,f.textmode=M,f.version=YA,Object.defineProperties(f,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
|
|
26
|
+
`;return t.join(r)}}class FA extends O{saveTXT(A,e){try{const t=this.ensureValidFilename(e);this.downloadFile(A,t,"text/plain;charset=utf-8")}catch(t){throw console.error("Failed to save TXT file:",t),new Error(`TXT file save failed: ${t instanceof Error?t.message:"Unknown error"}`)}}ensureValidFilename(A){let e=this.sanitizeFilename(A);return e===".txt"||e.length<=4?this.generateDefaultFilename():e}}class AA{constructor(){n(this,"dataExtractor");n(this,"contentGenerator");n(this,"fileHandler");this.dataExtractor=new xA,this.contentGenerator=new bA,this.fileHandler=new FA}applyDefaultOptions(A){return{preserveTrailingSpaces:A.preserveTrailingSpaces??!1,lineEnding:A.lineEnding??"lf",emptyCharacter:A.emptyCharacter??" "}}generateTXT(A,e={}){const t=this.applyDefaultOptions(e),r=this.dataExtractor.extractFramebufferData(A.pipeline),i=this.dataExtractor.extractCharacterGrid(r,A.grid,A.font,t.emptyCharacter);return this.contentGenerator.generateTXTContent(i,t)}saveTXT(A,e={}){try{const t=this.generateTXT(A,e),r=e.filename||this.fileHandler.generateDefaultFilename();this.fileHandler.saveTXT(t,r)}catch(t){throw console.error("Failed to save TXT:",t),new Error(`TXT save failed: ${t instanceof Error?t.message:"Unknown error"}`)}}}class yA extends V{captureCanvasData(A,e=1,t="transparent"){const r=A.canvas;if(e===1&&t==="transparent")return r;const i=document.createElement("canvas"),s=i.getContext("2d"),o=Math.round(r.width*e),g=Math.round(r.height*e);return i.width=o,i.height=g,t!=="transparent"&&(s.fillStyle=t,s.fillRect(0,0,o,g)),s.imageSmoothingEnabled=!1,s.drawImage(r,0,0,r.width,r.height,0,0,o,g),i}}class TA{generateImageData(A,e){const t=this.getMimeType(e.format);return e.format==="png"?A.toDataURL(t):A.toDataURL(t,e.quality)}async generateImageBlob(A,e){return new Promise((t,r)=>{const i=this.getMimeType(e.format),s=o=>{o?t(o):r(new Error(`Failed to generate ${e.format.toUpperCase()} blob`))};e.format==="png"?A.toBlob(s,i):A.toBlob(s,i,e.quality)})}getMimeType(A){switch(A){case"png":return"image/png";case"jpg":return"image/jpeg";case"webp":return"image/webp";default:throw new Error(`Unsupported image format: ${A}`)}}}const eA={png:"image/png",jpg:"image/jpeg",webp:"image/webp"},z={png:".png",jpg:".jpg",webp:".webp"};class SA extends O{saveImage(A,e,t){try{const r=z[t];typeof A=="string"?this.saveImageFromDataURL(A,this.sanitizeFilename(e)+r):this.saveImageFromBlob(A,this.sanitizeFilename(e)+r)}catch(r){throw console.error(`Failed to save ${t.toUpperCase()} image:`,r),new Error(`Image save failed: ${r instanceof Error?r.message:"Unknown error"}`)}}saveImageFromDataURL(A,e){const t=document.createElement("a");t.href=A,t.download=e,t.style.display="none",t.rel="noopener",document.body.appendChild(t),t.click(),document.body.removeChild(t)}saveImageFromBlob(A,e){const t=URL.createObjectURL(A);try{const r=document.createElement("a");r.href=t,r.download=e,r.style.display="none",r.rel="noopener",document.body.appendChild(r),r.click(),document.body.removeChild(r)}finally{URL.revokeObjectURL(t)}}validateSaveSupport(A){return A in eA&&A in z}getMimeType(A){return eA[A]}getFileExtension(A){return z[A]}}class MA{constructor(){n(this,"dataExtractor");n(this,"contentGenerator");n(this,"fileHandler");this.dataExtractor=new yA,this.contentGenerator=new TA,this.fileHandler=new SA}applyDefaultOptions(A){return{format:A.format??"png",quality:A.quality??1,scale:A.scale??1,backgroundColor:A.backgroundColor??"transparent"}}validateOptions(A){if(console.log("Validating image export options:",A),!this.fileHandler.validateSaveSupport(A.format))throw new Error(`Saving '${A.format}' files is not supported`);if(A.quality<0||A.quality>1)throw new Error("Image quality must be between 0.0 and 1.0");if(A.scale<=0)throw new Error("Scale factor must be greater than 0");A.scale>10&&console.warn("Large scale factors may result in very large files and slow performance"),A.format==="jpg"&&A.backgroundColor==="transparent"&&(A.backgroundColor="black")}generateImage(A,e={}){const t=this.applyDefaultOptions(e);if(this.validateOptions(t),t.scale===1&&t.backgroundColor==="transparent")return this.contentGenerator.generateImageData(A.canvas,t);const r=this.dataExtractor.captureCanvasData(A,t.scale,t.backgroundColor);return this.contentGenerator.generateImageData(r,t)}async generateImageBlob(A,e={}){const t=this.applyDefaultOptions(e);if(this.validateOptions(t),t.scale===1&&t.backgroundColor==="transparent")return await this.contentGenerator.generateImageBlob(A.canvas,t);const r=this.dataExtractor.captureCanvasData(A,t.scale,t.backgroundColor);return await this.contentGenerator.generateImageBlob(r,t)}async saveImage(A,e={}){try{const t=await this.generateImageBlob(A,e),r=e.format??"png",i=e.filename||this.fileHandler.generateDefaultFilename();this.fileHandler.saveImage(t,i,r)}catch(t){throw console.error("Failed to save image:",t),new Error(`Image save failed: ${t instanceof Error?t.message:"Unknown error"}`)}}}class S{constructor(A=null,e={}){n(this,"captureSource");n(this,"textmodeCanvas");n(this,"_renderer");n(this,"_canvasFramebuffer");n(this,"_font");n(this,"_grid");n(this,"resizeObserver");n(this,"_mode");n(this,"_frameRateLimit");n(this,"animationFrameId",null);n(this,"lastFrameTime",0);n(this,"frameInterval");n(this,"_frameRate",0);n(this,"lastRenderTime",0);n(this,"_frameCount",0);n(this,"frameTimeHistory",[]);n(this,"frameTimeHistorySize",10);n(this,"_pipeline");n(this,"_standalone",!1);n(this,"_drawCallback",()=>{});n(this,"_resizedCallback",()=>{});this.captureSource=A,this._standalone=A===null,this._mode=e.renderMode??"auto",this._frameRateLimit=e.frameRate??60,this.frameInterval=1e3/this._frameRateLimit}static async create(A=null,e={}){const t=new S(A,e),r=t._standalone?e:void 0;t.textmodeCanvas=new j(t.captureSource,t._standalone,r),t._renderer=new gA(t.textmodeCanvas.getWebGLContext());let i,s;t._standalone?(i=e.width||800,s=e.height||600):(i=t.textmodeCanvas.width||800,s=t.textmodeCanvas.height||600),t._canvasFramebuffer=t._renderer.createFramebuffer(i,s),t._font=new J(t._renderer,e.fontSize??16),await t._font.initialize(e.fontSource);const o=t._font.maxGlyphDimensions;return t._grid=new K(t.textmodeCanvas.canvas,o.width,o.height),t._pipeline=new Z(t._renderer,t._font,t._grid),t.setupEventListeners(),t.startAutoRendering(),t}setupEventListeners(){window.addEventListener("resize",()=>{this._standalone?this._resizedCallback():this.resize()}),window.ResizeObserver&&this.captureSource&&!this._standalone&&(this.resizeObserver=new ResizeObserver(()=>{this.resize()}),this.resizeObserver.observe(this.captureSource))}toString(A={}){return new AA().generateTXT(this,A)}saveStrings(A={}){new AA().saveTXT(this,A)}toSVG(A={}){return new q().generateSVG(this,A)}saveSVG(A={}){new q().saveSVG(this,A)}async saveCanvas(A,e="png",t={}){await new MA().saveImage(this.textmodeCanvas,{...t,filename:A,format:e})}async loadFont(A){return this._font.loadFont(A).then(()=>{const e=this._font.maxGlyphDimensions;this._grid.resizeCellPixelDimensions(e.width,e.height),this._pipeline.resize()})}render(){this.measureFrameRate(),this._frameCount++,this._standalone||this._canvasFramebuffer.update(this.captureSource),this._canvasFramebuffer.begin(),this._drawCallback(),this._renderer.reset(),this._canvasFramebuffer.end(),this._pipeline.render(this._canvasFramebuffer),this._pipeline.hasEnabledConverters()?(this._renderer.background(0),this._renderer.image(this._pipeline.texture,this._grid.offsetX,this._grid.offsetY,this._pipeline.texture.width,this._pipeline.texture.height)):(this._renderer.clear(),this._renderer.image(this._canvasFramebuffer,this._grid.offsetX,this._grid.offsetY,this._canvasFramebuffer.width,this._canvasFramebuffer.height))}resize(){this.textmodeCanvas.resize(),this._canvasFramebuffer.resize(this.textmodeCanvas.width,this.textmodeCanvas.height),this._grid.resize(),this._pipeline.resize(),this._renderer.resetViewport(),this._mode!=="manual"&&this.render()}startAutoRendering(){if(this._mode!=="auto")return;this.lastFrameTime=performance.now();const A=e=>{const t=e-this.lastFrameTime;t>=this.frameInterval&&(this.render(),this.lastFrameTime=e-t%this.frameInterval),this.animationFrameId=requestAnimationFrame(A)};this.animationFrameId=requestAnimationFrame(A)}measureFrameRate(){const A=performance.now();if(this.lastRenderTime>0){const e=A-this.lastRenderTime;this.frameTimeHistory.push(e),this.frameTimeHistory.length>this.frameTimeHistorySize&&this.frameTimeHistory.shift();const t=this.frameTimeHistory.reduce((r,i)=>r+i,0)/this.frameTimeHistory.length;this._frameRate=1e3/t}this.lastRenderTime=A}stopAutoRendering(){this.animationFrameId&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null)}renderMode(A){this._mode!==A&&(this.stopAutoRendering(),this._mode=A,A==="auto"&&this.startAutoRendering())}frameRate(A){if(A===void 0)return this._frameRate;this._frameRateLimit=A,this.frameInterval=1e3/A,this._mode==="auto"&&(this.stopAutoRendering(),this.startAutoRendering())}fontSize(A){D.validate(typeof A=="number"&&A>0,"Font size must be a positive number greater than 0.",{method:"fontSize",providedValue:A})&&this._font.fontSize!==A&&(this._font.setFontSize(A),this._grid.resizeCellPixelDimensions(this._font.maxGlyphDimensions.width,this._font.maxGlyphDimensions.height),this._pipeline.resize(),this._renderer.resetViewport())}draw(A){this._drawCallback=A}windowResized(A){this._resizedCallback=A}resizeCanvas(A,e){this.textmodeCanvas.resize(A,e),this._canvasFramebuffer.resize(this.textmodeCanvas.width,this.textmodeCanvas.height),this._grid.resize(),this._pipeline.resize(),this._renderer.resetViewport(),this._mode!=="manual"&&this.render()}converter(A){return this._pipeline.get(A)}fill(A,e,t,r){this._renderer.fill(A,e,t,r)}stroke(A,e,t,r){this._renderer.stroke(A,e,t,r)}strokeWeight(A){this._renderer.strokeWeight(A)}noStroke(){this._renderer.noStroke()}noFill(){this._renderer.noFill()}rotate(A){this._renderer.rotate(A)}push(){this._renderer.push()}pop(){this._renderer.pop()}rect(A,e,t=1,r=1){this._renderer.rect(A,e,t,r)}line(A,e,t,r){this._renderer.line(A,e,t,r)}background(A,e=A,t=A,r=255){this._renderer.background(A,e,t,r)}createShader(A,e){return this._renderer.createShader(A,e)}shader(A){this._renderer.shader(A)}setUniform(A,e){this._renderer.setUniform(A,e)}get grid(){return this._grid}get font(){return this._font}get mode(){return this._mode}get pipeline(){return this._pipeline}get frameCount(){return this._frameCount}get width(){return this.textmodeCanvas.width}get height(){return this.textmodeCanvas.height}}class M{static async create(A,e={}){if(A instanceof HTMLCanvasElement||A instanceof HTMLVideoElement)return S.create(A,e);{const t=A||{};return S.create(null,t)}}static setErrorLevel(A){D.setGlobalLevel(A)}static get version(){return"0.1.4-beta.1"}constructor(){throw new Error("Textmode is a static class and cannot be instantiated.")}}const GA=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"})),RA=M.create,UA=M.setErrorLevel,YA=M.version;f.TextmodeCanvas=j,f.TextmodeConversionPipeline=Z,f.TextmodeErrorLevel=x,f.TextmodeFont=J,f.TextmodeGrid=K,f.Textmodifier=S,f.converters=PA,f.create=RA,f.default=M,f.export=GA,f.setErrorLevel=UA,f.textmode=M,f.version=YA,Object.defineProperties(f,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
|