diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..a3fb585 --- /dev/null +++ b/404.html @@ -0,0 +1,1847 @@ + + + + + + + + + + + + + + + + + + + + + + + Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ +

404 - Not found

+ +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..66ca8d8 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +es.openterface.com \ No newline at end of file diff --git a/accessories/index.html b/accessories/index.html new file mode 100644 index 0000000..f516e3e --- /dev/null +++ b/accessories/index.html @@ -0,0 +1,2148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Accesorios - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Saltar a contenido + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + + +

Accesorios

+

Aquí encontrarás una variedad de productos que complementan y mejoran la funcionalidad del Openterface Mini-KVM. Nuestro objetivo es ofrecer una gama de accesorios que hagan tu experiencia con nuestro Mini-KVM aún más versátil y conveniente.

+

Cable Convertidor de VGA a HDMI

+

CABLE100-VGA2HDMI

+

Este producto convierte video VGA e integra audio en HDMI, permitiendo una fácil conexión de dispositivos VGA a pantallas HDMI.

+
    +
  • Modelo: CABLE100-VGA2HDMI
  • +
  • Longitud: 1M
  • +
  • Resolución de Video de Salida: 1920x1080P Full HD
  • +
  • Entrada de Audio: Jack de audio de 3.5mm
  • +
  • Salida de Audio: a través de HDMI
  • +
  • Fuente de Alimentación: Alimentado vía USB
  • +
+

Caso de Uso

+

Para un caso de uso detallado de este cable, por favor visita Gestión de Servidores Simplificada.

+

Video Demostrativo

+

Mira el video demostrativo del influenciador tecnológico Cameron Gray sobre cómo usar este cable con el Mini-KVM: ¡Esta Consola USB KVM es Increíble!

+

+
+

Cable Tipo-C a USB-A con Adaptador

+

C2A-30-Cable

+

Este versátil cable Tipo-C Macho a USB-A Macho, junto con un adaptador de USB-A Hembra a USB-C Macho, ofrece una conectividad flexible a dispositivos objetivo. Permite la transferencia de datos y la transmisión de señales de control de teclado y ratón, independientemente de si el dispositivo objetivo utiliza un puerto USB-A o Tipo-C.

+
    +
  • Longitud: 0.3m
  • +
  • Color: Negro
  • +
  • Adaptador: USB-A Hembra a USB-C Macho
  • +
  • Uso: Facilita el control y la transferencia de datos al dispositivo objetivo.
  • +
+
+

Cable Tipo-C a Tipo-C con Adaptador

+

C2C-150-Cable

+

Este elegante y suave cable Tipo-C Macho a Macho en vibrante color naranja está diseñado para conexiones de computadoras host. Viene con un adaptador de USB-C Hembra a USB-A Macho para una mayor compatibilidad, asegurando que puedas conectarte a computadoras host usando puertos Tipo-C o USB-A. Además, este cable soporta carga rápida de 240W (Voltaje DC50V, Corriente 5A, Potencia 240W), lo que lo hace perfecto no solo para nuestros Mini-KVMs, sino también para cargar tu teléfono móvil o laptop.

+
    +
  • Longitud: 1.5m
  • +
  • Color: Naranja
  • +
  • Adaptador: USB-C Hembra a USB-A Macho
  • +
  • Uso: Para transferencia de datos de alta velocidad entre la computadora host y el Mini-KVM, y para carga rápida de teléfonos móviles o laptops.
  • +
+
+

Cable HDMI Macho a Macho

+

HDMI-Cable

+

Este compacto cable HDMI es perfecto para conectar tu dispositivo objetivo y capturar la salida de video, asegurando una integración perfecta con tu Openterface Mini-KVM.

+
    +
  • Longitud: 0.3m
  • +
  • Color: Negro
  • +
  • Uso: Ideal para la transmisión de video en alta definición desde el dispositivo objetivo al Mini-KVM.
  • +
+
+

Bolsa de Herramientas Openterface

+

Toolkit-bag

+

Mantén tu Openterface Mini-KVM y sus accesorios organizados y portátiles con esta compacta bolsa de herramientas. Con una elegante cremallera naranja y bolsillos de malla elástica, esta bolsa asegura una excelente gestión de cables y facilidad de transporte, perfecta para profesionales de TI en movimiento.

+
    +
  • Dimensiones: 180 x 115 x 50mm
  • +
  • Color: Negro con cremallera naranja
  • +
  • Uso: Ideal para almacenar y organizar tu Mini-KVM y sus cables.
  • +
+
+

Tapa de Extensión de Pines

+

pin-cap

+

Esta tapa de extensión de pines impresa en 3D reemplaza la tapa original del Openterface Mini-KVM, permitiendo a los usuarios avanzados exponer y acceder a los pines de extensión para desarrollo personalizado. Puedes descargar los archivos del modelo 3D desde nuestro repositorio de GitHub e imprimir la tapa tú mismo.

+
    +
  • Uso: Proporciona acceso a los pines de extensión para desarrollo avanzado de hardware.
  • +
  • Descarga: Archivos del Modelo 3D
  • +
+
+

Más Próximamente

+

Mantente atento a más accesorios que se agregarán a esta sección, diseñados para mejorar tu experiencia con el Openterface Mini-KVM.

+ + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/index.html b/android/index.html new file mode 100644 index 0000000..cdf6415 --- /dev/null +++ b/android/index.html @@ -0,0 +1,14 @@ + + + + + + Redirecting... + + + + + +You're being redirected to a new destination. + + diff --git a/app/index.html b/app/index.html new file mode 100644 index 0000000..d6f2894 --- /dev/null +++ b/app/index.html @@ -0,0 +1,2070 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Software Abierto - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Saltar a contenido + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + + +

Software Abierto

+

Aplicaciones Host

+
+ Imagen del Poster +
+ +

Para usar este mini-KVM, el ordenador host debe instalar una de las siguientes aplicaciones host.

+
+ +
+

Consulta Control Básico y Cómo Funciona para más información.

+

Cumplimiento OSI

+

Iniciativa de Código Abierto®

+

Nuestras aplicaciones para el Mini-KVM de Openterface están licenciadas bajo la AGPL-3.0, una licencia aprobada por la Iniciativa de Código Abierto®. El logo de OSI® es una marca registrada de la Iniciativa de Código Abierto, y cumplimos orgullosamente con la Definición de Código Abierto. Para más información, visita la Iniciativa de Código Abierto en http://opensource.org y nuestros repositorios de Github de Openterface.

+

Únete a Nuestro Desarrollo

+

Las aplicaciones host mencionadas están actualmente en desarrollo. ¡Estamos activamente codificando 🛠️ y mejorándolas continuamente! 💪 Si estás interesado en contribuir y quieres ser parte de un equipo de desarrollo innovador, ¡únete ahora! 🚀

+

¿Interesado en el lado del hardware? Visita nuestra página de Hardware Abierto para explorar los esquemas del dispositivo, componentes, y hasta contribuir en su diseño físico! 🔧🖥️

+ + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/app-logo.png b/assets/app-logo.png new file mode 100644 index 0000000..625f0ed Binary files /dev/null and b/assets/app-logo.png differ diff --git a/assets/faq.svg b/assets/faq.svg new file mode 100644 index 0000000..9b0181f --- /dev/null +++ b/assets/faq.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/frequent-question.svg b/assets/frequent-question.svg new file mode 100644 index 0000000..ddf31bc --- /dev/null +++ b/assets/frequent-question.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 0000000..1cf13b9 Binary files /dev/null and b/assets/images/favicon.png differ diff --git a/assets/javascripts/bundle.f1b6f286.min.js b/assets/javascripts/bundle.f1b6f286.min.js new file mode 100644 index 0000000..5082675 --- /dev/null +++ b/assets/javascripts/bundle.f1b6f286.min.js @@ -0,0 +1,16 @@ +"use strict";(()=>{var Wi=Object.create;var gr=Object.defineProperty;var Vi=Object.getOwnPropertyDescriptor;var Di=Object.getOwnPropertyNames,Dt=Object.getOwnPropertySymbols,Ni=Object.getPrototypeOf,yr=Object.prototype.hasOwnProperty,ao=Object.prototype.propertyIsEnumerable;var io=(e,t,r)=>t in e?gr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,$=(e,t)=>{for(var r in t||(t={}))yr.call(t,r)&&io(e,r,t[r]);if(Dt)for(var r of Dt(t))ao.call(t,r)&&io(e,r,t[r]);return e};var so=(e,t)=>{var r={};for(var o in e)yr.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&Dt)for(var o of Dt(e))t.indexOf(o)<0&&ao.call(e,o)&&(r[o]=e[o]);return r};var xr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var zi=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Di(t))!yr.call(e,n)&&n!==r&&gr(e,n,{get:()=>t[n],enumerable:!(o=Vi(t,n))||o.enumerable});return e};var Mt=(e,t,r)=>(r=e!=null?Wi(Ni(e)):{},zi(t||!e||!e.__esModule?gr(r,"default",{value:e,enumerable:!0}):r,e));var co=(e,t,r)=>new Promise((o,n)=>{var i=p=>{try{s(r.next(p))}catch(c){n(c)}},a=p=>{try{s(r.throw(p))}catch(c){n(c)}},s=p=>p.done?o(p.value):Promise.resolve(p.value).then(i,a);s((r=r.apply(e,t)).next())});var lo=xr((Er,po)=>{(function(e,t){typeof Er=="object"&&typeof po!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(Er,function(){"use strict";function e(r){var o=!0,n=!1,i=null,a={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function s(k){return!!(k&&k!==document&&k.nodeName!=="HTML"&&k.nodeName!=="BODY"&&"classList"in k&&"contains"in k.classList)}function p(k){var ft=k.type,qe=k.tagName;return!!(qe==="INPUT"&&a[ft]&&!k.readOnly||qe==="TEXTAREA"&&!k.readOnly||k.isContentEditable)}function c(k){k.classList.contains("focus-visible")||(k.classList.add("focus-visible"),k.setAttribute("data-focus-visible-added",""))}function l(k){k.hasAttribute("data-focus-visible-added")&&(k.classList.remove("focus-visible"),k.removeAttribute("data-focus-visible-added"))}function f(k){k.metaKey||k.altKey||k.ctrlKey||(s(r.activeElement)&&c(r.activeElement),o=!0)}function u(k){o=!1}function d(k){s(k.target)&&(o||p(k.target))&&c(k.target)}function y(k){s(k.target)&&(k.target.classList.contains("focus-visible")||k.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(i),i=window.setTimeout(function(){n=!1},100),l(k.target))}function L(k){document.visibilityState==="hidden"&&(n&&(o=!0),X())}function X(){document.addEventListener("mousemove",J),document.addEventListener("mousedown",J),document.addEventListener("mouseup",J),document.addEventListener("pointermove",J),document.addEventListener("pointerdown",J),document.addEventListener("pointerup",J),document.addEventListener("touchmove",J),document.addEventListener("touchstart",J),document.addEventListener("touchend",J)}function ee(){document.removeEventListener("mousemove",J),document.removeEventListener("mousedown",J),document.removeEventListener("mouseup",J),document.removeEventListener("pointermove",J),document.removeEventListener("pointerdown",J),document.removeEventListener("pointerup",J),document.removeEventListener("touchmove",J),document.removeEventListener("touchstart",J),document.removeEventListener("touchend",J)}function J(k){k.target.nodeName&&k.target.nodeName.toLowerCase()==="html"||(o=!1,ee())}document.addEventListener("keydown",f,!0),document.addEventListener("mousedown",u,!0),document.addEventListener("pointerdown",u,!0),document.addEventListener("touchstart",u,!0),document.addEventListener("visibilitychange",L,!0),X(),r.addEventListener("focus",d,!0),r.addEventListener("blur",y,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var qr=xr((hy,On)=>{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var $a=/["'&<>]/;On.exports=Pa;function Pa(e){var t=""+e,r=$a.exec(t);if(!r)return t;var o,n="",i=0,a=0;for(i=r.index;i{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof It=="object"&&typeof Yr=="object"?Yr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof It=="object"?It.ClipboardJS=r():t.ClipboardJS=r()})(It,function(){return function(){var e={686:function(o,n,i){"use strict";i.d(n,{default:function(){return Ui}});var a=i(279),s=i.n(a),p=i(370),c=i.n(p),l=i(817),f=i.n(l);function u(D){try{return document.execCommand(D)}catch(A){return!1}}var d=function(A){var M=f()(A);return u("cut"),M},y=d;function L(D){var A=document.documentElement.getAttribute("dir")==="rtl",M=document.createElement("textarea");M.style.fontSize="12pt",M.style.border="0",M.style.padding="0",M.style.margin="0",M.style.position="absolute",M.style[A?"right":"left"]="-9999px";var F=window.pageYOffset||document.documentElement.scrollTop;return M.style.top="".concat(F,"px"),M.setAttribute("readonly",""),M.value=D,M}var X=function(A,M){var F=L(A);M.container.appendChild(F);var V=f()(F);return u("copy"),F.remove(),V},ee=function(A){var M=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},F="";return typeof A=="string"?F=X(A,M):A instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(A==null?void 0:A.type)?F=X(A.value,M):(F=f()(A),u("copy")),F},J=ee;function k(D){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?k=function(M){return typeof M}:k=function(M){return M&&typeof Symbol=="function"&&M.constructor===Symbol&&M!==Symbol.prototype?"symbol":typeof M},k(D)}var ft=function(){var A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},M=A.action,F=M===void 0?"copy":M,V=A.container,Y=A.target,$e=A.text;if(F!=="copy"&&F!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(Y!==void 0)if(Y&&k(Y)==="object"&&Y.nodeType===1){if(F==="copy"&&Y.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(F==="cut"&&(Y.hasAttribute("readonly")||Y.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if($e)return J($e,{container:V});if(Y)return F==="cut"?y(Y):J(Y,{container:V})},qe=ft;function Fe(D){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Fe=function(M){return typeof M}:Fe=function(M){return M&&typeof Symbol=="function"&&M.constructor===Symbol&&M!==Symbol.prototype?"symbol":typeof M},Fe(D)}function ki(D,A){if(!(D instanceof A))throw new TypeError("Cannot call a class as a function")}function no(D,A){for(var M=0;M0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof V.action=="function"?V.action:this.defaultAction,this.target=typeof V.target=="function"?V.target:this.defaultTarget,this.text=typeof V.text=="function"?V.text:this.defaultText,this.container=Fe(V.container)==="object"?V.container:document.body}},{key:"listenClick",value:function(V){var Y=this;this.listener=c()(V,"click",function($e){return Y.onClick($e)})}},{key:"onClick",value:function(V){var Y=V.delegateTarget||V.currentTarget,$e=this.action(Y)||"copy",Vt=qe({action:$e,container:this.container,target:this.target(Y),text:this.text(Y)});this.emit(Vt?"success":"error",{action:$e,text:Vt,trigger:Y,clearSelection:function(){Y&&Y.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(V){return vr("action",V)}},{key:"defaultTarget",value:function(V){var Y=vr("target",V);if(Y)return document.querySelector(Y)}},{key:"defaultText",value:function(V){return vr("text",V)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(V){var Y=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return J(V,Y)}},{key:"cut",value:function(V){return y(V)}},{key:"isSupported",value:function(){var V=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],Y=typeof V=="string"?[V]:V,$e=!!document.queryCommandSupported;return Y.forEach(function(Vt){$e=$e&&!!document.queryCommandSupported(Vt)}),$e}}]),M}(s()),Ui=Fi},828:function(o){var n=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function a(s,p){for(;s&&s.nodeType!==n;){if(typeof s.matches=="function"&&s.matches(p))return s;s=s.parentNode}}o.exports=a},438:function(o,n,i){var a=i(828);function s(l,f,u,d,y){var L=c.apply(this,arguments);return l.addEventListener(u,L,y),{destroy:function(){l.removeEventListener(u,L,y)}}}function p(l,f,u,d,y){return typeof l.addEventListener=="function"?s.apply(null,arguments):typeof u=="function"?s.bind(null,document).apply(null,arguments):(typeof l=="string"&&(l=document.querySelectorAll(l)),Array.prototype.map.call(l,function(L){return s(L,f,u,d,y)}))}function c(l,f,u,d){return function(y){y.delegateTarget=a(y.target,f),y.delegateTarget&&d.call(l,y)}}o.exports=p},879:function(o,n){n.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},n.nodeList=function(i){var a=Object.prototype.toString.call(i);return i!==void 0&&(a==="[object NodeList]"||a==="[object HTMLCollection]")&&"length"in i&&(i.length===0||n.node(i[0]))},n.string=function(i){return typeof i=="string"||i instanceof String},n.fn=function(i){var a=Object.prototype.toString.call(i);return a==="[object Function]"}},370:function(o,n,i){var a=i(879),s=i(438);function p(u,d,y){if(!u&&!d&&!y)throw new Error("Missing required arguments");if(!a.string(d))throw new TypeError("Second argument must be a String");if(!a.fn(y))throw new TypeError("Third argument must be a Function");if(a.node(u))return c(u,d,y);if(a.nodeList(u))return l(u,d,y);if(a.string(u))return f(u,d,y);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(u,d,y){return u.addEventListener(d,y),{destroy:function(){u.removeEventListener(d,y)}}}function l(u,d,y){return Array.prototype.forEach.call(u,function(L){L.addEventListener(d,y)}),{destroy:function(){Array.prototype.forEach.call(u,function(L){L.removeEventListener(d,y)})}}}function f(u,d,y){return s(document.body,u,d,y)}o.exports=p},817:function(o){function n(i){var a;if(i.nodeName==="SELECT")i.focus(),a=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var s=i.hasAttribute("readonly");s||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),s||i.removeAttribute("readonly"),a=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var p=window.getSelection(),c=document.createRange();c.selectNodeContents(i),p.removeAllRanges(),p.addRange(c),a=p.toString()}return a}o.exports=n},279:function(o){function n(){}n.prototype={on:function(i,a,s){var p=this.e||(this.e={});return(p[i]||(p[i]=[])).push({fn:a,ctx:s}),this},once:function(i,a,s){var p=this;function c(){p.off(i,c),a.apply(s,arguments)}return c._=a,this.on(i,c,s)},emit:function(i){var a=[].slice.call(arguments,1),s=((this.e||(this.e={}))[i]||[]).slice(),p=0,c=s.length;for(p;p0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function N(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var o=r.call(e),n,i=[],a;try{for(;(t===void 0||t-- >0)&&!(n=o.next()).done;)i.push(n.value)}catch(s){a={error:s}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(a)throw a.error}}return i}function q(e,t,r){if(r||arguments.length===2)for(var o=0,n=t.length,i;o1||p(d,L)})},y&&(n[d]=y(n[d])))}function p(d,y){try{c(o[d](y))}catch(L){u(i[0][3],L)}}function c(d){d.value instanceof nt?Promise.resolve(d.value.v).then(l,f):u(i[0][2],d)}function l(d){p("next",d)}function f(d){p("throw",d)}function u(d,y){d(y),i.shift(),i.length&&p(i[0][0],i[0][1])}}function uo(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof he=="function"?he(e):e[Symbol.iterator](),r={},o("next"),o("throw"),o("return"),r[Symbol.asyncIterator]=function(){return this},r);function o(i){r[i]=e[i]&&function(a){return new Promise(function(s,p){a=e[i](a),n(s,p,a.done,a.value)})}}function n(i,a,s,p){Promise.resolve(p).then(function(c){i({value:c,done:s})},a)}}function H(e){return typeof e=="function"}function ut(e){var t=function(o){Error.call(o),o.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var zt=ut(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(o,n){return n+1+") "+o.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function Qe(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Ue=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var a=this._parentage;if(a)if(this._parentage=null,Array.isArray(a))try{for(var s=he(a),p=s.next();!p.done;p=s.next()){var c=p.value;c.remove(this)}}catch(L){t={error:L}}finally{try{p&&!p.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}else a.remove(this);var l=this.initialTeardown;if(H(l))try{l()}catch(L){i=L instanceof zt?L.errors:[L]}var f=this._finalizers;if(f){this._finalizers=null;try{for(var u=he(f),d=u.next();!d.done;d=u.next()){var y=d.value;try{ho(y)}catch(L){i=i!=null?i:[],L instanceof zt?i=q(q([],N(i)),N(L.errors)):i.push(L)}}}catch(L){o={error:L}}finally{try{d&&!d.done&&(n=u.return)&&n.call(u)}finally{if(o)throw o.error}}}if(i)throw new zt(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)ho(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&Qe(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&Qe(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Tr=Ue.EMPTY;function qt(e){return e instanceof Ue||e&&"closed"in e&&H(e.remove)&&H(e.add)&&H(e.unsubscribe)}function ho(e){H(e)?e():e.unsubscribe()}var Pe={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var dt={setTimeout:function(e,t){for(var r=[],o=2;o0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var o=this,n=this,i=n.hasError,a=n.isStopped,s=n.observers;return i||a?Tr:(this.currentObservers=null,s.push(r),new Ue(function(){o.currentObservers=null,Qe(s,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,a=o.isStopped;n?r.error(i):a&&r.complete()},t.prototype.asObservable=function(){var r=new j;return r.source=this,r},t.create=function(r,o){return new To(r,o)},t}(j);var To=function(e){oe(t,e);function t(r,o){var n=e.call(this)||this;return n.destination=r,n.source=o,n}return t.prototype.next=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.next)===null||n===void 0||n.call(o,r)},t.prototype.error=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.error)===null||n===void 0||n.call(o,r)},t.prototype.complete=function(){var r,o;(o=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||o===void 0||o.call(r)},t.prototype._subscribe=function(r){var o,n;return(n=(o=this.source)===null||o===void 0?void 0:o.subscribe(r))!==null&&n!==void 0?n:Tr},t}(g);var _r=function(e){oe(t,e);function t(r){var o=e.call(this)||this;return o._value=r,o}return Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!1,configurable:!0}),t.prototype._subscribe=function(r){var o=e.prototype._subscribe.call(this,r);return!o.closed&&r.next(this._value),o},t.prototype.getValue=function(){var r=this,o=r.hasError,n=r.thrownError,i=r._value;if(o)throw n;return this._throwIfClosed(),i},t.prototype.next=function(r){e.prototype.next.call(this,this._value=r)},t}(g);var At={now:function(){return(At.delegate||Date).now()},delegate:void 0};var Ct=function(e){oe(t,e);function t(r,o,n){r===void 0&&(r=1/0),o===void 0&&(o=1/0),n===void 0&&(n=At);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=o,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=o===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,o),i}return t.prototype.next=function(r){var o=this,n=o.isStopped,i=o._buffer,a=o._infiniteTimeWindow,s=o._timestampProvider,p=o._windowTime;n||(i.push(r),!a&&i.push(s.now()+p)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var o=this._innerSubscribe(r),n=this,i=n._infiniteTimeWindow,a=n._buffer,s=a.slice(),p=0;p0?e.prototype.schedule.call(this,r,o):(this.delay=o,this.state=r,this.scheduler.flush(this),this)},t.prototype.execute=function(r,o){return o>0||this.closed?e.prototype.execute.call(this,r,o):this._execute(r,o)},t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!=null&&n>0||n==null&&this.delay>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.flush(this),0)},t}(gt);var Lo=function(e){oe(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t}(yt);var kr=new Lo(Oo);var Mo=function(e){oe(t,e);function t(r,o){var n=e.call(this,r,o)||this;return n.scheduler=r,n.work=o,n}return t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!==null&&n>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=vt.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){var i;if(n===void 0&&(n=0),n!=null?n>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);var a=r.actions;o!=null&&((i=a[a.length-1])===null||i===void 0?void 0:i.id)!==o&&(vt.cancelAnimationFrame(o),r._scheduled=void 0)},t}(gt);var _o=function(e){oe(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var o=this._scheduled;this._scheduled=void 0;var n=this.actions,i;r=r||n.shift();do if(i=r.execute(r.state,r.delay))break;while((r=n[0])&&r.id===o&&n.shift());if(this._active=!1,i){for(;(r=n[0])&&r.id===o&&n.shift();)r.unsubscribe();throw i}},t}(yt);var me=new _o(Mo);var S=new j(function(e){return e.complete()});function Yt(e){return e&&H(e.schedule)}function Hr(e){return e[e.length-1]}function Xe(e){return H(Hr(e))?e.pop():void 0}function ke(e){return Yt(Hr(e))?e.pop():void 0}function Bt(e,t){return typeof Hr(e)=="number"?e.pop():t}var xt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Gt(e){return H(e==null?void 0:e.then)}function Jt(e){return H(e[bt])}function Xt(e){return Symbol.asyncIterator&&H(e==null?void 0:e[Symbol.asyncIterator])}function Zt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function Zi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var er=Zi();function tr(e){return H(e==null?void 0:e[er])}function rr(e){return fo(this,arguments,function(){var r,o,n,i;return Nt(this,function(a){switch(a.label){case 0:r=e.getReader(),a.label=1;case 1:a.trys.push([1,,9,10]),a.label=2;case 2:return[4,nt(r.read())];case 3:return o=a.sent(),n=o.value,i=o.done,i?[4,nt(void 0)]:[3,5];case 4:return[2,a.sent()];case 5:return[4,nt(n)];case 6:return[4,a.sent()];case 7:return a.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function or(e){return H(e==null?void 0:e.getReader)}function U(e){if(e instanceof j)return e;if(e!=null){if(Jt(e))return ea(e);if(xt(e))return ta(e);if(Gt(e))return ra(e);if(Xt(e))return Ao(e);if(tr(e))return oa(e);if(or(e))return na(e)}throw Zt(e)}function ea(e){return new j(function(t){var r=e[bt]();if(H(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function ta(e){return new j(function(t){for(var r=0;r=2;return function(o){return o.pipe(e?b(function(n,i){return e(n,i,o)}):le,Te(1),r?Ve(t):Qo(function(){return new ir}))}}function jr(e){return e<=0?function(){return S}:E(function(t,r){var o=[];t.subscribe(T(r,function(n){o.push(n),e=2,!0))}function pe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new g}:t,o=e.resetOnError,n=o===void 0?!0:o,i=e.resetOnComplete,a=i===void 0?!0:i,s=e.resetOnRefCountZero,p=s===void 0?!0:s;return function(c){var l,f,u,d=0,y=!1,L=!1,X=function(){f==null||f.unsubscribe(),f=void 0},ee=function(){X(),l=u=void 0,y=L=!1},J=function(){var k=l;ee(),k==null||k.unsubscribe()};return E(function(k,ft){d++,!L&&!y&&X();var qe=u=u!=null?u:r();ft.add(function(){d--,d===0&&!L&&!y&&(f=Ur(J,p))}),qe.subscribe(ft),!l&&d>0&&(l=new at({next:function(Fe){return qe.next(Fe)},error:function(Fe){L=!0,X(),f=Ur(ee,n,Fe),qe.error(Fe)},complete:function(){y=!0,X(),f=Ur(ee,a),qe.complete()}}),U(k).subscribe(l))})(c)}}function Ur(e,t){for(var r=[],o=2;oe.next(document)),e}function P(e,t=document){return Array.from(t.querySelectorAll(e))}function R(e,t=document){let r=fe(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function fe(e,t=document){return t.querySelector(e)||void 0}function Ie(){var e,t,r,o;return(o=(r=(t=(e=document.activeElement)==null?void 0:e.shadowRoot)==null?void 0:t.activeElement)!=null?r:document.activeElement)!=null?o:void 0}var wa=O(h(document.body,"focusin"),h(document.body,"focusout")).pipe(_e(1),Q(void 0),m(()=>Ie()||document.body),G(1));function et(e){return wa.pipe(m(t=>e.contains(t)),K())}function $t(e,t){return C(()=>O(h(e,"mouseenter").pipe(m(()=>!0)),h(e,"mouseleave").pipe(m(()=>!1))).pipe(t?Ht(r=>Le(+!r*t)):le,Q(e.matches(":hover"))))}function Jo(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)Jo(e,r)}function x(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="undefined"&&(typeof t[n]!="boolean"?o.setAttribute(n,t[n]):o.setAttribute(n,""));for(let n of r)Jo(o,n);return o}function sr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function Tt(e){let t=x("script",{src:e});return C(()=>(document.head.appendChild(t),O(h(t,"load"),h(t,"error").pipe(v(()=>$r(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),_(()=>document.head.removeChild(t)),Te(1))))}var Xo=new g,Ta=C(()=>typeof ResizeObserver=="undefined"?Tt("https://unpkg.com/resize-observer-polyfill"):I(void 0)).pipe(m(()=>new ResizeObserver(e=>e.forEach(t=>Xo.next(t)))),v(e=>O(Ye,I(e)).pipe(_(()=>e.disconnect()))),G(1));function ce(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ge(e){let t=e;for(;t.clientWidth===0&&t.parentElement;)t=t.parentElement;return Ta.pipe(w(r=>r.observe(t)),v(r=>Xo.pipe(b(o=>o.target===t),_(()=>r.unobserve(t)))),m(()=>ce(e)),Q(ce(e)))}function St(e){return{width:e.scrollWidth,height:e.scrollHeight}}function cr(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}function Zo(e){let t=[],r=e.parentElement;for(;r;)(e.clientWidth>r.clientWidth||e.clientHeight>r.clientHeight)&&t.push(r),r=(e=r).parentElement;return t.length===0&&t.push(document.documentElement),t}function De(e){return{x:e.offsetLeft,y:e.offsetTop}}function en(e){let t=e.getBoundingClientRect();return{x:t.x+window.scrollX,y:t.y+window.scrollY}}function tn(e){return O(h(window,"load"),h(window,"resize")).pipe(Me(0,me),m(()=>De(e)),Q(De(e)))}function pr(e){return{x:e.scrollLeft,y:e.scrollTop}}function Ne(e){return O(h(e,"scroll"),h(window,"scroll"),h(window,"resize")).pipe(Me(0,me),m(()=>pr(e)),Q(pr(e)))}var rn=new g,Sa=C(()=>I(new IntersectionObserver(e=>{for(let t of e)rn.next(t)},{threshold:0}))).pipe(v(e=>O(Ye,I(e)).pipe(_(()=>e.disconnect()))),G(1));function tt(e){return Sa.pipe(w(t=>t.observe(e)),v(t=>rn.pipe(b(({target:r})=>r===e),_(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function on(e,t=16){return Ne(e).pipe(m(({y:r})=>{let o=ce(e),n=St(e);return r>=n.height-o.height-t}),K())}var lr={drawer:R("[data-md-toggle=drawer]"),search:R("[data-md-toggle=search]")};function nn(e){return lr[e].checked}function Je(e,t){lr[e].checked!==t&&lr[e].click()}function ze(e){let t=lr[e];return h(t,"change").pipe(m(()=>t.checked),Q(t.checked))}function Oa(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function La(){return O(h(window,"compositionstart").pipe(m(()=>!0)),h(window,"compositionend").pipe(m(()=>!1))).pipe(Q(!1))}function an(){let e=h(window,"keydown").pipe(b(t=>!(t.metaKey||t.ctrlKey)),m(t=>({mode:nn("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),b(({mode:t,type:r})=>{if(t==="global"){let o=Ie();if(typeof o!="undefined")return!Oa(o,r)}return!0}),pe());return La().pipe(v(t=>t?S:e))}function ye(){return new URL(location.href)}function lt(e,t=!1){if(B("navigation.instant")&&!t){let r=x("a",{href:e.href});document.body.appendChild(r),r.click(),r.remove()}else location.href=e.href}function sn(){return new g}function cn(){return location.hash.slice(1)}function pn(e){let t=x("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Ma(e){return O(h(window,"hashchange"),e).pipe(m(cn),Q(cn()),b(t=>t.length>0),G(1))}function ln(e){return Ma(e).pipe(m(t=>fe(`[id="${t}"]`)),b(t=>typeof t!="undefined"))}function Pt(e){let t=matchMedia(e);return ar(r=>t.addListener(()=>r(t.matches))).pipe(Q(t.matches))}function mn(){let e=matchMedia("print");return O(h(window,"beforeprint").pipe(m(()=>!0)),h(window,"afterprint").pipe(m(()=>!1))).pipe(Q(e.matches))}function Nr(e,t){return e.pipe(v(r=>r?t():S))}function zr(e,t){return new j(r=>{let o=new XMLHttpRequest;return o.open("GET",`${e}`),o.responseType="blob",o.addEventListener("load",()=>{o.status>=200&&o.status<300?(r.next(o.response),r.complete()):r.error(new Error(o.statusText))}),o.addEventListener("error",()=>{r.error(new Error("Network error"))}),o.addEventListener("abort",()=>{r.complete()}),typeof(t==null?void 0:t.progress$)!="undefined"&&(o.addEventListener("progress",n=>{var i;if(n.lengthComputable)t.progress$.next(n.loaded/n.total*100);else{let a=(i=o.getResponseHeader("Content-Length"))!=null?i:0;t.progress$.next(n.loaded/+a*100)}}),t.progress$.next(5)),o.send(),()=>o.abort()})}function je(e,t){return zr(e,t).pipe(v(r=>r.text()),m(r=>JSON.parse(r)),G(1))}function fn(e,t){let r=new DOMParser;return zr(e,t).pipe(v(o=>o.text()),m(o=>r.parseFromString(o,"text/html")),G(1))}function un(e,t){let r=new DOMParser;return zr(e,t).pipe(v(o=>o.text()),m(o=>r.parseFromString(o,"text/xml")),G(1))}function dn(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function hn(){return O(h(window,"scroll",{passive:!0}),h(window,"resize",{passive:!0})).pipe(m(dn),Q(dn()))}function bn(){return{width:innerWidth,height:innerHeight}}function vn(){return h(window,"resize",{passive:!0}).pipe(m(bn),Q(bn()))}function gn(){return z([hn(),vn()]).pipe(m(([e,t])=>({offset:e,size:t})),G(1))}function mr(e,{viewport$:t,header$:r}){let o=t.pipe(te("size")),n=z([o,r]).pipe(m(()=>De(e)));return z([r,t,n]).pipe(m(([{height:i},{offset:a,size:s},{x:p,y:c}])=>({offset:{x:a.x-p,y:a.y-c+i},size:s})))}function _a(e){return h(e,"message",t=>t.data)}function Aa(e){let t=new g;return t.subscribe(r=>e.postMessage(r)),t}function yn(e,t=new Worker(e)){let r=_a(t),o=Aa(t),n=new g;n.subscribe(o);let i=o.pipe(Z(),ie(!0));return n.pipe(Z(),Re(r.pipe(W(i))),pe())}var Ca=R("#__config"),Ot=JSON.parse(Ca.textContent);Ot.base=`${new URL(Ot.base,ye())}`;function xe(){return Ot}function B(e){return Ot.features.includes(e)}function Ee(e,t){return typeof t!="undefined"?Ot.translations[e].replace("#",t.toString()):Ot.translations[e]}function Se(e,t=document){return R(`[data-md-component=${e}]`,t)}function ae(e,t=document){return P(`[data-md-component=${e}]`,t)}function ka(e){let t=R(".md-typeset > :first-child",e);return h(t,"click",{once:!0}).pipe(m(()=>R(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function xn(e){if(!B("announce.dismiss")||!e.childElementCount)return S;if(!e.hidden){let t=R(".md-typeset",e);__md_hash(t.innerHTML)===__md_get("__announce")&&(e.hidden=!0)}return C(()=>{let t=new g;return t.subscribe(({hash:r})=>{e.hidden=!0,__md_set("__announce",r)}),ka(e).pipe(w(r=>t.next(r)),_(()=>t.complete()),m(r=>$({ref:e},r)))})}function Ha(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function En(e,t){let r=new g;return r.subscribe(({hidden:o})=>{e.hidden=o}),Ha(e,t).pipe(w(o=>r.next(o)),_(()=>r.complete()),m(o=>$({ref:e},o)))}function Rt(e,t){return t==="inline"?x("div",{class:"md-tooltip md-tooltip--inline",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"})):x("div",{class:"md-tooltip",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"}))}function wn(...e){return x("div",{class:"md-tooltip2",role:"tooltip"},x("div",{class:"md-tooltip2__inner md-typeset"},e))}function Tn(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return x("aside",{class:"md-annotation",tabIndex:0},Rt(t),x("a",{href:r,class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}else return x("aside",{class:"md-annotation",tabIndex:0},Rt(t),x("span",{class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}function Sn(e){return x("button",{class:"md-clipboard md-icon",title:Ee("clipboard.copy"),"data-clipboard-target":`#${e} > code`})}var Ln=Mt(qr());function Qr(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(p=>!e.terms[p]).reduce((p,c)=>[...p,x("del",null,(0,Ln.default)(c))," "],[]).slice(0,-1),i=xe(),a=new URL(e.location,i.base);B("search.highlight")&&a.searchParams.set("h",Object.entries(e.terms).filter(([,p])=>p).reduce((p,[c])=>`${p} ${c}`.trim(),""));let{tags:s}=xe();return x("a",{href:`${a}`,class:"md-search-result__link",tabIndex:-1},x("article",{class:"md-search-result__article md-typeset","data-md-score":e.score.toFixed(2)},r>0&&x("div",{class:"md-search-result__icon md-icon"}),r>0&&x("h1",null,e.title),r<=0&&x("h2",null,e.title),o>0&&e.text.length>0&&e.text,e.tags&&x("nav",{class:"md-tags"},e.tags.map(p=>{let c=s?p in s?`md-tag-icon md-tag--${s[p]}`:"md-tag-icon":"";return x("span",{class:`md-tag ${c}`},p)})),o>0&&n.length>0&&x("p",{class:"md-search-result__terms"},Ee("search.result.term.missing"),": ",...n)))}function Mn(e){let t=e[0].score,r=[...e],o=xe(),n=r.findIndex(l=>!`${new URL(l.location,o.base)}`.includes("#")),[i]=r.splice(n,1),a=r.findIndex(l=>l.scoreQr(l,1)),...p.length?[x("details",{class:"md-search-result__more"},x("summary",{tabIndex:-1},x("div",null,p.length>0&&p.length===1?Ee("search.result.more.one"):Ee("search.result.more.other",p.length))),...p.map(l=>Qr(l,1)))]:[]];return x("li",{class:"md-search-result__item"},c)}function _n(e){return x("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>x("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?sr(r):r)))}function Kr(e){let t=`tabbed-control tabbed-control--${e}`;return x("div",{class:t,hidden:!0},x("button",{class:"tabbed-button",tabIndex:-1,"aria-hidden":"true"}))}function An(e){return x("div",{class:"md-typeset__scrollwrap"},x("div",{class:"md-typeset__table"},e))}function Ra(e){var o;let t=xe(),r=new URL(`../${e.version}/`,t.base);return x("li",{class:"md-version__item"},x("a",{href:`${r}`,class:"md-version__link"},e.title,((o=t.version)==null?void 0:o.alias)&&e.aliases.length>0&&x("span",{class:"md-version__alias"},e.aliases[0])))}function Cn(e,t){var o;let r=xe();return e=e.filter(n=>{var i;return!((i=n.properties)!=null&&i.hidden)}),x("div",{class:"md-version"},x("button",{class:"md-version__current","aria-label":Ee("select.version")},t.title,((o=r.version)==null?void 0:o.alias)&&t.aliases.length>0&&x("span",{class:"md-version__alias"},t.aliases[0])),x("ul",{class:"md-version__list"},e.map(Ra)))}var Ia=0;function ja(e){let t=z([et(e),$t(e)]).pipe(m(([o,n])=>o||n),K()),r=C(()=>Zo(e)).pipe(ne(Ne),pt(1),He(t),m(()=>en(e)));return t.pipe(Ae(o=>o),v(()=>z([t,r])),m(([o,n])=>({active:o,offset:n})),pe())}function Fa(e,t){let{content$:r,viewport$:o}=t,n=`__tooltip2_${Ia++}`;return C(()=>{let i=new g,a=new _r(!1);i.pipe(Z(),ie(!1)).subscribe(a);let s=a.pipe(Ht(c=>Le(+!c*250,kr)),K(),v(c=>c?r:S),w(c=>c.id=n),pe());z([i.pipe(m(({active:c})=>c)),s.pipe(v(c=>$t(c,250)),Q(!1))]).pipe(m(c=>c.some(l=>l))).subscribe(a);let p=a.pipe(b(c=>c),re(s,o),m(([c,l,{size:f}])=>{let u=e.getBoundingClientRect(),d=u.width/2;if(l.role==="tooltip")return{x:d,y:8+u.height};if(u.y>=f.height/2){let{height:y}=ce(l);return{x:d,y:-16-y}}else return{x:d,y:16+u.height}}));return z([s,i,p]).subscribe(([c,{offset:l},f])=>{c.style.setProperty("--md-tooltip-host-x",`${l.x}px`),c.style.setProperty("--md-tooltip-host-y",`${l.y}px`),c.style.setProperty("--md-tooltip-x",`${f.x}px`),c.style.setProperty("--md-tooltip-y",`${f.y}px`),c.classList.toggle("md-tooltip2--top",f.y<0),c.classList.toggle("md-tooltip2--bottom",f.y>=0)}),a.pipe(b(c=>c),re(s,(c,l)=>l),b(c=>c.role==="tooltip")).subscribe(c=>{let l=ce(R(":scope > *",c));c.style.setProperty("--md-tooltip-width",`${l.width}px`),c.style.setProperty("--md-tooltip-tail","0px")}),a.pipe(K(),ve(me),re(s)).subscribe(([c,l])=>{l.classList.toggle("md-tooltip2--active",c)}),z([a.pipe(b(c=>c)),s]).subscribe(([c,l])=>{l.role==="dialog"?(e.setAttribute("aria-controls",n),e.setAttribute("aria-haspopup","dialog")):e.setAttribute("aria-describedby",n)}),a.pipe(b(c=>!c)).subscribe(()=>{e.removeAttribute("aria-controls"),e.removeAttribute("aria-describedby"),e.removeAttribute("aria-haspopup")}),ja(e).pipe(w(c=>i.next(c)),_(()=>i.complete()),m(c=>$({ref:e},c)))})}function mt(e,{viewport$:t},r=document.body){return Fa(e,{content$:new j(o=>{let n=e.title,i=wn(n);return o.next(i),e.removeAttribute("title"),r.append(i),()=>{i.remove(),e.setAttribute("title",n)}}),viewport$:t})}function Ua(e,t){let r=C(()=>z([tn(e),Ne(t)])).pipe(m(([{x:o,y:n},i])=>{let{width:a,height:s}=ce(e);return{x:o-i.x+a/2,y:n-i.y+s/2}}));return et(e).pipe(v(o=>r.pipe(m(n=>({active:o,offset:n})),Te(+!o||1/0))))}function kn(e,t,{target$:r}){let[o,n]=Array.from(e.children);return C(()=>{let i=new g,a=i.pipe(Z(),ie(!0));return i.subscribe({next({offset:s}){e.style.setProperty("--md-tooltip-x",`${s.x}px`),e.style.setProperty("--md-tooltip-y",`${s.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),tt(e).pipe(W(a)).subscribe(s=>{e.toggleAttribute("data-md-visible",s)}),O(i.pipe(b(({active:s})=>s)),i.pipe(_e(250),b(({active:s})=>!s))).subscribe({next({active:s}){s?e.prepend(o):o.remove()},complete(){e.prepend(o)}}),i.pipe(Me(16,me)).subscribe(({active:s})=>{o.classList.toggle("md-tooltip--active",s)}),i.pipe(pt(125,me),b(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:s})=>s)).subscribe({next(s){s?e.style.setProperty("--md-tooltip-0",`${-s}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),h(n,"click").pipe(W(a),b(s=>!(s.metaKey||s.ctrlKey))).subscribe(s=>{s.stopPropagation(),s.preventDefault()}),h(n,"mousedown").pipe(W(a),re(i)).subscribe(([s,{active:p}])=>{var c;if(s.button!==0||s.metaKey||s.ctrlKey)s.preventDefault();else if(p){s.preventDefault();let l=e.parentElement.closest(".md-annotation");l instanceof HTMLElement?l.focus():(c=Ie())==null||c.blur()}}),r.pipe(W(a),b(s=>s===o),Ge(125)).subscribe(()=>e.focus()),Ua(e,t).pipe(w(s=>i.next(s)),_(()=>i.complete()),m(s=>$({ref:e},s)))})}function Wa(e){return e.tagName==="CODE"?P(".c, .c1, .cm",e):[e]}function Va(e){let t=[];for(let r of Wa(e)){let o=[],n=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=n.nextNode();i;i=n.nextNode())o.push(i);for(let i of o){let a;for(;a=/(\(\d+\))(!)?/.exec(i.textContent);){let[,s,p]=a;if(typeof p=="undefined"){let c=i.splitText(a.index);i=c.splitText(s.length),t.push(c)}else{i.textContent=s,t.push(i);break}}}}return t}function Hn(e,t){t.append(...Array.from(e.childNodes))}function fr(e,t,{target$:r,print$:o}){let n=t.closest("[id]"),i=n==null?void 0:n.id,a=new Map;for(let s of Va(t)){let[,p]=s.textContent.match(/\((\d+)\)/);fe(`:scope > li:nth-child(${p})`,e)&&(a.set(p,Tn(p,i)),s.replaceWith(a.get(p)))}return a.size===0?S:C(()=>{let s=new g,p=s.pipe(Z(),ie(!0)),c=[];for(let[l,f]of a)c.push([R(".md-typeset",f),R(`:scope > li:nth-child(${l})`,e)]);return o.pipe(W(p)).subscribe(l=>{e.hidden=!l,e.classList.toggle("md-annotation-list",l);for(let[f,u]of c)l?Hn(f,u):Hn(u,f)}),O(...[...a].map(([,l])=>kn(l,t,{target$:r}))).pipe(_(()=>s.complete()),pe())})}function $n(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return $n(t)}}function Pn(e,t){return C(()=>{let r=$n(e);return typeof r!="undefined"?fr(r,e,t):S})}var Rn=Mt(Br());var Da=0;function In(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return In(t)}}function Na(e){return ge(e).pipe(m(({width:t})=>({scrollable:St(e).width>t})),te("scrollable"))}function jn(e,t){let{matches:r}=matchMedia("(hover)"),o=C(()=>{let n=new g,i=n.pipe(jr(1));n.subscribe(({scrollable:c})=>{c&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")});let a=[];if(Rn.default.isSupported()&&(e.closest(".copy")||B("content.code.copy")&&!e.closest(".no-copy"))){let c=e.closest("pre");c.id=`__code_${Da++}`;let l=Sn(c.id);c.insertBefore(l,e),B("content.tooltips")&&a.push(mt(l,{viewport$}))}let s=e.closest(".highlight");if(s instanceof HTMLElement){let c=In(s);if(typeof c!="undefined"&&(s.classList.contains("annotate")||B("content.code.annotate"))){let l=fr(c,e,t);a.push(ge(s).pipe(W(i),m(({width:f,height:u})=>f&&u),K(),v(f=>f?l:S)))}}return P(":scope > span[id]",e).length&&e.classList.add("md-code__content"),Na(e).pipe(w(c=>n.next(c)),_(()=>n.complete()),m(c=>$({ref:e},c)),Re(...a))});return B("content.lazy")?tt(e).pipe(b(n=>n),Te(1),v(()=>o)):o}function za(e,{target$:t,print$:r}){let o=!0;return O(t.pipe(m(n=>n.closest("details:not([open])")),b(n=>e===n),m(()=>({action:"open",reveal:!0}))),r.pipe(b(n=>n||!o),w(()=>o=e.open),m(n=>({action:n?"open":"close"}))))}function Fn(e,t){return C(()=>{let r=new g;return r.subscribe(({action:o,reveal:n})=>{e.toggleAttribute("open",o==="open"),n&&e.scrollIntoView()}),za(e,t).pipe(w(o=>r.next(o)),_(()=>r.complete()),m(o=>$({ref:e},o)))})}var Un=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:#0000}.flowchartTitleText{fill:var(--md-mermaid-label-fg-color)}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel p,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel p{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color);stroke-width:.05rem}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}g #flowchart-circleEnd,g #flowchart-circleStart,g #flowchart-crossEnd,g #flowchart-crossStart,g #flowchart-pointEnd,g #flowchart-pointStart{stroke:none}.classDiagramTitleText{fill:var(--md-mermaid-label-fg-color)}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs marker.marker.composition.class path,defs marker.marker.dependency.class path,defs marker.marker.extension.class path{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs marker.marker.aggregation.class path{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}.statediagramTitleText{fill:var(--md-mermaid-label-fg-color)}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel,.nodeLabel p{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}a .nodeLabel{text-decoration:underline}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}.entityTitleText{fill:var(--md-mermaid-label-fg-color)}.attributeBoxEven,.attributeBoxOdd{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityBox{fill:var(--md-mermaid-label-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityLabel{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.relationshipLabelBox{fill:var(--md-mermaid-label-bg-color);fill-opacity:1;background-color:var(--md-mermaid-label-bg-color);opacity:1}.relationshipLabel{fill:var(--md-mermaid-label-fg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs #ONE_OR_MORE_END *,defs #ONE_OR_MORE_START *,defs #ONLY_ONE_END *,defs #ONLY_ONE_START *,defs #ZERO_OR_MORE_END *,defs #ZERO_OR_MORE_START *,defs #ZERO_OR_ONE_END *,defs #ZERO_OR_ONE_START *{stroke:var(--md-mermaid-edge-color)!important}defs #ZERO_OR_MORE_END circle,defs #ZERO_OR_MORE_START circle{fill:var(--md-mermaid-label-bg-color)}text:not([class]):last-child{fill:var(--md-mermaid-label-fg-color)}.actor{fill:var(--md-mermaid-sequence-actor-bg-color);stroke:var(--md-mermaid-sequence-actor-border-color)}text.actor>tspan{fill:var(--md-mermaid-sequence-actor-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-mermaid-sequence-actor-line-color)}.actor-man circle,.actor-man line{fill:var(--md-mermaid-sequence-actorman-bg-color);stroke:var(--md-mermaid-sequence-actorman-line-color)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-sequence-message-line-color)}.note{fill:var(--md-mermaid-sequence-note-bg-color);stroke:var(--md-mermaid-sequence-note-border-color)}.loopText,.loopText>tspan,.messageText,.noteText>tspan{stroke:none;font-family:var(--md-mermaid-font-family)!important}.messageText{fill:var(--md-mermaid-sequence-message-fg-color)}.loopText,.loopText>tspan{fill:var(--md-mermaid-sequence-loop-fg-color)}.noteText>tspan{fill:var(--md-mermaid-sequence-note-fg-color)}#arrowhead path{fill:var(--md-mermaid-sequence-message-line-color);stroke:none}.loopLine{fill:var(--md-mermaid-sequence-loop-bg-color);stroke:var(--md-mermaid-sequence-loop-border-color)}.labelBox{fill:var(--md-mermaid-sequence-label-bg-color);stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-sequence-label-fg-color);font-family:var(--md-mermaid-font-family)}.sequenceNumber{fill:var(--md-mermaid-sequence-number-fg-color)}rect.rect{fill:var(--md-mermaid-sequence-box-bg-color);stroke:none}rect.rect+text.text{fill:var(--md-mermaid-sequence-box-fg-color)}defs #sequencenumber{fill:var(--md-mermaid-sequence-number-bg-color)!important}";var Gr,Qa=0;function Ka(){return typeof mermaid=="undefined"||mermaid instanceof Element?Tt("https://unpkg.com/mermaid@11/dist/mermaid.min.js"):I(void 0)}function Wn(e){return e.classList.remove("mermaid"),Gr||(Gr=Ka().pipe(w(()=>mermaid.initialize({startOnLoad:!1,themeCSS:Un,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),G(1))),Gr.subscribe(()=>co(this,null,function*(){e.classList.add("mermaid");let t=`__mermaid_${Qa++}`,r=x("div",{class:"mermaid"}),o=e.textContent,{svg:n,fn:i}=yield mermaid.render(t,o),a=r.attachShadow({mode:"closed"});a.innerHTML=n,e.replaceWith(r),i==null||i(a)})),Gr.pipe(m(()=>({ref:e})))}var Vn=x("table");function Dn(e){return e.replaceWith(Vn),Vn.replaceWith(An(e)),I({ref:e})}function Ya(e){let t=e.find(r=>r.checked)||e[0];return O(...e.map(r=>h(r,"change").pipe(m(()=>R(`label[for="${r.id}"]`))))).pipe(Q(R(`label[for="${t.id}"]`)),m(r=>({active:r})))}function Nn(e,{viewport$:t,target$:r}){let o=R(".tabbed-labels",e),n=P(":scope > input",e),i=Kr("prev");e.append(i);let a=Kr("next");return e.append(a),C(()=>{let s=new g,p=s.pipe(Z(),ie(!0));z([s,ge(e),tt(e)]).pipe(W(p),Me(1,me)).subscribe({next([{active:c},l]){let f=De(c),{width:u}=ce(c);e.style.setProperty("--md-indicator-x",`${f.x}px`),e.style.setProperty("--md-indicator-width",`${u}px`);let d=pr(o);(f.xd.x+l.width)&&o.scrollTo({left:Math.max(0,f.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),z([Ne(o),ge(o)]).pipe(W(p)).subscribe(([c,l])=>{let f=St(o);i.hidden=c.x<16,a.hidden=c.x>f.width-l.width-16}),O(h(i,"click").pipe(m(()=>-1)),h(a,"click").pipe(m(()=>1))).pipe(W(p)).subscribe(c=>{let{width:l}=ce(o);o.scrollBy({left:l*c,behavior:"smooth"})}),r.pipe(W(p),b(c=>n.includes(c))).subscribe(c=>c.click()),o.classList.add("tabbed-labels--linked");for(let c of n){let l=R(`label[for="${c.id}"]`);l.replaceChildren(x("a",{href:`#${l.htmlFor}`,tabIndex:-1},...Array.from(l.childNodes))),h(l.firstElementChild,"click").pipe(W(p),b(f=>!(f.metaKey||f.ctrlKey)),w(f=>{f.preventDefault(),f.stopPropagation()})).subscribe(()=>{history.replaceState({},"",`#${l.htmlFor}`),l.click()})}return B("content.tabs.link")&&s.pipe(Ce(1),re(t)).subscribe(([{active:c},{offset:l}])=>{let f=c.innerText.trim();if(c.hasAttribute("data-md-switching"))c.removeAttribute("data-md-switching");else{let u=e.offsetTop-l.y;for(let y of P("[data-tabs]"))for(let L of P(":scope > input",y)){let X=R(`label[for="${L.id}"]`);if(X!==c&&X.innerText.trim()===f){X.setAttribute("data-md-switching",""),L.click();break}}window.scrollTo({top:e.offsetTop-u});let d=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([f,...d])])}}),s.pipe(W(p)).subscribe(()=>{for(let c of P("audio, video",e))c.pause()}),Ya(n).pipe(w(c=>s.next(c)),_(()=>s.complete()),m(c=>$({ref:e},c)))}).pipe(Ke(se))}function zn(e,{viewport$:t,target$:r,print$:o}){return O(...P(".annotate:not(.highlight)",e).map(n=>Pn(n,{target$:r,print$:o})),...P("pre:not(.mermaid) > code",e).map(n=>jn(n,{target$:r,print$:o})),...P("pre.mermaid",e).map(n=>Wn(n)),...P("table:not([class])",e).map(n=>Dn(n)),...P("details",e).map(n=>Fn(n,{target$:r,print$:o})),...P("[data-tabs]",e).map(n=>Nn(n,{viewport$:t,target$:r})),...P("[title]",e).filter(()=>B("content.tooltips")).map(n=>mt(n,{viewport$:t})))}function Ba(e,{alert$:t}){return t.pipe(v(r=>O(I(!0),I(!1).pipe(Ge(2e3))).pipe(m(o=>({message:r,active:o})))))}function qn(e,t){let r=R(".md-typeset",e);return C(()=>{let o=new g;return o.subscribe(({message:n,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=n}),Ba(e,t).pipe(w(n=>o.next(n)),_(()=>o.complete()),m(n=>$({ref:e},n)))})}var Ga=0;function Ja(e,t){document.body.append(e);let{width:r}=ce(e);e.style.setProperty("--md-tooltip-width",`${r}px`),e.remove();let o=cr(t),n=typeof o!="undefined"?Ne(o):I({x:0,y:0}),i=O(et(t),$t(t)).pipe(K());return z([i,n]).pipe(m(([a,s])=>{let{x:p,y:c}=De(t),l=ce(t),f=t.closest("table");return f&&t.parentElement&&(p+=f.offsetLeft+t.parentElement.offsetLeft,c+=f.offsetTop+t.parentElement.offsetTop),{active:a,offset:{x:p-s.x+l.width/2-r/2,y:c-s.y+l.height+8}}}))}function Qn(e){let t=e.title;if(!t.length)return S;let r=`__tooltip_${Ga++}`,o=Rt(r,"inline"),n=R(".md-typeset",o);return n.innerHTML=t,C(()=>{let i=new g;return i.subscribe({next({offset:a}){o.style.setProperty("--md-tooltip-x",`${a.x}px`),o.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){o.style.removeProperty("--md-tooltip-x"),o.style.removeProperty("--md-tooltip-y")}}),O(i.pipe(b(({active:a})=>a)),i.pipe(_e(250),b(({active:a})=>!a))).subscribe({next({active:a}){a?(e.insertAdjacentElement("afterend",o),e.setAttribute("aria-describedby",r),e.removeAttribute("title")):(o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t))},complete(){o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t)}}),i.pipe(Me(16,me)).subscribe(({active:a})=>{o.classList.toggle("md-tooltip--active",a)}),i.pipe(pt(125,me),b(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?o.style.setProperty("--md-tooltip-0",`${-a}px`):o.style.removeProperty("--md-tooltip-0")},complete(){o.style.removeProperty("--md-tooltip-0")}}),Ja(o,e).pipe(w(a=>i.next(a)),_(()=>i.complete()),m(a=>$({ref:e},a)))}).pipe(Ke(se))}function Xa({viewport$:e}){if(!B("header.autohide"))return I(!1);let t=e.pipe(m(({offset:{y:n}})=>n),Be(2,1),m(([n,i])=>[nMath.abs(i-n.y)>100),m(([,[n]])=>n),K()),o=ze("search");return z([e,o]).pipe(m(([{offset:n},i])=>n.y>400&&!i),K(),v(n=>n?r:I(!1)),Q(!1))}function Kn(e,t){return C(()=>z([ge(e),Xa(t)])).pipe(m(([{height:r},o])=>({height:r,hidden:o})),K((r,o)=>r.height===o.height&&r.hidden===o.hidden),G(1))}function Yn(e,{header$:t,main$:r}){return C(()=>{let o=new g,n=o.pipe(Z(),ie(!0));o.pipe(te("active"),He(t)).subscribe(([{active:a},{hidden:s}])=>{e.classList.toggle("md-header--shadow",a&&!s),e.hidden=s});let i=ue(P("[title]",e)).pipe(b(()=>B("content.tooltips")),ne(a=>Qn(a)));return r.subscribe(o),t.pipe(W(n),m(a=>$({ref:e},a)),Re(i.pipe(W(n))))})}function Za(e,{viewport$:t,header$:r}){return mr(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:o}})=>{let{height:n}=ce(e);return{active:o>=n}}),te("active"))}function Bn(e,t){return C(()=>{let r=new g;r.subscribe({next({active:n}){e.classList.toggle("md-header__title--active",n)},complete(){e.classList.remove("md-header__title--active")}});let o=fe(".md-content h1");return typeof o=="undefined"?S:Za(o,t).pipe(w(n=>r.next(n)),_(()=>r.complete()),m(n=>$({ref:e},n)))})}function Gn(e,{viewport$:t,header$:r}){let o=r.pipe(m(({height:i})=>i),K()),n=o.pipe(v(()=>ge(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),te("bottom"))));return z([o,n,t]).pipe(m(([i,{top:a,bottom:s},{offset:{y:p},size:{height:c}}])=>(c=Math.max(0,c-Math.max(0,a-p,i)-Math.max(0,c+p-s)),{offset:a-i,height:c,active:a-i<=p})),K((i,a)=>i.offset===a.offset&&i.height===a.height&&i.active===a.active))}function es(e){let t=__md_get("__palette")||{index:e.findIndex(o=>matchMedia(o.getAttribute("data-md-color-media")).matches)},r=Math.max(0,Math.min(t.index,e.length-1));return I(...e).pipe(ne(o=>h(o,"change").pipe(m(()=>o))),Q(e[r]),m(o=>({index:e.indexOf(o),color:{media:o.getAttribute("data-md-color-media"),scheme:o.getAttribute("data-md-color-scheme"),primary:o.getAttribute("data-md-color-primary"),accent:o.getAttribute("data-md-color-accent")}})),G(1))}function Jn(e){let t=P("input",e),r=x("meta",{name:"theme-color"});document.head.appendChild(r);let o=x("meta",{name:"color-scheme"});document.head.appendChild(o);let n=Pt("(prefers-color-scheme: light)");return C(()=>{let i=new g;return i.subscribe(a=>{if(document.body.setAttribute("data-md-color-switching",""),a.color.media==="(prefers-color-scheme)"){let s=matchMedia("(prefers-color-scheme: light)"),p=document.querySelector(s.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");a.color.scheme=p.getAttribute("data-md-color-scheme"),a.color.primary=p.getAttribute("data-md-color-primary"),a.color.accent=p.getAttribute("data-md-color-accent")}for(let[s,p]of Object.entries(a.color))document.body.setAttribute(`data-md-color-${s}`,p);for(let s=0;sa.key==="Enter"),re(i,(a,s)=>s)).subscribe(({index:a})=>{a=(a+1)%t.length,t[a].click(),t[a].focus()}),i.pipe(m(()=>{let a=Se("header"),s=window.getComputedStyle(a);return o.content=s.colorScheme,s.backgroundColor.match(/\d+/g).map(p=>(+p).toString(16).padStart(2,"0")).join("")})).subscribe(a=>r.content=`#${a}`),i.pipe(ve(se)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")}),es(t).pipe(W(n.pipe(Ce(1))),ct(),w(a=>i.next(a)),_(()=>i.complete()),m(a=>$({ref:e},a)))})}function Xn(e,{progress$:t}){return C(()=>{let r=new g;return r.subscribe(({value:o})=>{e.style.setProperty("--md-progress-value",`${o}`)}),t.pipe(w(o=>r.next({value:o})),_(()=>r.complete()),m(o=>({ref:e,value:o})))})}var Jr=Mt(Br());function ts(e){e.setAttribute("data-md-copying","");let t=e.closest("[data-copy]"),r=t?t.getAttribute("data-copy"):e.innerText;return e.removeAttribute("data-md-copying"),r.trimEnd()}function Zn({alert$:e}){Jr.default.isSupported()&&new j(t=>{new Jr.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||ts(R(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(w(t=>{t.trigger.focus()}),m(()=>Ee("clipboard.copied"))).subscribe(e)}function ei(e,t){return e.protocol=t.protocol,e.hostname=t.hostname,e}function rs(e,t){let r=new Map;for(let o of P("url",e)){let n=R("loc",o),i=[ei(new URL(n.textContent),t)];r.set(`${i[0]}`,i);for(let a of P("[rel=alternate]",o)){let s=a.getAttribute("href");s!=null&&i.push(ei(new URL(s),t))}}return r}function ur(e){return un(new URL("sitemap.xml",e)).pipe(m(t=>rs(t,new URL(e))),de(()=>I(new Map)))}function os(e,t){if(!(e.target instanceof Element))return S;let r=e.target.closest("a");if(r===null)return S;if(r.target||e.metaKey||e.ctrlKey)return S;let o=new URL(r.href);return o.search=o.hash="",t.has(`${o}`)?(e.preventDefault(),I(new URL(r.href))):S}function ti(e){let t=new Map;for(let r of P(":scope > *",e.head))t.set(r.outerHTML,r);return t}function ri(e){for(let t of P("[href], [src]",e))for(let r of["href","src"]){let o=t.getAttribute(r);if(o&&!/^(?:[a-z]+:)?\/\//i.test(o)){t[r]=t[r];break}}return I(e)}function ns(e){for(let o of["[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...B("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let n=fe(o),i=fe(o,e);typeof n!="undefined"&&typeof i!="undefined"&&n.replaceWith(i)}let t=ti(document);for(let[o,n]of ti(e))t.has(o)?t.delete(o):document.head.appendChild(n);for(let o of t.values()){let n=o.getAttribute("name");n!=="theme-color"&&n!=="color-scheme"&&o.remove()}let r=Se("container");return We(P("script",r)).pipe(v(o=>{let n=e.createElement("script");if(o.src){for(let i of o.getAttributeNames())n.setAttribute(i,o.getAttribute(i));return o.replaceWith(n),new j(i=>{n.onload=()=>i.complete()})}else return n.textContent=o.textContent,o.replaceWith(n),S}),Z(),ie(document))}function oi({location$:e,viewport$:t,progress$:r}){let o=xe();if(location.protocol==="file:")return S;let n=ur(o.base);I(document).subscribe(ri);let i=h(document.body,"click").pipe(He(n),v(([p,c])=>os(p,c)),pe()),a=h(window,"popstate").pipe(m(ye),pe());i.pipe(re(t)).subscribe(([p,{offset:c}])=>{history.replaceState(c,""),history.pushState(null,"",p)}),O(i,a).subscribe(e);let s=e.pipe(te("pathname"),v(p=>fn(p,{progress$:r}).pipe(de(()=>(lt(p,!0),S)))),v(ri),v(ns),pe());return O(s.pipe(re(e,(p,c)=>c)),s.pipe(v(()=>e),te("hash")),e.pipe(K((p,c)=>p.pathname===c.pathname&&p.hash===c.hash),v(()=>i),w(()=>history.back()))).subscribe(p=>{var c,l;history.state!==null||!p.hash?window.scrollTo(0,(l=(c=history.state)==null?void 0:c.y)!=null?l:0):(history.scrollRestoration="auto",pn(p.hash),history.scrollRestoration="manual")}),e.subscribe(()=>{history.scrollRestoration="manual"}),h(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}),t.pipe(te("offset"),_e(100)).subscribe(({offset:p})=>{history.replaceState(p,"")}),s}var ni=Mt(qr());function ii(e){let t=e.separator.split("|").map(n=>n.replace(/(\(\?[!=<][^)]+\))/g,"").length===0?"\uFFFD":n).join("|"),r=new RegExp(t,"img"),o=(n,i,a)=>`${i}${a}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").trim();let i=new RegExp(`(^|${e.separator}|)(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return a=>(0,ni.default)(a).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function jt(e){return e.type===1}function dr(e){return e.type===3}function ai(e,t){let r=yn(e);return O(I(location.protocol!=="file:"),ze("search")).pipe(Ae(o=>o),v(()=>t)).subscribe(({config:o,docs:n})=>r.next({type:0,data:{config:o,docs:n,options:{suggest:B("search.suggest")}}})),r}function si(e){var l;let{selectedVersionSitemap:t,selectedVersionBaseURL:r,currentLocation:o,currentBaseURL:n}=e,i=(l=Xr(n))==null?void 0:l.pathname;if(i===void 0)return;let a=ss(o.pathname,i);if(a===void 0)return;let s=ps(t.keys());if(!t.has(s))return;let p=Xr(a,s);if(!p||!t.has(p.href))return;let c=Xr(a,r);if(c)return c.hash=o.hash,c.search=o.search,c}function Xr(e,t){try{return new URL(e,t)}catch(r){return}}function ss(e,t){if(e.startsWith(t))return e.slice(t.length)}function cs(e,t){let r=Math.min(e.length,t.length),o;for(o=0;oS)),o=r.pipe(m(n=>{let[,i]=t.base.match(/([^/]+)\/?$/);return n.find(({version:a,aliases:s})=>a===i||s.includes(i))||n[0]}));r.pipe(m(n=>new Map(n.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),v(n=>h(document.body,"click").pipe(b(i=>!i.metaKey&&!i.ctrlKey),re(o),v(([i,a])=>{if(i.target instanceof Element){let s=i.target.closest("a");if(s&&!s.target&&n.has(s.href)){let p=s.href;return!i.target.closest(".md-version")&&n.get(p)===a?S:(i.preventDefault(),I(new URL(p)))}}return S}),v(i=>ur(i).pipe(m(a=>{var s;return(s=si({selectedVersionSitemap:a,selectedVersionBaseURL:i,currentLocation:ye(),currentBaseURL:t.base}))!=null?s:i})))))).subscribe(n=>lt(n,!0)),z([r,o]).subscribe(([n,i])=>{R(".md-header__topic").appendChild(Cn(n,i))}),e.pipe(v(()=>o)).subscribe(n=>{var s;let i=new URL(t.base),a=__md_get("__outdated",sessionStorage,i);if(a===null){a=!0;let p=((s=t.version)==null?void 0:s.default)||"latest";Array.isArray(p)||(p=[p]);e:for(let c of p)for(let l of n.aliases.concat(n.version))if(new RegExp(c,"i").test(l)){a=!1;break e}__md_set("__outdated",a,sessionStorage,i)}if(a)for(let p of ae("outdated"))p.hidden=!1})}function ls(e,{worker$:t}){let{searchParams:r}=ye();r.has("q")&&(Je("search",!0),e.value=r.get("q"),e.focus(),ze("search").pipe(Ae(i=>!i)).subscribe(()=>{let i=ye();i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let o=et(e),n=O(t.pipe(Ae(jt)),h(e,"keyup"),o).pipe(m(()=>e.value),K());return z([n,o]).pipe(m(([i,a])=>({value:i,focus:a})),G(1))}function pi(e,{worker$:t}){let r=new g,o=r.pipe(Z(),ie(!0));z([t.pipe(Ae(jt)),r],(i,a)=>a).pipe(te("value")).subscribe(({value:i})=>t.next({type:2,data:i})),r.pipe(te("focus")).subscribe(({focus:i})=>{i&&Je("search",i)}),h(e.form,"reset").pipe(W(o)).subscribe(()=>e.focus());let n=R("header [for=__search]");return h(n,"click").subscribe(()=>e.focus()),ls(e,{worker$:t}).pipe(w(i=>r.next(i)),_(()=>r.complete()),m(i=>$({ref:e},i)),G(1))}function li(e,{worker$:t,query$:r}){let o=new g,n=on(e.parentElement).pipe(b(Boolean)),i=e.parentElement,a=R(":scope > :first-child",e),s=R(":scope > :last-child",e);ze("search").subscribe(l=>s.setAttribute("role",l?"list":"presentation")),o.pipe(re(r),Wr(t.pipe(Ae(jt)))).subscribe(([{items:l},{value:f}])=>{switch(l.length){case 0:a.textContent=f.length?Ee("search.result.none"):Ee("search.result.placeholder");break;case 1:a.textContent=Ee("search.result.one");break;default:let u=sr(l.length);a.textContent=Ee("search.result.other",u)}});let p=o.pipe(w(()=>s.innerHTML=""),v(({items:l})=>O(I(...l.slice(0,10)),I(...l.slice(10)).pipe(Be(4),Dr(n),v(([f])=>f)))),m(Mn),pe());return p.subscribe(l=>s.appendChild(l)),p.pipe(ne(l=>{let f=fe("details",l);return typeof f=="undefined"?S:h(f,"toggle").pipe(W(o),m(()=>f))})).subscribe(l=>{l.open===!1&&l.offsetTop<=i.scrollTop&&i.scrollTo({top:l.offsetTop})}),t.pipe(b(dr),m(({data:l})=>l)).pipe(w(l=>o.next(l)),_(()=>o.complete()),m(l=>$({ref:e},l)))}function ms(e,{query$:t}){return t.pipe(m(({value:r})=>{let o=ye();return o.hash="",r=r.replace(/\s+/g,"+").replace(/&/g,"%26").replace(/=/g,"%3D"),o.search=`q=${r}`,{url:o}}))}function mi(e,t){let r=new g,o=r.pipe(Z(),ie(!0));return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),h(e,"click").pipe(W(o)).subscribe(n=>n.preventDefault()),ms(e,t).pipe(w(n=>r.next(n)),_(()=>r.complete()),m(n=>$({ref:e},n)))}function fi(e,{worker$:t,keyboard$:r}){let o=new g,n=Se("search-query"),i=O(h(n,"keydown"),h(n,"focus")).pipe(ve(se),m(()=>n.value),K());return o.pipe(He(i),m(([{suggest:s},p])=>{let c=p.split(/([\s-]+)/);if(s!=null&&s.length&&c[c.length-1]){let l=s[s.length-1];l.startsWith(c[c.length-1])&&(c[c.length-1]=l)}else c.length=0;return c})).subscribe(s=>e.innerHTML=s.join("").replace(/\s/g," ")),r.pipe(b(({mode:s})=>s==="search")).subscribe(s=>{switch(s.type){case"ArrowRight":e.innerText.length&&n.selectionStart===n.value.length&&(n.value=e.innerText);break}}),t.pipe(b(dr),m(({data:s})=>s)).pipe(w(s=>o.next(s)),_(()=>o.complete()),m(()=>({ref:e})))}function ui(e,{index$:t,keyboard$:r}){let o=xe();try{let n=ai(o.search,t),i=Se("search-query",e),a=Se("search-result",e);h(e,"click").pipe(b(({target:p})=>p instanceof Element&&!!p.closest("a"))).subscribe(()=>Je("search",!1)),r.pipe(b(({mode:p})=>p==="search")).subscribe(p=>{let c=Ie();switch(p.type){case"Enter":if(c===i){let l=new Map;for(let f of P(":first-child [href]",a)){let u=f.firstElementChild;l.set(f,parseFloat(u.getAttribute("data-md-score")))}if(l.size){let[[f]]=[...l].sort(([,u],[,d])=>d-u);f.click()}p.claim()}break;case"Escape":case"Tab":Je("search",!1),i.blur();break;case"ArrowUp":case"ArrowDown":if(typeof c=="undefined")i.focus();else{let l=[i,...P(":not(details) > [href], summary, details[open] [href]",a)],f=Math.max(0,(Math.max(0,l.indexOf(c))+l.length+(p.type==="ArrowUp"?-1:1))%l.length);l[f].focus()}p.claim();break;default:i!==Ie()&&i.focus()}}),r.pipe(b(({mode:p})=>p==="global")).subscribe(p=>{switch(p.type){case"f":case"s":case"/":i.focus(),i.select(),p.claim();break}});let s=pi(i,{worker$:n});return O(s,li(a,{worker$:n,query$:s})).pipe(Re(...ae("search-share",e).map(p=>mi(p,{query$:s})),...ae("search-suggest",e).map(p=>fi(p,{worker$:n,keyboard$:r}))))}catch(n){return e.hidden=!0,Ye}}function di(e,{index$:t,location$:r}){return z([t,r.pipe(Q(ye()),b(o=>!!o.searchParams.get("h")))]).pipe(m(([o,n])=>ii(o.config)(n.searchParams.get("h"))),m(o=>{var a;let n=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let s=i.nextNode();s;s=i.nextNode())if((a=s.parentElement)!=null&&a.offsetHeight){let p=s.textContent,c=o(p);c.length>p.length&&n.set(s,c)}for(let[s,p]of n){let{childNodes:c}=x("span",null,p);s.replaceWith(...Array.from(c))}return{ref:e,nodes:n}}))}function fs(e,{viewport$:t,main$:r}){let o=e.closest(".md-grid"),n=o.offsetTop-o.parentElement.offsetTop;return z([r,t]).pipe(m(([{offset:i,height:a},{offset:{y:s}}])=>(a=a+Math.min(n,Math.max(0,s-i))-n,{height:a,locked:s>=i+n})),K((i,a)=>i.height===a.height&&i.locked===a.locked))}function Zr(e,o){var n=o,{header$:t}=n,r=so(n,["header$"]);let i=R(".md-sidebar__scrollwrap",e),{y:a}=De(i);return C(()=>{let s=new g,p=s.pipe(Z(),ie(!0)),c=s.pipe(Me(0,me));return c.pipe(re(t)).subscribe({next([{height:l},{height:f}]){i.style.height=`${l-2*a}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),c.pipe(Ae()).subscribe(()=>{for(let l of P(".md-nav__link--active[href]",e)){if(!l.clientHeight)continue;let f=l.closest(".md-sidebar__scrollwrap");if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=ce(f);f.scrollTo({top:u-d/2})}}}),ue(P("label[tabindex]",e)).pipe(ne(l=>h(l,"click").pipe(ve(se),m(()=>l),W(p)))).subscribe(l=>{let f=R(`[id="${l.htmlFor}"]`);R(`[aria-labelledby="${l.id}"]`).setAttribute("aria-expanded",`${f.checked}`)}),fs(e,r).pipe(w(l=>s.next(l)),_(()=>s.complete()),m(l=>$({ref:e},l)))})}function hi(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return st(je(`${r}/releases/latest`).pipe(de(()=>S),m(o=>({version:o.tag_name})),Ve({})),je(r).pipe(de(()=>S),m(o=>({stars:o.stargazers_count,forks:o.forks_count})),Ve({}))).pipe(m(([o,n])=>$($({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return je(r).pipe(m(o=>({repositories:o.public_repos})),Ve({}))}}function bi(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return st(je(`${r}/releases/permalink/latest`).pipe(de(()=>S),m(({tag_name:o})=>({version:o})),Ve({})),je(r).pipe(de(()=>S),m(({star_count:o,forks_count:n})=>({stars:o,forks:n})),Ve({}))).pipe(m(([o,n])=>$($({},o),n)))}function vi(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,o]=t;return hi(r,o)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,o]=t;return bi(r,o)}return S}var us;function ds(e){return us||(us=C(()=>{let t=__md_get("__source",sessionStorage);if(t)return I(t);if(ae("consent").length){let o=__md_get("__consent");if(!(o&&o.github))return S}return vi(e.href).pipe(w(o=>__md_set("__source",o,sessionStorage)))}).pipe(de(()=>S),b(t=>Object.keys(t).length>0),m(t=>({facts:t})),G(1)))}function gi(e){let t=R(":scope > :last-child",e);return C(()=>{let r=new g;return r.subscribe(({facts:o})=>{t.appendChild(_n(o)),t.classList.add("md-source__repository--active")}),ds(e).pipe(w(o=>r.next(o)),_(()=>r.complete()),m(o=>$({ref:e},o)))})}function hs(e,{viewport$:t,header$:r}){return ge(document.body).pipe(v(()=>mr(e,{header$:r,viewport$:t})),m(({offset:{y:o}})=>({hidden:o>=10})),te("hidden"))}function yi(e,t){return C(()=>{let r=new g;return r.subscribe({next({hidden:o}){e.hidden=o},complete(){e.hidden=!1}}),(B("navigation.tabs.sticky")?I({hidden:!1}):hs(e,t)).pipe(w(o=>r.next(o)),_(()=>r.complete()),m(o=>$({ref:e},o)))})}function bs(e,{viewport$:t,header$:r}){let o=new Map,n=P(".md-nav__link",e);for(let s of n){let p=decodeURIComponent(s.hash.substring(1)),c=fe(`[id="${p}"]`);typeof c!="undefined"&&o.set(s,c)}let i=r.pipe(te("height"),m(({height:s})=>{let p=Se("main"),c=R(":scope > :first-child",p);return s+.8*(c.offsetTop-p.offsetTop)}),pe());return ge(document.body).pipe(te("height"),v(s=>C(()=>{let p=[];return I([...o].reduce((c,[l,f])=>{for(;p.length&&o.get(p[p.length-1]).tagName>=f.tagName;)p.pop();let u=f.offsetTop;for(;!u&&f.parentElement;)f=f.parentElement,u=f.offsetTop;let d=f.offsetParent;for(;d;d=d.offsetParent)u+=d.offsetTop;return c.set([...p=[...p,l]].reverse(),u)},new Map))}).pipe(m(p=>new Map([...p].sort(([,c],[,l])=>c-l))),He(i),v(([p,c])=>t.pipe(Fr(([l,f],{offset:{y:u},size:d})=>{let y=u+d.height>=Math.floor(s.height);for(;f.length;){let[,L]=f[0];if(L-c=u&&!y)f=[l.pop(),...f];else break}return[l,f]},[[],[...p]]),K((l,f)=>l[0]===f[0]&&l[1]===f[1])))))).pipe(m(([s,p])=>({prev:s.map(([c])=>c),next:p.map(([c])=>c)})),Q({prev:[],next:[]}),Be(2,1),m(([s,p])=>s.prev.length{let i=new g,a=i.pipe(Z(),ie(!0));if(i.subscribe(({prev:s,next:p})=>{for(let[c]of p)c.classList.remove("md-nav__link--passed"),c.classList.remove("md-nav__link--active");for(let[c,[l]]of s.entries())l.classList.add("md-nav__link--passed"),l.classList.toggle("md-nav__link--active",c===s.length-1)}),B("toc.follow")){let s=O(t.pipe(_e(1),m(()=>{})),t.pipe(_e(250),m(()=>"smooth")));i.pipe(b(({prev:p})=>p.length>0),He(o.pipe(ve(se))),re(s)).subscribe(([[{prev:p}],c])=>{let[l]=p[p.length-1];if(l.offsetHeight){let f=cr(l);if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=ce(f);f.scrollTo({top:u-d/2,behavior:c})}}})}return B("navigation.tracking")&&t.pipe(W(a),te("offset"),_e(250),Ce(1),W(n.pipe(Ce(1))),ct({delay:250}),re(i)).subscribe(([,{prev:s}])=>{let p=ye(),c=s[s.length-1];if(c&&c.length){let[l]=c,{hash:f}=new URL(l.href);p.hash!==f&&(p.hash=f,history.replaceState({},"",`${p}`))}else p.hash="",history.replaceState({},"",`${p}`)}),bs(e,{viewport$:t,header$:r}).pipe(w(s=>i.next(s)),_(()=>i.complete()),m(s=>$({ref:e},s)))})}function vs(e,{viewport$:t,main$:r,target$:o}){let n=t.pipe(m(({offset:{y:a}})=>a),Be(2,1),m(([a,s])=>a>s&&s>0),K()),i=r.pipe(m(({active:a})=>a));return z([i,n]).pipe(m(([a,s])=>!(a&&s)),K(),W(o.pipe(Ce(1))),ie(!0),ct({delay:250}),m(a=>({hidden:a})))}function Ei(e,{viewport$:t,header$:r,main$:o,target$:n}){let i=new g,a=i.pipe(Z(),ie(!0));return i.subscribe({next({hidden:s}){e.hidden=s,s?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(W(a),te("height")).subscribe(({height:s})=>{e.style.top=`${s+16}px`}),h(e,"click").subscribe(s=>{s.preventDefault(),window.scrollTo({top:0})}),vs(e,{viewport$:t,main$:o,target$:n}).pipe(w(s=>i.next(s)),_(()=>i.complete()),m(s=>$({ref:e},s)))}function wi({document$:e,viewport$:t}){e.pipe(v(()=>P(".md-ellipsis")),ne(r=>tt(r).pipe(W(e.pipe(Ce(1))),b(o=>o),m(()=>r),Te(1))),b(r=>r.offsetWidth{let o=r.innerText,n=r.closest("a")||r;return n.title=o,B("content.tooltips")?mt(n,{viewport$:t}).pipe(W(e.pipe(Ce(1))),_(()=>n.removeAttribute("title"))):S})).subscribe(),B("content.tooltips")&&e.pipe(v(()=>P(".md-status")),ne(r=>mt(r,{viewport$:t}))).subscribe()}function Ti({document$:e,tablet$:t}){e.pipe(v(()=>P(".md-toggle--indeterminate")),w(r=>{r.indeterminate=!0,r.checked=!1}),ne(r=>h(r,"change").pipe(Vr(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),re(t)).subscribe(([r,o])=>{r.classList.remove("md-toggle--indeterminate"),o&&(r.checked=!1)})}function gs(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function Si({document$:e}){e.pipe(v(()=>P("[data-md-scrollfix]")),w(t=>t.removeAttribute("data-md-scrollfix")),b(gs),ne(t=>h(t,"touchstart").pipe(m(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function Oi({viewport$:e,tablet$:t}){z([ze("search"),t]).pipe(m(([r,o])=>r&&!o),v(r=>I(r).pipe(Ge(r?400:100))),re(e)).subscribe(([r,{offset:{y:o}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${o}px`;else{let n=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",n&&window.scrollTo(0,n)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let o=e[r];typeof o=="string"?o=document.createTextNode(o):o.parentNode&&o.parentNode.removeChild(o),r?t.insertBefore(this.previousSibling,o):t.replaceChild(o,this)}}}));function ys(){return location.protocol==="file:"?Tt(`${new URL("search/search_index.js",eo.base)}`).pipe(m(()=>__index),G(1)):je(new URL("search/search_index.json",eo.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var ot=Go(),Ut=sn(),Lt=ln(Ut),to=an(),Oe=gn(),hr=Pt("(min-width: 960px)"),Mi=Pt("(min-width: 1220px)"),_i=mn(),eo=xe(),Ai=document.forms.namedItem("search")?ys():Ye,ro=new g;Zn({alert$:ro});var oo=new g;B("navigation.instant")&&oi({location$:Ut,viewport$:Oe,progress$:oo}).subscribe(ot);var Li;((Li=eo.version)==null?void 0:Li.provider)==="mike"&&ci({document$:ot});O(Ut,Lt).pipe(Ge(125)).subscribe(()=>{Je("drawer",!1),Je("search",!1)});to.pipe(b(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=fe("link[rel=prev]");typeof t!="undefined"&<(t);break;case"n":case".":let r=fe("link[rel=next]");typeof r!="undefined"&<(r);break;case"Enter":let o=Ie();o instanceof HTMLLabelElement&&o.click()}});wi({viewport$:Oe,document$:ot});Ti({document$:ot,tablet$:hr});Si({document$:ot});Oi({viewport$:Oe,tablet$:hr});var rt=Kn(Se("header"),{viewport$:Oe}),Ft=ot.pipe(m(()=>Se("main")),v(e=>Gn(e,{viewport$:Oe,header$:rt})),G(1)),xs=O(...ae("consent").map(e=>En(e,{target$:Lt})),...ae("dialog").map(e=>qn(e,{alert$:ro})),...ae("palette").map(e=>Jn(e)),...ae("progress").map(e=>Xn(e,{progress$:oo})),...ae("search").map(e=>ui(e,{index$:Ai,keyboard$:to})),...ae("source").map(e=>gi(e))),Es=C(()=>O(...ae("announce").map(e=>xn(e)),...ae("content").map(e=>zn(e,{viewport$:Oe,target$:Lt,print$:_i})),...ae("content").map(e=>B("search.highlight")?di(e,{index$:Ai,location$:Ut}):S),...ae("header").map(e=>Yn(e,{viewport$:Oe,header$:rt,main$:Ft})),...ae("header-title").map(e=>Bn(e,{viewport$:Oe,header$:rt})),...ae("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?Nr(Mi,()=>Zr(e,{viewport$:Oe,header$:rt,main$:Ft})):Nr(hr,()=>Zr(e,{viewport$:Oe,header$:rt,main$:Ft}))),...ae("tabs").map(e=>yi(e,{viewport$:Oe,header$:rt})),...ae("toc").map(e=>xi(e,{viewport$:Oe,header$:rt,main$:Ft,target$:Lt})),...ae("top").map(e=>Ei(e,{viewport$:Oe,header$:rt,main$:Ft,target$:Lt})))),Ci=ot.pipe(v(()=>Es),Re(xs),G(1));Ci.subscribe();window.document$=ot;window.location$=Ut;window.target$=Lt;window.keyboard$=to;window.viewport$=Oe;window.tablet$=hr;window.screen$=Mi;window.print$=_i;window.alert$=ro;window.progress$=oo;window.component$=Ci;})(); +//# sourceMappingURL=bundle.f1b6f286.min.js.map + diff --git a/assets/javascripts/bundle.f1b6f286.min.js.map b/assets/javascripts/bundle.f1b6f286.min.js.map new file mode 100644 index 0000000..2644bf1 --- /dev/null +++ b/assets/javascripts/bundle.f1b6f286.min.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["node_modules/focus-visible/dist/focus-visible.js", "node_modules/escape-html/index.js", "node_modules/clipboard/dist/clipboard.js", "src/templates/assets/javascripts/bundle.ts", "node_modules/tslib/tslib.es6.mjs", "node_modules/rxjs/src/internal/util/isFunction.ts", "node_modules/rxjs/src/internal/util/createErrorClass.ts", "node_modules/rxjs/src/internal/util/UnsubscriptionError.ts", "node_modules/rxjs/src/internal/util/arrRemove.ts", "node_modules/rxjs/src/internal/Subscription.ts", "node_modules/rxjs/src/internal/config.ts", "node_modules/rxjs/src/internal/scheduler/timeoutProvider.ts", "node_modules/rxjs/src/internal/util/reportUnhandledError.ts", "node_modules/rxjs/src/internal/util/noop.ts", "node_modules/rxjs/src/internal/NotificationFactories.ts", "node_modules/rxjs/src/internal/util/errorContext.ts", "node_modules/rxjs/src/internal/Subscriber.ts", "node_modules/rxjs/src/internal/symbol/observable.ts", "node_modules/rxjs/src/internal/util/identity.ts", "node_modules/rxjs/src/internal/util/pipe.ts", "node_modules/rxjs/src/internal/Observable.ts", "node_modules/rxjs/src/internal/util/lift.ts", "node_modules/rxjs/src/internal/operators/OperatorSubscriber.ts", "node_modules/rxjs/src/internal/scheduler/animationFrameProvider.ts", "node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts", "node_modules/rxjs/src/internal/Subject.ts", "node_modules/rxjs/src/internal/BehaviorSubject.ts", "node_modules/rxjs/src/internal/scheduler/dateTimestampProvider.ts", "node_modules/rxjs/src/internal/ReplaySubject.ts", "node_modules/rxjs/src/internal/scheduler/Action.ts", "node_modules/rxjs/src/internal/scheduler/intervalProvider.ts", "node_modules/rxjs/src/internal/scheduler/AsyncAction.ts", "node_modules/rxjs/src/internal/Scheduler.ts", "node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts", "node_modules/rxjs/src/internal/scheduler/async.ts", "node_modules/rxjs/src/internal/scheduler/QueueAction.ts", "node_modules/rxjs/src/internal/scheduler/QueueScheduler.ts", "node_modules/rxjs/src/internal/scheduler/queue.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameAction.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameScheduler.ts", "node_modules/rxjs/src/internal/scheduler/animationFrame.ts", "node_modules/rxjs/src/internal/observable/empty.ts", "node_modules/rxjs/src/internal/util/isScheduler.ts", "node_modules/rxjs/src/internal/util/args.ts", "node_modules/rxjs/src/internal/util/isArrayLike.ts", "node_modules/rxjs/src/internal/util/isPromise.ts", "node_modules/rxjs/src/internal/util/isInteropObservable.ts", "node_modules/rxjs/src/internal/util/isAsyncIterable.ts", "node_modules/rxjs/src/internal/util/throwUnobservableError.ts", "node_modules/rxjs/src/internal/symbol/iterator.ts", "node_modules/rxjs/src/internal/util/isIterable.ts", "node_modules/rxjs/src/internal/util/isReadableStreamLike.ts", "node_modules/rxjs/src/internal/observable/innerFrom.ts", "node_modules/rxjs/src/internal/util/executeSchedule.ts", "node_modules/rxjs/src/internal/operators/observeOn.ts", "node_modules/rxjs/src/internal/operators/subscribeOn.ts", "node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts", "node_modules/rxjs/src/internal/scheduled/schedulePromise.ts", "node_modules/rxjs/src/internal/scheduled/scheduleArray.ts", "node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleAsyncIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleReadableStreamLike.ts", "node_modules/rxjs/src/internal/scheduled/scheduled.ts", "node_modules/rxjs/src/internal/observable/from.ts", "node_modules/rxjs/src/internal/observable/of.ts", "node_modules/rxjs/src/internal/observable/throwError.ts", "node_modules/rxjs/src/internal/util/EmptyError.ts", "node_modules/rxjs/src/internal/util/isDate.ts", "node_modules/rxjs/src/internal/operators/map.ts", "node_modules/rxjs/src/internal/util/mapOneOrManyArgs.ts", "node_modules/rxjs/src/internal/util/argsArgArrayOrObject.ts", "node_modules/rxjs/src/internal/util/createObject.ts", "node_modules/rxjs/src/internal/observable/combineLatest.ts", "node_modules/rxjs/src/internal/operators/mergeInternals.ts", "node_modules/rxjs/src/internal/operators/mergeMap.ts", "node_modules/rxjs/src/internal/operators/mergeAll.ts", "node_modules/rxjs/src/internal/operators/concatAll.ts", "node_modules/rxjs/src/internal/observable/concat.ts", "node_modules/rxjs/src/internal/observable/defer.ts", "node_modules/rxjs/src/internal/observable/fromEvent.ts", "node_modules/rxjs/src/internal/observable/fromEventPattern.ts", "node_modules/rxjs/src/internal/observable/timer.ts", "node_modules/rxjs/src/internal/observable/merge.ts", "node_modules/rxjs/src/internal/observable/never.ts", "node_modules/rxjs/src/internal/util/argsOrArgArray.ts", "node_modules/rxjs/src/internal/operators/filter.ts", "node_modules/rxjs/src/internal/observable/zip.ts", "node_modules/rxjs/src/internal/operators/audit.ts", "node_modules/rxjs/src/internal/operators/auditTime.ts", "node_modules/rxjs/src/internal/operators/bufferCount.ts", "node_modules/rxjs/src/internal/operators/catchError.ts", "node_modules/rxjs/src/internal/operators/scanInternals.ts", "node_modules/rxjs/src/internal/operators/combineLatest.ts", "node_modules/rxjs/src/internal/operators/combineLatestWith.ts", "node_modules/rxjs/src/internal/operators/debounce.ts", "node_modules/rxjs/src/internal/operators/debounceTime.ts", "node_modules/rxjs/src/internal/operators/defaultIfEmpty.ts", "node_modules/rxjs/src/internal/operators/take.ts", "node_modules/rxjs/src/internal/operators/ignoreElements.ts", "node_modules/rxjs/src/internal/operators/mapTo.ts", "node_modules/rxjs/src/internal/operators/delayWhen.ts", "node_modules/rxjs/src/internal/operators/delay.ts", "node_modules/rxjs/src/internal/operators/distinctUntilChanged.ts", "node_modules/rxjs/src/internal/operators/distinctUntilKeyChanged.ts", "node_modules/rxjs/src/internal/operators/throwIfEmpty.ts", "node_modules/rxjs/src/internal/operators/endWith.ts", "node_modules/rxjs/src/internal/operators/finalize.ts", "node_modules/rxjs/src/internal/operators/first.ts", "node_modules/rxjs/src/internal/operators/takeLast.ts", "node_modules/rxjs/src/internal/operators/merge.ts", "node_modules/rxjs/src/internal/operators/mergeWith.ts", "node_modules/rxjs/src/internal/operators/repeat.ts", "node_modules/rxjs/src/internal/operators/scan.ts", "node_modules/rxjs/src/internal/operators/share.ts", "node_modules/rxjs/src/internal/operators/shareReplay.ts", "node_modules/rxjs/src/internal/operators/skip.ts", "node_modules/rxjs/src/internal/operators/skipUntil.ts", "node_modules/rxjs/src/internal/operators/startWith.ts", "node_modules/rxjs/src/internal/operators/switchMap.ts", "node_modules/rxjs/src/internal/operators/takeUntil.ts", "node_modules/rxjs/src/internal/operators/takeWhile.ts", "node_modules/rxjs/src/internal/operators/tap.ts", "node_modules/rxjs/src/internal/operators/throttle.ts", "node_modules/rxjs/src/internal/operators/throttleTime.ts", "node_modules/rxjs/src/internal/operators/withLatestFrom.ts", "node_modules/rxjs/src/internal/operators/zip.ts", "node_modules/rxjs/src/internal/operators/zipWith.ts", "src/templates/assets/javascripts/browser/document/index.ts", "src/templates/assets/javascripts/browser/element/_/index.ts", "src/templates/assets/javascripts/browser/element/focus/index.ts", "src/templates/assets/javascripts/browser/element/hover/index.ts", "src/templates/assets/javascripts/utilities/h/index.ts", "src/templates/assets/javascripts/utilities/round/index.ts", "src/templates/assets/javascripts/browser/script/index.ts", "src/templates/assets/javascripts/browser/element/size/_/index.ts", "src/templates/assets/javascripts/browser/element/size/content/index.ts", "src/templates/assets/javascripts/browser/element/offset/_/index.ts", "src/templates/assets/javascripts/browser/element/offset/content/index.ts", "src/templates/assets/javascripts/browser/element/visibility/index.ts", "src/templates/assets/javascripts/browser/toggle/index.ts", "src/templates/assets/javascripts/browser/keyboard/index.ts", "src/templates/assets/javascripts/browser/location/_/index.ts", "src/templates/assets/javascripts/browser/location/hash/index.ts", "src/templates/assets/javascripts/browser/media/index.ts", "src/templates/assets/javascripts/browser/request/index.ts", "src/templates/assets/javascripts/browser/viewport/offset/index.ts", "src/templates/assets/javascripts/browser/viewport/size/index.ts", "src/templates/assets/javascripts/browser/viewport/_/index.ts", "src/templates/assets/javascripts/browser/viewport/at/index.ts", "src/templates/assets/javascripts/browser/worker/index.ts", "src/templates/assets/javascripts/_/index.ts", "src/templates/assets/javascripts/components/_/index.ts", "src/templates/assets/javascripts/components/announce/index.ts", "src/templates/assets/javascripts/components/consent/index.ts", "src/templates/assets/javascripts/templates/tooltip/index.tsx", "src/templates/assets/javascripts/templates/annotation/index.tsx", "src/templates/assets/javascripts/templates/clipboard/index.tsx", "src/templates/assets/javascripts/templates/search/index.tsx", "src/templates/assets/javascripts/templates/source/index.tsx", "src/templates/assets/javascripts/templates/tabbed/index.tsx", "src/templates/assets/javascripts/templates/table/index.tsx", "src/templates/assets/javascripts/templates/version/index.tsx", "src/templates/assets/javascripts/components/tooltip2/index.ts", "src/templates/assets/javascripts/components/content/annotation/_/index.ts", "src/templates/assets/javascripts/components/content/annotation/list/index.ts", "src/templates/assets/javascripts/components/content/annotation/block/index.ts", "src/templates/assets/javascripts/components/content/code/_/index.ts", "src/templates/assets/javascripts/components/content/details/index.ts", "src/templates/assets/javascripts/components/content/mermaid/index.css", "src/templates/assets/javascripts/components/content/mermaid/index.ts", "src/templates/assets/javascripts/components/content/table/index.ts", "src/templates/assets/javascripts/components/content/tabs/index.ts", "src/templates/assets/javascripts/components/content/_/index.ts", "src/templates/assets/javascripts/components/dialog/index.ts", "src/templates/assets/javascripts/components/tooltip/index.ts", "src/templates/assets/javascripts/components/header/_/index.ts", "src/templates/assets/javascripts/components/header/title/index.ts", "src/templates/assets/javascripts/components/main/index.ts", "src/templates/assets/javascripts/components/palette/index.ts", "src/templates/assets/javascripts/components/progress/index.ts", "src/templates/assets/javascripts/integrations/clipboard/index.ts", "src/templates/assets/javascripts/integrations/sitemap/index.ts", "src/templates/assets/javascripts/integrations/instant/index.ts", "src/templates/assets/javascripts/integrations/search/highlighter/index.ts", "src/templates/assets/javascripts/integrations/search/worker/message/index.ts", "src/templates/assets/javascripts/integrations/search/worker/_/index.ts", "src/templates/assets/javascripts/integrations/version/findurl/index.ts", "src/templates/assets/javascripts/integrations/version/index.ts", "src/templates/assets/javascripts/components/search/query/index.ts", "src/templates/assets/javascripts/components/search/result/index.ts", "src/templates/assets/javascripts/components/search/share/index.ts", "src/templates/assets/javascripts/components/search/suggest/index.ts", "src/templates/assets/javascripts/components/search/_/index.ts", "src/templates/assets/javascripts/components/search/highlight/index.ts", "src/templates/assets/javascripts/components/sidebar/index.ts", "src/templates/assets/javascripts/components/source/facts/github/index.ts", "src/templates/assets/javascripts/components/source/facts/gitlab/index.ts", "src/templates/assets/javascripts/components/source/facts/_/index.ts", "src/templates/assets/javascripts/components/source/_/index.ts", "src/templates/assets/javascripts/components/tabs/index.ts", "src/templates/assets/javascripts/components/toc/index.ts", "src/templates/assets/javascripts/components/top/index.ts", "src/templates/assets/javascripts/patches/ellipsis/index.ts", "src/templates/assets/javascripts/patches/indeterminate/index.ts", "src/templates/assets/javascripts/patches/scrollfix/index.ts", "src/templates/assets/javascripts/patches/scrolllock/index.ts", "src/templates/assets/javascripts/polyfills/index.ts"], + "sourcesContent": ["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (factory());\n}(this, (function () { 'use strict';\n\n /**\n * Applies the :focus-visible polyfill at the given scope.\n * A scope in this case is either the top-level Document or a Shadow Root.\n *\n * @param {(Document|ShadowRoot)} scope\n * @see https://github.com/WICG/focus-visible\n */\n function applyFocusVisiblePolyfill(scope) {\n var hadKeyboardEvent = true;\n var hadFocusVisibleRecently = false;\n var hadFocusVisibleRecentlyTimeout = null;\n\n var inputTypesAllowlist = {\n text: true,\n search: true,\n url: true,\n tel: true,\n email: true,\n password: true,\n number: true,\n date: true,\n month: true,\n week: true,\n time: true,\n datetime: true,\n 'datetime-local': true\n };\n\n /**\n * Helper function for legacy browsers and iframes which sometimes focus\n * elements like document, body, and non-interactive SVG.\n * @param {Element} el\n */\n function isValidFocusTarget(el) {\n if (\n el &&\n el !== document &&\n el.nodeName !== 'HTML' &&\n el.nodeName !== 'BODY' &&\n 'classList' in el &&\n 'contains' in el.classList\n ) {\n return true;\n }\n return false;\n }\n\n /**\n * Computes whether the given element should automatically trigger the\n * `focus-visible` class being added, i.e. whether it should always match\n * `:focus-visible` when focused.\n * @param {Element} el\n * @return {boolean}\n */\n function focusTriggersKeyboardModality(el) {\n var type = el.type;\n var tagName = el.tagName;\n\n if (tagName === 'INPUT' && inputTypesAllowlist[type] && !el.readOnly) {\n return true;\n }\n\n if (tagName === 'TEXTAREA' && !el.readOnly) {\n return true;\n }\n\n if (el.isContentEditable) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Add the `focus-visible` class to the given element if it was not added by\n * the author.\n * @param {Element} el\n */\n function addFocusVisibleClass(el) {\n if (el.classList.contains('focus-visible')) {\n return;\n }\n el.classList.add('focus-visible');\n el.setAttribute('data-focus-visible-added', '');\n }\n\n /**\n * Remove the `focus-visible` class from the given element if it was not\n * originally added by the author.\n * @param {Element} el\n */\n function removeFocusVisibleClass(el) {\n if (!el.hasAttribute('data-focus-visible-added')) {\n return;\n }\n el.classList.remove('focus-visible');\n el.removeAttribute('data-focus-visible-added');\n }\n\n /**\n * If the most recent user interaction was via the keyboard;\n * and the key press did not include a meta, alt/option, or control key;\n * then the modality is keyboard. Otherwise, the modality is not keyboard.\n * Apply `focus-visible` to any current active element and keep track\n * of our keyboard modality state with `hadKeyboardEvent`.\n * @param {KeyboardEvent} e\n */\n function onKeyDown(e) {\n if (e.metaKey || e.altKey || e.ctrlKey) {\n return;\n }\n\n if (isValidFocusTarget(scope.activeElement)) {\n addFocusVisibleClass(scope.activeElement);\n }\n\n hadKeyboardEvent = true;\n }\n\n /**\n * If at any point a user clicks with a pointing device, ensure that we change\n * the modality away from keyboard.\n * This avoids the situation where a user presses a key on an already focused\n * element, and then clicks on a different element, focusing it with a\n * pointing device, while we still think we're in keyboard modality.\n * @param {Event} e\n */\n function onPointerDown(e) {\n hadKeyboardEvent = false;\n }\n\n /**\n * On `focus`, add the `focus-visible` class to the target if:\n * - the target received focus as a result of keyboard navigation, or\n * - the event target is an element that will likely require interaction\n * via the keyboard (e.g. a text box)\n * @param {Event} e\n */\n function onFocus(e) {\n // Prevent IE from focusing the document or HTML element.\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (hadKeyboardEvent || focusTriggersKeyboardModality(e.target)) {\n addFocusVisibleClass(e.target);\n }\n }\n\n /**\n * On `blur`, remove the `focus-visible` class from the target.\n * @param {Event} e\n */\n function onBlur(e) {\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (\n e.target.classList.contains('focus-visible') ||\n e.target.hasAttribute('data-focus-visible-added')\n ) {\n // To detect a tab/window switch, we look for a blur event followed\n // rapidly by a visibility change.\n // If we don't see a visibility change within 100ms, it's probably a\n // regular focus change.\n hadFocusVisibleRecently = true;\n window.clearTimeout(hadFocusVisibleRecentlyTimeout);\n hadFocusVisibleRecentlyTimeout = window.setTimeout(function() {\n hadFocusVisibleRecently = false;\n }, 100);\n removeFocusVisibleClass(e.target);\n }\n }\n\n /**\n * If the user changes tabs, keep track of whether or not the previously\n * focused element had .focus-visible.\n * @param {Event} e\n */\n function onVisibilityChange(e) {\n if (document.visibilityState === 'hidden') {\n // If the tab becomes active again, the browser will handle calling focus\n // on the element (Safari actually calls it twice).\n // If this tab change caused a blur on an element with focus-visible,\n // re-apply the class when the user switches back to the tab.\n if (hadFocusVisibleRecently) {\n hadKeyboardEvent = true;\n }\n addInitialPointerMoveListeners();\n }\n }\n\n /**\n * Add a group of listeners to detect usage of any pointing devices.\n * These listeners will be added when the polyfill first loads, and anytime\n * the window is blurred, so that they are active when the window regains\n * focus.\n */\n function addInitialPointerMoveListeners() {\n document.addEventListener('mousemove', onInitialPointerMove);\n document.addEventListener('mousedown', onInitialPointerMove);\n document.addEventListener('mouseup', onInitialPointerMove);\n document.addEventListener('pointermove', onInitialPointerMove);\n document.addEventListener('pointerdown', onInitialPointerMove);\n document.addEventListener('pointerup', onInitialPointerMove);\n document.addEventListener('touchmove', onInitialPointerMove);\n document.addEventListener('touchstart', onInitialPointerMove);\n document.addEventListener('touchend', onInitialPointerMove);\n }\n\n function removeInitialPointerMoveListeners() {\n document.removeEventListener('mousemove', onInitialPointerMove);\n document.removeEventListener('mousedown', onInitialPointerMove);\n document.removeEventListener('mouseup', onInitialPointerMove);\n document.removeEventListener('pointermove', onInitialPointerMove);\n document.removeEventListener('pointerdown', onInitialPointerMove);\n document.removeEventListener('pointerup', onInitialPointerMove);\n document.removeEventListener('touchmove', onInitialPointerMove);\n document.removeEventListener('touchstart', onInitialPointerMove);\n document.removeEventListener('touchend', onInitialPointerMove);\n }\n\n /**\n * When the polfyill first loads, assume the user is in keyboard modality.\n * If any event is received from a pointing device (e.g. mouse, pointer,\n * touch), turn off keyboard modality.\n * This accounts for situations where focus enters the page from the URL bar.\n * @param {Event} e\n */\n function onInitialPointerMove(e) {\n // Work around a Safari quirk that fires a mousemove on whenever the\n // window blurs, even if you're tabbing out of the page. \u00AF\\_(\u30C4)_/\u00AF\n if (e.target.nodeName && e.target.nodeName.toLowerCase() === 'html') {\n return;\n }\n\n hadKeyboardEvent = false;\n removeInitialPointerMoveListeners();\n }\n\n // For some kinds of state, we are interested in changes at the global scope\n // only. For example, global pointer input, global key presses and global\n // visibility change should affect the state at every scope:\n document.addEventListener('keydown', onKeyDown, true);\n document.addEventListener('mousedown', onPointerDown, true);\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('touchstart', onPointerDown, true);\n document.addEventListener('visibilitychange', onVisibilityChange, true);\n\n addInitialPointerMoveListeners();\n\n // For focus and blur, we specifically care about state changes in the local\n // scope. This is because focus / blur events that originate from within a\n // shadow root are not re-dispatched from the host element if it was already\n // the active element in its own scope:\n scope.addEventListener('focus', onFocus, true);\n scope.addEventListener('blur', onBlur, true);\n\n // We detect that a node is a ShadowRoot by ensuring that it is a\n // DocumentFragment and also has a host property. This check covers native\n // implementation and polyfill implementation transparently. If we only cared\n // about the native implementation, we could just check if the scope was\n // an instance of a ShadowRoot.\n if (scope.nodeType === Node.DOCUMENT_FRAGMENT_NODE && scope.host) {\n // Since a ShadowRoot is a special kind of DocumentFragment, it does not\n // have a root element to add a class to. So, we add this attribute to the\n // host element instead:\n scope.host.setAttribute('data-js-focus-visible', '');\n } else if (scope.nodeType === Node.DOCUMENT_NODE) {\n document.documentElement.classList.add('js-focus-visible');\n document.documentElement.setAttribute('data-js-focus-visible', '');\n }\n }\n\n // It is important to wrap all references to global window and document in\n // these checks to support server-side rendering use cases\n // @see https://github.com/WICG/focus-visible/issues/199\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Make the polyfill helper globally available. This can be used as a signal\n // to interested libraries that wish to coordinate with the polyfill for e.g.,\n // applying the polyfill to a shadow root:\n window.applyFocusVisiblePolyfill = applyFocusVisiblePolyfill;\n\n // Notify interested libraries of the polyfill's presence, in case the\n // polyfill was loaded lazily:\n var event;\n\n try {\n event = new CustomEvent('focus-visible-polyfill-ready');\n } catch (error) {\n // IE11 does not support using CustomEvent as a constructor directly:\n event = document.createEvent('CustomEvent');\n event.initCustomEvent('focus-visible-polyfill-ready', false, false, {});\n }\n\n window.dispatchEvent(event);\n }\n\n if (typeof document !== 'undefined') {\n // Apply the polyfill to the global document, so that no JavaScript\n // coordination is required to use the polyfill in the top-level document:\n applyFocusVisiblePolyfill(document);\n }\n\n})));\n", "/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n", "/*!\n * clipboard.js v2.0.11\n * https://clipboardjs.com/\n *\n * Licensed MIT \u00A9 Zeno Rocha\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClipboardJS\"] = factory();\n\telse\n\t\troot[\"ClipboardJS\"] = factory();\n})(this, function() {\nreturn /******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 686:\n/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ clipboard; }\n});\n\n// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js\nvar tiny_emitter = __webpack_require__(279);\nvar tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);\n// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js\nvar listen = __webpack_require__(370);\nvar listen_default = /*#__PURE__*/__webpack_require__.n(listen);\n// EXTERNAL MODULE: ./node_modules/select/src/select.js\nvar src_select = __webpack_require__(817);\nvar select_default = /*#__PURE__*/__webpack_require__.n(src_select);\n;// CONCATENATED MODULE: ./src/common/command.js\n/**\n * Executes a given operation type.\n * @param {String} type\n * @return {Boolean}\n */\nfunction command(type) {\n try {\n return document.execCommand(type);\n } catch (err) {\n return false;\n }\n}\n;// CONCATENATED MODULE: ./src/actions/cut.js\n\n\n/**\n * Cut action wrapper.\n * @param {String|HTMLElement} target\n * @return {String}\n */\n\nvar ClipboardActionCut = function ClipboardActionCut(target) {\n var selectedText = select_default()(target);\n command('cut');\n return selectedText;\n};\n\n/* harmony default export */ var actions_cut = (ClipboardActionCut);\n;// CONCATENATED MODULE: ./src/common/create-fake-element.js\n/**\n * Creates a fake textarea element with a value.\n * @param {String} value\n * @return {HTMLElement}\n */\nfunction createFakeElement(value) {\n var isRTL = document.documentElement.getAttribute('dir') === 'rtl';\n var fakeElement = document.createElement('textarea'); // Prevent zooming on iOS\n\n fakeElement.style.fontSize = '12pt'; // Reset box model\n\n fakeElement.style.border = '0';\n fakeElement.style.padding = '0';\n fakeElement.style.margin = '0'; // Move element out of screen horizontally\n\n fakeElement.style.position = 'absolute';\n fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically\n\n var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n fakeElement.style.top = \"\".concat(yPosition, \"px\");\n fakeElement.setAttribute('readonly', '');\n fakeElement.value = value;\n return fakeElement;\n}\n;// CONCATENATED MODULE: ./src/actions/copy.js\n\n\n\n/**\n * Create fake copy action wrapper using a fake element.\n * @param {String} target\n * @param {Object} options\n * @return {String}\n */\n\nvar fakeCopyAction = function fakeCopyAction(value, options) {\n var fakeElement = createFakeElement(value);\n options.container.appendChild(fakeElement);\n var selectedText = select_default()(fakeElement);\n command('copy');\n fakeElement.remove();\n return selectedText;\n};\n/**\n * Copy action wrapper.\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @return {String}\n */\n\n\nvar ClipboardActionCopy = function ClipboardActionCopy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n var selectedText = '';\n\n if (typeof target === 'string') {\n selectedText = fakeCopyAction(target, options);\n } else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) {\n // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n selectedText = fakeCopyAction(target.value, options);\n } else {\n selectedText = select_default()(target);\n command('copy');\n }\n\n return selectedText;\n};\n\n/* harmony default export */ var actions_copy = (ClipboardActionCopy);\n;// CONCATENATED MODULE: ./src/actions/default.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/**\n * Inner function which performs selection from either `text` or `target`\n * properties and then executes copy or cut operations.\n * @param {Object} options\n */\n\nvar ClipboardActionDefault = function ClipboardActionDefault() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // Defines base properties passed from constructor.\n var _options$action = options.action,\n action = _options$action === void 0 ? 'copy' : _options$action,\n container = options.container,\n target = options.target,\n text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'.\n\n if (action !== 'copy' && action !== 'cut') {\n throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n } // Sets the `target` property using an element that will be have its content copied.\n\n\n if (target !== undefined) {\n if (target && _typeof(target) === 'object' && target.nodeType === 1) {\n if (action === 'copy' && target.hasAttribute('disabled')) {\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n }\n\n if (action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n }\n } else {\n throw new Error('Invalid \"target\" value, use a valid Element');\n }\n } // Define selection strategy based on `text` property.\n\n\n if (text) {\n return actions_copy(text, {\n container: container\n });\n } // Defines which selection strategy based on `target` property.\n\n\n if (target) {\n return action === 'cut' ? actions_cut(target) : actions_copy(target, {\n container: container\n });\n }\n};\n\n/* harmony default export */ var actions_default = (ClipboardActionDefault);\n;// CONCATENATED MODULE: ./src/clipboard.js\nfunction clipboard_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return clipboard_typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n/**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n\nfunction getAttributeValue(suffix, element) {\n var attribute = \"data-clipboard-\".concat(suffix);\n\n if (!element.hasAttribute(attribute)) {\n return;\n }\n\n return element.getAttribute(attribute);\n}\n/**\n * Base class which takes one or more elements, adds event listeners to them,\n * and instantiates a new `ClipboardAction` on each click.\n */\n\n\nvar Clipboard = /*#__PURE__*/function (_Emitter) {\n _inherits(Clipboard, _Emitter);\n\n var _super = _createSuper(Clipboard);\n\n /**\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n * @param {Object} options\n */\n function Clipboard(trigger, options) {\n var _this;\n\n _classCallCheck(this, Clipboard);\n\n _this = _super.call(this);\n\n _this.resolveOptions(options);\n\n _this.listenClick(trigger);\n\n return _this;\n }\n /**\n * Defines if attributes would be resolved using internal setter functions\n * or custom functions that were passed in the constructor.\n * @param {Object} options\n */\n\n\n _createClass(Clipboard, [{\n key: \"resolveOptions\",\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;\n }\n /**\n * Adds a click event listener to the passed trigger.\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n */\n\n }, {\n key: \"listenClick\",\n value: function listenClick(trigger) {\n var _this2 = this;\n\n this.listener = listen_default()(trigger, 'click', function (e) {\n return _this2.onClick(e);\n });\n }\n /**\n * Defines a new `ClipboardAction` on each click event.\n * @param {Event} e\n */\n\n }, {\n key: \"onClick\",\n value: function onClick(e) {\n var trigger = e.delegateTarget || e.currentTarget;\n var action = this.action(trigger) || 'copy';\n var text = actions_default({\n action: action,\n container: this.container,\n target: this.target(trigger),\n text: this.text(trigger)\n }); // Fires an event based on the copy operation result.\n\n this.emit(text ? 'success' : 'error', {\n action: action,\n text: text,\n trigger: trigger,\n clearSelection: function clearSelection() {\n if (trigger) {\n trigger.focus();\n }\n\n window.getSelection().removeAllRanges();\n }\n });\n }\n /**\n * Default `action` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultAction\",\n value: function defaultAction(trigger) {\n return getAttributeValue('action', trigger);\n }\n /**\n * Default `target` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultTarget\",\n value: function defaultTarget(trigger) {\n var selector = getAttributeValue('target', trigger);\n\n if (selector) {\n return document.querySelector(selector);\n }\n }\n /**\n * Allow fire programmatically a copy action\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @returns Text copied.\n */\n\n }, {\n key: \"defaultText\",\n\n /**\n * Default `text` lookup function.\n * @param {Element} trigger\n */\n value: function defaultText(trigger) {\n return getAttributeValue('text', trigger);\n }\n /**\n * Destroy lifecycle.\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.listener.destroy();\n }\n }], [{\n key: \"copy\",\n value: function copy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n return actions_copy(target, options);\n }\n /**\n * Allow fire programmatically a cut action\n * @param {String|HTMLElement} target\n * @returns Text cutted.\n */\n\n }, {\n key: \"cut\",\n value: function cut(target) {\n return actions_cut(target);\n }\n /**\n * Returns the support of the given action, or all actions if no action is\n * given.\n * @param {String} [action]\n */\n\n }, {\n key: \"isSupported\",\n value: function isSupported() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n var actions = typeof action === 'string' ? [action] : action;\n var support = !!document.queryCommandSupported;\n actions.forEach(function (action) {\n support = support && !!document.queryCommandSupported(action);\n });\n return support;\n }\n }]);\n\n return Clipboard;\n}((tiny_emitter_default()));\n\n/* harmony default export */ var clipboard = (Clipboard);\n\n/***/ }),\n\n/***/ 828:\n/***/ (function(module) {\n\nvar DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n\n\n/***/ }),\n\n/***/ 438:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar closest = __webpack_require__(828);\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n\n\n/***/ }),\n\n/***/ 879:\n/***/ (function(__unused_webpack_module, exports) {\n\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n return value !== undefined\n && value instanceof HTMLElement\n && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return value !== undefined\n && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n && ('length' in value)\n && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n return typeof value === 'string'\n || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return type === '[object Function]';\n};\n\n\n/***/ }),\n\n/***/ 370:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar is = __webpack_require__(879);\nvar delegate = __webpack_require__(438);\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n if (!target && !type && !callback) {\n throw new Error('Missing required arguments');\n }\n\n if (!is.string(type)) {\n throw new TypeError('Second argument must be a String');\n }\n\n if (!is.fn(callback)) {\n throw new TypeError('Third argument must be a Function');\n }\n\n if (is.node(target)) {\n return listenNode(target, type, callback);\n }\n else if (is.nodeList(target)) {\n return listenNodeList(target, type, callback);\n }\n else if (is.string(target)) {\n return listenSelector(target, type, callback);\n }\n else {\n throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n node.addEventListener(type, callback);\n\n return {\n destroy: function() {\n node.removeEventListener(type, callback);\n }\n }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.addEventListener(type, callback);\n });\n\n return {\n destroy: function() {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.removeEventListener(type, callback);\n });\n }\n }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n\n/***/ }),\n\n/***/ 817:\n/***/ (function(module) {\n\nfunction select(element) {\n var selectedText;\n\n if (element.nodeName === 'SELECT') {\n element.focus();\n\n selectedText = element.value;\n }\n else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n var isReadOnly = element.hasAttribute('readonly');\n\n if (!isReadOnly) {\n element.setAttribute('readonly', '');\n }\n\n element.select();\n element.setSelectionRange(0, element.value.length);\n\n if (!isReadOnly) {\n element.removeAttribute('readonly');\n }\n\n selectedText = element.value;\n }\n else {\n if (element.hasAttribute('contenteditable')) {\n element.focus();\n }\n\n var selection = window.getSelection();\n var range = document.createRange();\n\n range.selectNodeContents(element);\n selection.removeAllRanges();\n selection.addRange(range);\n\n selectedText = selection.toString();\n }\n\n return selectedText;\n}\n\nmodule.exports = select;\n\n\n/***/ }),\n\n/***/ 279:\n/***/ (function(module) {\n\nfunction E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\n/******/ \t// module exports must be returned from runtime so entry inlining is disabled\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(686);\n/******/ })()\n.default;\n});", "/*\n * Copyright (c) 2016-2025 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport \"focus-visible\"\n\nimport {\n EMPTY,\n NEVER,\n Observable,\n Subject,\n defer,\n delay,\n filter,\n map,\n merge,\n mergeWith,\n shareReplay,\n switchMap\n} from \"rxjs\"\n\nimport { configuration, feature } from \"./_\"\nimport {\n at,\n getActiveElement,\n getOptionalElement,\n requestJSON,\n setLocation,\n setToggle,\n watchDocument,\n watchKeyboard,\n watchLocation,\n watchLocationTarget,\n watchMedia,\n watchPrint,\n watchScript,\n watchViewport\n} from \"./browser\"\nimport {\n getComponentElement,\n getComponentElements,\n mountAnnounce,\n mountBackToTop,\n mountConsent,\n mountContent,\n mountDialog,\n mountHeader,\n mountHeaderTitle,\n mountPalette,\n mountProgress,\n mountSearch,\n mountSearchHiglight,\n mountSidebar,\n mountSource,\n mountTableOfContents,\n mountTabs,\n watchHeader,\n watchMain\n} from \"./components\"\nimport {\n SearchIndex,\n setupClipboardJS,\n setupInstantNavigation,\n setupVersionSelector\n} from \"./integrations\"\nimport {\n patchEllipsis,\n patchIndeterminate,\n patchScrollfix,\n patchScrolllock\n} from \"./patches\"\nimport \"./polyfills\"\n\n/* ----------------------------------------------------------------------------\n * Functions - @todo refactor\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch search index\n *\n * @returns Search index observable\n */\nfunction fetchSearchIndex(): Observable {\n if (location.protocol === \"file:\") {\n return watchScript(\n `${new URL(\"search/search_index.js\", config.base)}`\n )\n .pipe(\n // @ts-ignore - @todo fix typings\n map(() => __index),\n shareReplay(1)\n )\n } else {\n return requestJSON(\n new URL(\"search/search_index.json\", config.base)\n )\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Application\n * ------------------------------------------------------------------------- */\n\n/* Yay, JavaScript is available */\ndocument.documentElement.classList.remove(\"no-js\")\ndocument.documentElement.classList.add(\"js\")\n\n/* Set up navigation observables and subjects */\nconst document$ = watchDocument()\nconst location$ = watchLocation()\nconst target$ = watchLocationTarget(location$)\nconst keyboard$ = watchKeyboard()\n\n/* Set up media observables */\nconst viewport$ = watchViewport()\nconst tablet$ = watchMedia(\"(min-width: 960px)\")\nconst screen$ = watchMedia(\"(min-width: 1220px)\")\nconst print$ = watchPrint()\n\n/* Retrieve search index, if search is enabled */\nconst config = configuration()\nconst index$ = document.forms.namedItem(\"search\")\n ? fetchSearchIndex()\n : NEVER\n\n/* Set up Clipboard.js integration */\nconst alert$ = new Subject()\nsetupClipboardJS({ alert$ })\n\n/* Set up progress indicator */\nconst progress$ = new Subject()\n\n/* Set up instant navigation, if enabled */\nif (feature(\"navigation.instant\"))\n setupInstantNavigation({ location$, viewport$, progress$ })\n .subscribe(document$)\n\n/* Set up version selector */\nif (config.version?.provider === \"mike\")\n setupVersionSelector({ document$ })\n\n/* Always close drawer and search on navigation */\nmerge(location$, target$)\n .pipe(\n delay(125)\n )\n .subscribe(() => {\n setToggle(\"drawer\", false)\n setToggle(\"search\", false)\n })\n\n/* Set up global keyboard handlers */\nkeyboard$\n .pipe(\n filter(({ mode }) => mode === \"global\")\n )\n .subscribe(key => {\n switch (key.type) {\n\n /* Go to previous page */\n case \"p\":\n case \",\":\n const prev = getOptionalElement(\"link[rel=prev]\")\n if (typeof prev !== \"undefined\")\n setLocation(prev)\n break\n\n /* Go to next page */\n case \"n\":\n case \".\":\n const next = getOptionalElement(\"link[rel=next]\")\n if (typeof next !== \"undefined\")\n setLocation(next)\n break\n\n /* Expand navigation, see https://bit.ly/3ZjG5io */\n case \"Enter\":\n const active = getActiveElement()\n if (active instanceof HTMLLabelElement)\n active.click()\n }\n })\n\n/* Set up patches */\npatchEllipsis({ viewport$, document$ })\npatchIndeterminate({ document$, tablet$ })\npatchScrollfix({ document$ })\npatchScrolllock({ viewport$, tablet$ })\n\n/* Set up header and main area observable */\nconst header$ = watchHeader(getComponentElement(\"header\"), { viewport$ })\nconst main$ = document$\n .pipe(\n map(() => getComponentElement(\"main\")),\n switchMap(el => watchMain(el, { viewport$, header$ })),\n shareReplay(1)\n )\n\n/* Set up control component observables */\nconst control$ = merge(\n\n /* Consent */\n ...getComponentElements(\"consent\")\n .map(el => mountConsent(el, { target$ })),\n\n /* Dialog */\n ...getComponentElements(\"dialog\")\n .map(el => mountDialog(el, { alert$ })),\n\n /* Color palette */\n ...getComponentElements(\"palette\")\n .map(el => mountPalette(el)),\n\n /* Progress bar */\n ...getComponentElements(\"progress\")\n .map(el => mountProgress(el, { progress$ })),\n\n /* Search */\n ...getComponentElements(\"search\")\n .map(el => mountSearch(el, { index$, keyboard$ })),\n\n /* Repository information */\n ...getComponentElements(\"source\")\n .map(el => mountSource(el))\n)\n\n/* Set up content component observables */\nconst content$ = defer(() => merge(\n\n /* Announcement bar */\n ...getComponentElements(\"announce\")\n .map(el => mountAnnounce(el)),\n\n /* Content */\n ...getComponentElements(\"content\")\n .map(el => mountContent(el, { viewport$, target$, print$ })),\n\n /* Search highlighting */\n ...getComponentElements(\"content\")\n .map(el => feature(\"search.highlight\")\n ? mountSearchHiglight(el, { index$, location$ })\n : EMPTY\n ),\n\n /* Header */\n ...getComponentElements(\"header\")\n .map(el => mountHeader(el, { viewport$, header$, main$ })),\n\n /* Header title */\n ...getComponentElements(\"header-title\")\n .map(el => mountHeaderTitle(el, { viewport$, header$ })),\n\n /* Sidebar */\n ...getComponentElements(\"sidebar\")\n .map(el => el.getAttribute(\"data-md-type\") === \"navigation\"\n ? at(screen$, () => mountSidebar(el, { viewport$, header$, main$ }))\n : at(tablet$, () => mountSidebar(el, { viewport$, header$, main$ }))\n ),\n\n /* Navigation tabs */\n ...getComponentElements(\"tabs\")\n .map(el => mountTabs(el, { viewport$, header$ })),\n\n /* Table of contents */\n ...getComponentElements(\"toc\")\n .map(el => mountTableOfContents(el, {\n viewport$, header$, main$, target$\n })),\n\n /* Back-to-top button */\n ...getComponentElements(\"top\")\n .map(el => mountBackToTop(el, { viewport$, header$, main$, target$ }))\n))\n\n/* Set up component observables */\nconst component$ = document$\n .pipe(\n switchMap(() => content$),\n mergeWith(control$),\n shareReplay(1)\n )\n\n/* Subscribe to all components */\ncomponent$.subscribe()\n\n/* ----------------------------------------------------------------------------\n * Exports\n * ------------------------------------------------------------------------- */\n\nwindow.document$ = document$ /* Document observable */\nwindow.location$ = location$ /* Location subject */\nwindow.target$ = target$ /* Location target observable */\nwindow.keyboard$ = keyboard$ /* Keyboard observable */\nwindow.viewport$ = viewport$ /* Viewport observable */\nwindow.tablet$ = tablet$ /* Media tablet observable */\nwindow.screen$ = screen$ /* Media screen observable */\nwindow.print$ = print$ /* Media print observable */\nwindow.alert$ = alert$ /* Alert subject */\nwindow.progress$ = progress$ /* Progress indicator subject */\nwindow.component$ = component$ /* Component observable */\n", "/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n};\n", "/**\n * Returns true if the object is a function.\n * @param value The value to check\n */\nexport function isFunction(value: any): value is (...args: any[]) => any {\n return typeof value === 'function';\n}\n", "/**\n * Used to create Error subclasses until the community moves away from ES5.\n *\n * This is because compiling from TypeScript down to ES5 has issues with subclassing Errors\n * as well as other built-in types: https://github.com/Microsoft/TypeScript/issues/12123\n *\n * @param createImpl A factory function to create the actual constructor implementation. The returned\n * function should be a named function that calls `_super` internally.\n */\nexport function createErrorClass(createImpl: (_super: any) => any): T {\n const _super = (instance: any) => {\n Error.call(instance);\n instance.stack = new Error().stack;\n };\n\n const ctorFunc = createImpl(_super);\n ctorFunc.prototype = Object.create(Error.prototype);\n ctorFunc.prototype.constructor = ctorFunc;\n return ctorFunc;\n}\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface UnsubscriptionError extends Error {\n readonly errors: any[];\n}\n\nexport interface UnsubscriptionErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (errors: any[]): UnsubscriptionError;\n}\n\n/**\n * An error thrown when one or more errors have occurred during the\n * `unsubscribe` of a {@link Subscription}.\n */\nexport const UnsubscriptionError: UnsubscriptionErrorCtor = createErrorClass(\n (_super) =>\n function UnsubscriptionErrorImpl(this: any, errors: (Error | string)[]) {\n _super(this);\n this.message = errors\n ? `${errors.length} errors occurred during unsubscription:\n${errors.map((err, i) => `${i + 1}) ${err.toString()}`).join('\\n ')}`\n : '';\n this.name = 'UnsubscriptionError';\n this.errors = errors;\n }\n);\n", "/**\n * Removes an item from an array, mutating it.\n * @param arr The array to remove the item from\n * @param item The item to remove\n */\nexport function arrRemove(arr: T[] | undefined | null, item: T) {\n if (arr) {\n const index = arr.indexOf(item);\n 0 <= index && arr.splice(index, 1);\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nimport { SubscriptionLike, TeardownLogic, Unsubscribable } from './types';\nimport { arrRemove } from './util/arrRemove';\n\n/**\n * Represents a disposable resource, such as the execution of an Observable. A\n * Subscription has one important method, `unsubscribe`, that takes no argument\n * and just disposes the resource held by the subscription.\n *\n * Additionally, subscriptions may be grouped together through the `add()`\n * method, which will attach a child Subscription to the current Subscription.\n * When a Subscription is unsubscribed, all its children (and its grandchildren)\n * will be unsubscribed as well.\n *\n * @class Subscription\n */\nexport class Subscription implements SubscriptionLike {\n /** @nocollapse */\n public static EMPTY = (() => {\n const empty = new Subscription();\n empty.closed = true;\n return empty;\n })();\n\n /**\n * A flag to indicate whether this Subscription has already been unsubscribed.\n */\n public closed = false;\n\n private _parentage: Subscription[] | Subscription | null = null;\n\n /**\n * The list of registered finalizers to execute upon unsubscription. Adding and removing from this\n * list occurs in the {@link #add} and {@link #remove} methods.\n */\n private _finalizers: Exclude[] | null = null;\n\n /**\n * @param initialTeardown A function executed first as part of the finalization\n * process that is kicked off when {@link #unsubscribe} is called.\n */\n constructor(private initialTeardown?: () => void) {}\n\n /**\n * Disposes the resources held by the subscription. May, for instance, cancel\n * an ongoing Observable execution or cancel any other type of work that\n * started when the Subscription was created.\n * @return {void}\n */\n unsubscribe(): void {\n let errors: any[] | undefined;\n\n if (!this.closed) {\n this.closed = true;\n\n // Remove this from it's parents.\n const { _parentage } = this;\n if (_parentage) {\n this._parentage = null;\n if (Array.isArray(_parentage)) {\n for (const parent of _parentage) {\n parent.remove(this);\n }\n } else {\n _parentage.remove(this);\n }\n }\n\n const { initialTeardown: initialFinalizer } = this;\n if (isFunction(initialFinalizer)) {\n try {\n initialFinalizer();\n } catch (e) {\n errors = e instanceof UnsubscriptionError ? e.errors : [e];\n }\n }\n\n const { _finalizers } = this;\n if (_finalizers) {\n this._finalizers = null;\n for (const finalizer of _finalizers) {\n try {\n execFinalizer(finalizer);\n } catch (err) {\n errors = errors ?? [];\n if (err instanceof UnsubscriptionError) {\n errors = [...errors, ...err.errors];\n } else {\n errors.push(err);\n }\n }\n }\n }\n\n if (errors) {\n throw new UnsubscriptionError(errors);\n }\n }\n }\n\n /**\n * Adds a finalizer to this subscription, so that finalization will be unsubscribed/called\n * when this subscription is unsubscribed. If this subscription is already {@link #closed},\n * because it has already been unsubscribed, then whatever finalizer is passed to it\n * will automatically be executed (unless the finalizer itself is also a closed subscription).\n *\n * Closed Subscriptions cannot be added as finalizers to any subscription. Adding a closed\n * subscription to a any subscription will result in no operation. (A noop).\n *\n * Adding a subscription to itself, or adding `null` or `undefined` will not perform any\n * operation at all. (A noop).\n *\n * `Subscription` instances that are added to this instance will automatically remove themselves\n * if they are unsubscribed. Functions and {@link Unsubscribable} objects that you wish to remove\n * will need to be removed manually with {@link #remove}\n *\n * @param teardown The finalization logic to add to this subscription.\n */\n add(teardown: TeardownLogic): void {\n // Only add the finalizer if it's not undefined\n // and don't add a subscription to itself.\n if (teardown && teardown !== this) {\n if (this.closed) {\n // If this subscription is already closed,\n // execute whatever finalizer is handed to it automatically.\n execFinalizer(teardown);\n } else {\n if (teardown instanceof Subscription) {\n // We don't add closed subscriptions, and we don't add the same subscription\n // twice. Subscription unsubscribe is idempotent.\n if (teardown.closed || teardown._hasParent(this)) {\n return;\n }\n teardown._addParent(this);\n }\n (this._finalizers = this._finalizers ?? []).push(teardown);\n }\n }\n }\n\n /**\n * Checks to see if a this subscription already has a particular parent.\n * This will signal that this subscription has already been added to the parent in question.\n * @param parent the parent to check for\n */\n private _hasParent(parent: Subscription) {\n const { _parentage } = this;\n return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));\n }\n\n /**\n * Adds a parent to this subscription so it can be removed from the parent if it\n * unsubscribes on it's own.\n *\n * NOTE: THIS ASSUMES THAT {@link _hasParent} HAS ALREADY BEEN CHECKED.\n * @param parent The parent subscription to add\n */\n private _addParent(parent: Subscription) {\n const { _parentage } = this;\n this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;\n }\n\n /**\n * Called on a child when it is removed via {@link #remove}.\n * @param parent The parent to remove\n */\n private _removeParent(parent: Subscription) {\n const { _parentage } = this;\n if (_parentage === parent) {\n this._parentage = null;\n } else if (Array.isArray(_parentage)) {\n arrRemove(_parentage, parent);\n }\n }\n\n /**\n * Removes a finalizer from this subscription that was previously added with the {@link #add} method.\n *\n * Note that `Subscription` instances, when unsubscribed, will automatically remove themselves\n * from every other `Subscription` they have been added to. This means that using the `remove` method\n * is not a common thing and should be used thoughtfully.\n *\n * If you add the same finalizer instance of a function or an unsubscribable object to a `Subscription` instance\n * more than once, you will need to call `remove` the same number of times to remove all instances.\n *\n * All finalizer instances are removed to free up memory upon unsubscription.\n *\n * @param teardown The finalizer to remove from this subscription\n */\n remove(teardown: Exclude): void {\n const { _finalizers } = this;\n _finalizers && arrRemove(_finalizers, teardown);\n\n if (teardown instanceof Subscription) {\n teardown._removeParent(this);\n }\n }\n}\n\nexport const EMPTY_SUBSCRIPTION = Subscription.EMPTY;\n\nexport function isSubscription(value: any): value is Subscription {\n return (\n value instanceof Subscription ||\n (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe))\n );\n}\n\nfunction execFinalizer(finalizer: Unsubscribable | (() => void)) {\n if (isFunction(finalizer)) {\n finalizer();\n } else {\n finalizer.unsubscribe();\n }\n}\n", "import { Subscriber } from './Subscriber';\nimport { ObservableNotification } from './types';\n\n/**\n * The {@link GlobalConfig} object for RxJS. It is used to configure things\n * like how to react on unhandled errors.\n */\nexport const config: GlobalConfig = {\n onUnhandledError: null,\n onStoppedNotification: null,\n Promise: undefined,\n useDeprecatedSynchronousErrorHandling: false,\n useDeprecatedNextContext: false,\n};\n\n/**\n * The global configuration object for RxJS, used to configure things\n * like how to react on unhandled errors. Accessible via {@link config}\n * object.\n */\nexport interface GlobalConfig {\n /**\n * A registration point for unhandled errors from RxJS. These are errors that\n * cannot were not handled by consuming code in the usual subscription path. For\n * example, if you have this configured, and you subscribe to an observable without\n * providing an error handler, errors from that subscription will end up here. This\n * will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onUnhandledError: ((err: any) => void) | null;\n\n /**\n * A registration point for notifications that cannot be sent to subscribers because they\n * have completed, errored or have been explicitly unsubscribed. By default, next, complete\n * and error notifications sent to stopped subscribers are noops. However, sometimes callers\n * might want a different behavior. For example, with sources that attempt to report errors\n * to stopped subscribers, a caller can configure RxJS to throw an unhandled error instead.\n * This will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onStoppedNotification: ((notification: ObservableNotification, subscriber: Subscriber) => void) | null;\n\n /**\n * The promise constructor used by default for {@link Observable#toPromise toPromise} and {@link Observable#forEach forEach}\n * methods.\n *\n * @deprecated As of version 8, RxJS will no longer support this sort of injection of a\n * Promise constructor. If you need a Promise implementation other than native promises,\n * please polyfill/patch Promise as you see appropriate. Will be removed in v8.\n */\n Promise?: PromiseConstructorLike;\n\n /**\n * If true, turns on synchronous error rethrowing, which is a deprecated behavior\n * in v6 and higher. This behavior enables bad patterns like wrapping a subscribe\n * call in a try/catch block. It also enables producer interference, a nasty bug\n * where a multicast can be broken for all observers by a downstream consumer with\n * an unhandled error. DO NOT USE THIS FLAG UNLESS IT'S NEEDED TO BUY TIME\n * FOR MIGRATION REASONS.\n *\n * @deprecated As of version 8, RxJS will no longer support synchronous throwing\n * of unhandled errors. All errors will be thrown on a separate call stack to prevent bad\n * behaviors described above. Will be removed in v8.\n */\n useDeprecatedSynchronousErrorHandling: boolean;\n\n /**\n * If true, enables an as-of-yet undocumented feature from v5: The ability to access\n * `unsubscribe()` via `this` context in `next` functions created in observers passed\n * to `subscribe`.\n *\n * This is being removed because the performance was severely problematic, and it could also cause\n * issues when types other than POJOs are passed to subscribe as subscribers, as they will likely have\n * their `this` context overwritten.\n *\n * @deprecated As of version 8, RxJS will no longer support altering the\n * context of next functions provided as part of an observer to Subscribe. Instead,\n * you will have access to a subscription or a signal or token that will allow you to do things like\n * unsubscribe and test closed status. Will be removed in v8.\n */\n useDeprecatedNextContext: boolean;\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetTimeoutFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearTimeoutFunction = (handle: TimerHandle) => void;\n\ninterface TimeoutProvider {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n delegate:\n | {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n }\n | undefined;\n}\n\nexport const timeoutProvider: TimeoutProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setTimeout(handler: () => void, timeout?: number, ...args) {\n const { delegate } = timeoutProvider;\n if (delegate?.setTimeout) {\n return delegate.setTimeout(handler, timeout, ...args);\n }\n return setTimeout(handler, timeout, ...args);\n },\n clearTimeout(handle) {\n const { delegate } = timeoutProvider;\n return (delegate?.clearTimeout || clearTimeout)(handle as any);\n },\n delegate: undefined,\n};\n", "import { config } from '../config';\nimport { timeoutProvider } from '../scheduler/timeoutProvider';\n\n/**\n * Handles an error on another job either with the user-configured {@link onUnhandledError},\n * or by throwing it on that new job so it can be picked up by `window.onerror`, `process.on('error')`, etc.\n *\n * This should be called whenever there is an error that is out-of-band with the subscription\n * or when an error hits a terminal boundary of the subscription and no error handler was provided.\n *\n * @param err the error to report\n */\nexport function reportUnhandledError(err: any) {\n timeoutProvider.setTimeout(() => {\n const { onUnhandledError } = config;\n if (onUnhandledError) {\n // Execute the user-configured error handler.\n onUnhandledError(err);\n } else {\n // Throw so it is picked up by the runtime's uncaught error mechanism.\n throw err;\n }\n });\n}\n", "/* tslint:disable:no-empty */\nexport function noop() { }\n", "import { CompleteNotification, NextNotification, ErrorNotification } from './types';\n\n/**\n * A completion object optimized for memory use and created to be the\n * same \"shape\" as other notifications in v8.\n * @internal\n */\nexport const COMPLETE_NOTIFICATION = (() => createNotification('C', undefined, undefined) as CompleteNotification)();\n\n/**\n * Internal use only. Creates an optimized error notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function errorNotification(error: any): ErrorNotification {\n return createNotification('E', undefined, error) as any;\n}\n\n/**\n * Internal use only. Creates an optimized next notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function nextNotification(value: T) {\n return createNotification('N', value, undefined) as NextNotification;\n}\n\n/**\n * Ensures that all notifications created internally have the same \"shape\" in v8.\n *\n * TODO: This is only exported to support a crazy legacy test in `groupBy`.\n * @internal\n */\nexport function createNotification(kind: 'N' | 'E' | 'C', value: any, error: any) {\n return {\n kind,\n value,\n error,\n };\n}\n", "import { config } from '../config';\n\nlet context: { errorThrown: boolean; error: any } | null = null;\n\n/**\n * Handles dealing with errors for super-gross mode. Creates a context, in which\n * any synchronously thrown errors will be passed to {@link captureError}. Which\n * will record the error such that it will be rethrown after the call back is complete.\n * TODO: Remove in v8\n * @param cb An immediately executed function.\n */\nexport function errorContext(cb: () => void) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n const isRoot = !context;\n if (isRoot) {\n context = { errorThrown: false, error: null };\n }\n cb();\n if (isRoot) {\n const { errorThrown, error } = context!;\n context = null;\n if (errorThrown) {\n throw error;\n }\n }\n } else {\n // This is the general non-deprecated path for everyone that\n // isn't crazy enough to use super-gross mode (useDeprecatedSynchronousErrorHandling)\n cb();\n }\n}\n\n/**\n * Captures errors only in super-gross mode.\n * @param err the error to capture\n */\nexport function captureError(err: any) {\n if (config.useDeprecatedSynchronousErrorHandling && context) {\n context.errorThrown = true;\n context.error = err;\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { Observer, ObservableNotification } from './types';\nimport { isSubscription, Subscription } from './Subscription';\nimport { config } from './config';\nimport { reportUnhandledError } from './util/reportUnhandledError';\nimport { noop } from './util/noop';\nimport { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';\nimport { timeoutProvider } from './scheduler/timeoutProvider';\nimport { captureError } from './util/errorContext';\n\n/**\n * Implements the {@link Observer} interface and extends the\n * {@link Subscription} class. While the {@link Observer} is the public API for\n * consuming the values of an {@link Observable}, all Observers get converted to\n * a Subscriber, in order to provide Subscription-like capabilities such as\n * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for\n * implementing operators, but it is rarely used as a public API.\n *\n * @class Subscriber\n */\nexport class Subscriber extends Subscription implements Observer {\n /**\n * A static factory for a Subscriber, given a (potentially partial) definition\n * of an Observer.\n * @param next The `next` callback of an Observer.\n * @param error The `error` callback of an\n * Observer.\n * @param complete The `complete` callback of an\n * Observer.\n * @return A Subscriber wrapping the (partially defined)\n * Observer represented by the given arguments.\n * @nocollapse\n * @deprecated Do not use. Will be removed in v8. There is no replacement for this\n * method, and there is no reason to be creating instances of `Subscriber` directly.\n * If you have a specific use case, please file an issue.\n */\n static create(next?: (x?: T) => void, error?: (e?: any) => void, complete?: () => void): Subscriber {\n return new SafeSubscriber(next, error, complete);\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected isStopped: boolean = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected destination: Subscriber | Observer; // this `any` is the escape hatch to erase extra type param (e.g. R)\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * There is no reason to directly create an instance of Subscriber. This type is exported for typings reasons.\n */\n constructor(destination?: Subscriber | Observer) {\n super();\n if (destination) {\n this.destination = destination;\n // Automatically chain subscriptions together here.\n // if destination is a Subscription, then it is a Subscriber.\n if (isSubscription(destination)) {\n destination.add(this);\n }\n } else {\n this.destination = EMPTY_OBSERVER;\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `next` from\n * the Observable, with a value. The Observable may call this method 0 or more\n * times.\n * @param {T} [value] The `next` value.\n * @return {void}\n */\n next(value?: T): void {\n if (this.isStopped) {\n handleStoppedNotification(nextNotification(value), this);\n } else {\n this._next(value!);\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `error` from\n * the Observable, with an attached `Error`. Notifies the Observer that\n * the Observable has experienced an error condition.\n * @param {any} [err] The `error` exception.\n * @return {void}\n */\n error(err?: any): void {\n if (this.isStopped) {\n handleStoppedNotification(errorNotification(err), this);\n } else {\n this.isStopped = true;\n this._error(err);\n }\n }\n\n /**\n * The {@link Observer} callback to receive a valueless notification of type\n * `complete` from the Observable. Notifies the Observer that the Observable\n * has finished sending push-based notifications.\n * @return {void}\n */\n complete(): void {\n if (this.isStopped) {\n handleStoppedNotification(COMPLETE_NOTIFICATION, this);\n } else {\n this.isStopped = true;\n this._complete();\n }\n }\n\n unsubscribe(): void {\n if (!this.closed) {\n this.isStopped = true;\n super.unsubscribe();\n this.destination = null!;\n }\n }\n\n protected _next(value: T): void {\n this.destination.next(value);\n }\n\n protected _error(err: any): void {\n try {\n this.destination.error(err);\n } finally {\n this.unsubscribe();\n }\n }\n\n protected _complete(): void {\n try {\n this.destination.complete();\n } finally {\n this.unsubscribe();\n }\n }\n}\n\n/**\n * This bind is captured here because we want to be able to have\n * compatibility with monoid libraries that tend to use a method named\n * `bind`. In particular, a library called Monio requires this.\n */\nconst _bind = Function.prototype.bind;\n\nfunction bind any>(fn: Fn, thisArg: any): Fn {\n return _bind.call(fn, thisArg);\n}\n\n/**\n * Internal optimization only, DO NOT EXPOSE.\n * @internal\n */\nclass ConsumerObserver implements Observer {\n constructor(private partialObserver: Partial>) {}\n\n next(value: T): void {\n const { partialObserver } = this;\n if (partialObserver.next) {\n try {\n partialObserver.next(value);\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n\n error(err: any): void {\n const { partialObserver } = this;\n if (partialObserver.error) {\n try {\n partialObserver.error(err);\n } catch (error) {\n handleUnhandledError(error);\n }\n } else {\n handleUnhandledError(err);\n }\n }\n\n complete(): void {\n const { partialObserver } = this;\n if (partialObserver.complete) {\n try {\n partialObserver.complete();\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n}\n\nexport class SafeSubscriber extends Subscriber {\n constructor(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((e?: any) => void) | null,\n complete?: (() => void) | null\n ) {\n super();\n\n let partialObserver: Partial>;\n if (isFunction(observerOrNext) || !observerOrNext) {\n // The first argument is a function, not an observer. The next\n // two arguments *could* be observers, or they could be empty.\n partialObserver = {\n next: (observerOrNext ?? undefined) as (((value: T) => void) | undefined),\n error: error ?? undefined,\n complete: complete ?? undefined,\n };\n } else {\n // The first argument is a partial observer.\n let context: any;\n if (this && config.useDeprecatedNextContext) {\n // This is a deprecated path that made `this.unsubscribe()` available in\n // next handler functions passed to subscribe. This only exists behind a flag\n // now, as it is *very* slow.\n context = Object.create(observerOrNext);\n context.unsubscribe = () => this.unsubscribe();\n partialObserver = {\n next: observerOrNext.next && bind(observerOrNext.next, context),\n error: observerOrNext.error && bind(observerOrNext.error, context),\n complete: observerOrNext.complete && bind(observerOrNext.complete, context),\n };\n } else {\n // The \"normal\" path. Just use the partial observer directly.\n partialObserver = observerOrNext;\n }\n }\n\n // Wrap the partial observer to ensure it's a full observer, and\n // make sure proper error handling is accounted for.\n this.destination = new ConsumerObserver(partialObserver);\n }\n}\n\nfunction handleUnhandledError(error: any) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n captureError(error);\n } else {\n // Ideal path, we report this as an unhandled error,\n // which is thrown on a new call stack.\n reportUnhandledError(error);\n }\n}\n\n/**\n * An error handler used when no error handler was supplied\n * to the SafeSubscriber -- meaning no error handler was supplied\n * do the `subscribe` call on our observable.\n * @param err The error to handle\n */\nfunction defaultErrorHandler(err: any) {\n throw err;\n}\n\n/**\n * A handler for notifications that cannot be sent to a stopped subscriber.\n * @param notification The notification being sent\n * @param subscriber The stopped subscriber\n */\nfunction handleStoppedNotification(notification: ObservableNotification, subscriber: Subscriber) {\n const { onStoppedNotification } = config;\n onStoppedNotification && timeoutProvider.setTimeout(() => onStoppedNotification(notification, subscriber));\n}\n\n/**\n * The observer used as a stub for subscriptions where the user did not\n * pass any arguments to `subscribe`. Comes with the default error handling\n * behavior.\n */\nexport const EMPTY_OBSERVER: Readonly> & { closed: true } = {\n closed: true,\n next: noop,\n error: defaultErrorHandler,\n complete: noop,\n};\n", "/**\n * Symbol.observable or a string \"@@observable\". Used for interop\n *\n * @deprecated We will no longer be exporting this symbol in upcoming versions of RxJS.\n * Instead polyfill and use Symbol.observable directly *or* use https://www.npmjs.com/package/symbol-observable\n */\nexport const observable: string | symbol = (() => (typeof Symbol === 'function' && Symbol.observable) || '@@observable')();\n", "/**\n * This function takes one parameter and just returns it. Simply put,\n * this is like `(x: T): T => x`.\n *\n * ## Examples\n *\n * This is useful in some cases when using things like `mergeMap`\n *\n * ```ts\n * import { interval, take, map, range, mergeMap, identity } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(5));\n *\n * const result$ = source$.pipe(\n * map(i => range(i)),\n * mergeMap(identity) // same as mergeMap(x => x)\n * );\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * Or when you want to selectively apply an operator\n *\n * ```ts\n * import { interval, take, identity } from 'rxjs';\n *\n * const shouldLimit = () => Math.random() < 0.5;\n *\n * const source$ = interval(1000);\n *\n * const result$ = source$.pipe(shouldLimit() ? take(5) : identity);\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * @param x Any value that is returned by this function\n * @returns The value passed as the first parameter to this function\n */\nexport function identity(x: T): T {\n return x;\n}\n", "import { identity } from './identity';\nimport { UnaryFunction } from '../types';\n\nexport function pipe(): typeof identity;\nexport function pipe(fn1: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction,\n ...fns: UnaryFunction[]\n): UnaryFunction;\n\n/**\n * pipe() can be called on one or more functions, each of which can take one argument (\"UnaryFunction\")\n * and uses it to return a value.\n * It returns a function that takes one argument, passes it to the first UnaryFunction, and then\n * passes the result to the next one, passes that result to the next one, and so on. \n */\nexport function pipe(...fns: Array>): UnaryFunction {\n return pipeFromArray(fns);\n}\n\n/** @internal */\nexport function pipeFromArray(fns: Array>): UnaryFunction {\n if (fns.length === 0) {\n return identity as UnaryFunction;\n }\n\n if (fns.length === 1) {\n return fns[0];\n }\n\n return function piped(input: T): R {\n return fns.reduce((prev: any, fn: UnaryFunction) => fn(prev), input as any);\n };\n}\n", "import { Operator } from './Operator';\nimport { SafeSubscriber, Subscriber } from './Subscriber';\nimport { isSubscription, Subscription } from './Subscription';\nimport { TeardownLogic, OperatorFunction, Subscribable, Observer } from './types';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\nimport { isFunction } from './util/isFunction';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A representation of any set of values over any amount of time. This is the most basic building block\n * of RxJS.\n *\n * @class Observable\n */\nexport class Observable implements Subscribable {\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n source: Observable | undefined;\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n operator: Operator | undefined;\n\n /**\n * @constructor\n * @param {Function} subscribe the function that is called when the Observable is\n * initially subscribed to. This function is given a Subscriber, to which new values\n * can be `next`ed, or an `error` method can be called to raise an error, or\n * `complete` can be called to notify of a successful completion.\n */\n constructor(subscribe?: (this: Observable, subscriber: Subscriber) => TeardownLogic) {\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n\n // HACK: Since TypeScript inherits static properties too, we have to\n // fight against TypeScript here so Subject can have a different static create signature\n /**\n * Creates a new Observable by calling the Observable constructor\n * @owner Observable\n * @method create\n * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor\n * @return {Observable} a new observable\n * @nocollapse\n * @deprecated Use `new Observable()` instead. Will be removed in v8.\n */\n static create: (...args: any[]) => any = (subscribe?: (subscriber: Subscriber) => TeardownLogic) => {\n return new Observable(subscribe);\n };\n\n /**\n * Creates a new Observable, with this Observable instance as the source, and the passed\n * operator defined as the new observable's operator.\n * @method lift\n * @param operator the operator defining the operation to take on the observable\n * @return a new observable with the Operator applied\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * If you have implemented an operator using `lift`, it is recommended that you create an\n * operator by simply returning `new Observable()` directly. See \"Creating new operators from\n * scratch\" section here: https://rxjs.dev/guide/operators\n */\n lift(operator?: Operator): Observable {\n const observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n }\n\n subscribe(observerOrNext?: Partial> | ((value: T) => void)): Subscription;\n /** @deprecated Instead of passing separate callback arguments, use an observer argument. Signatures taking separate callback arguments will be removed in v8. Details: https://rxjs.dev/deprecations/subscribe-arguments */\n subscribe(next?: ((value: T) => void) | null, error?: ((error: any) => void) | null, complete?: (() => void) | null): Subscription;\n /**\n * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit.\n *\n * Use it when you have all these Observables, but still nothing is happening.\n *\n * `subscribe` is not a regular operator, but a method that calls Observable's internal `subscribe` function. It\n * might be for example a function that you passed to Observable's constructor, but most of the time it is\n * a library implementation, which defines what will be emitted by an Observable, and when it be will emitted. This means\n * that calling `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often\n * the thought.\n *\n * Apart from starting the execution of an Observable, this method allows you to listen for values\n * that an Observable emits, as well as for when it completes or errors. You can achieve this in two\n * of the following ways.\n *\n * The first way is creating an object that implements {@link Observer} interface. It should have methods\n * defined by that interface, but note that it should be just a regular JavaScript object, which you can create\n * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular, do\n * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also\n * that your object does not have to implement all methods. If you find yourself creating a method that doesn't\n * do anything, you can simply omit it. Note however, if the `error` method is not provided and an error happens,\n * it will be thrown asynchronously. Errors thrown asynchronously cannot be caught using `try`/`catch`. Instead,\n * use the {@link onUnhandledError} configuration option or use a runtime handler (like `window.onerror` or\n * `process.on('error)`) to be notified of unhandled errors. Because of this, it's recommended that you provide\n * an `error` method to avoid missing thrown errors.\n *\n * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods.\n * This means you can provide three functions as arguments to `subscribe`, where the first function is equivalent\n * of a `next` method, the second of an `error` method and the third of a `complete` method. Just as in case of an Observer,\n * if you do not need to listen for something, you can omit a function by passing `undefined` or `null`,\n * since `subscribe` recognizes these functions by where they were placed in function call. When it comes\n * to the `error` function, as with an Observer, if not provided, errors emitted by an Observable will be thrown asynchronously.\n *\n * You can, however, subscribe with no parameters at all. This may be the case where you're not interested in terminal events\n * and you also handled emissions internally by using operators (e.g. using `tap`).\n *\n * Whichever style of calling `subscribe` you use, in both cases it returns a Subscription object.\n * This object allows you to call `unsubscribe` on it, which in turn will stop the work that an Observable does and will clean\n * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback\n * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable.\n *\n * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously.\n * It is an Observable itself that decides when these functions will be called. For example {@link of}\n * by default emits all its values synchronously. Always check documentation for how given Observable\n * will behave when subscribed and if its default behavior can be modified with a `scheduler`.\n *\n * #### Examples\n *\n * Subscribe with an {@link guide/observer Observer}\n *\n * ```ts\n * import { of } from 'rxjs';\n *\n * const sumObserver = {\n * sum: 0,\n * next(value) {\n * console.log('Adding: ' + value);\n * this.sum = this.sum + value;\n * },\n * error() {\n * // We actually could just remove this method,\n * // since we do not really care about errors right now.\n * },\n * complete() {\n * console.log('Sum equals: ' + this.sum);\n * }\n * };\n *\n * of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes.\n * .subscribe(sumObserver);\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Subscribe with functions ({@link deprecations/subscribe-arguments deprecated})\n *\n * ```ts\n * import { of } from 'rxjs'\n *\n * let sum = 0;\n *\n * of(1, 2, 3).subscribe(\n * value => {\n * console.log('Adding: ' + value);\n * sum = sum + value;\n * },\n * undefined,\n * () => console.log('Sum equals: ' + sum)\n * );\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Cancel a subscription\n *\n * ```ts\n * import { interval } from 'rxjs';\n *\n * const subscription = interval(1000).subscribe({\n * next(num) {\n * console.log(num)\n * },\n * complete() {\n * // Will not be called, even when cancelling subscription.\n * console.log('completed!');\n * }\n * });\n *\n * setTimeout(() => {\n * subscription.unsubscribe();\n * console.log('unsubscribed!');\n * }, 2500);\n *\n * // Logs:\n * // 0 after 1s\n * // 1 after 2s\n * // 'unsubscribed!' after 2.5s\n * ```\n *\n * @param {Observer|Function} observerOrNext (optional) Either an observer with methods to be called,\n * or the first of three possible handlers, which is the handler for each value emitted from the subscribed\n * Observable.\n * @param {Function} error (optional) A handler for a terminal event resulting from an error. If no error handler is provided,\n * the error will be thrown asynchronously as unhandled.\n * @param {Function} complete (optional) A handler for a terminal event resulting from successful completion.\n * @return {Subscription} a subscription reference to the registered handlers\n * @method subscribe\n */\n subscribe(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((error: any) => void) | null,\n complete?: (() => void) | null\n ): Subscription {\n const subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);\n\n errorContext(() => {\n const { operator, source } = this;\n subscriber.add(\n operator\n ? // We're dealing with a subscription in the\n // operator chain to one of our lifted operators.\n operator.call(subscriber, source)\n : source\n ? // If `source` has a value, but `operator` does not, something that\n // had intimate knowledge of our API, like our `Subject`, must have\n // set it. We're going to just call `_subscribe` directly.\n this._subscribe(subscriber)\n : // In all other cases, we're likely wrapping a user-provided initializer\n // function, so we need to catch errors and handle them appropriately.\n this._trySubscribe(subscriber)\n );\n });\n\n return subscriber;\n }\n\n /** @internal */\n protected _trySubscribe(sink: Subscriber): TeardownLogic {\n try {\n return this._subscribe(sink);\n } catch (err) {\n // We don't need to return anything in this case,\n // because it's just going to try to `add()` to a subscription\n // above.\n sink.error(err);\n }\n }\n\n /**\n * Used as a NON-CANCELLABLE means of subscribing to an observable, for use with\n * APIs that expect promises, like `async/await`. You cannot unsubscribe from this.\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * #### Example\n *\n * ```ts\n * import { interval, take } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(4));\n *\n * async function getTotal() {\n * let total = 0;\n *\n * await source$.forEach(value => {\n * total += value;\n * console.log('observable -> ' + value);\n * });\n *\n * return total;\n * }\n *\n * getTotal().then(\n * total => console.log('Total: ' + total)\n * );\n *\n * // Expected:\n * // 'observable -> 0'\n * // 'observable -> 1'\n * // 'observable -> 2'\n * // 'observable -> 3'\n * // 'Total: 6'\n * ```\n *\n * @param next a handler for each value emitted by the observable\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n */\n forEach(next: (value: T) => void): Promise;\n\n /**\n * @param next a handler for each value emitted by the observable\n * @param promiseCtor a constructor function used to instantiate the Promise\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n * @deprecated Passing a Promise constructor will no longer be available\n * in upcoming versions of RxJS. This is because it adds weight to the library, for very\n * little benefit. If you need this functionality, it is recommended that you either\n * polyfill Promise, or you create an adapter to convert the returned native promise\n * to whatever promise implementation you wanted. Will be removed in v8.\n */\n forEach(next: (value: T) => void, promiseCtor: PromiseConstructorLike): Promise;\n\n forEach(next: (value: T) => void, promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n const subscriber = new SafeSubscriber({\n next: (value) => {\n try {\n next(value);\n } catch (err) {\n reject(err);\n subscriber.unsubscribe();\n }\n },\n error: reject,\n complete: resolve,\n });\n this.subscribe(subscriber);\n }) as Promise;\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): TeardownLogic {\n return this.source?.subscribe(subscriber);\n }\n\n /**\n * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable\n * @method Symbol.observable\n * @return {Observable} this instance of the observable\n */\n [Symbol_observable]() {\n return this;\n }\n\n /* tslint:disable:max-line-length */\n pipe(): Observable;\n pipe(op1: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction,\n ...operations: OperatorFunction[]\n ): Observable;\n /* tslint:enable:max-line-length */\n\n /**\n * Used to stitch together functional operators into a chain.\n * @method pipe\n * @return {Observable} the Observable result of all of the operators having\n * been called in the order they were passed in.\n *\n * ## Example\n *\n * ```ts\n * import { interval, filter, map, scan } from 'rxjs';\n *\n * interval(1000)\n * .pipe(\n * filter(x => x % 2 === 0),\n * map(x => x + x),\n * scan((acc, x) => acc + x)\n * )\n * .subscribe(x => console.log(x));\n * ```\n */\n pipe(...operations: OperatorFunction[]): Observable {\n return pipeFromArray(operations)(this);\n }\n\n /* tslint:disable:max-line-length */\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: typeof Promise): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: PromiseConstructorLike): Promise;\n /* tslint:enable:max-line-length */\n\n /**\n * Subscribe to this Observable and get a Promise resolving on\n * `complete` with the last emission (if any).\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * @method toPromise\n * @param [promiseCtor] a constructor function used to instantiate\n * the Promise\n * @return A Promise that resolves with the last value emit, or\n * rejects on an error. If there were no emissions, Promise\n * resolves with undefined.\n * @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise\n */\n toPromise(promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n let value: T | undefined;\n this.subscribe(\n (x: T) => (value = x),\n (err: any) => reject(err),\n () => resolve(value)\n );\n }) as Promise;\n }\n}\n\n/**\n * Decides between a passed promise constructor from consuming code,\n * A default configured promise constructor, and the native promise\n * constructor and returns it. If nothing can be found, it will throw\n * an error.\n * @param promiseCtor The optional promise constructor to passed by consuming code\n */\nfunction getPromiseCtor(promiseCtor: PromiseConstructorLike | undefined) {\n return promiseCtor ?? config.Promise ?? Promise;\n}\n\nfunction isObserver(value: any): value is Observer {\n return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);\n}\n\nfunction isSubscriber(value: any): value is Subscriber {\n return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));\n}\n", "import { Observable } from '../Observable';\nimport { Subscriber } from '../Subscriber';\nimport { OperatorFunction } from '../types';\nimport { isFunction } from './isFunction';\n\n/**\n * Used to determine if an object is an Observable with a lift function.\n */\nexport function hasLift(source: any): source is { lift: InstanceType['lift'] } {\n return isFunction(source?.lift);\n}\n\n/**\n * Creates an `OperatorFunction`. Used to define operators throughout the library in a concise way.\n * @param init The logic to connect the liftedSource to the subscriber at the moment of subscription.\n */\nexport function operate(\n init: (liftedSource: Observable, subscriber: Subscriber) => (() => void) | void\n): OperatorFunction {\n return (source: Observable) => {\n if (hasLift(source)) {\n return source.lift(function (this: Subscriber, liftedSource: Observable) {\n try {\n return init(liftedSource, this);\n } catch (err) {\n this.error(err);\n }\n });\n }\n throw new TypeError('Unable to lift unknown Observable type');\n };\n}\n", "import { Subscriber } from '../Subscriber';\n\n/**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional teardown logic here. This will only be called on teardown if the\n * subscriber itself is not already closed. This is called after all other teardown logic is executed.\n */\nexport function createOperatorSubscriber(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n onFinalize?: () => void\n): Subscriber {\n return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);\n}\n\n/**\n * A generic helper for allowing operators to be created with a Subscriber and\n * use closures to capture necessary state from the operator function itself.\n */\nexport class OperatorSubscriber extends Subscriber {\n /**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional finalization logic here. This will only be called on finalization if the\n * subscriber itself is not already closed. This is called after all other finalization logic is executed.\n * @param shouldUnsubscribe An optional check to see if an unsubscribe call should truly unsubscribe.\n * NOTE: This currently **ONLY** exists to support the strange behavior of {@link groupBy}, where unsubscription\n * to the resulting observable does not actually disconnect from the source if there are active subscriptions\n * to any grouped observable. (DO NOT EXPOSE OR USE EXTERNALLY!!!)\n */\n constructor(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n private onFinalize?: () => void,\n private shouldUnsubscribe?: () => boolean\n ) {\n // It's important - for performance reasons - that all of this class's\n // members are initialized and that they are always initialized in the same\n // order. This will ensure that all OperatorSubscriber instances have the\n // same hidden class in V8. This, in turn, will help keep the number of\n // hidden classes involved in property accesses within the base class as\n // low as possible. If the number of hidden classes involved exceeds four,\n // the property accesses will become megamorphic and performance penalties\n // will be incurred - i.e. inline caches won't be used.\n //\n // The reasons for ensuring all instances have the same hidden class are\n // further discussed in this blog post from Benedikt Meurer:\n // https://benediktmeurer.de/2018/03/23/impact-of-polymorphism-on-component-based-frameworks-like-react/\n super(destination);\n this._next = onNext\n ? function (this: OperatorSubscriber, value: T) {\n try {\n onNext(value);\n } catch (err) {\n destination.error(err);\n }\n }\n : super._next;\n this._error = onError\n ? function (this: OperatorSubscriber, err: any) {\n try {\n onError(err);\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._error;\n this._complete = onComplete\n ? function (this: OperatorSubscriber) {\n try {\n onComplete();\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._complete;\n }\n\n unsubscribe() {\n if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {\n const { closed } = this;\n super.unsubscribe();\n // Execute additional teardown if we have any and we didn't already do so.\n !closed && this.onFinalize?.();\n }\n }\n}\n", "import { Subscription } from '../Subscription';\n\ninterface AnimationFrameProvider {\n schedule(callback: FrameRequestCallback): Subscription;\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n delegate:\n | {\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n }\n | undefined;\n}\n\nexport const animationFrameProvider: AnimationFrameProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n schedule(callback) {\n let request = requestAnimationFrame;\n let cancel: typeof cancelAnimationFrame | undefined = cancelAnimationFrame;\n const { delegate } = animationFrameProvider;\n if (delegate) {\n request = delegate.requestAnimationFrame;\n cancel = delegate.cancelAnimationFrame;\n }\n const handle = request((timestamp) => {\n // Clear the cancel function. The request has been fulfilled, so\n // attempting to cancel the request upon unsubscription would be\n // pointless.\n cancel = undefined;\n callback(timestamp);\n });\n return new Subscription(() => cancel?.(handle));\n },\n requestAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.requestAnimationFrame || requestAnimationFrame)(...args);\n },\n cancelAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.cancelAnimationFrame || cancelAnimationFrame)(...args);\n },\n delegate: undefined,\n};\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface ObjectUnsubscribedError extends Error {}\n\nexport interface ObjectUnsubscribedErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (): ObjectUnsubscribedError;\n}\n\n/**\n * An error thrown when an action is invalid because the object has been\n * unsubscribed.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n *\n * @class ObjectUnsubscribedError\n */\nexport const ObjectUnsubscribedError: ObjectUnsubscribedErrorCtor = createErrorClass(\n (_super) =>\n function ObjectUnsubscribedErrorImpl(this: any) {\n _super(this);\n this.name = 'ObjectUnsubscribedError';\n this.message = 'object unsubscribed';\n }\n);\n", "import { Operator } from './Operator';\nimport { Observable } from './Observable';\nimport { Subscriber } from './Subscriber';\nimport { Subscription, EMPTY_SUBSCRIPTION } from './Subscription';\nimport { Observer, SubscriptionLike, TeardownLogic } from './types';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { arrRemove } from './util/arrRemove';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A Subject is a special type of Observable that allows values to be\n * multicasted to many Observers. Subjects are like EventEmitters.\n *\n * Every Subject is an Observable and an Observer. You can subscribe to a\n * Subject, and you can call next to feed values as well as error and complete.\n */\nexport class Subject extends Observable implements SubscriptionLike {\n closed = false;\n\n private currentObservers: Observer[] | null = null;\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n observers: Observer[] = [];\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n isStopped = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n hasError = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n thrownError: any = null;\n\n /**\n * Creates a \"subject\" by basically gluing an observer to an observable.\n *\n * @nocollapse\n * @deprecated Recommended you do not use. Will be removed at some point in the future. Plans for replacement still under discussion.\n */\n static create: (...args: any[]) => any = (destination: Observer, source: Observable): AnonymousSubject => {\n return new AnonymousSubject(destination, source);\n };\n\n constructor() {\n // NOTE: This must be here to obscure Observable's constructor.\n super();\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n lift(operator: Operator): Observable {\n const subject = new AnonymousSubject(this, this);\n subject.operator = operator as any;\n return subject as any;\n }\n\n /** @internal */\n protected _throwIfClosed() {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n }\n\n next(value: T) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n if (!this.currentObservers) {\n this.currentObservers = Array.from(this.observers);\n }\n for (const observer of this.currentObservers) {\n observer.next(value);\n }\n }\n });\n }\n\n error(err: any) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.hasError = this.isStopped = true;\n this.thrownError = err;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.error(err);\n }\n }\n });\n }\n\n complete() {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.isStopped = true;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.complete();\n }\n }\n });\n }\n\n unsubscribe() {\n this.isStopped = this.closed = true;\n this.observers = this.currentObservers = null!;\n }\n\n get observed() {\n return this.observers?.length > 0;\n }\n\n /** @internal */\n protected _trySubscribe(subscriber: Subscriber): TeardownLogic {\n this._throwIfClosed();\n return super._trySubscribe(subscriber);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._checkFinalizedStatuses(subscriber);\n return this._innerSubscribe(subscriber);\n }\n\n /** @internal */\n protected _innerSubscribe(subscriber: Subscriber) {\n const { hasError, isStopped, observers } = this;\n if (hasError || isStopped) {\n return EMPTY_SUBSCRIPTION;\n }\n this.currentObservers = null;\n observers.push(subscriber);\n return new Subscription(() => {\n this.currentObservers = null;\n arrRemove(observers, subscriber);\n });\n }\n\n /** @internal */\n protected _checkFinalizedStatuses(subscriber: Subscriber) {\n const { hasError, thrownError, isStopped } = this;\n if (hasError) {\n subscriber.error(thrownError);\n } else if (isStopped) {\n subscriber.complete();\n }\n }\n\n /**\n * Creates a new Observable with this Subject as the source. You can do this\n * to create custom Observer-side logic of the Subject and conceal it from\n * code that uses the Observable.\n * @return {Observable} Observable that the Subject casts to\n */\n asObservable(): Observable {\n const observable: any = new Observable();\n observable.source = this;\n return observable;\n }\n}\n\n/**\n * @class AnonymousSubject\n */\nexport class AnonymousSubject extends Subject {\n constructor(\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n public destination?: Observer,\n source?: Observable\n ) {\n super();\n this.source = source;\n }\n\n next(value: T) {\n this.destination?.next?.(value);\n }\n\n error(err: any) {\n this.destination?.error?.(err);\n }\n\n complete() {\n this.destination?.complete?.();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n return this.source?.subscribe(subscriber) ?? EMPTY_SUBSCRIPTION;\n }\n}\n", "import { Subject } from './Subject';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\n\n/**\n * A variant of Subject that requires an initial value and emits its current\n * value whenever it is subscribed to.\n *\n * @class BehaviorSubject\n */\nexport class BehaviorSubject extends Subject {\n constructor(private _value: T) {\n super();\n }\n\n get value(): T {\n return this.getValue();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n const subscription = super._subscribe(subscriber);\n !subscription.closed && subscriber.next(this._value);\n return subscription;\n }\n\n getValue(): T {\n const { hasError, thrownError, _value } = this;\n if (hasError) {\n throw thrownError;\n }\n this._throwIfClosed();\n return _value;\n }\n\n next(value: T): void {\n super.next((this._value = value));\n }\n}\n", "import { TimestampProvider } from '../types';\n\ninterface DateTimestampProvider extends TimestampProvider {\n delegate: TimestampProvider | undefined;\n}\n\nexport const dateTimestampProvider: DateTimestampProvider = {\n now() {\n // Use the variable rather than `this` so that the function can be called\n // without being bound to the provider.\n return (dateTimestampProvider.delegate || Date).now();\n },\n delegate: undefined,\n};\n", "import { Subject } from './Subject';\nimport { TimestampProvider } from './types';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * A variant of {@link Subject} that \"replays\" old values to new subscribers by emitting them when they first subscribe.\n *\n * `ReplaySubject` has an internal buffer that will store a specified number of values that it has observed. Like `Subject`,\n * `ReplaySubject` \"observes\" values by having them passed to its `next` method. When it observes a value, it will store that\n * value for a time determined by the configuration of the `ReplaySubject`, as passed to its constructor.\n *\n * When a new subscriber subscribes to the `ReplaySubject` instance, it will synchronously emit all values in its buffer in\n * a First-In-First-Out (FIFO) manner. The `ReplaySubject` will also complete, if it has observed completion; and it will\n * error if it has observed an error.\n *\n * There are two main configuration items to be concerned with:\n *\n * 1. `bufferSize` - This will determine how many items are stored in the buffer, defaults to infinite.\n * 2. `windowTime` - The amount of time to hold a value in the buffer before removing it from the buffer.\n *\n * Both configurations may exist simultaneously. So if you would like to buffer a maximum of 3 values, as long as the values\n * are less than 2 seconds old, you could do so with a `new ReplaySubject(3, 2000)`.\n *\n * ### Differences with BehaviorSubject\n *\n * `BehaviorSubject` is similar to `new ReplaySubject(1)`, with a couple of exceptions:\n *\n * 1. `BehaviorSubject` comes \"primed\" with a single value upon construction.\n * 2. `ReplaySubject` will replay values, even after observing an error, where `BehaviorSubject` will not.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n * @see {@link shareReplay}\n */\nexport class ReplaySubject extends Subject {\n private _buffer: (T | number)[] = [];\n private _infiniteTimeWindow = true;\n\n /**\n * @param bufferSize The size of the buffer to replay on subscription\n * @param windowTime The amount of time the buffered items will stay buffered\n * @param timestampProvider An object with a `now()` method that provides the current timestamp. This is used to\n * calculate the amount of time something has been buffered.\n */\n constructor(\n private _bufferSize = Infinity,\n private _windowTime = Infinity,\n private _timestampProvider: TimestampProvider = dateTimestampProvider\n ) {\n super();\n this._infiniteTimeWindow = _windowTime === Infinity;\n this._bufferSize = Math.max(1, _bufferSize);\n this._windowTime = Math.max(1, _windowTime);\n }\n\n next(value: T): void {\n const { isStopped, _buffer, _infiniteTimeWindow, _timestampProvider, _windowTime } = this;\n if (!isStopped) {\n _buffer.push(value);\n !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);\n }\n this._trimBuffer();\n super.next(value);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._trimBuffer();\n\n const subscription = this._innerSubscribe(subscriber);\n\n const { _infiniteTimeWindow, _buffer } = this;\n // We use a copy here, so reentrant code does not mutate our array while we're\n // emitting it to a new subscriber.\n const copy = _buffer.slice();\n for (let i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {\n subscriber.next(copy[i] as T);\n }\n\n this._checkFinalizedStatuses(subscriber);\n\n return subscription;\n }\n\n private _trimBuffer() {\n const { _bufferSize, _timestampProvider, _buffer, _infiniteTimeWindow } = this;\n // If we don't have an infinite buffer size, and we're over the length,\n // use splice to truncate the old buffer values off. Note that we have to\n // double the size for instances where we're not using an infinite time window\n // because we're storing the values and the timestamps in the same array.\n const adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;\n _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);\n\n // Now, if we're not in an infinite time window, remove all values where the time is\n // older than what is allowed.\n if (!_infiniteTimeWindow) {\n const now = _timestampProvider.now();\n let last = 0;\n // Search the array for the first timestamp that isn't expired and\n // truncate the buffer up to that point.\n for (let i = 1; i < _buffer.length && (_buffer[i] as number) <= now; i += 2) {\n last = i;\n }\n last && _buffer.splice(0, last + 1);\n }\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Subscription } from '../Subscription';\nimport { SchedulerAction } from '../types';\n\n/**\n * A unit of work to be executed in a `scheduler`. An action is typically\n * created from within a {@link SchedulerLike} and an RxJS user does not need to concern\n * themselves about creating and manipulating an Action.\n *\n * ```ts\n * class Action extends Subscription {\n * new (scheduler: Scheduler, work: (state?: T) => void);\n * schedule(state?: T, delay: number = 0): Subscription;\n * }\n * ```\n *\n * @class Action\n */\nexport class Action extends Subscription {\n constructor(scheduler: Scheduler, work: (this: SchedulerAction, state?: T) => void) {\n super();\n }\n /**\n * Schedules this action on its parent {@link SchedulerLike} for execution. May be passed\n * some context object, `state`. May happen at some point in the future,\n * according to the `delay` parameter, if specified.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler.\n * @return {void}\n */\n public schedule(state?: T, delay: number = 0): Subscription {\n return this;\n }\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetIntervalFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearIntervalFunction = (handle: TimerHandle) => void;\n\ninterface IntervalProvider {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n delegate:\n | {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n }\n | undefined;\n}\n\nexport const intervalProvider: IntervalProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setInterval(handler: () => void, timeout?: number, ...args) {\n const { delegate } = intervalProvider;\n if (delegate?.setInterval) {\n return delegate.setInterval(handler, timeout, ...args);\n }\n return setInterval(handler, timeout, ...args);\n },\n clearInterval(handle) {\n const { delegate } = intervalProvider;\n return (delegate?.clearInterval || clearInterval)(handle as any);\n },\n delegate: undefined,\n};\n", "import { Action } from './Action';\nimport { SchedulerAction } from '../types';\nimport { Subscription } from '../Subscription';\nimport { AsyncScheduler } from './AsyncScheduler';\nimport { intervalProvider } from './intervalProvider';\nimport { arrRemove } from '../util/arrRemove';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncAction extends Action {\n public id: TimerHandle | undefined;\n public state?: T;\n // @ts-ignore: Property has no initializer and is not definitely assigned\n public delay: number;\n protected pending: boolean = false;\n\n constructor(protected scheduler: AsyncScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (this.closed) {\n return this;\n }\n\n // Always replace the current state with the new state.\n this.state = state;\n\n const id = this.id;\n const scheduler = this.scheduler;\n\n //\n // Important implementation note:\n //\n // Actions only execute once by default, unless rescheduled from within the\n // scheduled callback. This allows us to implement single and repeat\n // actions via the same code path, without adding API surface area, as well\n // as mimic traditional recursion but across asynchronous boundaries.\n //\n // However, JS runtimes and timers distinguish between intervals achieved by\n // serial `setTimeout` calls vs. a single `setInterval` call. An interval of\n // serial `setTimeout` calls can be individually delayed, which delays\n // scheduling the next `setTimeout`, and so on. `setInterval` attempts to\n // guarantee the interval callback will be invoked more precisely to the\n // interval period, regardless of load.\n //\n // Therefore, we use `setInterval` to schedule single and repeat actions.\n // If the action reschedules itself with the same delay, the interval is not\n // canceled. If the action doesn't reschedule, or reschedules with a\n // different delay, the interval will be canceled after scheduled callback\n // execution.\n //\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, delay);\n }\n\n // Set the pending flag indicating that this action has been scheduled, or\n // has recursively rescheduled itself.\n this.pending = true;\n\n this.delay = delay;\n // If this action has already an async Id, don't request a new one.\n this.id = this.id ?? this.requestAsyncId(scheduler, this.id, delay);\n\n return this;\n }\n\n protected requestAsyncId(scheduler: AsyncScheduler, _id?: TimerHandle, delay: number = 0): TimerHandle {\n return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);\n }\n\n protected recycleAsyncId(_scheduler: AsyncScheduler, id?: TimerHandle, delay: number | null = 0): TimerHandle | undefined {\n // If this action is rescheduled with the same delay time, don't clear the interval id.\n if (delay != null && this.delay === delay && this.pending === false) {\n return id;\n }\n // Otherwise, if the action's delay time is different from the current delay,\n // or the action has been rescheduled before it's executed, clear the interval id\n if (id != null) {\n intervalProvider.clearInterval(id);\n }\n\n return undefined;\n }\n\n /**\n * Immediately executes this action and the `work` it contains.\n * @return {any}\n */\n public execute(state: T, delay: number): any {\n if (this.closed) {\n return new Error('executing a cancelled action');\n }\n\n this.pending = false;\n const error = this._execute(state, delay);\n if (error) {\n return error;\n } else if (this.pending === false && this.id != null) {\n // Dequeue if the action didn't reschedule itself. Don't call\n // unsubscribe(), because the action could reschedule later.\n // For example:\n // ```\n // scheduler.schedule(function doWork(counter) {\n // /* ... I'm a busy worker bee ... */\n // var originalAction = this;\n // /* wait 100ms before rescheduling the action */\n // setTimeout(function () {\n // originalAction.schedule(counter + 1);\n // }, 100);\n // }, 1000);\n // ```\n this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n }\n }\n\n protected _execute(state: T, _delay: number): any {\n let errored: boolean = false;\n let errorValue: any;\n try {\n this.work(state);\n } catch (e) {\n errored = true;\n // HACK: Since code elsewhere is relying on the \"truthiness\" of the\n // return here, we can't have it return \"\" or 0 or false.\n // TODO: Clean this up when we refactor schedulers mid-version-8 or so.\n errorValue = e ? e : new Error('Scheduled action threw falsy error');\n }\n if (errored) {\n this.unsubscribe();\n return errorValue;\n }\n }\n\n unsubscribe() {\n if (!this.closed) {\n const { id, scheduler } = this;\n const { actions } = scheduler;\n\n this.work = this.state = this.scheduler = null!;\n this.pending = false;\n\n arrRemove(actions, this);\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, null);\n }\n\n this.delay = null!;\n super.unsubscribe();\n }\n }\n}\n", "import { Action } from './scheduler/Action';\nimport { Subscription } from './Subscription';\nimport { SchedulerLike, SchedulerAction } from './types';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * An execution context and a data structure to order tasks and schedule their\n * execution. Provides a notion of (potentially virtual) time, through the\n * `now()` getter method.\n *\n * Each unit of work in a Scheduler is called an `Action`.\n *\n * ```ts\n * class Scheduler {\n * now(): number;\n * schedule(work, delay?, state?): Subscription;\n * }\n * ```\n *\n * @class Scheduler\n * @deprecated Scheduler is an internal implementation detail of RxJS, and\n * should not be used directly. Rather, create your own class and implement\n * {@link SchedulerLike}. Will be made internal in v8.\n */\nexport class Scheduler implements SchedulerLike {\n public static now: () => number = dateTimestampProvider.now;\n\n constructor(private schedulerActionCtor: typeof Action, now: () => number = Scheduler.now) {\n this.now = now;\n }\n\n /**\n * A getter method that returns a number representing the current time\n * (at the time this function was called) according to the scheduler's own\n * internal clock.\n * @return {number} A number that represents the current time. May or may not\n * have a relation to wall-clock time. May or may not refer to a time unit\n * (e.g. milliseconds).\n */\n public now: () => number;\n\n /**\n * Schedules a function, `work`, for execution. May happen at some point in\n * the future, according to the `delay` parameter, if specified. May be passed\n * some context object, `state`, which will be passed to the `work` function.\n *\n * The given arguments will be processed an stored as an Action object in a\n * queue of actions.\n *\n * @param {function(state: ?T): ?Subscription} work A function representing a\n * task, or some unit of work to be executed by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler itself.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @return {Subscription} A subscription in order to be able to unsubscribe\n * the scheduled work.\n */\n public schedule(work: (this: SchedulerAction, state?: T) => void, delay: number = 0, state?: T): Subscription {\n return new this.schedulerActionCtor(this, work).schedule(state, delay);\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Action } from './Action';\nimport { AsyncAction } from './AsyncAction';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncScheduler extends Scheduler {\n public actions: Array> = [];\n /**\n * A flag to indicate whether the Scheduler is currently executing a batch of\n * queued actions.\n * @type {boolean}\n * @internal\n */\n public _active: boolean = false;\n /**\n * An internal ID used to track the latest asynchronous task such as those\n * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and\n * others.\n * @type {any}\n * @internal\n */\n public _scheduled: TimerHandle | undefined;\n\n constructor(SchedulerAction: typeof Action, now: () => number = Scheduler.now) {\n super(SchedulerAction, now);\n }\n\n public flush(action: AsyncAction): void {\n const { actions } = this;\n\n if (this._active) {\n actions.push(action);\n return;\n }\n\n let error: any;\n this._active = true;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions.shift()!)); // exhaust the scheduler queue\n\n this._active = false;\n\n if (error) {\n while ((action = actions.shift()!)) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\n/**\n *\n * Async Scheduler\n *\n * Schedule task as if you used setTimeout(task, duration)\n *\n * `async` scheduler schedules tasks asynchronously, by putting them on the JavaScript\n * event loop queue. It is best used to delay tasks in time or to schedule tasks repeating\n * in intervals.\n *\n * If you just want to \"defer\" task, that is to perform it right after currently\n * executing synchronous code ends (commonly achieved by `setTimeout(deferredTask, 0)`),\n * better choice will be the {@link asapScheduler} scheduler.\n *\n * ## Examples\n * Use async scheduler to delay task\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * const task = () => console.log('it works!');\n *\n * asyncScheduler.schedule(task, 2000);\n *\n * // After 2 seconds logs:\n * // \"it works!\"\n * ```\n *\n * Use async scheduler to repeat task in intervals\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * function task(state) {\n * console.log(state);\n * this.schedule(state + 1, 1000); // `this` references currently executing Action,\n * // which we reschedule with new state and delay\n * }\n *\n * asyncScheduler.schedule(task, 3000, 0);\n *\n * // Logs:\n * // 0 after 3s\n * // 1 after 4s\n * // 2 after 5s\n * // 3 after 6s\n * ```\n */\n\nexport const asyncScheduler = new AsyncScheduler(AsyncAction);\n\n/**\n * @deprecated Renamed to {@link asyncScheduler}. Will be removed in v8.\n */\nexport const async = asyncScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { Subscription } from '../Subscription';\nimport { QueueScheduler } from './QueueScheduler';\nimport { SchedulerAction } from '../types';\nimport { TimerHandle } from './timerHandle';\n\nexport class QueueAction extends AsyncAction {\n constructor(protected scheduler: QueueScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (delay > 0) {\n return super.schedule(state, delay);\n }\n this.delay = delay;\n this.state = state;\n this.scheduler.flush(this);\n return this;\n }\n\n public execute(state: T, delay: number): any {\n return delay > 0 || this.closed ? super.execute(state, delay) : this._execute(state, delay);\n }\n\n protected requestAsyncId(scheduler: QueueScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n\n if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n\n // Otherwise flush the scheduler starting with this action.\n scheduler.flush(this);\n\n // HACK: In the past, this was returning `void`. However, `void` isn't a valid\n // `TimerHandle`, and generally the return value here isn't really used. So the\n // compromise is to return `0` which is both \"falsy\" and a valid `TimerHandle`,\n // as opposed to refactoring every other instanceo of `requestAsyncId`.\n return 0;\n }\n}\n", "import { AsyncScheduler } from './AsyncScheduler';\n\nexport class QueueScheduler extends AsyncScheduler {\n}\n", "import { QueueAction } from './QueueAction';\nimport { QueueScheduler } from './QueueScheduler';\n\n/**\n *\n * Queue Scheduler\n *\n * Put every next task on a queue, instead of executing it immediately\n *\n * `queue` scheduler, when used with delay, behaves the same as {@link asyncScheduler} scheduler.\n *\n * When used without delay, it schedules given task synchronously - executes it right when\n * it is scheduled. However when called recursively, that is when inside the scheduled task,\n * another task is scheduled with queue scheduler, instead of executing immediately as well,\n * that task will be put on a queue and wait for current one to finish.\n *\n * This means that when you execute task with `queue` scheduler, you are sure it will end\n * before any other task scheduled with that scheduler will start.\n *\n * ## Examples\n * Schedule recursively first, then do something\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(() => {\n * queueScheduler.schedule(() => console.log('second')); // will not happen now, but will be put on a queue\n *\n * console.log('first');\n * });\n *\n * // Logs:\n * // \"first\"\n * // \"second\"\n * ```\n *\n * Reschedule itself recursively\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(function(state) {\n * if (state !== 0) {\n * console.log('before', state);\n * this.schedule(state - 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * console.log('after', state);\n * }\n * }, 0, 3);\n *\n * // In scheduler that runs recursively, you would expect:\n * // \"before\", 3\n * // \"before\", 2\n * // \"before\", 1\n * // \"after\", 1\n * // \"after\", 2\n * // \"after\", 3\n *\n * // But with queue it logs:\n * // \"before\", 3\n * // \"after\", 3\n * // \"before\", 2\n * // \"after\", 2\n * // \"before\", 1\n * // \"after\", 1\n * ```\n */\n\nexport const queueScheduler = new QueueScheduler(QueueAction);\n\n/**\n * @deprecated Renamed to {@link queueScheduler}. Will be removed in v8.\n */\nexport const queue = queueScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\nimport { SchedulerAction } from '../types';\nimport { animationFrameProvider } from './animationFrameProvider';\nimport { TimerHandle } from './timerHandle';\n\nexport class AnimationFrameAction extends AsyncAction {\n constructor(protected scheduler: AnimationFrameScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n protected requestAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay is greater than 0, request as an async action.\n if (delay !== null && delay > 0) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n // Push the action to the end of the scheduler queue.\n scheduler.actions.push(this);\n // If an animation frame has already been requested, don't request another\n // one. If an animation frame hasn't been requested yet, request one. Return\n // the current animation frame request id.\n return scheduler._scheduled || (scheduler._scheduled = animationFrameProvider.requestAnimationFrame(() => scheduler.flush(undefined)));\n }\n\n protected recycleAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle | undefined {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n if (delay != null ? delay > 0 : this.delay > 0) {\n return super.recycleAsyncId(scheduler, id, delay);\n }\n // If the scheduler queue has no remaining actions with the same async id,\n // cancel the requested animation frame and set the scheduled flag to\n // undefined so the next AnimationFrameAction will request its own.\n const { actions } = scheduler;\n if (id != null && actions[actions.length - 1]?.id !== id) {\n animationFrameProvider.cancelAnimationFrame(id as number);\n scheduler._scheduled = undefined;\n }\n // Return undefined so the action knows to request a new async id if it's rescheduled.\n return undefined;\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\nexport class AnimationFrameScheduler extends AsyncScheduler {\n public flush(action?: AsyncAction): void {\n this._active = true;\n // The async id that effects a call to flush is stored in _scheduled.\n // Before executing an action, it's necessary to check the action's async\n // id to determine whether it's supposed to be executed in the current\n // flush.\n // Previous implementations of this method used a count to determine this,\n // but that was unsound, as actions that are unsubscribed - i.e. cancelled -\n // are removed from the actions array and that can shift actions that are\n // scheduled to be executed in a subsequent flush into positions at which\n // they are executed within the current flush.\n const flushId = this._scheduled;\n this._scheduled = undefined;\n\n const { actions } = this;\n let error: any;\n action = action || actions.shift()!;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions[0]) && action.id === flushId && actions.shift());\n\n this._active = false;\n\n if (error) {\n while ((action = actions[0]) && action.id === flushId && actions.shift()) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AnimationFrameAction } from './AnimationFrameAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\n\n/**\n *\n * Animation Frame Scheduler\n *\n * Perform task when `window.requestAnimationFrame` would fire\n *\n * When `animationFrame` scheduler is used with delay, it will fall back to {@link asyncScheduler} scheduler\n * behaviour.\n *\n * Without delay, `animationFrame` scheduler can be used to create smooth browser animations.\n * It makes sure scheduled task will happen just before next browser content repaint,\n * thus performing animations as efficiently as possible.\n *\n * ## Example\n * Schedule div height animation\n * ```ts\n * // html:
\n * import { animationFrameScheduler } from 'rxjs';\n *\n * const div = document.querySelector('div');\n *\n * animationFrameScheduler.schedule(function(height) {\n * div.style.height = height + \"px\";\n *\n * this.schedule(height + 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * }, 0, 0);\n *\n * // You will see a div element growing in height\n * ```\n */\n\nexport const animationFrameScheduler = new AnimationFrameScheduler(AnimationFrameAction);\n\n/**\n * @deprecated Renamed to {@link animationFrameScheduler}. Will be removed in v8.\n */\nexport const animationFrame = animationFrameScheduler;\n", "import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\n\n/**\n * A simple Observable that emits no items to the Observer and immediately\n * emits a complete notification.\n *\n * Just emits 'complete', and nothing else.\n *\n * ![](empty.png)\n *\n * A simple Observable that only emits the complete notification. It can be used\n * for composing with other Observables, such as in a {@link mergeMap}.\n *\n * ## Examples\n *\n * Log complete notification\n *\n * ```ts\n * import { EMPTY } from 'rxjs';\n *\n * EMPTY.subscribe({\n * next: () => console.log('Next'),\n * complete: () => console.log('Complete!')\n * });\n *\n * // Outputs\n * // Complete!\n * ```\n *\n * Emit the number 7, then complete\n *\n * ```ts\n * import { EMPTY, startWith } from 'rxjs';\n *\n * const result = EMPTY.pipe(startWith(7));\n * result.subscribe(x => console.log(x));\n *\n * // Outputs\n * // 7\n * ```\n *\n * Map and flatten only odd numbers to the sequence `'a'`, `'b'`, `'c'`\n *\n * ```ts\n * import { interval, mergeMap, of, EMPTY } from 'rxjs';\n *\n * const interval$ = interval(1000);\n * const result = interval$.pipe(\n * mergeMap(x => x % 2 === 1 ? of('a', 'b', 'c') : EMPTY),\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following to the console:\n * // x is equal to the count on the interval, e.g. (0, 1, 2, 3, ...)\n * // x will occur every 1000ms\n * // if x % 2 is equal to 1, print a, b, c (each on its own)\n * // if x % 2 is not equal to 1, nothing will be output\n * ```\n *\n * @see {@link Observable}\n * @see {@link NEVER}\n * @see {@link of}\n * @see {@link throwError}\n */\nexport const EMPTY = new Observable((subscriber) => subscriber.complete());\n\n/**\n * @param scheduler A {@link SchedulerLike} to use for scheduling\n * the emission of the complete notification.\n * @deprecated Replaced with the {@link EMPTY} constant or {@link scheduled} (e.g. `scheduled([], scheduler)`). Will be removed in v8.\n */\nexport function empty(scheduler?: SchedulerLike) {\n return scheduler ? emptyScheduled(scheduler) : EMPTY;\n}\n\nfunction emptyScheduled(scheduler: SchedulerLike) {\n return new Observable((subscriber) => scheduler.schedule(() => subscriber.complete()));\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport function isScheduler(value: any): value is SchedulerLike {\n return value && isFunction(value.schedule);\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\nimport { isScheduler } from './isScheduler';\n\nfunction last(arr: T[]): T | undefined {\n return arr[arr.length - 1];\n}\n\nexport function popResultSelector(args: any[]): ((...args: unknown[]) => unknown) | undefined {\n return isFunction(last(args)) ? args.pop() : undefined;\n}\n\nexport function popScheduler(args: any[]): SchedulerLike | undefined {\n return isScheduler(last(args)) ? args.pop() : undefined;\n}\n\nexport function popNumber(args: any[], defaultValue: number): number {\n return typeof last(args) === 'number' ? args.pop()! : defaultValue;\n}\n", "export const isArrayLike = ((x: any): x is ArrayLike => x && typeof x.length === 'number' && typeof x !== 'function');", "import { isFunction } from \"./isFunction\";\n\n/**\n * Tests to see if the object is \"thennable\".\n * @param value the object to test\n */\nexport function isPromise(value: any): value is PromiseLike {\n return isFunction(value?.then);\n}\n", "import { InteropObservable } from '../types';\nimport { observable as Symbol_observable } from '../symbol/observable';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being Observable (but not necessary an Rx Observable) */\nexport function isInteropObservable(input: any): input is InteropObservable {\n return isFunction(input[Symbol_observable]);\n}\n", "import { isFunction } from './isFunction';\n\nexport function isAsyncIterable(obj: any): obj is AsyncIterable {\n return Symbol.asyncIterator && isFunction(obj?.[Symbol.asyncIterator]);\n}\n", "/**\n * Creates the TypeError to throw if an invalid object is passed to `from` or `scheduled`.\n * @param input The object that was passed.\n */\nexport function createInvalidObservableTypeError(input: any) {\n // TODO: We should create error codes that can be looked up, so this can be less verbose.\n return new TypeError(\n `You provided ${\n input !== null && typeof input === 'object' ? 'an invalid object' : `'${input}'`\n } where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`\n );\n}\n", "export function getSymbolIterator(): symbol {\n if (typeof Symbol !== 'function' || !Symbol.iterator) {\n return '@@iterator' as any;\n }\n\n return Symbol.iterator;\n}\n\nexport const iterator = getSymbolIterator();\n", "import { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being an Iterable */\nexport function isIterable(input: any): input is Iterable {\n return isFunction(input?.[Symbol_iterator]);\n}\n", "import { ReadableStreamLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport async function* readableStreamLikeToAsyncGenerator(readableStream: ReadableStreamLike): AsyncGenerator {\n const reader = readableStream.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n return;\n }\n yield value!;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport function isReadableStreamLike(obj: any): obj is ReadableStreamLike {\n // We don't want to use instanceof checks because they would return\n // false for instances from another Realm, like an + +

Hola,

+

¡Esperamos que este correo electrónico te encuentre bien mientras terminamos el año! Para celebrar el Año Nuevo y mostrar nuestro agradecimiento por tu apoyo, tenemos algo especial para ti.

+

Pero primero, queremos tomarnos un momento para agradecer a todos los que han sido parte de nuestro viaje este año. Ya seas un desarrollador que nos ayudó a dar vida a nuestras ideas, uno de nuestros beta testers que nos dio una valiosa retroalimentación temprana, un seguidor que ofreció orientación y ánimo, o uno de nuestros increíbles patrocinadores que creyó en nosotros desde el principio—has hecho este año inolvidable. No podríamos haberlo hecho sin ti.

+

Aquí está el trato: +Entre el 24 de diciembre de 2024 y el 10 de enero de 2025, si compras dos Mini-KVM Toolkits en Crowd Supply, te enviaremos un crédito de $20 para nuestra tienda TxA.

+
+

También tenemos una sorpresa especial de vacaciones para ti. Tómate un momento para relajarte y disfrutar de nuestro acogedor video de Navidad—echa un vistazo a las hermosas luces y escucha melodías navideñas relajantes. ¡Esperamos que traiga un poco de alegría a tu día!

+

Esta es nuestra forma de agradecer y comenzar el 2025 con un pequeño regalo de nosotros para ti.

+

Al reflexionar sobre el año pasado, estamos realmente agradecidos por el increíble apoyo de nuestra comunidad. Tu creencia en nuestra visión ha sido la fuerza impulsora detrás de todo lo que hacemos. A nuestros desarrolladores que convirtieron ideas en realidad, a nuestros beta testers que ayudaron a refinar nuestro producto, y a nuestros primeros seguidores que proporcionaron retroalimentación, ánimo y orientación—gracias por ser parte de nuestro viaje. Y a nuestros patrocinadores, tu confianza significa el mundo para nosotros, y estamos infinitamente agradecidos por tu papel en hacer todo esto posible.

+

¿Tienes preguntas? Solo escríbenos—siempre estamos aquí para ayudarte. Al dar la bienvenida al 2025, te deseamos a ti y a tus seres queridos un Año Nuevo lleno de alegría, felicidad, éxito y emocionantes nuevas aventuras.

+

Gracias por ser parte de nuestra historia. ¡Estamos emocionados de crear aún más cosas increíbles juntos en el año que viene!

+

Saludos cordiales, +El Equipo de Openterface

+ + + + +
+
+ + + + +
+
+

50% OFF en TODOS los productos – ¡Solo este Black Friday! Apoya el Software Libre.

+ + +

banner

+

Hola, queridos miembros de la comunidad Openterface,

+

¡Tenemos noticias emocionantes! Hemos lanzado una nueva línea de ropa en Openterface. Nuestra colección incluye camisetas y sudaderas con capucha que reflejan el espíritu de nuestra comunidad. No son solo prendas de vestir; son una celebración de nuestros valores compartidos y de la esencia de Openterface.

+

¿Qué hace que estos diseños sean aún más especiales? Tanto la camiseta como la sudadera con capucha presentan con orgullo el dibujo técnico de nuestro Mini-KVM de Openterface, que luce increíblemente genial. Además, hemos destacado el texto "Developer Mode" de nuestro Mini-KVM en el diseño, ¡una idea que creemos absolutamente brillante! Al ponerte nuestra camiseta o sudadera, no solo te mantendrás abrigado este invierno, sino que también entrarás en modo súper desarrollador para todas tus sesiones de programación y hacking.

+

OP-Hoodie-Zip-Up

+

¿Te preguntas cómo lucen en la vida real? Mira cómo los ha estado usando nuestro equipo en acción. Desde mantenerse cómodos en modo desarrollador mientras programan (ver tweet), hasta una divertida sesión de fotos con David Groom de la revista MAKE: en la Feria Maker de Shenzhen (ver foto), hemos estado mostrando orgullosamente nuestra ropa. Incluso nos inspiramos en una charla del legendario Eric Migicovsky, famoso por Pebble (ver publicación), mientras hacíamos una demostración del Mini-KVM de Openterface y conectándonos con amigos del ámbito tecnológico (ver más, y aquí). Estas prendas no son solo ropa; son iniciadores de conversación y una forma de celebrar nuestra comunidad dondequiera que vayamos.

+

david-billy-wearing-hoodie
+¡David y yo no podemos tener suficiente de nuestras sudaderas con capucha, prácticamente vivimos en ellas!😉 Un enorme agradecimiento a David por compartir una foto tan increíble—¡verdaderamente apreciada!🎉

+

¿Y por qué no darle a este invierno gris un toque de color con nuestro vibrante cable de datos naranja? Es una manera perfecta de iluminar tu espacio de trabajo mientras aseguras una transferencia de datos rápida y confiable.

+

Para endulzar la oferta, estamos ofreciendo un 🔥 DESCUENTO ESPECIAL DEL 50% 🔥 en todos los artículos durante los próximos cinco días de este Black Friday 2024, comenzando desde el momento en que leas este mensaje hasta el 1 de diciembre. Es nuestra forma de agradecerte por ser parte de nuestro viaje.

+

Explora nuestra tienda aquí: https://shop.techxartisan.com. Echa un vistazo a nuestra nueva línea de ropa y consigue una prenda a mitad de precio—¡no te pierdas esta oferta por tiempo limitado!

+

Productos de Openterface

+

openterface merch

+

Accesorios de Openterface

+

openterface accessories

+

Gracias por acompañarnos en esta aventura. Tu apoyo significa el mundo para nosotros, y estamos agradecidos por cada conversación, idea e interacción que hemos tenido.

+

Saludos cálidos,

+

Billy Wang
+Gerente de Producto
+Equipo Openterface | TechxArtisan

+

P.D. ¿Tienes alguna idea o comentario? ¡Estamos atentos! Únete a la conversación en Reddit o Discord, o mándanos un correo electrónico a info@techxartisan.com ✉️.

+ +
+
+ +
+
+ + + + +
+
+

¡El envío está en camino! Cables adicionales añadidos al Toolkit. ¿Qué sigue?

+

¡Hola, comunidad de Openterface!

+

Estamos emocionados de anunciar que nuestros productos Openterface han sido oficialmente enviados. ¡Actualmente están en el puerto de Shenzhen, listos para embarcarse en un carguero con destino a los EE. UU.!

+

Cajas empaquetadas para Crowd Supply
+Empaque del producto

+

Estas son las novedades:

+

Preparativos para el envío: controles de calidad y empaque

+

Antes de empacar y enviar, probamos cada unidad minuciosamente para garantizar la más alta calidad, como mencionamos en una actualización anterior: ¡Desafío DIY, premios geniales y la producción se acerca a la meta!. Cada cable fue probado con nuestro Mini-KVM para garantizar la estabilidad en la transmisión de señales.

+

Ahora, hablemos de las noticias, tanto las malas como las buenas.

+

Malas noticias: Algunos cables naranjas no cumplieron con las expectativas en condiciones difíciles

+

Nuestro Mini-KVM transmite video, audio, control de mouse/teclado y datos USB a través de un solo cable tipo C. El rendimiento del cable es crucial para la estabilidad de los datos, especialmente en entornos desafiantes.

+

Para simular interferencias del mundo real, envolvimos el cable tipo C naranja alrededor del motor de un ventilador eléctrico mientras varios ordenadores funcionaban cerca. Esto creó un alto nivel de interferencias electromagnéticas (EMI) para evaluar la estabilidad en la transmisión de datos de nuestros cables.

+

Configuración de prueba
+Un método económico pero efectivo de prueba.

+

Mira nuestro tweet en video donde mostramos una de nuestras pruebas de rendimiento en comparación.

+

En estas condiciones, algunos cables naranjas mostraron pérdida de señal, lo que generó preocupaciones sobre su fiabilidad en entornos complejos como centros de datos o durante operaciones críticas de TI.

+

Para abordar este problema, Kevin Peng, nuestro director técnico, desarrolló un programa de prueba personalizado. Esta herramienta, que te permitirá probar la calidad de tus propios cables USB, estará disponible como código abierto pronto. Más actualizaciones están en camino.

+

Interfaz del programa de prueba
+Nuestro programa hace que probar cables sea muy fácil.

+

Aunque nuestros cables naranjas, con su textura suave similar al silicón y apariencia atractiva, son ideales para el uso diario como carga rápida y transmisiones de datos regulares, no son adecuados para trabajos intensos de transmisión en condiciones adversas como alta EMI.

+

Buenas noticias: ¡Tenemos una solución!

+

Hemos adquirido de inmediato cables USB 3.2 de nailon de alta calidad para incluirlos como un extra en la versión Toolkit, sin costo adicional para ti. Estos cables duraderos vienen en tres longitudes en color gris: 1 m (3,2 ft), 1,5 m (4,9 ft) y 2 m (6,5 ft). Recibirás uno de estos cables de forma aleatoria en tu versión del Toolkit, garantizando una conexión robusta y confiable para tu Mini-KVM.

+

Nuevos cables tipo C de nailon en gris

+

En futuras versiones del Mini-KVM Toolkit, el cable naranja para conectar al lado del host del Mini-KVM será reemplazado por el cable tipo C 3.2 de nailon, combinando funcionalidad, estabilidad y estilo.

+

Cables tipo C de nailon personalizados

+

Esperamos que aprecies esta decisión y continúes confiando en Openterface durante momentos críticos en la tecnología.

+

Cronograma de envío

+

¿Cuándo puedes esperar tu Mini-KVM?
+Si todo transcurre sin problemas, nuestros productos deberían llegar al almacén de Mouser de Crowd Supply para mediados de diciembre. Luego se enviarán de acuerdo con cada pedido.

+
    +
  • Para patrocinadores en EE. UU.: Existe una pequeña posibilidad de entrega antes de Navidad, pero no está garantizado, ya que todo tiende a ralentizarse a medida que se acercan las festividades.
  • +
  • Para patrocinadores fuera de EE. UU.: Los tiempos de entrega variarán según la región. Nuestra mejor estimación es mediados de enero.
  • +
+

¡Esperamos un viaje sin contratiempos para nuestros productos Openterface, sin mareos, náuseas ni jet lag! 😃

+

Camisetas y sudaderas geniales de Openterface

+

Estaremos en la Maker Faire de Shenzhen este fin de semana (16–17 de noviembre). Para prepararnos, diseñamos ropa para el equipo, incluyendo camisetas, sudaderas con cremallera y sudaderas tipo pullover.

+

Echa un vistazo y cuéntanos qué opinas:
+Camisetas y sudaderas de Openterface

+

Apoya nuestro desarrollo

+

Si deseas apoyar aún más nuestro desarrollo de código abierto, visita nuestra Tienda TechxArtisan. Puedes comprar cables, camisetas y sudaderas, mientras nos ayudas financieramente a seguir innovando. Cada compra cuenta y refuerza el espíritu de la comunidad de código abierto.

+

Próximos pasos: Actualizaciones de la aplicación host

+

Ahora que el envío está en marcha, nuestro enfoque se centrará en mejorar nuestras aplicaciones host. Estamos trabajando para verificarlas en varias tiendas de aplicaciones y garantizar una experiencia fluida al comenzar con Openterface.

+

Tiendas de aplicaciones

+

Próximos pasos: Participa en nuestro concurso DIY de USB

+

¿Por qué no participar en nuestro USB KVM DIY Challenge 2024 una vez que tengas tu Mini-KVM Openterface en tus manos? Es una gran oportunidad para contribuir al desarrollo de código abierto y ganar premios, incluidos dos Mini-KVM Openterface en ediciones especiales y más. Para más detalles, consulta la página del concurso de Crowd Supply.

+

Logo del concurso DIY USB KVM
+Openterface en acción

+

Para concluir

+

Gracias por ser una parte integral de nuestro viaje. Tu apoyo y tus comentarios nos mantienen avanzando. Si tienes preguntas o ideas, ¡nos encantaría saber de ti! Únete a la conversación en nuestra comunidad en Reddit y Discord.

+

Con gratitud,
+Billy Wang
+Gerente de Producto
+Equipo Openterface | TechxArtisan

+ +
+
+ +
+
+ + + + +
+
+

¡Desafío DIY, Premios Geniales y la Producción se Acerca a la Línea de Meta!

+

¡Hola, entusiastas de Openterface!

+

¡Tenemos noticias emocionantes para compartir! Desde un nuevo y emocionante desafío DIY hasta hitos de producción y actualizaciones de software geniales, las cosas están en pleno apogeo aquí en Openterface. ¡Toma una bebida, ponte cómodo y sumérgete en esta actualización con nosotros!

+

Desafío DIY USB KVM 2024: ¡Es Hora de Desatar tu Mago Tecnológico Interior!

+

¡Atención a todos los aficionados, creadores y soñadores! Estamos encantados de presentar el Desafío DIY USB KVM 2024, una colaboración con TechxArtisan, Make: Magazine, la Asociación de Hardware de Código Abierto (OSHWA) y Crowd Supply. Esta es tu oportunidad de crear una solución KVM personalizada—¡veamos qué magia puedes hacer con tu Openterface Mini-KVM!

+

logos de techxartisan, make magazine, oshwa, crowdsouce

+

Aquí está el resumen:

+

Misión: Crea tu propia solución KVM abierta usando el Openterface Mini-KVM, con tu toque personal para satisfacer tus necesidades específicas.

+

Categorías: Premios para los mejores participantes incluyen galardones tanto por habilidad técnica como por creatividad, ¡así que todos tienen una oportunidad!

+

Premios Geniales:

+
    +
  • Un Openterface Mini-KVM de edición limitada con una carcasa transparente y plateada.
  • +
  • El futurista Pi-Cast KVM de HackerGadgets.
  • +
  • El retro-inspirado GameShell de Clockwork.
  • +
+

Cronograma: El desafío comienza el 1 de octubre de 2024 y las presentaciones cierran el 28 de febrero de 2025.

+

Jueces: Expertos de TechxArtisan, Make: Magazine, OSHWA y Crowd Supply evaluarán tus proyectos.

+

Ya seas un mago tecnológico experimentado o estés dando tus primeros pasos en el mundo de la piratería de hardware, este concurso es tu patio de recreo. ¿Quién sabe? ¡Podrías crear la próxima gran cosa en tecnología!

+

Únete a la acción en la página oficial del concurso de Crowd Supply y chatea con nosotros en el canal de Discord del concurso. ¡Que comiencen los juegos de innovación!

+

Openterface Mini-KVM disponible en tres carcasas geniales: transparente, plateada y negra

+

Openterface Mini-KVM disponible en tres carcasas geniales: transparente, plateada y negra

+ +

Algunos de los premios geniales: Pi-Cast KVM de HackerGadgets y GameShell de Clockwork

+

Algunos de los premios geniales: Pi-Cast KVM de HackerGadgets y GameShell de Clockwork

+ +

Actualización de Producción: ¡Casi Listo!

+

Aquí tienes un vistazo al arduo trabajo que se realiza tras bambalinas—¡nuestro estudio ha estado zumbando como una colmena! Hasta ahora, hemos ensamblado 800 unidades del Openterface Mini-KVM.

+

unidades ensambladas

+

Imagen del progreso de producción

+

Nuestro control de calidad es de primera categoría. Cada unidad es revisada, revisada nuevamente y mimada por nuestro equipo para asegurarnos de que cuando llegue a tus manos, no solo sea buena, ¡sino excelente! Apuntamos a la clase de calidad que hace que otros dispositivos se pongan verdes de envidia.

+

Sabemos que esperar puede ser difícil, pero estamos comprometidos a ofrecer la mejor experiencia posible. ¡Gracias por tu paciencia mientras ponemos los toques finales!

+

Actualización de Software: ¡La Aplicación de Android Recibe una Gran Mejora!

+

Nuestra aplicación de Android acaba de recibir una gran actualización. ¡Ahora controlar tus dispositivos objetivo a través de tu teléfono o tableta nunca ha sido tan fácil o divertido!

+

Mira el video de demostración aquí: Video de Demostración de la Aplicación de Android

+

dedo tocando la aplicación de Android

+

Aquí está lo nuevo:

+
    +
  • Controles táctiles suaves y receptivos
  • +
  • Funcionalidad de arrastrar y soltar fácil
  • +
  • Toques precisos para una experiencia intuitiva
  • +
  • Una nueva barra de teclas de función para mayor comodidad
  • +
  • Próxima función: atajos de teclado personalizables
  • +
  • Compatible con tabletas y teléfonos Android
  • +
+

Esta aplicación hace que el Openterface Mini-KVM sea aún más útil para los profesionales de la tecnología en movimiento. ¡También hemos subido el último APK y el código fuente a nuestro repositorio de GitHub si quieres explorar más o contribuir!

+

Resumiendo

+

¡Uf! Fue una actualización bastante grande, ¿verdad?

+

Si tienes alguna idea, comentario o sueños salvajes de KVM, ¡queremos escucharlos! Envíanos un mensaje directo, manda una paloma mensajera 🕊️, o únete a uno de nuestros canales comunitarios. ¡Nos encanta conectarnos contigo!

+

Gracias nuevamente por tu paciencia y por ser la mejor comunidad tecnológica que existe. Tenemos más noticias y actualizaciones emocionantes próximamente—¡mantente atento!

+

Con gratitud,
+Billy Wang
+Gerente de Producto
+Equipo Openterface | TechxArtisan

+ +
+
+ + + +
+
+ + + + +
+
+

Superando Obstáculos: Actualización de Progreso y Nueva Línea de Tiempo

+

Hola a todos,

+

Espero que estén bien. Ha pasado un tiempo desde nuestra última actualización. Me gustaría decir que todo ha ido sobre ruedas para Openterface, pero hemos encontrado algunos obstáculos que retrasarán nuestro cronograma de entrega. Aunque no era lo que esperábamos, estamos enfrentando estos desafíos de frente y avanzando con paso firme, con muchas buenas noticias para compartir. Esta publicación es una lectura de aproximadamente 7 minutos, así que vamos a los detalles para que sepan exactamente en qué punto estamos y qué viene a continuación.

+

Regulación, Producción y Calidad

+

Antes de comenzar la producción, tuvimos que pasar las pruebas de calidad necesarias según las regulaciones, en particular la certificación CE. Dado que nuestra versión del kit incluye no solo el Mini-KVM sino también varios accesorios, cada parte necesitaba pasar las pruebas CE. Estas pruebas tomaron más tiempo del esperado (resulta que los cables pueden ser bastante exigentes), pero la buena noticia es que hemos pasado la certificación CE para nuestro Mini-KVM y todos sus componentes! A continuación, un resumen de las certificaciones para todas nuestras partes: Mini-KVM, cable HDMI, cable naranja Tipo-C, cable corto negro Tipo-C y cable VGA2HDMI. Con la certificación en mano, nuestro cronograma de producción ahora es seguro, y nuestros fabricantes están produciendo todas las partes mientras hablo.

+

240823-0 +Los requisitos de UKCA y CE son los mismos para nuestros productos electrónicos, con CE también cubriendo el cumplimiento de RoHS.

+

Hace dos semanas, visitamos a uno de nuestros fabricantes para capacitar a sus gerentes de línea en el control de calidad de los cables naranjas antes de que nos los enviaran. Ahora, TODOS los cables naranjas han sido producidos y están en un rincón de nuestro estudio. +240823-1 +Kevin y Shawn explicaban los métodos de prueba para asegurar que el cable naranja funcione correctamente con nuestro Mini-KVM de Openterface.

+

Haremos la misma tarea esta semana para capacitar al equipo de control de calidad en la línea de producción para las otras partes también. Aquí hay muestras de cables adicionales. +240823-2 +Marcados con orgullo con nuestro logo TechxArtisan, estas son muestras del cable HDMI, el cable corto Tipo-C y el cable VGA a HDMI.

+

Esperamos que las otras partes y los Mini-KVMs lleguen pronto de nuestros fabricantes, momento en el cual revisaremos la calidad de cada componente y los empaquetaremos adecuadamente en nuestro estudio antes del envío. En otras palabras, nuestro equipo se asegurará personalmente de la calidad antes de que llegue a sus manos.

+

Envío, Posibles Retrasos y Nueva ETA

+

La incertidumbre actual radica en el proceso de envío. Después de investigar varias compañías de envío, descubrimos que el envío tomará más tiempo ya que probablemente transferiremos los paquetes a través de un almacén antes de llegar al almacén de Crowd Supply. Todavía estamos debatiendo si elegir transporte marítimo o aéreo—por favor, tengan paciencia con nosotros unos días más mientras resolvemos los arreglos.

+

El despacho de aduanas es otro posible obstáculo que podría causar retrasos inesperados. Una vez que nuestros productos lleguen al almacén de Crowd Supply en los EE. UU., tomarán de una a dos semanas para enviarse globalmente según cada pedido. Para los patrocinadores fuera de los EE. UU., los paquetes individuales aún necesitarán pasar por el envío global y el despacho de aduanas en el país de destino.

+

Teniendo en cuenta la situación actual y añadiendo algo de tiempo de reserva, sigo siendo cautelosamente optimista de que completaremos la entrega antes de fin de año, con una nueva ETA a mediados de enero. Lamento sinceramente los inconvenientes y agradezco su apoyo y paciencia durante este cambio.

+

Hardware Finalizado V1.9

+

Como saben por nuestra anterior publicación en Reddit, decidimos actualizar nuestro hardware a V1.9, incluyendo un conjunto de pines de expansión hackeables. Esto no formaba parte del plan original para la campaña de crowdfunding, pero creemos que mejora significativamente el potencial de uso más amplio del hardware.

+

240823-3 +Los pines VCC, GND, Target D+, Target D-, Host D+ y Host D-—donde 'D' significa datos USB.

+

Una motivación clave fue permitir que el interruptor USB se pueda activar a nivel de software. ¿Por qué es esto importante? En nuestra hoja de ruta, apuntamos a soportar una solución KVM-over-IP, como VNC, en el futuro. La idea es combinar el control local de KVM con el protocolo VNC, permitiendo a los usuarios controlar remotamente la computadora objetivo a través de la computadora anfitriona. En un escenario remoto como este, la capacidad de los usuarios para cambiar el puerto USB es esencial, especialmente cuando se requieren transferencias de archivos entre el anfitrión y el objetivo.

+

Los pines de expansión también abren posibilidades para más, como la integración con iPadOS, control ATX, puenteo de red y bypass de audio. Aunque no entraré en todos los detalles aquí, les animo a unirse a nuestra comunidad de Openterface para discutir más con nosotros.

+

Esta actualización de hardware podría extender potencialmente nuestra solución Openterface para operar sobre IP e incluir características más avanzadas, manteniendo su fortaleza principal como una herramienta KVM-over-USB plug-and-play—perfecta para profesionales de TI navegando en entornos de TI inciertos, como centros de datos desconocidos.

+

Me complace informar que V1.9 ha pasado nuestras pruebas básicas internas y se finalizará como la versión oficial para todos nuestros patrocinadores. Sin embargo, esta actualización de hardware requerirá más pruebas, y cualquier desarrollo basado en estos pines de expansión será experimental y probablemente tenga errores. Aquí es donde pueden contribuir. Contamos con la comunidad de código abierto para ayudarnos a mejorar Openterface juntos.

+

Más Actualizaciones de Software

+

En el frente del software, estamos haciendo avances emocionantes. ¡Estamos sumergiéndonos en la aplicación Openterface para Android ahora! Echen un vistazo a este tweet para una demostración temprana que muestra el control KVM suave, el movimiento del ratón y los clics en acción. Más características están en camino, y como siempre, una vez que hayamos pulido un poco más el código, esta aplicación también será de código abierto en nuestro repositorio de GitHub Openterface_Android. +240823-4 +Usando solo nuestros dedos para controlar un ordenador Linux desde una tableta Android. ¡Genial!

+

Nuestra versión QT acaba de recibir una actualización útil—¡ahora pueden transferir texto del anfitrión al objetivo! Así que ahora esta característica es compatible con las aplicaciones anfitrionas en macOS, Windows y Linux.

+

Además, también estamos planeando agregar una función divertida—un movimiento automático del ratón para evitar que su computadora objetivo se duerma. ¿Deberíamos optar por la pelota de ping-pong rebotando por la pantalla o el clásico efecto de salvapantallas de DVD? Voten y comenten en el tweet 😃

+

Diseño de Paquete, Etiquetado y Manual

+

Hemos estado experimentando con varios prototipos y diseños de empaques para encontrar el equilibrio perfecto entre varios factores clave:

+
    +
  • Seleccionar materiales lo suficientemente resistentes para proteger el producto y sus partes durante el envío,
  • +
  • Crear etiquetas informativas que ayuden a los usuarios a entender el producto de un vistazo,
  • +
  • Asegurar el cumplimiento de las regulaciones,
  • +
  • Hacer que el empaque sea visualmente atractivo,
  • +
  • Y ser ecológicos minimizando el uso de plástico siempre que sea posible.
  • +
+

Además, hemos realizado varias mejoras en la antigua bolsa del kit, incluyendo:

+
    +
  • Mayor espacio de almacenamiento,
  • +
  • Una cremallera naranja elegante,
  • +
  • Materiales exteriores e interiores mejorados,
  • +
  • Y un bolsillo de malla súper elástico.
  • +
+

Elegimos este material porque logra el equilibrio ideal entre ser económico, agradable al tacto y lo suficientemente duradero para proteger los artículos en su interior. Estamos seguros de que les encantará.

+

240823-5

+

También estamos actualizando las etiquetas en la carcasa de aluminio para hacerlas lo más informativas y visualmente atractivas posible. Esperamos que estas mejoras mejoren su experiencia de usuario y faciliten el inicio con Openterface.

+

240823-6

+

Estamos finalizando el manual de Openterface, que estará disponible en inglés, alemán, francés, japonés y chino. Disculpen si no incluimos su idioma—¡nuestra caja no es del tamaño de la TARDIS (la cabina de policía del Doctor Who)! Pero haremos nuestro mejor esfuerzo para agregar más traducciones en nuestro sitio web.

+

240823-7

+

Revisión de Idiomas por la Comunidad

+

He estado usando ChatGPT para ayudar con las traducciones, pero a veces puede fallar con la redacción y el fraseo. Si no es mucha molestia, agradecería enormemente cualquier ayuda para revisar el contenido en otros idiomas, especialmente para los materiales impresos que estamos a punto de finalizar. He actualizado todo el contenido de texto para el empaque en nuestra carpeta de GitHub product-printed-materials, donde pueden revisar y enviar cualquier mejora. También pueden enviarme un mensaje directo. ¡Gracias!

+

Comentarios Finales y Progreso Continuo

+

Nos disculpamos nuevamente por los retrasos y el cambio en la ETA de nuestro producto. ¡Gracias por su paciencia y por seguir con nosotros—estamos trabajando duro para entregarlo lo antes posible! Les actualizaré inmediatamente una vez que nuestro envío esté arreglado. Más actualizaciones están en camino, así que por favor únanse a nuestra comunidad de Openterface y manténganse atentos.

+

Saludos,

+

Billy Wang
+Gerente de Producto
+Equipo Openterface | TechxArtisan

+ +
+
+ +
+
+ + + + +
+
+

De Desmontaje a Producción: ¡Estamos Avanzando!

+

Hola a todos,

+

Ha pasado un tiempo desde que terminó nuestra campaña de crowdfunding, y tenemos algunas actualizaciones fantásticas para compartir con ustedes. Estamos emocionados de sumergirnos de lleno en la fase de producción de nuestro Openterface Mini-KVM y mantenerlos informados sobre nuestro progreso.

+

Lo Mejor de Teardown 2024

+

Primero que nada, el Teardown 2024 del mes pasado, organizado por Crowd Supply en Portland, fue simplemente increíble. ¡Fue fantástico conocer en persona a tantos de nuestros amigos y patrocinadores tecnológicos en nuestra mesa de demostración! Sus amables palabras son un gran aliento y motivación para nosotros. Aquí hay algunas fotos del evento:

+

openterface-billy-at-teardown2024-2

+

¡Un gran agradecimiento a Electromaker por presentar nuestro producto durante el evento! Echen un vistazo a nuestra charla en este video:

+ + +

Producción en Pleno Movimiento

+

En este momento, estamos ocupados ordenando piezas y chips como el CH9329 y CH340 mientras nos preparamos para la producción. También estamos enviando nuestro Mini-KVM y cables para pruebas de certificación CE, RoHS y UKCA. Si todo va bien, comenzaremos la producción en las fábricas pronto. Nuestro equipo se asegura de que cada paso de la línea de producción funcione sin problemas para entregar un producto de primera calidad que sea tanto divertido como confiable. Aquí hay algunas fotos de los informes de prueba para RoHS y CE de nuestro cable naranja Type-C:

+

openterface-test-report-typec

+

Manténganse atentos, ya que tendremos más informes similares para nuestros Mini-KVMs y otros cables para asegurar que todos cumplan con los estándares de certificación requeridos.

+

Certificación OSHWA

+

Estamos encantados de anunciar que nuestro Openterface Mini-KVM ahora está oficialmente certificado por OSHWA como completamente de código abierto. 🥳 Pueden ver nuestra certificación aquí: OSHWA UID CN000015. Nos comprometemos a mantener tanto el software como el hardware de código abierto, permitiendo a los amantes de la tecnología explorar el potencial del USB KVM, contribuir a su desarrollo y construir una comunidad vibrante juntos.

+

openterface-oshw-cn000015

+

Actualización de Hardware V1.9

+

Acabamos de lanzar el hardware V1.9 con pines adicionales: VCC, GND, Target D+, Target D-, Host D+, Host D- para aún más diversión hackeable. Estos pines de datos están conectados al hub USB del Target y del Host. Ahora pueden hacer extensiones DIY para Openterface, como ATX, puente de red, bypass de audio y más. ¿Qué ideas creativas tienen para hackear nuestro Mini-KVM con estos pines? Únanse a nuestro Reddit o Discord, compartan sus pensamientos y diviértanse programando con nosotros.

+

openterface-v1-9-hackable

+

Ejecuta Openterface en Pi y Únete con uConsole

+

¡Hemos logrado ejecutar nuestra aplicación host QT en un entorno Pi! Lo que es aún más emocionante es cómo nuestro Mini-KVM puede unirse con el uConsole de Clockwork para convertirlo en una herramienta KVM portátil. Es súper útil para plug-and-play y solucionar rápidamente cualquier dispositivo sin cabeza cercano.

+ + +

Desarrollo y Toques Finales

+

Nuestro equipo de desarrollo, liderado por Kevin, está trabajando incansablemente para probar y refinar el código. Únanse a nuestro Discord de Techxartisan para pasar el rato con nuestro equipo de desarrollo y beta y mantenerse actualizados sobre nuestro progreso. Mientras tanto, Billy está manejando todo el papeleo y finalizando el diseño de nuestro producto, empaque y manual del producto.

+

Aquí tienen un adelanto de nuestras impresiones y etiquetas actualizadas para la caja de aluminio, mostradas en el tweet de Kazubu cuando Billy se lo compartió en Tokio, Japón:

+

openterface-kazubu-tweet-new-look

+

En Camino para Septiembre

+

Actualmente estamos en el buen camino y trabajando arduamente para poner nuestros Mini-KVMs en sus manos para finales de septiembre.

+

Nos encantaría su ayuda para correr la voz sobre nuestro Mini-KVM. Esperamos que pueda beneficiar a más entusiastas de la tecnología y hacer la vida tecnológica más fácil para cualquiera que maneje dispositivos sin cabeza.

+

¡Muchas gracias por todo su apoyo y entusiasmo! ¡No podríamos haberlo hecho sin ustedes!

+

Saludos,
+Billy Wang
+Equipo Openterface

+ +
+
+ +
+
+ + + + +
+
+

¡Encuéntrame en Portland este fin de semana y gana un Mini-KVM con mi desafío de videojuegos!

+

¡Hola a todos! ¡Tenemos noticias fantásticas para compartir!

+

¡Muchas gracias!

+

Primero que todo, no puedo agradecerles lo suficiente por su increíble apoyo. Nuestra campaña de crowdfunding ha superado absolutamente sus metas el 14 de junio, alcanzando $248k con el increíble apoyo de más de 1110 patrocinadores y Crowd Supply.

+

crowdfunding_end_240614

+

¡Este éxito nos ha dado la oportunidad de mejorar aún más el Mini-KVM! No podríamos haberlo logrado sin ustedes—¡en serio, gracias desde el fondo de nuestros corazones! 🧡 Estaremos trabajando a toda máquina en la producción para asegurar la entrega en sus manos pronto.

+

¡Apuesta divertida y mi vuelo a Portland!

+

Así que, aquí va una historia divertida: Como mencioné en esta publicación, Kevin y yo hicimos una apuesta. Si conseguíamos 100 nuevos patrocinadores en las últimas 36 horas, yo volaría a EE.UU. para Teardown 2024 de Crowd Supply. Bueno, ¿adivinen qué? No solo alcanzamos los 100—¡conseguimos 165 nuevos patrocinadores! Así que, estoy súper emocionado de anunciar que asistiré a Teardown 2024 en persona este viernes (21 de junio) y el fin de semana.

+

Mi mesa de demostración y transmisión en vivo

+

Teardown es el evento anual insignia de Crowd Supply centrado en todo lo relacionado con el hardware - con charlas, demostraciones, talleres y más.

+

Teardown 2024 Lloyd Center Mall Portland, Oregon 21-23 de junio de 2024

+

teardown-poster

+

Tendré una mesa de demostración en el evento Teardown: ¡Échale un vistazo aquí!

+

¿Hay alguna posibilidad de que estés cerca del área de Portland? ¡Sería fantástico conocerte en el evento! Compra el boleto para Teardown ahora y espero verte allí—¡ven y saluda!

+

Si no puedes asistir al evento, no te preocupes. Siempre puedes encontrarme en nuestro Discord y Subreddit durante la conferencia. Puedes enviarme mensajes o hablar conmigo en tiempo real, ya que podría estar transmitiendo en vivo los tres días mientras estoy en la mesa de demostración, así que únete a nuestra comunidad ahora y no te perderás de nada.

+

Desafío de videojuegos en Teardown

+

Ahora, para un poco de diversión: Estoy organizando una competencia de videojuegos en Teardown 2024. Estaré demostrando cómo funciona nuestro Mini-KVM con la computadora portátil, uConsole, que básicamente es una Raspberry Pi. Mira mi tweet en X aquí para ver cómo lo configuraré con el Mini-KVM.

+

play-game-uconsole

+

Estoy pensando en usar juegos como Pac-Man, The King of Fighters '97 y Tetris para el desafío de videojuegos. Y aquí está lo mejor—¡los ganadores pueden llevarse un Mini-KVM de mi parte allí mismo! Así que, ¡ven y juega conmigo para ganar!

+

Más por venir

+

Como siempre, estamos cocinando cosas emocionantes, y tendré un anuncio súper emocionante en Teardown. Así que mantente atento para más actualizaciones. ¡No puedo esperar para verte en Teardown 2024!

+

Saludos,
+Billy Wang +Equipo Openterface | TechxArtisan Studio

+ +
+
+ +
+
+ + + + +
+
+

Últimas Horas para Apoyar y Mini-KVMs en la Vanguardia Tecnológica

+

¡Hola a todos!

+

Queríamos compartir algunas actualizaciones emocionantes de nuestro equipo beta en nuestro canal de Discord! Nuestro Mini-KVM de Openterface está funcionando de maravilla en la vanguardia tecnológica, y tenemos unas imágenes fantásticas para mostrarles. ¡Échenles un vistazo y vean de qué se trata todo el alboroto!

+

cam-share

+

catenane-share

+

kashall-share

+

kazubu-share

+

nkahoang-share

+

🚨 ¡Última Oportunidad! 🚨

+

¡El tiempo se acaba! No pierdas la oportunidad de apoyarnos en Crowd Supply y conseguir el Mini-KVM de Openterface a un precio súper accesible de $79 - $99. La campaña termina el 13 de junio de 2024 a las 4:59 PM PDT, y los precios aumentarán después de la campaña a medida que el producto madure. ¡Así que actúa ahora y aprovecha esta oferta!

+

Próximo Evento Teardown 2024 y Una Apuesta Divertida

+

Como muchos de ustedes han visto en la página principal de Crowd Supply, el próximo evento Teardown 2024 está generando mucha emoción. ¡Estoy ansioso por asistir en persona y conocer a nuestros increíbles patrocinadores allí!

+

Aquí hay una apuesta divertida que tenemos en nuestro equipo:

+

Actualmente, tenemos alrededor de 950 patrocinadores para nuestro proyecto. Kevin Peng, nuestro director técnico, y yo tenemos una apuesta. Si logramos conseguir 100 patrocinadores más en las últimas horas, los gastos de mi viaje a Portland serán cubiertos por nuestro estudio. Si no, tendré que pagar yo mismo, lo que significa unos cuantos miles de dólares de mi propio bolsillo.

+

Así que, hago un llamado a todos nuestros suscriptores y nuevos amigos del Mini-KVM de Openterface para que nos ayuden a superar estas últimas horas. ¡Vamos a alcanzar más de 1050 patrocinadores y hacer que este viaje suceda!

+

Lo más importante, por favor ayuden a correr la voz sobre nuestra campaña que está llegando a su fin. Estamos comprometidos a construir este dispositivo útil y asegurarnos de que se entregue a ustedes con la mejor calidad.

+

Hemos puesto todo nuestro corazón en este proyecto durante los últimos 8 meses. Pueden ver todos nuestros esfuerzos en las actualizaciones a continuación y revisar nuestras publicaciones históricas en nuestro subreddit r/Openterface_miniKVM:

+ +

¡Así que apóyanos en estas últimas horas! ¡Saludos!

+

Billy Wang
+Gerente de Proyecto
+Equipo Openterface

+ +
+
+ +
+
+ + + + +
+
+

¡Actualizaciones Épicas y Última Semana – Última Oportunidad para Apoyar el Mini-KVM!

+

¡Hola a todos!

+

¡El tiempo vuela cuando te diviertes! Estamos en la última semana de nuestra campaña de crowdfunding para el Openterface Mini-KVM en Crowd Supply. ¡Vamos a sumergirnos en algunas actualizaciones emocionantes!

+

Actualizaciones de Software

+

¡Tenemos noticias fantásticas para ustedes: nuestro mini-KVM ahora es compatible con macOS, Windows y Linux! ¡Y lo mejor de todo, es de código abierto!

+

🎉 Echa un vistazo a los detalles para cada sistema a continuación:

+

Openterface_MacOS

+
    +
  • Repositorio en GitHub: Openterface_QT + openterface-macos-app-store
  • +
  • Video de Demostración Beta Temprana: Mini-KVM: Pruebas Básicas de Control KVM
  • +
  • Cómo Instalar:
      +
    • App Store: Encuentra nuestra aplicación host buscando "Openterface" o "Mini-KVM".
    • +
    • Compilar desde el Código Fuente: Instala CodeX y compila la aplicación macOS desde el código fuente.
    • +
    +
  • +
+

Openterface_QT

+ +

Otras Aplicaciones

+
    +
  • Como mencionamos en nuestra actualización anterior, hemos completado pruebas de concepto para Android y WebExtension. Aunque son prioridades más bajas, definitivamente están en la lista. También estamos explorando el soporte para ChromeOS y la posibilidad de hacer que el mini-KVM funcione en iPads con chips de la serie M. ¡Únete a la discusión en nuestra comunidad si tienes alguna idea!
  • +
+

¡Hardware de Código Abierto AHORA!

+

openterface-hardware-repo

+

¡Hemos dado una gran actualización a nuestro repositorio de hardware! Ahora está lleno de hojas de datos, modelos 3D, lista de materiales y esquemas – todo lo que necesitas para ponerte manos a la obra con nuestro gadget.

+

pcb-v1-6-both-sides

+

Consulta el repositorio de hardware: Openterface_Mini-KVM_Hardware

+

Ya seas un profesional experimentado o estés comenzando, queremos tus comentarios y sugerencias creativas. ¡Y para los creadores, por qué no intentar construir nuestro mini-KVM desde cero? Modifica nuestro código, hazlo tuyo y muéstranos lo que tienes!

+

Accesorios Aún Mejores

+

NUEVO Cable Tipo-C Naranja de 1.5m con Convertidor

+

type-c-cable-v2-plugged-old-mac

+

¿Recuerdas nuestro elegante cable Tipo-C naranja con la agradable sensación de silicona? ¡Hemos recibido las primeras muestras y se ven increíbles! Estos cables soportan carga rápida de 240W (Voltaje DC50V, Corriente 5A, Potencia 240W) y funcionan perfectamente con nuestros mini-KVMs. ¡Un gran agradecimiento a nuestro fabricante y a nuestros patrocinadores por hacer esto posible!

+

type-c-cable-v2-open-2

+

Bolsa de Herramientas Mejorada

+

Con el nuevo adaptador adjunto para nuestro cable Tipo-C de 1.5m y la actualización del cable VGA a HDMI de 1m de largo, creemos que es necesario aumentar el tamaño de nuestra bolsa de herramientas a 16 cm L x 10 cm A x 3.8 cm H, ¡proporcionando un poco más de espacio!

+

beta-round2-toolkit

+

Experimentos de Empaque

+

Estamos experimentando con diferentes diseños para nuestras cajas de empaque exterior: coloridas, grises, negras y más. Nos inclinamos por el diseño colorido, ¡pero queremos tus comentarios!

+

toolkit-boxes-showcase.jpg

+

Consulta los detalles de nuestro kit beta enviado a nuestro equipo beta aquí. ¡Déjanos saber lo que piensas! Solo un aviso, este diseño de empaque no es final. Es posible que aún necesitemos ajustar el tamaño de la caja y agregar detalles esenciales como la marca CE y otra información requerida.

+

¡Última Oportunidad para Apoyarnos!

+

Esta es la última semana de nuestra campaña. Apóyanos ahora para obtener el Openterface Mini-KVM a un precio amigable para tu bolsillo. Los precios después de la campaña probablemente aumentarán a medida que el producto madure. No te lo pierdas, ¡actúa ahora!

+

Abordando Preocupaciones

+

Entendemos el escepticismo debido a proyectos de crowdfunding fraudulentos. Aquí está por qué puedes confiar en nosotros:

+

Confía en Crowd Supply: Desde 2012, Crowd Supply ha sido una plataforma líder para productos electrónicos, protegiendo tus derechos como patrocinador, supervisando de cerca nuestro desarrollo y brindándonos asesoramiento profesional para asegurarse de que lo que creamos sea perfecto para ti.

+

Confía en Nuestro Equipo: Tenemos más de seis años de experiencia en IoT, IA y arte tecnológico. Conoce más sobre nosotros en nuestro sitio web TechxArtisan Studio.

+

Confía en Nuestra Cultura: Nos enfocamos en la excelencia técnica y la experiencia del usuario, abrazando la colaboración de código abierto. Únete a nuestra comunidad en Reddit r/Openterface_miniKVM y Discord TechxArtisan para ver nuestro viaje desde los primeros prototipos hasta la versión actual de preproducción.

+

Si aún no estás seguro, ¡está bien! Creemos que nuestro Openterface Mini-KVM te convencerá eventualmente.

+

Más por Venir

+

Siempre estamos cocinando algo emocionante, ¡así que por favor mantente atento! Si tienes alguna pregunta, únete a nosotros en nuestra comunidad o envíanos un correo electrónico: info@techxartisan.com. ¡Mantente al tanto y gracias por tu apoyo! 😄

+

Saludos,

+

Equipo Openterface | TechxArtisan Studio

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/blog/category/updates/page/2/index.html b/blog/category/updates/page/2/index.html new file mode 100644 index 0000000..7029f04 --- /dev/null +++ b/blog/category/updates/page/2/index.html @@ -0,0 +1,2275 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Updates - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+
+

Updates

+
+ +
+
+ + + + +
+
+

Charla Casual con David Groom de MAKE: Magazine: La Historia del Openterface Mini-KVM

+

¡Hola a todos!

+

Acabamos de terminar una increíble transmisión en vivo en YouTube con David Groom de MAKE: Magazine. Durante la sesión, profundizamos en la historia detrás de nuestro Openterface Mini-KVM, una innovadora solución de hardware de código abierto diseñada para controlar fácilmente dispositivos sin pantalla y computadoras de placa única como las Raspberry Pi, usando solo tu laptop. Puedes ver la transmisión en YouTube para más detalles o simplemente leer la historia a continuación.

+

youtube-with-david-2

+

El Nacimiento de una Idea

+

El viaje del Mini-KVM comenzó en la bulliciosa ciudad de Guangzhou, China, dentro de nuestro estudio TechxArtisan. Durante los últimos cinco años, hemos estado profundamente involucrados en numerosos proyectos de arte tecnológico para artistas locales e internacionales. Nuestro trabajo incluye la construcción de instalaciones de iluminación interactivas con detección de IA, brazos robóticos para actuaciones teatrales, mini autos autónomos que resuelven laberintos aleatorios e incluso un perro robot diseñado para explorar tierras inhóspitas como desiertos y bosques.

+

techxartisan_tech_art

+

Un Dolor de Cabeza Común

+

Un desafío recurrente en nuestro trabajo era gestionar una gran cantidad de computadoras sin pantalla como las Raspberry Pi y Jetson Nano, que carecían de monitores, teclados o conectividad de red. Esto a menudo nos llevaba a buscar frenéticamente monitores y teclados de repuesto para solucionar problemas y acceder a estos dispositivos en condiciones difíciles.

+

Soluciones Improvisadas

+

Inicialmente, recurrimos a soluciones improvisadas de monitores portátiles alimentados por baterías y mini-teclados inalámbricos con touchpads. Sin embargo, estos a menudo se olvidaban o se extraviaban, lo que nos llevó a la necesidad de una solución de hardware dedicada que pudiera aprovechar las laptops que siempre llevábamos para programar y configurar.

+

diy-monitor-keyboard +Estos dos gadgets deben llevarse para proyectos en el sitio.

+

El Primer Prototipo

+

Nuestro primer prototipo DIY fue una combinación simple pero efectiva de una tarjeta de captura para recuperar video del dispositivo sin pantalla y un simulador de teclado/ratón USB, todo integrado en un solo cable USB que se conectaba a nuestras laptops.

+

/early-mini-kvm-pcb +Una de las primeras versiones del PCB del mini-KVM

+

Mostramos nuestros geniales proyectos de arte tecnológico en la Maker Faire de Shenzhen en noviembre de 2023, con la intención de mostrar el prototipo del mini-KVM a David. Sin embargo, ¡nos emocionamos tanto con los regalos de David que lo olvidamos!

+

techxartisan_team_with_david_groom +¡Las pegatinas y postales de MAKE: Magazine son realmente geniales!

+

Retroalimentación y Desarrollo de la Comunidad

+

Después de compartir nuestro prototipo en Reddit, recibimos comentarios invaluables de la comunidad, que nos animaron a refinar y desarrollar nuestra solución en un producto pulido. Este apoyo comunitario fue fundamental para transformar nuestro dispositivo improvisado en una herramienta elegante y eficiente para homelabbers, administradores de sistemas, entusiastas de la tecnología y cualquier persona que trabaje con computadoras sin pantalla.

+

got_feedback_from_reddit +Recibimos una gran cantidad de comentarios de homelabbers

+

Superando Dudas

+

A pesar de las dudas iniciales sobre competir con soluciones similares existentes, la respuesta positiva y las sugerencias constructivas de las comunidades en línea ayudaron a aclarar los posibles casos de uso y aumentaron nuestra confianza. Sin este apoyo y la afirmación de nuestros esfuerzos, es posible que no hubiéramos seguido adelante con el proyecto.

+

Crowdfunding y Planes Futuros

+

La campaña de crowdfunding para el Openterface Mini-KVM en Crowd Supply está ganando mucho impulso, con aproximadamente dos semanas restantes. Esta campaña no se trata solo de desarrollar el Mini-KVM; es un testimonio del poder de la innovación impulsada por la comunidad. A continuación, nos sumergiremos en la gestión de la producción, mejoras de software y la entrega de este práctico gadget a nuestros increíbles patrocinadores, todo impulsado por nuestra asombrosa comunidad de código abierto.

+

techxartisan_openterface_discord +Los beta testers están compartiendo su uso del Openterface Mini-KVM en sus tareas tecnológicas diarias en el Discord de TechxArtisan

+

Abrazando la Visión de Código Abierto

+

El Openterface Mini-KVM es un testimonio de nuestra creatividad y perseverancia, y de la comunidad de código abierto que nos apoya. Lo que comenzó como una solución simple para nuestros desafíos personales ha evolucionado en una herramienta versátil y de código abierto que beneficiará a hackers, experimentadores y entusiastas de la tecnología en todo el mundo. Mantente atento a más actualizaciones a medida que el Mini-KVM se acerca a su lanzamiento oficial.

+ +
+
+ +
+
+ + + + +
+
+

Desde el Desarrollo hasta tus Manos: Detrás de Escena

+

¡Hola a todos!

+

Estamos de vuelta con otra actualización sobre nuestra campaña de crowdfunding, ¡y tenemos noticias emocionantes para compartir!

+

Alcanzando un Hito Importante

+

Primero que nada, estamos absolutamente encantados de anunciar que hemos alcanzado un asombroso 1100% de nuestra meta de financiamiento original! Un enorme agradecimiento a cada uno de ustedes. ¡Su apoyo ha sido simplemente fenomenal!

+

Planificación de Producción

+

¡Hemos estado súper ocupados en el frente de producción! Esta semana, visitamos la ciudad tecnológica de Shenzhen y tuvimos la oportunidad de recorrer una de las principales fábricas de tecnología. Estas personas trabajan con grandes nombres como Meta, ABB y Blaupunkt, y fue increíble ver sus avanzadas líneas de producción y maquinaria de control de calidad en acción. Me encantaría compartir más fotos, pero aquí hay una con un poco de mosaico digital por confidencialidad.

+

txa-team-visit-sz-factory-1

+

(Estábamos discutiendo QC con el gerente de la línea de producción.)

+

Nos sentimos muy positivos sobre esta asociación y su entusiasmo por apoyar a una startup tecnológica como la nuestra. Estamos comprometidos a garantizar que la fase de fabricación se maneje con la máxima dedicación y calidad para que podamos poner nuestro producto en sus manos pronto. Aquí hay una foto de nuestros miembros del equipo principal en la entrada de la fábrica:

+

txa-team-visit-sz-factory-2

+

(De izquierda a derecha: Shawn, Billy, Kevin, Vileer.)

+

Mejorando los Accesorios del Kit de Herramientas

+

Siempre estamos buscando formas de mejorar, y nuestro cable adicional VGA a HDMI ahora ha sido mejorado a 1 metro de largo con mayor calidad, como pueden ver en nuestra actualización de la Semana 2.

+

A continuación, también estamos investigando nuestro cable Type-C de 1.5 metros de largo para conectar a la computadora anfitriona. El Type-C se está volviendo cada vez más común en nuevas computadoras, laptops e incluso servidores. Después de probar muchos fabricantes, encontramos uno que podría producir este elegante cable Type-C naranja con una agradable sensación de silicona que cumple con nuestros estándares de calidad.

+

Actualmente, se requiere un adaptador adicional de Type-C a USB-A si nuestro Mini-KVM funciona con una computadora anfitriona que solo tiene puertos USB-A.

+

typec-cable-need-adapter| link

+

Sabemos que es un poco molesto, por lo que estamos trabajando estrechamente con nuestro fabricante para mejorarlo integrando un adaptador adjunto de Type-C a USB-A. Aquí hay un prototipo de cómo podría verse.

+

upgrade-for-typ-c-cable-with-adapter

+

Este elegante cable naranja, con una buena sensación de silicona y 1.5 metros de largo, presenta conectores Type-C en ambos extremos e incluye un adaptador para convertir un extremo de Type-C a USB-A. No existe en el mercado y requiere nuestra producción OEM personalizada. Estamos apuntando a incluir esta solución en nuestro paquete final de herramientas para los patrocinadores, pero todavía estoy haciendo cálculos y dándole un buen uso a mi calculadora. Para que esto suceda, necesitamos más apoyo para reducir el costo total de producción de nuestro kit de herramientas mini-KVM. Dado el número actual de crowdfunding y los costos de producción, hacer este cable Type-C personalizado se está volviendo más factible, ya que se está acercando al punto de equilibrio. ¡Mantendré a todos actualizados en la comunidad de Openterface sobre cualquier progreso!

+

Por su parte, si encuentran nuestro proyecto prometedor y creen que el Mini-KVM puede hacer su vida tecnológica más fácil, consideren apoyarnos y difundir la palabra a sus amigos. ¡Asegurémonos de poder mejorar el producto aún más mientras lo mantenemos asequible para todos en esta campaña de crowdfunding! ¡Muchas gracias!

+

Actualizaciones de Código Abierto y Colaboración Global

+

Por favor, tengan paciencia con nosotros durante esta etapa temprana de desarrollo, ya que todavía hay errores y cambios en nuestras aplicaciones anfitrionas. ¡Ahí es donde entra nuestro equipo beta! Ya hemos organizado dos rondas de pruebas beta. Echen un vistazo a nuestras publicaciones aquí para saber más:

+ +

Como pueden ver en las publicaciones anteriores, recibimos un número abrumador de aplicaciones fantásticas en las Rondas 1 y 2, y fue un verdadero desafío reducir los candidatos de un grupo tan brillante. ¡Tuvimos que tomar decisiones difíciles debido a los lugares limitados disponibles en esta fase exclusiva!

+

Nuestro equipo beta es una colaboración excepcional y verdaderamente global, con miembros de EE. UU. 🇺🇸, Reino Unido 🇬🇧, Japón 🇯🇵, Alemania 🇩🇪, República Checa 🇨🇿, Noruega 🇳🇴, Bélgica 🇧🇪, Francia 🇫🇷, Austria 🇦🇹, Australia 🇦🇺, Polonia 🇵🇱, Países Bajos 🇳🇱, China 🇨🇳, y más que se unirán pronto. Estos testers aportan experiencia en desarrollo, casos de uso reales para el Openterface Mini-KVM y una pasión por apoyar proyectos de código abierto como el nuestro. Nuestro equipo beta ya está utilizando este práctico dispositivo en sus tareas diarias, planteando problemas y sugiriendo características para que podamos mejorar aún más.

+

Aunque la mayoría de ustedes no tienen esta versión temprana del mini-KVM, aún pueden revisar nuestro código en GitHub y unirse a la conversación con nuestros equipos beta y de desarrollo en nuestra comunidad. ¡Háganos saber lo que encuentran para que podamos hacer este dispositivo increíble juntos!

+

Aquí están las actualizaciones sobre nuestro repositorio de código abierto en GitHub:

+
Openterface_MacOS
+

Nuestra aplicación anfitriona Openterface MacOS ya está oficialmente en vivo en la Apple App Store. Solo busquen 'Openterface' o 'mini-KVM' para encontrar nuestra página de la aplicación. Aún mejor, hemos subido el código completo a nuestro repositorio de GitHub: Openterface_MacOS para el Mini-KVM. Pueden ver esta demostración de operación básica en MacOS.

+

openterface-macos-app-store

+
Openterface_QT
+

QT es un marco versátil que nos encanta, así que construimos nuestro mini-KVM basado en él. Para la versión de Windows, echen un vistazo a nuestro video de demostración temprana aquí. Pueden ver en la demostración que funciona genial con baja latencia y una conexión estable. Pueden encontrar y descargar la aplicación beta temprana desde el repositorio de GitHub allí.

+

openterface-win-app-demo-1

+

openterface-win-app-demo-2

+

En cuanto a los sistemas basados en Linux, empaquetar para diferentes arquitecturas como ARM32, ARM64, ARMv7 y ARMv8, especialmente para el Raspberry Pi, es todo un desafío (con horas y horas de espera para el empaquetado), pero estamos trabajando en ello. Esperen una demostración de Linux pronto, con suerte dentro de una semana.

+

Ahora, hemos subido todo nuestro código fresco para Openterface_QT en GitHub. ¡Sumérjanse y echen un vistazo, pero prepárense, todavía está en las primeras etapas de desarrollo, por lo que aún hay algunos inevitables problemas y trabajo por hacer para mejorarlo. No nos importaría una mano. Si eres desarrollador, únete a nosotros. ¡Feliz codificación!

+
Openterface_Android y Openterface_WebExtension
+

Hemos completado la prueba de concepto tanto para Android como para WebExtension. Aunque estas son prioridades más bajas en comparación con macOS, Windows y Linux, tengan la seguridad de que están en proceso. Según nuestra investigación preliminar, el proyecto Openterface_Android también podría soportar ChromeOS. Si tienen alguna idea, ¡únanse a la discusión!

+
¿Incluso para iPadOS?
+

También estamos explorando la compatibilidad con los sistemas móviles de Apple, como iPadOS. Debido a los estrictos controles de Apple, es posible que estas plataformas no soporten conexiones por cable con dispositivos de terceros. Sin embargo, estamos investigando posibles soluciones, especialmente para iPads con chips de la serie M. Nuestro compañero beta Seb ya ha hecho algunos hallazgos interesantes y esto vale la pena explorar más a fondo, aunque aún no hay nada confirmado. Si tienen alguna idea o sugerencia, únanse a nuestra comunidad y discutamos.

+

seb-explore-minikvm-for-ipados

+
Openterface_Mini-KVM_Hardware
+

Comenzaremos a liberar los detalles del hardware de manera incremental durante las próximas dos o tres semanas. Además, para mantener un alto estándar de código abierto, planeamos adherirnos a los requisitos de certificación de la Asociación de Hardware de Código Abierto (OSHWA).

+

Mientras tanto, pueden aprender más sobre nuestro hardware aquí: hoja de datos y Cómo Funciona por ahora. Esta página explica nuestra integración de captura USB-HDMI, con el chip CH9329 para el control de teclado y ratón. Los entusiastas técnicos pueden encontrar los detalles sobre este chip particularmente interesantes. Además, nuestro mini-KVM utiliza el chip CH340, que soporta dos hubs USB integrados tanto para el lado anfitrión como para el lado objetivo. Nuestro mini-KVM es comparable a muchas tarjetas de captura de video actualmente en el mercado.

+
¡Por favor, tengan paciencia!
+

Estamos trabajando arduamente aquí y en el proceso de liberar tanto nuestro software como hardware como código abierto. ¡Las cosas buenas toman tiempo en cocinarse! Los mantendremos actualizados sobre este progreso dentro de nuestra comunidad. ¡Gracias por su paciencia y comprensión! ¡Manténganse atentos y saludos!

+

Abordando Preocupaciones

+

Entendemos que algunas personas pueden ser escépticas, dado el número de proyectos de crowdfunding fraudulentos que existen. Aquí hay algunos puntos que podrían tranquilizarlos sobre nuestro proyecto de crowdfunding:

+
    +
  1. +

    Confíen en la Plataforma Crowd Supply: Esta es una de las principales plataformas de crowdfunding para productos electrónicos en los EE. UU. desde 2012. El equipo de Crowd Supply ha estado supervisando de cerca nuestro progreso de desarrollo del Openterface Mini-KVM y ofreciéndonos asesoramiento profesional para asegurarse de que lo que hemos estado creando sea justo para ustedes. ¡Un agradecimiento al equipo de Crowd Supply también! Además, pueden leer más sobre cómo se protegen sus derechos como patrocinadores en la plataforma Crowd Supply, incluyendo para nuestro proyecto: Guía de Crowd Supply: ¿Cómo están protegidos los patrocinadores? + > "Cada proyecto que ha recibido fondos a través de Crowd Supply ha entregado a sus patrocinadores (o está en camino de hacerlo). No están financiando el sueño de alguien; en Crowd Supply, están comprando un producto real."

    +
  2. +
  3. +

    Confíen en la Experiencia de Nuestro Equipo: Somos un grupo de desarrolladores versátiles, creadores hábiles y gerentes de proyectos y producción experimentados, especialmente en trabajos que involucran una combinación de desarrollo de hardware y software. Somos un estudio creativo tecnológico innovador con más de seis años de experiencia en proyectos tecnológicos avanzados en campos como IoT, IA, computación en el borde y arte tecnológico. Para saber más sobre nosotros, visiten nuestro sitio web TechxArtisan Studio.

    +
  4. +
  5. +

    Confíen en la Cultura de Nuestro Equipo: Nuestro equipo está dedicado no solo a la excelencia técnica, sino también a la experiencia general del usuario. Esto incluye todo, desde la documentación del usuario y del desarrollador hasta la estética del diseño. Nos apasiona la tecnología de vanguardia y frecuentemente participamos en discusiones animadas sobre nuevos avances desde diversas perspectivas. Estos debates nos ayudan a definir qué hace que un producto electrónico sea sobresaliente y cómo darle vida a través de nuestro trabajo en equipo. Este enfoque colaborativo asegura que nuestros productos mejoren la experiencia del usuario y demuestren nuestra dedicación a la calidad y el detalle. Además, abrazamos una cultura de código abierto y colaboración comunitaria.

    +
  6. +
  7. +

    Observen lo que Hemos Logrado y Estamos Haciendo: Hemos estado trabajando muy duro en este proyecto. Pueden unirse a nuestra comunidad en Reddit y Discord, ver lo que hemos estado creando desde el prototipo muy temprano hasta la versión actual de preproducción, y mantenerse informados sobre nuestro progreso actualizado. ¡Nos encantaría verlos en nuestra comunidad y que interactúen con nosotros!

    +
  8. +
  9. +

    Chateen con Nosotros Directamente: Si tienen alguna pregunta o inquietud sobre nuestro Mini-KVM, no duden en enviarme un correo electrónico a info@techxartisan.com. Además, estamos planeando una transmisión en vivo, presentada por David Groom de MAKE: Magazine el miércoles 29. Estaremos discutiendo nuestro Openterface Mini-KVM y la historia detrás de él. Publicaré el video más tarde en nuestra página de la comunidad.

    +
  10. +
+

Finalmente, entendemos totalmente si aún tienen dudas. ¡Está bien! Si su trabajo implica gestionar dispositivos sin cabeza, estamos seguros de que nuestros esfuerzos en la creación del Openterface Mini-KVM eventualmente los convencerán. ¡Esperen y verán! 😄

+

¿Qué Sigue?

+

Manténganse atentos para la actualización de la próxima semana, donde profundizaremos en más detalles sobre las funciones de nuestra aplicación anfitriona, su hoja de ruta, el progreso de producción, casos de uso reales compartidos por nuestro equipo beta y más. Mientras tanto, visiten nuestro sitio web Openterface y Preguntas Frecuentes, consideren apoyarnos en Crowd Supply y ayuden a difundir la palabra.

+

¡Gracias por leer y ser parte de este viaje con nosotros! ¡Paz!

+

Mejores deseos,

+

Billy Wang, Gerente de Proyecto

+

Equipo Openterface | TechxArtisan Studio

+ +
+
+ +
+
+ + + + +
+
+

¡La Campaña de Crowdfunding para el Openterface Mini-KVM Está en Vivo AHORA!

+

¡Estamos emocionados de anunciar que la campaña de crowdfunding para el Openterface Mini-KVM ya está en vivo! Este dispositivo rico en funciones, de código abierto y dirigido por la comunidad, simplifica la forma en que controlas e interactúas con computadoras sin pantalla.

+

Ofrece una solución KVM sobre USB compacta, ligera y rápida que elimina la necesidad de teclados, ratones, monitores o configuraciones de red adicionales. Puedes controlar una computadora sin pantalla directamente desde tu laptop o computadora de escritorio, simplificando tu configuración y mejorando tu flujo de trabajo.

+

¡Únete a nosotros para hacer tu vida tecnológica más fácil!

+

openterface-mini-kvm-wired-up-mini-kvm-angled-view

+

Una Herramienta Versátil para Diversas Necesidades en Movimiento

+

El Openterface Mini-KVM es el compañero perfecto para una amplia gama de usuarios y escenarios:

+
    +
  • Profesionales de TI solucionando problemas en servidores
  • +
  • Técnicos que dan servicio a cajeros automáticos, VLTs y quioscos
  • +
  • Desarrolladores gestionando dispositivos de computación en el borde
  • +
  • Entusiastas de la tecnología experimentando con computadoras de placa única
  • +
  • Profesionales que requieren operaciones locales seguras en la segregación de redes, como aquellos que gestionan activos de criptomonedas
  • +
  • Cualquiera que necesite integrar frecuentemente flujos de trabajo entre computadoras personales y de trabajo.
  • +
+

use-case-pc-angled-view

+

Impulsado por la Retroalimentación de la Comunidad

+

Nuestra aventura en la creación del Openterface Mini-KVM fue inspirada por nuestros propios desafíos y un deseo colectivo de una herramienta más efectiva. Con una historia rica en nuestro estudio TechxArtisan desarrollando proyectos de arte tecnológico y soluciones IoT al aire libre, a menudo enfrentamos el dilema de gestionar dispositivos en condiciones de red poco fiables sin el lujo de llevar equipo adicional. Impulsados por conversaciones con colegas y retroalimentación de una comunidad que comparte nuestras dificultades, nos propusimos crear un dispositivo que aborde estas necesidades de frente, facilitando el control de dispositivos sin pantalla de manera confiable y sin esfuerzo.

+

La Diferencia del Openterface Mini-KVM

+

Podrías preguntarte, con varias soluciones KVM disponibles, ¿por qué elegir el Openterface Mini-KVM? Aquí te decimos por qué:

+
    +
  1. +

    Compacto y Eficiente: Diseñado tanto para profesionales de TI como para entusiastas, nuestra solución KVM sobre USB brilla en entornos con acceso limitado o nulo a la red, ofreciendo una herramienta portátil, independiente de la red y rápida para la solución de problemas.

    +
  2. +
  3. +

    Asequibilidad: Hemos trabajado arduamente para hacer que el Openterface Mini-KVM sea más rentable que sus contrapartes, asegurando que esté al alcance de todos los que necesiten esta herramienta esencial para proyectos de trabajo o pasatiempos.

    +
  4. +
  5. +

    Dirigido por la Comunidad y de Código Abierto: En su núcleo, el Openterface Mini-KVM se trata de fomentar una comunidad de innovación y colaboración. Al abrazar los valores de código abierto, invitamos a los usuarios a contribuir con características personalizadas y mejoras, enriqueciendo las capacidades y versatilidad de la herramienta.

    +
  6. +
+

Mantente Conectado e Involucrado

+

Para mantenerte al día con los últimos desarrollos, recibir soporte técnico y conectarte con otros usuarios, te invitamos a visitar nuestra página de Pre-Lanzamiento en Crowd Supply, explorar nuestro sitio web en openterface.com, y unirte a nuestras comunidades en subreddit r/Openterface_miniKVM y Discord TechxArtisan.

+

Emprendamos juntos este emocionante viaje y revolucionemos la forma en que controlas dispositivos sin pantalla. ¡Únete a nosotros para hacer realidad el Openterface Mini-KVM!

+

¡Saludos!

+ +
+
+ + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/blog/charla-casual-con-david-groom-de-make-magazine-la-historia-del-openterface-mini-kvm/index.html b/blog/charla-casual-con-david-groom-de-make-magazine-la-historia-del-openterface-mini-kvm/index.html new file mode 100644 index 0000000..c6fca82 --- /dev/null +++ b/blog/charla-casual-con-david-groom-de-make-magazine-la-historia-del-openterface-mini-kvm/index.html @@ -0,0 +1,2177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Charla Casual con David Groom de MAKE: Magazine: La Historia del Openterface Mini-KVM - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + + + + + + + + +
+
+
+
+ + + + + + +
+
+
+
+ + + + + + + + + + +

Charla Casual con David Groom de MAKE: Magazine: La Historia del Openterface Mini-KVM

+

¡Hola a todos!

+

Acabamos de terminar una increíble transmisión en vivo en YouTube con David Groom de MAKE: Magazine. Durante la sesión, profundizamos en la historia detrás de nuestro Openterface Mini-KVM, una innovadora solución de hardware de código abierto diseñada para controlar fácilmente dispositivos sin pantalla y computadoras de placa única como las Raspberry Pi, usando solo tu laptop. Puedes ver la transmisión en YouTube para más detalles o simplemente leer la historia a continuación.

+

youtube-with-david-2

+

El Nacimiento de una Idea

+

El viaje del Mini-KVM comenzó en la bulliciosa ciudad de Guangzhou, China, dentro de nuestro estudio TechxArtisan. Durante los últimos cinco años, hemos estado profundamente involucrados en numerosos proyectos de arte tecnológico para artistas locales e internacionales. Nuestro trabajo incluye la construcción de instalaciones de iluminación interactivas con detección de IA, brazos robóticos para actuaciones teatrales, mini autos autónomos que resuelven laberintos aleatorios e incluso un perro robot diseñado para explorar tierras inhóspitas como desiertos y bosques.

+

techxartisan_tech_art

+

Un Dolor de Cabeza Común

+

Un desafío recurrente en nuestro trabajo era gestionar una gran cantidad de computadoras sin pantalla como las Raspberry Pi y Jetson Nano, que carecían de monitores, teclados o conectividad de red. Esto a menudo nos llevaba a buscar frenéticamente monitores y teclados de repuesto para solucionar problemas y acceder a estos dispositivos en condiciones difíciles.

+

Soluciones Improvisadas

+

Inicialmente, recurrimos a soluciones improvisadas de monitores portátiles alimentados por baterías y mini-teclados inalámbricos con touchpads. Sin embargo, estos a menudo se olvidaban o se extraviaban, lo que nos llevó a la necesidad de una solución de hardware dedicada que pudiera aprovechar las laptops que siempre llevábamos para programar y configurar.

+

diy-monitor-keyboard +Estos dos gadgets deben llevarse para proyectos en el sitio.

+

El Primer Prototipo

+

Nuestro primer prototipo DIY fue una combinación simple pero efectiva de una tarjeta de captura para recuperar video del dispositivo sin pantalla y un simulador de teclado/ratón USB, todo integrado en un solo cable USB que se conectaba a nuestras laptops.

+

/early-mini-kvm-pcb +Una de las primeras versiones del PCB del mini-KVM

+

Mostramos nuestros geniales proyectos de arte tecnológico en la Maker Faire de Shenzhen en noviembre de 2023, con la intención de mostrar el prototipo del mini-KVM a David. Sin embargo, ¡nos emocionamos tanto con los regalos de David que lo olvidamos!

+

techxartisan_team_with_david_groom +¡Las pegatinas y postales de MAKE: Magazine son realmente geniales!

+

Retroalimentación y Desarrollo de la Comunidad

+

Después de compartir nuestro prototipo en Reddit, recibimos comentarios invaluables de la comunidad, que nos animaron a refinar y desarrollar nuestra solución en un producto pulido. Este apoyo comunitario fue fundamental para transformar nuestro dispositivo improvisado en una herramienta elegante y eficiente para homelabbers, administradores de sistemas, entusiastas de la tecnología y cualquier persona que trabaje con computadoras sin pantalla.

+

got_feedback_from_reddit +Recibimos una gran cantidad de comentarios de homelabbers

+

Superando Dudas

+

A pesar de las dudas iniciales sobre competir con soluciones similares existentes, la respuesta positiva y las sugerencias constructivas de las comunidades en línea ayudaron a aclarar los posibles casos de uso y aumentaron nuestra confianza. Sin este apoyo y la afirmación de nuestros esfuerzos, es posible que no hubiéramos seguido adelante con el proyecto.

+

Crowdfunding y Planes Futuros

+

La campaña de crowdfunding para el Openterface Mini-KVM en Crowd Supply está ganando mucho impulso, con aproximadamente dos semanas restantes. Esta campaña no se trata solo de desarrollar el Mini-KVM; es un testimonio del poder de la innovación impulsada por la comunidad. A continuación, nos sumergiremos en la gestión de la producción, mejoras de software y la entrega de este práctico gadget a nuestros increíbles patrocinadores, todo impulsado por nuestra asombrosa comunidad de código abierto.

+

techxartisan_openterface_discord +Los beta testers están compartiendo su uso del Openterface Mini-KVM en sus tareas tecnológicas diarias en el Discord de TechxArtisan

+

Abrazando la Visión de Código Abierto

+

El Openterface Mini-KVM es un testimonio de nuestra creatividad y perseverancia, y de la comunidad de código abierto que nos apoya. Lo que comenzó como una solución simple para nuestros desafíos personales ha evolucionado en una herramienta versátil y de código abierto que beneficiará a hackers, experimentadores y entusiastas de la tecnología en todo el mundo. Mantente atento a más actualizaciones a medida que el Mini-KVM se acerca a su lanzamiento oficial.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/blog/de-desmontaje-a-producci\303\263n-estamos-avanzando/index.html" "b/blog/de-desmontaje-a-producci\303\263n-estamos-avanzando/index.html" new file mode 100644 index 0000000..b8f047c --- /dev/null +++ "b/blog/de-desmontaje-a-producci\303\263n-estamos-avanzando/index.html" @@ -0,0 +1,2164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + De Desmontaje a Producción: ¡Estamos Avanzando! - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + + + + + + + + +
+
+
+
+ + + + + + +
+
+
+
+ + + + + + + + + + +

De Desmontaje a Producción: ¡Estamos Avanzando!

+

Hola a todos,

+

Ha pasado un tiempo desde que terminó nuestra campaña de crowdfunding, y tenemos algunas actualizaciones fantásticas para compartir con ustedes. Estamos emocionados de sumergirnos de lleno en la fase de producción de nuestro Openterface Mini-KVM y mantenerlos informados sobre nuestro progreso.

+

Lo Mejor de Teardown 2024

+

Primero que nada, el Teardown 2024 del mes pasado, organizado por Crowd Supply en Portland, fue simplemente increíble. ¡Fue fantástico conocer en persona a tantos de nuestros amigos y patrocinadores tecnológicos en nuestra mesa de demostración! Sus amables palabras son un gran aliento y motivación para nosotros. Aquí hay algunas fotos del evento:

+

openterface-billy-at-teardown2024-2

+

¡Un gran agradecimiento a Electromaker por presentar nuestro producto durante el evento! Echen un vistazo a nuestra charla en este video:

+ + +

Producción en Pleno Movimiento

+

En este momento, estamos ocupados ordenando piezas y chips como el CH9329 y CH340 mientras nos preparamos para la producción. También estamos enviando nuestro Mini-KVM y cables para pruebas de certificación CE, RoHS y UKCA. Si todo va bien, comenzaremos la producción en las fábricas pronto. Nuestro equipo se asegura de que cada paso de la línea de producción funcione sin problemas para entregar un producto de primera calidad que sea tanto divertido como confiable. Aquí hay algunas fotos de los informes de prueba para RoHS y CE de nuestro cable naranja Type-C:

+

openterface-test-report-typec

+

Manténganse atentos, ya que tendremos más informes similares para nuestros Mini-KVMs y otros cables para asegurar que todos cumplan con los estándares de certificación requeridos.

+

Certificación OSHWA

+

Estamos encantados de anunciar que nuestro Openterface Mini-KVM ahora está oficialmente certificado por OSHWA como completamente de código abierto. 🥳 Pueden ver nuestra certificación aquí: OSHWA UID CN000015. Nos comprometemos a mantener tanto el software como el hardware de código abierto, permitiendo a los amantes de la tecnología explorar el potencial del USB KVM, contribuir a su desarrollo y construir una comunidad vibrante juntos.

+

openterface-oshw-cn000015

+

Actualización de Hardware V1.9

+

Acabamos de lanzar el hardware V1.9 con pines adicionales: VCC, GND, Target D+, Target D-, Host D+, Host D- para aún más diversión hackeable. Estos pines de datos están conectados al hub USB del Target y del Host. Ahora pueden hacer extensiones DIY para Openterface, como ATX, puente de red, bypass de audio y más. ¿Qué ideas creativas tienen para hackear nuestro Mini-KVM con estos pines? Únanse a nuestro Reddit o Discord, compartan sus pensamientos y diviértanse programando con nosotros.

+

openterface-v1-9-hackable

+

Ejecuta Openterface en Pi y Únete con uConsole

+

¡Hemos logrado ejecutar nuestra aplicación host QT en un entorno Pi! Lo que es aún más emocionante es cómo nuestro Mini-KVM puede unirse con el uConsole de Clockwork para convertirlo en una herramienta KVM portátil. Es súper útil para plug-and-play y solucionar rápidamente cualquier dispositivo sin cabeza cercano.

+ + +

Desarrollo y Toques Finales

+

Nuestro equipo de desarrollo, liderado por Kevin, está trabajando incansablemente para probar y refinar el código. Únanse a nuestro Discord de Techxartisan para pasar el rato con nuestro equipo de desarrollo y beta y mantenerse actualizados sobre nuestro progreso. Mientras tanto, Billy está manejando todo el papeleo y finalizando el diseño de nuestro producto, empaque y manual del producto.

+

Aquí tienen un adelanto de nuestras impresiones y etiquetas actualizadas para la caja de aluminio, mostradas en el tweet de Kazubu cuando Billy se lo compartió en Tokio, Japón:

+

openterface-kazubu-tweet-new-look

+

En Camino para Septiembre

+

Actualmente estamos en el buen camino y trabajando arduamente para poner nuestros Mini-KVMs en sus manos para finales de septiembre.

+

Nos encantaría su ayuda para correr la voz sobre nuestro Mini-KVM. Esperamos que pueda beneficiar a más entusiastas de la tecnología y hacer la vida tecnológica más fácil para cualquiera que maneje dispositivos sin cabeza.

+

¡Muchas gracias por todo su apoyo y entusiasmo! ¡No podríamos haberlo hecho sin ustedes!

+

Saludos,
+Billy Wang
+Equipo Openterface

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/blog/desaf\303\255o-diy-premios-geniales-y-la-producci\303\263n-se-acerca-a-la-l\303\255nea-de-meta/index.html" "b/blog/desaf\303\255o-diy-premios-geniales-y-la-producci\303\263n-se-acerca-a-la-l\303\255nea-de-meta/index.html" new file mode 100644 index 0000000..e213b36 --- /dev/null +++ "b/blog/desaf\303\255o-diy-premios-geniales-y-la-producci\303\263n-se-acerca-a-la-l\303\255nea-de-meta/index.html" @@ -0,0 +1,2186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ¡Desafío DIY, Premios Geniales y la Producción se Acerca a la Línea de Meta! - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + + + + + + + + +
+
+
+
+ + + + + + +
+
+
+
+ + + + + + + + + + +

¡Desafío DIY, Premios Geniales y la Producción se Acerca a la Línea de Meta!

+

¡Hola, entusiastas de Openterface!

+

¡Tenemos noticias emocionantes para compartir! Desde un nuevo y emocionante desafío DIY hasta hitos de producción y actualizaciones de software geniales, las cosas están en pleno apogeo aquí en Openterface. ¡Toma una bebida, ponte cómodo y sumérgete en esta actualización con nosotros!

+

Desafío DIY USB KVM 2024: ¡Es Hora de Desatar tu Mago Tecnológico Interior!

+

¡Atención a todos los aficionados, creadores y soñadores! Estamos encantados de presentar el Desafío DIY USB KVM 2024, una colaboración con TechxArtisan, Make: Magazine, la Asociación de Hardware de Código Abierto (OSHWA) y Crowd Supply. Esta es tu oportunidad de crear una solución KVM personalizada—¡veamos qué magia puedes hacer con tu Openterface Mini-KVM!

+

logos de techxartisan, make magazine, oshwa, crowdsouce

+

Aquí está el resumen:

+

Misión: Crea tu propia solución KVM abierta usando el Openterface Mini-KVM, con tu toque personal para satisfacer tus necesidades específicas.

+

Categorías: Premios para los mejores participantes incluyen galardones tanto por habilidad técnica como por creatividad, ¡así que todos tienen una oportunidad!

+

Premios Geniales:

+
    +
  • Un Openterface Mini-KVM de edición limitada con una carcasa transparente y plateada.
  • +
  • El futurista Pi-Cast KVM de HackerGadgets.
  • +
  • El retro-inspirado GameShell de Clockwork.
  • +
+

Cronograma: El desafío comienza el 1 de octubre de 2024 y las presentaciones cierran el 28 de febrero de 2025.

+

Jueces: Expertos de TechxArtisan, Make: Magazine, OSHWA y Crowd Supply evaluarán tus proyectos.

+

Ya seas un mago tecnológico experimentado o estés dando tus primeros pasos en el mundo de la piratería de hardware, este concurso es tu patio de recreo. ¿Quién sabe? ¡Podrías crear la próxima gran cosa en tecnología!

+

Únete a la acción en la página oficial del concurso de Crowd Supply y chatea con nosotros en el canal de Discord del concurso. ¡Que comiencen los juegos de innovación!

+

Openterface Mini-KVM disponible en tres carcasas geniales: transparente, plateada y negra

+

Openterface Mini-KVM disponible en tres carcasas geniales: transparente, plateada y negra

+ +

Algunos de los premios geniales: Pi-Cast KVM de HackerGadgets y GameShell de Clockwork

+

Algunos de los premios geniales: Pi-Cast KVM de HackerGadgets y GameShell de Clockwork

+ +

Actualización de Producción: ¡Casi Listo!

+

Aquí tienes un vistazo al arduo trabajo que se realiza tras bambalinas—¡nuestro estudio ha estado zumbando como una colmena! Hasta ahora, hemos ensamblado 800 unidades del Openterface Mini-KVM.

+

unidades ensambladas

+

Imagen del progreso de producción

+

Nuestro control de calidad es de primera categoría. Cada unidad es revisada, revisada nuevamente y mimada por nuestro equipo para asegurarnos de que cuando llegue a tus manos, no solo sea buena, ¡sino excelente! Apuntamos a la clase de calidad que hace que otros dispositivos se pongan verdes de envidia.

+

Sabemos que esperar puede ser difícil, pero estamos comprometidos a ofrecer la mejor experiencia posible. ¡Gracias por tu paciencia mientras ponemos los toques finales!

+

Actualización de Software: ¡La Aplicación de Android Recibe una Gran Mejora!

+

Nuestra aplicación de Android acaba de recibir una gran actualización. ¡Ahora controlar tus dispositivos objetivo a través de tu teléfono o tableta nunca ha sido tan fácil o divertido!

+

Mira el video de demostración aquí: Video de Demostración de la Aplicación de Android

+

dedo tocando la aplicación de Android

+

Aquí está lo nuevo:

+
    +
  • Controles táctiles suaves y receptivos
  • +
  • Funcionalidad de arrastrar y soltar fácil
  • +
  • Toques precisos para una experiencia intuitiva
  • +
  • Una nueva barra de teclas de función para mayor comodidad
  • +
  • Próxima función: atajos de teclado personalizables
  • +
  • Compatible con tabletas y teléfonos Android
  • +
+

Esta aplicación hace que el Openterface Mini-KVM sea aún más útil para los profesionales de la tecnología en movimiento. ¡También hemos subido el último APK y el código fuente a nuestro repositorio de GitHub si quieres explorar más o contribuir!

+

Resumiendo

+

¡Uf! Fue una actualización bastante grande, ¿verdad?

+

Si tienes alguna idea, comentario o sueños salvajes de KVM, ¡queremos escucharlos! Envíanos un mensaje directo, manda una paloma mensajera 🕊️, o únete a uno de nuestros canales comunitarios. ¡Nos encanta conectarnos contigo!

+

Gracias nuevamente por tu paciencia y por ser la mejor comunidad tecnológica que existe. Tenemos más noticias y actualizaciones emocionantes próximamente—¡mantente atento!

+

Con gratitud,
+Billy Wang
+Gerente de Producto
+Equipo Openterface | TechxArtisan

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/blog/desde-el-desarrollo-hasta-tus-manos-detr\303\241s-de-escena/index.html" "b/blog/desde-el-desarrollo-hasta-tus-manos-detr\303\241s-de-escena/index.html" new file mode 100644 index 0000000..ecc3b66 --- /dev/null +++ "b/blog/desde-el-desarrollo-hasta-tus-manos-detr\303\241s-de-escena/index.html" @@ -0,0 +1,2200 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Desde el Desarrollo hasta tus Manos: Detrás de Escena - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + + + + + + + + +
+
+
+
+ + + + + + +
+
+
+
+ + + + + + + + + + +

Desde el Desarrollo hasta tus Manos: Detrás de Escena

+

¡Hola a todos!

+

Estamos de vuelta con otra actualización sobre nuestra campaña de crowdfunding, ¡y tenemos noticias emocionantes para compartir!

+

Alcanzando un Hito Importante

+

Primero que nada, estamos absolutamente encantados de anunciar que hemos alcanzado un asombroso 1100% de nuestra meta de financiamiento original! Un enorme agradecimiento a cada uno de ustedes. ¡Su apoyo ha sido simplemente fenomenal!

+

Planificación de Producción

+

¡Hemos estado súper ocupados en el frente de producción! Esta semana, visitamos la ciudad tecnológica de Shenzhen y tuvimos la oportunidad de recorrer una de las principales fábricas de tecnología. Estas personas trabajan con grandes nombres como Meta, ABB y Blaupunkt, y fue increíble ver sus avanzadas líneas de producción y maquinaria de control de calidad en acción. Me encantaría compartir más fotos, pero aquí hay una con un poco de mosaico digital por confidencialidad.

+

txa-team-visit-sz-factory-1

+

(Estábamos discutiendo QC con el gerente de la línea de producción.)

+

Nos sentimos muy positivos sobre esta asociación y su entusiasmo por apoyar a una startup tecnológica como la nuestra. Estamos comprometidos a garantizar que la fase de fabricación se maneje con la máxima dedicación y calidad para que podamos poner nuestro producto en sus manos pronto. Aquí hay una foto de nuestros miembros del equipo principal en la entrada de la fábrica:

+

txa-team-visit-sz-factory-2

+

(De izquierda a derecha: Shawn, Billy, Kevin, Vileer.)

+

Mejorando los Accesorios del Kit de Herramientas

+

Siempre estamos buscando formas de mejorar, y nuestro cable adicional VGA a HDMI ahora ha sido mejorado a 1 metro de largo con mayor calidad, como pueden ver en nuestra actualización de la Semana 2.

+

A continuación, también estamos investigando nuestro cable Type-C de 1.5 metros de largo para conectar a la computadora anfitriona. El Type-C se está volviendo cada vez más común en nuevas computadoras, laptops e incluso servidores. Después de probar muchos fabricantes, encontramos uno que podría producir este elegante cable Type-C naranja con una agradable sensación de silicona que cumple con nuestros estándares de calidad.

+

Actualmente, se requiere un adaptador adicional de Type-C a USB-A si nuestro Mini-KVM funciona con una computadora anfitriona que solo tiene puertos USB-A.

+

typec-cable-need-adapter| link

+

Sabemos que es un poco molesto, por lo que estamos trabajando estrechamente con nuestro fabricante para mejorarlo integrando un adaptador adjunto de Type-C a USB-A. Aquí hay un prototipo de cómo podría verse.

+

upgrade-for-typ-c-cable-with-adapter

+

Este elegante cable naranja, con una buena sensación de silicona y 1.5 metros de largo, presenta conectores Type-C en ambos extremos e incluye un adaptador para convertir un extremo de Type-C a USB-A. No existe en el mercado y requiere nuestra producción OEM personalizada. Estamos apuntando a incluir esta solución en nuestro paquete final de herramientas para los patrocinadores, pero todavía estoy haciendo cálculos y dándole un buen uso a mi calculadora. Para que esto suceda, necesitamos más apoyo para reducir el costo total de producción de nuestro kit de herramientas mini-KVM. Dado el número actual de crowdfunding y los costos de producción, hacer este cable Type-C personalizado se está volviendo más factible, ya que se está acercando al punto de equilibrio. ¡Mantendré a todos actualizados en la comunidad de Openterface sobre cualquier progreso!

+

Por su parte, si encuentran nuestro proyecto prometedor y creen que el Mini-KVM puede hacer su vida tecnológica más fácil, consideren apoyarnos y difundir la palabra a sus amigos. ¡Asegurémonos de poder mejorar el producto aún más mientras lo mantenemos asequible para todos en esta campaña de crowdfunding! ¡Muchas gracias!

+

Actualizaciones de Código Abierto y Colaboración Global

+

Por favor, tengan paciencia con nosotros durante esta etapa temprana de desarrollo, ya que todavía hay errores y cambios en nuestras aplicaciones anfitrionas. ¡Ahí es donde entra nuestro equipo beta! Ya hemos organizado dos rondas de pruebas beta. Echen un vistazo a nuestras publicaciones aquí para saber más:

+ +

Como pueden ver en las publicaciones anteriores, recibimos un número abrumador de aplicaciones fantásticas en las Rondas 1 y 2, y fue un verdadero desafío reducir los candidatos de un grupo tan brillante. ¡Tuvimos que tomar decisiones difíciles debido a los lugares limitados disponibles en esta fase exclusiva!

+

Nuestro equipo beta es una colaboración excepcional y verdaderamente global, con miembros de EE. UU. 🇺🇸, Reino Unido 🇬🇧, Japón 🇯🇵, Alemania 🇩🇪, República Checa 🇨🇿, Noruega 🇳🇴, Bélgica 🇧🇪, Francia 🇫🇷, Austria 🇦🇹, Australia 🇦🇺, Polonia 🇵🇱, Países Bajos 🇳🇱, China 🇨🇳, y más que se unirán pronto. Estos testers aportan experiencia en desarrollo, casos de uso reales para el Openterface Mini-KVM y una pasión por apoyar proyectos de código abierto como el nuestro. Nuestro equipo beta ya está utilizando este práctico dispositivo en sus tareas diarias, planteando problemas y sugiriendo características para que podamos mejorar aún más.

+

Aunque la mayoría de ustedes no tienen esta versión temprana del mini-KVM, aún pueden revisar nuestro código en GitHub y unirse a la conversación con nuestros equipos beta y de desarrollo en nuestra comunidad. ¡Háganos saber lo que encuentran para que podamos hacer este dispositivo increíble juntos!

+

Aquí están las actualizaciones sobre nuestro repositorio de código abierto en GitHub:

+

Openterface_MacOS

+

Nuestra aplicación anfitriona Openterface MacOS ya está oficialmente en vivo en la Apple App Store. Solo busquen 'Openterface' o 'mini-KVM' para encontrar nuestra página de la aplicación. Aún mejor, hemos subido el código completo a nuestro repositorio de GitHub: Openterface_MacOS para el Mini-KVM. Pueden ver esta demostración de operación básica en MacOS.

+

openterface-macos-app-store

+

Openterface_QT

+

QT es un marco versátil que nos encanta, así que construimos nuestro mini-KVM basado en él. Para la versión de Windows, echen un vistazo a nuestro video de demostración temprana aquí. Pueden ver en la demostración que funciona genial con baja latencia y una conexión estable. Pueden encontrar y descargar la aplicación beta temprana desde el repositorio de GitHub allí.

+

openterface-win-app-demo-1

+

openterface-win-app-demo-2

+

En cuanto a los sistemas basados en Linux, empaquetar para diferentes arquitecturas como ARM32, ARM64, ARMv7 y ARMv8, especialmente para el Raspberry Pi, es todo un desafío (con horas y horas de espera para el empaquetado), pero estamos trabajando en ello. Esperen una demostración de Linux pronto, con suerte dentro de una semana.

+

Ahora, hemos subido todo nuestro código fresco para Openterface_QT en GitHub. ¡Sumérjanse y echen un vistazo, pero prepárense, todavía está en las primeras etapas de desarrollo, por lo que aún hay algunos inevitables problemas y trabajo por hacer para mejorarlo. No nos importaría una mano. Si eres desarrollador, únete a nosotros. ¡Feliz codificación!

+

Openterface_Android y Openterface_WebExtension

+

Hemos completado la prueba de concepto tanto para Android como para WebExtension. Aunque estas son prioridades más bajas en comparación con macOS, Windows y Linux, tengan la seguridad de que están en proceso. Según nuestra investigación preliminar, el proyecto Openterface_Android también podría soportar ChromeOS. Si tienen alguna idea, ¡únanse a la discusión!

+

¿Incluso para iPadOS?

+

También estamos explorando la compatibilidad con los sistemas móviles de Apple, como iPadOS. Debido a los estrictos controles de Apple, es posible que estas plataformas no soporten conexiones por cable con dispositivos de terceros. Sin embargo, estamos investigando posibles soluciones, especialmente para iPads con chips de la serie M. Nuestro compañero beta Seb ya ha hecho algunos hallazgos interesantes y esto vale la pena explorar más a fondo, aunque aún no hay nada confirmado. Si tienen alguna idea o sugerencia, únanse a nuestra comunidad y discutamos.

+

seb-explore-minikvm-for-ipados

+

Openterface_Mini-KVM_Hardware

+

Comenzaremos a liberar los detalles del hardware de manera incremental durante las próximas dos o tres semanas. Además, para mantener un alto estándar de código abierto, planeamos adherirnos a los requisitos de certificación de la Asociación de Hardware de Código Abierto (OSHWA).

+

Mientras tanto, pueden aprender más sobre nuestro hardware aquí: hoja de datos y Cómo Funciona por ahora. Esta página explica nuestra integración de captura USB-HDMI, con el chip CH9329 para el control de teclado y ratón. Los entusiastas técnicos pueden encontrar los detalles sobre este chip particularmente interesantes. Además, nuestro mini-KVM utiliza el chip CH340, que soporta dos hubs USB integrados tanto para el lado anfitrión como para el lado objetivo. Nuestro mini-KVM es comparable a muchas tarjetas de captura de video actualmente en el mercado.

+

¡Por favor, tengan paciencia!

+

Estamos trabajando arduamente aquí y en el proceso de liberar tanto nuestro software como hardware como código abierto. ¡Las cosas buenas toman tiempo en cocinarse! Los mantendremos actualizados sobre este progreso dentro de nuestra comunidad. ¡Gracias por su paciencia y comprensión! ¡Manténganse atentos y saludos!

+

Abordando Preocupaciones

+

Entendemos que algunas personas pueden ser escépticas, dado el número de proyectos de crowdfunding fraudulentos que existen. Aquí hay algunos puntos que podrían tranquilizarlos sobre nuestro proyecto de crowdfunding:

+
    +
  1. +

    Confíen en la Plataforma Crowd Supply: Esta es una de las principales plataformas de crowdfunding para productos electrónicos en los EE. UU. desde 2012. El equipo de Crowd Supply ha estado supervisando de cerca nuestro progreso de desarrollo del Openterface Mini-KVM y ofreciéndonos asesoramiento profesional para asegurarse de que lo que hemos estado creando sea justo para ustedes. ¡Un agradecimiento al equipo de Crowd Supply también! Además, pueden leer más sobre cómo se protegen sus derechos como patrocinadores en la plataforma Crowd Supply, incluyendo para nuestro proyecto: Guía de Crowd Supply: ¿Cómo están protegidos los patrocinadores? + > "Cada proyecto que ha recibido fondos a través de Crowd Supply ha entregado a sus patrocinadores (o está en camino de hacerlo). No están financiando el sueño de alguien; en Crowd Supply, están comprando un producto real."

    +
  2. +
  3. +

    Confíen en la Experiencia de Nuestro Equipo: Somos un grupo de desarrolladores versátiles, creadores hábiles y gerentes de proyectos y producción experimentados, especialmente en trabajos que involucran una combinación de desarrollo de hardware y software. Somos un estudio creativo tecnológico innovador con más de seis años de experiencia en proyectos tecnológicos avanzados en campos como IoT, IA, computación en el borde y arte tecnológico. Para saber más sobre nosotros, visiten nuestro sitio web TechxArtisan Studio.

    +
  4. +
  5. +

    Confíen en la Cultura de Nuestro Equipo: Nuestro equipo está dedicado no solo a la excelencia técnica, sino también a la experiencia general del usuario. Esto incluye todo, desde la documentación del usuario y del desarrollador hasta la estética del diseño. Nos apasiona la tecnología de vanguardia y frecuentemente participamos en discusiones animadas sobre nuevos avances desde diversas perspectivas. Estos debates nos ayudan a definir qué hace que un producto electrónico sea sobresaliente y cómo darle vida a través de nuestro trabajo en equipo. Este enfoque colaborativo asegura que nuestros productos mejoren la experiencia del usuario y demuestren nuestra dedicación a la calidad y el detalle. Además, abrazamos una cultura de código abierto y colaboración comunitaria.

    +
  6. +
  7. +

    Observen lo que Hemos Logrado y Estamos Haciendo: Hemos estado trabajando muy duro en este proyecto. Pueden unirse a nuestra comunidad en Reddit y Discord, ver lo que hemos estado creando desde el prototipo muy temprano hasta la versión actual de preproducción, y mantenerse informados sobre nuestro progreso actualizado. ¡Nos encantaría verlos en nuestra comunidad y que interactúen con nosotros!

    +
  8. +
  9. +

    Chateen con Nosotros Directamente: Si tienen alguna pregunta o inquietud sobre nuestro Mini-KVM, no duden en enviarme un correo electrónico a info@techxartisan.com. Además, estamos planeando una transmisión en vivo, presentada por David Groom de MAKE: Magazine el miércoles 29. Estaremos discutiendo nuestro Openterface Mini-KVM y la historia detrás de él. Publicaré el video más tarde en nuestra página de la comunidad.

    +
  10. +
+

Finalmente, entendemos totalmente si aún tienen dudas. ¡Está bien! Si su trabajo implica gestionar dispositivos sin cabeza, estamos seguros de que nuestros esfuerzos en la creación del Openterface Mini-KVM eventualmente los convencerán. ¡Esperen y verán! 😄

+

¿Qué Sigue?

+

Manténganse atentos para la actualización de la próxima semana, donde profundizaremos en más detalles sobre las funciones de nuestra aplicación anfitriona, su hoja de ruta, el progreso de producción, casos de uso reales compartidos por nuestro equipo beta y más. Mientras tanto, visiten nuestro sitio web Openterface y Preguntas Frecuentes, consideren apoyarnos en Crowd Supply y ayuden a difundir la palabra.

+

¡Gracias por leer y ser parte de este viaje con nosotros! ¡Paz!

+

Mejores deseos,

+

Billy Wang, Gerente de Proyecto

+

Equipo Openterface | TechxArtisan Studio

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/blog/el-env\303\255o-est\303\241-en-camino-cables-adicionales-a\303\261adidos-al-toolkit-qu\303\251-sigue/index.html" "b/blog/el-env\303\255o-est\303\241-en-camino-cables-adicionales-a\303\261adidos-al-toolkit-qu\303\251-sigue/index.html" new file mode 100644 index 0000000..14cf22e --- /dev/null +++ "b/blog/el-env\303\255o-est\303\241-en-camino-cables-adicionales-a\303\261adidos-al-toolkit-qu\303\251-sigue/index.html" @@ -0,0 +1,2207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ¡El envío está en camino! Cables adicionales añadidos al Toolkit. ¿Qué sigue? - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + + + + + + + + +
+
+
+
+ + + + + + +
+
+
+
+ + + + + + + + + + +

¡El envío está en camino! Cables adicionales añadidos al Toolkit. ¿Qué sigue?

+

¡Hola, comunidad de Openterface!

+

Estamos emocionados de anunciar que nuestros productos Openterface han sido oficialmente enviados. ¡Actualmente están en el puerto de Shenzhen, listos para embarcarse en un carguero con destino a los EE. UU.!

+

Cajas empaquetadas para Crowd Supply
+Empaque del producto

+

Estas son las novedades:

+

Preparativos para el envío: controles de calidad y empaque

+

Antes de empacar y enviar, probamos cada unidad minuciosamente para garantizar la más alta calidad, como mencionamos en una actualización anterior: ¡Desafío DIY, premios geniales y la producción se acerca a la meta!. Cada cable fue probado con nuestro Mini-KVM para garantizar la estabilidad en la transmisión de señales.

+

Ahora, hablemos de las noticias, tanto las malas como las buenas.

+

Malas noticias: Algunos cables naranjas no cumplieron con las expectativas en condiciones difíciles

+

Nuestro Mini-KVM transmite video, audio, control de mouse/teclado y datos USB a través de un solo cable tipo C. El rendimiento del cable es crucial para la estabilidad de los datos, especialmente en entornos desafiantes.

+

Para simular interferencias del mundo real, envolvimos el cable tipo C naranja alrededor del motor de un ventilador eléctrico mientras varios ordenadores funcionaban cerca. Esto creó un alto nivel de interferencias electromagnéticas (EMI) para evaluar la estabilidad en la transmisión de datos de nuestros cables.

+

Configuración de prueba
+Un método económico pero efectivo de prueba.

+

Mira nuestro tweet en video donde mostramos una de nuestras pruebas de rendimiento en comparación.

+

En estas condiciones, algunos cables naranjas mostraron pérdida de señal, lo que generó preocupaciones sobre su fiabilidad en entornos complejos como centros de datos o durante operaciones críticas de TI.

+

Para abordar este problema, Kevin Peng, nuestro director técnico, desarrolló un programa de prueba personalizado. Esta herramienta, que te permitirá probar la calidad de tus propios cables USB, estará disponible como código abierto pronto. Más actualizaciones están en camino.

+

Interfaz del programa de prueba
+Nuestro programa hace que probar cables sea muy fácil.

+

Aunque nuestros cables naranjas, con su textura suave similar al silicón y apariencia atractiva, son ideales para el uso diario como carga rápida y transmisiones de datos regulares, no son adecuados para trabajos intensos de transmisión en condiciones adversas como alta EMI.

+

Buenas noticias: ¡Tenemos una solución!

+

Hemos adquirido de inmediato cables USB 3.2 de nailon de alta calidad para incluirlos como un extra en la versión Toolkit, sin costo adicional para ti. Estos cables duraderos vienen en tres longitudes en color gris: 1 m (3,2 ft), 1,5 m (4,9 ft) y 2 m (6,5 ft). Recibirás uno de estos cables de forma aleatoria en tu versión del Toolkit, garantizando una conexión robusta y confiable para tu Mini-KVM.

+

Nuevos cables tipo C de nailon en gris

+

En futuras versiones del Mini-KVM Toolkit, el cable naranja para conectar al lado del host del Mini-KVM será reemplazado por el cable tipo C 3.2 de nailon, combinando funcionalidad, estabilidad y estilo.

+

Cables tipo C de nailon personalizados

+

Esperamos que aprecies esta decisión y continúes confiando en Openterface durante momentos críticos en la tecnología.

+

Cronograma de envío

+

¿Cuándo puedes esperar tu Mini-KVM?
+Si todo transcurre sin problemas, nuestros productos deberían llegar al almacén de Mouser de Crowd Supply para mediados de diciembre. Luego se enviarán de acuerdo con cada pedido.

+
    +
  • Para patrocinadores en EE. UU.: Existe una pequeña posibilidad de entrega antes de Navidad, pero no está garantizado, ya que todo tiende a ralentizarse a medida que se acercan las festividades.
  • +
  • Para patrocinadores fuera de EE. UU.: Los tiempos de entrega variarán según la región. Nuestra mejor estimación es mediados de enero.
  • +
+

¡Esperamos un viaje sin contratiempos para nuestros productos Openterface, sin mareos, náuseas ni jet lag! 😃

+

Camisetas y sudaderas geniales de Openterface

+

Estaremos en la Maker Faire de Shenzhen este fin de semana (16–17 de noviembre). Para prepararnos, diseñamos ropa para el equipo, incluyendo camisetas, sudaderas con cremallera y sudaderas tipo pullover.

+

Echa un vistazo y cuéntanos qué opinas:
+Camisetas y sudaderas de Openterface

+

Apoya nuestro desarrollo

+

Si deseas apoyar aún más nuestro desarrollo de código abierto, visita nuestra Tienda TechxArtisan. Puedes comprar cables, camisetas y sudaderas, mientras nos ayudas financieramente a seguir innovando. Cada compra cuenta y refuerza el espíritu de la comunidad de código abierto.

+

Próximos pasos: Actualizaciones de la aplicación host

+

Ahora que el envío está en marcha, nuestro enfoque se centrará en mejorar nuestras aplicaciones host. Estamos trabajando para verificarlas en varias tiendas de aplicaciones y garantizar una experiencia fluida al comenzar con Openterface.

+

Tiendas de aplicaciones

+

Próximos pasos: Participa en nuestro concurso DIY de USB

+

¿Por qué no participar en nuestro USB KVM DIY Challenge 2024 una vez que tengas tu Mini-KVM Openterface en tus manos? Es una gran oportunidad para contribuir al desarrollo de código abierto y ganar premios, incluidos dos Mini-KVM Openterface en ediciones especiales y más. Para más detalles, consulta la página del concurso de Crowd Supply.

+

Logo del concurso DIY USB KVM
+Openterface en acción

+

Para concluir

+

Gracias por ser una parte integral de nuestro viaje. Tu apoyo y tus comentarios nos mantienen avanzando. Si tienes preguntas o ideas, ¡nos encantaría saber de ti! Únete a la conversación en nuestra comunidad en Reddit y Discord.

+

Con gratitud,
+Billy Wang
+Gerente de Producto
+Equipo Openterface | TechxArtisan

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/blog/encu\303\251ntrame-en-portland-este-fin-de-semana-y-gana-un-mini-kvm-con-mi-desaf\303\255o-de-videojuegos/index.html" "b/blog/encu\303\251ntrame-en-portland-este-fin-de-semana-y-gana-un-mini-kvm-con-mi-desaf\303\255o-de-videojuegos/index.html" new file mode 100644 index 0000000..4167a22 --- /dev/null +++ "b/blog/encu\303\251ntrame-en-portland-este-fin-de-semana-y-gana-un-mini-kvm-con-mi-desaf\303\255o-de-videojuegos/index.html" @@ -0,0 +1,2136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ¡Encuéntrame en Portland este fin de semana y gana un Mini-KVM con mi desafío de videojuegos! - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + + + + + + + + +
+
+
+
+ + + + + + +
+
+
+
+ + + + + + + + + + +

¡Encuéntrame en Portland este fin de semana y gana un Mini-KVM con mi desafío de videojuegos!

+

¡Hola a todos! ¡Tenemos noticias fantásticas para compartir!

+

¡Muchas gracias!

+

Primero que todo, no puedo agradecerles lo suficiente por su increíble apoyo. Nuestra campaña de crowdfunding ha superado absolutamente sus metas el 14 de junio, alcanzando $248k con el increíble apoyo de más de 1110 patrocinadores y Crowd Supply.

+

crowdfunding_end_240614

+

¡Este éxito nos ha dado la oportunidad de mejorar aún más el Mini-KVM! No podríamos haberlo logrado sin ustedes—¡en serio, gracias desde el fondo de nuestros corazones! 🧡 Estaremos trabajando a toda máquina en la producción para asegurar la entrega en sus manos pronto.

+

¡Apuesta divertida y mi vuelo a Portland!

+

Así que, aquí va una historia divertida: Como mencioné en esta publicación, Kevin y yo hicimos una apuesta. Si conseguíamos 100 nuevos patrocinadores en las últimas 36 horas, yo volaría a EE.UU. para Teardown 2024 de Crowd Supply. Bueno, ¿adivinen qué? No solo alcanzamos los 100—¡conseguimos 165 nuevos patrocinadores! Así que, estoy súper emocionado de anunciar que asistiré a Teardown 2024 en persona este viernes (21 de junio) y el fin de semana.

+

Mi mesa de demostración y transmisión en vivo

+

Teardown es el evento anual insignia de Crowd Supply centrado en todo lo relacionado con el hardware - con charlas, demostraciones, talleres y más.

+

Teardown 2024 Lloyd Center Mall Portland, Oregon 21-23 de junio de 2024

+

teardown-poster

+

Tendré una mesa de demostración en el evento Teardown: ¡Échale un vistazo aquí!

+

¿Hay alguna posibilidad de que estés cerca del área de Portland? ¡Sería fantástico conocerte en el evento! Compra el boleto para Teardown ahora y espero verte allí—¡ven y saluda!

+

Si no puedes asistir al evento, no te preocupes. Siempre puedes encontrarme en nuestro Discord y Subreddit durante la conferencia. Puedes enviarme mensajes o hablar conmigo en tiempo real, ya que podría estar transmitiendo en vivo los tres días mientras estoy en la mesa de demostración, así que únete a nuestra comunidad ahora y no te perderás de nada.

+

Desafío de videojuegos en Teardown

+

Ahora, para un poco de diversión: Estoy organizando una competencia de videojuegos en Teardown 2024. Estaré demostrando cómo funciona nuestro Mini-KVM con la computadora portátil, uConsole, que básicamente es una Raspberry Pi. Mira mi tweet en X aquí para ver cómo lo configuraré con el Mini-KVM.

+

play-game-uconsole

+

Estoy pensando en usar juegos como Pac-Man, The King of Fighters '97 y Tetris para el desafío de videojuegos. Y aquí está lo mejor—¡los ganadores pueden llevarse un Mini-KVM de mi parte allí mismo! Así que, ¡ven y juega conmigo para ganar!

+

Más por venir

+

Como siempre, estamos cocinando cosas emocionantes, y tendré un anuncio súper emocionante en Teardown. Así que mantente atento para más actualizaciones. ¡No puedo esperar para verte en Teardown 2024!

+

Saludos,
+Billy Wang +Equipo Openterface | TechxArtisan Studio

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/blog/feliz-navidad-y-pr\303\263spero-a\303\261o-nuevo-y-un-peque\303\261o-regalo-del-equipo-de-openterface/index.html" "b/blog/feliz-navidad-y-pr\303\263spero-a\303\261o-nuevo-y-un-peque\303\261o-regalo-del-equipo-de-openterface/index.html" new file mode 100644 index 0000000..667aa35 --- /dev/null +++ "b/blog/feliz-navidad-y-pr\303\263spero-a\303\261o-nuevo-y-un-peque\303\261o-regalo-del-equipo-de-openterface/index.html" @@ -0,0 +1,2053 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + ¡Feliz Navidad y Próspero Año Nuevo y Un Pequeño Regalo del Equipo de Openterface! - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + + + + + + + + +
+
+
+
+ + + + + + +
+
+
+
+ + + + + + + + + + +

¡Feliz Navidad y Próspero Año Nuevo y Un Pequeño Regalo del Equipo de Openterface!

+ + +

Hola,

+

¡Esperamos que este correo electrónico te encuentre bien mientras terminamos el año! Para celebrar el Año Nuevo y mostrar nuestro agradecimiento por tu apoyo, tenemos algo especial para ti.

+

Pero primero, queremos tomarnos un momento para agradecer a todos los que han sido parte de nuestro viaje este año. Ya seas un desarrollador que nos ayudó a dar vida a nuestras ideas, uno de nuestros beta testers que nos dio una valiosa retroalimentación temprana, un seguidor que ofreció orientación y ánimo, o uno de nuestros increíbles patrocinadores que creyó en nosotros desde el principio—has hecho este año inolvidable. No podríamos haberlo hecho sin ti.

+

Aquí está el trato: +Entre el 24 de diciembre de 2024 y el 10 de enero de 2025, si compras dos Mini-KVM Toolkits en Crowd Supply, te enviaremos un crédito de $20 para nuestra tienda TxA.

+

Es súper fácil—solo toma una captura de pantalla de tu confirmación de pedido de Crowd Supply y envíala por correo electrónico a info@techxartisan.com. Verificaremos tu compra y te responderemos con tu código de crédito de $20 para la tienda.

+

También tenemos una sorpresa especial de vacaciones para ti. Tómate un momento para relajarte y disfrutar de nuestro acogedor video de Navidad—echa un vistazo a las hermosas luces y escucha melodías navideñas relajantes. ¡Esperamos que traiga un poco de alegría a tu día!

+

Esta es nuestra forma de agradecer y comenzar el 2025 con un pequeño regalo de nosotros para ti.

+

Al reflexionar sobre el año pasado, estamos realmente agradecidos por el increíble apoyo de nuestra comunidad. Tu creencia en nuestra visión ha sido la fuerza impulsora detrás de todo lo que hacemos. A nuestros desarrolladores que convirtieron ideas en realidad, a nuestros beta testers que ayudaron a refinar nuestro producto, y a nuestros primeros seguidores que proporcionaron retroalimentación, ánimo y orientación—gracias por ser parte de nuestro viaje. Y a nuestros patrocinadores, tu confianza significa el mundo para nosotros, y estamos infinitamente agradecidos por tu papel en hacer todo esto posible.

+

¿Tienes preguntas? Solo escríbenos—siempre estamos aquí para ayudarte. Al dar la bienvenida al 2025, te deseamos a ti y a tus seres queridos un Año Nuevo lleno de alegría, felicidad, éxito y emocionantes nuevas aventuras.

+

Gracias por ser parte de nuestra historia. ¡Estamos emocionados de crear aún más cosas increíbles juntos en el año que viene!

+

Saludos cordiales, +El Equipo de Openterface

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/blog/index.html b/blog/index.html new file mode 100644 index 0000000..1b34cc6 --- /dev/null +++ b/blog/index.html @@ -0,0 +1,2722 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Blog - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+
+

Blog

+
+ +
+
+ + + + +
+
+

¡Feliz Navidad y Próspero Año Nuevo y Un Pequeño Regalo del Equipo de Openterface!

+ + +

Hola,

+

¡Esperamos que este correo electrónico te encuentre bien mientras terminamos el año! Para celebrar el Año Nuevo y mostrar nuestro agradecimiento por tu apoyo, tenemos algo especial para ti.

+

Pero primero, queremos tomarnos un momento para agradecer a todos los que han sido parte de nuestro viaje este año. Ya seas un desarrollador que nos ayudó a dar vida a nuestras ideas, uno de nuestros beta testers que nos dio una valiosa retroalimentación temprana, un seguidor que ofreció orientación y ánimo, o uno de nuestros increíbles patrocinadores que creyó en nosotros desde el principio—has hecho este año inolvidable. No podríamos haberlo hecho sin ti.

+

Aquí está el trato: +Entre el 24 de diciembre de 2024 y el 10 de enero de 2025, si compras dos Mini-KVM Toolkits en Crowd Supply, te enviaremos un crédito de $20 para nuestra tienda TxA.

+

Es súper fácil—solo toma una captura de pantalla de tu confirmación de pedido de Crowd Supply y envíala por correo electrónico a info@techxartisan.com. Verificaremos tu compra y te responderemos con tu código de crédito de $20 para la tienda.

+

También tenemos una sorpresa especial de vacaciones para ti. Tómate un momento para relajarte y disfrutar de nuestro acogedor video de Navidad—echa un vistazo a las hermosas luces y escucha melodías navideñas relajantes. ¡Esperamos que traiga un poco de alegría a tu día!

+

Esta es nuestra forma de agradecer y comenzar el 2025 con un pequeño regalo de nosotros para ti.

+

Al reflexionar sobre el año pasado, estamos realmente agradecidos por el increíble apoyo de nuestra comunidad. Tu creencia en nuestra visión ha sido la fuerza impulsora detrás de todo lo que hacemos. A nuestros desarrolladores que convirtieron ideas en realidad, a nuestros beta testers que ayudaron a refinar nuestro producto, y a nuestros primeros seguidores que proporcionaron retroalimentación, ánimo y orientación—gracias por ser parte de nuestro viaje. Y a nuestros patrocinadores, tu confianza significa el mundo para nosotros, y estamos infinitamente agradecidos por tu papel en hacer todo esto posible.

+

¿Tienes preguntas? Solo escríbenos—siempre estamos aquí para ayudarte. Al dar la bienvenida al 2025, te deseamos a ti y a tus seres queridos un Año Nuevo lleno de alegría, felicidad, éxito y emocionantes nuevas aventuras.

+

Gracias por ser parte de nuestra historia. ¡Estamos emocionados de crear aún más cosas increíbles juntos en el año que viene!

+

Saludos cordiales, +El Equipo de Openterface

+ +
+
+ +
+
+ + + + +
+
+

50% OFF en TODOS los productos – ¡Solo este Black Friday! Apoya el Software Libre.

+ + +

banner

+

Hola, queridos miembros de la comunidad Openterface,

+

¡Tenemos noticias emocionantes! Hemos lanzado una nueva línea de ropa en Openterface. Nuestra colección incluye camisetas y sudaderas con capucha que reflejan el espíritu de nuestra comunidad. No son solo prendas de vestir; son una celebración de nuestros valores compartidos y de la esencia de Openterface.

+

¿Qué hace que estos diseños sean aún más especiales? Tanto la camiseta como la sudadera con capucha presentan con orgullo el dibujo técnico de nuestro Mini-KVM de Openterface, que luce increíblemente genial. Además, hemos destacado el texto "Developer Mode" de nuestro Mini-KVM en el diseño, ¡una idea que creemos absolutamente brillante! Al ponerte nuestra camiseta o sudadera, no solo te mantendrás abrigado este invierno, sino que también entrarás en modo súper desarrollador para todas tus sesiones de programación y hacking.

+

OP-Hoodie-Zip-Up

+

¿Te preguntas cómo lucen en la vida real? Mira cómo los ha estado usando nuestro equipo en acción. Desde mantenerse cómodos en modo desarrollador mientras programan (ver tweet), hasta una divertida sesión de fotos con David Groom de la revista MAKE: en la Feria Maker de Shenzhen (ver foto), hemos estado mostrando orgullosamente nuestra ropa. Incluso nos inspiramos en una charla del legendario Eric Migicovsky, famoso por Pebble (ver publicación), mientras hacíamos una demostración del Mini-KVM de Openterface y conectándonos con amigos del ámbito tecnológico (ver más, y aquí). Estas prendas no son solo ropa; son iniciadores de conversación y una forma de celebrar nuestra comunidad dondequiera que vayamos.

+

david-billy-wearing-hoodie
+¡David y yo no podemos tener suficiente de nuestras sudaderas con capucha, prácticamente vivimos en ellas!😉 Un enorme agradecimiento a David por compartir una foto tan increíble—¡verdaderamente apreciada!🎉

+

¿Y por qué no darle a este invierno gris un toque de color con nuestro vibrante cable de datos naranja? Es una manera perfecta de iluminar tu espacio de trabajo mientras aseguras una transferencia de datos rápida y confiable.

+

Para endulzar la oferta, estamos ofreciendo un 🔥 DESCUENTO ESPECIAL DEL 50% 🔥 en todos los artículos durante los próximos cinco días de este Black Friday 2024, comenzando desde el momento en que leas este mensaje hasta el 1 de diciembre. Es nuestra forma de agradecerte por ser parte de nuestro viaje.

+

Explora nuestra tienda aquí: https://shop.techxartisan.com. Echa un vistazo a nuestra nueva línea de ropa y consigue una prenda a mitad de precio—¡no te pierdas esta oferta por tiempo limitado!

+

Productos de Openterface

+

openterface merch

+

Accesorios de Openterface

+

openterface accessories

+

Gracias por acompañarnos en esta aventura. Tu apoyo significa el mundo para nosotros, y estamos agradecidos por cada conversación, idea e interacción que hemos tenido.

+

Saludos cálidos,

+

Billy Wang
+Gerente de Producto
+Equipo Openterface | TechxArtisan

+

P.D. ¿Tienes alguna idea o comentario? ¡Estamos atentos! Únete a la conversación en Reddit o Discord, o mándanos un correo electrónico a info@techxartisan.com ✉️.

+ +
+
+ +
+
+ + + + +
+
+

¡El envío está en camino! Cables adicionales añadidos al Toolkit. ¿Qué sigue?

+

¡Hola, comunidad de Openterface!

+

Estamos emocionados de anunciar que nuestros productos Openterface han sido oficialmente enviados. ¡Actualmente están en el puerto de Shenzhen, listos para embarcarse en un carguero con destino a los EE. UU.!

+

Cajas empaquetadas para Crowd Supply
+Empaque del producto

+

Estas son las novedades:

+

Preparativos para el envío: controles de calidad y empaque

+

Antes de empacar y enviar, probamos cada unidad minuciosamente para garantizar la más alta calidad, como mencionamos en una actualización anterior: ¡Desafío DIY, premios geniales y la producción se acerca a la meta!. Cada cable fue probado con nuestro Mini-KVM para garantizar la estabilidad en la transmisión de señales.

+

Ahora, hablemos de las noticias, tanto las malas como las buenas.

+

Malas noticias: Algunos cables naranjas no cumplieron con las expectativas en condiciones difíciles

+

Nuestro Mini-KVM transmite video, audio, control de mouse/teclado y datos USB a través de un solo cable tipo C. El rendimiento del cable es crucial para la estabilidad de los datos, especialmente en entornos desafiantes.

+

Para simular interferencias del mundo real, envolvimos el cable tipo C naranja alrededor del motor de un ventilador eléctrico mientras varios ordenadores funcionaban cerca. Esto creó un alto nivel de interferencias electromagnéticas (EMI) para evaluar la estabilidad en la transmisión de datos de nuestros cables.

+

Configuración de prueba
+Un método económico pero efectivo de prueba.

+

Mira nuestro tweet en video donde mostramos una de nuestras pruebas de rendimiento en comparación.

+

En estas condiciones, algunos cables naranjas mostraron pérdida de señal, lo que generó preocupaciones sobre su fiabilidad en entornos complejos como centros de datos o durante operaciones críticas de TI.

+

Para abordar este problema, Kevin Peng, nuestro director técnico, desarrolló un programa de prueba personalizado. Esta herramienta, que te permitirá probar la calidad de tus propios cables USB, estará disponible como código abierto pronto. Más actualizaciones están en camino.

+

Interfaz del programa de prueba
+Nuestro programa hace que probar cables sea muy fácil.

+

Aunque nuestros cables naranjas, con su textura suave similar al silicón y apariencia atractiva, son ideales para el uso diario como carga rápida y transmisiones de datos regulares, no son adecuados para trabajos intensos de transmisión en condiciones adversas como alta EMI.

+

Buenas noticias: ¡Tenemos una solución!

+

Hemos adquirido de inmediato cables USB 3.2 de nailon de alta calidad para incluirlos como un extra en la versión Toolkit, sin costo adicional para ti. Estos cables duraderos vienen en tres longitudes en color gris: 1 m (3,2 ft), 1,5 m (4,9 ft) y 2 m (6,5 ft). Recibirás uno de estos cables de forma aleatoria en tu versión del Toolkit, garantizando una conexión robusta y confiable para tu Mini-KVM.

+

Nuevos cables tipo C de nailon en gris

+

En futuras versiones del Mini-KVM Toolkit, el cable naranja para conectar al lado del host del Mini-KVM será reemplazado por el cable tipo C 3.2 de nailon, combinando funcionalidad, estabilidad y estilo.

+

Cables tipo C de nailon personalizados

+

Esperamos que aprecies esta decisión y continúes confiando en Openterface durante momentos críticos en la tecnología.

+

Cronograma de envío

+

¿Cuándo puedes esperar tu Mini-KVM?
+Si todo transcurre sin problemas, nuestros productos deberían llegar al almacén de Mouser de Crowd Supply para mediados de diciembre. Luego se enviarán de acuerdo con cada pedido.

+
    +
  • Para patrocinadores en EE. UU.: Existe una pequeña posibilidad de entrega antes de Navidad, pero no está garantizado, ya que todo tiende a ralentizarse a medida que se acercan las festividades.
  • +
  • Para patrocinadores fuera de EE. UU.: Los tiempos de entrega variarán según la región. Nuestra mejor estimación es mediados de enero.
  • +
+

¡Esperamos un viaje sin contratiempos para nuestros productos Openterface, sin mareos, náuseas ni jet lag! 😃

+

Camisetas y sudaderas geniales de Openterface

+

Estaremos en la Maker Faire de Shenzhen este fin de semana (16–17 de noviembre). Para prepararnos, diseñamos ropa para el equipo, incluyendo camisetas, sudaderas con cremallera y sudaderas tipo pullover.

+

Echa un vistazo y cuéntanos qué opinas:
+Camisetas y sudaderas de Openterface

+

Apoya nuestro desarrollo

+

Si deseas apoyar aún más nuestro desarrollo de código abierto, visita nuestra Tienda TechxArtisan. Puedes comprar cables, camisetas y sudaderas, mientras nos ayudas financieramente a seguir innovando. Cada compra cuenta y refuerza el espíritu de la comunidad de código abierto.

+

Próximos pasos: Actualizaciones de la aplicación host

+

Ahora que el envío está en marcha, nuestro enfoque se centrará en mejorar nuestras aplicaciones host. Estamos trabajando para verificarlas en varias tiendas de aplicaciones y garantizar una experiencia fluida al comenzar con Openterface.

+

Tiendas de aplicaciones

+

Próximos pasos: Participa en nuestro concurso DIY de USB

+

¿Por qué no participar en nuestro USB KVM DIY Challenge 2024 una vez que tengas tu Mini-KVM Openterface en tus manos? Es una gran oportunidad para contribuir al desarrollo de código abierto y ganar premios, incluidos dos Mini-KVM Openterface en ediciones especiales y más. Para más detalles, consulta la página del concurso de Crowd Supply.

+

Logo del concurso DIY USB KVM
+Openterface en acción

+

Para concluir

+

Gracias por ser una parte integral de nuestro viaje. Tu apoyo y tus comentarios nos mantienen avanzando. Si tienes preguntas o ideas, ¡nos encantaría saber de ti! Únete a la conversación en nuestra comunidad en Reddit y Discord.

+

Con gratitud,
+Billy Wang
+Gerente de Producto
+Equipo Openterface | TechxArtisan

+ +
+
+ +
+
+ + + + +
+
+

¡Desafío DIY, Premios Geniales y la Producción se Acerca a la Línea de Meta!

+

¡Hola, entusiastas de Openterface!

+

¡Tenemos noticias emocionantes para compartir! Desde un nuevo y emocionante desafío DIY hasta hitos de producción y actualizaciones de software geniales, las cosas están en pleno apogeo aquí en Openterface. ¡Toma una bebida, ponte cómodo y sumérgete en esta actualización con nosotros!

+

Desafío DIY USB KVM 2024: ¡Es Hora de Desatar tu Mago Tecnológico Interior!

+

¡Atención a todos los aficionados, creadores y soñadores! Estamos encantados de presentar el Desafío DIY USB KVM 2024, una colaboración con TechxArtisan, Make: Magazine, la Asociación de Hardware de Código Abierto (OSHWA) y Crowd Supply. Esta es tu oportunidad de crear una solución KVM personalizada—¡veamos qué magia puedes hacer con tu Openterface Mini-KVM!

+

logos de techxartisan, make magazine, oshwa, crowdsouce

+

Aquí está el resumen:

+

Misión: Crea tu propia solución KVM abierta usando el Openterface Mini-KVM, con tu toque personal para satisfacer tus necesidades específicas.

+

Categorías: Premios para los mejores participantes incluyen galardones tanto por habilidad técnica como por creatividad, ¡así que todos tienen una oportunidad!

+

Premios Geniales:

+
    +
  • Un Openterface Mini-KVM de edición limitada con una carcasa transparente y plateada.
  • +
  • El futurista Pi-Cast KVM de HackerGadgets.
  • +
  • El retro-inspirado GameShell de Clockwork.
  • +
+

Cronograma: El desafío comienza el 1 de octubre de 2024 y las presentaciones cierran el 28 de febrero de 2025.

+

Jueces: Expertos de TechxArtisan, Make: Magazine, OSHWA y Crowd Supply evaluarán tus proyectos.

+

Ya seas un mago tecnológico experimentado o estés dando tus primeros pasos en el mundo de la piratería de hardware, este concurso es tu patio de recreo. ¿Quién sabe? ¡Podrías crear la próxima gran cosa en tecnología!

+

Únete a la acción en la página oficial del concurso de Crowd Supply y chatea con nosotros en el canal de Discord del concurso. ¡Que comiencen los juegos de innovación!

+

Openterface Mini-KVM disponible en tres carcasas geniales: transparente, plateada y negra

+

Openterface Mini-KVM disponible en tres carcasas geniales: transparente, plateada y negra

+ +

Algunos de los premios geniales: Pi-Cast KVM de HackerGadgets y GameShell de Clockwork

+

Algunos de los premios geniales: Pi-Cast KVM de HackerGadgets y GameShell de Clockwork

+ +

Actualización de Producción: ¡Casi Listo!

+

Aquí tienes un vistazo al arduo trabajo que se realiza tras bambalinas—¡nuestro estudio ha estado zumbando como una colmena! Hasta ahora, hemos ensamblado 800 unidades del Openterface Mini-KVM.

+

unidades ensambladas

+

Imagen del progreso de producción

+

Nuestro control de calidad es de primera categoría. Cada unidad es revisada, revisada nuevamente y mimada por nuestro equipo para asegurarnos de que cuando llegue a tus manos, no solo sea buena, ¡sino excelente! Apuntamos a la clase de calidad que hace que otros dispositivos se pongan verdes de envidia.

+

Sabemos que esperar puede ser difícil, pero estamos comprometidos a ofrecer la mejor experiencia posible. ¡Gracias por tu paciencia mientras ponemos los toques finales!

+

Actualización de Software: ¡La Aplicación de Android Recibe una Gran Mejora!

+

Nuestra aplicación de Android acaba de recibir una gran actualización. ¡Ahora controlar tus dispositivos objetivo a través de tu teléfono o tableta nunca ha sido tan fácil o divertido!

+

Mira el video de demostración aquí: Video de Demostración de la Aplicación de Android

+

dedo tocando la aplicación de Android

+

Aquí está lo nuevo:

+
    +
  • Controles táctiles suaves y receptivos
  • +
  • Funcionalidad de arrastrar y soltar fácil
  • +
  • Toques precisos para una experiencia intuitiva
  • +
  • Una nueva barra de teclas de función para mayor comodidad
  • +
  • Próxima función: atajos de teclado personalizables
  • +
  • Compatible con tabletas y teléfonos Android
  • +
+

Esta aplicación hace que el Openterface Mini-KVM sea aún más útil para los profesionales de la tecnología en movimiento. ¡También hemos subido el último APK y el código fuente a nuestro repositorio de GitHub si quieres explorar más o contribuir!

+

Resumiendo

+

¡Uf! Fue una actualización bastante grande, ¿verdad?

+

Si tienes alguna idea, comentario o sueños salvajes de KVM, ¡queremos escucharlos! Envíanos un mensaje directo, manda una paloma mensajera 🕊️, o únete a uno de nuestros canales comunitarios. ¡Nos encanta conectarnos contigo!

+

Gracias nuevamente por tu paciencia y por ser la mejor comunidad tecnológica que existe. Tenemos más noticias y actualizaciones emocionantes próximamente—¡mantente atento!

+

Con gratitud,
+Billy Wang
+Gerente de Producto
+Equipo Openterface | TechxArtisan

+ +
+
+ + + +
+
+ + + + +
+
+

Superando Obstáculos: Actualización de Progreso y Nueva Línea de Tiempo

+

Hola a todos,

+

Espero que estén bien. Ha pasado un tiempo desde nuestra última actualización. Me gustaría decir que todo ha ido sobre ruedas para Openterface, pero hemos encontrado algunos obstáculos que retrasarán nuestro cronograma de entrega. Aunque no era lo que esperábamos, estamos enfrentando estos desafíos de frente y avanzando con paso firme, con muchas buenas noticias para compartir. Esta publicación es una lectura de aproximadamente 7 minutos, así que vamos a los detalles para que sepan exactamente en qué punto estamos y qué viene a continuación.

+

Regulación, Producción y Calidad

+

Antes de comenzar la producción, tuvimos que pasar las pruebas de calidad necesarias según las regulaciones, en particular la certificación CE. Dado que nuestra versión del kit incluye no solo el Mini-KVM sino también varios accesorios, cada parte necesitaba pasar las pruebas CE. Estas pruebas tomaron más tiempo del esperado (resulta que los cables pueden ser bastante exigentes), pero la buena noticia es que hemos pasado la certificación CE para nuestro Mini-KVM y todos sus componentes! A continuación, un resumen de las certificaciones para todas nuestras partes: Mini-KVM, cable HDMI, cable naranja Tipo-C, cable corto negro Tipo-C y cable VGA2HDMI. Con la certificación en mano, nuestro cronograma de producción ahora es seguro, y nuestros fabricantes están produciendo todas las partes mientras hablo.

+

240823-0 +Los requisitos de UKCA y CE son los mismos para nuestros productos electrónicos, con CE también cubriendo el cumplimiento de RoHS.

+

Hace dos semanas, visitamos a uno de nuestros fabricantes para capacitar a sus gerentes de línea en el control de calidad de los cables naranjas antes de que nos los enviaran. Ahora, TODOS los cables naranjas han sido producidos y están en un rincón de nuestro estudio. +240823-1 +Kevin y Shawn explicaban los métodos de prueba para asegurar que el cable naranja funcione correctamente con nuestro Mini-KVM de Openterface.

+

Haremos la misma tarea esta semana para capacitar al equipo de control de calidad en la línea de producción para las otras partes también. Aquí hay muestras de cables adicionales. +240823-2 +Marcados con orgullo con nuestro logo TechxArtisan, estas son muestras del cable HDMI, el cable corto Tipo-C y el cable VGA a HDMI.

+

Esperamos que las otras partes y los Mini-KVMs lleguen pronto de nuestros fabricantes, momento en el cual revisaremos la calidad de cada componente y los empaquetaremos adecuadamente en nuestro estudio antes del envío. En otras palabras, nuestro equipo se asegurará personalmente de la calidad antes de que llegue a sus manos.

+

Envío, Posibles Retrasos y Nueva ETA

+

La incertidumbre actual radica en el proceso de envío. Después de investigar varias compañías de envío, descubrimos que el envío tomará más tiempo ya que probablemente transferiremos los paquetes a través de un almacén antes de llegar al almacén de Crowd Supply. Todavía estamos debatiendo si elegir transporte marítimo o aéreo—por favor, tengan paciencia con nosotros unos días más mientras resolvemos los arreglos.

+

El despacho de aduanas es otro posible obstáculo que podría causar retrasos inesperados. Una vez que nuestros productos lleguen al almacén de Crowd Supply en los EE. UU., tomarán de una a dos semanas para enviarse globalmente según cada pedido. Para los patrocinadores fuera de los EE. UU., los paquetes individuales aún necesitarán pasar por el envío global y el despacho de aduanas en el país de destino.

+

Teniendo en cuenta la situación actual y añadiendo algo de tiempo de reserva, sigo siendo cautelosamente optimista de que completaremos la entrega antes de fin de año, con una nueva ETA a mediados de enero. Lamento sinceramente los inconvenientes y agradezco su apoyo y paciencia durante este cambio.

+

Hardware Finalizado V1.9

+

Como saben por nuestra anterior publicación en Reddit, decidimos actualizar nuestro hardware a V1.9, incluyendo un conjunto de pines de expansión hackeables. Esto no formaba parte del plan original para la campaña de crowdfunding, pero creemos que mejora significativamente el potencial de uso más amplio del hardware.

+

240823-3 +Los pines VCC, GND, Target D+, Target D-, Host D+ y Host D-—donde 'D' significa datos USB.

+

Una motivación clave fue permitir que el interruptor USB se pueda activar a nivel de software. ¿Por qué es esto importante? En nuestra hoja de ruta, apuntamos a soportar una solución KVM-over-IP, como VNC, en el futuro. La idea es combinar el control local de KVM con el protocolo VNC, permitiendo a los usuarios controlar remotamente la computadora objetivo a través de la computadora anfitriona. En un escenario remoto como este, la capacidad de los usuarios para cambiar el puerto USB es esencial, especialmente cuando se requieren transferencias de archivos entre el anfitrión y el objetivo.

+

Los pines de expansión también abren posibilidades para más, como la integración con iPadOS, control ATX, puenteo de red y bypass de audio. Aunque no entraré en todos los detalles aquí, les animo a unirse a nuestra comunidad de Openterface para discutir más con nosotros.

+

Esta actualización de hardware podría extender potencialmente nuestra solución Openterface para operar sobre IP e incluir características más avanzadas, manteniendo su fortaleza principal como una herramienta KVM-over-USB plug-and-play—perfecta para profesionales de TI navegando en entornos de TI inciertos, como centros de datos desconocidos.

+

Me complace informar que V1.9 ha pasado nuestras pruebas básicas internas y se finalizará como la versión oficial para todos nuestros patrocinadores. Sin embargo, esta actualización de hardware requerirá más pruebas, y cualquier desarrollo basado en estos pines de expansión será experimental y probablemente tenga errores. Aquí es donde pueden contribuir. Contamos con la comunidad de código abierto para ayudarnos a mejorar Openterface juntos.

+

Más Actualizaciones de Software

+

En el frente del software, estamos haciendo avances emocionantes. ¡Estamos sumergiéndonos en la aplicación Openterface para Android ahora! Echen un vistazo a este tweet para una demostración temprana que muestra el control KVM suave, el movimiento del ratón y los clics en acción. Más características están en camino, y como siempre, una vez que hayamos pulido un poco más el código, esta aplicación también será de código abierto en nuestro repositorio de GitHub Openterface_Android. +240823-4 +Usando solo nuestros dedos para controlar un ordenador Linux desde una tableta Android. ¡Genial!

+

Nuestra versión QT acaba de recibir una actualización útil—¡ahora pueden transferir texto del anfitrión al objetivo! Así que ahora esta característica es compatible con las aplicaciones anfitrionas en macOS, Windows y Linux.

+

Además, también estamos planeando agregar una función divertida—un movimiento automático del ratón para evitar que su computadora objetivo se duerma. ¿Deberíamos optar por la pelota de ping-pong rebotando por la pantalla o el clásico efecto de salvapantallas de DVD? Voten y comenten en el tweet 😃

+

Diseño de Paquete, Etiquetado y Manual

+

Hemos estado experimentando con varios prototipos y diseños de empaques para encontrar el equilibrio perfecto entre varios factores clave:

+
    +
  • Seleccionar materiales lo suficientemente resistentes para proteger el producto y sus partes durante el envío,
  • +
  • Crear etiquetas informativas que ayuden a los usuarios a entender el producto de un vistazo,
  • +
  • Asegurar el cumplimiento de las regulaciones,
  • +
  • Hacer que el empaque sea visualmente atractivo,
  • +
  • Y ser ecológicos minimizando el uso de plástico siempre que sea posible.
  • +
+

Además, hemos realizado varias mejoras en la antigua bolsa del kit, incluyendo:

+
    +
  • Mayor espacio de almacenamiento,
  • +
  • Una cremallera naranja elegante,
  • +
  • Materiales exteriores e interiores mejorados,
  • +
  • Y un bolsillo de malla súper elástico.
  • +
+

Elegimos este material porque logra el equilibrio ideal entre ser económico, agradable al tacto y lo suficientemente duradero para proteger los artículos en su interior. Estamos seguros de que les encantará.

+

240823-5

+

También estamos actualizando las etiquetas en la carcasa de aluminio para hacerlas lo más informativas y visualmente atractivas posible. Esperamos que estas mejoras mejoren su experiencia de usuario y faciliten el inicio con Openterface.

+

240823-6

+

Estamos finalizando el manual de Openterface, que estará disponible en inglés, alemán, francés, japonés y chino. Disculpen si no incluimos su idioma—¡nuestra caja no es del tamaño de la TARDIS (la cabina de policía del Doctor Who)! Pero haremos nuestro mejor esfuerzo para agregar más traducciones en nuestro sitio web.

+

240823-7

+

Revisión de Idiomas por la Comunidad

+

He estado usando ChatGPT para ayudar con las traducciones, pero a veces puede fallar con la redacción y el fraseo. Si no es mucha molestia, agradecería enormemente cualquier ayuda para revisar el contenido en otros idiomas, especialmente para los materiales impresos que estamos a punto de finalizar. He actualizado todo el contenido de texto para el empaque en nuestra carpeta de GitHub product-printed-materials, donde pueden revisar y enviar cualquier mejora. También pueden enviarme un mensaje directo. ¡Gracias!

+

Comentarios Finales y Progreso Continuo

+

Nos disculpamos nuevamente por los retrasos y el cambio en la ETA de nuestro producto. ¡Gracias por su paciencia y por seguir con nosotros—estamos trabajando duro para entregarlo lo antes posible! Les actualizaré inmediatamente una vez que nuestro envío esté arreglado. Más actualizaciones están en camino, así que por favor únanse a nuestra comunidad de Openterface y manténganse atentos.

+

Saludos,

+

Billy Wang
+Gerente de Producto
+Equipo Openterface | TechxArtisan

+ +
+
+ +
+
+ + + + +
+
+

De Desmontaje a Producción: ¡Estamos Avanzando!

+

Hola a todos,

+

Ha pasado un tiempo desde que terminó nuestra campaña de crowdfunding, y tenemos algunas actualizaciones fantásticas para compartir con ustedes. Estamos emocionados de sumergirnos de lleno en la fase de producción de nuestro Openterface Mini-KVM y mantenerlos informados sobre nuestro progreso.

+

Lo Mejor de Teardown 2024

+

Primero que nada, el Teardown 2024 del mes pasado, organizado por Crowd Supply en Portland, fue simplemente increíble. ¡Fue fantástico conocer en persona a tantos de nuestros amigos y patrocinadores tecnológicos en nuestra mesa de demostración! Sus amables palabras son un gran aliento y motivación para nosotros. Aquí hay algunas fotos del evento:

+

openterface-billy-at-teardown2024-2

+

¡Un gran agradecimiento a Electromaker por presentar nuestro producto durante el evento! Echen un vistazo a nuestra charla en este video:

+ + +

Producción en Pleno Movimiento

+

En este momento, estamos ocupados ordenando piezas y chips como el CH9329 y CH340 mientras nos preparamos para la producción. También estamos enviando nuestro Mini-KVM y cables para pruebas de certificación CE, RoHS y UKCA. Si todo va bien, comenzaremos la producción en las fábricas pronto. Nuestro equipo se asegura de que cada paso de la línea de producción funcione sin problemas para entregar un producto de primera calidad que sea tanto divertido como confiable. Aquí hay algunas fotos de los informes de prueba para RoHS y CE de nuestro cable naranja Type-C:

+

openterface-test-report-typec

+

Manténganse atentos, ya que tendremos más informes similares para nuestros Mini-KVMs y otros cables para asegurar que todos cumplan con los estándares de certificación requeridos.

+

Certificación OSHWA

+

Estamos encantados de anunciar que nuestro Openterface Mini-KVM ahora está oficialmente certificado por OSHWA como completamente de código abierto. 🥳 Pueden ver nuestra certificación aquí: OSHWA UID CN000015. Nos comprometemos a mantener tanto el software como el hardware de código abierto, permitiendo a los amantes de la tecnología explorar el potencial del USB KVM, contribuir a su desarrollo y construir una comunidad vibrante juntos.

+

openterface-oshw-cn000015

+

Actualización de Hardware V1.9

+

Acabamos de lanzar el hardware V1.9 con pines adicionales: VCC, GND, Target D+, Target D-, Host D+, Host D- para aún más diversión hackeable. Estos pines de datos están conectados al hub USB del Target y del Host. Ahora pueden hacer extensiones DIY para Openterface, como ATX, puente de red, bypass de audio y más. ¿Qué ideas creativas tienen para hackear nuestro Mini-KVM con estos pines? Únanse a nuestro Reddit o Discord, compartan sus pensamientos y diviértanse programando con nosotros.

+

openterface-v1-9-hackable

+

Ejecuta Openterface en Pi y Únete con uConsole

+

¡Hemos logrado ejecutar nuestra aplicación host QT en un entorno Pi! Lo que es aún más emocionante es cómo nuestro Mini-KVM puede unirse con el uConsole de Clockwork para convertirlo en una herramienta KVM portátil. Es súper útil para plug-and-play y solucionar rápidamente cualquier dispositivo sin cabeza cercano.

+ + +

Desarrollo y Toques Finales

+

Nuestro equipo de desarrollo, liderado por Kevin, está trabajando incansablemente para probar y refinar el código. Únanse a nuestro Discord de Techxartisan para pasar el rato con nuestro equipo de desarrollo y beta y mantenerse actualizados sobre nuestro progreso. Mientras tanto, Billy está manejando todo el papeleo y finalizando el diseño de nuestro producto, empaque y manual del producto.

+

Aquí tienen un adelanto de nuestras impresiones y etiquetas actualizadas para la caja de aluminio, mostradas en el tweet de Kazubu cuando Billy se lo compartió en Tokio, Japón:

+

openterface-kazubu-tweet-new-look

+

En Camino para Septiembre

+

Actualmente estamos en el buen camino y trabajando arduamente para poner nuestros Mini-KVMs en sus manos para finales de septiembre.

+

Nos encantaría su ayuda para correr la voz sobre nuestro Mini-KVM. Esperamos que pueda beneficiar a más entusiastas de la tecnología y hacer la vida tecnológica más fácil para cualquiera que maneje dispositivos sin cabeza.

+

¡Muchas gracias por todo su apoyo y entusiasmo! ¡No podríamos haberlo hecho sin ustedes!

+

Saludos,
+Billy Wang
+Equipo Openterface

+ +
+
+ +
+
+ + + + +
+
+

¡Encuéntrame en Portland este fin de semana y gana un Mini-KVM con mi desafío de videojuegos!

+

¡Hola a todos! ¡Tenemos noticias fantásticas para compartir!

+

¡Muchas gracias!

+

Primero que todo, no puedo agradecerles lo suficiente por su increíble apoyo. Nuestra campaña de crowdfunding ha superado absolutamente sus metas el 14 de junio, alcanzando $248k con el increíble apoyo de más de 1110 patrocinadores y Crowd Supply.

+

crowdfunding_end_240614

+

¡Este éxito nos ha dado la oportunidad de mejorar aún más el Mini-KVM! No podríamos haberlo logrado sin ustedes—¡en serio, gracias desde el fondo de nuestros corazones! 🧡 Estaremos trabajando a toda máquina en la producción para asegurar la entrega en sus manos pronto.

+

¡Apuesta divertida y mi vuelo a Portland!

+

Así que, aquí va una historia divertida: Como mencioné en esta publicación, Kevin y yo hicimos una apuesta. Si conseguíamos 100 nuevos patrocinadores en las últimas 36 horas, yo volaría a EE.UU. para Teardown 2024 de Crowd Supply. Bueno, ¿adivinen qué? No solo alcanzamos los 100—¡conseguimos 165 nuevos patrocinadores! Así que, estoy súper emocionado de anunciar que asistiré a Teardown 2024 en persona este viernes (21 de junio) y el fin de semana.

+

Mi mesa de demostración y transmisión en vivo

+

Teardown es el evento anual insignia de Crowd Supply centrado en todo lo relacionado con el hardware - con charlas, demostraciones, talleres y más.

+

Teardown 2024 Lloyd Center Mall Portland, Oregon 21-23 de junio de 2024

+

teardown-poster

+

Tendré una mesa de demostración en el evento Teardown: ¡Échale un vistazo aquí!

+

¿Hay alguna posibilidad de que estés cerca del área de Portland? ¡Sería fantástico conocerte en el evento! Compra el boleto para Teardown ahora y espero verte allí—¡ven y saluda!

+

Si no puedes asistir al evento, no te preocupes. Siempre puedes encontrarme en nuestro Discord y Subreddit durante la conferencia. Puedes enviarme mensajes o hablar conmigo en tiempo real, ya que podría estar transmitiendo en vivo los tres días mientras estoy en la mesa de demostración, así que únete a nuestra comunidad ahora y no te perderás de nada.

+

Desafío de videojuegos en Teardown

+

Ahora, para un poco de diversión: Estoy organizando una competencia de videojuegos en Teardown 2024. Estaré demostrando cómo funciona nuestro Mini-KVM con la computadora portátil, uConsole, que básicamente es una Raspberry Pi. Mira mi tweet en X aquí para ver cómo lo configuraré con el Mini-KVM.

+

play-game-uconsole

+

Estoy pensando en usar juegos como Pac-Man, The King of Fighters '97 y Tetris para el desafío de videojuegos. Y aquí está lo mejor—¡los ganadores pueden llevarse un Mini-KVM de mi parte allí mismo! Así que, ¡ven y juega conmigo para ganar!

+

Más por venir

+

Como siempre, estamos cocinando cosas emocionantes, y tendré un anuncio súper emocionante en Teardown. Así que mantente atento para más actualizaciones. ¡No puedo esperar para verte en Teardown 2024!

+

Saludos,
+Billy Wang +Equipo Openterface | TechxArtisan Studio

+ +
+
+ +
+
+ + + + +
+
+

Últimas Horas para Apoyar y Mini-KVMs en la Vanguardia Tecnológica

+

¡Hola a todos!

+

Queríamos compartir algunas actualizaciones emocionantes de nuestro equipo beta en nuestro canal de Discord! Nuestro Mini-KVM de Openterface está funcionando de maravilla en la vanguardia tecnológica, y tenemos unas imágenes fantásticas para mostrarles. ¡Échenles un vistazo y vean de qué se trata todo el alboroto!

+

cam-share

+

catenane-share

+

kashall-share

+

kazubu-share

+

nkahoang-share

+

🚨 ¡Última Oportunidad! 🚨

+

¡El tiempo se acaba! No pierdas la oportunidad de apoyarnos en Crowd Supply y conseguir el Mini-KVM de Openterface a un precio súper accesible de $79 - $99. La campaña termina el 13 de junio de 2024 a las 4:59 PM PDT, y los precios aumentarán después de la campaña a medida que el producto madure. ¡Así que actúa ahora y aprovecha esta oferta!

+

Próximo Evento Teardown 2024 y Una Apuesta Divertida

+

Como muchos de ustedes han visto en la página principal de Crowd Supply, el próximo evento Teardown 2024 está generando mucha emoción. ¡Estoy ansioso por asistir en persona y conocer a nuestros increíbles patrocinadores allí!

+

Aquí hay una apuesta divertida que tenemos en nuestro equipo:

+

Actualmente, tenemos alrededor de 950 patrocinadores para nuestro proyecto. Kevin Peng, nuestro director técnico, y yo tenemos una apuesta. Si logramos conseguir 100 patrocinadores más en las últimas horas, los gastos de mi viaje a Portland serán cubiertos por nuestro estudio. Si no, tendré que pagar yo mismo, lo que significa unos cuantos miles de dólares de mi propio bolsillo.

+

Así que, hago un llamado a todos nuestros suscriptores y nuevos amigos del Mini-KVM de Openterface para que nos ayuden a superar estas últimas horas. ¡Vamos a alcanzar más de 1050 patrocinadores y hacer que este viaje suceda!

+

Lo más importante, por favor ayuden a correr la voz sobre nuestra campaña que está llegando a su fin. Estamos comprometidos a construir este dispositivo útil y asegurarnos de que se entregue a ustedes con la mejor calidad.

+

Hemos puesto todo nuestro corazón en este proyecto durante los últimos 8 meses. Pueden ver todos nuestros esfuerzos en las actualizaciones a continuación y revisar nuestras publicaciones históricas en nuestro subreddit r/Openterface_miniKVM:

+ +

¡Así que apóyanos en estas últimas horas! ¡Saludos!

+

Billy Wang
+Gerente de Proyecto
+Equipo Openterface

+ +
+
+ +
+
+ + + + +
+
+

¡Actualizaciones Épicas y Última Semana – Última Oportunidad para Apoyar el Mini-KVM!

+

¡Hola a todos!

+

¡El tiempo vuela cuando te diviertes! Estamos en la última semana de nuestra campaña de crowdfunding para el Openterface Mini-KVM en Crowd Supply. ¡Vamos a sumergirnos en algunas actualizaciones emocionantes!

+

Actualizaciones de Software

+

¡Tenemos noticias fantásticas para ustedes: nuestro mini-KVM ahora es compatible con macOS, Windows y Linux! ¡Y lo mejor de todo, es de código abierto!

+

🎉 Echa un vistazo a los detalles para cada sistema a continuación:

+

Openterface_MacOS

+
    +
  • Repositorio en GitHub: Openterface_QT + openterface-macos-app-store
  • +
  • Video de Demostración Beta Temprana: Mini-KVM: Pruebas Básicas de Control KVM
  • +
  • Cómo Instalar:
      +
    • App Store: Encuentra nuestra aplicación host buscando "Openterface" o "Mini-KVM".
    • +
    • Compilar desde el Código Fuente: Instala CodeX y compila la aplicación macOS desde el código fuente.
    • +
    +
  • +
+

Openterface_QT

+ +

Otras Aplicaciones

+
    +
  • Como mencionamos en nuestra actualización anterior, hemos completado pruebas de concepto para Android y WebExtension. Aunque son prioridades más bajas, definitivamente están en la lista. También estamos explorando el soporte para ChromeOS y la posibilidad de hacer que el mini-KVM funcione en iPads con chips de la serie M. ¡Únete a la discusión en nuestra comunidad si tienes alguna idea!
  • +
+

¡Hardware de Código Abierto AHORA!

+

openterface-hardware-repo

+

¡Hemos dado una gran actualización a nuestro repositorio de hardware! Ahora está lleno de hojas de datos, modelos 3D, lista de materiales y esquemas – todo lo que necesitas para ponerte manos a la obra con nuestro gadget.

+

pcb-v1-6-both-sides

+

Consulta el repositorio de hardware: Openterface_Mini-KVM_Hardware

+

Ya seas un profesional experimentado o estés comenzando, queremos tus comentarios y sugerencias creativas. ¡Y para los creadores, por qué no intentar construir nuestro mini-KVM desde cero? Modifica nuestro código, hazlo tuyo y muéstranos lo que tienes!

+

Accesorios Aún Mejores

+

NUEVO Cable Tipo-C Naranja de 1.5m con Convertidor

+

type-c-cable-v2-plugged-old-mac

+

¿Recuerdas nuestro elegante cable Tipo-C naranja con la agradable sensación de silicona? ¡Hemos recibido las primeras muestras y se ven increíbles! Estos cables soportan carga rápida de 240W (Voltaje DC50V, Corriente 5A, Potencia 240W) y funcionan perfectamente con nuestros mini-KVMs. ¡Un gran agradecimiento a nuestro fabricante y a nuestros patrocinadores por hacer esto posible!

+

type-c-cable-v2-open-2

+

Bolsa de Herramientas Mejorada

+

Con el nuevo adaptador adjunto para nuestro cable Tipo-C de 1.5m y la actualización del cable VGA a HDMI de 1m de largo, creemos que es necesario aumentar el tamaño de nuestra bolsa de herramientas a 16 cm L x 10 cm A x 3.8 cm H, ¡proporcionando un poco más de espacio!

+

beta-round2-toolkit

+

Experimentos de Empaque

+

Estamos experimentando con diferentes diseños para nuestras cajas de empaque exterior: coloridas, grises, negras y más. Nos inclinamos por el diseño colorido, ¡pero queremos tus comentarios!

+

toolkit-boxes-showcase.jpg

+

Consulta los detalles de nuestro kit beta enviado a nuestro equipo beta aquí. ¡Déjanos saber lo que piensas! Solo un aviso, este diseño de empaque no es final. Es posible que aún necesitemos ajustar el tamaño de la caja y agregar detalles esenciales como la marca CE y otra información requerida.

+

¡Última Oportunidad para Apoyarnos!

+

Esta es la última semana de nuestra campaña. Apóyanos ahora para obtener el Openterface Mini-KVM a un precio amigable para tu bolsillo. Los precios después de la campaña probablemente aumentarán a medida que el producto madure. No te lo pierdas, ¡actúa ahora!

+

Abordando Preocupaciones

+

Entendemos el escepticismo debido a proyectos de crowdfunding fraudulentos. Aquí está por qué puedes confiar en nosotros:

+

Confía en Crowd Supply: Desde 2012, Crowd Supply ha sido una plataforma líder para productos electrónicos, protegiendo tus derechos como patrocinador, supervisando de cerca nuestro desarrollo y brindándonos asesoramiento profesional para asegurarse de que lo que creamos sea perfecto para ti.

+

Confía en Nuestro Equipo: Tenemos más de seis años de experiencia en IoT, IA y arte tecnológico. Conoce más sobre nosotros en nuestro sitio web TechxArtisan Studio.

+

Confía en Nuestra Cultura: Nos enfocamos en la excelencia técnica y la experiencia del usuario, abrazando la colaboración de código abierto. Únete a nuestra comunidad en Reddit r/Openterface_miniKVM y Discord TechxArtisan para ver nuestro viaje desde los primeros prototipos hasta la versión actual de preproducción.

+

Si aún no estás seguro, ¡está bien! Creemos que nuestro Openterface Mini-KVM te convencerá eventualmente.

+

Más por Venir

+

Siempre estamos cocinando algo emocionante, ¡así que por favor mantente atento! Si tienes alguna pregunta, únete a nosotros en nuestra comunidad o envíanos un correo electrónico: info@techxartisan.com. ¡Mantente al tanto y gracias por tu apoyo! 😄

+

Saludos,

+

Equipo Openterface | TechxArtisan Studio

+ +
+
+ + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/blog/la-campa\303\261a-de-crowdfunding-para-el-openterface-mini-kvm-est\303\241-en-vivo-ahora/index.html" "b/blog/la-campa\303\261a-de-crowdfunding-para-el-openterface-mini-kvm-est\303\241-en-vivo-ahora/index.html" new file mode 100644 index 0000000..fdd3ec3 --- /dev/null +++ "b/blog/la-campa\303\261a-de-crowdfunding-para-el-openterface-mini-kvm-est\303\241-en-vivo-ahora/index.html" @@ -0,0 +1,2116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + ¡La Campaña de Crowdfunding para el Openterface Mini-KVM Está en Vivo AHORA! - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + + + + + + + + +
+
+
+
+ + + + + + +
+
+
+
+ + + + + + + + + + +

¡La Campaña de Crowdfunding para el Openterface Mini-KVM Está en Vivo AHORA!

+

¡Estamos emocionados de anunciar que la campaña de crowdfunding para el Openterface Mini-KVM ya está en vivo! Este dispositivo rico en funciones, de código abierto y dirigido por la comunidad, simplifica la forma en que controlas e interactúas con computadoras sin pantalla.

+

Ofrece una solución KVM sobre USB compacta, ligera y rápida que elimina la necesidad de teclados, ratones, monitores o configuraciones de red adicionales. Puedes controlar una computadora sin pantalla directamente desde tu laptop o computadora de escritorio, simplificando tu configuración y mejorando tu flujo de trabajo.

+

¡Únete a nosotros para hacer tu vida tecnológica más fácil!

+

openterface-mini-kvm-wired-up-mini-kvm-angled-view

+

Una Herramienta Versátil para Diversas Necesidades en Movimiento

+

El Openterface Mini-KVM es el compañero perfecto para una amplia gama de usuarios y escenarios:

+
    +
  • Profesionales de TI solucionando problemas en servidores
  • +
  • Técnicos que dan servicio a cajeros automáticos, VLTs y quioscos
  • +
  • Desarrolladores gestionando dispositivos de computación en el borde
  • +
  • Entusiastas de la tecnología experimentando con computadoras de placa única
  • +
  • Profesionales que requieren operaciones locales seguras en la segregación de redes, como aquellos que gestionan activos de criptomonedas
  • +
  • Cualquiera que necesite integrar frecuentemente flujos de trabajo entre computadoras personales y de trabajo.
  • +
+

use-case-pc-angled-view

+

Impulsado por la Retroalimentación de la Comunidad

+

Nuestra aventura en la creación del Openterface Mini-KVM fue inspirada por nuestros propios desafíos y un deseo colectivo de una herramienta más efectiva. Con una historia rica en nuestro estudio TechxArtisan desarrollando proyectos de arte tecnológico y soluciones IoT al aire libre, a menudo enfrentamos el dilema de gestionar dispositivos en condiciones de red poco fiables sin el lujo de llevar equipo adicional. Impulsados por conversaciones con colegas y retroalimentación de una comunidad que comparte nuestras dificultades, nos propusimos crear un dispositivo que aborde estas necesidades de frente, facilitando el control de dispositivos sin pantalla de manera confiable y sin esfuerzo.

+

La Diferencia del Openterface Mini-KVM

+

Podrías preguntarte, con varias soluciones KVM disponibles, ¿por qué elegir el Openterface Mini-KVM? Aquí te decimos por qué:

+
    +
  1. +

    Compacto y Eficiente: Diseñado tanto para profesionales de TI como para entusiastas, nuestra solución KVM sobre USB brilla en entornos con acceso limitado o nulo a la red, ofreciendo una herramienta portátil, independiente de la red y rápida para la solución de problemas.

    +
  2. +
  3. +

    Asequibilidad: Hemos trabajado arduamente para hacer que el Openterface Mini-KVM sea más rentable que sus contrapartes, asegurando que esté al alcance de todos los que necesiten esta herramienta esencial para proyectos de trabajo o pasatiempos.

    +
  4. +
  5. +

    Dirigido por la Comunidad y de Código Abierto: En su núcleo, el Openterface Mini-KVM se trata de fomentar una comunidad de innovación y colaboración. Al abrazar los valores de código abierto, invitamos a los usuarios a contribuir con características personalizadas y mejoras, enriqueciendo las capacidades y versatilidad de la herramienta.

    +
  6. +
+

Mantente Conectado e Involucrado

+

Para mantenerte al día con los últimos desarrollos, recibir soporte técnico y conectarte con otros usuarios, te invitamos a visitar nuestra página de Pre-Lanzamiento en Crowd Supply, explorar nuestro sitio web en openterface.com, y unirte a nuestras comunidades en subreddit r/Openterface_miniKVM y Discord TechxArtisan.

+

Emprendamos juntos este emocionante viaje y revolucionemos la forma en que controlas dispositivos sin pantalla. ¡Únete a nosotros para hacer realidad el Openterface Mini-KVM!

+

¡Saludos!

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/blog/page/2/index.html b/blog/page/2/index.html new file mode 100644 index 0000000..ca8184b --- /dev/null +++ b/blog/page/2/index.html @@ -0,0 +1,2205 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Blog - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+
+

Blog

+
+ +
+
+ + + + +
+
+

Charla Casual con David Groom de MAKE: Magazine: La Historia del Openterface Mini-KVM

+

¡Hola a todos!

+

Acabamos de terminar una increíble transmisión en vivo en YouTube con David Groom de MAKE: Magazine. Durante la sesión, profundizamos en la historia detrás de nuestro Openterface Mini-KVM, una innovadora solución de hardware de código abierto diseñada para controlar fácilmente dispositivos sin pantalla y computadoras de placa única como las Raspberry Pi, usando solo tu laptop. Puedes ver la transmisión en YouTube para más detalles o simplemente leer la historia a continuación.

+

youtube-with-david-2

+

El Nacimiento de una Idea

+

El viaje del Mini-KVM comenzó en la bulliciosa ciudad de Guangzhou, China, dentro de nuestro estudio TechxArtisan. Durante los últimos cinco años, hemos estado profundamente involucrados en numerosos proyectos de arte tecnológico para artistas locales e internacionales. Nuestro trabajo incluye la construcción de instalaciones de iluminación interactivas con detección de IA, brazos robóticos para actuaciones teatrales, mini autos autónomos que resuelven laberintos aleatorios e incluso un perro robot diseñado para explorar tierras inhóspitas como desiertos y bosques.

+

techxartisan_tech_art

+

Un Dolor de Cabeza Común

+

Un desafío recurrente en nuestro trabajo era gestionar una gran cantidad de computadoras sin pantalla como las Raspberry Pi y Jetson Nano, que carecían de monitores, teclados o conectividad de red. Esto a menudo nos llevaba a buscar frenéticamente monitores y teclados de repuesto para solucionar problemas y acceder a estos dispositivos en condiciones difíciles.

+

Soluciones Improvisadas

+

Inicialmente, recurrimos a soluciones improvisadas de monitores portátiles alimentados por baterías y mini-teclados inalámbricos con touchpads. Sin embargo, estos a menudo se olvidaban o se extraviaban, lo que nos llevó a la necesidad de una solución de hardware dedicada que pudiera aprovechar las laptops que siempre llevábamos para programar y configurar.

+

diy-monitor-keyboard +Estos dos gadgets deben llevarse para proyectos en el sitio.

+

El Primer Prototipo

+

Nuestro primer prototipo DIY fue una combinación simple pero efectiva de una tarjeta de captura para recuperar video del dispositivo sin pantalla y un simulador de teclado/ratón USB, todo integrado en un solo cable USB que se conectaba a nuestras laptops.

+

/early-mini-kvm-pcb +Una de las primeras versiones del PCB del mini-KVM

+

Mostramos nuestros geniales proyectos de arte tecnológico en la Maker Faire de Shenzhen en noviembre de 2023, con la intención de mostrar el prototipo del mini-KVM a David. Sin embargo, ¡nos emocionamos tanto con los regalos de David que lo olvidamos!

+

techxartisan_team_with_david_groom +¡Las pegatinas y postales de MAKE: Magazine son realmente geniales!

+

Retroalimentación y Desarrollo de la Comunidad

+

Después de compartir nuestro prototipo en Reddit, recibimos comentarios invaluables de la comunidad, que nos animaron a refinar y desarrollar nuestra solución en un producto pulido. Este apoyo comunitario fue fundamental para transformar nuestro dispositivo improvisado en una herramienta elegante y eficiente para homelabbers, administradores de sistemas, entusiastas de la tecnología y cualquier persona que trabaje con computadoras sin pantalla.

+

got_feedback_from_reddit +Recibimos una gran cantidad de comentarios de homelabbers

+

Superando Dudas

+

A pesar de las dudas iniciales sobre competir con soluciones similares existentes, la respuesta positiva y las sugerencias constructivas de las comunidades en línea ayudaron a aclarar los posibles casos de uso y aumentaron nuestra confianza. Sin este apoyo y la afirmación de nuestros esfuerzos, es posible que no hubiéramos seguido adelante con el proyecto.

+

Crowdfunding y Planes Futuros

+

La campaña de crowdfunding para el Openterface Mini-KVM en Crowd Supply está ganando mucho impulso, con aproximadamente dos semanas restantes. Esta campaña no se trata solo de desarrollar el Mini-KVM; es un testimonio del poder de la innovación impulsada por la comunidad. A continuación, nos sumergiremos en la gestión de la producción, mejoras de software y la entrega de este práctico gadget a nuestros increíbles patrocinadores, todo impulsado por nuestra asombrosa comunidad de código abierto.

+

techxartisan_openterface_discord +Los beta testers están compartiendo su uso del Openterface Mini-KVM en sus tareas tecnológicas diarias en el Discord de TechxArtisan

+

Abrazando la Visión de Código Abierto

+

El Openterface Mini-KVM es un testimonio de nuestra creatividad y perseverancia, y de la comunidad de código abierto que nos apoya. Lo que comenzó como una solución simple para nuestros desafíos personales ha evolucionado en una herramienta versátil y de código abierto que beneficiará a hackers, experimentadores y entusiastas de la tecnología en todo el mundo. Mantente atento a más actualizaciones a medida que el Mini-KVM se acerca a su lanzamiento oficial.

+ +
+
+ +
+
+ + + + +
+
+

Desde el Desarrollo hasta tus Manos: Detrás de Escena

+

¡Hola a todos!

+

Estamos de vuelta con otra actualización sobre nuestra campaña de crowdfunding, ¡y tenemos noticias emocionantes para compartir!

+

Alcanzando un Hito Importante

+

Primero que nada, estamos absolutamente encantados de anunciar que hemos alcanzado un asombroso 1100% de nuestra meta de financiamiento original! Un enorme agradecimiento a cada uno de ustedes. ¡Su apoyo ha sido simplemente fenomenal!

+

Planificación de Producción

+

¡Hemos estado súper ocupados en el frente de producción! Esta semana, visitamos la ciudad tecnológica de Shenzhen y tuvimos la oportunidad de recorrer una de las principales fábricas de tecnología. Estas personas trabajan con grandes nombres como Meta, ABB y Blaupunkt, y fue increíble ver sus avanzadas líneas de producción y maquinaria de control de calidad en acción. Me encantaría compartir más fotos, pero aquí hay una con un poco de mosaico digital por confidencialidad.

+

txa-team-visit-sz-factory-1

+

(Estábamos discutiendo QC con el gerente de la línea de producción.)

+

Nos sentimos muy positivos sobre esta asociación y su entusiasmo por apoyar a una startup tecnológica como la nuestra. Estamos comprometidos a garantizar que la fase de fabricación se maneje con la máxima dedicación y calidad para que podamos poner nuestro producto en sus manos pronto. Aquí hay una foto de nuestros miembros del equipo principal en la entrada de la fábrica:

+

txa-team-visit-sz-factory-2

+

(De izquierda a derecha: Shawn, Billy, Kevin, Vileer.)

+

Mejorando los Accesorios del Kit de Herramientas

+

Siempre estamos buscando formas de mejorar, y nuestro cable adicional VGA a HDMI ahora ha sido mejorado a 1 metro de largo con mayor calidad, como pueden ver en nuestra actualización de la Semana 2.

+

A continuación, también estamos investigando nuestro cable Type-C de 1.5 metros de largo para conectar a la computadora anfitriona. El Type-C se está volviendo cada vez más común en nuevas computadoras, laptops e incluso servidores. Después de probar muchos fabricantes, encontramos uno que podría producir este elegante cable Type-C naranja con una agradable sensación de silicona que cumple con nuestros estándares de calidad.

+

Actualmente, se requiere un adaptador adicional de Type-C a USB-A si nuestro Mini-KVM funciona con una computadora anfitriona que solo tiene puertos USB-A.

+

typec-cable-need-adapter| link

+

Sabemos que es un poco molesto, por lo que estamos trabajando estrechamente con nuestro fabricante para mejorarlo integrando un adaptador adjunto de Type-C a USB-A. Aquí hay un prototipo de cómo podría verse.

+

upgrade-for-typ-c-cable-with-adapter

+

Este elegante cable naranja, con una buena sensación de silicona y 1.5 metros de largo, presenta conectores Type-C en ambos extremos e incluye un adaptador para convertir un extremo de Type-C a USB-A. No existe en el mercado y requiere nuestra producción OEM personalizada. Estamos apuntando a incluir esta solución en nuestro paquete final de herramientas para los patrocinadores, pero todavía estoy haciendo cálculos y dándole un buen uso a mi calculadora. Para que esto suceda, necesitamos más apoyo para reducir el costo total de producción de nuestro kit de herramientas mini-KVM. Dado el número actual de crowdfunding y los costos de producción, hacer este cable Type-C personalizado se está volviendo más factible, ya que se está acercando al punto de equilibrio. ¡Mantendré a todos actualizados en la comunidad de Openterface sobre cualquier progreso!

+

Por su parte, si encuentran nuestro proyecto prometedor y creen que el Mini-KVM puede hacer su vida tecnológica más fácil, consideren apoyarnos y difundir la palabra a sus amigos. ¡Asegurémonos de poder mejorar el producto aún más mientras lo mantenemos asequible para todos en esta campaña de crowdfunding! ¡Muchas gracias!

+

Actualizaciones de Código Abierto y Colaboración Global

+

Por favor, tengan paciencia con nosotros durante esta etapa temprana de desarrollo, ya que todavía hay errores y cambios en nuestras aplicaciones anfitrionas. ¡Ahí es donde entra nuestro equipo beta! Ya hemos organizado dos rondas de pruebas beta. Echen un vistazo a nuestras publicaciones aquí para saber más:

+ +

Como pueden ver en las publicaciones anteriores, recibimos un número abrumador de aplicaciones fantásticas en las Rondas 1 y 2, y fue un verdadero desafío reducir los candidatos de un grupo tan brillante. ¡Tuvimos que tomar decisiones difíciles debido a los lugares limitados disponibles en esta fase exclusiva!

+

Nuestro equipo beta es una colaboración excepcional y verdaderamente global, con miembros de EE. UU. 🇺🇸, Reino Unido 🇬🇧, Japón 🇯🇵, Alemania 🇩🇪, República Checa 🇨🇿, Noruega 🇳🇴, Bélgica 🇧🇪, Francia 🇫🇷, Austria 🇦🇹, Australia 🇦🇺, Polonia 🇵🇱, Países Bajos 🇳🇱, China 🇨🇳, y más que se unirán pronto. Estos testers aportan experiencia en desarrollo, casos de uso reales para el Openterface Mini-KVM y una pasión por apoyar proyectos de código abierto como el nuestro. Nuestro equipo beta ya está utilizando este práctico dispositivo en sus tareas diarias, planteando problemas y sugiriendo características para que podamos mejorar aún más.

+

Aunque la mayoría de ustedes no tienen esta versión temprana del mini-KVM, aún pueden revisar nuestro código en GitHub y unirse a la conversación con nuestros equipos beta y de desarrollo en nuestra comunidad. ¡Háganos saber lo que encuentran para que podamos hacer este dispositivo increíble juntos!

+

Aquí están las actualizaciones sobre nuestro repositorio de código abierto en GitHub:

+
Openterface_MacOS
+

Nuestra aplicación anfitriona Openterface MacOS ya está oficialmente en vivo en la Apple App Store. Solo busquen 'Openterface' o 'mini-KVM' para encontrar nuestra página de la aplicación. Aún mejor, hemos subido el código completo a nuestro repositorio de GitHub: Openterface_MacOS para el Mini-KVM. Pueden ver esta demostración de operación básica en MacOS.

+

openterface-macos-app-store

+
Openterface_QT
+

QT es un marco versátil que nos encanta, así que construimos nuestro mini-KVM basado en él. Para la versión de Windows, echen un vistazo a nuestro video de demostración temprana aquí. Pueden ver en la demostración que funciona genial con baja latencia y una conexión estable. Pueden encontrar y descargar la aplicación beta temprana desde el repositorio de GitHub allí.

+

openterface-win-app-demo-1

+

openterface-win-app-demo-2

+

En cuanto a los sistemas basados en Linux, empaquetar para diferentes arquitecturas como ARM32, ARM64, ARMv7 y ARMv8, especialmente para el Raspberry Pi, es todo un desafío (con horas y horas de espera para el empaquetado), pero estamos trabajando en ello. Esperen una demostración de Linux pronto, con suerte dentro de una semana.

+

Ahora, hemos subido todo nuestro código fresco para Openterface_QT en GitHub. ¡Sumérjanse y echen un vistazo, pero prepárense, todavía está en las primeras etapas de desarrollo, por lo que aún hay algunos inevitables problemas y trabajo por hacer para mejorarlo. No nos importaría una mano. Si eres desarrollador, únete a nosotros. ¡Feliz codificación!

+
Openterface_Android y Openterface_WebExtension
+

Hemos completado la prueba de concepto tanto para Android como para WebExtension. Aunque estas son prioridades más bajas en comparación con macOS, Windows y Linux, tengan la seguridad de que están en proceso. Según nuestra investigación preliminar, el proyecto Openterface_Android también podría soportar ChromeOS. Si tienen alguna idea, ¡únanse a la discusión!

+
¿Incluso para iPadOS?
+

También estamos explorando la compatibilidad con los sistemas móviles de Apple, como iPadOS. Debido a los estrictos controles de Apple, es posible que estas plataformas no soporten conexiones por cable con dispositivos de terceros. Sin embargo, estamos investigando posibles soluciones, especialmente para iPads con chips de la serie M. Nuestro compañero beta Seb ya ha hecho algunos hallazgos interesantes y esto vale la pena explorar más a fondo, aunque aún no hay nada confirmado. Si tienen alguna idea o sugerencia, únanse a nuestra comunidad y discutamos.

+

seb-explore-minikvm-for-ipados

+
Openterface_Mini-KVM_Hardware
+

Comenzaremos a liberar los detalles del hardware de manera incremental durante las próximas dos o tres semanas. Además, para mantener un alto estándar de código abierto, planeamos adherirnos a los requisitos de certificación de la Asociación de Hardware de Código Abierto (OSHWA).

+

Mientras tanto, pueden aprender más sobre nuestro hardware aquí: hoja de datos y Cómo Funciona por ahora. Esta página explica nuestra integración de captura USB-HDMI, con el chip CH9329 para el control de teclado y ratón. Los entusiastas técnicos pueden encontrar los detalles sobre este chip particularmente interesantes. Además, nuestro mini-KVM utiliza el chip CH340, que soporta dos hubs USB integrados tanto para el lado anfitrión como para el lado objetivo. Nuestro mini-KVM es comparable a muchas tarjetas de captura de video actualmente en el mercado.

+
¡Por favor, tengan paciencia!
+

Estamos trabajando arduamente aquí y en el proceso de liberar tanto nuestro software como hardware como código abierto. ¡Las cosas buenas toman tiempo en cocinarse! Los mantendremos actualizados sobre este progreso dentro de nuestra comunidad. ¡Gracias por su paciencia y comprensión! ¡Manténganse atentos y saludos!

+

Abordando Preocupaciones

+

Entendemos que algunas personas pueden ser escépticas, dado el número de proyectos de crowdfunding fraudulentos que existen. Aquí hay algunos puntos que podrían tranquilizarlos sobre nuestro proyecto de crowdfunding:

+
    +
  1. +

    Confíen en la Plataforma Crowd Supply: Esta es una de las principales plataformas de crowdfunding para productos electrónicos en los EE. UU. desde 2012. El equipo de Crowd Supply ha estado supervisando de cerca nuestro progreso de desarrollo del Openterface Mini-KVM y ofreciéndonos asesoramiento profesional para asegurarse de que lo que hemos estado creando sea justo para ustedes. ¡Un agradecimiento al equipo de Crowd Supply también! Además, pueden leer más sobre cómo se protegen sus derechos como patrocinadores en la plataforma Crowd Supply, incluyendo para nuestro proyecto: Guía de Crowd Supply: ¿Cómo están protegidos los patrocinadores? + > "Cada proyecto que ha recibido fondos a través de Crowd Supply ha entregado a sus patrocinadores (o está en camino de hacerlo). No están financiando el sueño de alguien; en Crowd Supply, están comprando un producto real."

    +
  2. +
  3. +

    Confíen en la Experiencia de Nuestro Equipo: Somos un grupo de desarrolladores versátiles, creadores hábiles y gerentes de proyectos y producción experimentados, especialmente en trabajos que involucran una combinación de desarrollo de hardware y software. Somos un estudio creativo tecnológico innovador con más de seis años de experiencia en proyectos tecnológicos avanzados en campos como IoT, IA, computación en el borde y arte tecnológico. Para saber más sobre nosotros, visiten nuestro sitio web TechxArtisan Studio.

    +
  4. +
  5. +

    Confíen en la Cultura de Nuestro Equipo: Nuestro equipo está dedicado no solo a la excelencia técnica, sino también a la experiencia general del usuario. Esto incluye todo, desde la documentación del usuario y del desarrollador hasta la estética del diseño. Nos apasiona la tecnología de vanguardia y frecuentemente participamos en discusiones animadas sobre nuevos avances desde diversas perspectivas. Estos debates nos ayudan a definir qué hace que un producto electrónico sea sobresaliente y cómo darle vida a través de nuestro trabajo en equipo. Este enfoque colaborativo asegura que nuestros productos mejoren la experiencia del usuario y demuestren nuestra dedicación a la calidad y el detalle. Además, abrazamos una cultura de código abierto y colaboración comunitaria.

    +
  6. +
  7. +

    Observen lo que Hemos Logrado y Estamos Haciendo: Hemos estado trabajando muy duro en este proyecto. Pueden unirse a nuestra comunidad en Reddit y Discord, ver lo que hemos estado creando desde el prototipo muy temprano hasta la versión actual de preproducción, y mantenerse informados sobre nuestro progreso actualizado. ¡Nos encantaría verlos en nuestra comunidad y que interactúen con nosotros!

    +
  8. +
  9. +

    Chateen con Nosotros Directamente: Si tienen alguna pregunta o inquietud sobre nuestro Mini-KVM, no duden en enviarme un correo electrónico a info@techxartisan.com. Además, estamos planeando una transmisión en vivo, presentada por David Groom de MAKE: Magazine el miércoles 29. Estaremos discutiendo nuestro Openterface Mini-KVM y la historia detrás de él. Publicaré el video más tarde en nuestra página de la comunidad.

    +
  10. +
+

Finalmente, entendemos totalmente si aún tienen dudas. ¡Está bien! Si su trabajo implica gestionar dispositivos sin cabeza, estamos seguros de que nuestros esfuerzos en la creación del Openterface Mini-KVM eventualmente los convencerán. ¡Esperen y verán! 😄

+

¿Qué Sigue?

+

Manténganse atentos para la actualización de la próxima semana, donde profundizaremos en más detalles sobre las funciones de nuestra aplicación anfitriona, su hoja de ruta, el progreso de producción, casos de uso reales compartidos por nuestro equipo beta y más. Mientras tanto, visiten nuestro sitio web Openterface y Preguntas Frecuentes, consideren apoyarnos en Crowd Supply y ayuden a difundir la palabra.

+

¡Gracias por leer y ser parte de este viaje con nosotros! ¡Paz!

+

Mejores deseos,

+

Billy Wang, Gerente de Proyecto

+

Equipo Openterface | TechxArtisan Studio

+ +
+
+ +
+
+ + + + +
+
+

¡La Campaña de Crowdfunding para el Openterface Mini-KVM Está en Vivo AHORA!

+

¡Estamos emocionados de anunciar que la campaña de crowdfunding para el Openterface Mini-KVM ya está en vivo! Este dispositivo rico en funciones, de código abierto y dirigido por la comunidad, simplifica la forma en que controlas e interactúas con computadoras sin pantalla.

+

Ofrece una solución KVM sobre USB compacta, ligera y rápida que elimina la necesidad de teclados, ratones, monitores o configuraciones de red adicionales. Puedes controlar una computadora sin pantalla directamente desde tu laptop o computadora de escritorio, simplificando tu configuración y mejorando tu flujo de trabajo.

+

¡Únete a nosotros para hacer tu vida tecnológica más fácil!

+

openterface-mini-kvm-wired-up-mini-kvm-angled-view

+

Una Herramienta Versátil para Diversas Necesidades en Movimiento

+

El Openterface Mini-KVM es el compañero perfecto para una amplia gama de usuarios y escenarios:

+
    +
  • Profesionales de TI solucionando problemas en servidores
  • +
  • Técnicos que dan servicio a cajeros automáticos, VLTs y quioscos
  • +
  • Desarrolladores gestionando dispositivos de computación en el borde
  • +
  • Entusiastas de la tecnología experimentando con computadoras de placa única
  • +
  • Profesionales que requieren operaciones locales seguras en la segregación de redes, como aquellos que gestionan activos de criptomonedas
  • +
  • Cualquiera que necesite integrar frecuentemente flujos de trabajo entre computadoras personales y de trabajo.
  • +
+

use-case-pc-angled-view

+

Impulsado por la Retroalimentación de la Comunidad

+

Nuestra aventura en la creación del Openterface Mini-KVM fue inspirada por nuestros propios desafíos y un deseo colectivo de una herramienta más efectiva. Con una historia rica en nuestro estudio TechxArtisan desarrollando proyectos de arte tecnológico y soluciones IoT al aire libre, a menudo enfrentamos el dilema de gestionar dispositivos en condiciones de red poco fiables sin el lujo de llevar equipo adicional. Impulsados por conversaciones con colegas y retroalimentación de una comunidad que comparte nuestras dificultades, nos propusimos crear un dispositivo que aborde estas necesidades de frente, facilitando el control de dispositivos sin pantalla de manera confiable y sin esfuerzo.

+

La Diferencia del Openterface Mini-KVM

+

Podrías preguntarte, con varias soluciones KVM disponibles, ¿por qué elegir el Openterface Mini-KVM? Aquí te decimos por qué:

+
    +
  1. +

    Compacto y Eficiente: Diseñado tanto para profesionales de TI como para entusiastas, nuestra solución KVM sobre USB brilla en entornos con acceso limitado o nulo a la red, ofreciendo una herramienta portátil, independiente de la red y rápida para la solución de problemas.

    +
  2. +
  3. +

    Asequibilidad: Hemos trabajado arduamente para hacer que el Openterface Mini-KVM sea más rentable que sus contrapartes, asegurando que esté al alcance de todos los que necesiten esta herramienta esencial para proyectos de trabajo o pasatiempos.

    +
  4. +
  5. +

    Dirigido por la Comunidad y de Código Abierto: En su núcleo, el Openterface Mini-KVM se trata de fomentar una comunidad de innovación y colaboración. Al abrazar los valores de código abierto, invitamos a los usuarios a contribuir con características personalizadas y mejoras, enriqueciendo las capacidades y versatilidad de la herramienta.

    +
  6. +
+

Mantente Conectado e Involucrado

+

Para mantenerte al día con los últimos desarrollos, recibir soporte técnico y conectarte con otros usuarios, te invitamos a visitar nuestra página de Pre-Lanzamiento en Crowd Supply, explorar nuestro sitio web en openterface.com, y unirte a nuestras comunidades en subreddit r/Openterface_miniKVM y Discord TechxArtisan.

+

Emprendamos juntos este emocionante viaje y revolucionemos la forma en que controlas dispositivos sin pantalla. ¡Únete a nosotros para hacer realidad el Openterface Mini-KVM!

+

¡Saludos!

+ +
+
+ + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/blog/pic/240823-0.jpg b/blog/pic/240823-0.jpg new file mode 100644 index 0000000..bf0f1cb Binary files /dev/null and b/blog/pic/240823-0.jpg differ diff --git a/blog/pic/240823-1.jpg b/blog/pic/240823-1.jpg new file mode 100644 index 0000000..17e9eb9 Binary files /dev/null and b/blog/pic/240823-1.jpg differ diff --git a/blog/pic/240823-2.jpg b/blog/pic/240823-2.jpg new file mode 100644 index 0000000..ad38764 Binary files /dev/null and b/blog/pic/240823-2.jpg differ diff --git a/blog/pic/240823-3.jpg b/blog/pic/240823-3.jpg new file mode 100644 index 0000000..e27db23 Binary files /dev/null and b/blog/pic/240823-3.jpg differ diff --git a/blog/pic/240823-4.jpg b/blog/pic/240823-4.jpg new file mode 100644 index 0000000..bcbd03a Binary files /dev/null and b/blog/pic/240823-4.jpg differ diff --git a/blog/pic/240823-5.jpg b/blog/pic/240823-5.jpg new file mode 100644 index 0000000..c494a3b Binary files /dev/null and b/blog/pic/240823-5.jpg differ diff --git a/blog/pic/240823-6.jpg b/blog/pic/240823-6.jpg new file mode 100644 index 0000000..b17eb77 Binary files /dev/null and b/blog/pic/240823-6.jpg differ diff --git a/blog/pic/240823-7.jpg b/blog/pic/240823-7.jpg new file mode 100644 index 0000000..73576a3 Binary files /dev/null and b/blog/pic/240823-7.jpg differ diff --git a/blog/pic/241001-1.jpeg b/blog/pic/241001-1.jpeg new file mode 100644 index 0000000..75868e4 Binary files /dev/null and b/blog/pic/241001-1.jpeg differ diff --git a/blog/pic/241001-2.jpg b/blog/pic/241001-2.jpg new file mode 100644 index 0000000..3614095 Binary files /dev/null and b/blog/pic/241001-2.jpg differ diff --git a/blog/pic/241022-1.webp b/blog/pic/241022-1.webp new file mode 100644 index 0000000..1cb3fef Binary files /dev/null and b/blog/pic/241022-1.webp differ diff --git a/blog/pic/241022-2.webp b/blog/pic/241022-2.webp new file mode 100644 index 0000000..5bc92a6 Binary files /dev/null and b/blog/pic/241022-2.webp differ diff --git a/blog/pic/241022-3.webp b/blog/pic/241022-3.webp new file mode 100644 index 0000000..69fc102 Binary files /dev/null and b/blog/pic/241022-3.webp differ diff --git a/blog/pic/241022-4.webp b/blog/pic/241022-4.webp new file mode 100644 index 0000000..6297f8f Binary files /dev/null and b/blog/pic/241022-4.webp differ diff --git a/blog/pic/241022-5.webp b/blog/pic/241022-5.webp new file mode 100644 index 0000000..774a55c Binary files /dev/null and b/blog/pic/241022-5.webp differ diff --git a/blog/pic/241022-6.webp b/blog/pic/241022-6.webp new file mode 100644 index 0000000..e173b0b Binary files /dev/null and b/blog/pic/241022-6.webp differ diff --git a/blog/pic/241107-0.jpg b/blog/pic/241107-0.jpg new file mode 100644 index 0000000..f2932a0 Binary files /dev/null and b/blog/pic/241107-0.jpg differ diff --git a/blog/pic/241107-1.jpg b/blog/pic/241107-1.jpg new file mode 100644 index 0000000..d8fbd1f Binary files /dev/null and b/blog/pic/241107-1.jpg differ diff --git a/blog/pic/241107-2.jpg b/blog/pic/241107-2.jpg new file mode 100644 index 0000000..31511a1 Binary files /dev/null and b/blog/pic/241107-2.jpg differ diff --git a/blog/pic/241107-3.jpg b/blog/pic/241107-3.jpg new file mode 100644 index 0000000..6f1b58a Binary files /dev/null and b/blog/pic/241107-3.jpg differ diff --git a/blog/pic/241107-4.png b/blog/pic/241107-4.png new file mode 100644 index 0000000..3128d35 Binary files /dev/null and b/blog/pic/241107-4.png differ diff --git a/blog/pic/241107-c.jpg b/blog/pic/241107-c.jpg new file mode 100644 index 0000000..afb04aa Binary files /dev/null and b/blog/pic/241107-c.jpg differ diff --git a/blog/pic/241107-p.jpg b/blog/pic/241107-p.jpg new file mode 100644 index 0000000..bdbec85 Binary files /dev/null and b/blog/pic/241107-p.jpg differ diff --git a/blog/pic/241107-s.jpeg b/blog/pic/241107-s.jpeg new file mode 100644 index 0000000..87a19bc Binary files /dev/null and b/blog/pic/241107-s.jpeg differ diff --git a/blog/pic/241120-Black-Firday-poster-50.jpg b/blog/pic/241120-Black-Firday-poster-50.jpg new file mode 100644 index 0000000..f88d4ad Binary files /dev/null and b/blog/pic/241120-Black-Firday-poster-50.jpg differ diff --git a/blog/pic/241120-OP-Hoodie-Zip-Up.jpg b/blog/pic/241120-OP-Hoodie-Zip-Up.jpg new file mode 100644 index 0000000..6713ba0 Binary files /dev/null and b/blog/pic/241120-OP-Hoodie-Zip-Up.jpg differ diff --git a/blog/pic/241120-david-billy-wearing-hoodie.webp b/blog/pic/241120-david-billy-wearing-hoodie.webp new file mode 100644 index 0000000..3f23fa1 Binary files /dev/null and b/blog/pic/241120-david-billy-wearing-hoodie.webp differ diff --git a/blog/pic/241120-txa-shop-op-accessories.jpg b/blog/pic/241120-txa-shop-op-accessories.jpg new file mode 100644 index 0000000..640c822 Binary files /dev/null and b/blog/pic/241120-txa-shop-op-accessories.jpg differ diff --git a/blog/pic/241120-txa-shop-op-merch.jpg b/blog/pic/241120-txa-shop-op-merch.jpg new file mode 100644 index 0000000..271fc1a Binary files /dev/null and b/blog/pic/241120-txa-shop-op-merch.jpg differ diff --git a/blog/pic/openterface-241017-03_jpg_md-xl.jpg b/blog/pic/openterface-241017-03_jpg_md-xl.jpg new file mode 100644 index 0000000..61cca11 Binary files /dev/null and b/blog/pic/openterface-241017-03_jpg_md-xl.jpg differ diff --git a/blog/pic/usb-kvm-diy-2024-logo.svg b/blog/pic/usb-kvm-diy-2024-logo.svg new file mode 100644 index 0000000..9b13c83 --- /dev/null +++ b/blog/pic/usb-kvm-diy-2024-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git "a/blog/superando-obst\303\241culos-actualizaci\303\263n-de-progreso-y-nueva-l\303\255nea-de-tiempo/index.html" "b/blog/superando-obst\303\241culos-actualizaci\303\263n-de-progreso-y-nueva-l\303\255nea-de-tiempo/index.html" new file mode 100644 index 0000000..9342424 --- /dev/null +++ "b/blog/superando-obst\303\241culos-actualizaci\303\263n-de-progreso-y-nueva-l\303\255nea-de-tiempo/index.html" @@ -0,0 +1,2192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Superando Obstáculos: Actualización de Progreso y Nueva Línea de Tiempo - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + + + + + + + + +
+
+
+
+ + + + + + +
+
+
+
+ + + + + + + + + + +

Superando Obstáculos: Actualización de Progreso y Nueva Línea de Tiempo

+

Hola a todos,

+

Espero que estén bien. Ha pasado un tiempo desde nuestra última actualización. Me gustaría decir que todo ha ido sobre ruedas para Openterface, pero hemos encontrado algunos obstáculos que retrasarán nuestro cronograma de entrega. Aunque no era lo que esperábamos, estamos enfrentando estos desafíos de frente y avanzando con paso firme, con muchas buenas noticias para compartir. Esta publicación es una lectura de aproximadamente 7 minutos, así que vamos a los detalles para que sepan exactamente en qué punto estamos y qué viene a continuación.

+

Regulación, Producción y Calidad

+

Antes de comenzar la producción, tuvimos que pasar las pruebas de calidad necesarias según las regulaciones, en particular la certificación CE. Dado que nuestra versión del kit incluye no solo el Mini-KVM sino también varios accesorios, cada parte necesitaba pasar las pruebas CE. Estas pruebas tomaron más tiempo del esperado (resulta que los cables pueden ser bastante exigentes), pero la buena noticia es que hemos pasado la certificación CE para nuestro Mini-KVM y todos sus componentes! A continuación, un resumen de las certificaciones para todas nuestras partes: Mini-KVM, cable HDMI, cable naranja Tipo-C, cable corto negro Tipo-C y cable VGA2HDMI. Con la certificación en mano, nuestro cronograma de producción ahora es seguro, y nuestros fabricantes están produciendo todas las partes mientras hablo.

+

240823-0 +Los requisitos de UKCA y CE son los mismos para nuestros productos electrónicos, con CE también cubriendo el cumplimiento de RoHS.

+

Hace dos semanas, visitamos a uno de nuestros fabricantes para capacitar a sus gerentes de línea en el control de calidad de los cables naranjas antes de que nos los enviaran. Ahora, TODOS los cables naranjas han sido producidos y están en un rincón de nuestro estudio. +240823-1 +Kevin y Shawn explicaban los métodos de prueba para asegurar que el cable naranja funcione correctamente con nuestro Mini-KVM de Openterface.

+

Haremos la misma tarea esta semana para capacitar al equipo de control de calidad en la línea de producción para las otras partes también. Aquí hay muestras de cables adicionales. +240823-2 +Marcados con orgullo con nuestro logo TechxArtisan, estas son muestras del cable HDMI, el cable corto Tipo-C y el cable VGA a HDMI.

+

Esperamos que las otras partes y los Mini-KVMs lleguen pronto de nuestros fabricantes, momento en el cual revisaremos la calidad de cada componente y los empaquetaremos adecuadamente en nuestro estudio antes del envío. En otras palabras, nuestro equipo se asegurará personalmente de la calidad antes de que llegue a sus manos.

+

Envío, Posibles Retrasos y Nueva ETA

+

La incertidumbre actual radica en el proceso de envío. Después de investigar varias compañías de envío, descubrimos que el envío tomará más tiempo ya que probablemente transferiremos los paquetes a través de un almacén antes de llegar al almacén de Crowd Supply. Todavía estamos debatiendo si elegir transporte marítimo o aéreo—por favor, tengan paciencia con nosotros unos días más mientras resolvemos los arreglos.

+

El despacho de aduanas es otro posible obstáculo que podría causar retrasos inesperados. Una vez que nuestros productos lleguen al almacén de Crowd Supply en los EE. UU., tomarán de una a dos semanas para enviarse globalmente según cada pedido. Para los patrocinadores fuera de los EE. UU., los paquetes individuales aún necesitarán pasar por el envío global y el despacho de aduanas en el país de destino.

+

Teniendo en cuenta la situación actual y añadiendo algo de tiempo de reserva, sigo siendo cautelosamente optimista de que completaremos la entrega antes de fin de año, con una nueva ETA a mediados de enero. Lamento sinceramente los inconvenientes y agradezco su apoyo y paciencia durante este cambio.

+

Hardware Finalizado V1.9

+

Como saben por nuestra anterior publicación en Reddit, decidimos actualizar nuestro hardware a V1.9, incluyendo un conjunto de pines de expansión hackeables. Esto no formaba parte del plan original para la campaña de crowdfunding, pero creemos que mejora significativamente el potencial de uso más amplio del hardware.

+

240823-3 +Los pines VCC, GND, Target D+, Target D-, Host D+ y Host D-—donde 'D' significa datos USB.

+

Una motivación clave fue permitir que el interruptor USB se pueda activar a nivel de software. ¿Por qué es esto importante? En nuestra hoja de ruta, apuntamos a soportar una solución KVM-over-IP, como VNC, en el futuro. La idea es combinar el control local de KVM con el protocolo VNC, permitiendo a los usuarios controlar remotamente la computadora objetivo a través de la computadora anfitriona. En un escenario remoto como este, la capacidad de los usuarios para cambiar el puerto USB es esencial, especialmente cuando se requieren transferencias de archivos entre el anfitrión y el objetivo.

+

Los pines de expansión también abren posibilidades para más, como la integración con iPadOS, control ATX, puenteo de red y bypass de audio. Aunque no entraré en todos los detalles aquí, les animo a unirse a nuestra comunidad de Openterface para discutir más con nosotros.

+

Esta actualización de hardware podría extender potencialmente nuestra solución Openterface para operar sobre IP e incluir características más avanzadas, manteniendo su fortaleza principal como una herramienta KVM-over-USB plug-and-play—perfecta para profesionales de TI navegando en entornos de TI inciertos, como centros de datos desconocidos.

+

Me complace informar que V1.9 ha pasado nuestras pruebas básicas internas y se finalizará como la versión oficial para todos nuestros patrocinadores. Sin embargo, esta actualización de hardware requerirá más pruebas, y cualquier desarrollo basado en estos pines de expansión será experimental y probablemente tenga errores. Aquí es donde pueden contribuir. Contamos con la comunidad de código abierto para ayudarnos a mejorar Openterface juntos.

+

Más Actualizaciones de Software

+

En el frente del software, estamos haciendo avances emocionantes. ¡Estamos sumergiéndonos en la aplicación Openterface para Android ahora! Echen un vistazo a este tweet para una demostración temprana que muestra el control KVM suave, el movimiento del ratón y los clics en acción. Más características están en camino, y como siempre, una vez que hayamos pulido un poco más el código, esta aplicación también será de código abierto en nuestro repositorio de GitHub Openterface_Android. +240823-4 +Usando solo nuestros dedos para controlar un ordenador Linux desde una tableta Android. ¡Genial!

+

Nuestra versión QT acaba de recibir una actualización útil—¡ahora pueden transferir texto del anfitrión al objetivo! Así que ahora esta característica es compatible con las aplicaciones anfitrionas en macOS, Windows y Linux.

+

Además, también estamos planeando agregar una función divertida—un movimiento automático del ratón para evitar que su computadora objetivo se duerma. ¿Deberíamos optar por la pelota de ping-pong rebotando por la pantalla o el clásico efecto de salvapantallas de DVD? Voten y comenten en el tweet 😃

+

Diseño de Paquete, Etiquetado y Manual

+

Hemos estado experimentando con varios prototipos y diseños de empaques para encontrar el equilibrio perfecto entre varios factores clave:

+
    +
  • Seleccionar materiales lo suficientemente resistentes para proteger el producto y sus partes durante el envío,
  • +
  • Crear etiquetas informativas que ayuden a los usuarios a entender el producto de un vistazo,
  • +
  • Asegurar el cumplimiento de las regulaciones,
  • +
  • Hacer que el empaque sea visualmente atractivo,
  • +
  • Y ser ecológicos minimizando el uso de plástico siempre que sea posible.
  • +
+

Además, hemos realizado varias mejoras en la antigua bolsa del kit, incluyendo:

+
    +
  • Mayor espacio de almacenamiento,
  • +
  • Una cremallera naranja elegante,
  • +
  • Materiales exteriores e interiores mejorados,
  • +
  • Y un bolsillo de malla súper elástico.
  • +
+

Elegimos este material porque logra el equilibrio ideal entre ser económico, agradable al tacto y lo suficientemente duradero para proteger los artículos en su interior. Estamos seguros de que les encantará.

+

240823-5

+

También estamos actualizando las etiquetas en la carcasa de aluminio para hacerlas lo más informativas y visualmente atractivas posible. Esperamos que estas mejoras mejoren su experiencia de usuario y faciliten el inicio con Openterface.

+

240823-6

+

Estamos finalizando el manual de Openterface, que estará disponible en inglés, alemán, francés, japonés y chino. Disculpen si no incluimos su idioma—¡nuestra caja no es del tamaño de la TARDIS (la cabina de policía del Doctor Who)! Pero haremos nuestro mejor esfuerzo para agregar más traducciones en nuestro sitio web.

+

240823-7

+

Revisión de Idiomas por la Comunidad

+

He estado usando ChatGPT para ayudar con las traducciones, pero a veces puede fallar con la redacción y el fraseo. Si no es mucha molestia, agradecería enormemente cualquier ayuda para revisar el contenido en otros idiomas, especialmente para los materiales impresos que estamos a punto de finalizar. He actualizado todo el contenido de texto para el empaque en nuestra carpeta de GitHub product-printed-materials, donde pueden revisar y enviar cualquier mejora. También pueden enviarme un mensaje directo. ¡Gracias!

+

Comentarios Finales y Progreso Continuo

+

Nos disculpamos nuevamente por los retrasos y el cambio en la ETA de nuestro producto. ¡Gracias por su paciencia y por seguir con nosotros—estamos trabajando duro para entregarlo lo antes posible! Les actualizaré inmediatamente una vez que nuestro envío esté arreglado. Más actualizaciones están en camino, así que por favor únanse a nuestra comunidad de Openterface y manténganse atentos.

+

Saludos,

+

Billy Wang
+Gerente de Producto
+Equipo Openterface | TechxArtisan

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/blog/te-animas-a-un-desaf\303\255o-diy-acomp\303\241\303\261anos-en-el-show--tell-de-oshwa/index.html" "b/blog/te-animas-a-un-desaf\303\255o-diy-acomp\303\241\303\261anos-en-el-show--tell-de-oshwa/index.html" new file mode 100644 index 0000000..20e79c2 --- /dev/null +++ "b/blog/te-animas-a-un-desaf\303\255o-diy-acomp\303\241\303\261anos-en-el-show--tell-de-oshwa/index.html" @@ -0,0 +1,2063 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ¿Te animas a un desafío DIY? ¡Acompáñanos en el Show & Tell de OSHWA! - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + + + + + + + + +
+
+
+
+ + + + + + +
+
+
+
+ + + + + + + + + + +

¿Te animas a un desafío DIY? ¡Acompáñanos en el Show & Tell de OSHWA!

+

poster-1 +poster-2

+

Hola a todos, estaré presentando el Desafío DIY de USB KVM 2024 durante el Show & Tell de OSHWA a las 10:40 PM EST el 2 de octubre. ¡Si te interesa, no olvides unirte! ¡Gracias!

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/blog/\303\272ltimas-horas-para-apoyar-y-mini-kvms-en-la-vanguardia-tecnol\303\263gica/index.html" "b/blog/\303\272ltimas-horas-para-apoyar-y-mini-kvms-en-la-vanguardia-tecnol\303\263gica/index.html" new file mode 100644 index 0000000..31a4912 --- /dev/null +++ "b/blog/\303\272ltimas-horas-para-apoyar-y-mini-kvms-en-la-vanguardia-tecnol\303\263gica/index.html" @@ -0,0 +1,2126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Últimas Horas para Apoyar y Mini-KVMs en la Vanguardia Tecnológica - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + + + + + + + + +
+
+
+
+ + + + + + +
+
+
+
+ + + + + + + + + + +

Últimas Horas para Apoyar y Mini-KVMs en la Vanguardia Tecnológica

+

¡Hola a todos!

+

Queríamos compartir algunas actualizaciones emocionantes de nuestro equipo beta en nuestro canal de Discord! Nuestro Mini-KVM de Openterface está funcionando de maravilla en la vanguardia tecnológica, y tenemos unas imágenes fantásticas para mostrarles. ¡Échenles un vistazo y vean de qué se trata todo el alboroto!

+

cam-share

+

catenane-share

+

kashall-share

+

kazubu-share

+

nkahoang-share

+

🚨 ¡Última Oportunidad! 🚨

+

¡El tiempo se acaba! No pierdas la oportunidad de apoyarnos en Crowd Supply y conseguir el Mini-KVM de Openterface a un precio súper accesible de $79 - $99. La campaña termina el 13 de junio de 2024 a las 4:59 PM PDT, y los precios aumentarán después de la campaña a medida que el producto madure. ¡Así que actúa ahora y aprovecha esta oferta!

+

Próximo Evento Teardown 2024 y Una Apuesta Divertida

+

Como muchos de ustedes han visto en la página principal de Crowd Supply, el próximo evento Teardown 2024 está generando mucha emoción. ¡Estoy ansioso por asistir en persona y conocer a nuestros increíbles patrocinadores allí!

+

Aquí hay una apuesta divertida que tenemos en nuestro equipo:

+

Actualmente, tenemos alrededor de 950 patrocinadores para nuestro proyecto. Kevin Peng, nuestro director técnico, y yo tenemos una apuesta. Si logramos conseguir 100 patrocinadores más en las últimas horas, los gastos de mi viaje a Portland serán cubiertos por nuestro estudio. Si no, tendré que pagar yo mismo, lo que significa unos cuantos miles de dólares de mi propio bolsillo.

+

Así que, hago un llamado a todos nuestros suscriptores y nuevos amigos del Mini-KVM de Openterface para que nos ayuden a superar estas últimas horas. ¡Vamos a alcanzar más de 1050 patrocinadores y hacer que este viaje suceda!

+

Lo más importante, por favor ayuden a correr la voz sobre nuestra campaña que está llegando a su fin. Estamos comprometidos a construir este dispositivo útil y asegurarnos de que se entregue a ustedes con la mejor calidad.

+

Hemos puesto todo nuestro corazón en este proyecto durante los últimos 8 meses. Pueden ver todos nuestros esfuerzos en las actualizaciones a continuación y revisar nuestras publicaciones históricas en nuestro subreddit r/Openterface_miniKVM:

+ +

¡Así que apóyanos en estas últimas horas! ¡Saludos!

+

Billy Wang
+Gerente de Proyecto
+Equipo Openterface

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/community/index.html b/community/index.html new file mode 100644 index 0000000..6038538 --- /dev/null +++ b/community/index.html @@ -0,0 +1,14 @@ + + + + + + Redirecting... + + + + + +You're being redirected to a new destination. + + diff --git a/comparison/index.html b/comparison/index.html new file mode 100644 index 0000000..1f27fbc --- /dev/null +++ b/comparison/index.html @@ -0,0 +1,2179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Comparación - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + + + + +

Comparación

+

¿En qué se diferencia este Mini-KVM del KVM-over-IP?

+
    +
  1. Independencia de la Red: Nuestro Openterface mini-KVM utiliza una conexión USB directa para el control, mientras que el KVM-over-IP depende de la conectividad de red, lo que requiere un esfuerzo y tiempo adicionales para configurarse en nuevos dispositivos objetivo.
  2. +
  3. Rendimiento Estable: El Mini-KVM ofrece un rendimiento rápido y estable sin verse afectado por la calidad de la red, a diferencia del KVM-over-IP, que puede verse impactado por la velocidad y estabilidad de la red.
  4. +
  5. Portabilidad: El Mini-KVM está diseñado para ser portátil y fácil de usar con dispositivos cercanos sin pantalla, lo que lo hace ideal para situaciones inciertas donde el acceso a la red es limitado o inexistente.
  6. +
  7. Transferencia Directa de Archivos: El Mini-KVM permite transferencias de archivos estables entre el host y los dispositivos objetivo a través de un puerto USB-A conmutador, conectando una memoria USB. Esta es una característica que puede no ser tan sencilla con algunas soluciones KVM-over-IP.
  8. +
  9. Público Objetivo: El Mini-KVM es especialmente adecuado para entusiastas de la tecnología y profesionales de TI que necesitan una solución rápida y confiable para configurar o solucionar problemas en dispositivos cercanos sin pantalla, mientras que el KVM-over-IP se utiliza a menudo en entornos con una red estable donde el acceso remoto por IP es una prioridad.
  10. +
+

¿En qué se diferencia de las soluciones KVM tradicionales?

+
    +
  1. Portabilidad: El Openterface Mini-KVM está diseñado para ser portátil, lo que lo hace ideal para entusiastas de la tecnología y profesionales de TI que necesitan una solución compacta. Es lo suficientemente pequeño y elegante como para llevarlo en tu mochila. Los conmutadores KVM tradicionales tienden a ser más grandes y están diseñados para configuraciones estacionarias de operación 24/7.
  2. +
  3. Mecanismo de Control e Integración: Los conmutadores KVM tradicionales utilizan mecanismos de conmutación basados en hardware puro, permitiendo el control de solo una computadora a la vez. En contraste, el Openterface Mini-KVM combina hardware y software, permitiendo el control tanto del host como de los dispositivos objetivo a través de una única interfaz en la computadora o laptop del host. Este enfoque integrado facilita la conmutación fluida entre el host y el objetivo a nivel de ventana de la aplicación, mejorando significativamente la eficiencia del flujo de trabajo.
  4. +
  5. Funcionalidad: Mientras que el Openterface Mini-KVM se enfoca en el control directo 1-a-1 a través de USB y captura de video HDMI, los conmutadores KVM tradicionales pueden ofrecer una gama más amplia de funcionalidades, incluyendo control de múltiples dispositivos a través de USB, VGA, DVI, HDMI, soporte de audio y, a veces, incluso capacidades de acceso remoto a través de la red.
  6. +
  7. Fuente de Alimentación: El mini-KVM no requiere una fuente de alimentación externa, ya que está diseñado para ser alimentado a través de sus conexiones USB-C desde el host, mejorando su portabilidad. Los KVM tradicionales son soluciones estacionarias que necesitan una fuente de alimentación adicional.
  8. +
+

Comparación entre nuestro Mini-KVM, KVM tradicional y VNC

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Categoría de ComparaciónOpenterface Mini-KVMConmutador KVM TradicionalVNC Tradicional
🎮 Método y LimitaciónLocal, limitado por cableLocal, limitado por cableLocal/Remoto, limitado por red
🚀 PortabilidadAltamente portátil, fácil de configurarEstacionario, voluminosoBasado en software, no aplicable
🛠️ Complejidad de InstalaciónPlug-and-play, configuración mínimaConfiguración moderada, periféricos requeridosConfiguración de red y software, compleja
🖥️ Interfaz de ControlInterfaz de software del hostInterfaz de conmutador físicoInterfaz de software del host
👁️ Interfaz de UsuarioIntuitiva basada en aplicaciónConmutación física, sin softwareInterfaz de software variable
🔄 Compatibilidad entre SOTotalmente compatible con múltiples SODepende del modelo y las conexionesSe requiere software compatible
🖼️ Resolución de PantallaAlta calidad vía HDMIVaría con el cable y el KVMVaría con el software y la red
🔑 Acceso a BIOSNo
📁 Transferencia de ArchivosBasada en hardware vía su USB-A conmutadorNo disponibleBasada en software, dependiente de la red
💻 Soporte Multi-Dispositivo1-a-1, por un host y dependiente del hardware1-a-N, por una configuración físicaN-a-N, por red y dependiente del software
🔌 Cables y AccesoriosMenos cables (HDMI, Tipo-C a USB-A)Múltiples (Cable de video, teclado, ratón, etc.)Red requerida
📱 SoftwareSe requiere aplicación host para macOSNo se requiere software adicional para operación básicaSoftware cliente en ambos host y objetivo
⚡️ Fuente de AlimentaciónNo se necesita fuente de alimentación externaA menudo se requiere fuente de alimentación externaNo aplicable (basado en software)
+

Nuestra tabla de comparación anterior está diseñada para proporcionar una visión clara de cómo cada solución se alinea con diferentes necesidades de los usuarios, ayudándote a elegir la opción más adecuada para tu configuración única.

+

En resumen, el Openterface Mini-KVM destaca por su portabilidad, facilidad de instalación y la intuitiva interfaz de control basada en aplicaciones. Sobresale en proporcionar una conexión estable y de alta calidad para una interacción uno a uno entre el host y el objetivo sin requerir red ni alimentación externa. En contraste, las soluciones KVM tradicionales ofrecen conmutación física entre múltiples dispositivos, pero a menudo a costa de la portabilidad y la simplicidad de configuración. VNC, aunque flexible al permitir que múltiples hosts se conecten a múltiples dispositivos a través de una red, depende en gran medida del software y la calidad de la red.

+ + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/contact/index.html b/contact/index.html new file mode 100644 index 0000000..2d6d309 --- /dev/null +++ b/contact/index.html @@ -0,0 +1,2076 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Contacto - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + + +

Contáctanos

+

Nos alegra que estés interesado en ponerte en contacto con nosotros. Ya sea que tengas preguntas, comentarios o simplemente quieras saludarnos, aquí tienes varias formas de comunicarte con nosotros:

+

Correos Electrónicos Oficiales

+

Para asegurarte de que te estás comunicando con nosotros de manera segura y directa, ten en cuenta nuestras direcciones de correo electrónico oficiales. Para cualquier consulta, soporte o comentario, no dudes en escribirnos a:

+ +

Además, cualquier dirección de correo electrónico que termine con los siguientes dominios es reconocida como un canal de comunicación oficial para nuestros miembros y clientes:

+
    +
  • Dominio TechxArtisan: *@techxartisan.com
  • +
  • Dominio Openterface: *@openterface.com
  • +
+

Los correos electrónicos provenientes de estas direcciones son de nuestro equipo, dedicado a brindarte el soporte e información que necesitas.

+

Síguenos en Redes Sociales

+

Mantente al día y en contacto con nosotros a través de nuestras redes sociales:

+ +

Visita Nuestro Sitio Web

+

Para más información sobre nosotros, nuestro trabajo y productos, por favor visita nuestro sitio web:

+ +

Marca Registrada y Propiedad del Dominio

+

Openterface y TechxArtisan son marcas registradas de Guangzhou Billio Technology Co., Ltd. (Billio Tech), que actúa como nuestra entidad comercial oficial. Billio Tech tiene los derechos interpretativos finales para ambas marcas, Openterface y TechxArtisan.

+

El dominio Openterface.com está registrado bajo Billio Tech, lo que confirma nuestra propiedad y gestión de todas las comunicaciones y operaciones oficiales asociadas.

+

Sobre Nuestra Empresa

+
    +
  • Nombre de la Empresa: Guangzhou Billio Technology Co., Ltd.
  • +
  • Dirección: Room 11, No. 1, Longjing North Street, Haizhu District, Guangzhou City, Guangdong Province, 510320 China
  • +
  • Información de Contacto: info@techxartisan.com
  • +
+ + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/contributing/index.html b/contributing/index.html new file mode 100644 index 0000000..fdd242b --- /dev/null +++ b/contributing/index.html @@ -0,0 +1,2143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Contribuir - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + + +

Contribuir

+

¡Hola! ¿Te interesa unirte a la comunidad de Openterface mini-KVM y contribuir? ¡Genial! 🧡

+

Difundir la Palabra 📢

+

Si has encontrado útil nuestro gadget Openterface y ha mejorado tu flujo de trabajo, ¿qué tal si ayudas a correr la voz? Compartir tu historia de cómo usas el mini-KVM en tus tareas diarias con fotos o videos será muy apreciado. Ya sea un evento de reparación rápida, una configuración genial o una integración única en tu flujo de trabajo, ¡queremos verlo todo! Incluso podrías escribir una publicación para compartir en nuestra vibrante comunidad en nuestro subreddit en /r/Openterface_miniKVM/ o en nuestro servidor de Discord TechxArtisan. ¡Hagamos ruido juntos! 🚀 ¡Salud!

+

Cómo Puedes Contribuir 🌟

+

Nos encanta mantener este proyecto fresco y divertido para nuestra diversa comunidad de usuarios. ¡Siempre estamos mejorando y arreglando errores para mantener la fiesta en marcha!

+

Tu tiempo es valioso, lo entendemos, y sumergirse en informes de errores y solicitudes de cambios puede sentirse como caminar en arenas movedizas. Por eso hemos afinado nuestros plantillas de problemas y directrices para facilitarte las cosas. Sí, hemos cuidado los detalles para asegurarnos de que nuestro rastreador de problemas de software y hardware y foro de discusión funcione como una máquina bien engrasada.

+

¿Listo para sumergirte? ¡Vamos a empezar! 🏊‍♂️

+

Reportar un Error 🐛

+

¿Encontraste un error? No te preocupes, ¡pasa! Como aún estamos en las primeras etapas de desarrollo, se esperan errores, especialmente en los siguientes softwares. Cuando encuentres uno, por favor verifica si cae en estas pruebas de operación básica. Cuantos más detalles proporciones sobre las condiciones en las que ocurrió el error, mejor equipados estaremos para solucionarlo. Por favor, reporta cualquier error que encuentres en los repositorios correspondientes de Github.

+
    +
  • +

    Navega a:

    + +
  • +
  • +

    Al reportar un error, por favor:

    +
      +
    • Especifica la versión de la aplicación.
    • +
    • Describe el entorno tanto de la computadora host como del dispositivo objetivo.
    • +
    • Proporciona pasos detallados para reproducir el problema.
    • +
    • Explica el resultado esperado y el resultado real.
    • +
    • ¡Incluir capturas de pantalla o fragmentos de video sería muy apreciado! 📸🎥
    • +
    +
  • +
+

Además, también puedes unirte al canal de Desarrollo #openterface-dev en nuestro servidor de Discord, o puedes intentar buscar 'TechxArtisan'.

+

Siéntete libre de plantear cualquier problema. Es un gran lugar para que todos los beta testers discutan y compartan, lo que realmente podría ayudarnos a mejorar el producto.

+

Arreglar un Error 🛠️

+

Si tienes habilidades de programación y experiencia, considera sumergirte en nuestro repositorio para identificar, bifurcar, arreglar y enviar solicitudes de extracción.

+

Reportar un Problema en la Documentación 📝

+

Si notas algo que parece incorrecto o desactualizado, nos encantaría tu ayuda para mejorarlo.

+

Aquí te explicamos cómo puedes ayudar:

+
    +
  • Detecta el Problema: Si ves algo que no parece correcto en nuestra documentación, ¡háznoslo saber!
  • +
  • Proporciona Detalles: Cuéntanos qué está mal. Ya sea un error tipográfico, información desactualizada o una explicación confusa, cada detalle ayuda.
  • +
  • Sugiere Mejoras: Si tienes ideas sobre cómo mejorar las cosas, ¡no te las guardes! Tus ideas son invaluables para mejorar la experiencia del usuario.
  • +
  • Cómo Reportar: Simplemente dirígete a nuestro repositorio correspondiente en GitHub y crea un problema detallando el problema. Incluye tanta información como sea posible para ayudarnos a entender y abordar el problema rápidamente.
  • +
+

Tus contribuciones para mejorar nuestra documentación son realmente apreciadas. Juntos, podemos asegurar que los usuarios tengan acceso a los mejores recursos posibles.

+

Ayuda a Traducir Nuestra Documentación 🌍

+

Creemos que todos deberían tener acceso a nuestra solución, sin importar el idioma que hablen. Por eso estamos buscando superestrellas bilingües como tú para ayudar a traducir nuestro sitio web y documentación a diferentes idiomas.

+

Si hablas varios idiomas con fluidez y te apasiona hacer que la tecnología sea accesible para personas de todo el mundo, ¡nos encantaría tu ayuda!

+

Ponte en contacto con nosotros para saber cómo puedes convertirte en un embajador de idiomas para Openterface Mini-KVM y ayudarnos a llegar a más personas con nuestra solución.

+

Ayuda a Mejorar el Diseño 🎨

+

Las primeras impresiones importan, y el atractivo visual de nuestro producto juega un papel crucial en captar la atención de los usuarios y mejorar su experiencia general. Si tienes buen ojo para el diseño y habilidad para crear visuales impresionantes, nos encantaría tu ayuda para mejorar los gráficos de nuestro producto.

+

Ya sea creando logotipos llamativos, diseñando interfaces de usuario elegantes para nuestras aplicaciones host, creando materiales de marketing atractivos, o diseño 3D para varias carcasas geniales, tu toque creativo puede llevar la estética de nuestro producto al siguiente nivel.

+

Si estás listo para el desafío y ansioso por hacer un impacto visual, ponte en contacto con nosotros para explorar cómo puedes aportar tu experiencia en diseño para elevar el atractivo de nuestro producto.

+

Ayuda a Moderar Nuestra Comunidad 🤝

+

Nuestra comunidad es como una gran familia amigable, y estamos buscando personas increíbles como tú para ayudar a mantenerla así. Si te interesa mantener la paz y difundir buenas vibras, nos encantaría tenerte como moderador.

+

Como moderador, tú:

+
    +
  • Mantendrás las conversaciones positivas y ayudarás a resolver cualquier disputa.
  • +
  • Asegurarás que todos sigan las reglas para que nuestra comunidad se mantenga segura y acogedora.
  • +
  • Ayudarás a los usuarios con preguntas y animarás a las personas a compartir su conocimiento.
  • +
+

¿Te suena bien? Ponte en contacto y hablemos sobre cómo puedes unirte a nuestro equipo de moderadores.

+

Y Más Ayuda 🚀

+

¿Te sientes inspirado para contribuir pero no encajas en las categorías anteriores? No te preocupes, hay muchas otras formas en las que puedes echar una mano.

+

Ya sea probando nuevas funciones, proporcionando comentarios sobre la experiencia del usuario, o proponiendo ideas innovadoras, tu aporte es invaluable para el éxito de Openterface Mini-KVM.

+

Ponte en contacto con nosotros a través de email y cuéntanos cómo te gustaría involucrarte. Juntos, ¡podemos hacer que Openterface Mini-KVM sea lo mejor posible!

+

Tu apoyo y contribuciones son lo que hacen que Openterface Mini-KVM prospere. ¡Gracias por ser parte de nuestro viaje hacia la excelencia! 🚀

+ + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/discord/index.html b/discord/index.html new file mode 100644 index 0000000..146b838 --- /dev/null +++ b/discord/index.html @@ -0,0 +1,14 @@ + + + + + + Redirecting... + + + + + +You're being redirected to a new destination. + + diff --git a/faq/index.html b/faq/index.html new file mode 100644 index 0000000..1901f15 --- /dev/null +++ b/faq/index.html @@ -0,0 +1,2250 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Preguntas Frecuentes - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + + + + +

Preguntas Frecuentes (FAQs)

+

¡Estamos encantados de tenerte aquí! 🌟 Esta sección está diseñada para responder a las preguntas más frecuentes sobre el Openterface Mini-KVM, que nuestro equipo organiza periódicamente.

+

Vamos a sumergirnos en las preguntas más comunes sobre el Openterface Mini-KVM.

+

Actualizado: 20 de agosto de 2024

+

Básico

+

¿Qué es el Openterface Mini-KVM?

+

El Openterface Mini-KVM te permite usar tu laptop o computadora para mostrar y controlar dispositivos sin pantalla a través de una conexión USB y HDMI. Esta solución KVM sobre USB ofrece un control KVM ligero, rápido y sin interrupciones. Elimina la necesidad de monitores, teclados y ratones adicionales, proporcionando una solución conveniente en lugares donde las conexiones de red son poco fiables o inexistentes. Es especialmente útil para una amplia gama de aplicaciones, especialmente para profesionales de la tecnología que solucionan problemas en dispositivos sin pantalla o computadoras de placa única. Con el uso de un adaptador de video, también puede soportar VGA, Micro HDMI, DVI y otras fuentes de entrada.

+

El Openterface Mini-KVM es completamente de código abierto tanto en hardware como en software, certificado por OSHWA y respaldado por una comunidad vibrante.

+

¿Por qué marca la diferencia el Openterface Mini-KVM?

+

Con varias soluciones KVM disponibles, aquí está por qué el Openterface Mini-KVM se destaca:

+
    +
  • Portabilidad y Funcionalidad
  • +
  • Solución sin red y para solucionar problemas al instante
  • +
  • Precio accesible
  • +
  • Completamente de código abierto y con comunidad
  • +
+

Para leer más, visita nuestra página Por qué Openterface Mini-KVM.

+

¿Cuáles son los casos de uso para este mini-KVM?

+

El Openterface Mini-KVM es el compañero perfecto para una amplia gama de usuarios y escenarios:

+
    +
  • Profesionales de TI solucionando problemas en servidores
  • +
  • Técnicos que dan servicio a cajeros automáticos, VLTs y quioscos
  • +
  • Desarrolladores gestionando dispositivos de computación en el borde
  • +
  • Entusiastas de la tecnología experimentando con computadoras de placa única
  • +
  • Profesionales que requieren operaciones locales seguras en la segregación de redes, como aquellos que gestionan activos criptográficos
  • +
  • Cualquiera que necesite flujos de trabajo integrados frecuentemente entre computadoras personales y de trabajo.
  • +
+

Por favor, también revisa esta página: Casos de Uso

+

¿Qué computadoras host son compatibles con el Openterface Mini-KVM?

+

Para usar este mini-KVM, la computadora host debe instalar una de estas aplicaciones host para soportar MacOS, Windows, Linux y Android.

+

¿Qué dispositivos objetivo son compatibles con el Openterface Mini-KVM?

+

No se requiere preinstalación ni configuración en el dispositivo objetivo. Siempre que el dispositivo objetivo soporte operaciones de interfaz de usuario con salida de video (por ejemplo, HDMI, VGA) y tenga un puerto USB para recibir señales de control de teclado y ratón emulados (HID), se puede usar. Por lo tanto, las plataformas de dispositivos objetivo compatibles incluyen Windows, MacOS, Linux, Android y iOS.

+

¿Habrá soporte técnico y documentación disponible para el Openterface Mini-KVM?

+

Puedes encontrar documentación extensa para el Openterface Mini-KVM en nuestro sitio web en Openterface.com. Continuamente actualizamos estos recursos para optimizar tu experiencia con el dispositivo. +Para soporte técnico, te invitamos a unirte a nuestra comunidad para compartir consultas e ideas con otros usuarios y nuestro equipo de expertos. Si tu problema persiste, nuestro equipo está disponible para proporcionar asistencia técnica adicional. Puedes contactarnos a través de este correo electrónico: info@techxartisan.com.

+

Software

+

¿Dónde puedo descargar las aplicaciones host?

+

Visita nuestra página Instalar Aplicación Host para descargas oficiales.

+
+Privacidad y Seguridad: Ten cuidado al usar aplicaciones host de terceros +

Como nuestro proyecto es de código abierto, puedes encontrar versiones alternativas de aplicaciones host compatibles con nuestro Mini-KVM desarrolladas por otros. Aunque estas pueden ofrecer características adicionales, asegúrate de revisar sus prácticas de seguridad y privacidad. El equipo de Openterface no puede garantizar ni ser responsable de la seguridad de las aplicaciones de terceros.

+
+

¿Hay una aplicación host que soporte ChromeOS?

+

Sí, pero actualmente está en desarrollo. Estamos planeando crear una extensión web diseñada para soportar tanto los navegadores Chrome como Firefox. Aunque su prioridad de desarrollo es ligeramente menor que la de los sistemas operativos principales como macOS, Windows y Linux, estamos trabajando activamente en ello. ¡Por favor, ten paciencia y mantente atento a las actualizaciones! Si estás interesado en ayudar con nuestro desarrollo, únete a nosotros en la comunidad o envíanos un correo electrónico.

+

¿Hay una aplicación host que soporte dispositivos móviles de Apple?

+

Actualmente estamos explorando la compatibilidad con los sistemas móviles de Apple, como iOS y iPadOS. Debido a los estrictos controles de Apple, es posible que estas plataformas no soporten conexiones por cable con dispositivos de terceros. Sin embargo, la situación podría cambiar, o podría haber soluciones alternativas. Si tienes alguna idea o sugerencia, te invitamos a unirte a nuestra comunidad para discutirlas con nosotros. Estamos comprometidos a mejorar la conveniencia de nuestro dispositivo al soportar la mayor cantidad de sistemas posible. Si estás interesado en ayudar con nuestro desarrollo, únete a nosotros en la comunidad o envíanos un correo electrónico.

+

¿Qué hacer si F11 no funciona en aplicaciones de macOS?

+

En macOS, al presionar F11 se muestra el escritorio de macOS en lugar de pasar la tecla F11 a la aplicación y al computador objetivo. Para solucionar esto, puedes desvincular F11 de la función "Mostrar Escritorio". Aquí te explicamos cómo:

+
    +
  1. Ve a Configuración del Sistema.
  2. +
  3. Selecciona Escritorio y Dock.
  4. +
  5. Desplázate hacia abajo y haz clic en el botón "Atajos...".
  6. +
  7. Encuentra "Mostrar Escritorio" y configúralo en el guion (-) en la parte inferior de la lista desplegable.
  8. +
  9. Este cambio permitirá que la tecla F11 pase a tu aplicación en el computador objetivo.
  10. +
+

Puerto USB Conmutable y Transferencia de Archivos

+

¿El Openterface Mini-KVM soporta transferencias de archivos?

+

Sí, el Openterface Mini-KVM incluye un puerto USB-A conmutable compartido entre los dispositivos host y objetivo.

+
+¿Cómo compartir una memoria USB entre los dispositivos Host y Objetivo? +

Los archivos pueden transferirse entre el host y el objetivo siguiendo estos pasos:

+
    +
  1. Monta una memoria USB en el host cuando el pequeño interruptor negro esté en el lado del puerto Type-C del host.
  2. +
  3. Copia los archivos en esta memoria montada.
  4. +
  5. Después de copiar, desmonta la memoria sin desconectarla físicamente.
  6. +
  7. Mueve el pequeño interruptor negro al otro lado. Esta acción cambia la conexión del puerto USB-A al objetivo.
  8. +
  9. Monta la memoria USB en el dispositivo objetivo y copia/mueve los archivos de la memoria, completando el proceso de transferencia de archivos del host al objetivo.
  10. +
+

Este método también puede usarse en la dirección opuesta.

+
+
+Recuerda expulsar la memoria USB antes de cambiar el interruptor +

Si el puerto USB está siendo usado por una memoria USB, asegúrate de expulsar la memoria antes de cambiar el interruptor para transferir el uso del puerto a otra computadora.

+
+

¿El puerto USB-A conmutable puede cambiarse a nivel de software?

+

¡Con la actualización de hardware a la versión 1.9, sí! Actualmente estamos trabajando en codificar esta función en nuestra aplicación. Una vez implementada, soportará tanto el cambio físico como el conmutado a nivel de software. Consulta con nuestro equipo de desarrollo en Discord para saber más sobre este progreso.

+

¿Por qué USB 2.0 y no USB 3.0 para este puerto USB conmutable?

+

USB 2.0 es completamente capaz de manejar la captura de video a 1080p@30Hz, transmitir señales HID (para teclado y ratón) y gestionar transferencias de archivos a velocidad estándar entre los computadores objetivo y host. Esto hace que nuestro producto sea una solución rápida, ligera y portátil, tal como fue diseñada.

+

Usar USB 3.0 haría el diseño de la PCB mucho más complejo y aumentaría significativamente los costos de producción. Además, aunque USB 3.0 ofrece transferencias de archivos más rápidas, también genera más calor, lo que podría acortar la vida útil del dispositivo.

+

Estamos considerando la aplicación de USB 3.0 para la próxima versión, dirigida a escenarios de uso más profesionales y soluciones KVM estacionarias.

+

Técnico

+

¿El Openterface Mini-KVM es de código abierto?

+

¡Sí! El Openterface Mini-KVM es completamente de código abierto tanto en hardware como en software, certificado por OSHWA y respaldado por una comunidad vibrante. Si estás interesado en contribuir, contáctanos en info@techxartisan.com. ¡Mantente al tanto!

+

¿Puedo acceder a la configuración del BIOS de un dispositivo?

+

Sí, la conexión directa del Openterface Mini-KVM permite el acceso a configuraciones de bajo nivel del BIOS o firmware.

+

Esta característica contrasta con las soluciones KVM basadas en software o aplicaciones de control remoto como TeamViewer y VNC, que generalmente no pueden interactuar a nivel de BIOS.

+

¿Por qué el teclado no funciona a nivel de BIOS en algunos ordenadores antiguos?

+

Parece que algunos BIOS de ordenadores antiguos no pueden reconocer el hub USB de nuestro dispositivo, lo que puede causar problemas con nuestro teclado y ratón emulados a nivel de BIOS. Estamos atentos a este problema.

+

Hemos recibido un informe de que en un ordenador HP específico, el HP Engage Flex Pro, el teclado no funciona en la pantalla del BIOS, aunque funciona normalmente una vez que el sistema operativo se inicia.

+

Si encuentras el mismo problema, por favor repórtalo a través de un issue en GitHub.

+

¿Cómo se transmite el video/datos entre dispositivos?

+

Los datos de video se capturan a través de HDMI y se transmiten por USB 2.0 al ordenador host para su visualización. El puerto USB 2.0 conmutable permite compartir unidades USB u otros dispositivos USB entre el objetivo y el host.

+

¿Cómo maneja la energía el Openterface Mini-KVM?

+

El dispositivo no requiere una fuente de alimentación externa, ya que está diseñado para ser alimentado a través de sus conexiones USB Type-C desde el host, mejorando su portabilidad. En escenarios donde el dispositivo objetivo es un micro-ordenador de bajo consumo, como un Raspberry Pi, podría ser alimentado a través del host mediante el puerto USB conmutable del Mini-KVM. Sin embargo, esto no es recomendable. El método estándar de operación es tener una fuente de alimentación externa para el dispositivo objetivo.

+

¿Puedo construir este dispositivo por mí mismo?

+

¡Por supuesto! Somos un grupo de apasionados creadores que aman el DIY, y nos aseguramos de que este proyecto sea de código abierto tanto en hardware como en software. Técnicamente, puedes construirlo desde cero. Incluso estamos pensando en publicar una guía sobre cómo hacer una versión en protoboard de nuestro producto que también sea compatible con nuestro software.

+

Nuestra comunidad ya está experimentando con diferentes versiones de hardware. ¡Consulta nuestras publicaciones comunitarias para aprender más o comparte tus propias experiencias DIY! Podría enriquecer mucho nuestra comunidad. Además, podrías descubrir que con algunos ajustes en el código, nuestro software podría funcionar perfectamente con tu configuración DIY creativa.

+

Mecanismo de Control

+

¿Hay planes para una versión con conectividad inalámbrica o Ethernet?

+

Actualmente, no estamos planeando agregar conectividad inalámbrica o Ethernet a nuestros productos Openterface. Nos enfocamos en proporcionar un control rápido y estable a través de USB directamente a tu dispositivo objetivo, para que no tengas que preocuparte por problemas de red.

+

¡Pero estamos siempre abiertos a comentarios! Si crees que hay una necesidad real de esta característica, o si estás teniendo dificultades para encontrar una buena solución KVM-over-IP, envíanos un correo electrónico a info@techxartisan.com. Y recuerda, si decidimos expandir nuestras opciones de conectividad, nuestra comunidad será la primera en saberlo.

+

¿En qué se diferencia esto de otras soluciones KVM como KVM tradicionales, KVM-over-IP y VNC, etc.?

+

¿Tienes curiosidad sobre cómo se compara el Openterface Mini-KVM con otras soluciones? Consulta nuestra detallada Comparación página.

+

¿Funciona con un ordenador objetivo que requiere PS/2?

+

No. Sabemos que todavía hay muchos ordenadores antiguos sin monitor que requieren teclados y ratones PS/2. Hasta donde sabemos, aún no existe una solución elegante para convertir señales HID USB en señales divididas de teclado y ratón PS/2. Estamos investigando este asunto y considerando cómo soportar PS/2 en futuras versiones del Mini-KVM. Si conoces alguna solución que podría funcionar elegantemente con nuestro Mini-KVM, por favor compártela con nosotros. ¡Gracias!

+

¿Puedo usar múltiples Mini-KVMs para controlar múltiples dispositivos objetivo desde un ordenador maestro?

+

¡Sí, puedes! Nuestro Mini-KVM puede manejar esto técnicamente, pero aún estamos ajustando el código y realizando pruebas. Nos estamos enfocando en asegurarnos de que nuestro software pueda vincular automáticamente el teclado y el ratón con la fuente de video correcta cuando uses más de un Mini-KVM a la vez. Además, estamos mejorando la interfaz de usuario del software para que sea mejor para este tipo de configuración. ¡Mantente al tanto de las actualizaciones de nuestra comunidad para cuando lancemos esta función!

+

¿Es capaz de encender/apagar el ordenador al que está conectado?

+

Nuestro dispositivo no soporta ATX (control de encendido/apagado para el ordenador objetivo). Lo diseñamos para ser portátil, rápido para la resolución de problemas y estable para el control local. Realmente está destinado a ser usado cuando estás allí con tu portátil, gestionando uno o varios ordenadores objetivo. Podríamos construir una versión profesional en el futuro con ATX y más características.

+

Relacionado con Video

+

¿Qué pasa con la latencia y resolución de video?

+

Nuestro dispositivo maneja video 1080p con menos de 140 milisegundos de latencia, haciendo que tu experiencia de control sea fluida y sin interrupciones.

+

¿Es el Openterface Mini-KVM adecuado para juegos de alta calidad?

+

El diseño actual se enfoca en operaciones técnicas y de TI, proporcionando un control confiable para la configuración y resolución de problemas de dispositivos en lugar de juegos de alta resolución. Aunque es excelente para muchas tareas, este mini-KVM podría no cumplir con las necesidades de visualización de juegos de alta calidad.

+

¿Habrá soporte para pantallas de alta calidad en futuras versiones del Openterface Mini-KVM?

+

Sabemos que muchos de ustedes buscan características de visualización de primera calidad. Aunque no es nuestro enfoque principal en este momento, basándonos en sus comentarios, estamos considerando agregar capacidades de visualización mejoradas en una versión profesional del Openterface Mini-KVM.

+

¿Por qué el Openterface Mini-KVM no transmite video a través de IP local?

+

El Openterface Mini-KVM ha sido diseñado para asegurar un rendimiento confiable y estable a través de conexiones cableadas, utilizando HDMI y USB. Aunque es técnicamente posible transmitir video a través de una red mediante nuestras aplicaciones host, estamos considerando agregar una función de VLC e incluso VNC a nuestras aplicaciones host en el futuro.

+

¿Puede funcionar con diferentes salidas de video como VGA, DVI, DisplayPort, etc.?

+

Más o menos. El Openterface Mini-KVM captura video a través de un puerto HDMI. Sin embargo, puedes usar varios adaptadores de video como VGA-a-HDMI, DVI-a-HDMI, miniHDMI-a-HDMI, o DP-a-HDMI, para conectar diferentes fuentes de video.

+

Solución de Problemas

+

¿Por qué el Openterface Mini-KVM a veces experimenta problemas cuando se conecta a través de un hub USB?

+

Cuando se usa un hub USB en el lado del objetivo, el Openterface Mini-KVM puede volverse inestable. Esto se debe a que el Openterface Mini-KVM depende principalmente del puerto objetivo para la energía. Si el hub USB conectado al objetivo está completamente cargado, puede causar una caída significativa de voltaje, lo que lleva a la inestabilidad del Openterface Mini-KVM debido a la falta de energía. Si necesitas usar un hub USB en el lado del objetivo, considera usar un hub USB alimentado con una fuente de alimentación externa para asegurar una operación estable.

+

¿Qué debo hacer si el Openterface Mini-KVM se vuelve inestable, como cuando la aplicación no muestra la pantalla del objetivo o el ratón y el teclado no responden?

+

Si encuentras inestabilidad con el Openterface Mini-KVM, como que la aplicación no muestre la pantalla del objetivo o la incapacidad de controlar el ratón y el teclado, intenta desconectar todos los cables. Después de un breve momento, vuelve a conectar los cables y prueba de nuevo. Este simple reinicio a menudo resuelve los problemas de conexión.

+

Más

+

¿Cómo puedo contribuir a este proyecto?

+

¡Por supuesto! Hay muchas maneras en las que puedes colaborar:

+
    +
  • Si te gusta programar, ayúdanos reportando y solucionando errores.
  • +
  • ¿Eres bueno con las palabras y la tecnología? Podrías echar una mano con nuestra documentación.
  • +
  • Y si eres un mago con los idiomas, ¿por qué no ayudar a traducir nuestros documentos para que más personas puedan unirse?
  • +
  • Si el diseño es lo tuyo, siempre estamos buscando nuevas ideas para el diseño gráfico, la interfaz de la aplicación y hacer que nuestro dispositivo sea aún más fácil de usar.
  • +
  • ¿Te gustaría ayudar a mantener nuestra comunidad activa? También podríamos usar tus habilidades allí.
  • +
+

Tu apoyo y contribuciones son lo que mantiene creciendo al Openterface Mini-KVM. ¡Gracias por ser parte de nuestra aventura! 🚀 ¿Tienes ganas de ayudar pero no ves un ajuste perfecto? ¡Solo envíanos un correo electrónico!

+

¿Quieres revisar nuestro práctico gadget?

+

¡Nos encanta hacer ruido y correr la voz sobre nuestro Mini-KVM! Si eres de la prensa o te destacas en las redes sociales y te gustaría probar nuestro producto, estamos a tu disposición. Ya sea que te gusten las reseñas detalladas, los videos de unboxing o simplemente quieras darnos un saludo, estamos aquí para ello y ¡hagamos algo de ruido juntos! 🎉 Solo envíanos un correo electrónico AHORA.

+

¿Cuáles son las características avanzadas planeadas para el mini-KVM?

+

Estamos emocionados por el potencial del mini-KVM y estamos comprometidos a documentar todas nuestras ideas actuales en una hoja de ruta completa. Esta hoja de ruta delineará las características avanzadas y los desarrollos futuros que imaginamos para el dispositivo. Esperamos desarrollar estas características en colaboración con nuestra comunidad. Mantente al tanto de más actualizaciones mientras seguimos creciendo e innovando juntos.

+

¿Cómo se integra el mini-KVM con la IA y cuáles son sus posibilidades futuras?

+

Nuestro objetivo final es permitir que la IA controle los ordenadores objetivo, y el Openterface juega un papel crucial en esta visión. Inspirados por proyectos como OthersideAI's self-operating computer, nuestro objetivo es que el mini-KVM actúe como una extensión de las 'manos' (proporcionando control de teclado y ratón) y 'ojos' (capturando la fuente de video) para el ordenador host. Si el ordenador host es lo suficientemente potente, podría emular las capacidades vistas en la película de 2013 "Her". Aunque esto es una aspiración futura, destaca las emocionantes posibilidades que vemos para el mini-KVM.

+

¿Qué accesorios están disponibles para el Openterface Mini-KVM?

+

Ofrecemos una gama de accesorios para mejorar tu experiencia con el Openterface Mini-KVM. Consulta nuestra sección de Accesorios para más detalles sobre los productos disponibles, incluyendo nuestro Cable Convertidor de VGA a HDMI.

+
+

Tu curiosidad y apoyo impulsan nuestro progreso, y queremos asegurarnos de que cada una de tus preguntas encuentre una respuesta. Ten en cuenta que, a medida que pasa el tiempo, el contenido anterior en nuestras preguntas frecuentes puede quedar desactualizado. Si tu consulta no está cubierta en estas preguntas frecuentes, siempre consulta nuestro sitio web openterface.com para obtener la información más actual. Además, no dudes en unirte a nuestra entusiasta comunidad. Estamos activos en nuestro Subreddit en /r/Openterface_miniKVM/ y en nuestro servidor de Discord, TechxArtisan, donde puedes hacer preguntas, compartir ideas o simplemente charlar sobre todo lo relacionado con la tecnología.

+

Además, no dudes en ponerte en contacto directamente con nuestro equipo dedicado enviando un correo electrónico a info@techxartisan.com. Nos encanta saber de ti y siempre estamos aquí para ayudar.

+ + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/index.html b/features/index.html new file mode 100644 index 0000000..9325b41 --- /dev/null +++ b/features/index.html @@ -0,0 +1,2061 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Características - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + + +

Características

+ + +
    +
  • +

    Compatibilidad con la App del Host: + Compatible con macOS, Windows y Linux, y próximamente con Android.

    +
  • +
  • +

    Comodidad Plug-and-Play: + Control instantáneo al conectar, sin necesidad de instalar software o configurar el dispositivo objetivo. No deja rastros de software en la computadora objetivo.

    +
  • +
  • +

    Independencia de Red: + Control estable y rápido sin cabeza a través de HDMI y entrada de teclado/ratón emulados (HID).

    +
  • +
  • +

    Diseño Ultra Portátil: + Su diseño compacto y ligero lo convierte en la herramienta perfecta para profesionales en movimiento.

    +
  • +
  • +

    Full HD con Baja Latencia: + Soporta salida de video hasta 1920x1080@30Hz con menos de 140 milisegundos de latencia. Adaptable a VGA, Micro HDMI, DVI y otras entradas con un adaptador de video.

    +
  • +
  • +

    Integración de Audio: + Captura y reproduce el audio del dispositivo objetivo directamente en la computadora host.

    +
  • +
  • +

    Acceso a Nivel de BIOS: + Proporciona acceso directo al BIOS, firmware o gestión de inicio del dispositivo objetivo.

    +
  • +
  • +

    Puerto USB Tipo-A Conmutable: + Permite alternar el acceso USB entre el host y el objetivo, ideal para compartir una unidad USB sin necesidad de reconectar. Consulta nuestra página de Puerto USB Conmutable para más información.

    +
  • +
  • +

    Transferencia de Texto: + La funcionalidad de transferencia de texto permite enviar texto desde la computadora host al dispositivo objetivo. Esta característica emula el comportamiento de escritura para reproducir contenido de texto en la computadora objetivo, ideal para copiar nombres de usuario, contraseñas o fragmentos de código.

    +
      +
    • +

      Caracteres Especiales: La función de transferencia de texto soporta varios caracteres ASCII, incluyendo símbolos, signos de puntuación y caracteres no alfanuméricos.

      +
    • +
    • +

      Texto Limitado: Es ideal para transferir texto corto como nombres de usuario, contraseñas largas, fragmentos de código desde el host al objetivo. Puedes transferir texto de diferentes longitudes, pero no se recomienda transferir demasiado texto a la vez para evitar posibles problemas.

      +
    • +
    +
  • +
+
+

Limitaciones de la Función de Transferencia de Texto

+
    +
  • Sin Integración de Portapapeles: La función de transferencia de texto está diseñada para emular el comportamiento de escritura y no puede transferir contenido no textual, como imágenes o texto formateado.
  • +
  • Limitaciones de Idioma: Esta función soporta exclusivamente la transferencia de texto basado en códigos ASCII y no soporta idiomas que no se basan en ASCII, como caracteres chinos, japoneses o coreanos.
  • +
+
+

Más por Venir

+

Tenemos una página de hoja de ruta que detalla nuestros planes para desarrollar características más avanzadas. Échale un vistazo para estar al tanto de lo que viene. También invitamos a los desarrolladores a unirse a nosotros y participar en nuestra comunidad!

+ + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/feedback/index.html b/feedback/index.html new file mode 100644 index 0000000..a36da75 --- /dev/null +++ b/feedback/index.html @@ -0,0 +1,14 @@ + + + + + + Redirecting... + + + + + +You're being redirected to a new destination. + + diff --git a/hardware/index.html b/hardware/index.html new file mode 100644 index 0000000..780326e --- /dev/null +++ b/hardware/index.html @@ -0,0 +1,14 @@ + + + + + + Redirecting... + + + + + +You're being redirected to a new destination. + + diff --git a/how-it-works/index.html b/how-it-works/index.html new file mode 100644 index 0000000..e29d6ee --- /dev/null +++ b/how-it-works/index.html @@ -0,0 +1,2013 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cómo Funciona - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + + +

Cómo Funciona

+

Desglose del Proceso

+
    +
  • Transmisión de Pantalla: El mini-KVM captura la transmisión de pantalla de la computadora objetivo y la muestra en la aplicación del host. Esto permite a los usuarios ver y gestionar el sistema objetivo directamente desde su máquina host.
  • +
  • Control del Cursor y Ratón: Al mover el ratón a la ventana de la aplicación en la computadora host, los usuarios pueden controlar el cursor en el dispositivo objetivo como si estuvieran usando un VNC. Esta funcionalidad permite operar dos sistemas simultáneamente en una sola pantalla.
  • +
  • Entrada de Teclado: Cuando la ventana de la aplicación está activa, cualquier pulsación de teclas realizada en el teclado de la computadora host se transmite al dispositivo objetivo, permitiendo una escritura y entrada de comandos sin interrupciones.
  • +
  • Conversión de Señales HID: Todas las entradas de teclado y ratón dentro de la aplicación se convierten en señales de control de Dispositivo de Interfaz Humana (HID), que luego se envían a la computadora objetivo.
  • +
  • Sincronización: La aplicación asegura que la pantalla y el cursor de la computadora objetivo estén sincronizados con la pantalla de la computadora host, facilitando una experiencia de usuario unificada.
  • +
+

Puedes explorar el Software y Hardware de código abierto de Openterface para más detalles.

+ + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/how-to-connect/index.html b/how-to-connect/index.html new file mode 100644 index 0000000..c7e855e --- /dev/null +++ b/how-to-connect/index.html @@ -0,0 +1,2066 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cómo Conectar - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + + +

Cómo Conectar

+

Interfaces

+

host-side

+

target-side

+

host-side

+

target-side

+

Type-C to Host Type-C to Host - Puerto USB-C del Host (Hembra): Conecta el puerto USB-C del Host para la transferencia de datos a través del hub USB integrado.

+

Type-C to Target Type-C to Target - Puerto USB-C del Target (Hembra): Conecta el puerto USB-C del Target para emular la salida de teclado y ratón HID a través del hub USB integrado.

+

HDMI Input HDMI Input - Puerto de Entrada HDMI (Hembra): Entrada de fuente HDMI desde el dispositivo Target.

+

USB-A Port USB-A Port - Puerto USB-A 2.0 Conmutable (Hembra): Utilizado por el Host o el Target, pero no simultáneamente.

+
+

Ajuste Ajustado

+

Ten en cuenta que este puerto USB-A hembra tiene un mecanismo de bloqueo, lo que requiere un poco más de fuerza para conectar y desconectar tus dispositivos USB.

+
+

Toggle Switch Toggle Switch - Interruptor de Conmutación: Para alternar la conexión del puerto USB-A 2.0 entre el Host y el Target.

+

Extension Pins Extension Pins - Pines de Extensión: Para más información, consulta Pines de Extensión para uso de desarrolladores.

+

Pasos de Conexión

+

to-host to-host +to-target to-target

+

Para configurar tu Mini-KVM, sigue estos pasos en orden:

+
    +
  1. +

    Conexión del Host (Lado Naranja):

    +
      +
    • Conecta el Host al mini-KVM usando el cable USB Tipo-C naranja de 1.5m. Enchúfalo en el puerto USB-C hembra del lado naranja del mini-KVM.
    • +
    +
    +

    App del Host Requerida

    +

    El Host necesita tener instalada la app del Host. Para más información y enlaces de descarga, consulta la Documentación de la App.

    +
    +
  2. +
  3. +

    Conexión del Dispositivo Target (Lado Negro):

    +
      +
    • Conecta el dispositivo Target al mini-KVM usando el cable USB Tipo-C negro de 0.3m. Enchúfalo en el puerto USB-C hembra del lado negro del mini-KVM.
    • +
    +
  4. +
  5. +

    Conexión de Salida de Video del Target (Lado Negro):

    +
      +
    • Conecta el puerto de salida de video del dispositivo Target al puerto HDMI hembra del lado negro del mini-KVM. Usa el cable HDMI negro de 0.3m, o cualquier otro cable adecuado de fuente de video a HDMI, como un cable convertidor de VGA a HDMI.
    • +
    +
    +

    No se Requiere App para el Target

    +

    No se necesita preinstalación o configuración en el dispositivo Target. Siempre que el dispositivo Target soporte operaciones de UI con salida de video (HDMI, VGA, etc.) y tenga un puerto USB para recibir señales de control de teclado y ratón emuladas (HID), puede ser utilizado. Por lo tanto, las plataformas de dispositivos Target compatibles incluyen Windows, macOS, Linux, Android y iOS.

    +
    +
  6. +
  7. +

    Conexión del Puerto USB-A 2.0 Conmutable (Opcional):

    +
      +
    • Si deseas conectar un dispositivo USB al puerto USB-A 2.0 conmutable, se recomienda hacerlo después de completar las tres conexiones anteriores y asegurarte de que la app del Host esté abierta.
    • +
    +
  8. +
+ + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/cover.png b/images/cover.png new file mode 100644 index 0000000..fc81291 Binary files /dev/null and b/images/cover.png differ diff --git a/images/favicon.png b/images/favicon.png new file mode 100644 index 0000000..f210714 Binary files /dev/null and b/images/favicon.png differ diff --git a/images/feature-icons/icon-bios-access-d.svg b/images/feature-icons/icon-bios-access-d.svg new file mode 100644 index 0000000..21671ae --- /dev/null +++ b/images/feature-icons/icon-bios-access-d.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/images/feature-icons/icon-bios-access.svg b/images/feature-icons/icon-bios-access.svg new file mode 100644 index 0000000..c8cf289 --- /dev/null +++ b/images/feature-icons/icon-bios-access.svg @@ -0,0 +1,49 @@ + +image/svg+xml \ No newline at end of file diff --git a/images/feature-icons/icon-more-d.svg b/images/feature-icons/icon-more-d.svg new file mode 100644 index 0000000..4675f47 --- /dev/null +++ b/images/feature-icons/icon-more-d.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/images/feature-icons/icon-more.svg b/images/feature-icons/icon-more.svg new file mode 100644 index 0000000..3f220b9 --- /dev/null +++ b/images/feature-icons/icon-more.svg @@ -0,0 +1,31 @@ + +image/svg+xml \ No newline at end of file diff --git a/images/feature-icons/icon-network-free-d.svg b/images/feature-icons/icon-network-free-d.svg new file mode 100644 index 0000000..a1dc280 --- /dev/null +++ b/images/feature-icons/icon-network-free-d.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/images/feature-icons/icon-network-free.svg b/images/feature-icons/icon-network-free.svg new file mode 100644 index 0000000..c82d8eb --- /dev/null +++ b/images/feature-icons/icon-network-free.svg @@ -0,0 +1,51 @@ + +image/svg+xml \ No newline at end of file diff --git a/images/feature-icons/icon-plug-and-play-d.svg b/images/feature-icons/icon-plug-and-play-d.svg new file mode 100644 index 0000000..23735ef --- /dev/null +++ b/images/feature-icons/icon-plug-and-play-d.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/images/feature-icons/icon-plug-and-play.svg b/images/feature-icons/icon-plug-and-play.svg new file mode 100644 index 0000000..551670b --- /dev/null +++ b/images/feature-icons/icon-plug-and-play.svg @@ -0,0 +1,36 @@ + +image/svg+xml \ No newline at end of file diff --git a/images/feature-icons/icon-text-transfer-d.svg b/images/feature-icons/icon-text-transfer-d.svg new file mode 100644 index 0000000..741fd97 --- /dev/null +++ b/images/feature-icons/icon-text-transfer-d.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/images/feature-icons/icon-text-transfer.svg b/images/feature-icons/icon-text-transfer.svg new file mode 100644 index 0000000..1324236 --- /dev/null +++ b/images/feature-icons/icon-text-transfer.svg @@ -0,0 +1,56 @@ + +image/svg+xml \ No newline at end of file diff --git a/images/feature-icons/icon-usb-switch-d.svg b/images/feature-icons/icon-usb-switch-d.svg new file mode 100644 index 0000000..d87cfd5 --- /dev/null +++ b/images/feature-icons/icon-usb-switch-d.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/images/feature-icons/icon-usb-switch.svg b/images/feature-icons/icon-usb-switch.svg new file mode 100644 index 0000000..dc8e8a5 --- /dev/null +++ b/images/feature-icons/icon-usb-switch.svg @@ -0,0 +1,41 @@ + +image/svg+xml \ No newline at end of file diff --git a/images/labels/host-side.png b/images/labels/host-side.png new file mode 100644 index 0000000..c0eb3a8 Binary files /dev/null and b/images/labels/host-side.png differ diff --git a/images/labels/target-side.png b/images/labels/target-side.png new file mode 100644 index 0000000..8f7f29c Binary files /dev/null and b/images/labels/target-side.png differ diff --git a/images/op-avatar.jpg b/images/op-avatar.jpg new file mode 100644 index 0000000..e677a1a Binary files /dev/null and b/images/op-avatar.jpg differ diff --git a/images/openterface-mini-kvm-v1-9-s.png b/images/openterface-mini-kvm-v1-9-s.png new file mode 100644 index 0000000..20998cf Binary files /dev/null and b/images/openterface-mini-kvm-v1-9-s.png differ diff --git a/images/openterface-minikvm.svg b/images/openterface-minikvm.svg new file mode 100644 index 0000000..c28b916 --- /dev/null +++ b/images/openterface-minikvm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/openterface.svg b/images/openterface.svg new file mode 100644 index 0000000..e37e61b --- /dev/null +++ b/images/openterface.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/product/basic-two-angled.jpg b/images/product/basic-two-angled.jpg new file mode 100644 index 0000000..7f106db Binary files /dev/null and b/images/product/basic-two-angled.jpg differ diff --git a/images/product/basic-two-sides-angled.jpg b/images/product/basic-two-sides-angled.jpg new file mode 100644 index 0000000..bfcdbf3 Binary files /dev/null and b/images/product/basic-two-sides-angled.jpg differ diff --git a/images/product/basic-with-maunal.jpg b/images/product/basic-with-maunal.jpg new file mode 100644 index 0000000..916dc80 Binary files /dev/null and b/images/product/basic-with-maunal.jpg differ diff --git a/images/product/change-cap.svg b/images/product/change-cap.svg new file mode 100644 index 0000000..beade0e --- /dev/null +++ b/images/product/change-cap.svg @@ -0,0 +1 @@ +Extension Pin Cap \ No newline at end of file diff --git a/images/product/change-cap_1.svg b/images/product/change-cap_1.svg new file mode 100644 index 0000000..a45a29e --- /dev/null +++ b/images/product/change-cap_1.svg @@ -0,0 +1,8530 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Extension Pin Cap + + + + + + + + + diff --git a/images/product/close-up.png b/images/product/close-up.png new file mode 100644 index 0000000..f5b9a57 Binary files /dev/null and b/images/product/close-up.png differ diff --git a/images/product/extension-pins-1.svg b/images/product/extension-pins-1.svg new file mode 100644 index 0000000..1f1b073 --- /dev/null +++ b/images/product/extension-pins-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/product/extension-pins-1_1.svg b/images/product/extension-pins-1_1.svg new file mode 100644 index 0000000..4af319a --- /dev/null +++ b/images/product/extension-pins-1_1.svg @@ -0,0 +1,708 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/product/extension-pins-2.svg b/images/product/extension-pins-2.svg new file mode 100644 index 0000000..b15db31 --- /dev/null +++ b/images/product/extension-pins-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/product/extension-pins-2_1.svg b/images/product/extension-pins-2_1.svg new file mode 100644 index 0000000..62fd5d0 --- /dev/null +++ b/images/product/extension-pins-2_1.svg @@ -0,0 +1,716 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/product/host-htc.svg b/images/product/host-htc.svg new file mode 100644 index 0000000..2829115 --- /dev/null +++ b/images/product/host-htc.svg @@ -0,0 +1 @@ +HostSwitcher ofUSB-A PortExtensionPins \ No newline at end of file diff --git a/images/product/host-htc_1.svg b/images/product/host-htc_1.svg new file mode 100644 index 0000000..583925c --- /dev/null +++ b/images/product/host-htc_1.svg @@ -0,0 +1,493 @@ + + + + + + + + + + + HostSwitcher ofUSB-A PortExtensionPins + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ①⑤⑥ + + diff --git a/images/product/mini-kvm-front-htc.svg b/images/product/mini-kvm-front-htc.svg new file mode 100644 index 0000000..1e044d8 --- /dev/null +++ b/images/product/mini-kvm-front-htc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/product/mini-kvm-front-htc_1.svg b/images/product/mini-kvm-front-htc_1.svg new file mode 100644 index 0000000..1532257 --- /dev/null +++ b/images/product/mini-kvm-front-htc_1.svg @@ -0,0 +1,1817 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/product/minikvm-v1-9-back.svg b/images/product/minikvm-v1-9-back.svg new file mode 100644 index 0000000..1901e55 --- /dev/null +++ b/images/product/minikvm-v1-9-back.svg @@ -0,0 +1 @@ +13.5mm53mm \ No newline at end of file diff --git a/images/product/minikvm-v1-9-back_1.svg b/images/product/minikvm-v1-9-back_1.svg new file mode 100644 index 0000000..9d27894 --- /dev/null +++ b/images/product/minikvm-v1-9-back_1.svg @@ -0,0 +1,2059 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 13.5mm + + + 53mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/product/minikvm-v1-9-front.svg b/images/product/minikvm-v1-9-front.svg new file mode 100644 index 0000000..4176aa3 --- /dev/null +++ b/images/product/minikvm-v1-9-front.svg @@ -0,0 +1 @@ +61mm \ No newline at end of file diff --git a/images/product/minikvm-v1-9-front_1.svg b/images/product/minikvm-v1-9-front_1.svg new file mode 100644 index 0000000..8fa50d8 --- /dev/null +++ b/images/product/minikvm-v1-9-front_1.svg @@ -0,0 +1,2543 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 61mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/product/minikvm-v1-9-host.svg b/images/product/minikvm-v1-9-host.svg new file mode 100644 index 0000000..6acb06c --- /dev/null +++ b/images/product/minikvm-v1-9-host.svg @@ -0,0 +1 @@ +HostSwitcher ofUSB-A PortExtensionPins \ No newline at end of file diff --git a/images/product/minikvm-v1-9-host_1.svg b/images/product/minikvm-v1-9-host_1.svg new file mode 100644 index 0000000..1f1795e --- /dev/null +++ b/images/product/minikvm-v1-9-host_1.svg @@ -0,0 +1,490 @@ + + + + + + + + + + + HostSwitcher ofUSB-A PortExtensionPins + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ①⑤⑥ + + diff --git a/images/product/minikvm-v1-9-target.svg b/images/product/minikvm-v1-9-target.svg new file mode 100644 index 0000000..4db72dc --- /dev/null +++ b/images/product/minikvm-v1-9-target.svg @@ -0,0 +1 @@ +TragetSwitchableUSB-A Port(Host / Target)HDMIInput \ No newline at end of file diff --git a/images/product/minikvm-v1-9-target_1.svg b/images/product/minikvm-v1-9-target_1.svg new file mode 100644 index 0000000..f9e144f --- /dev/null +++ b/images/product/minikvm-v1-9-target_1.svg @@ -0,0 +1,4271 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TragetSwitchableUSB-A Port + (Host / Target) + HDMIInput + ②③④ + + diff --git a/images/product/openterface-mini-kvm-product-with-PCB.jpg b/images/product/openterface-mini-kvm-product-with-PCB.jpg new file mode 100644 index 0000000..d677a3e Binary files /dev/null and b/images/product/openterface-mini-kvm-product-with-PCB.jpg differ diff --git a/images/product/part/CABLE100-VGA2HDMI-1.jpg b/images/product/part/CABLE100-VGA2HDMI-1.jpg new file mode 100644 index 0000000..cd9c230 Binary files /dev/null and b/images/product/part/CABLE100-VGA2HDMI-1.jpg differ diff --git a/images/product/part/CABLE100-VGA2HDMI-2.jpg b/images/product/part/CABLE100-VGA2HDMI-2.jpg new file mode 100644 index 0000000..44a2b0d Binary files /dev/null and b/images/product/part/CABLE100-VGA2HDMI-2.jpg differ diff --git a/images/product/part/OP-01-MINIKVM.jpg b/images/product/part/OP-01-MINIKVM.jpg new file mode 100644 index 0000000..5e4dee1 Binary files /dev/null and b/images/product/part/OP-01-MINIKVM.jpg differ diff --git a/images/product/part/OP-02-QUICK-GUIDE.jpg b/images/product/part/OP-02-QUICK-GUIDE.jpg new file mode 100644 index 0000000..7325832 Binary files /dev/null and b/images/product/part/OP-02-QUICK-GUIDE.jpg differ diff --git a/images/product/part/OP-03-CABLE30-HDMI.jpg b/images/product/part/OP-03-CABLE30-HDMI.jpg new file mode 100644 index 0000000..3c71f14 Binary files /dev/null and b/images/product/part/OP-03-CABLE30-HDMI.jpg differ diff --git a/images/product/part/OP-04-CABLE30-C2A.jpg b/images/product/part/OP-04-CABLE30-C2A.jpg new file mode 100644 index 0000000..3520130 Binary files /dev/null and b/images/product/part/OP-04-CABLE30-C2A.jpg differ diff --git a/images/product/part/OP-05-CABLE150-C2C.jpg b/images/product/part/OP-05-CABLE150-C2C.jpg new file mode 100644 index 0000000..b0d4081 Binary files /dev/null and b/images/product/part/OP-05-CABLE150-C2C.jpg differ diff --git a/images/product/part/OP-06-BAG-TOOLKIT.jpg b/images/product/part/OP-06-BAG-TOOLKIT.jpg new file mode 100644 index 0000000..fde8c78 Binary files /dev/null and b/images/product/part/OP-06-BAG-TOOLKIT.jpg differ diff --git a/images/product/part/OP-MINIKVM-BASIC.jpg b/images/product/part/OP-MINIKVM-BASIC.jpg new file mode 100644 index 0000000..e583855 Binary files /dev/null and b/images/product/part/OP-MINIKVM-BASIC.jpg differ diff --git a/images/product/part/OP-MINIKVM-TOOLKIT.jpg b/images/product/part/OP-MINIKVM-TOOLKIT.jpg new file mode 100644 index 0000000..c58ba52 Binary files /dev/null and b/images/product/part/OP-MINIKVM-TOOLKIT.jpg differ diff --git a/images/product/part/mini-kvm-scale-v1-9.jpg b/images/product/part/mini-kvm-scale-v1-9.jpg new file mode 100644 index 0000000..5c72057 Binary files /dev/null and b/images/product/part/mini-kvm-scale-v1-9.jpg differ diff --git a/images/product/part/pin-cap.jpg b/images/product/part/pin-cap.jpg new file mode 100644 index 0000000..405c283 Binary files /dev/null and b/images/product/part/pin-cap.jpg differ diff --git a/images/product/product-option-1-basic.jpg b/images/product/product-option-1-basic.jpg new file mode 100644 index 0000000..b329cf6 Binary files /dev/null and b/images/product/product-option-1-basic.jpg differ diff --git a/images/product/product-option-2-toolkit.jpg b/images/product/product-option-2-toolkit.jpg new file mode 100644 index 0000000..4bfa0da Binary files /dev/null and b/images/product/product-option-2-toolkit.jpg differ diff --git a/images/product/switch-graphics.jpg b/images/product/switch-graphics.jpg new file mode 100644 index 0000000..821c506 Binary files /dev/null and b/images/product/switch-graphics.jpg differ diff --git a/images/product/switch-graphics.svg b/images/product/switch-graphics.svg new file mode 100644 index 0000000..5fc9ca8 --- /dev/null +++ b/images/product/switch-graphics.svg @@ -0,0 +1,5765 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/product/switch-graphics_1.svg b/images/product/switch-graphics_1.svg new file mode 100644 index 0000000..08c79a9 --- /dev/null +++ b/images/product/switch-graphics_1.svg @@ -0,0 +1,5763 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/product/target-htc.svg b/images/product/target-htc.svg new file mode 100644 index 0000000..ad8db85 --- /dev/null +++ b/images/product/target-htc.svg @@ -0,0 +1 @@ +TragetSwitchableUSB-A Port(Host / Target)HDMIInput \ No newline at end of file diff --git a/images/product/target-htc_1.svg b/images/product/target-htc_1.svg new file mode 100644 index 0000000..47da5a2 --- /dev/null +++ b/images/product/target-htc_1.svg @@ -0,0 +1,4271 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TragetSwitchableUSB-A Port + (Host / Target) + HDMIInput + ②③④ + + diff --git a/images/product/to-host.svg b/images/product/to-host.svg new file mode 100644 index 0000000..9091512 --- /dev/null +++ b/images/product/to-host.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/product/to-host_1.svg b/images/product/to-host_1.svg new file mode 100644 index 0000000..cdc5b7d --- /dev/null +++ b/images/product/to-host_1.svg @@ -0,0 +1,1346 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Host Computer + + + + + + + + + + + + + + + + + + + + diff --git a/images/product/to-target.svg b/images/product/to-target.svg new file mode 100644 index 0000000..2d7da85 --- /dev/null +++ b/images/product/to-target.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/product/to-target_1.svg b/images/product/to-target_1.svg new file mode 100644 index 0000000..9d5e3c5 --- /dev/null +++ b/images/product/to-target_1.svg @@ -0,0 +1,2565 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Target Device + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/product/toolkit-open.jpg b/images/product/toolkit-open.jpg new file mode 100644 index 0000000..8a8359f Binary files /dev/null and b/images/product/toolkit-open.jpg differ diff --git a/images/product/toolkit-parts-layout-2-numbers.jpg b/images/product/toolkit-parts-layout-2-numbers.jpg new file mode 100644 index 0000000..a26bce4 Binary files /dev/null and b/images/product/toolkit-parts-layout-2-numbers.jpg differ diff --git a/images/product/toolkit-parts-layout-numbers.jpg b/images/product/toolkit-parts-layout-numbers.jpg new file mode 100644 index 0000000..ce1e458 Binary files /dev/null and b/images/product/toolkit-parts-layout-numbers.jpg differ diff --git a/images/product/use-case-demo-industrial-pc.jpg b/images/product/use-case-demo-industrial-pc.jpg new file mode 100644 index 0000000..6d9b4b7 Binary files /dev/null and b/images/product/use-case-demo-industrial-pc.jpg differ diff --git a/images/product/use-case-demo-macbookpro2010.jpg b/images/product/use-case-demo-macbookpro2010.jpg new file mode 100644 index 0000000..6bc9942 Binary files /dev/null and b/images/product/use-case-demo-macbookpro2010.jpg differ diff --git a/images/product/use-case-demo-macmini2009-3.jpg b/images/product/use-case-demo-macmini2009-3.jpg new file mode 100644 index 0000000..e30c99d Binary files /dev/null and b/images/product/use-case-demo-macmini2009-3.jpg differ diff --git a/images/product/use-case-demo-pc-bios-1.jpg b/images/product/use-case-demo-pc-bios-1.jpg new file mode 100644 index 0000000..3ec7f59 Binary files /dev/null and b/images/product/use-case-demo-pc-bios-1.jpg differ diff --git a/images/product/use-case-demo-pc-bios-2.jpg b/images/product/use-case-demo-pc-bios-2.jpg new file mode 100644 index 0000000..2a0de0d Binary files /dev/null and b/images/product/use-case-demo-pc-bios-2.jpg differ diff --git a/images/product/use-case-demo-pc.jpg b/images/product/use-case-demo-pc.jpg new file mode 100644 index 0000000..fff0a84 Binary files /dev/null and b/images/product/use-case-demo-pc.jpg differ diff --git a/images/product/use-case-demo-respberry-pi.jpg b/images/product/use-case-demo-respberry-pi.jpg new file mode 100644 index 0000000..efcb7ec Binary files /dev/null and b/images/product/use-case-demo-respberry-pi.jpg differ diff --git a/images/product/use-case-pc-angled-view.jpg b/images/product/use-case-pc-angled-view.jpg new file mode 100644 index 0000000..d7656fa Binary files /dev/null and b/images/product/use-case-pc-angled-view.jpg differ diff --git a/images/product/win_qt_app.jpg b/images/product/win_qt_app.jpg new file mode 100644 index 0000000..466feda Binary files /dev/null and b/images/product/win_qt_app.jpg differ diff --git a/images/product/win_qt_app_os.jpg b/images/product/win_qt_app_os.jpg new file mode 100644 index 0000000..c09da9b Binary files /dev/null and b/images/product/win_qt_app_os.jpg differ diff --git a/images/shell-icons/ce.svg b/images/shell-icons/ce.svg new file mode 100644 index 0000000..4c0e794 --- /dev/null +++ b/images/shell-icons/ce.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/shell-icons/host-computer.svg b/images/shell-icons/host-computer.svg new file mode 100644 index 0000000..cb078e1 --- /dev/null +++ b/images/shell-icons/host-computer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/shell-icons/host-computer_1.svg b/images/shell-icons/host-computer_1.svg new file mode 100644 index 0000000..fa836c2 --- /dev/null +++ b/images/shell-icons/host-computer_1.svg @@ -0,0 +1,36 @@ + +image/svg+xml \ No newline at end of file diff --git a/images/shell-icons/host.svg b/images/shell-icons/host.svg new file mode 100644 index 0000000..a32f003 --- /dev/null +++ b/images/shell-icons/host.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/shell-icons/host_1.svg b/images/shell-icons/host_1.svg new file mode 100644 index 0000000..e1c7702 --- /dev/null +++ b/images/shell-icons/host_1.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/images/shell-icons/input.svg b/images/shell-icons/input.svg new file mode 100644 index 0000000..0d71584 --- /dev/null +++ b/images/shell-icons/input.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/shell-icons/input_1.svg b/images/shell-icons/input_1.svg new file mode 100644 index 0000000..5a46de1 --- /dev/null +++ b/images/shell-icons/input_1.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/images/shell-icons/keyboard-mouse.svg b/images/shell-icons/keyboard-mouse.svg new file mode 100644 index 0000000..3238c7b --- /dev/null +++ b/images/shell-icons/keyboard-mouse.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/shell-icons/osh.svg b/images/shell-icons/osh.svg new file mode 100644 index 0000000..42d74d4 --- /dev/null +++ b/images/shell-icons/osh.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/shell-icons/oshw.svg b/images/shell-icons/oshw.svg new file mode 100644 index 0000000..6d6afcb --- /dev/null +++ b/images/shell-icons/oshw.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/shell-icons/osi.svg b/images/shell-icons/osi.svg new file mode 100644 index 0000000..f4a2ca9 --- /dev/null +++ b/images/shell-icons/osi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/shell-icons/pins.svg b/images/shell-icons/pins.svg new file mode 100644 index 0000000..00e8934 --- /dev/null +++ b/images/shell-icons/pins.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/shell-icons/pins_1.svg b/images/shell-icons/pins_1.svg new file mode 100644 index 0000000..0784d23 --- /dev/null +++ b/images/shell-icons/pins_1.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/images/shell-icons/screen.svg b/images/shell-icons/screen.svg new file mode 100644 index 0000000..e99319b --- /dev/null +++ b/images/shell-icons/screen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/shell-icons/switchable-usb.svg b/images/shell-icons/switchable-usb.svg new file mode 100644 index 0000000..bed8e2f --- /dev/null +++ b/images/shell-icons/switchable-usb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/shell-icons/switchable-usb_1.svg b/images/shell-icons/switchable-usb_1.svg new file mode 100644 index 0000000..95ecc2e --- /dev/null +++ b/images/shell-icons/switchable-usb_1.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/shell-icons/switchable.svg b/images/shell-icons/switchable.svg new file mode 100644 index 0000000..1ffde72 --- /dev/null +++ b/images/shell-icons/switchable.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/shell-icons/target-computer.svg b/images/shell-icons/target-computer.svg new file mode 100644 index 0000000..c3cc91a --- /dev/null +++ b/images/shell-icons/target-computer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/shell-icons/target-computer_1.svg b/images/shell-icons/target-computer_1.svg new file mode 100644 index 0000000..b188c65 --- /dev/null +++ b/images/shell-icons/target-computer_1.svg @@ -0,0 +1,36 @@ + +image/svg+xml \ No newline at end of file diff --git a/images/shell-icons/target.svg b/images/shell-icons/target.svg new file mode 100644 index 0000000..f87acb8 --- /dev/null +++ b/images/shell-icons/target.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/shell-icons/target_1.svg b/images/shell-icons/target_1.svg new file mode 100644 index 0000000..9922fed --- /dev/null +++ b/images/shell-icons/target_1.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/images/shell-icons/toggle-h-t.svg b/images/shell-icons/toggle-h-t.svg new file mode 100644 index 0000000..946de15 --- /dev/null +++ b/images/shell-icons/toggle-h-t.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/shell-icons/toggle-h-t_1.svg b/images/shell-icons/toggle-h-t_1.svg new file mode 100644 index 0000000..dea2eb3 --- /dev/null +++ b/images/shell-icons/toggle-h-t_1.svg @@ -0,0 +1,51 @@ + +image/svg+xml \ No newline at end of file diff --git a/images/shell-icons/toggle.svg b/images/shell-icons/toggle.svg new file mode 100644 index 0000000..7c93a4e --- /dev/null +++ b/images/shell-icons/toggle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/shell-icons/toggle_1.svg b/images/shell-icons/toggle_1.svg new file mode 100644 index 0000000..3c180c6 --- /dev/null +++ b/images/shell-icons/toggle_1.svg @@ -0,0 +1,31 @@ + +image/svg+xml \ No newline at end of file diff --git a/images/shell-icons/ukca.svg b/images/shell-icons/ukca.svg new file mode 100644 index 0000000..c65ec95 --- /dev/null +++ b/images/shell-icons/ukca.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/shell-icons/weee.svg b/images/shell-icons/weee.svg new file mode 100644 index 0000000..ee32b5f --- /dev/null +++ b/images/shell-icons/weee.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/trademark/android.svg b/images/trademark/android.svg new file mode 100644 index 0000000..e1b52c6 --- /dev/null +++ b/images/trademark/android.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/trademark/app-store.svg b/images/trademark/app-store.svg new file mode 100644 index 0000000..2a7dbd9 --- /dev/null +++ b/images/trademark/app-store.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/trademark/apple.svg b/images/trademark/apple.svg new file mode 100644 index 0000000..30aa047 --- /dev/null +++ b/images/trademark/apple.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/trademark/crowd-supply.svg b/images/trademark/crowd-supply.svg new file mode 100644 index 0000000..378d7cc --- /dev/null +++ b/images/trademark/crowd-supply.svg @@ -0,0 +1,2 @@ + + diff --git a/images/trademark/linux.svg b/images/trademark/linux.svg new file mode 100644 index 0000000..28949c9 --- /dev/null +++ b/images/trademark/linux.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/trademark/open-source-hardware.svg b/images/trademark/open-source-hardware.svg new file mode 100644 index 0000000..7c5e017 --- /dev/null +++ b/images/trademark/open-source-hardware.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/trademark/open-source-initiative.svg b/images/trademark/open-source-initiative.svg new file mode 100644 index 0000000..d9dc672 --- /dev/null +++ b/images/trademark/open-source-initiative.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/trademark/oshw-cn000015.svg b/images/trademark/oshw-cn000015.svg new file mode 100644 index 0000000..eabacbd --- /dev/null +++ b/images/trademark/oshw-cn000015.svg @@ -0,0 +1,33 @@ + + + + + + + + + CN000015 + + \ No newline at end of file diff --git a/images/trademark/win.svg b/images/trademark/win.svg new file mode 100644 index 0000000..00cd1db --- /dev/null +++ b/images/trademark/win.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/txa-avatar.png b/images/txa-avatar.png new file mode 100644 index 0000000..323e230 Binary files /dev/null and b/images/txa-avatar.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..b5910d4 --- /dev/null +++ b/index.html @@ -0,0 +1,2081 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Inicio - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + + + + + +
+
+
+
+ +
+
+
+ Producto Openterface Mini-KVM +
+ + ¡Ordena ahora! Crowd Supply + + + + Desafío DIY + +

Construye tu propio KVM USB & gana premios increíbles! 🏆

+ + +
+
+
+
+ +
+

Instala la App del Anfitrión

+
+ Imagen del Poster +
+
+
+ Avatar +

Windows

+ QT v0.1.0 +
+
+ Avatar +

macOS

+ Tienda de Apps +
+
+ Avatar +

Linux

+ Código Fuente +
+
+ Avatar +

Android

+ apk v1.0.6 +
+
+

y más.

+
+ +
+ +
+ +
+
+ Imagen de Cierre de Producto +
+
+

Eleva tu kit de tecnología con Openterface Mini-KVM: + una solución KVM sobre USB compacta, rica en características y de código abierto que simplifica tu vida tecnológica con tareas de IT y solución de problemas al vuelo. +

+
+
+ +
+
+ Poster de Pre-Lanzamiento +
+
+

Despide a ese monitor, teclado y mouse extra! + Convierte tu laptop en una consola KVM inteligente para controlar cualquier dispositivo sin cabeza via HDMI y USB. +

+
+
+
+ +
+ +
+
+

Características

+
+
+ Icono de Plug and Play + Icono de Plug and Play +

Plug'n'Play

+
+
+ Icono de Acceso a BIOS + Icono de Acceso a BIOS +

Acceso a BIOS

+
+
+ Icono de Libre de Red + Icono de Libre de Red +

Libre de Red

+
+
+ Icono de Transferencia de Texto + Icono de Transferencia de Texto +

Transferencia de Texto

+
+
+ Icono de Interruptor USB + Icono de Interruptor USB +

Interruptor USB

+
+
+ Icono de Más + Icono de Más +

y más.

+
+
+
+
+ +
+
+

Previsualización del Producto

+
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ +
+ + Mastodon + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ +
+
+ + + + + +
+ + + +
+ + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/linux/index.html b/linux/index.html new file mode 100644 index 0000000..e4acc48 --- /dev/null +++ b/linux/index.html @@ -0,0 +1,14 @@ + + + + + + Redirecting... + + + + + +You're being redirected to a new destination. + + diff --git a/macos/index.html b/macos/index.html new file mode 100644 index 0000000..21bd43e --- /dev/null +++ b/macos/index.html @@ -0,0 +1,14 @@ + + + + + + Redirecting... + + + + + +You're being redirected to a new destination. + + diff --git a/open-hardware/index.html b/open-hardware/index.html new file mode 100644 index 0000000..0443d86 --- /dev/null +++ b/open-hardware/index.html @@ -0,0 +1,2072 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Hardware Abierto - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + + +

Hardware Abierto

+

basic-two-sides-angled

+

Explora los Detalles del Hardware

+ +

Cumplimiento con OSHWA

+

UID-CN000015 +Open Source Hardware Association

+

Nuestro Openterface Mini-KVM está orgullosamente certificado por la Open Source Hardware Association (OSHWA). Esta certificación de OSHWA (UID CN000015) confirma nuestro compromiso con los principios del hardware abierto, asegurando que todos los archivos de diseño, documentación y código fuente estén disponibles libremente para estudio, modificación, distribución y fabricación.

+

Únete a la Diversión del Desarrollo

+

Estamos emocionados de explorar el potencial de su hardware y estos pines de extensión, ¡y te invitamos a unirte a esta aventura! A medida que continuamos desarrollando y experimentando, actualizaremos esta sección con más información sobre lo que estos pines pueden hacer y cómo pueden ser utilizados de manera creativa.

+

Próximamente

+
    +
  • Explicaciones detalladas de la funcionalidad de los pines
  • +
  • Ejemplos de proyectos DIY que muestran usos innovadores de los pines de extensión
  • +
  • Ideas e implementaciones contribuidas por la comunidad
  • +
+

Involúcrate

+
    +
  1. Comparte tus Ideas: ¿Tienes un concepto genial para usar estos pines? ¡Nos encantaría escucharlo!
  2. +
  3. Contribuye con Proyectos DIY: Si has creado algo interesante, considera compartirlo con la comunidad.
  4. +
  5. Únete a la Discusión: Conéctate con otros desarrolladores y entusiastas para intercambiar ideas y colaborar.
  6. +
+

Mantente actualizado y participa en las discusiones sobre el desarrollo de los pines de extensión en nuestra comunidad de Discord o Reddit.

+

Tu creatividad y experiencia pueden ayudar a expandir los límites de lo que es posible con el Openterface Mini-KVM. ¡Innovemos juntos!

+ + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/oshw/index.html b/oshw/index.html new file mode 100644 index 0000000..af07312 --- /dev/null +++ b/oshw/index.html @@ -0,0 +1,14 @@ + + + + + + Redirecting... + + + + + +You're being redirected to a new destination. + + diff --git a/overrides/home.html b/overrides/home.html new file mode 100644 index 0000000..2a696db --- /dev/null +++ b/overrides/home.html @@ -0,0 +1,184 @@ +{% extends "main.html" %} + +{% block tabs %} + {{ super() }} + + + +
+
+
+
+ +
+
+
+ Producto Openterface Mini-KVM +
+ + ¡Ordena ahora! Crowd Supply + + + + Desafío DIY + +

Construye tu propio KVM USB & gana premios increíbles! 🏆

+ + +
+
+
+
+ +
+

Instala la App del Anfitrión

+
+ Imagen del Poster +
+
+ +
+ Avatar +

macOS

+ Tienda de Apps +
+
+ Avatar +

Linux

+ Código Fuente +
+ +
+

y más.

+
+ +
+ +
+ +
+
+ Imagen de Cierre de Producto +
+
+

Eleva tu kit de tecnología con Openterface Mini-KVM: + una solución KVM sobre USB compacta, rica en características y de código abierto que simplifica tu vida tecnológica con tareas de IT y solución de problemas al vuelo. +

+
+
+ +
+
+ Poster de Pre-Lanzamiento +
+
+

Despide a ese monitor, teclado y mouse extra! + Convierte tu laptop en una consola KVM inteligente para controlar cualquier dispositivo sin cabeza via HDMI y USB. +

+
+
+
+ +
+ +
+
+

Características

+
+
+ Icono de Plug and Play + Icono de Plug and Play +

Plug'n'Play

+
+
+ Icono de Acceso a BIOS + Icono de Acceso a BIOS +

Acceso a BIOS

+
+
+ Icono de Libre de Red + Icono de Libre de Red +

Libre de Red

+
+
+ Icono de Transferencia de Texto + Icono de Transferencia de Texto +

Transferencia de Texto

+
+
+ Icono de Interruptor USB + Icono de Interruptor USB +

Interruptor USB

+
+
+ Icono de Más + Icono de Más +

y más.

+
+
+
+
+ +
+
+

Previsualización del Producto

+
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ +
+ + Mastodon + +{% endblock %} + +{% block content %}{% endblock %} + +{% block footer %} + {{ super() }} +{% endblock %} \ No newline at end of file diff --git a/overrides/main.html b/overrides/main.html new file mode 100644 index 0000000..e4cc60f --- /dev/null +++ b/overrides/main.html @@ -0,0 +1,10 @@ +{% extends "base.html" %} + +{% block extrahead %} + +{% endblock %} + +{% block scripts %} + {{ super() }} + +{% endblock %} \ No newline at end of file diff --git a/overrides/partials/consent.html b/overrides/partials/consent.html new file mode 100644 index 0000000..db8c43d --- /dev/null +++ b/overrides/partials/consent.html @@ -0,0 +1,107 @@ + + + +{% set cookies = config.extra.consent.cookies | d({}) %} +{% if config.extra.analytics %} + {% if "analytics" not in cookies %} + {% set _ = cookies.update({ "analytics": "Google Analytics" }) %} + {% endif %} +{% endif %} +{% if config.repo_url and "github.com" in config.repo_url %} + {% if "github" not in cookies %} + {% set _ = cookies.update({ "github": "GitHub" }) %} + {% endif %} +{% endif %} + + +{% set actions = config.extra.consent.actions %} +{% if not actions %} + {% set actions = ["accept", "manage"] %} +{% endif %} + + +{% if "manage" not in actions %} + {% set checked = "checked" %} +{% endif %} + + +

{{ config.extra.consent.title }}

+

{{ config.extra.consent.description }}

+ + + + + + + diff --git a/overrides/partials/footer.html b/overrides/partials/footer.html new file mode 100644 index 0000000..193af38 --- /dev/null +++ b/overrides/partials/footer.html @@ -0,0 +1,108 @@ + + \ No newline at end of file diff --git a/pin/index.html b/pin/index.html new file mode 100644 index 0000000..84ea01d --- /dev/null +++ b/pin/index.html @@ -0,0 +1,2049 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Pines de Extensión - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + + +

Guía de Pines de Extensión

+

change-cap +change-cap

+

El Openterface Mini-KVM cuenta con pines de extensión para desarrollo avanzado y experimentación con Software Abierto. Estos pines no están expuestos en la configuración estándar del dispositivo.

+

Acceso a los Pines de Extensión para Desarrollo

+

Para acceder a los pines de extensión:

+
    +
  1. Desmonta el dispositivo
  2. +
  3. Sustituye la tapa original del dispositivo con una tapa especializada para pines de extensión
  4. +
  5. Descarga el modelo 3D de la tapa para pines de extensión desde nuestro repositorio de GitHub
  6. +
+
+

Garantía Anulada

+

Al retirar la tapa original, se anula la garantía del producto. Todas las modificaciones o desmontajes se realizan bajo el propio riesgo del usuario.

+
+
+

Características Experimentales

+

Las características desarrolladas utilizando estos pines son experimentales y no han sido completamente probadas. Openterface no se hace responsable de cualquier daño, lesión o mal funcionamiento resultante de modificaciones, exposición de los pines de extensión u otras alteraciones al dispositivo.

+
+

Distribución de los Pines

+

target-side +host-side +target-side +host-side

+

Los pines de extensión proporcionan las siguientes conexiones:

+
    +
  1. Suministro de energía USB de 5V para componentes externos
  2. +
  3. Datos positivos al hub USB del host
  4. +
  5. Datos negativos al hub USB del host
  6. +
  7. Datos positivos al hub USB del target
  8. +
  9. Datos negativos al hub USB del target
  10. +
  11. Tierra
  12. +
+
+

Conexiones Incorrectas

+

Confundir VCC y GND puede causar daños graves al dispositivo y a los componentes conectados. Siempre verifica las conexiones de los pines antes de encender el dispositivo.

+
+ + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/privacy-policy/index.html b/privacy-policy/index.html new file mode 100644 index 0000000..2bf8d26 --- /dev/null +++ b/privacy-policy/index.html @@ -0,0 +1,2091 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Política de Privacidad - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + + +

Privacy Policy

+

This Privacy Policy applies to the “Openterface” mini-KVM device and its associated macOS application (collectively, the “Service”), developed and operated by Guangzhou Billio Tech. Co., Ltd. By using our Service, you agree to the collection and use of information in accordance with this policy. If you do not agree with any part of this policy, please refrain from using any products and services offered.

+

Data Collection and Use

+

We are committed to protecting your privacy. Our Service does not collect, store, or transfer any personal data at any stage in using our app. For the effective operation of our Service - controlling your computer remotely through the Openterface device and app, we require access to certain types of non-personal data:

+
    +
  1. Camera Access: We require camera permissions to capture the video feed from your remotely connected computer. This is essential for displaying the feed on your device through the Openterface application.
  2. +
  3. Keyboard and Mouse Event Data: To enable remote control functionalities, we need permissions to listen to local keyboard and mouse events. This data is used solely to convert these events into control signals for the target device connected through our hardware.
  4. +
+

Please note that the above-mentioned data is considered non-personal as it does not directly identify you as an individual. The permissions we request are necessary solely to enable core functionality. Data is also never stored or transferred outside your device.

+

Security

+

With no collection or retention of user data at any point, protecting user data via security measures is not applicable in our case. Our app presents no privacy risks inherent in its intended functionality.

+

Disclaimer

+

The Service may become open source in the future for transparency and community supervision. As a result, various versions of the app and device may be created and modified by third parties.This would enable anyone to inspect the code and build versions themselves, as well as modify for custom use cases. We will not be responsible for what individuals or organizations may build from modified code and hardware. It is the user's responsibility to verify the source of the application. We strongly recommend downloading the app from our official website openterface.com and well-known, reliable certified app platform platforms for safety and reliability.

+

Changes to this Policy

+

We may occasionally update this privacy policy to comply with law changes or reflect updates to our application. Any changes will be posted clearly on this page. Continued use of Openterface after changes signifies consent to the revised privacy policy.

+

Agreement to Privacy Policy

+

By agreeing to our Service Usage Agreement, you also agree to this Privacy Policy. This Privacy Policy is an integral part of our Service Usage Agreement. If you disagree with any part of this policy, please do not use our Service.

+

Language and Interpretation

+

This agreement has been provided in multiple languages for convenience. It is agreed that the working language of the company is both English and Chinese. In the event of any inconsistency between the English and non-English versions of this policy or any related documents, the English version shall prevail. The final interpretation of this policy will be in English.

+

Governing Law and Jurisdiction

+

This Agreement and any disputes arising from it shall be governed by the laws and regulations of the jurisdiction where Openterface is registered, unless otherwise mandated by law. In any civil litigation or other legal proceedings to enforce rights under this Agreement, each party shall bear its own legal costs and expenses.

+

Contact Information

+

For any questions or concerns regarding this Privacy Policy, please contact us at info@techxartisan.com. We encourage feedback and will endeavour to address your concerns promptly.

+ + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/qt/index.html b/qt/index.html new file mode 100644 index 0000000..e4acc48 --- /dev/null +++ b/qt/index.html @@ -0,0 +1,14 @@ + + + + + + Redirecting... + + + + + +You're being redirected to a new destination. + + diff --git a/quick-start/index.html b/quick-start/index.html new file mode 100644 index 0000000..38136a4 --- /dev/null +++ b/quick-start/index.html @@ -0,0 +1,2008 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Comienzo Rápido - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + + +

Inicio Rápido

+

basic-two-angled

+

Nuestro Openterface™ Mini-KVM te permite controlar una computadora sin monitor directamente desde tu laptop o computadora de escritorio usando conexiones USB y HDMI, eliminando la necesidad de periféricos adicionales o conectividad de red. A lo largo de esta documentación, nos referimos a tu laptop o computadora de escritorio como el Host ( host-computer Host host-computer Host ) y al dispositivo que se controla como el Target ( target-computer Target target-computer Target).

+
+ +
+ + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/reddit/index.html b/reddit/index.html new file mode 100644 index 0000000..6038538 --- /dev/null +++ b/reddit/index.html @@ -0,0 +1,14 @@ + + + + + + Redirecting... + + + + + +You're being redirected to a new destination. + + diff --git a/return-refunds-warranty/index.html b/return-refunds-warranty/index.html new file mode 100644 index 0000000..0e0d8cc --- /dev/null +++ b/return-refunds-warranty/index.html @@ -0,0 +1,2092 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Devoluciones, Reembolsos y Garantía - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + + +

Return, Refunds and Warranty Policy

+

Returns

+

Openterface provides options for returns and exchanges in accordance with the following terms and conditions:

+

Damage in Shipment

+

Should your product arrive with damage incurred during shipment, we request you to inform us via email at info@techxartisan.com within two business days of receipt. Your email should detail the damages and, where possible, include photographic evidence. This assists us greatly in ensuring our products are properly packaged and transported. We will organize replacements for the damaged products.

+

Exchanges

+

If you are unsatisfied with your purchase for any reason, we offer the facility to return items in exchange for store credit. For a return to be accepted, items must adhere to the criteria outlined in the section [Important Conditions for Return]. Please initiate exchanges within 15 days following delivery. Note that Openterface does not cover the costs of return postage and customs tax.

+

Important Conditions for Return

+

Upon receiving the returned product, it will undergo an inspection. To ensure a smooth return process, please meet the following conditions:

+
    +
  • The product must be in its original, undamaged state.
  • +
  • Notification of the product's return must be given to us within 15 business days.
  • +
  • The return package should contain all items that were included in the original purchase, such as price tags, labels, original packaging, freebies, accessories, invoices, warranty cards, and other documentation.
  • +
  • It is acknowledged and agreed that Openterface retains the discretion to determine if a product is in a saleable condition. Items deemed unsaleable will be discarded and no store credit or exchange will be issued for these items.
  • +
+

Refunds

+

Once your return is received and inspected, we will send you an email to notify you of the receipt of your returned item. If the product is returned in an undamaged state, we will process the refund within five working days.

+

Warranty

+

This warranty policy confers specific legal rights upon you. Additionally, depending on your location—be it a particular state, province, or country—you may have other rights.

+

Openterface, as governed by law, respects your rights and does not seek to exclude, limit, or suspend any rights you possess, particularly those arising from nonconformity with a sales contract. To fully understand your rights, it's advisable to refer to the laws of your state, province, or country.

+

Scope of this Warranty

+

The benefits provided by this Openterface warranty are in addition to, and do not detract from, any rights and remedies you may have under law in connection to the goods and services under warranty. This warranty is applicable to any Openterface products purchased from an authorised Openterface reseller or directly via www.openterface.com.

+
    +
  • Our policy limits warranties and services to products bought either directly from Openterface or an authorised Openterface reseller, and requires accompanying proof of purchase. If your Openterface product was bought from an unauthorised reseller, or if its original factory serial number is missing, defaced, or altered, this warranty becomes invalid.
  • +
  • Be aware that some websites and dealers may falsely claim to be authorised Openterface resellers. Products bought through these sources are not covered by an Openterface warranty. These products may be counterfeit, used, defective, or unsuitable for use in your country. Ensure your protection and the integrity of your Openterface product by buying only from authorised resellers. For information on authorised resellers, please visit our website.
  • +
+

Warranty Coverage

+
    +
  • Openterface guarantees its products, in their original packaging, against defects in materials and workmanship under normal use.
  • +
  • All Openterface limited warranties commence from the date of purchase. KEEP YOUR RECEIPT AS PROOF OF PURCHASE. The duration of the Openterface limited hardware warranty is typically 6 months from the date of purchase, though this may vary for different Openterface products.
  • +
  • All Openterface warranties, including any statutory guarantees or non-excludable statutory warranties, are valid solely during the period the product is owned by the original purchaser. The 'original purchaser' is defined as the first buyer of the product from Openterface or an authorised reseller. Openterface limited warranties, including any lifetime warranties, are non-transferable.
  • +
  • The warranty does not cover scenarios outside normal use, such as theft, accidents, misuse, abuse, water damage, or use of the product in conditions outside its specified operational climate.
  • +
+

To the extent permitted by applicable law, this warranty and any implied warranties constitute your sole and exclusive warranties, superseding all other warranties or conditions, whether express or implied. Some jurisdictions may not allow limitations on the duration of an implied warranty, so the above limitation may not apply in your case.

+ + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/roadmap/index.html b/roadmap/index.html new file mode 100644 index 0000000..3b5ee4e --- /dev/null +++ b/roadmap/index.html @@ -0,0 +1,1968 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Hoja de Ruta - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + + +

Hoja de Ruta

+

Trabajo en Progreso +Próximamente.

+ + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 0000000..333842e --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"lang":["es"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Inicio","text":"

Bienvenido a Openterface mini-KVM.

"},{"location":"accessories/","title":"Accesorios","text":"

Aqu\u00ed encontrar\u00e1s una variedad de productos que complementan y mejoran la funcionalidad del Openterface Mini-KVM. Nuestro objetivo es ofrecer una gama de accesorios que hagan tu experiencia con nuestro Mini-KVM a\u00fan m\u00e1s vers\u00e1til y conveniente.

"},{"location":"accessories/#cable-convertidor-de-vga-a-hdmi","title":"Cable Convertidor de VGA a HDMI","text":"

Este producto convierte video VGA e integra audio en HDMI, permitiendo una f\u00e1cil conexi\u00f3n de dispositivos VGA a pantallas HDMI.

  • Modelo: CABLE100-VGA2HDMI
  • Longitud: 1M
  • Resoluci\u00f3n de Video de Salida: 1920x1080P Full HD
  • Entrada de Audio: Jack de audio de 3.5mm
  • Salida de Audio: a trav\u00e9s de HDMI
  • Fuente de Alimentaci\u00f3n: Alimentado v\u00eda USB
"},{"location":"accessories/#caso-de-uso","title":"Caso de Uso","text":"

Para un caso de uso detallado de este cable, por favor visita Gesti\u00f3n de Servidores Simplificada.

"},{"location":"accessories/#video-demostrativo","title":"Video Demostrativo","text":"

Mira el video demostrativo del influenciador tecnol\u00f3gico Cameron Gray sobre c\u00f3mo usar este cable con el Mini-KVM: \u00a1Esta Consola USB KVM es Incre\u00edble!

Realizar Pedido

"},{"location":"accessories/#cable-tipo-c-a-usb-a-con-adaptador","title":"Cable Tipo-C a USB-A con Adaptador","text":"

Este vers\u00e1til cable Tipo-C Macho a USB-A Macho, junto con un adaptador de USB-A Hembra a USB-C Macho, ofrece una conectividad flexible a dispositivos objetivo. Permite la transferencia de datos y la transmisi\u00f3n de se\u00f1ales de control de teclado y rat\u00f3n, independientemente de si el dispositivo objetivo utiliza un puerto USB-A o Tipo-C.

  • Longitud: 0.3m
  • Color: Negro
  • Adaptador: USB-A Hembra a USB-C Macho
  • Uso: Facilita el control y la transferencia de datos al dispositivo objetivo.
"},{"location":"accessories/#cable-tipo-c-a-tipo-c-con-adaptador","title":"Cable Tipo-C a Tipo-C con Adaptador","text":"

Este elegante y suave cable Tipo-C Macho a Macho en vibrante color naranja est\u00e1 dise\u00f1ado para conexiones de computadoras host. Viene con un adaptador de USB-C Hembra a USB-A Macho para una mayor compatibilidad, asegurando que puedas conectarte a computadoras host usando puertos Tipo-C o USB-A. Adem\u00e1s, este cable soporta carga r\u00e1pida de 240W (Voltaje DC50V, Corriente 5A, Potencia 240W), lo que lo hace perfecto no solo para nuestros Mini-KVMs, sino tambi\u00e9n para cargar tu tel\u00e9fono m\u00f3vil o laptop.

  • Longitud: 1.5m
  • Color: Naranja
  • Adaptador: USB-C Hembra a USB-A Macho
  • Uso: Para transferencia de datos de alta velocidad entre la computadora host y el Mini-KVM, y para carga r\u00e1pida de tel\u00e9fonos m\u00f3viles o laptops.
"},{"location":"accessories/#cable-hdmi-macho-a-macho","title":"Cable HDMI Macho a Macho","text":"

Este compacto cable HDMI es perfecto para conectar tu dispositivo objetivo y capturar la salida de video, asegurando una integraci\u00f3n perfecta con tu Openterface Mini-KVM.

  • Longitud: 0.3m
  • Color: Negro
  • Uso: Ideal para la transmisi\u00f3n de video en alta definici\u00f3n desde el dispositivo objetivo al Mini-KVM.
"},{"location":"accessories/#bolsa-de-herramientas-openterface","title":"Bolsa de Herramientas Openterface","text":"

Mant\u00e9n tu Openterface Mini-KVM y sus accesorios organizados y port\u00e1tiles con esta compacta bolsa de herramientas. Con una elegante cremallera naranja y bolsillos de malla el\u00e1stica, esta bolsa asegura una excelente gesti\u00f3n de cables y facilidad de transporte, perfecta para profesionales de TI en movimiento.

  • Dimensiones: 180 x 115 x 50mm
  • Color: Negro con cremallera naranja
  • Uso: Ideal para almacenar y organizar tu Mini-KVM y sus cables.
"},{"location":"accessories/#tapa-de-extension-de-pines","title":"Tapa de Extensi\u00f3n de Pines","text":"

Esta tapa de extensi\u00f3n de pines impresa en 3D reemplaza la tapa original del Openterface Mini-KVM, permitiendo a los usuarios avanzados exponer y acceder a los pines de extensi\u00f3n para desarrollo personalizado. Puedes descargar los archivos del modelo 3D desde nuestro repositorio de GitHub e imprimir la tapa t\u00fa mismo.

  • Uso: Proporciona acceso a los pines de extensi\u00f3n para desarrollo avanzado de hardware.
  • Descarga: Archivos del Modelo 3D
"},{"location":"accessories/#mas-proximamente","title":"M\u00e1s Pr\u00f3ximamente","text":"

Mantente atento a m\u00e1s accesorios que se agregar\u00e1n a esta secci\u00f3n, dise\u00f1ados para mejorar tu experiencia con el Openterface Mini-KVM.

"},{"location":"app/","title":"Software Abierto","text":""},{"location":"app/#aplicaciones-host","title":"Aplicaciones Host","text":"

Para usar este mini-KVM, el ordenador host debe instalar una de las siguientes aplicaciones host.

  • Windows

    Descarga la aplicaci\u00f3n Openterface QT para Windows

    Descargar v0.0.3 Openterface_QT Ver Demo

  • macOS

    Obt\u00e9n Openterface para macOS desde la App Store

    App Store Openterface_MacOS Ver Demo

  • Linux

    Compila desde el c\u00f3digo fuente para la aplicaci\u00f3n QT en Linux

    Openterface_QT Ver Demo

  • Android

    Descarga el APK de Android para tel\u00e9fono o tableta Android

    Descargar v1.0.6 Openterface_Android Watch Demo

Consulta Control B\u00e1sico y C\u00f3mo Funciona para m\u00e1s informaci\u00f3n.

"},{"location":"app/#cumplimiento-osi","title":"Cumplimiento OSI","text":"

Nuestras aplicaciones para el Mini-KVM de Openterface est\u00e1n licenciadas bajo la AGPL-3.0, una licencia aprobada por la Iniciativa de C\u00f3digo Abierto\u00ae. El logo de OSI\u00ae es una marca registrada de la Iniciativa de C\u00f3digo Abierto, y cumplimos orgullosamente con la Definici\u00f3n de C\u00f3digo Abierto. Para m\u00e1s informaci\u00f3n, visita la Iniciativa de C\u00f3digo Abierto en http://opensource.org y nuestros repositorios de Github de Openterface.

"},{"location":"app/#unete-a-nuestro-desarrollo","title":"\u00danete a Nuestro Desarrollo","text":"

Las aplicaciones host mencionadas est\u00e1n actualmente en desarrollo. \u00a1Estamos activamente codificando \ud83d\udee0\ufe0f y mejor\u00e1ndolas continuamente! \ud83d\udcaa Si est\u00e1s interesado en contribuir y quieres ser parte de un equipo de desarrollo innovador, \u00a1\u00fanete ahora! \ud83d\ude80

\u00bfInteresado en el lado del hardware? Visita nuestra p\u00e1gina de Hardware Abierto para explorar los esquemas del dispositivo, componentes, y hasta contribuir en su dise\u00f1o f\u00edsico! \ud83d\udd27\ud83d\udda5\ufe0f

"},{"location":"basic/","title":"Control B\u00e1sico","text":""},{"location":"basic/#compatibilidad","title":"\ud83d\udcbb Compatibilidad","text":"
  • Software del Host: Instala nuestra aplicaci\u00f3n de host para macOS, Windows y Linux para controlar tus dispositivos objetivo. Aseg\u00farate de que tu sistema host sea compatible con la versi\u00f3n correspondiente de la aplicaci\u00f3n.
  • Compatibilidad del Dispositivo Objetivo: No se requiere preinstalaci\u00f3n ni configuraci\u00f3n en el dispositivo objetivo. Siempre que el dispositivo objetivo soporte operaciones de UI con salida de video (por ejemplo, HDMI, VGA) y tenga un puerto USB para recibir se\u00f1ales emuladas de control de teclado y rat\u00f3n (HID), se puede utilizar. Las plataformas objetivo compatibles incluyen Windows, macOS, Linux, Android y iOS.
"},{"location":"basic/#control-del-raton","title":"\ud83d\uddb1 Control del Rat\u00f3n","text":"
  • Modo Absoluto: El cursor del rat\u00f3n del dispositivo objetivo se mapea directamente a una posici\u00f3n espec\u00edfica en la pantalla del host a trav\u00e9s de nuestra aplicaci\u00f3n. Esto significa que donde muevas el rat\u00f3n del host dentro de nuestra aplicaci\u00f3n, el rat\u00f3n del objetivo seguir\u00e1 el mismo movimiento. Ten en cuenta que puede haber un ligero retraso en los movimientos del cursor. Puedes elegir ocultar o mostrar el cursor del rat\u00f3n del host mientras est\u00e1 en nuestra aplicaci\u00f3n.

  • Modo Relativo: El movimiento del rat\u00f3n del objetivo es relativo a la posici\u00f3n actual del rat\u00f3n del host. Esto significa que mover el rat\u00f3n del host desplazar\u00e1 el cursor del objetivo una cierta distancia en la misma direcci\u00f3n, sin un punto de inicio o fin fijo. Puedes salir de este modo relativo usando un atajo espec\u00edfico.

"},{"location":"basic/#teclado","title":"\u2328\ufe0f Teclado","text":"

Cuando la aplicaci\u00f3n est\u00e1 enfocada, puedes escribir cualquier cosa directamente, y estas pulsaciones de teclas se pasar\u00e1n a la computadora objetivo.

"},{"location":"basic/#acceso-a-nivel-de-bios","title":"\u2699\ufe0f Acceso a Nivel de BIOS","text":"
  • Acceso a BIOS: Usa nuestra aplicaci\u00f3n para acceder al BIOS de tus dispositivos objetivo. Esto te permite controlar y configurar ajustes directamente desde el BIOS.
Pulsaciones de teclas para entrar al BIOS en diferentes placas base
  • F2: Dell, Lenovo, ASUS, Acer, Toshiba, Samsung, Sony
  • F1: Lenovo
  • Del: ASUS, Acer, Gigabyte, MSI
  • F10: HP
  • Bot\u00f3n Assist: Sony
  • Tecla Option (\u2325): Apple (para acceder al gestor de arranque)
"},{"location":"basic/#sonido","title":"\ud83d\udd0a Sonido","text":"
  • Transmisi\u00f3n de Audio: El audio de la computadora objetivo se transmite a trav\u00e9s del puerto de entrada HDMI del mini-KVM. Al usar nuestra aplicaci\u00f3n, el sonido de la computadora objetivo se reproducir\u00e1 a trav\u00e9s de la computadora host, asegurando que escuches todo sin problemas.
"},{"location":"basic/#video","title":"\ud83c\udfa5 Video","text":"
  • Visualizaci\u00f3n de Video: Nuestra aplicaci\u00f3n te permite ver la pantalla de la computadora objetivo sin problemas. Soporta resoluciones de video de hasta 1920x1080 a 30Hz para visualizaci\u00f3n dentro de la aplicaci\u00f3n. La entrada de video m\u00e1xima soportada es de hasta 3840x2160 a 30Hz a trav\u00e9s de HDMI. Adem\u00e1s, con el uso de un adaptador, tambi\u00e9n puede acomodar VGA, Micro HDMI, DVI y otras fuentes de entrada de video.
"},{"location":"basic/#puerto-usb-conmutable","title":"\ud83d\udd04 Puerto USB Conmutable","text":"
  • Uso del Puerto USB: El mini-KVM cuenta con un puerto USB-A 2.0 conmutable que se puede alternar entre las computadoras host y objetivo, pero no ambas simult\u00e1neamente.
  • M\u00e9todos de Conmutaci\u00f3n:
    • Conmutador de Hardware: Un interruptor f\u00edsico en el dispositivo
    • Conmutador de Software: Un bot\u00f3n en la aplicaci\u00f3n del host
  • L\u00f3gica de Conmutaci\u00f3n: Para obtener informaci\u00f3n m\u00e1s detallada sobre la l\u00f3gica de c\u00f3mo opera el puerto USB conmutable, incluyendo la interacci\u00f3n entre los conmutadores de hardware y software, configuraci\u00f3n inicial, estados operativos y transiciones de estado, consulta la documentaci\u00f3n del Conmutador USB.

Importante

  • Recuerda expulsar cualquier unidad USB conectada antes de cambiar la conexi\u00f3n del puerto.
  • El puerto USB tiene limitaciones de potencia. No conectes dispositivos que requieran mucha energ\u00eda, ya que esto puede resultar en una operaci\u00f3n inestable o da\u00f1o potencial.
"},{"location":"comparison/","title":"Comparaci\u00f3n","text":"","tags":["KVM","mini-KVM","KVM-over-IP","KVM-over-USB","VNC","Hardware KVM","Software KVM"]},{"location":"comparison/#en-que-se-diferencia-este-mini-kvm-del-kvm-over-ip","title":"\u00bfEn qu\u00e9 se diferencia este Mini-KVM del KVM-over-IP?","text":"
  1. Independencia de la Red: Nuestro Openterface mini-KVM utiliza una conexi\u00f3n USB directa para el control, mientras que el KVM-over-IP depende de la conectividad de red, lo que requiere un esfuerzo y tiempo adicionales para configurarse en nuevos dispositivos objetivo.
  2. Rendimiento Estable: El Mini-KVM ofrece un rendimiento r\u00e1pido y estable sin verse afectado por la calidad de la red, a diferencia del KVM-over-IP, que puede verse impactado por la velocidad y estabilidad de la red.
  3. Portabilidad: El Mini-KVM est\u00e1 dise\u00f1ado para ser port\u00e1til y f\u00e1cil de usar con dispositivos cercanos sin pantalla, lo que lo hace ideal para situaciones inciertas donde el acceso a la red es limitado o inexistente.
  4. Transferencia Directa de Archivos: El Mini-KVM permite transferencias de archivos estables entre el host y los dispositivos objetivo a trav\u00e9s de un puerto USB-A conmutador, conectando una memoria USB. Esta es una caracter\u00edstica que puede no ser tan sencilla con algunas soluciones KVM-over-IP.
  5. P\u00fablico Objetivo: El Mini-KVM es especialmente adecuado para entusiastas de la tecnolog\u00eda y profesionales de TI que necesitan una soluci\u00f3n r\u00e1pida y confiable para configurar o solucionar problemas en dispositivos cercanos sin pantalla, mientras que el KVM-over-IP se utiliza a menudo en entornos con una red estable donde el acceso remoto por IP es una prioridad.
","tags":["KVM","mini-KVM","KVM-over-IP","KVM-over-USB","VNC","Hardware KVM","Software KVM"]},{"location":"comparison/#en-que-se-diferencia-de-las-soluciones-kvm-tradicionales","title":"\u00bfEn qu\u00e9 se diferencia de las soluciones KVM tradicionales?","text":"
  1. Portabilidad: El Openterface Mini-KVM est\u00e1 dise\u00f1ado para ser port\u00e1til, lo que lo hace ideal para entusiastas de la tecnolog\u00eda y profesionales de TI que necesitan una soluci\u00f3n compacta. Es lo suficientemente peque\u00f1o y elegante como para llevarlo en tu mochila. Los conmutadores KVM tradicionales tienden a ser m\u00e1s grandes y est\u00e1n dise\u00f1ados para configuraciones estacionarias de operaci\u00f3n 24/7.
  2. Mecanismo de Control e Integraci\u00f3n: Los conmutadores KVM tradicionales utilizan mecanismos de conmutaci\u00f3n basados en hardware puro, permitiendo el control de solo una computadora a la vez. En contraste, el Openterface Mini-KVM combina hardware y software, permitiendo el control tanto del host como de los dispositivos objetivo a trav\u00e9s de una \u00fanica interfaz en la computadora o laptop del host. Este enfoque integrado facilita la conmutaci\u00f3n fluida entre el host y el objetivo a nivel de ventana de la aplicaci\u00f3n, mejorando significativamente la eficiencia del flujo de trabajo.
  3. Funcionalidad: Mientras que el Openterface Mini-KVM se enfoca en el control directo 1-a-1 a trav\u00e9s de USB y captura de video HDMI, los conmutadores KVM tradicionales pueden ofrecer una gama m\u00e1s amplia de funcionalidades, incluyendo control de m\u00faltiples dispositivos a trav\u00e9s de USB, VGA, DVI, HDMI, soporte de audio y, a veces, incluso capacidades de acceso remoto a trav\u00e9s de la red.
  4. Fuente de Alimentaci\u00f3n: El mini-KVM no requiere una fuente de alimentaci\u00f3n externa, ya que est\u00e1 dise\u00f1ado para ser alimentado a trav\u00e9s de sus conexiones USB-C desde el host, mejorando su portabilidad. Los KVM tradicionales son soluciones estacionarias que necesitan una fuente de alimentaci\u00f3n adicional.
","tags":["KVM","mini-KVM","KVM-over-IP","KVM-over-USB","VNC","Hardware KVM","Software KVM"]},{"location":"comparison/#comparacion-entre-nuestro-mini-kvm-kvm-tradicional-y-vnc","title":"Comparaci\u00f3n entre nuestro Mini-KVM, KVM tradicional y VNC","text":"Categor\u00eda de Comparaci\u00f3n Openterface Mini-KVM Conmutador KVM Tradicional VNC Tradicional \ud83c\udfae M\u00e9todo y Limitaci\u00f3n Local, limitado por cable Local, limitado por cable Local/Remoto, limitado por red \ud83d\ude80 Portabilidad Altamente port\u00e1til, f\u00e1cil de configurar Estacionario, voluminoso Basado en software, no aplicable \ud83d\udee0\ufe0f Complejidad de Instalaci\u00f3n Plug-and-play, configuraci\u00f3n m\u00ednima Configuraci\u00f3n moderada, perif\u00e9ricos requeridos Configuraci\u00f3n de red y software, compleja \ud83d\udda5\ufe0f Interfaz de Control Interfaz de software del host Interfaz de conmutador f\u00edsico Interfaz de software del host \ud83d\udc41\ufe0f Interfaz de Usuario Intuitiva basada en aplicaci\u00f3n Conmutaci\u00f3n f\u00edsica, sin software Interfaz de software variable \ud83d\udd04 Compatibilidad entre SO Totalmente compatible con m\u00faltiples SO Depende del modelo y las conexiones Se requiere software compatible \ud83d\uddbc\ufe0f Resoluci\u00f3n de Pantalla Alta calidad v\u00eda HDMI Var\u00eda con el cable y el KVM Var\u00eda con el software y la red \ud83d\udd11 Acceso a BIOS S\u00ed S\u00ed No \ud83d\udcc1 Transferencia de Archivos Basada en hardware v\u00eda su USB-A conmutador No disponible Basada en software, dependiente de la red \ud83d\udcbb Soporte Multi-Dispositivo 1-a-1, por un host y dependiente del hardware 1-a-N, por una configuraci\u00f3n f\u00edsica N-a-N, por red y dependiente del software \ud83d\udd0c Cables y Accesorios Menos cables (HDMI, Tipo-C a USB-A) M\u00faltiples (Cable de video, teclado, rat\u00f3n, etc.) Red requerida \ud83d\udcf1 Software Se requiere aplicaci\u00f3n host para macOS No se requiere software adicional para operaci\u00f3n b\u00e1sica Software cliente en ambos host y objetivo \u26a1\ufe0f Fuente de Alimentaci\u00f3n No se necesita fuente de alimentaci\u00f3n externa A menudo se requiere fuente de alimentaci\u00f3n externa No aplicable (basado en software)

Nuestra tabla de comparaci\u00f3n anterior est\u00e1 dise\u00f1ada para proporcionar una visi\u00f3n clara de c\u00f3mo cada soluci\u00f3n se alinea con diferentes necesidades de los usuarios, ayud\u00e1ndote a elegir la opci\u00f3n m\u00e1s adecuada para tu configuraci\u00f3n \u00fanica.

En resumen, el Openterface Mini-KVM destaca por su portabilidad, facilidad de instalaci\u00f3n y la intuitiva interfaz de control basada en aplicaciones. Sobresale en proporcionar una conexi\u00f3n estable y de alta calidad para una interacci\u00f3n uno a uno entre el host y el objetivo sin requerir red ni alimentaci\u00f3n externa. En contraste, las soluciones KVM tradicionales ofrecen conmutaci\u00f3n f\u00edsica entre m\u00faltiples dispositivos, pero a menudo a costa de la portabilidad y la simplicidad de configuraci\u00f3n. VNC, aunque flexible al permitir que m\u00faltiples hosts se conecten a m\u00faltiples dispositivos a trav\u00e9s de una red, depende en gran medida del software y la calidad de la red.

","tags":["KVM","mini-KVM","KVM-over-IP","KVM-over-USB","VNC","Hardware KVM","Software KVM"]},{"location":"contact/","title":"Cont\u00e1ctanos","text":"

Nos alegra que est\u00e9s interesado en ponerte en contacto con nosotros. Ya sea que tengas preguntas, comentarios o simplemente quieras saludarnos, aqu\u00ed tienes varias formas de comunicarte con nosotros:

"},{"location":"contact/#correos-electronicos-oficiales","title":"Correos Electr\u00f3nicos Oficiales","text":"

Para asegurarte de que te est\u00e1s comunicando con nosotros de manera segura y directa, ten en cuenta nuestras direcciones de correo electr\u00f3nico oficiales. Para cualquier consulta, soporte o comentario, no dudes en escribirnos a:

  • Correo Electr\u00f3nico Principal: info@techxartisan.com

Adem\u00e1s, cualquier direcci\u00f3n de correo electr\u00f3nico que termine con los siguientes dominios es reconocida como un canal de comunicaci\u00f3n oficial para nuestros miembros y clientes:

  • Dominio TechxArtisan: *@techxartisan.com
  • Dominio Openterface: *@openterface.com

Los correos electr\u00f3nicos provenientes de estas direcciones son de nuestro equipo, dedicado a brindarte el soporte e informaci\u00f3n que necesitas.

"},{"location":"contact/#siguenos-en-redes-sociales","title":"S\u00edguenos en Redes Sociales","text":"

Mantente al d\u00eda y en contacto con nosotros a trav\u00e9s de nuestras redes sociales:

  • \u00danete a nuestro subreddit
  • S\u00edguenos en Twitter
  • Dale me gusta en Facebook
  • \u00danete a nuestra comunidad en Discord
  • Suscr\u00edbete a nuestro canal de YouTube
  • S\u00edguenos en LinkedIn
"},{"location":"contact/#visita-nuestro-sitio-web","title":"Visita Nuestro Sitio Web","text":"

Para m\u00e1s informaci\u00f3n sobre nosotros, nuestro trabajo y productos, por favor visita nuestro sitio web:

  • Sitio Web Oficial de TechxArtisan
"},{"location":"contact/#marca-registrada-y-propiedad-del-dominio","title":"Marca Registrada y Propiedad del Dominio","text":"

Openterface y TechxArtisan son marcas registradas de Guangzhou Billio Technology Co., Ltd. (Billio Tech), que act\u00faa como nuestra entidad comercial oficial. Billio Tech tiene los derechos interpretativos finales para ambas marcas, Openterface y TechxArtisan.

El dominio Openterface.com est\u00e1 registrado bajo Billio Tech, lo que confirma nuestra propiedad y gesti\u00f3n de todas las comunicaciones y operaciones oficiales asociadas.

"},{"location":"contact/#sobre-nuestra-empresa","title":"Sobre Nuestra Empresa","text":"
  • Nombre de la Empresa: Guangzhou Billio Technology Co., Ltd.
  • Direcci\u00f3n: Room 11, No. 1, Longjing North Street, Haizhu District, Guangzhou City, Guangdong Province, 510320 China
  • Informaci\u00f3n de Contacto: info@techxartisan.com
"},{"location":"contributing/","title":"Contribuir","text":"

\u00a1Hola! \u00bfTe interesa unirte a la comunidad de Openterface mini-KVM y contribuir? \u00a1Genial! \ud83e\udde1

"},{"location":"contributing/#difundir-la-palabra","title":"Difundir la Palabra \ud83d\udce2","text":"

Si has encontrado \u00fatil nuestro gadget Openterface y ha mejorado tu flujo de trabajo, \u00bfqu\u00e9 tal si ayudas a correr la voz? Compartir tu historia de c\u00f3mo usas el mini-KVM en tus tareas diarias con fotos o videos ser\u00e1 muy apreciado. Ya sea un evento de reparaci\u00f3n r\u00e1pida, una configuraci\u00f3n genial o una integraci\u00f3n \u00fanica en tu flujo de trabajo, \u00a1queremos verlo todo! Incluso podr\u00edas escribir una publicaci\u00f3n para compartir en nuestra vibrante comunidad en nuestro subreddit en /r/Openterface_miniKVM/ o en nuestro servidor de Discord TechxArtisan. \u00a1Hagamos ruido juntos! \ud83d\ude80 \u00a1Salud!

"},{"location":"contributing/#como-puedes-contribuir","title":"C\u00f3mo Puedes Contribuir \ud83c\udf1f","text":"

Nos encanta mantener este proyecto fresco y divertido para nuestra diversa comunidad de usuarios. \u00a1Siempre estamos mejorando y arreglando errores para mantener la fiesta en marcha!

Tu tiempo es valioso, lo entendemos, y sumergirse en informes de errores y solicitudes de cambios puede sentirse como caminar en arenas movedizas. Por eso hemos afinado nuestros plantillas de problemas y directrices para facilitarte las cosas. S\u00ed, hemos cuidado los detalles para asegurarnos de que nuestro rastreador de problemas de software y hardware y foro de discusi\u00f3n funcione como una m\u00e1quina bien engrasada.

\u00bfListo para sumergirte? \u00a1Vamos a empezar! \ud83c\udfca\u200d\u2642\ufe0f

"},{"location":"contributing/#reportar-un-error","title":"Reportar un Error \ud83d\udc1b","text":"

\u00bfEncontraste un error? No te preocupes, \u00a1pasa! Como a\u00fan estamos en las primeras etapas de desarrollo, se esperan errores, especialmente en los siguientes softwares. Cuando encuentres uno, por favor verifica si cae en estas pruebas de operaci\u00f3n b\u00e1sica. Cuantos m\u00e1s detalles proporciones sobre las condiciones en las que ocurri\u00f3 el error, mejor equipados estaremos para solucionarlo. Por favor, reporta cualquier error que encuentres en los repositorios correspondientes de Github.

  • Navega a:

    • Openterface_MacOS (En progreso): Aplicaciones Host para soporte en MacOS
    • Openterface_QT (En progreso): Aplicaciones Host para soporte en Win & Linux
    • Openterface_Mini-KVM_Hardware (En progreso): Esquemas y Componentes
  • Al reportar un error, por favor:

    • Especifica la versi\u00f3n de la aplicaci\u00f3n.
    • Describe el entorno tanto de la computadora host como del dispositivo objetivo.
    • Proporciona pasos detallados para reproducir el problema.
    • Explica el resultado esperado y el resultado real.
    • \u00a1Incluir capturas de pantalla o fragmentos de video ser\u00eda muy apreciado! \ud83d\udcf8\ud83c\udfa5

Adem\u00e1s, tambi\u00e9n puedes unirte al canal de Desarrollo #openterface-dev en nuestro servidor de Discord, o puedes intentar buscar 'TechxArtisan'.

Si\u00e9ntete libre de plantear cualquier problema. Es un gran lugar para que todos los beta testers discutan y compartan, lo que realmente podr\u00eda ayudarnos a mejorar el producto.

"},{"location":"contributing/#arreglar-un-error","title":"Arreglar un Error \ud83d\udee0\ufe0f","text":"

Si tienes habilidades de programaci\u00f3n y experiencia, considera sumergirte en nuestro repositorio para identificar, bifurcar, arreglar y enviar solicitudes de extracci\u00f3n.

"},{"location":"contributing/#reportar-un-problema-en-la-documentacion","title":"Reportar un Problema en la Documentaci\u00f3n \ud83d\udcdd","text":"

Si notas algo que parece incorrecto o desactualizado, nos encantar\u00eda tu ayuda para mejorarlo.

Aqu\u00ed te explicamos c\u00f3mo puedes ayudar:

  • Detecta el Problema: Si ves algo que no parece correcto en nuestra documentaci\u00f3n, \u00a1h\u00e1znoslo saber!
  • Proporciona Detalles: Cu\u00e9ntanos qu\u00e9 est\u00e1 mal. Ya sea un error tipogr\u00e1fico, informaci\u00f3n desactualizada o una explicaci\u00f3n confusa, cada detalle ayuda.
  • Sugiere Mejoras: Si tienes ideas sobre c\u00f3mo mejorar las cosas, \u00a1no te las guardes! Tus ideas son invaluables para mejorar la experiencia del usuario.
  • C\u00f3mo Reportar: Simplemente dir\u00edgete a nuestro repositorio correspondiente en GitHub y crea un problema detallando el problema. Incluye tanta informaci\u00f3n como sea posible para ayudarnos a entender y abordar el problema r\u00e1pidamente.

Tus contribuciones para mejorar nuestra documentaci\u00f3n son realmente apreciadas. Juntos, podemos asegurar que los usuarios tengan acceso a los mejores recursos posibles.

"},{"location":"contributing/#ayuda-a-traducir-nuestra-documentacion","title":"Ayuda a Traducir Nuestra Documentaci\u00f3n \ud83c\udf0d","text":"

Creemos que todos deber\u00edan tener acceso a nuestra soluci\u00f3n, sin importar el idioma que hablen. Por eso estamos buscando superestrellas biling\u00fces como t\u00fa para ayudar a traducir nuestro sitio web y documentaci\u00f3n a diferentes idiomas.

Si hablas varios idiomas con fluidez y te apasiona hacer que la tecnolog\u00eda sea accesible para personas de todo el mundo, \u00a1nos encantar\u00eda tu ayuda!

Ponte en contacto con nosotros para saber c\u00f3mo puedes convertirte en un embajador de idiomas para Openterface Mini-KVM y ayudarnos a llegar a m\u00e1s personas con nuestra soluci\u00f3n.

"},{"location":"contributing/#ayuda-a-mejorar-el-diseno","title":"Ayuda a Mejorar el Dise\u00f1o \ud83c\udfa8","text":"

Las primeras impresiones importan, y el atractivo visual de nuestro producto juega un papel crucial en captar la atenci\u00f3n de los usuarios y mejorar su experiencia general. Si tienes buen ojo para el dise\u00f1o y habilidad para crear visuales impresionantes, nos encantar\u00eda tu ayuda para mejorar los gr\u00e1ficos de nuestro producto.

Ya sea creando logotipos llamativos, dise\u00f1ando interfaces de usuario elegantes para nuestras aplicaciones host, creando materiales de marketing atractivos, o dise\u00f1o 3D para varias carcasas geniales, tu toque creativo puede llevar la est\u00e9tica de nuestro producto al siguiente nivel.

Si est\u00e1s listo para el desaf\u00edo y ansioso por hacer un impacto visual, ponte en contacto con nosotros para explorar c\u00f3mo puedes aportar tu experiencia en dise\u00f1o para elevar el atractivo de nuestro producto.

"},{"location":"contributing/#ayuda-a-moderar-nuestra-comunidad","title":"Ayuda a Moderar Nuestra Comunidad \ud83e\udd1d","text":"

Nuestra comunidad es como una gran familia amigable, y estamos buscando personas incre\u00edbles como t\u00fa para ayudar a mantenerla as\u00ed. Si te interesa mantener la paz y difundir buenas vibras, nos encantar\u00eda tenerte como moderador.

Como moderador, t\u00fa:

  • Mantendr\u00e1s las conversaciones positivas y ayudar\u00e1s a resolver cualquier disputa.
  • Asegurar\u00e1s que todos sigan las reglas para que nuestra comunidad se mantenga segura y acogedora.
  • Ayudar\u00e1s a los usuarios con preguntas y animar\u00e1s a las personas a compartir su conocimiento.

\u00bfTe suena bien? Ponte en contacto y hablemos sobre c\u00f3mo puedes unirte a nuestro equipo de moderadores.

"},{"location":"contributing/#y-mas-ayuda","title":"Y M\u00e1s Ayuda \ud83d\ude80","text":"

\u00bfTe sientes inspirado para contribuir pero no encajas en las categor\u00edas anteriores? No te preocupes, hay muchas otras formas en las que puedes echar una mano.

Ya sea probando nuevas funciones, proporcionando comentarios sobre la experiencia del usuario, o proponiendo ideas innovadoras, tu aporte es invaluable para el \u00e9xito de Openterface Mini-KVM.

Ponte en contacto con nosotros a trav\u00e9s de email y cu\u00e9ntanos c\u00f3mo te gustar\u00eda involucrarte. Juntos, \u00a1podemos hacer que Openterface Mini-KVM sea lo mejor posible!

Tu apoyo y contribuciones son lo que hacen que Openterface Mini-KVM prospere. \u00a1Gracias por ser parte de nuestro viaje hacia la excelencia! \ud83d\ude80

"},{"location":"faq/","title":"Preguntas Frecuentes (FAQs)","text":"

\u00a1Estamos encantados de tenerte aqu\u00ed! \ud83c\udf1f Esta secci\u00f3n est\u00e1 dise\u00f1ada para responder a las preguntas m\u00e1s frecuentes sobre el Openterface Mini-KVM, que nuestro equipo organiza peri\u00f3dicamente.

Vamos a sumergirnos en las preguntas m\u00e1s comunes sobre el Openterface Mini-KVM.

Actualizado: 20 de agosto de 2024

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#basico","title":"B\u00e1sico","text":"","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#que-es-el-openterface-mini-kvm","title":"\u00bfQu\u00e9 es el Openterface Mini-KVM?","text":"

El Openterface Mini-KVM te permite usar tu laptop o computadora para mostrar y controlar dispositivos sin pantalla a trav\u00e9s de una conexi\u00f3n USB y HDMI. Esta soluci\u00f3n KVM sobre USB ofrece un control KVM ligero, r\u00e1pido y sin interrupciones. Elimina la necesidad de monitores, teclados y ratones adicionales, proporcionando una soluci\u00f3n conveniente en lugares donde las conexiones de red son poco fiables o inexistentes. Es especialmente \u00fatil para una amplia gama de aplicaciones, especialmente para profesionales de la tecnolog\u00eda que solucionan problemas en dispositivos sin pantalla o computadoras de placa \u00fanica. Con el uso de un adaptador de video, tambi\u00e9n puede soportar VGA, Micro HDMI, DVI y otras fuentes de entrada.

El Openterface Mini-KVM es completamente de c\u00f3digo abierto tanto en hardware como en software, certificado por OSHWA y respaldado por una comunidad vibrante.

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#por-que-marca-la-diferencia-el-openterface-mini-kvm","title":"\u00bfPor qu\u00e9 marca la diferencia el Openterface Mini-KVM?","text":"

Con varias soluciones KVM disponibles, aqu\u00ed est\u00e1 por qu\u00e9 el Openterface Mini-KVM se destaca:

  • Portabilidad y Funcionalidad
  • Soluci\u00f3n sin red y para solucionar problemas al instante
  • Precio accesible
  • Completamente de c\u00f3digo abierto y con comunidad

Para leer m\u00e1s, visita nuestra p\u00e1gina Por qu\u00e9 Openterface Mini-KVM.

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#cuales-son-los-casos-de-uso-para-este-mini-kvm","title":"\u00bfCu\u00e1les son los casos de uso para este mini-KVM?","text":"

El Openterface Mini-KVM es el compa\u00f1ero perfecto para una amplia gama de usuarios y escenarios:

  • Profesionales de TI solucionando problemas en servidores
  • T\u00e9cnicos que dan servicio a cajeros autom\u00e1ticos, VLTs y quioscos
  • Desarrolladores gestionando dispositivos de computaci\u00f3n en el borde
  • Entusiastas de la tecnolog\u00eda experimentando con computadoras de placa \u00fanica
  • Profesionales que requieren operaciones locales seguras en la segregaci\u00f3n de redes, como aquellos que gestionan activos criptogr\u00e1ficos
  • Cualquiera que necesite flujos de trabajo integrados frecuentemente entre computadoras personales y de trabajo.

Por favor, tambi\u00e9n revisa esta p\u00e1gina: Casos de Uso

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#que-computadoras-host-son-compatibles-con-el-openterface-mini-kvm","title":"\u00bfQu\u00e9 computadoras host son compatibles con el Openterface Mini-KVM?","text":"

Para usar este mini-KVM, la computadora host debe instalar una de estas aplicaciones host para soportar MacOS, Windows, Linux y Android.

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#que-dispositivos-objetivo-son-compatibles-con-el-openterface-mini-kvm","title":"\u00bfQu\u00e9 dispositivos objetivo son compatibles con el Openterface Mini-KVM?","text":"

No se requiere preinstalaci\u00f3n ni configuraci\u00f3n en el dispositivo objetivo. Siempre que el dispositivo objetivo soporte operaciones de interfaz de usuario con salida de video (por ejemplo, HDMI, VGA) y tenga un puerto USB para recibir se\u00f1ales de control de teclado y rat\u00f3n emulados (HID), se puede usar. Por lo tanto, las plataformas de dispositivos objetivo compatibles incluyen Windows, MacOS, Linux, Android y iOS.

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#habra-soporte-tecnico-y-documentacion-disponible-para-el-openterface-mini-kvm","title":"\u00bfHabr\u00e1 soporte t\u00e9cnico y documentaci\u00f3n disponible para el Openterface Mini-KVM?","text":"

Puedes encontrar documentaci\u00f3n extensa para el Openterface Mini-KVM en nuestro sitio web en Openterface.com. Continuamente actualizamos estos recursos para optimizar tu experiencia con el dispositivo. Para soporte t\u00e9cnico, te invitamos a unirte a nuestra comunidad para compartir consultas e ideas con otros usuarios y nuestro equipo de expertos. Si tu problema persiste, nuestro equipo est\u00e1 disponible para proporcionar asistencia t\u00e9cnica adicional. Puedes contactarnos a trav\u00e9s de este correo electr\u00f3nico: info@techxartisan.com.

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#software","title":"Software","text":"","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#donde-puedo-descargar-las-aplicaciones-host","title":"\u00bfD\u00f3nde puedo descargar las aplicaciones host?","text":"

Visita nuestra p\u00e1gina Instalar Aplicaci\u00f3n Host para descargas oficiales.

Privacidad y Seguridad: Ten cuidado al usar aplicaciones host de terceros

Como nuestro proyecto es de c\u00f3digo abierto, puedes encontrar versiones alternativas de aplicaciones host compatibles con nuestro Mini-KVM desarrolladas por otros. Aunque estas pueden ofrecer caracter\u00edsticas adicionales, aseg\u00farate de revisar sus pr\u00e1cticas de seguridad y privacidad. El equipo de Openterface no puede garantizar ni ser responsable de la seguridad de las aplicaciones de terceros.

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#hay-una-aplicacion-host-que-soporte-chromeos","title":"\u00bfHay una aplicaci\u00f3n host que soporte ChromeOS?","text":"

S\u00ed, pero actualmente est\u00e1 en desarrollo. Estamos planeando crear una extensi\u00f3n web dise\u00f1ada para soportar tanto los navegadores Chrome como Firefox. Aunque su prioridad de desarrollo es ligeramente menor que la de los sistemas operativos principales como macOS, Windows y Linux, estamos trabajando activamente en ello. \u00a1Por favor, ten paciencia y mantente atento a las actualizaciones! Si est\u00e1s interesado en ayudar con nuestro desarrollo, \u00fanete a nosotros en la comunidad o env\u00edanos un correo electr\u00f3nico.

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#hay-una-aplicacion-host-que-soporte-dispositivos-moviles-de-apple","title":"\u00bfHay una aplicaci\u00f3n host que soporte dispositivos m\u00f3viles de Apple?","text":"

Actualmente estamos explorando la compatibilidad con los sistemas m\u00f3viles de Apple, como iOS y iPadOS. Debido a los estrictos controles de Apple, es posible que estas plataformas no soporten conexiones por cable con dispositivos de terceros. Sin embargo, la situaci\u00f3n podr\u00eda cambiar, o podr\u00eda haber soluciones alternativas. Si tienes alguna idea o sugerencia, te invitamos a unirte a nuestra comunidad para discutirlas con nosotros. Estamos comprometidos a mejorar la conveniencia de nuestro dispositivo al soportar la mayor cantidad de sistemas posible. Si est\u00e1s interesado en ayudar con nuestro desarrollo, \u00fanete a nosotros en la comunidad o env\u00edanos un correo electr\u00f3nico.

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#que-hacer-si-f11-no-funciona-en-aplicaciones-de-macos","title":"\u00bfQu\u00e9 hacer si F11 no funciona en aplicaciones de macOS?","text":"

En macOS, al presionar F11 se muestra el escritorio de macOS en lugar de pasar la tecla F11 a la aplicaci\u00f3n y al computador objetivo. Para solucionar esto, puedes desvincular F11 de la funci\u00f3n \"Mostrar Escritorio\". Aqu\u00ed te explicamos c\u00f3mo:

  1. Ve a Configuraci\u00f3n del Sistema.
  2. Selecciona Escritorio y Dock.
  3. Despl\u00e1zate hacia abajo y haz clic en el bot\u00f3n \"Atajos...\".
  4. Encuentra \"Mostrar Escritorio\" y config\u00faralo en el guion (-) en la parte inferior de la lista desplegable.
  5. Este cambio permitir\u00e1 que la tecla F11 pase a tu aplicaci\u00f3n en el computador objetivo.
","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#puerto-usb-conmutable-y-transferencia-de-archivos","title":"Puerto USB Conmutable y Transferencia de Archivos","text":"","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#el-openterface-mini-kvm-soporta-transferencias-de-archivos","title":"\u00bfEl Openterface Mini-KVM soporta transferencias de archivos?","text":"

S\u00ed, el Openterface Mini-KVM incluye un puerto USB-A conmutable compartido entre los dispositivos host y objetivo.

\u00bfC\u00f3mo compartir una memoria USB entre los dispositivos Host y Objetivo?

Los archivos pueden transferirse entre el host y el objetivo siguiendo estos pasos:

  1. Monta una memoria USB en el host cuando el peque\u00f1o interruptor negro est\u00e9 en el lado del puerto Type-C del host.
  2. Copia los archivos en esta memoria montada.
  3. Despu\u00e9s de copiar, desmonta la memoria sin desconectarla f\u00edsicamente.
  4. Mueve el peque\u00f1o interruptor negro al otro lado. Esta acci\u00f3n cambia la conexi\u00f3n del puerto USB-A al objetivo.
  5. Monta la memoria USB en el dispositivo objetivo y copia/mueve los archivos de la memoria, completando el proceso de transferencia de archivos del host al objetivo.

Este m\u00e9todo tambi\u00e9n puede usarse en la direcci\u00f3n opuesta.

Recuerda expulsar la memoria USB antes de cambiar el interruptor

Si el puerto USB est\u00e1 siendo usado por una memoria USB, aseg\u00farate de expulsar la memoria antes de cambiar el interruptor para transferir el uso del puerto a otra computadora.

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#el-puerto-usb-a-conmutable-puede-cambiarse-a-nivel-de-software","title":"\u00bfEl puerto USB-A conmutable puede cambiarse a nivel de software?","text":"

\u00a1Con la actualizaci\u00f3n de hardware a la versi\u00f3n 1.9, s\u00ed! Actualmente estamos trabajando en codificar esta funci\u00f3n en nuestra aplicaci\u00f3n. Una vez implementada, soportar\u00e1 tanto el cambio f\u00edsico como el conmutado a nivel de software. Consulta con nuestro equipo de desarrollo en Discord para saber m\u00e1s sobre este progreso.

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#por-que-usb-20-y-no-usb-30-para-este-puerto-usb-conmutable","title":"\u00bfPor qu\u00e9 USB 2.0 y no USB 3.0 para este puerto USB conmutable?","text":"

USB 2.0 es completamente capaz de manejar la captura de video a 1080p@30Hz, transmitir se\u00f1ales HID (para teclado y rat\u00f3n) y gestionar transferencias de archivos a velocidad est\u00e1ndar entre los computadores objetivo y host. Esto hace que nuestro producto sea una soluci\u00f3n r\u00e1pida, ligera y port\u00e1til, tal como fue dise\u00f1ada.

Usar USB 3.0 har\u00eda el dise\u00f1o de la PCB mucho m\u00e1s complejo y aumentar\u00eda significativamente los costos de producci\u00f3n. Adem\u00e1s, aunque USB 3.0 ofrece transferencias de archivos m\u00e1s r\u00e1pidas, tambi\u00e9n genera m\u00e1s calor, lo que podr\u00eda acortar la vida \u00fatil del dispositivo.

Estamos considerando la aplicaci\u00f3n de USB 3.0 para la pr\u00f3xima versi\u00f3n, dirigida a escenarios de uso m\u00e1s profesionales y soluciones KVM estacionarias.

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#tecnico","title":"T\u00e9cnico","text":"","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#el-openterface-mini-kvm-es-de-codigo-abierto","title":"\u00bfEl Openterface Mini-KVM es de c\u00f3digo abierto?","text":"

\u00a1S\u00ed! El Openterface Mini-KVM es completamente de c\u00f3digo abierto tanto en hardware como en software, certificado por OSHWA y respaldado por una comunidad vibrante. Si est\u00e1s interesado en contribuir, cont\u00e1ctanos en info@techxartisan.com. \u00a1Mantente al tanto!

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#puedo-acceder-a-la-configuracion-del-bios-de-un-dispositivo","title":"\u00bfPuedo acceder a la configuraci\u00f3n del BIOS de un dispositivo?","text":"

S\u00ed, la conexi\u00f3n directa del Openterface Mini-KVM permite el acceso a configuraciones de bajo nivel del BIOS o firmware.

Esta caracter\u00edstica contrasta con las soluciones KVM basadas en software o aplicaciones de control remoto como TeamViewer y VNC, que generalmente no pueden interactuar a nivel de BIOS.

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#por-que-el-teclado-no-funciona-a-nivel-de-bios-en-algunos-ordenadores-antiguos","title":"\u00bfPor qu\u00e9 el teclado no funciona a nivel de BIOS en algunos ordenadores antiguos?","text":"

Parece que algunos BIOS de ordenadores antiguos no pueden reconocer el hub USB de nuestro dispositivo, lo que puede causar problemas con nuestro teclado y rat\u00f3n emulados a nivel de BIOS. Estamos atentos a este problema.

Hemos recibido un informe de que en un ordenador HP espec\u00edfico, el HP Engage Flex Pro, el teclado no funciona en la pantalla del BIOS, aunque funciona normalmente una vez que el sistema operativo se inicia.

Si encuentras el mismo problema, por favor rep\u00f3rtalo a trav\u00e9s de un issue en GitHub.

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#como-se-transmite-el-videodatos-entre-dispositivos","title":"\u00bfC\u00f3mo se transmite el video/datos entre dispositivos?","text":"

Los datos de video se capturan a trav\u00e9s de HDMI y se transmiten por USB 2.0 al ordenador host para su visualizaci\u00f3n. El puerto USB 2.0 conmutable permite compartir unidades USB u otros dispositivos USB entre el objetivo y el host.

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#como-maneja-la-energia-el-openterface-mini-kvm","title":"\u00bfC\u00f3mo maneja la energ\u00eda el Openterface Mini-KVM?","text":"

El dispositivo no requiere una fuente de alimentaci\u00f3n externa, ya que est\u00e1 dise\u00f1ado para ser alimentado a trav\u00e9s de sus conexiones USB Type-C desde el host, mejorando su portabilidad. En escenarios donde el dispositivo objetivo es un micro-ordenador de bajo consumo, como un Raspberry Pi, podr\u00eda ser alimentado a trav\u00e9s del host mediante el puerto USB conmutable del Mini-KVM. Sin embargo, esto no es recomendable. El m\u00e9todo est\u00e1ndar de operaci\u00f3n es tener una fuente de alimentaci\u00f3n externa para el dispositivo objetivo.

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#puedo-construir-este-dispositivo-por-mi-mismo","title":"\u00bfPuedo construir este dispositivo por m\u00ed mismo?","text":"

\u00a1Por supuesto! Somos un grupo de apasionados creadores que aman el DIY, y nos aseguramos de que este proyecto sea de c\u00f3digo abierto tanto en hardware como en software. T\u00e9cnicamente, puedes construirlo desde cero. Incluso estamos pensando en publicar una gu\u00eda sobre c\u00f3mo hacer una versi\u00f3n en protoboard de nuestro producto que tambi\u00e9n sea compatible con nuestro software.

Nuestra comunidad ya est\u00e1 experimentando con diferentes versiones de hardware. \u00a1Consulta nuestras publicaciones comunitarias para aprender m\u00e1s o comparte tus propias experiencias DIY! Podr\u00eda enriquecer mucho nuestra comunidad. Adem\u00e1s, podr\u00edas descubrir que con algunos ajustes en el c\u00f3digo, nuestro software podr\u00eda funcionar perfectamente con tu configuraci\u00f3n DIY creativa.

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#mecanismo-de-control","title":"Mecanismo de Control","text":"","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#hay-planes-para-una-version-con-conectividad-inalambrica-o-ethernet","title":"\u00bfHay planes para una versi\u00f3n con conectividad inal\u00e1mbrica o Ethernet?","text":"

Actualmente, no estamos planeando agregar conectividad inal\u00e1mbrica o Ethernet a nuestros productos Openterface. Nos enfocamos en proporcionar un control r\u00e1pido y estable a trav\u00e9s de USB directamente a tu dispositivo objetivo, para que no tengas que preocuparte por problemas de red.

\u00a1Pero estamos siempre abiertos a comentarios! Si crees que hay una necesidad real de esta caracter\u00edstica, o si est\u00e1s teniendo dificultades para encontrar una buena soluci\u00f3n KVM-over-IP, env\u00edanos un correo electr\u00f3nico a info@techxartisan.com. Y recuerda, si decidimos expandir nuestras opciones de conectividad, nuestra comunidad ser\u00e1 la primera en saberlo.

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#en-que-se-diferencia-esto-de-otras-soluciones-kvm-como-kvm-tradicionales-kvm-over-ip-y-vnc-etc","title":"\u00bfEn qu\u00e9 se diferencia esto de otras soluciones KVM como KVM tradicionales, KVM-over-IP y VNC, etc.?","text":"

\u00bfTienes curiosidad sobre c\u00f3mo se compara el Openterface Mini-KVM con otras soluciones? Consulta nuestra detallada Comparaci\u00f3n p\u00e1gina.

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#funciona-con-un-ordenador-objetivo-que-requiere-ps2","title":"\u00bfFunciona con un ordenador objetivo que requiere PS/2?","text":"

No. Sabemos que todav\u00eda hay muchos ordenadores antiguos sin monitor que requieren teclados y ratones PS/2. Hasta donde sabemos, a\u00fan no existe una soluci\u00f3n elegante para convertir se\u00f1ales HID USB en se\u00f1ales divididas de teclado y rat\u00f3n PS/2. Estamos investigando este asunto y considerando c\u00f3mo soportar PS/2 en futuras versiones del Mini-KVM. Si conoces alguna soluci\u00f3n que podr\u00eda funcionar elegantemente con nuestro Mini-KVM, por favor comp\u00e1rtela con nosotros. \u00a1Gracias!

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#puedo-usar-multiples-mini-kvms-para-controlar-multiples-dispositivos-objetivo-desde-un-ordenador-maestro","title":"\u00bfPuedo usar m\u00faltiples Mini-KVMs para controlar m\u00faltiples dispositivos objetivo desde un ordenador maestro?","text":"

\u00a1S\u00ed, puedes! Nuestro Mini-KVM puede manejar esto t\u00e9cnicamente, pero a\u00fan estamos ajustando el c\u00f3digo y realizando pruebas. Nos estamos enfocando en asegurarnos de que nuestro software pueda vincular autom\u00e1ticamente el teclado y el rat\u00f3n con la fuente de video correcta cuando uses m\u00e1s de un Mini-KVM a la vez. Adem\u00e1s, estamos mejorando la interfaz de usuario del software para que sea mejor para este tipo de configuraci\u00f3n. \u00a1Mantente al tanto de las actualizaciones de nuestra comunidad para cuando lancemos esta funci\u00f3n!

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#es-capaz-de-encenderapagar-el-ordenador-al-que-esta-conectado","title":"\u00bfEs capaz de encender/apagar el ordenador al que est\u00e1 conectado?","text":"

Nuestro dispositivo no soporta ATX (control de encendido/apagado para el ordenador objetivo). Lo dise\u00f1amos para ser port\u00e1til, r\u00e1pido para la resoluci\u00f3n de problemas y estable para el control local. Realmente est\u00e1 destinado a ser usado cuando est\u00e1s all\u00ed con tu port\u00e1til, gestionando uno o varios ordenadores objetivo. Podr\u00edamos construir una versi\u00f3n profesional en el futuro con ATX y m\u00e1s caracter\u00edsticas.

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#relacionado-con-video","title":"Relacionado con Video","text":"","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#que-pasa-con-la-latencia-y-resolucion-de-video","title":"\u00bfQu\u00e9 pasa con la latencia y resoluci\u00f3n de video?","text":"

Nuestro dispositivo maneja video 1080p con menos de 140 milisegundos de latencia, haciendo que tu experiencia de control sea fluida y sin interrupciones.

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#es-el-openterface-mini-kvm-adecuado-para-juegos-de-alta-calidad","title":"\u00bfEs el Openterface Mini-KVM adecuado para juegos de alta calidad?","text":"

El dise\u00f1o actual se enfoca en operaciones t\u00e9cnicas y de TI, proporcionando un control confiable para la configuraci\u00f3n y resoluci\u00f3n de problemas de dispositivos en lugar de juegos de alta resoluci\u00f3n. Aunque es excelente para muchas tareas, este mini-KVM podr\u00eda no cumplir con las necesidades de visualizaci\u00f3n de juegos de alta calidad.

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#habra-soporte-para-pantallas-de-alta-calidad-en-futuras-versiones-del-openterface-mini-kvm","title":"\u00bfHabr\u00e1 soporte para pantallas de alta calidad en futuras versiones del Openterface Mini-KVM?","text":"

Sabemos que muchos de ustedes buscan caracter\u00edsticas de visualizaci\u00f3n de primera calidad. Aunque no es nuestro enfoque principal en este momento, bas\u00e1ndonos en sus comentarios, estamos considerando agregar capacidades de visualizaci\u00f3n mejoradas en una versi\u00f3n profesional del Openterface Mini-KVM.

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#por-que-el-openterface-mini-kvm-no-transmite-video-a-traves-de-ip-local","title":"\u00bfPor qu\u00e9 el Openterface Mini-KVM no transmite video a trav\u00e9s de IP local?","text":"

El Openterface Mini-KVM ha sido dise\u00f1ado para asegurar un rendimiento confiable y estable a trav\u00e9s de conexiones cableadas, utilizando HDMI y USB. Aunque es t\u00e9cnicamente posible transmitir video a trav\u00e9s de una red mediante nuestras aplicaciones host, estamos considerando agregar una funci\u00f3n de VLC e incluso VNC a nuestras aplicaciones host en el futuro.

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#puede-funcionar-con-diferentes-salidas-de-video-como-vga-dvi-displayport-etc","title":"\u00bfPuede funcionar con diferentes salidas de video como VGA, DVI, DisplayPort, etc.?","text":"

M\u00e1s o menos. El Openterface Mini-KVM captura video a trav\u00e9s de un puerto HDMI. Sin embargo, puedes usar varios adaptadores de video como VGA-a-HDMI, DVI-a-HDMI, miniHDMI-a-HDMI, o DP-a-HDMI, para conectar diferentes fuentes de video.

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#solucion-de-problemas","title":"Soluci\u00f3n de Problemas","text":"","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#por-que-el-openterface-mini-kvm-a-veces-experimenta-problemas-cuando-se-conecta-a-traves-de-un-hub-usb","title":"\u00bfPor qu\u00e9 el Openterface Mini-KVM a veces experimenta problemas cuando se conecta a trav\u00e9s de un hub USB?","text":"

Cuando se usa un hub USB en el lado del objetivo, el Openterface Mini-KVM puede volverse inestable. Esto se debe a que el Openterface Mini-KVM depende principalmente del puerto objetivo para la energ\u00eda. Si el hub USB conectado al objetivo est\u00e1 completamente cargado, puede causar una ca\u00edda significativa de voltaje, lo que lleva a la inestabilidad del Openterface Mini-KVM debido a la falta de energ\u00eda. Si necesitas usar un hub USB en el lado del objetivo, considera usar un hub USB alimentado con una fuente de alimentaci\u00f3n externa para asegurar una operaci\u00f3n estable.

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#que-debo-hacer-si-el-openterface-mini-kvm-se-vuelve-inestable-como-cuando-la-aplicacion-no-muestra-la-pantalla-del-objetivo-o-el-raton-y-el-teclado-no-responden","title":"\u00bfQu\u00e9 debo hacer si el Openterface Mini-KVM se vuelve inestable, como cuando la aplicaci\u00f3n no muestra la pantalla del objetivo o el rat\u00f3n y el teclado no responden?","text":"

Si encuentras inestabilidad con el Openterface Mini-KVM, como que la aplicaci\u00f3n no muestre la pantalla del objetivo o la incapacidad de controlar el rat\u00f3n y el teclado, intenta desconectar todos los cables. Despu\u00e9s de un breve momento, vuelve a conectar los cables y prueba de nuevo. Este simple reinicio a menudo resuelve los problemas de conexi\u00f3n.

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#mas","title":"M\u00e1s","text":"","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#como-puedo-contribuir-a-este-proyecto","title":"\u00bfC\u00f3mo puedo contribuir a este proyecto?","text":"

\u00a1Por supuesto! Hay muchas maneras en las que puedes colaborar:

  • Si te gusta programar, ay\u00fadanos reportando y solucionando errores.
  • \u00bfEres bueno con las palabras y la tecnolog\u00eda? Podr\u00edas echar una mano con nuestra documentaci\u00f3n.
  • Y si eres un mago con los idiomas, \u00bfpor qu\u00e9 no ayudar a traducir nuestros documentos para que m\u00e1s personas puedan unirse?
  • Si el dise\u00f1o es lo tuyo, siempre estamos buscando nuevas ideas para el dise\u00f1o gr\u00e1fico, la interfaz de la aplicaci\u00f3n y hacer que nuestro dispositivo sea a\u00fan m\u00e1s f\u00e1cil de usar.
  • \u00bfTe gustar\u00eda ayudar a mantener nuestra comunidad activa? Tambi\u00e9n podr\u00edamos usar tus habilidades all\u00ed.

Tu apoyo y contribuciones son lo que mantiene creciendo al Openterface Mini-KVM. \u00a1Gracias por ser parte de nuestra aventura! \ud83d\ude80 \u00bfTienes ganas de ayudar pero no ves un ajuste perfecto? \u00a1Solo env\u00edanos un correo electr\u00f3nico!

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#quieres-revisar-nuestro-practico-gadget","title":"\u00bfQuieres revisar nuestro pr\u00e1ctico gadget?","text":"

\u00a1Nos encanta hacer ruido y correr la voz sobre nuestro Mini-KVM! Si eres de la prensa o te destacas en las redes sociales y te gustar\u00eda probar nuestro producto, estamos a tu disposici\u00f3n. Ya sea que te gusten las rese\u00f1as detalladas, los videos de unboxing o simplemente quieras darnos un saludo, estamos aqu\u00ed para ello y \u00a1hagamos algo de ruido juntos! \ud83c\udf89 Solo env\u00edanos un correo electr\u00f3nico AHORA.

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#cuales-son-las-caracteristicas-avanzadas-planeadas-para-el-mini-kvm","title":"\u00bfCu\u00e1les son las caracter\u00edsticas avanzadas planeadas para el mini-KVM?","text":"

Estamos emocionados por el potencial del mini-KVM y estamos comprometidos a documentar todas nuestras ideas actuales en una hoja de ruta completa. Esta hoja de ruta delinear\u00e1 las caracter\u00edsticas avanzadas y los desarrollos futuros que imaginamos para el dispositivo. Esperamos desarrollar estas caracter\u00edsticas en colaboraci\u00f3n con nuestra comunidad. Mantente al tanto de m\u00e1s actualizaciones mientras seguimos creciendo e innovando juntos.

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#como-se-integra-el-mini-kvm-con-la-ia-y-cuales-son-sus-posibilidades-futuras","title":"\u00bfC\u00f3mo se integra el mini-KVM con la IA y cu\u00e1les son sus posibilidades futuras?","text":"

Nuestro objetivo final es permitir que la IA controle los ordenadores objetivo, y el Openterface juega un papel crucial en esta visi\u00f3n. Inspirados por proyectos como OthersideAI's self-operating computer, nuestro objetivo es que el mini-KVM act\u00fae como una extensi\u00f3n de las 'manos' (proporcionando control de teclado y rat\u00f3n) y 'ojos' (capturando la fuente de video) para el ordenador host. Si el ordenador host es lo suficientemente potente, podr\u00eda emular las capacidades vistas en la pel\u00edcula de 2013 \"Her\". Aunque esto es una aspiraci\u00f3n futura, destaca las emocionantes posibilidades que vemos para el mini-KVM.

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"faq/#que-accesorios-estan-disponibles-para-el-openterface-mini-kvm","title":"\u00bfQu\u00e9 accesorios est\u00e1n disponibles para el Openterface Mini-KVM?","text":"

Ofrecemos una gama de accesorios para mejorar tu experiencia con el Openterface Mini-KVM. Consulta nuestra secci\u00f3n de Accesorios para m\u00e1s detalles sobre los productos disponibles, incluyendo nuestro Cable Convertidor de VGA a HDMI.

Tu curiosidad y apoyo impulsan nuestro progreso, y queremos asegurarnos de que cada una de tus preguntas encuentre una respuesta. Ten en cuenta que, a medida que pasa el tiempo, el contenido anterior en nuestras preguntas frecuentes puede quedar desactualizado. Si tu consulta no est\u00e1 cubierta en estas preguntas frecuentes, siempre consulta nuestro sitio web openterface.com para obtener la informaci\u00f3n m\u00e1s actual. Adem\u00e1s, no dudes en unirte a nuestra entusiasta comunidad. Estamos activos en nuestro Subreddit en /r/Openterface_miniKVM/ y en nuestro servidor de Discord, TechxArtisan, donde puedes hacer preguntas, compartir ideas o simplemente charlar sobre todo lo relacionado con la tecnolog\u00eda.

Adem\u00e1s, no dudes en ponerte en contacto directamente con nuestro equipo dedicado enviando un correo electr\u00f3nico a info@techxartisan.com. Nos encanta saber de ti y siempre estamos aqu\u00ed para ayudar.

","tags":["File Transfer","mini-KVM","Switchable USB","BIOS","USBKVM"]},{"location":"features/","title":"Caracter\u00edsticas","text":"
  • Compatibilidad con la App del Host: Compatible con macOS, Windows y Linux, y pr\u00f3ximamente con Android.

  • Comodidad Plug-and-Play: Control instant\u00e1neo al conectar, sin necesidad de instalar software o configurar el dispositivo objetivo. No deja rastros de software en la computadora objetivo.

  • Independencia de Red: Control estable y r\u00e1pido sin cabeza a trav\u00e9s de HDMI y entrada de teclado/rat\u00f3n emulados (HID).

  • Dise\u00f1o Ultra Port\u00e1til: Su dise\u00f1o compacto y ligero lo convierte en la herramienta perfecta para profesionales en movimiento.

  • Full HD con Baja Latencia: Soporta salida de video hasta 1920x1080@30Hz con menos de 140 milisegundos de latencia. Adaptable a VGA, Micro HDMI, DVI y otras entradas con un adaptador de video.

  • Integraci\u00f3n de Audio: Captura y reproduce el audio del dispositivo objetivo directamente en la computadora host.

  • Acceso a Nivel de BIOS: Proporciona acceso directo al BIOS, firmware o gesti\u00f3n de inicio del dispositivo objetivo.

  • Puerto USB Tipo-A Conmutable: Permite alternar el acceso USB entre el host y el objetivo, ideal para compartir una unidad USB sin necesidad de reconectar. Consulta nuestra p\u00e1gina de Puerto USB Conmutable para m\u00e1s informaci\u00f3n.

  • Transferencia de Texto: La funcionalidad de transferencia de texto permite enviar texto desde la computadora host al dispositivo objetivo. Esta caracter\u00edstica emula el comportamiento de escritura para reproducir contenido de texto en la computadora objetivo, ideal para copiar nombres de usuario, contrase\u00f1as o fragmentos de c\u00f3digo.

    • Caracteres Especiales: La funci\u00f3n de transferencia de texto soporta varios caracteres ASCII, incluyendo s\u00edmbolos, signos de puntuaci\u00f3n y caracteres no alfanum\u00e9ricos.

    • Texto Limitado: Es ideal para transferir texto corto como nombres de usuario, contrase\u00f1as largas, fragmentos de c\u00f3digo desde el host al objetivo. Puedes transferir texto de diferentes longitudes, pero no se recomienda transferir demasiado texto a la vez para evitar posibles problemas.

Limitaciones de la Funci\u00f3n de Transferencia de Texto

  • Sin Integraci\u00f3n de Portapapeles: La funci\u00f3n de transferencia de texto est\u00e1 dise\u00f1ada para emular el comportamiento de escritura y no puede transferir contenido no textual, como im\u00e1genes o texto formateado.
  • Limitaciones de Idioma: Esta funci\u00f3n soporta exclusivamente la transferencia de texto basado en c\u00f3digos ASCII y no soporta idiomas que no se basan en ASCII, como caracteres chinos, japoneses o coreanos.
"},{"location":"features/#mas-por-venir","title":"M\u00e1s por Venir","text":"

Tenemos una p\u00e1gina de hoja de ruta que detalla nuestros planes para desarrollar caracter\u00edsticas m\u00e1s avanzadas. \u00c9chale un vistazo para estar al tanto de lo que viene. Tambi\u00e9n invitamos a los desarrolladores a unirse a nosotros y participar en nuestra comunidad!

"},{"location":"how-it-works/","title":"C\u00f3mo Funciona","text":""},{"location":"how-it-works/#desglose-del-proceso","title":"Desglose del Proceso","text":"
  • Transmisi\u00f3n de Pantalla: El mini-KVM captura la transmisi\u00f3n de pantalla de la computadora objetivo y la muestra en la aplicaci\u00f3n del host. Esto permite a los usuarios ver y gestionar el sistema objetivo directamente desde su m\u00e1quina host.
  • Control del Cursor y Rat\u00f3n: Al mover el rat\u00f3n a la ventana de la aplicaci\u00f3n en la computadora host, los usuarios pueden controlar el cursor en el dispositivo objetivo como si estuvieran usando un VNC. Esta funcionalidad permite operar dos sistemas simult\u00e1neamente en una sola pantalla.
  • Entrada de Teclado: Cuando la ventana de la aplicaci\u00f3n est\u00e1 activa, cualquier pulsaci\u00f3n de teclas realizada en el teclado de la computadora host se transmite al dispositivo objetivo, permitiendo una escritura y entrada de comandos sin interrupciones.
  • Conversi\u00f3n de Se\u00f1ales HID: Todas las entradas de teclado y rat\u00f3n dentro de la aplicaci\u00f3n se convierten en se\u00f1ales de control de Dispositivo de Interfaz Humana (HID), que luego se env\u00edan a la computadora objetivo.
  • Sincronizaci\u00f3n: La aplicaci\u00f3n asegura que la pantalla y el cursor de la computadora objetivo est\u00e9n sincronizados con la pantalla de la computadora host, facilitando una experiencia de usuario unificada.

Puedes explorar el Software y Hardware de c\u00f3digo abierto de Openterface para m\u00e1s detalles.

"},{"location":"how-to-connect/","title":"C\u00f3mo Conectar","text":""},{"location":"how-to-connect/#interfaces","title":"Interfaces","text":"

\u2460 - Puerto USB-C del Host (Hembra): Conecta el puerto USB-C del Host para la transferencia de datos a trav\u00e9s del hub USB integrado.

\u2461 - Puerto USB-C del Target (Hembra): Conecta el puerto USB-C del Target para emular la salida de teclado y rat\u00f3n HID a trav\u00e9s del hub USB integrado.

\u2462 - Puerto de Entrada HDMI (Hembra): Entrada de fuente HDMI desde el dispositivo Target.

\u2463 - Puerto USB-A 2.0 Conmutable (Hembra): Utilizado por el Host o el Target, pero no simult\u00e1neamente.

Ajuste Ajustado

Ten en cuenta que este puerto USB-A hembra tiene un mecanismo de bloqueo, lo que requiere un poco m\u00e1s de fuerza para conectar y desconectar tus dispositivos USB.

\u2464 - Interruptor de Conmutaci\u00f3n: Para alternar la conexi\u00f3n del puerto USB-A 2.0 entre el Host y el Target.

\u2465 - Pines de Extensi\u00f3n: Para m\u00e1s informaci\u00f3n, consulta Pines de Extensi\u00f3n para uso de desarrolladores.

"},{"location":"how-to-connect/#pasos-de-conexion","title":"Pasos de Conexi\u00f3n","text":"

Para configurar tu Mini-KVM, sigue estos pasos en orden:

  1. Conexi\u00f3n del Host (Lado Naranja):

    • Conecta el Host al mini-KVM usando el cable USB Tipo-C naranja de 1.5m. Ench\u00fafalo en el puerto USB-C hembra del lado naranja del mini-KVM.

    App del Host Requerida

    El Host necesita tener instalada la app del Host. Para m\u00e1s informaci\u00f3n y enlaces de descarga, consulta la Documentaci\u00f3n de la App.

  2. Conexi\u00f3n del Dispositivo Target (Lado Negro):

    • Conecta el dispositivo Target al mini-KVM usando el cable USB Tipo-C negro de 0.3m. Ench\u00fafalo en el puerto USB-C hembra del lado negro del mini-KVM.
  3. Conexi\u00f3n de Salida de Video del Target (Lado Negro):

    • Conecta el puerto de salida de video del dispositivo Target al puerto HDMI hembra del lado negro del mini-KVM. Usa el cable HDMI negro de 0.3m, o cualquier otro cable adecuado de fuente de video a HDMI, como un cable convertidor de VGA a HDMI.

    No se Requiere App para el Target

    No se necesita preinstalaci\u00f3n o configuraci\u00f3n en el dispositivo Target. Siempre que el dispositivo Target soporte operaciones de UI con salida de video (HDMI, VGA, etc.) y tenga un puerto USB para recibir se\u00f1ales de control de teclado y rat\u00f3n emuladas (HID), puede ser utilizado. Por lo tanto, las plataformas de dispositivos Target compatibles incluyen Windows, macOS, Linux, Android y iOS.

  4. Conexi\u00f3n del Puerto USB-A 2.0 Conmutable (Opcional):

    • Si deseas conectar un dispositivo USB al puerto USB-A 2.0 conmutable, se recomienda hacerlo despu\u00e9s de completar las tres conexiones anteriores y asegurarte de que la app del Host est\u00e9 abierta.
"},{"location":"open-hardware/","title":"Hardware Abierto","text":""},{"location":"open-hardware/#explora-los-detalles-del-hardware","title":"Explora los Detalles del Hardware","text":"
  • Openterface_Mini-KVM_Hardware: Descubre nuestro dise\u00f1o de hardware completo, esquemas y componentes.
  • Pines de Extensi\u00f3n: Aprende a acceder y usar los pines de extensi\u00f3n para desarrollo avanzado y experimentaci\u00f3n.
"},{"location":"open-hardware/#cumplimiento-con-oshwa","title":"Cumplimiento con OSHWA","text":"

Nuestro Openterface Mini-KVM est\u00e1 orgullosamente certificado por la Open Source Hardware Association (OSHWA). Esta certificaci\u00f3n de OSHWA (UID CN000015) confirma nuestro compromiso con los principios del hardware abierto, asegurando que todos los archivos de dise\u00f1o, documentaci\u00f3n y c\u00f3digo fuente est\u00e9n disponibles libremente para estudio, modificaci\u00f3n, distribuci\u00f3n y fabricaci\u00f3n.

"},{"location":"open-hardware/#unete-a-la-diversion-del-desarrollo","title":"\u00danete a la Diversi\u00f3n del Desarrollo","text":"

Estamos emocionados de explorar el potencial de su hardware y estos pines de extensi\u00f3n, \u00a1y te invitamos a unirte a esta aventura! A medida que continuamos desarrollando y experimentando, actualizaremos esta secci\u00f3n con m\u00e1s informaci\u00f3n sobre lo que estos pines pueden hacer y c\u00f3mo pueden ser utilizados de manera creativa.

"},{"location":"open-hardware/#proximamente","title":"Pr\u00f3ximamente","text":"
  • Explicaciones detalladas de la funcionalidad de los pines
  • Ejemplos de proyectos DIY que muestran usos innovadores de los pines de extensi\u00f3n
  • Ideas e implementaciones contribuidas por la comunidad
"},{"location":"open-hardware/#involucrate","title":"Invol\u00facrate","text":"
  1. Comparte tus Ideas: \u00bfTienes un concepto genial para usar estos pines? \u00a1Nos encantar\u00eda escucharlo!
  2. Contribuye con Proyectos DIY: Si has creado algo interesante, considera compartirlo con la comunidad.
  3. \u00danete a la Discusi\u00f3n: Con\u00e9ctate con otros desarrolladores y entusiastas para intercambiar ideas y colaborar.

Mantente actualizado y participa en las discusiones sobre el desarrollo de los pines de extensi\u00f3n en nuestra comunidad de Discord o Reddit.

Tu creatividad y experiencia pueden ayudar a expandir los l\u00edmites de lo que es posible con el Openterface Mini-KVM. \u00a1Innovemos juntos!

"},{"location":"pin/","title":"Gu\u00eda de Pines de Extensi\u00f3n","text":"

El Openterface Mini-KVM cuenta con pines de extensi\u00f3n para desarrollo avanzado y experimentaci\u00f3n con Software Abierto. Estos pines no est\u00e1n expuestos en la configuraci\u00f3n est\u00e1ndar del dispositivo.

"},{"location":"pin/#acceso-a-los-pines-de-extension-para-desarrollo","title":"Acceso a los Pines de Extensi\u00f3n para Desarrollo","text":"

Para acceder a los pines de extensi\u00f3n:

  1. Desmonta el dispositivo
  2. Sustituye la tapa original del dispositivo con una tapa especializada para pines de extensi\u00f3n
  3. Descarga el modelo 3D de la tapa para pines de extensi\u00f3n desde nuestro repositorio de GitHub

Garant\u00eda Anulada

Al retirar la tapa original, se anula la garant\u00eda del producto. Todas las modificaciones o desmontajes se realizan bajo el propio riesgo del usuario.

Caracter\u00edsticas Experimentales

Las caracter\u00edsticas desarrolladas utilizando estos pines son experimentales y no han sido completamente probadas. Openterface no se hace responsable de cualquier da\u00f1o, lesi\u00f3n o mal funcionamiento resultante de modificaciones, exposici\u00f3n de los pines de extensi\u00f3n u otras alteraciones al dispositivo.

"},{"location":"pin/#distribucion-de-los-pines","title":"Distribuci\u00f3n de los Pines","text":"

Los pines de extensi\u00f3n proporcionan las siguientes conexiones:

  1. Suministro de energ\u00eda USB de 5V para componentes externos
  2. Datos positivos al hub USB del host
  3. Datos negativos al hub USB del host
  4. Datos positivos al hub USB del target
  5. Datos negativos al hub USB del target
  6. Tierra

Conexiones Incorrectas

Confundir VCC y GND puede causar da\u00f1os graves al dispositivo y a los componentes conectados. Siempre verifica las conexiones de los pines antes de encender el dispositivo.

"},{"location":"privacy-policy/","title":"Privacy Policy","text":"

This Privacy Policy applies to the \u201cOpenterface\u201d mini-KVM device and its associated macOS application (collectively, the \u201cService\u201d), developed and operated by Guangzhou Billio Tech. Co., Ltd. By using our Service, you agree to the collection and use of information in accordance with this policy. If you do not agree with any part of this policy, please refrain from using any products and services offered.

"},{"location":"privacy-policy/#data-collection-and-use","title":"Data Collection and Use","text":"

We are committed to protecting your privacy. Our Service does not collect, store, or transfer any personal data at any stage in using our app. For the effective operation of our Service - controlling your computer remotely through the Openterface device and app, we require access to certain types of non-personal data:

  1. Camera Access: We require camera permissions to capture the video feed from your remotely connected computer. This is essential for displaying the feed on your device through the Openterface application.
  2. Keyboard and Mouse Event Data: To enable remote control functionalities, we need permissions to listen to local keyboard and mouse events. This data is used solely to convert these events into control signals for the target device connected through our hardware.

Please note that the above-mentioned data is considered non-personal as it does not directly identify you as an individual. The permissions we request are necessary solely to enable core functionality. Data is also never stored or transferred outside your device.

"},{"location":"privacy-policy/#security","title":"Security","text":"

With no collection or retention of user data at any point, protecting user data via security measures is not applicable in our case. Our app presents no privacy risks inherent in its intended functionality.

"},{"location":"privacy-policy/#disclaimer","title":"Disclaimer","text":"

The Service may become open source in the future for transparency and community supervision. As a result, various versions of the app and device may be created and modified by third parties.This would enable anyone to inspect the code and build versions themselves, as well as modify for custom use cases. We will not be responsible for what individuals or organizations may build from modified code and hardware. It is the user's responsibility to verify the source of the application. We strongly recommend downloading the app from our official website openterface.com and well-known, reliable certified app platform platforms for safety and reliability.

"},{"location":"privacy-policy/#changes-to-this-policy","title":"Changes to this Policy","text":"

We may occasionally update this privacy policy to comply with law changes or reflect updates to our application. Any changes will be posted clearly on this page. Continued use of Openterface after changes signifies consent to the revised privacy policy.

"},{"location":"privacy-policy/#agreement-to-privacy-policy","title":"Agreement to Privacy Policy","text":"

By agreeing to our Service Usage Agreement, you also agree to this Privacy Policy. This Privacy Policy is an integral part of our Service Usage Agreement. If you disagree with any part of this policy, please do not use our Service.

"},{"location":"privacy-policy/#language-and-interpretation","title":"Language and Interpretation","text":"

This agreement has been provided in multiple languages for convenience. It is agreed that the working language of the company is both English and Chinese. In the event of any inconsistency between the English and non-English versions of this policy or any related documents, the English version shall prevail. The final interpretation of this policy will be in English.

"},{"location":"privacy-policy/#governing-law-and-jurisdiction","title":"Governing Law and Jurisdiction","text":"

This Agreement and any disputes arising from it shall be governed by the laws and regulations of the jurisdiction where Openterface is registered, unless otherwise mandated by law. In any civil litigation or other legal proceedings to enforce rights under this Agreement, each party shall bear its own legal costs and expenses.

"},{"location":"privacy-policy/#contact-information","title":"Contact Information","text":"

For any questions or concerns regarding this Privacy Policy, please contact us at info@techxartisan.com. We encourage feedback and will endeavour to address your concerns promptly.

"},{"location":"quick-start/","title":"Inicio R\u00e1pido","text":"

Nuestro Openterface\u2122 Mini-KVM te permite controlar una computadora sin monitor directamente desde tu laptop o computadora de escritorio usando conexiones USB y HDMI, eliminando la necesidad de perif\u00e9ricos adicionales o conectividad de red. A lo largo de esta documentaci\u00f3n, nos referimos a tu laptop o computadora de escritorio como el Host ( ) y al dispositivo que se controla como el Target ( ).

  • Caracter\u00edsticas

    Descubre las potentes caracter\u00edsticas del Openterface\u2122 Mini-KVM

    Ver Caracter\u00edsticas

  • C\u00f3mo Conectar

    Configura tu Openterface\u2122 Mini-KVM y comienza a controlar tu dispositivo Target

    Gu\u00eda de Conexi\u00f3n

  • Aplicaciones para Host

    Controla tu dispositivo Target sin problemas con nuestras aplicaciones para Host f\u00e1ciles de usar

    Descargar App para Host

  • Hardware Abierto

    Explora nuestro compromiso con el hardware de c\u00f3digo abierto y la transparencia

    Detalles de Hardware Abierto

  • Casos de Uso y Preguntas Frecuentes

    Descubre escenarios ideales para el Openterface\u2122 Mini-KVM y encuentra respuestas a preguntas comunes

    Explorar Casos de Uso

    Ver Preguntas Frecuentes

  • Comparaci\u00f3n

    Compara c\u00f3mo el Openterface\u2122 Mini-KVM se mide frente a otras soluciones KVM

    \u00bfPor qu\u00e9 Openterface?

    Ver Comparaci\u00f3n

"},{"location":"return-refunds-warranty/","title":"Return, Refunds and Warranty Policy","text":""},{"location":"return-refunds-warranty/#returns","title":"Returns","text":"

Openterface provides options for returns and exchanges in accordance with the following terms and conditions:

"},{"location":"return-refunds-warranty/#damage-in-shipment","title":"Damage in Shipment","text":"

Should your product arrive with damage incurred during shipment, we request you to inform us via email at info@techxartisan.com within two business days of receipt. Your email should detail the damages and, where possible, include photographic evidence. This assists us greatly in ensuring our products are properly packaged and transported. We will organize replacements for the damaged products.

"},{"location":"return-refunds-warranty/#exchanges","title":"Exchanges","text":"

If you are unsatisfied with your purchase for any reason, we offer the facility to return items in exchange for store credit. For a return to be accepted, items must adhere to the criteria outlined in the section [Important Conditions for Return]. Please initiate exchanges within 15 days following delivery. Note that Openterface does not cover the costs of return postage and customs tax.

"},{"location":"return-refunds-warranty/#important-conditions-for-return","title":"Important Conditions for Return","text":"

Upon receiving the returned product, it will undergo an inspection. To ensure a smooth return process, please meet the following conditions:

  • The product must be in its original, undamaged state.
  • Notification of the product's return must be given to us within 15 business days.
  • The return package should contain all items that were included in the original purchase, such as price tags, labels, original packaging, freebies, accessories, invoices, warranty cards, and other documentation.
  • It is acknowledged and agreed that Openterface retains the discretion to determine if a product is in a saleable condition. Items deemed unsaleable will be discarded and no store credit or exchange will be issued for these items.
"},{"location":"return-refunds-warranty/#refunds","title":"Refunds","text":"

Once your return is received and inspected, we will send you an email to notify you of the receipt of your returned item. If the product is returned in an undamaged state, we will process the refund within five working days.

"},{"location":"return-refunds-warranty/#warranty","title":"Warranty","text":"

This warranty policy confers specific legal rights upon you. Additionally, depending on your location\u2014be it a particular state, province, or country\u2014you may have other rights.

Openterface, as governed by law, respects your rights and does not seek to exclude, limit, or suspend any rights you possess, particularly those arising from nonconformity with a sales contract. To fully understand your rights, it's advisable to refer to the laws of your state, province, or country.

"},{"location":"return-refunds-warranty/#scope-of-this-warranty","title":"Scope of this Warranty","text":"

The benefits provided by this Openterface warranty are in addition to, and do not detract from, any rights and remedies you may have under law in connection to the goods and services under warranty. This warranty is applicable to any Openterface products purchased from an authorised Openterface reseller or directly via www.openterface.com.

  • Our policy limits warranties and services to products bought either directly from Openterface or an authorised Openterface reseller, and requires accompanying proof of purchase. If your Openterface product was bought from an unauthorised reseller, or if its original factory serial number is missing, defaced, or altered, this warranty becomes invalid.
  • Be aware that some websites and dealers may falsely claim to be authorised Openterface resellers. Products bought through these sources are not covered by an Openterface warranty. These products may be counterfeit, used, defective, or unsuitable for use in your country. Ensure your protection and the integrity of your Openterface product by buying only from authorised resellers. For information on authorised resellers, please visit our website.
"},{"location":"return-refunds-warranty/#warranty-coverage","title":"Warranty Coverage","text":"
  • Openterface guarantees its products, in their original packaging, against defects in materials and workmanship under normal use.
  • All Openterface limited warranties commence from the date of purchase. KEEP YOUR RECEIPT AS PROOF OF PURCHASE. The duration of the Openterface limited hardware warranty is typically 6 months from the date of purchase, though this may vary for different Openterface products.
  • All Openterface warranties, including any statutory guarantees or non-excludable statutory warranties, are valid solely during the period the product is owned by the original purchaser. The 'original purchaser' is defined as the first buyer of the product from Openterface or an authorised reseller. Openterface limited warranties, including any lifetime warranties, are non-transferable.
  • The warranty does not cover scenarios outside normal use, such as theft, accidents, misuse, abuse, water damage, or use of the product in conditions outside its specified operational climate.

To the extent permitted by applicable law, this warranty and any implied warranties constitute your sole and exclusive warranties, superseding all other warranties or conditions, whether express or implied. Some jurisdictions may not allow limitations on the duration of an implied warranty, so the above limitation may not apply in your case.

"},{"location":"roadmap/","title":"Hoja de Ruta","text":"

Trabajo en Progreso Pr\u00f3ximamente.

"},{"location":"specifications/","title":"Especificaciones","text":""},{"location":"specifications/#informacion-del-producto","title":"Informaci\u00f3n del Producto","text":"
  • Nombre del Producto: Openterface Mini-KVM Basic / Toolkit
  • Nombre del Modelo: OP-MINIKVM-BASIC / OP-MINIKVM-TOOLKIT
"},{"location":"specifications/#fisico","title":"F\u00edsico","text":"
  • Dimensiones del Dispositivo (L x A x H): 61 x 53 x 13.5 mm / 2.40 x 2.09 x 0.53 pulgadas
  • Peso Neto del Dispositivo: Aproximadamente 48g
  • Material de la Carcasa: Aleaci\u00f3n de aluminio, PLA
"},{"location":"specifications/#compatibilidad","title":"Compatibilidad","text":"
  • Host: Windows, macOS, Linux, Android (con aplicaci\u00f3n compatible)
  • Target: No requiere instalaci\u00f3n de software
"},{"location":"specifications/#video","title":"Video","text":"
  • Entrada de Video M\u00e1xima: Hasta 3840x2160@30Hz v\u00eda HDMI
  • Salida de Video M\u00e1xima: Hasta 1920x1080@30Hz
  • M\u00e9todos de Compresi\u00f3n de Video: YUV, MJPEG
  • Soporte Adicional de Video: VGA, DVI, Micro HDMI (v\u00eda adaptador)
  • Latencia: Menos de 140 milisegundos
"},{"location":"specifications/#audio","title":"Audio","text":"
  • Captura de Audio: Passthrough de audio embebido en HDMI
"},{"location":"specifications/#energia","title":"Energ\u00eda","text":"
  • Alimentado por USB-C. No se requiere fuente de alimentaci\u00f3n externa.
"},{"location":"specifications/#conectividad","title":"Conectividad","text":"
  • Transmisi\u00f3n USB: 12Mbps a velocidad completa
"},{"location":"specifications/#caracteristicas","title":"Caracter\u00edsticas","text":"
  • Emulaci\u00f3n completa de teclado y rat\u00f3n (absoluta y relativa)
  • Transferencia de texto
  • Soporte de teclas multimedia
  • Funcionalidad HID personalizada
  • Funci\u00f3n de despertar la computadora
"},{"location":"specifications/#ambiental","title":"Ambiental","text":"
  • Temperatura de Operaci\u00f3n: 0\u00b0C a 40\u00b0C
  • Temperatura de Almacenamiento: -10\u00b0C a 50\u00b0C
  • Humedad: 80% HR
"},{"location":"tags/","title":"Etiquetas","text":""},{"location":"tags/#tag:bios","title":"BIOS","text":"
  • Preguntas Frecuentes
"},{"location":"tags/#tag:file-transfer","title":"File Transfer","text":"
  • Preguntas Frecuentes
"},{"location":"tags/#tag:hardware-kvm","title":"Hardware KVM","text":"
  • Comparaci\u00f3n
"},{"location":"tags/#tag:kvm","title":"KVM","text":"
  • Comparaci\u00f3n
"},{"location":"tags/#tag:kvm-over-ip","title":"KVM-over-IP","text":"
  • Comparaci\u00f3n
"},{"location":"tags/#tag:kvm-over-usb","title":"KVM-over-USB","text":"
  • Comparaci\u00f3n
"},{"location":"tags/#tag:software-kvm","title":"Software KVM","text":"
  • Comparaci\u00f3n
"},{"location":"tags/#tag:switchable-usb","title":"Switchable USB","text":"
  • Preguntas Frecuentes
"},{"location":"tags/#tag:usbkvm","title":"USBKVM","text":"
  • Preguntas Frecuentes
"},{"location":"tags/#tag:vnc","title":"VNC","text":"
  • Comparaci\u00f3n
"},{"location":"tags/#tag:mini-kvm","title":"mini-KVM","text":"
  • Comparaci\u00f3n
  • Preguntas Frecuentes
"},{"location":"terms-of-service/","title":"Terms of Service","text":""},{"location":"terms-of-service/#overview","title":"Overview","text":"

This website is operated by Openterface, part of Guangzhou Billio Tech Co., Ltd. The terms \"we\", \"us\", and \"our\" refer to Openterface. This website, inclusive of all information, tools, and services available from it, is offered to you, the user, subject to your acceptance of all the terms, conditions, policies, and notices outlined here.

By accessing or using our website and/or purchasing from us, you engage in our \"Service\" and agree to be bound by these terms and conditions, referred to as \"Terms of Service\" or \"Terms\", which include additional terms, conditions, and policies available via hyperlink. These Terms apply to all site users, including but not limited to browsers, vendors, customers, merchants, and content contributors.

Please read these Terms of Service carefully before using our website. By accessing or using any part of the site, you consent to these Terms. If you do not agree with this agreement's terms and conditions, you should not access the website or use any services. If these Terms of Service are regarded as an offer, acceptance is expressly limited to these Terms.

New features or tools added to the current store will also fall under these Terms of Service. You can review the latest version of the Terms of Service on this page at any time. We may update, change, or replace parts of these Terms by posting updates and/or changes on our website. Regularly checking this page for changes is your responsibility. Continued use of or access to the website after changes implies acceptance of these changes.

By agreeing to these Terms of Service, you confirm that you are at least the age of majority in your state or province of residence. If you are the age of majority, you have also consented to allow your minor dependents to use this site. Our products must not be used for illegal or unauthorized purposes, nor should the Service be used to violate any laws in your jurisdiction, including copyright laws. It is prohibited to transmit harmful code such as worms, viruses, or destructive code. Any breach of these Terms will result in immediate termination of your services.

"},{"location":"terms-of-service/#general-conditions","title":"General Conditions","text":"

We reserve the right to refuse service to anyone at any time. Your content (excluding credit card information) might be transferred unencrypted and may undergo changes to meet technical requirements. Credit card information is always encrypted during transfer. Without our express written permission, you are not allowed to reproduce, duplicate, copy, sell, resell, or exploit any part of the Service or access to the Service. The headings in this agreement are for convenience only and will not limit or affect these Terms.

"},{"location":"terms-of-service/#accuracy-completeness-and-timeliness-of-information","title":"Accuracy, Completeness, and Timeliness of Information","text":"

We are not liable if the information on this site is inaccurate, incomplete, or not current. The material on this site is for general information and should not be the sole basis for decision-making. Any reliance on the site's material is at your own risk. The site may contain historical information for reference only. We may modify site contents at any time without obligation to update any information. Monitoring changes to our site is your responsibility.

"},{"location":"terms-of-service/#modifications-to-the-service-and-prices","title":"Modifications to the Service and Prices","text":"

Product prices are subject to change without notice. We may modify or discontinue the Service without notice at any time. We are not liable for any Service modification, price change, suspension, or discontinuance.

"},{"location":"terms-of-service/#products-or-services","title":"Products or Services","text":"

Certain products or services may be available exclusively online. These may have limited quantities and are subject to our Return, Refund, and Warranty Policy. We have endeavored to display product colors and images accurately, but cannot guarantee accurate display on your monitor. We reserve the right to limit sales to any person, geographic region, or jurisdiction and to limit product quantities. Product descriptions and pricing are subject to change at any time without notice, at our discretion. We may discontinue any product at any time. Any product or service offers on this site are void where prohibited. We do not warrant that the quality of products, services, information, or other material purchased will meet your expectations, or that service errors will be corrected.

"},{"location":"terms-of-service/#accuracy-of-billing-and-account-information","title":"Accuracy of Billing and Account Information","text":"

We reserve the right to refuse any order. We may limit or cancel quantities purchased per person, household, or order. These restrictions can include orders by the same customer account, credit card, and/or orders using the same billing/shipping address. We may contact you via email, billing address, or phone number if we change or cancel an order. We reserve the right to limit or prohibit orders that appear to be placed by dealers, resellers, or distributors.

You agree to provide current, complete, and accurate purchase and account information for all purchases. You agree to update your account and other information, including your email address and credit card numbers and expiration dates, to complete your transactions and contact you as needed.

For more details, please review our Return, Refund, and Warranty Policy.

"},{"location":"terms-of-service/#optional-tools","title":"Optional Tools","text":"

We may provide access to third-party tools over which we have no control or input. Access to such tools is provided \"as is\" and \"as available\" without any warranties, representations, or conditions of any kind and without endorsement. We are not liable for your use of optional third-party tools. Use of these tools is at your own risk and discretion, and you should ensure you are familiar with and approve of the terms provided by the relevant third-party providers. New services and/or features, including new tools and resources, will also be subject to these Terms of Service.

"},{"location":"terms-of-service/#third-party-links","title":"Third-Party Links","text":"

Content, products, and services available via our Service may include third-party materials. Third-party links may direct you to websites not affiliated with us. We are not responsible for the content or accuracy of third-party websites and do not warrant and will not be liable for any third-party materials, websites, or other products or services. We are not liable for any harm or damages related to third-party goods, services, resources, content, or transactions. Review third-party policies and practices before engaging in transactions. Complaints, claims, concerns, or questions regarding third-party products should be directed to the third-party.

"},{"location":"terms-of-service/#user-comments-feedback-and-other-submissions","title":"User Comments, Feedback, and Other Submissions","text":"

If you send specific submissions at our request (e.g., contest entries) or send unsolicited creative ideas, suggestions, proposals, plans, or other materials, we may, without restriction, edit, copy, publish, distribute, translate, and use any comments you send us. We are under no obligation to (1) maintain comments in confidence; (2) pay compensation for comments; or (3) respond to comments. We may monitor, edit, or remove content deemed unlawful, offensive, threatening, libelous, defamatory, pornographic, obscene, or otherwise objectionable or violating intellectual property rights or these Terms. You agree your comments will not violate any third-party rights, contain libelous or unlawful material, or malware affecting the Service. You are responsible for your comments' accuracy, and we assume no liability for comments posted by you or any third party.

"},{"location":"terms-of-service/#personal-information","title":"Personal Information","text":"

Your submission of personal information through the store is governed by our Privacy Policy.

"},{"location":"terms-of-service/#errors-inaccuracies-and-omissions","title":"Errors, Inaccuracies, and Omissions","text":"

Occasionally, there may be information in the Service containing typographical errors, inaccuracies, or omissions related to product descriptions, pricing, promotions, offers, product shipping charges, transit times, and availability. We reserve the right to correct any errors, inaccuracies, or omissions, and to change or update information or cancel orders if any Service information is inaccurate at any time without prior notice. No obligation exists to update, amend, or clarify information in the Service or on related websites, including pricing information, except as required by law.

"},{"location":"terms-of-service/#prohibited-uses","title":"Prohibited Uses","text":"

In addition to other prohibitions set forth in the Terms of Service, you are prohibited from using the site or its content for unlawful purposes; to solicit others to perform unlawful acts; to violate international, federal, state, or local regulations, laws, or ordinances; to infringe upon our or others' intellectual property rights; to harass, abuse, insult, harm, defame, slander, disparage, intimidate, or discriminate; to submit false or misleading information; to upload or transmit malicious code; to collect or track personal information of others; to spam, phish, pharm, pretext, spider, crawl, or scrape; for obscene or immoral purposes; or to interfere with or circumvent the Service's security features. We reserve the right to terminate your use of the Service for violating any of the prohibited uses.

"},{"location":"terms-of-service/#disclaimer-of-warranties-limitation-of-liability","title":"Disclaimer of Warranties; Limitation of Liability","text":"

We cannot guarantee that your use of our service will be uninterrupted, timely, secure, or free from errors. Additionally, we cannot assure that the results obtained from using our service will be accurate or reliable. You acknowledge that we may suspend the service for indefinite periods or cancel the service at any time, without prior notice.

Your use of, or inability to use, the service is solely at your own risk. The service and all products and services delivered to you through the service are, unless explicitly stated by us, provided 'as is' and 'as available', without any warranties or conditions of any kind, either express or implied. This includes any implied warranties or conditions of merchantability, fitness for a particular purpose, or non-infringement of intellectual property rights.

Under no circumstances shall Openterface, our directors, officers, employees, affiliates, agents, contractors, interns, suppliers, service providers, or licensors be liable for any injury, loss, claim, or direct, indirect, incidental, punitive, special, or consequential damages of any kind. This includes, without limitation, lost profits, lost revenue, lost savings, loss of data, replacement costs, or any similar damages, whether based in contract, tort (including negligence), strict liability, or otherwise, arising from your use of the service or any products procured using the service. This also includes any other claim related in any way to your use of the service or any product, such as errors or omissions in any content, or any loss or damage of any kind incurred as a result of the use of the service or any content (or product) posted, transmitted, or otherwise made available via the service, even if advised of their possibility. The limitation of liability shall apply to the fullest extent permitted by law in the applicable jurisdiction.

"},{"location":"terms-of-service/#indemnification","title":"Indemnification","text":"

You agree to indemnify, defend, and hold harmless Openterface and our parent, subsidiaries, affiliates, partners, officers, directors, agents, contractors, licensors, service providers, subcontractors, suppliers, interns, and employees from any claims or demands, including reasonable legal fees, made by any third party due to or arising out of your breach of these Terms of Service, the documents they incorporate by reference, or your violation of any law or the rights of a third party.

"},{"location":"terms-of-service/#severability","title":"Severability","text":"

If any provision of these Terms of Service is found to be unlawful, void, or unenforceable, such provision shall nevertheless be enforceable to the fullest extent permitted by applicable law. The unenforceable portion shall be considered severed from these Terms of Service, but this determination shall not affect the validity and enforceability of any other remaining provisions.

"},{"location":"terms-of-service/#termination","title":"Termination","text":"

The obligations and liabilities of the parties incurred prior to the termination date will survive the termination of this agreement for all purposes. These Terms of Service are effective unless and until terminated by either you or us. You may terminate these Terms of Service at any time by notifying us that you no longer wish to use our services, or by ceasing to use our site.

We may terminate this agreement at any time without notice if, in our sole judgment, you fail or we suspect you have failed, to comply with any term or provision of these Terms of Service. In such a case, you will remain liable for all amounts due up to and including the date of termination; and we may deny you access to our services (or any part thereof).

"},{"location":"terms-of-service/#entire-agreement","title":"Entire Agreement","text":"

Our failure to exercise or enforce any right or provision of these Terms of Service shall not constitute a waiver of such right or provision. These Terms of Service and any policies or operating rules posted by us on this site or in respect to the service constitute the entire agreement and understanding between you and us, and govern your use of the service. This supersedes any prior or contemporaneous agreements, communications, and proposals, whether oral or written, between you and us (including, but not limited to, any prior versions of the Terms of Service). Any ambiguities in the interpretation of these Terms of Service shall not be construed against the drafting party.

"},{"location":"terms-of-service/#governing-law","title":"Governing Law","text":"

These Terms of Service and any separate agreements whereby we provide you services shall be governed by and construed in accordance with the laws of People's Republic of China.

"},{"location":"terms-of-service/#changes-to-terms-of-service","title":"Changes to Terms of Service","text":"

You can review the most current version of the Terms of Service at any time on this page. We reserve the right, at our sole discretion, to update, change, or replace any part of these Terms of Service by posting updates and changes to our website. It is your responsibility to check our website periodically for changes. Your continued use of or access to our website or the service following the posting of any changes to these Terms of Service constitutes acceptance of those changes.

"},{"location":"terms-of-service/#contact-information","title":"Contact Information","text":"

For any questions regarding the Terms of Service, please contact us at info@techxartisan.com.

"},{"location":"test/","title":"Pruebas y Desarrollo","text":""},{"location":"test/#compatibilidad","title":"\ud83d\udcbb Compatibilidad","text":"
  • Soporte de OS: Verificar que diferentes versiones de sistemas operativos puedan usar la aplicaci\u00f3n correspondiente.
  • Pruebas de Rendimiento: Evaluar el rendimiento en varios sistemas anfitriones.
  • Pruebas de Versiones de OS: Asegurar la compatibilidad a trav\u00e9s de diferentes versiones de sistemas operativos.
  • Problemas Espec\u00edficos de Dispositivos: Identificar y resolver problemas espec\u00edficos de ciertos dispositivos o versiones de sistemas operativos.
"},{"location":"test/#control-del-raton","title":"\ud83d\uddb1 Control del Rat\u00f3n","text":"
  • Latencia de Movimiento: Asegurar un control suave y responsivo.
  • Botones del Rat\u00f3n: Probar los botones izquierdo, derecho y central; clic y arrastre.
  • Desplazamiento: Evaluar la velocidad y direcci\u00f3n del desplazamiento.
  • Precisi\u00f3n del mapeo de la posici\u00f3n del rat\u00f3n en modo Absoluto (1)
  • Sensibilidad del movimiento del rat\u00f3n en modo Relativo (2)
  1. Asegurar que la posici\u00f3n del rat\u00f3n del objetivo se mapea con precisi\u00f3n en el anfitri\u00f3n. Esto puede verse afectado por la resoluci\u00f3n del objetivo y los cambios en el tama\u00f1o de la ventana de la aplicaci\u00f3n.
  2. Asegurar que el movimiento del rat\u00f3n cumpla con las expectativas intuitivas.
"},{"location":"test/#teclado","title":"\u2328\ufe0f Teclado","text":"
  • Respuesta al Escribir: Asegurar que cumpla con las expectativas intuitivas.
  • Mapeo Completo del Teclado: Especialmente para varios s\u00edmbolos especiales.
  • Modificadores: Teclas como Ctrl, Shift, Alt y Cmd, o Win.
  • Combinaciones de Teclas: Soporta t\u00e9cnicamente hasta 8 teclas modificadoras y 6 teclas adicionales presionadas simult\u00e1neamente.
  • Teclas de Medios y ACPI: Teclas como Volumen-, Volumen+, Silencio, Despertar, Dormir y Encendido.
  • Distribuciones de Teclado: Asegurar un emparejamiento consistente para varias distribuciones. (1)

Tip

  • Probador de Teclado: Puedes utilizar una herramienta de prueba de teclado en l\u00ednea tanto en el anfitri\u00f3n como en los equipos objetivo para verificar si sus pulsaciones est\u00e1n sincronizadas.
  • Chip CH9329: Consulta los detalles para entender los l\u00edmites del control de teclado/rat\u00f3n en el Openterface Mini-KVM.
  1. \u2328\ufe0f \ud83c\udf0f Las distribuciones de teclado var\u00edan globalmente a trav\u00e9s de regiones e idiomas, con tipos populares como QWERTY, AZERTY, QWERTZ y Dvorak.
"},{"location":"test/#acceso-a-nivel-de-bios","title":"\u2699\ufe0f Acceso a Nivel de BIOS","text":"
  • Entrada al BIOS: Probar la entrada al BIOS durante la secuencia de arranque.
  • Funcionalidad: Asegurar el control completo del teclado y rat\u00f3n dentro del BIOS.
  • Compatibilidad: Verificar el acceso al BIOS en diferentes marcas y modelos de placas base.
"},{"location":"test/#sonido","title":"\ud83d\udd0a Sonido","text":"
  • Calidad de Sonido: Evaluar la claridad y sincronizaci\u00f3n de la reproducci\u00f3n de audio.
  • Latencia: Medir cualquier retraso entre las acciones y su sonido correspondiente.
  • Compatibilidad: Probar varias salidas de audio en diferentes sistemas operativos.
"},{"location":"test/#video","title":"\ud83c\udfa5 Video","text":"
  • Soporte de Resoluci\u00f3n: Probar varias resoluciones de pantalla y relaciones de aspecto.
  • Tasa de Fotogramas: Evaluar el rendimiento a diferentes tasas de refresco.
  • Calidad de la Pantalla: Verificar la presencia de artefactos visuales o problemas de latencia.
"},{"location":"test/#puerto-usb-conmutable","title":"\ud83d\udd04 Puerto USB Conmutable","text":"
  • Pruebas del Interruptor de Conmutaci\u00f3n: Probar el interruptor de conmutaci\u00f3n en varios escenarios para asegurar su fiabilidad.
  • Compatibilidad del Puerto: Asegurar que el puerto USB-A 2.0 soporte varios dispositivos USB como memorias flash y c\u00e1maras web.
  • Limitaciones de Potencia: Confirmar la capacidad de suministro de energ\u00eda del puerto y su adecuaci\u00f3n para diferentes dispositivos.
"},{"location":"test/#conectar-y-desconectar","title":"\ud83d\udd0c Conectar y Desconectar","text":"
  • Pruebas de Conexi\u00f3n: Probar escenarios con diferentes secuencias de conexi\u00f3n y desconexi\u00f3n.
  • Manejo de Errores: Asegurar que el dispositivo reconozca y se recupere de conexiones incorrectas.
  • Estabilidad: Verificar la estabilidad cuando los dispositivos se conectan y desconectan repetidamente.
"},{"location":"test/#transferencia-de-texto","title":"\ud83d\udcdd Transferencia de Texto","text":"
  • Pruebas de Funcionalidad: Verificar que la aplicaci\u00f3n anfitriona pueda transferir texto exitosamente desde el ordenador anfitri\u00f3n al dispositivo objetivo usando c\u00f3digos ASCII.

  • Integridad del Contenido: Asegurar que el contenido del texto transferido desde el anfitri\u00f3n al dispositivo objetivo permanezca intacto y se reproduzca con precisi\u00f3n.

  • Manejo de Caracteres Especiales: Probar la funci\u00f3n de transferencia de texto con varios caracteres ASCII para asegurar un manejo y reproducci\u00f3n adecuados en el dispositivo objetivo.

  • Pruebas de Longitud de Texto: Probar la funci\u00f3n de transferencia de texto con textos de diferentes longitudes para verificar que pueda acomodar diferentes tama\u00f1os de texto sin problemas.

  • Manejo de Errores: Probar escenarios de error, como p\u00e9rdida de conexi\u00f3n o interrupci\u00f3n durante la transferencia de texto, para asegurar que la aplicaci\u00f3n anfitriona maneje estas situaciones de manera adecuada y proporcione retroalimentaci\u00f3n apropiada al usuario.

  • Pruebas de Rendimiento: Evaluar el rendimiento de la funci\u00f3n de transferencia de texto bajo varias condiciones, incluyendo en ordenadores m\u00e1s antiguos o lentos, para identificar posibles problemas con la recepci\u00f3n incorrecta de se\u00f1ales de entrada HID y asegurar un funcionamiento fluido.

  • Pruebas de Interfaz de Usuario: Asegurar que la interfaz de usuario de la aplicaci\u00f3n anfitriona proporcione controles intuitivos y retroalimentaci\u00f3n para iniciar y monitorear las operaciones de transferencia de texto, facilitando a los usuarios la comprensi\u00f3n y uso efectivo de esta funci\u00f3n.

"},{"location":"test/#adicional","title":"Adicional","text":"
  • Manejo de Errores: Probar los mecanismos de manejo de errores para una recuperaci\u00f3n adecuada de las interrupciones.
  • Rendimiento: Evaluar el rendimiento del mini-KVM bajo varios escenarios de carga de trabajo.
  • Estabilidad: Realizar pruebas de estr\u00e9s para la estabilidad y fiabilidad a largo plazo.
"},{"location":"usb-switch/","title":"Mec\u00e1nica del Puerto USB Conmutable","text":"

El dispositivo mini-KVM cuenta con un puerto USB-A 2.0 conmutable que puede alternarse entre la computadora anfitriona y la computadora objetivo, pero no puede estar conectado a ambas simult\u00e1neamente. Esta funcionalidad se controla tanto mediante un interruptor f\u00edsico como un interruptor de software en la aplicaci\u00f3n del anfitri\u00f3n. Este documento explica la mec\u00e1nica y la l\u00f3gica detr\u00e1s de estos interruptores.

"},{"location":"usb-switch/#tipos-de-interruptores","title":"Tipos de Interruptores","text":"
  • Interruptor de Software: Un bot\u00f3n de alternancia en la aplicaci\u00f3n del anfitri\u00f3n.

    • Alterna la conexi\u00f3n del puerto USB entre las computadoras anfitriona y objetivo
  • Interruptor de Hardware: Un interruptor f\u00edsico de dos posiciones en el dispositivo.

    • Posici\u00f3n hacia adentro: Conecta a la computadora anfitriona
    • Posici\u00f3n hacia afuera: Conecta a la computadora objetivo
"},{"location":"usb-switch/#configuracion-inicial-y-sincronizacion","title":"Configuraci\u00f3n Inicial y Sincronizaci\u00f3n","text":"

Cuando el mini-KVM est\u00e1 correctamente conectado y se inicia la aplicaci\u00f3n del anfitri\u00f3n:

  1. La conexi\u00f3n real del puerto USB del dispositivo (circuito) inicialmente se conecta a la computadora anfitriona.
  2. La aplicaci\u00f3n del anfitri\u00f3n detecta la posici\u00f3n actual del interruptor de hardware, que est\u00e1 configurado en la computadora anfitriona o en la computadora objetivo.
  3. El interruptor de software se sincroniza con la posici\u00f3n del interruptor de hardware.
  4. La conexi\u00f3n del circuito real se actualiza para coincidir con las posiciones de los interruptores.

Limitaci\u00f3n de Hardware

Si una unidad USB ya est\u00e1 conectada al dispositivo antes de encenderlo o iniciar la aplicaci\u00f3n del anfitri\u00f3n, la computadora anfitriona emitir\u00e1 una advertencia sobre la extracci\u00f3n insegura del dispositivo USB. Esta es una limitaci\u00f3n de hardware para la versi\u00f3n 1.9. Por lo tanto, se recomienda no conectar ning\u00fan dispositivo USB antes de encender el dispositivo o iniciar nuestra aplicaci\u00f3n del anfitri\u00f3n.

"},{"location":"usb-switch/#estados-operativos","title":"Estados Operativos","text":"

Debido a la presencia de interruptores de hardware y software, pueden ocurrir cuatro estados posibles:

  • Estado 1 (Sincronizado, Conectado al Anfitri\u00f3n):

    • Interruptor de Hardware: Apunta al Anfitri\u00f3n
    • Interruptor de Software: Apunta al Anfitri\u00f3n
    • Conexi\u00f3n del Puerto USB: Conectado al Anfitri\u00f3n
  • Estado 2 (Sincronizado, Conectado al Objetivo):

    • Interruptor de Hardware: Apunta al Objetivo
    • Interruptor de Software: Apunta al Objetivo
    • Conexi\u00f3n del Puerto USB: Conectado al Objetivo
  • Estado 3 (Fuera de Sincronizaci\u00f3n, USB Conectado al Anfitri\u00f3n):

    • Interruptor de Hardware: Apunta al Objetivo
    • Interruptor de Software: Apunta al Anfitri\u00f3n
    • Conexi\u00f3n del Puerto USB: Conectado al Anfitri\u00f3n
  • Estado 4 (Fuera de Sincronizaci\u00f3n, USB Conectado al Objetivo):

    • Interruptor de Hardware: Apunta al Anfitri\u00f3n
    • Interruptor de Software: Apunta al Objetivo
    • Conexi\u00f3n del Puerto USB: Conectado al Objetivo
"},{"location":"usb-switch/#transiciones-de-estado-y-logica","title":"Transiciones de Estado y L\u00f3gica","text":""},{"location":"usb-switch/#desde-estado-1-sincronizado-con-el-anfitrion","title":"Desde Estado 1 (Sincronizado con el Anfitri\u00f3n)","text":"
  • Escenario 1a: El usuario mueve el Interruptor de Hardware al Objetivo

    • Actualizar la variable de estado interno al Objetivo
    • Actualizar la pantalla de la aplicaci\u00f3n del anfitri\u00f3n para mostrar el Objetivo
    • Cambiar la conexi\u00f3n del circuito real al Objetivo
    • Transici\u00f3n al Estado 2, sincronizado
  • Escenario 1b: El usuario hace clic en el Interruptor de Software al Objetivo

    • Actualizar la variable de estado interno al Objetivo
    • La posici\u00f3n del interruptor de hardware permanece sin cambios (apuntando al Anfitri\u00f3n )
    • Cambiar la conexi\u00f3n del circuito real al Objetivo
    • Transici\u00f3n al Estado 3, fuera de sincronizaci\u00f3n
"},{"location":"usb-switch/#desde-estado-2-sincronizado-con-el-objetivo","title":"Desde Estado 2 (Sincronizado con el Objetivo)","text":"
  • Escenario 2a: El usuario mueve el Interruptor de Hardware al Anfitri\u00f3n :

    • Actualizar la variable de estado interno al Anfitri\u00f3n
    • Actualizar la pantalla del interruptor de software para mostrar el Anfitri\u00f3n
    • Cambiar la conexi\u00f3n del circuito real al Anfitri\u00f3n
    • Transici\u00f3n al Estado 1, sincronizado
  • Escenario 2b: El usuario hace clic en el Interruptor de Software al Anfitri\u00f3n :

    • Actualizar la variable de estado interno al Anfitri\u00f3n
    • La posici\u00f3n del interruptor de hardware permanece sin cambios (apuntando al Objetivo )
    • Cambiar la conexi\u00f3n del circuito real al Anfitri\u00f3n
    • Transici\u00f3n al Estado 4, fuera de sincronizaci\u00f3n
"},{"location":"usb-switch/#desde-estado-3-fuera-de-sincronizacion-usb-conectado-al-anfitrion","title":"Desde Estado 3 (Fuera de Sincronizaci\u00f3n, USB Conectado al Anfitri\u00f3n)","text":"
  • Escenario 3a: El usuario mueve el Interruptor de Hardware al Objetivo :

    • No hay cambios en las variables
    • Transici\u00f3n al Estado 2, sincronizado
  • Escenario 3b: El usuario hace clic en el Interruptor de Software al Anfitri\u00f3n :

    • Actualizar la variable de estado interno al Anfitri\u00f3n
    • La posici\u00f3n del interruptor de hardware permanece sin cambios (apuntando al Objetivo )
    • Cambiar la conexi\u00f3n del circuito real al Anfitri\u00f3n
    • Transici\u00f3n al Estado 1, sincronizado
"},{"location":"usb-switch/#desde-estado-4-fuera-de-sincronizacion-usb-conectado-al-objetivo","title":"Desde Estado 4 (Fuera de Sincronizaci\u00f3n, USB Conectado al Objetivo)","text":"
  • Escenario 4a: El usuario mueve el Interruptor de Hardware al Anfitri\u00f3n :

    • No hay cambios en las variables
    • Transici\u00f3n al Estado 1, sincronizado
  • Escenario 4b: El usuario hace clic en el Interruptor de Software al Objetivo :

    • Actualizar la variable de estado interno al Objetivo
    • La posici\u00f3n del interruptor de hardware permanece sin cambios (apuntando al Anfitri\u00f3n )
    • Cambiar la conexi\u00f3n del circuito real al Objetivo
    • Transici\u00f3n al Estado 2, sincronizado

Recuerde expulsar la unidad flash antes de alternar el interruptor

Si el puerto USB est\u00e1 siendo utilizado por una unidad flash, aseg\u00farese de expulsar la unidad flash antes de alternar el interruptor para transferir el uso del puerto a otra computadora.

Limitaciones de energ\u00eda del USB

La energ\u00eda suministrada por el puerto USB depende de la placa base del Anfitri\u00f3n. No se recomienda conectar dispositivos USB que requieran mucha energ\u00eda. T\u00edpicamente, el consumo de energ\u00eda no debe exceder los 1.5W. Conectar dispositivos de alta potencia puede resultar en una operaci\u00f3n inestable o da\u00f1o potencial.

Gu\u00eda para el Usuario

  • Prioridad del Interruptor de Software: Independientemente de la posici\u00f3n del interruptor de hardware, hacer clic en el interruptor de software cambiar\u00e1 inmediatamente la direcci\u00f3n del circuito.

  • Sincronizaci\u00f3n del Interruptor de Hardware: Cualquier alternancia manual del Interruptor de Hardware alinear\u00e1 su estado con el Interruptor de Software, pasando al Estado 1 o Estado 2 desde el Estado 3 o Estado 4 fuera de sincronizaci\u00f3n. Sin embargo, esta sincronizaci\u00f3n no necesariamente alterar\u00e1 la conexi\u00f3n real del circuito.

  • Monitoreo del Interruptor de Hardware: El Interruptor de Hardware, a pesar de ser f\u00edsico, es monitoreado por el software y no controla directamente la direcci\u00f3n del circuito. En su lugar, el software interpreta la posici\u00f3n del interruptor y gestiona el cambio real del circuito.

"},{"location":"usb-switch/#por-que-importa-la-conmutacion-usb-controlada-por-software","title":"Por Qu\u00e9 Importa la Conmutaci\u00f3n USB Controlada por Software","text":"

La mejora de la conmutaci\u00f3n USB controlada por software introducida en la versi\u00f3n 1.9 es una caracter\u00edstica fundamental para nuestros planes de desarrollo futuro, particularmente en el soporte de soluciones KVM-over-IP como VNC (que a\u00fan no hemos implementado). Esta capacidad permite a los usuarios alternar y compartir el puerto USB entre las computadoras objetivo y anfitriona de forma remota, lo cual es especialmente crucial para facilitar la transferencia de archivos en una configuraci\u00f3n remota.

Esta caracter\u00edstica abre un mundo de posibilidades para la gesti\u00f3n y el control remoto. Por ejemplo, permite transferencias de archivos entre dispositivos sin intervenci\u00f3n f\u00edsica, mejorando la eficiencia de la soluci\u00f3n de problemas y la gesti\u00f3n del sistema de forma remota.

\u00bfTienes ideas creativas sobre c\u00f3mo aprovechar esta caracter\u00edstica? \u00a1Nos encantar\u00eda hablar contigo! \u00danete a la comunidad de Openterface community y comparte tus pensamientos \ud83d\ude03

"},{"location":"use-cases/","title":"Casos de Uso","text":""},{"location":"use-cases/#portabilidad-versatil-para-soluciones-rapidas","title":"Portabilidad Vers\u00e1til para Soluciones R\u00e1pidas","text":"

Al combinar el Openterface Mini-KVM con el uConsole de Clockwork, este ordenador port\u00e1til Pi se convierte en una herramienta KVM pr\u00e1ctica, perfecta para conectar y solucionar problemas r\u00e1pidamente en dispositivos sin pantalla cercanos. Esta configuraci\u00f3n es especialmente \u00fatil para ingenieros de campo y entusiastas de la tecnolog\u00eda que necesitan una soluci\u00f3n compacta y eficiente para gestionar y diagnosticar dispositivos sobre la marcha.

Aqu\u00ed tienes un video de demostraci\u00f3n r\u00e1pida de nuestra aplicaci\u00f3n host Qt ejecut\u00e1ndose en el Pi dentro de este uConsole. pic.twitter.com/xwrOE9pCcF

\u2014 TechxArtisan (@TechxArtisan) 1 de julio de 2024"},{"location":"use-cases/#gestion-de-servidores-simplificada","title":"Gesti\u00f3n de Servidores Simplificada","text":"

Ideal para profesionales de TI que trabajan en el mantenimiento y operaci\u00f3n de salas de servidores, nuestro Mini-KVM permite controlar m\u00faltiples servidores desde tu propio port\u00e1til como una \u00fanica estaci\u00f3n de trabajo, mejorando la eficiencia operativa.

"},{"location":"use-cases/#configuracion-simplificada-para-entusiastas-de-la-tecnologia","title":"Configuraci\u00f3n Simplificada para Entusiastas de la Tecnolog\u00eda","text":"

Este producto facilita el proceso de configuraci\u00f3n para los entusiastas de micro-ordenadores que trabajan con dispositivos como Raspberry Pi y Jetson Nano. Permite el control directo desde un ordenador principal, eliminando la necesidad de perif\u00e9ricos adicionales.

"},{"location":"use-cases/#control-unificado-para-diversos-dispositivos","title":"Control Unificado para Diversos Dispositivos","text":"

Perfecto para profesionales que alternan entre ordenadores personales y de trabajo, o que gestionan dispositivos como cajeros autom\u00e1ticos, terminales de loter\u00eda y quioscos. El Openterface Mini-KVM ofrece una interfaz unificada que simplifica la gesti\u00f3n de m\u00faltiples dispositivos.

"},{"location":"use-cases/#operaciones-seguras-para-tareas-sensibles","title":"Operaciones Seguras para Tareas Sensibles","text":"

Los profesionales que gestionan tareas que requieren segregaci\u00f3n de red, como la gesti\u00f3n de activos de criptomonedas, encontrar\u00e1n este producto indispensable para mantener operaciones locales seguras.

"},{"location":"use-cases/#integracion-eficiente-para-flujos-de-trabajo-mixtos","title":"Integraci\u00f3n Eficiente para Flujos de Trabajo Mixtos","text":"

Los usuarios que cambian frecuentemente entre ordenadores personales y de trabajo, o aquellos que gestionan dispositivos de computaci\u00f3n en el borde, se beneficiar\u00e1n de la integraci\u00f3n de flujos de trabajo simplificada que proporciona el Openterface Mini-KVM.

"},{"location":"use-cases/#control-sin-interrupciones-mini-kvm-lapiz-de-android-pura-magia","title":"Control Sin Interrupciones: Mini-KVM + L\u00e1piz de Android = Pura Magia","text":"

\u00bfQu\u00e9 tal si pudieras usar tu l\u00e1piz de Android para controlar sistemas Windows o macOS directamente en tu tableta Android a trav\u00e9s del Openterface MiniKVM? Imagina dibujar dise\u00f1os, marcar documentos, o navegar software con precisi\u00f3n\u2014todo sin cambiar de dispositivos. \u00a1Sea una herramienta de dise\u00f1o gr\u00e1fico como Photoshop, una aplicaci\u00f3n de modelado 3D, o incluso un editor de presentaciones, la experiencia es fluida e intuitiva!

El Mini-KVM desbloquea esta integraci\u00f3n sin interrupciones, permiti\u00e9ndote usar tu tableta Android como un centro para el control entre plataformas. \u00bfTienes un software favorito que probar\u00edas primero? \u00a1H\u00e1ganoslo saber, y mant\u00e9ngase atento para m\u00e1s formas creativas de elevar tu espacio de trabajo!

Aqu\u00ed tienes un video de demostraci\u00f3n r\u00e1pida de nuestra aplicaci\u00f3n host Qt ejecut\u00e1ndose en el Pi dentro de este uConsole. pic.twitter.com/xwrOE9pCcF

\u2014 TechxArtisan (@TechxArtisan) 1 de julio de 2024"},{"location":"whats-in-the-box/","title":"\u00bfQu\u00e9 Hay En La Caja?","text":"

Descubre nuestras dos opciones de compra dise\u00f1adas para satisfacer tus necesidades, ya sea que busques lo esencial o un conjunto completo de herramientas.

"},{"location":"whats-in-the-box/#paquete-1-paquete-basico","title":"Paquete 1: Paquete B\u00e1sico","text":"
  1. Producto Principal: Openterface Mini-KVM
  2. Gu\u00eda de Inicio R\u00e1pido
"},{"location":"whats-in-the-box/#paquete-2-paquete-de-herramientas","title":"Paquete 2: Paquete de Herramientas","text":"
  1. Producto Principal: Openterface Mini-KVM
  2. Gu\u00eda de Inicio R\u00e1pido
  3. Bolsa de Herramientas (165 x 110 x 50mm)
  4. Tapa de Extensi\u00f3n de Pin
  5. Cable HDMI Macho a Macho (30cm)
  6. Cable Tipo-C Macho a USB-A Macho (0.3m) con Adaptador USB-A Hembra a USB-C Macho
  7. Cable Tipo-C Macho a Macho (1.5m) con Adaptador USB-C Hembra a USB-A Macho
"},{"location":"why-openterface/","title":"\u00bfPor qu\u00e9 Openterface?","text":"

Con tantas soluciones KVM disponibles, aqu\u00ed te contamos por qu\u00e9 Openterface te conquistar\u00e1:

  1. Portabilidad y Funcionalidad

    Dise\u00f1ado pensando en la portabilidad, el Openterface Mini-KVM es un dispositivo compacto y ligero que puede acompa\u00f1arte f\u00e1cilmente a donde vayas. Con capacidades completas como acceso a nivel de BIOS, integraci\u00f3n de audio, un puerto USB conmutador y transferencia de texto, este dispositivo proporciona todas las herramientas necesarias para gestionar y solucionar problemas de tus dispositivos sin pantalla, sin importar d\u00f3nde te encuentres.

  2. Soluci\u00f3n sin Red y Resoluci\u00f3n R\u00e1pida de Problemas

    A diferencia de las soluciones KVM-over-IP o KVM por software que dependen del acceso a la red, el Openterface Mini-KVM ofrece una experiencia plug-and-play independiente de la red. Nuestro dispositivo establece una conexi\u00f3n directa HDMI y USB entre el ordenador anfitri\u00f3n y el dispositivo objetivo, permiti\u00e9ndote tomar el control y diagnosticar problemas r\u00e1pidamente, especialmente en entornos donde la conectividad de red es poco fiable o inexistente. El tiempo de inicio del hardware es de menos de 1 segundo, asegurando que puedas comenzar a solucionar problemas sin demoras ni interrupciones en tu flujo de trabajo.

  3. Precio Asequible

    A diferencia de las consolas KVM tradicionales que suelen tener un precio elevado, nuestro Mini-KVM est\u00e1 dise\u00f1ado para ser accesible y asequible para un amplio espectro de usuarios, desde profesionales de TI hasta entusiastas de la tecnolog\u00eda.

  4. Completamente de C\u00f3digo Abierto y Comunidad

    La verdadera magia reside en nuestro compromiso con el desarrollo de c\u00f3digo abierto y la participaci\u00f3n comunitaria. Al abrazar estos principios, estamos construyendo un ecosistema vibrante donde los usuarios pueden colaborar, contribuir y personalizar el dispositivo para satisfacer sus necesidades \u00fanicas, fomentando la innovaci\u00f3n y empujando los l\u00edmites de lo que es posible. \ud83d\udc68\u200d\ud83d\udcbb\ud83e\udd1d\ud83d\udc69\u200d\ud83d\udcbb

Aprende m\u00e1s comparando Openterface con otras soluciones KVM.

"},{"location":"blog/","title":"Blog","text":""},{"location":"blog/la-campa%C3%B1a-de-crowdfunding-para-el-openterface-mini-kvm-est%C3%A1-en-vivo-ahora/","title":"\u00a1La Campa\u00f1a de Crowdfunding para el Openterface Mini-KVM Est\u00e1 en Vivo AHORA!","text":"

\u00a1Estamos emocionados de anunciar que la campa\u00f1a de crowdfunding para el Openterface Mini-KVM ya est\u00e1 en vivo! Este dispositivo rico en funciones, de c\u00f3digo abierto y dirigido por la comunidad, simplifica la forma en que controlas e interact\u00faas con computadoras sin pantalla.

Ofrece una soluci\u00f3n KVM sobre USB compacta, ligera y r\u00e1pida que elimina la necesidad de teclados, ratones, monitores o configuraciones de red adicionales. Puedes controlar una computadora sin pantalla directamente desde tu laptop o computadora de escritorio, simplificando tu configuraci\u00f3n y mejorando tu flujo de trabajo.

\u00a1\u00danete a nosotros para hacer tu vida tecnol\u00f3gica m\u00e1s f\u00e1cil!

"},{"location":"blog/la-campa%C3%B1a-de-crowdfunding-para-el-openterface-mini-kvm-est%C3%A1-en-vivo-ahora/#una-herramienta-versatil-para-diversas-necesidades-en-movimiento","title":"Una Herramienta Vers\u00e1til para Diversas Necesidades en Movimiento","text":"

El Openterface Mini-KVM es el compa\u00f1ero perfecto para una amplia gama de usuarios y escenarios:

  • Profesionales de TI solucionando problemas en servidores
  • T\u00e9cnicos que dan servicio a cajeros autom\u00e1ticos, VLTs y quioscos
  • Desarrolladores gestionando dispositivos de computaci\u00f3n en el borde
  • Entusiastas de la tecnolog\u00eda experimentando con computadoras de placa \u00fanica
  • Profesionales que requieren operaciones locales seguras en la segregaci\u00f3n de redes, como aquellos que gestionan activos de criptomonedas
  • Cualquiera que necesite integrar frecuentemente flujos de trabajo entre computadoras personales y de trabajo.

"},{"location":"blog/la-campa%C3%B1a-de-crowdfunding-para-el-openterface-mini-kvm-est%C3%A1-en-vivo-ahora/#impulsado-por-la-retroalimentacion-de-la-comunidad","title":"Impulsado por la Retroalimentaci\u00f3n de la Comunidad","text":"

Nuestra aventura en la creaci\u00f3n del Openterface Mini-KVM fue inspirada por nuestros propios desaf\u00edos y un deseo colectivo de una herramienta m\u00e1s efectiva. Con una historia rica en nuestro estudio TechxArtisan desarrollando proyectos de arte tecnol\u00f3gico y soluciones IoT al aire libre, a menudo enfrentamos el dilema de gestionar dispositivos en condiciones de red poco fiables sin el lujo de llevar equipo adicional. Impulsados por conversaciones con colegas y retroalimentaci\u00f3n de una comunidad que comparte nuestras dificultades, nos propusimos crear un dispositivo que aborde estas necesidades de frente, facilitando el control de dispositivos sin pantalla de manera confiable y sin esfuerzo.

"},{"location":"blog/la-campa%C3%B1a-de-crowdfunding-para-el-openterface-mini-kvm-est%C3%A1-en-vivo-ahora/#la-diferencia-del-openterface-mini-kvm","title":"La Diferencia del Openterface Mini-KVM","text":"

Podr\u00edas preguntarte, con varias soluciones KVM disponibles, \u00bfpor qu\u00e9 elegir el Openterface Mini-KVM? Aqu\u00ed te decimos por qu\u00e9:

  1. Compacto y Eficiente: Dise\u00f1ado tanto para profesionales de TI como para entusiastas, nuestra soluci\u00f3n KVM sobre USB brilla en entornos con acceso limitado o nulo a la red, ofreciendo una herramienta port\u00e1til, independiente de la red y r\u00e1pida para la soluci\u00f3n de problemas.

  2. Asequibilidad: Hemos trabajado arduamente para hacer que el Openterface Mini-KVM sea m\u00e1s rentable que sus contrapartes, asegurando que est\u00e9 al alcance de todos los que necesiten esta herramienta esencial para proyectos de trabajo o pasatiempos.

  3. Dirigido por la Comunidad y de C\u00f3digo Abierto: En su n\u00facleo, el Openterface Mini-KVM se trata de fomentar una comunidad de innovaci\u00f3n y colaboraci\u00f3n. Al abrazar los valores de c\u00f3digo abierto, invitamos a los usuarios a contribuir con caracter\u00edsticas personalizadas y mejoras, enriqueciendo las capacidades y versatilidad de la herramienta.

"},{"location":"blog/la-campa%C3%B1a-de-crowdfunding-para-el-openterface-mini-kvm-est%C3%A1-en-vivo-ahora/#mantente-conectado-e-involucrado","title":"Mantente Conectado e Involucrado","text":"

Para mantenerte al d\u00eda con los \u00faltimos desarrollos, recibir soporte t\u00e9cnico y conectarte con otros usuarios, te invitamos a visitar nuestra p\u00e1gina de Pre-Lanzamiento en Crowd Supply, explorar nuestro sitio web en openterface.com, y unirte a nuestras comunidades en subreddit r/Openterface_miniKVM y Discord TechxArtisan.

Emprendamos juntos este emocionante viaje y revolucionemos la forma en que controlas dispositivos sin pantalla. \u00a1\u00danete a nosotros para hacer realidad el Openterface Mini-KVM!

\u00a1Saludos!

"},{"location":"blog/desde-el-desarrollo-hasta-tus-manos-detr%C3%A1s-de-escena/","title":"Desde el Desarrollo hasta tus Manos: Detr\u00e1s de Escena","text":"

\u00a1Hola a todos!

Estamos de vuelta con otra actualizaci\u00f3n sobre nuestra campa\u00f1a de crowdfunding, \u00a1y tenemos noticias emocionantes para compartir!

"},{"location":"blog/desde-el-desarrollo-hasta-tus-manos-detr%C3%A1s-de-escena/#alcanzando-un-hito-importante","title":"Alcanzando un Hito Importante","text":"

Primero que nada, estamos absolutamente encantados de anunciar que hemos alcanzado un asombroso 1100% de nuestra meta de financiamiento original! Un enorme agradecimiento a cada uno de ustedes. \u00a1Su apoyo ha sido simplemente fenomenal!

"},{"location":"blog/desde-el-desarrollo-hasta-tus-manos-detr%C3%A1s-de-escena/#planificacion-de-produccion","title":"Planificaci\u00f3n de Producci\u00f3n","text":"

\u00a1Hemos estado s\u00faper ocupados en el frente de producci\u00f3n! Esta semana, visitamos la ciudad tecnol\u00f3gica de Shenzhen y tuvimos la oportunidad de recorrer una de las principales f\u00e1bricas de tecnolog\u00eda. Estas personas trabajan con grandes nombres como Meta, ABB y Blaupunkt, y fue incre\u00edble ver sus avanzadas l\u00edneas de producci\u00f3n y maquinaria de control de calidad en acci\u00f3n. Me encantar\u00eda compartir m\u00e1s fotos, pero aqu\u00ed hay una con un poco de mosaico digital por confidencialidad.

(Est\u00e1bamos discutiendo QC con el gerente de la l\u00ednea de producci\u00f3n.)

Nos sentimos muy positivos sobre esta asociaci\u00f3n y su entusiasmo por apoyar a una startup tecnol\u00f3gica como la nuestra. Estamos comprometidos a garantizar que la fase de fabricaci\u00f3n se maneje con la m\u00e1xima dedicaci\u00f3n y calidad para que podamos poner nuestro producto en sus manos pronto. Aqu\u00ed hay una foto de nuestros miembros del equipo principal en la entrada de la f\u00e1brica:

(De izquierda a derecha: Shawn, Billy, Kevin, Vileer.)

"},{"location":"blog/desde-el-desarrollo-hasta-tus-manos-detr%C3%A1s-de-escena/#mejorando-los-accesorios-del-kit-de-herramientas","title":"Mejorando los Accesorios del Kit de Herramientas","text":"

Siempre estamos buscando formas de mejorar, y nuestro cable adicional VGA a HDMI ahora ha sido mejorado a 1 metro de largo con mayor calidad, como pueden ver en nuestra actualizaci\u00f3n de la Semana 2.

A continuaci\u00f3n, tambi\u00e9n estamos investigando nuestro cable Type-C de 1.5 metros de largo para conectar a la computadora anfitriona. El Type-C se est\u00e1 volviendo cada vez m\u00e1s com\u00fan en nuevas computadoras, laptops e incluso servidores. Despu\u00e9s de probar muchos fabricantes, encontramos uno que podr\u00eda producir este elegante cable Type-C naranja con una agradable sensaci\u00f3n de silicona que cumple con nuestros est\u00e1ndares de calidad.

Actualmente, se requiere un adaptador adicional de Type-C a USB-A si nuestro Mini-KVM funciona con una computadora anfitriona que solo tiene puertos USB-A.

Sabemos que es un poco molesto, por lo que estamos trabajando estrechamente con nuestro fabricante para mejorarlo integrando un adaptador adjunto de Type-C a USB-A. Aqu\u00ed hay un prototipo de c\u00f3mo podr\u00eda verse.

Este elegante cable naranja, con una buena sensaci\u00f3n de silicona y 1.5 metros de largo, presenta conectores Type-C en ambos extremos e incluye un adaptador para convertir un extremo de Type-C a USB-A. No existe en el mercado y requiere nuestra producci\u00f3n OEM personalizada. Estamos apuntando a incluir esta soluci\u00f3n en nuestro paquete final de herramientas para los patrocinadores, pero todav\u00eda estoy haciendo c\u00e1lculos y d\u00e1ndole un buen uso a mi calculadora. Para que esto suceda, necesitamos m\u00e1s apoyo para reducir el costo total de producci\u00f3n de nuestro kit de herramientas mini-KVM. Dado el n\u00famero actual de crowdfunding y los costos de producci\u00f3n, hacer este cable Type-C personalizado se est\u00e1 volviendo m\u00e1s factible, ya que se est\u00e1 acercando al punto de equilibrio. \u00a1Mantendr\u00e9 a todos actualizados en la comunidad de Openterface sobre cualquier progreso!

Por su parte, si encuentran nuestro proyecto prometedor y creen que el Mini-KVM puede hacer su vida tecnol\u00f3gica m\u00e1s f\u00e1cil, consideren apoyarnos y difundir la palabra a sus amigos. \u00a1Asegur\u00e9monos de poder mejorar el producto a\u00fan m\u00e1s mientras lo mantenemos asequible para todos en esta campa\u00f1a de crowdfunding! \u00a1Muchas gracias!

"},{"location":"blog/desde-el-desarrollo-hasta-tus-manos-detr%C3%A1s-de-escena/#actualizaciones-de-codigo-abierto-y-colaboracion-global","title":"Actualizaciones de C\u00f3digo Abierto y Colaboraci\u00f3n Global","text":"

Por favor, tengan paciencia con nosotros durante esta etapa temprana de desarrollo, ya que todav\u00eda hay errores y cambios en nuestras aplicaciones anfitrionas. \u00a1Ah\u00ed es donde entra nuestro equipo beta! Ya hemos organizado dos rondas de pruebas beta. Echen un vistazo a nuestras publicaciones aqu\u00ed para saber m\u00e1s:

  • Actualizaci\u00f3n sobre Aplicaciones para el Equipo Beta Ronda 1 el 1 de abril de 2024
  • Env\u00edo al Equipo Beta Ronda 1 el 23 de abril de 2024
  • Aplicaci\u00f3n para Unirse al Equipo Beta Ronda 2 el 11 de mayo de 2024
  • Actualizaci\u00f3n sobre Aplicaciones para el Equipo Beta Ronda 2 el 22 de mayo de 2024

Como pueden ver en las publicaciones anteriores, recibimos un n\u00famero abrumador de aplicaciones fant\u00e1sticas en las Rondas 1 y 2, y fue un verdadero desaf\u00edo reducir los candidatos de un grupo tan brillante. \u00a1Tuvimos que tomar decisiones dif\u00edciles debido a los lugares limitados disponibles en esta fase exclusiva!

Nuestro equipo beta es una colaboraci\u00f3n excepcional y verdaderamente global, con miembros de EE. UU. \ud83c\uddfa\ud83c\uddf8, Reino Unido \ud83c\uddec\ud83c\udde7, Jap\u00f3n \ud83c\uddef\ud83c\uddf5, Alemania \ud83c\udde9\ud83c\uddea, Rep\u00fablica Checa \ud83c\udde8\ud83c\uddff, Noruega \ud83c\uddf3\ud83c\uddf4, B\u00e9lgica \ud83c\udde7\ud83c\uddea, Francia \ud83c\uddeb\ud83c\uddf7, Austria \ud83c\udde6\ud83c\uddf9, Australia \ud83c\udde6\ud83c\uddfa, Polonia \ud83c\uddf5\ud83c\uddf1, Pa\u00edses Bajos \ud83c\uddf3\ud83c\uddf1, China \ud83c\udde8\ud83c\uddf3, y m\u00e1s que se unir\u00e1n pronto. Estos testers aportan experiencia en desarrollo, casos de uso reales para el Openterface Mini-KVM y una pasi\u00f3n por apoyar proyectos de c\u00f3digo abierto como el nuestro. Nuestro equipo beta ya est\u00e1 utilizando este pr\u00e1ctico dispositivo en sus tareas diarias, planteando problemas y sugiriendo caracter\u00edsticas para que podamos mejorar a\u00fan m\u00e1s.

Aunque la mayor\u00eda de ustedes no tienen esta versi\u00f3n temprana del mini-KVM, a\u00fan pueden revisar nuestro c\u00f3digo en GitHub y unirse a la conversaci\u00f3n con nuestros equipos beta y de desarrollo en nuestra comunidad. \u00a1H\u00e1ganos saber lo que encuentran para que podamos hacer este dispositivo incre\u00edble juntos!

Aqu\u00ed est\u00e1n las actualizaciones sobre nuestro repositorio de c\u00f3digo abierto en GitHub:

"},{"location":"blog/desde-el-desarrollo-hasta-tus-manos-detr%C3%A1s-de-escena/#openterface_macos","title":"Openterface_MacOS","text":"

Nuestra aplicaci\u00f3n anfitriona Openterface MacOS ya est\u00e1 oficialmente en vivo en la Apple App Store. Solo busquen 'Openterface' o 'mini-KVM' para encontrar nuestra p\u00e1gina de la aplicaci\u00f3n. A\u00fan mejor, hemos subido el c\u00f3digo completo a nuestro repositorio de GitHub: Openterface_MacOS para el Mini-KVM. Pueden ver esta demostraci\u00f3n de operaci\u00f3n b\u00e1sica en MacOS.

"},{"location":"blog/desde-el-desarrollo-hasta-tus-manos-detr%C3%A1s-de-escena/#openterface_qt","title":"Openterface_QT","text":"

QT es un marco vers\u00e1til que nos encanta, as\u00ed que construimos nuestro mini-KVM basado en \u00e9l. Para la versi\u00f3n de Windows, echen un vistazo a nuestro video de demostraci\u00f3n temprana aqu\u00ed. Pueden ver en la demostraci\u00f3n que funciona genial con baja latencia y una conexi\u00f3n estable. Pueden encontrar y descargar la aplicaci\u00f3n beta temprana desde el repositorio de GitHub all\u00ed.

En cuanto a los sistemas basados en Linux, empaquetar para diferentes arquitecturas como ARM32, ARM64, ARMv7 y ARMv8, especialmente para el Raspberry Pi, es todo un desaf\u00edo (con horas y horas de espera para el empaquetado), pero estamos trabajando en ello. Esperen una demostraci\u00f3n de Linux pronto, con suerte dentro de una semana.

Ahora, hemos subido todo nuestro c\u00f3digo fresco para Openterface_QT en GitHub. \u00a1Sum\u00e9rjanse y echen un vistazo, pero prep\u00e1rense, todav\u00eda est\u00e1 en las primeras etapas de desarrollo, por lo que a\u00fan hay algunos inevitables problemas y trabajo por hacer para mejorarlo. No nos importar\u00eda una mano. Si eres desarrollador, \u00fanete a nosotros. \u00a1Feliz codificaci\u00f3n!

"},{"location":"blog/desde-el-desarrollo-hasta-tus-manos-detr%C3%A1s-de-escena/#openterface_android-y-openterface_webextension","title":"Openterface_Android y Openterface_WebExtension","text":"

Hemos completado la prueba de concepto tanto para Android como para WebExtension. Aunque estas son prioridades m\u00e1s bajas en comparaci\u00f3n con macOS, Windows y Linux, tengan la seguridad de que est\u00e1n en proceso. Seg\u00fan nuestra investigaci\u00f3n preliminar, el proyecto Openterface_Android tambi\u00e9n podr\u00eda soportar ChromeOS. Si tienen alguna idea, \u00a1\u00fananse a la discusi\u00f3n!

"},{"location":"blog/desde-el-desarrollo-hasta-tus-manos-detr%C3%A1s-de-escena/#incluso-para-ipados","title":"\u00bfIncluso para iPadOS?","text":"

Tambi\u00e9n estamos explorando la compatibilidad con los sistemas m\u00f3viles de Apple, como iPadOS. Debido a los estrictos controles de Apple, es posible que estas plataformas no soporten conexiones por cable con dispositivos de terceros. Sin embargo, estamos investigando posibles soluciones, especialmente para iPads con chips de la serie M. Nuestro compa\u00f1ero beta Seb ya ha hecho algunos hallazgos interesantes y esto vale la pena explorar m\u00e1s a fondo, aunque a\u00fan no hay nada confirmado. Si tienen alguna idea o sugerencia, \u00fananse a nuestra comunidad y discutamos.

"},{"location":"blog/desde-el-desarrollo-hasta-tus-manos-detr%C3%A1s-de-escena/#openterface_mini-kvm_hardware","title":"Openterface_Mini-KVM_Hardware","text":"

Comenzaremos a liberar los detalles del hardware de manera incremental durante las pr\u00f3ximas dos o tres semanas. Adem\u00e1s, para mantener un alto est\u00e1ndar de c\u00f3digo abierto, planeamos adherirnos a los requisitos de certificaci\u00f3n de la Asociaci\u00f3n de Hardware de C\u00f3digo Abierto (OSHWA).

Mientras tanto, pueden aprender m\u00e1s sobre nuestro hardware aqu\u00ed: hoja de datos y C\u00f3mo Funciona por ahora. Esta p\u00e1gina explica nuestra integraci\u00f3n de captura USB-HDMI, con el chip CH9329 para el control de teclado y rat\u00f3n. Los entusiastas t\u00e9cnicos pueden encontrar los detalles sobre este chip particularmente interesantes. Adem\u00e1s, nuestro mini-KVM utiliza el chip CH340, que soporta dos hubs USB integrados tanto para el lado anfitri\u00f3n como para el lado objetivo. Nuestro mini-KVM es comparable a muchas tarjetas de captura de video actualmente en el mercado.

"},{"location":"blog/desde-el-desarrollo-hasta-tus-manos-detr%C3%A1s-de-escena/#por-favor-tengan-paciencia","title":"\u00a1Por favor, tengan paciencia!","text":"

Estamos trabajando arduamente aqu\u00ed y en el proceso de liberar tanto nuestro software como hardware como c\u00f3digo abierto. \u00a1Las cosas buenas toman tiempo en cocinarse! Los mantendremos actualizados sobre este progreso dentro de nuestra comunidad. \u00a1Gracias por su paciencia y comprensi\u00f3n! \u00a1Mant\u00e9nganse atentos y saludos!

"},{"location":"blog/desde-el-desarrollo-hasta-tus-manos-detr%C3%A1s-de-escena/#abordando-preocupaciones","title":"Abordando Preocupaciones","text":"

Entendemos que algunas personas pueden ser esc\u00e9pticas, dado el n\u00famero de proyectos de crowdfunding fraudulentos que existen. Aqu\u00ed hay algunos puntos que podr\u00edan tranquilizarlos sobre nuestro proyecto de crowdfunding:

  1. Conf\u00eden en la Plataforma Crowd Supply: Esta es una de las principales plataformas de crowdfunding para productos electr\u00f3nicos en los EE. UU. desde 2012. El equipo de Crowd Supply ha estado supervisando de cerca nuestro progreso de desarrollo del Openterface Mini-KVM y ofreci\u00e9ndonos asesoramiento profesional para asegurarse de que lo que hemos estado creando sea justo para ustedes. \u00a1Un agradecimiento al equipo de Crowd Supply tambi\u00e9n! Adem\u00e1s, pueden leer m\u00e1s sobre c\u00f3mo se protegen sus derechos como patrocinadores en la plataforma Crowd Supply, incluyendo para nuestro proyecto: Gu\u00eda de Crowd Supply: \u00bfC\u00f3mo est\u00e1n protegidos los patrocinadores? > \"Cada proyecto que ha recibido fondos a trav\u00e9s de Crowd Supply ha entregado a sus patrocinadores (o est\u00e1 en camino de hacerlo). No est\u00e1n financiando el sue\u00f1o de alguien; en Crowd Supply, est\u00e1n comprando un producto real.\"

  2. Conf\u00eden en la Experiencia de Nuestro Equipo: Somos un grupo de desarrolladores vers\u00e1tiles, creadores h\u00e1biles y gerentes de proyectos y producci\u00f3n experimentados, especialmente en trabajos que involucran una combinaci\u00f3n de desarrollo de hardware y software. Somos un estudio creativo tecnol\u00f3gico innovador con m\u00e1s de seis a\u00f1os de experiencia en proyectos tecnol\u00f3gicos avanzados en campos como IoT, IA, computaci\u00f3n en el borde y arte tecnol\u00f3gico. Para saber m\u00e1s sobre nosotros, visiten nuestro sitio web TechxArtisan Studio.

  3. Conf\u00eden en la Cultura de Nuestro Equipo: Nuestro equipo est\u00e1 dedicado no solo a la excelencia t\u00e9cnica, sino tambi\u00e9n a la experiencia general del usuario. Esto incluye todo, desde la documentaci\u00f3n del usuario y del desarrollador hasta la est\u00e9tica del dise\u00f1o. Nos apasiona la tecnolog\u00eda de vanguardia y frecuentemente participamos en discusiones animadas sobre nuevos avances desde diversas perspectivas. Estos debates nos ayudan a definir qu\u00e9 hace que un producto electr\u00f3nico sea sobresaliente y c\u00f3mo darle vida a trav\u00e9s de nuestro trabajo en equipo. Este enfoque colaborativo asegura que nuestros productos mejoren la experiencia del usuario y demuestren nuestra dedicaci\u00f3n a la calidad y el detalle. Adem\u00e1s, abrazamos una cultura de c\u00f3digo abierto y colaboraci\u00f3n comunitaria.

  4. Observen lo que Hemos Logrado y Estamos Haciendo: Hemos estado trabajando muy duro en este proyecto. Pueden unirse a nuestra comunidad en Reddit y Discord, ver lo que hemos estado creando desde el prototipo muy temprano hasta la versi\u00f3n actual de preproducci\u00f3n, y mantenerse informados sobre nuestro progreso actualizado. \u00a1Nos encantar\u00eda verlos en nuestra comunidad y que interact\u00faen con nosotros!

  5. Chateen con Nosotros Directamente: Si tienen alguna pregunta o inquietud sobre nuestro Mini-KVM, no duden en enviarme un correo electr\u00f3nico a info@techxartisan.com. Adem\u00e1s, estamos planeando una transmisi\u00f3n en vivo, presentada por David Groom de MAKE: Magazine el mi\u00e9rcoles 29. Estaremos discutiendo nuestro Openterface Mini-KVM y la historia detr\u00e1s de \u00e9l. Publicar\u00e9 el video m\u00e1s tarde en nuestra p\u00e1gina de la comunidad.

Finalmente, entendemos totalmente si a\u00fan tienen dudas. \u00a1Est\u00e1 bien! Si su trabajo implica gestionar dispositivos sin cabeza, estamos seguros de que nuestros esfuerzos en la creaci\u00f3n del Openterface Mini-KVM eventualmente los convencer\u00e1n. \u00a1Esperen y ver\u00e1n! \ud83d\ude04

"},{"location":"blog/desde-el-desarrollo-hasta-tus-manos-detr%C3%A1s-de-escena/#que-sigue","title":"\u00bfQu\u00e9 Sigue?","text":"

Mant\u00e9nganse atentos para la actualizaci\u00f3n de la pr\u00f3xima semana, donde profundizaremos en m\u00e1s detalles sobre las funciones de nuestra aplicaci\u00f3n anfitriona, su hoja de ruta, el progreso de producci\u00f3n, casos de uso reales compartidos por nuestro equipo beta y m\u00e1s. Mientras tanto, visiten nuestro sitio web Openterface y Preguntas Frecuentes, consideren apoyarnos en Crowd Supply y ayuden a difundir la palabra.

\u00a1Gracias por leer y ser parte de este viaje con nosotros! \u00a1Paz!

Mejores deseos,

Billy Wang, Gerente de Proyecto

Equipo Openterface | TechxArtisan Studio

"},{"location":"blog/charla-casual-con-david-groom-de-make-magazine-la-historia-del-openterface-mini-kvm/","title":"Charla Casual con David Groom de MAKE: Magazine: La Historia del Openterface Mini-KVM","text":"

\u00a1Hola a todos!

Acabamos de terminar una incre\u00edble transmisi\u00f3n en vivo en YouTube con David Groom de MAKE: Magazine. Durante la sesi\u00f3n, profundizamos en la historia detr\u00e1s de nuestro Openterface Mini-KVM, una innovadora soluci\u00f3n de hardware de c\u00f3digo abierto dise\u00f1ada para controlar f\u00e1cilmente dispositivos sin pantalla y computadoras de placa \u00fanica como las Raspberry Pi, usando solo tu laptop. Puedes ver la transmisi\u00f3n en YouTube para m\u00e1s detalles o simplemente leer la historia a continuaci\u00f3n.

"},{"location":"blog/charla-casual-con-david-groom-de-make-magazine-la-historia-del-openterface-mini-kvm/#el-nacimiento-de-una-idea","title":"El Nacimiento de una Idea","text":"

El viaje del Mini-KVM comenz\u00f3 en la bulliciosa ciudad de Guangzhou, China, dentro de nuestro estudio TechxArtisan. Durante los \u00faltimos cinco a\u00f1os, hemos estado profundamente involucrados en numerosos proyectos de arte tecnol\u00f3gico para artistas locales e internacionales. Nuestro trabajo incluye la construcci\u00f3n de instalaciones de iluminaci\u00f3n interactivas con detecci\u00f3n de IA, brazos rob\u00f3ticos para actuaciones teatrales, mini autos aut\u00f3nomos que resuelven laberintos aleatorios e incluso un perro robot dise\u00f1ado para explorar tierras inh\u00f3spitas como desiertos y bosques.

"},{"location":"blog/charla-casual-con-david-groom-de-make-magazine-la-historia-del-openterface-mini-kvm/#un-dolor-de-cabeza-comun","title":"Un Dolor de Cabeza Com\u00fan","text":"

Un desaf\u00edo recurrente en nuestro trabajo era gestionar una gran cantidad de computadoras sin pantalla como las Raspberry Pi y Jetson Nano, que carec\u00edan de monitores, teclados o conectividad de red. Esto a menudo nos llevaba a buscar fren\u00e9ticamente monitores y teclados de repuesto para solucionar problemas y acceder a estos dispositivos en condiciones dif\u00edciles.

"},{"location":"blog/charla-casual-con-david-groom-de-make-magazine-la-historia-del-openterface-mini-kvm/#soluciones-improvisadas","title":"Soluciones Improvisadas","text":"

Inicialmente, recurrimos a soluciones improvisadas de monitores port\u00e1tiles alimentados por bater\u00edas y mini-teclados inal\u00e1mbricos con touchpads. Sin embargo, estos a menudo se olvidaban o se extraviaban, lo que nos llev\u00f3 a la necesidad de una soluci\u00f3n de hardware dedicada que pudiera aprovechar las laptops que siempre llev\u00e1bamos para programar y configurar.

Estos dos gadgets deben llevarse para proyectos en el sitio.

"},{"location":"blog/charla-casual-con-david-groom-de-make-magazine-la-historia-del-openterface-mini-kvm/#el-primer-prototipo","title":"El Primer Prototipo","text":"

Nuestro primer prototipo DIY fue una combinaci\u00f3n simple pero efectiva de una tarjeta de captura para recuperar video del dispositivo sin pantalla y un simulador de teclado/rat\u00f3n USB, todo integrado en un solo cable USB que se conectaba a nuestras laptops.

Una de las primeras versiones del PCB del mini-KVM

Mostramos nuestros geniales proyectos de arte tecnol\u00f3gico en la Maker Faire de Shenzhen en noviembre de 2023, con la intenci\u00f3n de mostrar el prototipo del mini-KVM a David. Sin embargo, \u00a1nos emocionamos tanto con los regalos de David que lo olvidamos!

\u00a1Las pegatinas y postales de MAKE: Magazine son realmente geniales!

"},{"location":"blog/charla-casual-con-david-groom-de-make-magazine-la-historia-del-openterface-mini-kvm/#retroalimentacion-y-desarrollo-de-la-comunidad","title":"Retroalimentaci\u00f3n y Desarrollo de la Comunidad","text":"

Despu\u00e9s de compartir nuestro prototipo en Reddit, recibimos comentarios invaluables de la comunidad, que nos animaron a refinar y desarrollar nuestra soluci\u00f3n en un producto pulido. Este apoyo comunitario fue fundamental para transformar nuestro dispositivo improvisado en una herramienta elegante y eficiente para homelabbers, administradores de sistemas, entusiastas de la tecnolog\u00eda y cualquier persona que trabaje con computadoras sin pantalla.

Recibimos una gran cantidad de comentarios de homelabbers

"},{"location":"blog/charla-casual-con-david-groom-de-make-magazine-la-historia-del-openterface-mini-kvm/#superando-dudas","title":"Superando Dudas","text":"

A pesar de las dudas iniciales sobre competir con soluciones similares existentes, la respuesta positiva y las sugerencias constructivas de las comunidades en l\u00ednea ayudaron a aclarar los posibles casos de uso y aumentaron nuestra confianza. Sin este apoyo y la afirmaci\u00f3n de nuestros esfuerzos, es posible que no hubi\u00e9ramos seguido adelante con el proyecto.

"},{"location":"blog/charla-casual-con-david-groom-de-make-magazine-la-historia-del-openterface-mini-kvm/#crowdfunding-y-planes-futuros","title":"Crowdfunding y Planes Futuros","text":"

La campa\u00f1a de crowdfunding para el Openterface Mini-KVM en Crowd Supply est\u00e1 ganando mucho impulso, con aproximadamente dos semanas restantes. Esta campa\u00f1a no se trata solo de desarrollar el Mini-KVM; es un testimonio del poder de la innovaci\u00f3n impulsada por la comunidad. A continuaci\u00f3n, nos sumergiremos en la gesti\u00f3n de la producci\u00f3n, mejoras de software y la entrega de este pr\u00e1ctico gadget a nuestros incre\u00edbles patrocinadores, todo impulsado por nuestra asombrosa comunidad de c\u00f3digo abierto.

Los beta testers est\u00e1n compartiendo su uso del Openterface Mini-KVM en sus tareas tecnol\u00f3gicas diarias en el Discord de TechxArtisan

"},{"location":"blog/charla-casual-con-david-groom-de-make-magazine-la-historia-del-openterface-mini-kvm/#abrazando-la-vision-de-codigo-abierto","title":"Abrazando la Visi\u00f3n de C\u00f3digo Abierto","text":"

El Openterface Mini-KVM es un testimonio de nuestra creatividad y perseverancia, y de la comunidad de c\u00f3digo abierto que nos apoya. Lo que comenz\u00f3 como una soluci\u00f3n simple para nuestros desaf\u00edos personales ha evolucionado en una herramienta vers\u00e1til y de c\u00f3digo abierto que beneficiar\u00e1 a hackers, experimentadores y entusiastas de la tecnolog\u00eda en todo el mundo. Mantente atento a m\u00e1s actualizaciones a medida que el Mini-KVM se acerca a su lanzamiento oficial.

"},{"location":"blog/actualizaciones-%C3%A9picas-y-%C3%BAltima-semana--%C3%BAltima-oportunidad-para-apoyar-el-mini-kvm/","title":"\u00a1Actualizaciones \u00c9picas y \u00daltima Semana \u2013 \u00daltima Oportunidad para Apoyar el Mini-KVM!","text":"

\u00a1Hola a todos!

\u00a1El tiempo vuela cuando te diviertes! Estamos en la \u00faltima semana de nuestra campa\u00f1a de crowdfunding para el Openterface Mini-KVM en Crowd Supply. \u00a1Vamos a sumergirnos en algunas actualizaciones emocionantes!

"},{"location":"blog/actualizaciones-%C3%A9picas-y-%C3%BAltima-semana--%C3%BAltima-oportunidad-para-apoyar-el-mini-kvm/#actualizaciones-de-software","title":"Actualizaciones de Software","text":"

\u00a1Tenemos noticias fant\u00e1sticas para ustedes: nuestro mini-KVM ahora es compatible con macOS, Windows y Linux! \u00a1Y lo mejor de todo, es de c\u00f3digo abierto!

\ud83c\udf89 Echa un vistazo a los detalles para cada sistema a continuaci\u00f3n:

"},{"location":"blog/actualizaciones-%C3%A9picas-y-%C3%BAltima-semana--%C3%BAltima-oportunidad-para-apoyar-el-mini-kvm/#openterface_macos","title":"Openterface_MacOS","text":"
  • Repositorio en GitHub: Openterface_QT
  • Video de Demostraci\u00f3n Beta Temprana: Mini-KVM: Pruebas B\u00e1sicas de Control KVM
  • C\u00f3mo Instalar:
    • App Store: Encuentra nuestra aplicaci\u00f3n host buscando \"Openterface\" o \"Mini-KVM\".
    • Compilar desde el C\u00f3digo Fuente: Instala CodeX y compila la aplicaci\u00f3n macOS desde el c\u00f3digo fuente.
"},{"location":"blog/actualizaciones-%C3%A9picas-y-%C3%BAltima-semana--%C3%BAltima-oportunidad-para-apoyar-el-mini-kvm/#openterface_qt","title":"Openterface_QT","text":"
  • Repositorio en GitHub: Openterface_QT
  • Demostraciones Beta Tempranas:
    • Windows: Mini-KVM: Video de Demostraci\u00f3n Beta para Windows
    • Linux: Mini-KVM: Video de Demostraci\u00f3n Beta para Linux
  • C\u00f3mo Instalar:
    • Descarga la aplicaci\u00f3n de Windows desde nuestra versi\u00f3n en GitHub aqu\u00ed.
    • Compila desde el c\u00f3digo fuente tanto para Windows como para Linux siguiendo nuestras instrucciones.
    • Desaf\u00edo Raspberry Pi: Estamos trabajando arduamente para que nuestra aplicaci\u00f3n host funcione sin problemas en Raspberry Pi. \u00a1Pronto lo lograremos!
"},{"location":"blog/actualizaciones-%C3%A9picas-y-%C3%BAltima-semana--%C3%BAltima-oportunidad-para-apoyar-el-mini-kvm/#otras-aplicaciones","title":"Otras Aplicaciones","text":"
  • Como mencionamos en nuestra actualizaci\u00f3n anterior, hemos completado pruebas de concepto para Android y WebExtension. Aunque son prioridades m\u00e1s bajas, definitivamente est\u00e1n en la lista. Tambi\u00e9n estamos explorando el soporte para ChromeOS y la posibilidad de hacer que el mini-KVM funcione en iPads con chips de la serie M. \u00a1\u00danete a la discusi\u00f3n en nuestra comunidad si tienes alguna idea!
"},{"location":"blog/actualizaciones-%C3%A9picas-y-%C3%BAltima-semana--%C3%BAltima-oportunidad-para-apoyar-el-mini-kvm/#hardware-de-codigo-abierto-ahora","title":"\u00a1Hardware de C\u00f3digo Abierto AHORA!","text":"

\u00a1Hemos dado una gran actualizaci\u00f3n a nuestro repositorio de hardware! Ahora est\u00e1 lleno de hojas de datos, modelos 3D, lista de materiales y esquemas \u2013 todo lo que necesitas para ponerte manos a la obra con nuestro gadget.

Consulta el repositorio de hardware: Openterface_Mini-KVM_Hardware

Ya seas un profesional experimentado o est\u00e9s comenzando, queremos tus comentarios y sugerencias creativas. \u00a1Y para los creadores, por qu\u00e9 no intentar construir nuestro mini-KVM desde cero? Modifica nuestro c\u00f3digo, hazlo tuyo y mu\u00e9stranos lo que tienes!

"},{"location":"blog/actualizaciones-%C3%A9picas-y-%C3%BAltima-semana--%C3%BAltima-oportunidad-para-apoyar-el-mini-kvm/#accesorios-aun-mejores","title":"Accesorios A\u00fan Mejores","text":""},{"location":"blog/actualizaciones-%C3%A9picas-y-%C3%BAltima-semana--%C3%BAltima-oportunidad-para-apoyar-el-mini-kvm/#nuevo-cable-tipo-c-naranja-de-15m-con-convertidor","title":"NUEVO Cable Tipo-C Naranja de 1.5m con Convertidor","text":"

\u00bfRecuerdas nuestro elegante cable Tipo-C naranja con la agradable sensaci\u00f3n de silicona? \u00a1Hemos recibido las primeras muestras y se ven incre\u00edbles! Estos cables soportan carga r\u00e1pida de 240W (Voltaje DC50V, Corriente 5A, Potencia 240W) y funcionan perfectamente con nuestros mini-KVMs. \u00a1Un gran agradecimiento a nuestro fabricante y a nuestros patrocinadores por hacer esto posible!

"},{"location":"blog/actualizaciones-%C3%A9picas-y-%C3%BAltima-semana--%C3%BAltima-oportunidad-para-apoyar-el-mini-kvm/#bolsa-de-herramientas-mejorada","title":"Bolsa de Herramientas Mejorada","text":"

Con el nuevo adaptador adjunto para nuestro cable Tipo-C de 1.5m y la actualizaci\u00f3n del cable VGA a HDMI de 1m de largo, creemos que es necesario aumentar el tama\u00f1o de nuestra bolsa de herramientas a 16 cm L x 10 cm A x 3.8 cm H, \u00a1proporcionando un poco m\u00e1s de espacio!

"},{"location":"blog/actualizaciones-%C3%A9picas-y-%C3%BAltima-semana--%C3%BAltima-oportunidad-para-apoyar-el-mini-kvm/#experimentos-de-empaque","title":"Experimentos de Empaque","text":"

Estamos experimentando con diferentes dise\u00f1os para nuestras cajas de empaque exterior: coloridas, grises, negras y m\u00e1s. Nos inclinamos por el dise\u00f1o colorido, \u00a1pero queremos tus comentarios!

Consulta los detalles de nuestro kit beta enviado a nuestro equipo beta aqu\u00ed. \u00a1D\u00e9janos saber lo que piensas! Solo un aviso, este dise\u00f1o de empaque no es final. Es posible que a\u00fan necesitemos ajustar el tama\u00f1o de la caja y agregar detalles esenciales como la marca CE y otra informaci\u00f3n requerida.

"},{"location":"blog/actualizaciones-%C3%A9picas-y-%C3%BAltima-semana--%C3%BAltima-oportunidad-para-apoyar-el-mini-kvm/#ultima-oportunidad-para-apoyarnos","title":"\u00a1\u00daltima Oportunidad para Apoyarnos!","text":"

Esta es la \u00faltima semana de nuestra campa\u00f1a. Ap\u00f3yanos ahora para obtener el Openterface Mini-KVM a un precio amigable para tu bolsillo. Los precios despu\u00e9s de la campa\u00f1a probablemente aumentar\u00e1n a medida que el producto madure. No te lo pierdas, \u00a1act\u00faa ahora!

"},{"location":"blog/actualizaciones-%C3%A9picas-y-%C3%BAltima-semana--%C3%BAltima-oportunidad-para-apoyar-el-mini-kvm/#abordando-preocupaciones","title":"Abordando Preocupaciones","text":"

Entendemos el escepticismo debido a proyectos de crowdfunding fraudulentos. Aqu\u00ed est\u00e1 por qu\u00e9 puedes confiar en nosotros:

Conf\u00eda en Crowd Supply: Desde 2012, Crowd Supply ha sido una plataforma l\u00edder para productos electr\u00f3nicos, protegiendo tus derechos como patrocinador, supervisando de cerca nuestro desarrollo y brind\u00e1ndonos asesoramiento profesional para asegurarse de que lo que creamos sea perfecto para ti.

Conf\u00eda en Nuestro Equipo: Tenemos m\u00e1s de seis a\u00f1os de experiencia en IoT, IA y arte tecnol\u00f3gico. Conoce m\u00e1s sobre nosotros en nuestro sitio web TechxArtisan Studio.

Conf\u00eda en Nuestra Cultura: Nos enfocamos en la excelencia t\u00e9cnica y la experiencia del usuario, abrazando la colaboraci\u00f3n de c\u00f3digo abierto. \u00danete a nuestra comunidad en Reddit r/Openterface_miniKVM y Discord TechxArtisan para ver nuestro viaje desde los primeros prototipos hasta la versi\u00f3n actual de preproducci\u00f3n.

Si a\u00fan no est\u00e1s seguro, \u00a1est\u00e1 bien! Creemos que nuestro Openterface Mini-KVM te convencer\u00e1 eventualmente.

"},{"location":"blog/actualizaciones-%C3%A9picas-y-%C3%BAltima-semana--%C3%BAltima-oportunidad-para-apoyar-el-mini-kvm/#mas-por-venir","title":"M\u00e1s por Venir","text":"

Siempre estamos cocinando algo emocionante, \u00a1as\u00ed que por favor mantente atento! Si tienes alguna pregunta, \u00fanete a nosotros en nuestra comunidad o env\u00edanos un correo electr\u00f3nico: info@techxartisan.com. \u00a1Mantente al tanto y gracias por tu apoyo! \ud83d\ude04

Saludos,

Equipo Openterface | TechxArtisan Studio

"},{"location":"blog/%C3%BAltimas-horas-para-apoyar-y-mini-kvms-en-la-vanguardia-tecnol%C3%B3gica/","title":"\u00daltimas Horas para Apoyar y Mini-KVMs en la Vanguardia Tecnol\u00f3gica","text":"

\u00a1Hola a todos!

Quer\u00edamos compartir algunas actualizaciones emocionantes de nuestro equipo beta en nuestro canal de Discord! Nuestro Mini-KVM de Openterface est\u00e1 funcionando de maravilla en la vanguardia tecnol\u00f3gica, y tenemos unas im\u00e1genes fant\u00e1sticas para mostrarles. \u00a1\u00c9chenles un vistazo y vean de qu\u00e9 se trata todo el alboroto!

"},{"location":"blog/%C3%BAltimas-horas-para-apoyar-y-mini-kvms-en-la-vanguardia-tecnol%C3%B3gica/#ultima-oportunidad","title":"\ud83d\udea8 \u00a1\u00daltima Oportunidad! \ud83d\udea8","text":"

\u00a1El tiempo se acaba! No pierdas la oportunidad de apoyarnos en Crowd Supply y conseguir el Mini-KVM de Openterface a un precio s\u00faper accesible de $79 - $99. La campa\u00f1a termina el 13 de junio de 2024 a las 4:59 PM PDT, y los precios aumentar\u00e1n despu\u00e9s de la campa\u00f1a a medida que el producto madure. \u00a1As\u00ed que act\u00faa ahora y aprovecha esta oferta!

"},{"location":"blog/%C3%BAltimas-horas-para-apoyar-y-mini-kvms-en-la-vanguardia-tecnol%C3%B3gica/#proximo-evento-teardown-2024-y-una-apuesta-divertida","title":"Pr\u00f3ximo Evento Teardown 2024 y Una Apuesta Divertida","text":"

Como muchos de ustedes han visto en la p\u00e1gina principal de Crowd Supply, el pr\u00f3ximo evento Teardown 2024 est\u00e1 generando mucha emoci\u00f3n. \u00a1Estoy ansioso por asistir en persona y conocer a nuestros incre\u00edbles patrocinadores all\u00ed!

Aqu\u00ed hay una apuesta divertida que tenemos en nuestro equipo:

Actualmente, tenemos alrededor de 950 patrocinadores para nuestro proyecto. Kevin Peng, nuestro director t\u00e9cnico, y yo tenemos una apuesta. Si logramos conseguir 100 patrocinadores m\u00e1s en las \u00faltimas horas, los gastos de mi viaje a Portland ser\u00e1n cubiertos por nuestro estudio. Si no, tendr\u00e9 que pagar yo mismo, lo que significa unos cuantos miles de d\u00f3lares de mi propio bolsillo.

As\u00ed que, hago un llamado a todos nuestros suscriptores y nuevos amigos del Mini-KVM de Openterface para que nos ayuden a superar estas \u00faltimas horas. \u00a1Vamos a alcanzar m\u00e1s de 1050 patrocinadores y hacer que este viaje suceda!

Lo m\u00e1s importante, por favor ayuden a correr la voz sobre nuestra campa\u00f1a que est\u00e1 llegando a su fin. Estamos comprometidos a construir este dispositivo \u00fatil y asegurarnos de que se entregue a ustedes con la mejor calidad.

Hemos puesto todo nuestro coraz\u00f3n en este proyecto durante los \u00faltimos 8 meses. Pueden ver todos nuestros esfuerzos en las actualizaciones a continuaci\u00f3n y revisar nuestras publicaciones hist\u00f3ricas en nuestro subreddit r/Openterface_miniKVM:

  • \u00a1La Campa\u00f1a de Crowdfunding del Mini-KVM de Openterface Ya Est\u00e1 en Vivo! 30 de abril de 2024

  • Preguntas Frecuentes 11 de mayo de 2024

  • Nuestro Cable VGA a HDMI Ya Est\u00e1 Disponible para Patrocinadores Europeos (\u00a1y Mide un Metro Completo!) 16 de mayo de 2024

  • Del Desarrollo a Tus Manos: Detr\u00e1s de Escenas 28 de mayo de 2024

  • Charla Casual con David Groom de MAKE: Magazine: La Historia del Mini-KVM de Openterface \ud83c\udf99\ufe0f 31 de mayo de 2024

  • Actualizaciones \u00c9picas y \u00daltima Semana - \u00a1\u00daltima Oportunidad para Apoyar el Mini-KVM! 8 de junio de 2024

\u00a1As\u00ed que ap\u00f3yanos en estas \u00faltimas horas! \u00a1Saludos!

Billy Wang Gerente de Proyecto Equipo Openterface

"},{"location":"blog/encu%C3%A9ntrame-en-portland-este-fin-de-semana-y-gana-un-mini-kvm-con-mi-desaf%C3%ADo-de-videojuegos/","title":"\u00a1Encu\u00e9ntrame en Portland este fin de semana y gana un Mini-KVM con mi desaf\u00edo de videojuegos!","text":"

\u00a1Hola a todos! \u00a1Tenemos noticias fant\u00e1sticas para compartir!

"},{"location":"blog/encu%C3%A9ntrame-en-portland-este-fin-de-semana-y-gana-un-mini-kvm-con-mi-desaf%C3%ADo-de-videojuegos/#muchas-gracias","title":"\u00a1Muchas gracias!","text":"

Primero que todo, no puedo agradecerles lo suficiente por su incre\u00edble apoyo. Nuestra campa\u00f1a de crowdfunding ha superado absolutamente sus metas el 14 de junio, alcanzando $248k con el incre\u00edble apoyo de m\u00e1s de 1110 patrocinadores y Crowd Supply.

\u00a1Este \u00e9xito nos ha dado la oportunidad de mejorar a\u00fan m\u00e1s el Mini-KVM! No podr\u00edamos haberlo logrado sin ustedes\u2014\u00a1en serio, gracias desde el fondo de nuestros corazones! \ud83e\udde1 Estaremos trabajando a toda m\u00e1quina en la producci\u00f3n para asegurar la entrega en sus manos pronto.

"},{"location":"blog/encu%C3%A9ntrame-en-portland-este-fin-de-semana-y-gana-un-mini-kvm-con-mi-desaf%C3%ADo-de-videojuegos/#apuesta-divertida-y-mi-vuelo-a-portland","title":"\u00a1Apuesta divertida y mi vuelo a Portland!","text":"

As\u00ed que, aqu\u00ed va una historia divertida: Como mencion\u00e9 en esta publicaci\u00f3n, Kevin y yo hicimos una apuesta. Si consegu\u00edamos 100 nuevos patrocinadores en las \u00faltimas 36 horas, yo volar\u00eda a EE.UU. para Teardown 2024 de Crowd Supply. Bueno, \u00bfadivinen qu\u00e9? No solo alcanzamos los 100\u2014\u00a1conseguimos 165 nuevos patrocinadores! As\u00ed que, estoy s\u00faper emocionado de anunciar que asistir\u00e9 a Teardown 2024 en persona este viernes (21 de junio) y el fin de semana.

"},{"location":"blog/encu%C3%A9ntrame-en-portland-este-fin-de-semana-y-gana-un-mini-kvm-con-mi-desaf%C3%ADo-de-videojuegos/#mi-mesa-de-demostracion-y-transmision-en-vivo","title":"Mi mesa de demostraci\u00f3n y transmisi\u00f3n en vivo","text":"

Teardown es el evento anual insignia de Crowd Supply centrado en todo lo relacionado con el hardware - con charlas, demostraciones, talleres y m\u00e1s.

Teardown 2024 Lloyd Center Mall Portland, Oregon 21-23 de junio de 2024

Tendr\u00e9 una mesa de demostraci\u00f3n en el evento Teardown: \u00a1\u00c9chale un vistazo aqu\u00ed!

\u00bfHay alguna posibilidad de que est\u00e9s cerca del \u00e1rea de Portland? \u00a1Ser\u00eda fant\u00e1stico conocerte en el evento! Compra el boleto para Teardown ahora y espero verte all\u00ed\u2014\u00a1ven y saluda!

Si no puedes asistir al evento, no te preocupes. Siempre puedes encontrarme en nuestro Discord y Subreddit durante la conferencia. Puedes enviarme mensajes o hablar conmigo en tiempo real, ya que podr\u00eda estar transmitiendo en vivo los tres d\u00edas mientras estoy en la mesa de demostraci\u00f3n, as\u00ed que \u00fanete a nuestra comunidad ahora y no te perder\u00e1s de nada.

"},{"location":"blog/encu%C3%A9ntrame-en-portland-este-fin-de-semana-y-gana-un-mini-kvm-con-mi-desaf%C3%ADo-de-videojuegos/#desafio-de-videojuegos-en-teardown","title":"Desaf\u00edo de videojuegos en Teardown","text":"

Ahora, para un poco de diversi\u00f3n: Estoy organizando una competencia de videojuegos en Teardown 2024. Estar\u00e9 demostrando c\u00f3mo funciona nuestro Mini-KVM con la computadora port\u00e1til, uConsole, que b\u00e1sicamente es una Raspberry Pi. Mira mi tweet en X aqu\u00ed para ver c\u00f3mo lo configurar\u00e9 con el Mini-KVM.

Estoy pensando en usar juegos como Pac-Man, The King of Fighters '97 y Tetris para el desaf\u00edo de videojuegos. Y aqu\u00ed est\u00e1 lo mejor\u2014\u00a1los ganadores pueden llevarse un Mini-KVM de mi parte all\u00ed mismo! As\u00ed que, \u00a1ven y juega conmigo para ganar!

"},{"location":"blog/encu%C3%A9ntrame-en-portland-este-fin-de-semana-y-gana-un-mini-kvm-con-mi-desaf%C3%ADo-de-videojuegos/#mas-por-venir","title":"M\u00e1s por venir","text":"

Como siempre, estamos cocinando cosas emocionantes, y tendr\u00e9 un anuncio s\u00faper emocionante en Teardown. As\u00ed que mantente atento para m\u00e1s actualizaciones. \u00a1No puedo esperar para verte en Teardown 2024!

Saludos, Billy Wang Equipo Openterface | TechxArtisan Studio

"},{"location":"blog/de-desmontaje-a-producci%C3%B3n-estamos-avanzando/","title":"De Desmontaje a Producci\u00f3n: \u00a1Estamos Avanzando!","text":"

Hola a todos,

Ha pasado un tiempo desde que termin\u00f3 nuestra campa\u00f1a de crowdfunding, y tenemos algunas actualizaciones fant\u00e1sticas para compartir con ustedes. Estamos emocionados de sumergirnos de lleno en la fase de producci\u00f3n de nuestro Openterface Mini-KVM y mantenerlos informados sobre nuestro progreso.

"},{"location":"blog/de-desmontaje-a-producci%C3%B3n-estamos-avanzando/#lo-mejor-de-teardown-2024","title":"Lo Mejor de Teardown 2024","text":"

Primero que nada, el Teardown 2024 del mes pasado, organizado por Crowd Supply en Portland, fue simplemente incre\u00edble. \u00a1Fue fant\u00e1stico conocer en persona a tantos de nuestros amigos y patrocinadores tecnol\u00f3gicos en nuestra mesa de demostraci\u00f3n! Sus amables palabras son un gran aliento y motivaci\u00f3n para nosotros. Aqu\u00ed hay algunas fotos del evento:

\u00a1Un gran agradecimiento a Electromaker por presentar nuestro producto durante el evento! Echen un vistazo a nuestra charla en este video:

"},{"location":"blog/de-desmontaje-a-producci%C3%B3n-estamos-avanzando/#produccion-en-pleno-movimiento","title":"Producci\u00f3n en Pleno Movimiento","text":"

En este momento, estamos ocupados ordenando piezas y chips como el CH9329 y CH340 mientras nos preparamos para la producci\u00f3n. Tambi\u00e9n estamos enviando nuestro Mini-KVM y cables para pruebas de certificaci\u00f3n CE, RoHS y UKCA. Si todo va bien, comenzaremos la producci\u00f3n en las f\u00e1bricas pronto. Nuestro equipo se asegura de que cada paso de la l\u00ednea de producci\u00f3n funcione sin problemas para entregar un producto de primera calidad que sea tanto divertido como confiable. Aqu\u00ed hay algunas fotos de los informes de prueba para RoHS y CE de nuestro cable naranja Type-C:

Mant\u00e9nganse atentos, ya que tendremos m\u00e1s informes similares para nuestros Mini-KVMs y otros cables para asegurar que todos cumplan con los est\u00e1ndares de certificaci\u00f3n requeridos.

"},{"location":"blog/de-desmontaje-a-producci%C3%B3n-estamos-avanzando/#certificacion-oshwa","title":"Certificaci\u00f3n OSHWA","text":"

Estamos encantados de anunciar que nuestro Openterface Mini-KVM ahora est\u00e1 oficialmente certificado por OSHWA como completamente de c\u00f3digo abierto. \ud83e\udd73 Pueden ver nuestra certificaci\u00f3n aqu\u00ed: OSHWA UID CN000015. Nos comprometemos a mantener tanto el software como el hardware de c\u00f3digo abierto, permitiendo a los amantes de la tecnolog\u00eda explorar el potencial del USB KVM, contribuir a su desarrollo y construir una comunidad vibrante juntos.

"},{"location":"blog/de-desmontaje-a-producci%C3%B3n-estamos-avanzando/#actualizacion-de-hardware-v19","title":"Actualizaci\u00f3n de Hardware V1.9","text":"

Acabamos de lanzar el hardware V1.9 con pines adicionales: VCC, GND, Target D+, Target D-, Host D+, Host D- para a\u00fan m\u00e1s diversi\u00f3n hackeable. Estos pines de datos est\u00e1n conectados al hub USB del Target y del Host. Ahora pueden hacer extensiones DIY para Openterface, como ATX, puente de red, bypass de audio y m\u00e1s. \u00bfQu\u00e9 ideas creativas tienen para hackear nuestro Mini-KVM con estos pines? \u00dananse a nuestro Reddit o Discord, compartan sus pensamientos y divi\u00e9rtanse programando con nosotros.

"},{"location":"blog/de-desmontaje-a-producci%C3%B3n-estamos-avanzando/#ejecuta-openterface-en-pi-y-unete-con-uconsole","title":"Ejecuta Openterface en Pi y \u00danete con uConsole","text":"

\u00a1Hemos logrado ejecutar nuestra aplicaci\u00f3n host QT en un entorno Pi! Lo que es a\u00fan m\u00e1s emocionante es c\u00f3mo nuestro Mini-KVM puede unirse con el uConsole de Clockwork para convertirlo en una herramienta KVM port\u00e1til. Es s\u00faper \u00fatil para plug-and-play y solucionar r\u00e1pidamente cualquier dispositivo sin cabeza cercano.

"},{"location":"blog/de-desmontaje-a-producci%C3%B3n-estamos-avanzando/#desarrollo-y-toques-finales","title":"Desarrollo y Toques Finales","text":"

Nuestro equipo de desarrollo, liderado por Kevin, est\u00e1 trabajando incansablemente para probar y refinar el c\u00f3digo. \u00dananse a nuestro Discord de Techxartisan para pasar el rato con nuestro equipo de desarrollo y beta y mantenerse actualizados sobre nuestro progreso. Mientras tanto, Billy est\u00e1 manejando todo el papeleo y finalizando el dise\u00f1o de nuestro producto, empaque y manual del producto.

Aqu\u00ed tienen un adelanto de nuestras impresiones y etiquetas actualizadas para la caja de aluminio, mostradas en el tweet de Kazubu cuando Billy se lo comparti\u00f3 en Tokio, Jap\u00f3n:

"},{"location":"blog/de-desmontaje-a-producci%C3%B3n-estamos-avanzando/#en-camino-para-septiembre","title":"En Camino para Septiembre","text":"

Actualmente estamos en el buen camino y trabajando arduamente para poner nuestros Mini-KVMs en sus manos para finales de septiembre.

Nos encantar\u00eda su ayuda para correr la voz sobre nuestro Mini-KVM. Esperamos que pueda beneficiar a m\u00e1s entusiastas de la tecnolog\u00eda y hacer la vida tecnol\u00f3gica m\u00e1s f\u00e1cil para cualquiera que maneje dispositivos sin cabeza.

\u00a1Muchas gracias por todo su apoyo y entusiasmo! \u00a1No podr\u00edamos haberlo hecho sin ustedes!

Saludos, Billy Wang Equipo Openterface

"},{"location":"blog/superando-obst%C3%A1culos-actualizaci%C3%B3n-de-progreso-y-nueva-l%C3%ADnea-de-tiempo/","title":"Superando Obst\u00e1culos: Actualizaci\u00f3n de Progreso y Nueva L\u00ednea de Tiempo","text":"

Hola a todos,

Espero que est\u00e9n bien. Ha pasado un tiempo desde nuestra \u00faltima actualizaci\u00f3n. Me gustar\u00eda decir que todo ha ido sobre ruedas para Openterface, pero hemos encontrado algunos obst\u00e1culos que retrasar\u00e1n nuestro cronograma de entrega. Aunque no era lo que esper\u00e1bamos, estamos enfrentando estos desaf\u00edos de frente y avanzando con paso firme, con muchas buenas noticias para compartir. Esta publicaci\u00f3n es una lectura de aproximadamente 7 minutos, as\u00ed que vamos a los detalles para que sepan exactamente en qu\u00e9 punto estamos y qu\u00e9 viene a continuaci\u00f3n.

"},{"location":"blog/superando-obst%C3%A1culos-actualizaci%C3%B3n-de-progreso-y-nueva-l%C3%ADnea-de-tiempo/#regulacion-produccion-y-calidad","title":"Regulaci\u00f3n, Producci\u00f3n y Calidad","text":"

Antes de comenzar la producci\u00f3n, tuvimos que pasar las pruebas de calidad necesarias seg\u00fan las regulaciones, en particular la certificaci\u00f3n CE. Dado que nuestra versi\u00f3n del kit incluye no solo el Mini-KVM sino tambi\u00e9n varios accesorios, cada parte necesitaba pasar las pruebas CE. Estas pruebas tomaron m\u00e1s tiempo del esperado (resulta que los cables pueden ser bastante exigentes), pero la buena noticia es que hemos pasado la certificaci\u00f3n CE para nuestro Mini-KVM y todos sus componentes! A continuaci\u00f3n, un resumen de las certificaciones para todas nuestras partes: Mini-KVM, cable HDMI, cable naranja Tipo-C, cable corto negro Tipo-C y cable VGA2HDMI. Con la certificaci\u00f3n en mano, nuestro cronograma de producci\u00f3n ahora es seguro, y nuestros fabricantes est\u00e1n produciendo todas las partes mientras hablo.

Los requisitos de UKCA y CE son los mismos para nuestros productos electr\u00f3nicos, con CE tambi\u00e9n cubriendo el cumplimiento de RoHS.

Hace dos semanas, visitamos a uno de nuestros fabricantes para capacitar a sus gerentes de l\u00ednea en el control de calidad de los cables naranjas antes de que nos los enviaran. Ahora, TODOS los cables naranjas han sido producidos y est\u00e1n en un rinc\u00f3n de nuestro estudio. Kevin y Shawn explicaban los m\u00e9todos de prueba para asegurar que el cable naranja funcione correctamente con nuestro Mini-KVM de Openterface.

Haremos la misma tarea esta semana para capacitar al equipo de control de calidad en la l\u00ednea de producci\u00f3n para las otras partes tambi\u00e9n. Aqu\u00ed hay muestras de cables adicionales. Marcados con orgullo con nuestro logo TechxArtisan, estas son muestras del cable HDMI, el cable corto Tipo-C y el cable VGA a HDMI.

Esperamos que las otras partes y los Mini-KVMs lleguen pronto de nuestros fabricantes, momento en el cual revisaremos la calidad de cada componente y los empaquetaremos adecuadamente en nuestro estudio antes del env\u00edo. En otras palabras, nuestro equipo se asegurar\u00e1 personalmente de la calidad antes de que llegue a sus manos.

"},{"location":"blog/superando-obst%C3%A1culos-actualizaci%C3%B3n-de-progreso-y-nueva-l%C3%ADnea-de-tiempo/#envio-posibles-retrasos-y-nueva-eta","title":"Env\u00edo, Posibles Retrasos y Nueva ETA","text":"

La incertidumbre actual radica en el proceso de env\u00edo. Despu\u00e9s de investigar varias compa\u00f1\u00edas de env\u00edo, descubrimos que el env\u00edo tomar\u00e1 m\u00e1s tiempo ya que probablemente transferiremos los paquetes a trav\u00e9s de un almac\u00e9n antes de llegar al almac\u00e9n de Crowd Supply. Todav\u00eda estamos debatiendo si elegir transporte mar\u00edtimo o a\u00e9reo\u2014por favor, tengan paciencia con nosotros unos d\u00edas m\u00e1s mientras resolvemos los arreglos.

El despacho de aduanas es otro posible obst\u00e1culo que podr\u00eda causar retrasos inesperados. Una vez que nuestros productos lleguen al almac\u00e9n de Crowd Supply en los EE. UU., tomar\u00e1n de una a dos semanas para enviarse globalmente seg\u00fan cada pedido. Para los patrocinadores fuera de los EE. UU., los paquetes individuales a\u00fan necesitar\u00e1n pasar por el env\u00edo global y el despacho de aduanas en el pa\u00eds de destino.

Teniendo en cuenta la situaci\u00f3n actual y a\u00f1adiendo algo de tiempo de reserva, sigo siendo cautelosamente optimista de que completaremos la entrega antes de fin de a\u00f1o, con una nueva ETA a mediados de enero. Lamento sinceramente los inconvenientes y agradezco su apoyo y paciencia durante este cambio.

"},{"location":"blog/superando-obst%C3%A1culos-actualizaci%C3%B3n-de-progreso-y-nueva-l%C3%ADnea-de-tiempo/#hardware-finalizado-v19","title":"Hardware Finalizado V1.9","text":"

Como saben por nuestra anterior publicaci\u00f3n en Reddit, decidimos actualizar nuestro hardware a V1.9, incluyendo un conjunto de pines de expansi\u00f3n hackeables. Esto no formaba parte del plan original para la campa\u00f1a de crowdfunding, pero creemos que mejora significativamente el potencial de uso m\u00e1s amplio del hardware.

Los pines VCC, GND, Target D+, Target D-, Host D+ y Host D-\u2014donde 'D' significa datos USB.

Una motivaci\u00f3n clave fue permitir que el interruptor USB se pueda activar a nivel de software. \u00bfPor qu\u00e9 es esto importante? En nuestra hoja de ruta, apuntamos a soportar una soluci\u00f3n KVM-over-IP, como VNC, en el futuro. La idea es combinar el control local de KVM con el protocolo VNC, permitiendo a los usuarios controlar remotamente la computadora objetivo a trav\u00e9s de la computadora anfitriona. En un escenario remoto como este, la capacidad de los usuarios para cambiar el puerto USB es esencial, especialmente cuando se requieren transferencias de archivos entre el anfitri\u00f3n y el objetivo.

Los pines de expansi\u00f3n tambi\u00e9n abren posibilidades para m\u00e1s, como la integraci\u00f3n con iPadOS, control ATX, puenteo de red y bypass de audio. Aunque no entrar\u00e9 en todos los detalles aqu\u00ed, les animo a unirse a nuestra comunidad de Openterface para discutir m\u00e1s con nosotros.

Esta actualizaci\u00f3n de hardware podr\u00eda extender potencialmente nuestra soluci\u00f3n Openterface para operar sobre IP e incluir caracter\u00edsticas m\u00e1s avanzadas, manteniendo su fortaleza principal como una herramienta KVM-over-USB plug-and-play\u2014perfecta para profesionales de TI navegando en entornos de TI inciertos, como centros de datos desconocidos.

Me complace informar que V1.9 ha pasado nuestras pruebas b\u00e1sicas internas y se finalizar\u00e1 como la versi\u00f3n oficial para todos nuestros patrocinadores. Sin embargo, esta actualizaci\u00f3n de hardware requerir\u00e1 m\u00e1s pruebas, y cualquier desarrollo basado en estos pines de expansi\u00f3n ser\u00e1 experimental y probablemente tenga errores. Aqu\u00ed es donde pueden contribuir. Contamos con la comunidad de c\u00f3digo abierto para ayudarnos a mejorar Openterface juntos.

"},{"location":"blog/superando-obst%C3%A1culos-actualizaci%C3%B3n-de-progreso-y-nueva-l%C3%ADnea-de-tiempo/#mas-actualizaciones-de-software","title":"M\u00e1s Actualizaciones de Software","text":"

En el frente del software, estamos haciendo avances emocionantes. \u00a1Estamos sumergi\u00e9ndonos en la aplicaci\u00f3n Openterface para Android ahora! Echen un vistazo a este tweet para una demostraci\u00f3n temprana que muestra el control KVM suave, el movimiento del rat\u00f3n y los clics en acci\u00f3n. M\u00e1s caracter\u00edsticas est\u00e1n en camino, y como siempre, una vez que hayamos pulido un poco m\u00e1s el c\u00f3digo, esta aplicaci\u00f3n tambi\u00e9n ser\u00e1 de c\u00f3digo abierto en nuestro repositorio de GitHub Openterface_Android. Usando solo nuestros dedos para controlar un ordenador Linux desde una tableta Android. \u00a1Genial!

Nuestra versi\u00f3n QT acaba de recibir una actualizaci\u00f3n \u00fatil\u2014\u00a1ahora pueden transferir texto del anfitri\u00f3n al objetivo! As\u00ed que ahora esta caracter\u00edstica es compatible con las aplicaciones anfitrionas en macOS, Windows y Linux.

Adem\u00e1s, tambi\u00e9n estamos planeando agregar una funci\u00f3n divertida\u2014un movimiento autom\u00e1tico del rat\u00f3n para evitar que su computadora objetivo se duerma. \u00bfDeber\u00edamos optar por la pelota de ping-pong rebotando por la pantalla o el cl\u00e1sico efecto de salvapantallas de DVD? Voten y comenten en el tweet \ud83d\ude03

"},{"location":"blog/superando-obst%C3%A1culos-actualizaci%C3%B3n-de-progreso-y-nueva-l%C3%ADnea-de-tiempo/#diseno-de-paquete-etiquetado-y-manual","title":"Dise\u00f1o de Paquete, Etiquetado y Manual","text":"

Hemos estado experimentando con varios prototipos y dise\u00f1os de empaques para encontrar el equilibrio perfecto entre varios factores clave:

  • Seleccionar materiales lo suficientemente resistentes para proteger el producto y sus partes durante el env\u00edo,
  • Crear etiquetas informativas que ayuden a los usuarios a entender el producto de un vistazo,
  • Asegurar el cumplimiento de las regulaciones,
  • Hacer que el empaque sea visualmente atractivo,
  • Y ser ecol\u00f3gicos minimizando el uso de pl\u00e1stico siempre que sea posible.

Adem\u00e1s, hemos realizado varias mejoras en la antigua bolsa del kit, incluyendo:

  • Mayor espacio de almacenamiento,
  • Una cremallera naranja elegante,
  • Materiales exteriores e interiores mejorados,
  • Y un bolsillo de malla s\u00faper el\u00e1stico.

Elegimos este material porque logra el equilibrio ideal entre ser econ\u00f3mico, agradable al tacto y lo suficientemente duradero para proteger los art\u00edculos en su interior. Estamos seguros de que les encantar\u00e1.

Tambi\u00e9n estamos actualizando las etiquetas en la carcasa de aluminio para hacerlas lo m\u00e1s informativas y visualmente atractivas posible. Esperamos que estas mejoras mejoren su experiencia de usuario y faciliten el inicio con Openterface.

Estamos finalizando el manual de Openterface, que estar\u00e1 disponible en ingl\u00e9s, alem\u00e1n, franc\u00e9s, japon\u00e9s y chino. Disculpen si no incluimos su idioma\u2014\u00a1nuestra caja no es del tama\u00f1o de la TARDIS (la cabina de polic\u00eda del Doctor Who)! Pero haremos nuestro mejor esfuerzo para agregar m\u00e1s traducciones en nuestro sitio web.

"},{"location":"blog/superando-obst%C3%A1culos-actualizaci%C3%B3n-de-progreso-y-nueva-l%C3%ADnea-de-tiempo/#revision-de-idiomas-por-la-comunidad","title":"Revisi\u00f3n de Idiomas por la Comunidad","text":"

He estado usando ChatGPT para ayudar con las traducciones, pero a veces puede fallar con la redacci\u00f3n y el fraseo. Si no es mucha molestia, agradecer\u00eda enormemente cualquier ayuda para revisar el contenido en otros idiomas, especialmente para los materiales impresos que estamos a punto de finalizar. He actualizado todo el contenido de texto para el empaque en nuestra carpeta de GitHub product-printed-materials, donde pueden revisar y enviar cualquier mejora. Tambi\u00e9n pueden enviarme un mensaje directo. \u00a1Gracias!

"},{"location":"blog/superando-obst%C3%A1culos-actualizaci%C3%B3n-de-progreso-y-nueva-l%C3%ADnea-de-tiempo/#comentarios-finales-y-progreso-continuo","title":"Comentarios Finales y Progreso Continuo","text":"

Nos disculpamos nuevamente por los retrasos y el cambio en la ETA de nuestro producto. \u00a1Gracias por su paciencia y por seguir con nosotros\u2014estamos trabajando duro para entregarlo lo antes posible! Les actualizar\u00e9 inmediatamente una vez que nuestro env\u00edo est\u00e9 arreglado. M\u00e1s actualizaciones est\u00e1n en camino, as\u00ed que por favor \u00fananse a nuestra comunidad de Openterface y mant\u00e9nganse atentos.

Saludos,

Billy Wang Gerente de Producto Equipo Openterface | TechxArtisan

"},{"location":"blog/te-animas-a-un-desaf%C3%ADo-diy-acomp%C3%A1%C3%B1anos-en-el-show--tell-de-oshwa/","title":"\u00bfTe animas a un desaf\u00edo DIY? \u00a1Acomp\u00e1\u00f1anos en el Show & Tell de OSHWA!","text":"

Hola a todos, estar\u00e9 presentando el Desaf\u00edo DIY de USB KVM 2024 durante el Show & Tell de OSHWA a las 10:40 PM EST el 2 de octubre. \u00a1Si te interesa, no olvides unirte! \u00a1Gracias!

"},{"location":"blog/desaf%C3%ADo-diy-premios-geniales-y-la-producci%C3%B3n-se-acerca-a-la-l%C3%ADnea-de-meta/","title":"\u00a1Desaf\u00edo DIY, Premios Geniales y la Producci\u00f3n se Acerca a la L\u00ednea de Meta!","text":"

\u00a1Hola, entusiastas de Openterface!

\u00a1Tenemos noticias emocionantes para compartir! Desde un nuevo y emocionante desaf\u00edo DIY hasta hitos de producci\u00f3n y actualizaciones de software geniales, las cosas est\u00e1n en pleno apogeo aqu\u00ed en Openterface. \u00a1Toma una bebida, ponte c\u00f3modo y sum\u00e9rgete en esta actualizaci\u00f3n con nosotros!

"},{"location":"blog/desaf%C3%ADo-diy-premios-geniales-y-la-producci%C3%B3n-se-acerca-a-la-l%C3%ADnea-de-meta/#desafio-diy-usb-kvm-2024-es-hora-de-desatar-tu-mago-tecnologico-interior","title":"Desaf\u00edo DIY USB KVM 2024: \u00a1Es Hora de Desatar tu Mago Tecnol\u00f3gico Interior!","text":"

\u00a1Atenci\u00f3n a todos los aficionados, creadores y so\u00f1adores! Estamos encantados de presentar el Desaf\u00edo DIY USB KVM 2024, una colaboraci\u00f3n con TechxArtisan, Make: Magazine, la Asociaci\u00f3n de Hardware de C\u00f3digo Abierto (OSHWA) y Crowd Supply. Esta es tu oportunidad de crear una soluci\u00f3n KVM personalizada\u2014\u00a1veamos qu\u00e9 magia puedes hacer con tu Openterface Mini-KVM!

"},{"location":"blog/desaf%C3%ADo-diy-premios-geniales-y-la-producci%C3%B3n-se-acerca-a-la-l%C3%ADnea-de-meta/#aqui-esta-el-resumen","title":"Aqu\u00ed est\u00e1 el resumen:","text":"

Misi\u00f3n: Crea tu propia soluci\u00f3n KVM abierta usando el Openterface Mini-KVM, con tu toque personal para satisfacer tus necesidades espec\u00edficas.

Categor\u00edas: Premios para los mejores participantes incluyen galardones tanto por habilidad t\u00e9cnica como por creatividad, \u00a1as\u00ed que todos tienen una oportunidad!

Premios Geniales:

  • Un Openterface Mini-KVM de edici\u00f3n limitada con una carcasa transparente y plateada.
  • El futurista Pi-Cast KVM de HackerGadgets.
  • El retro-inspirado GameShell de Clockwork.

Cronograma: El desaf\u00edo comienza el 1 de octubre de 2024 y las presentaciones cierran el 28 de febrero de 2025.

Jueces: Expertos de TechxArtisan, Make: Magazine, OSHWA y Crowd Supply evaluar\u00e1n tus proyectos.

Ya seas un mago tecnol\u00f3gico experimentado o est\u00e9s dando tus primeros pasos en el mundo de la pirater\u00eda de hardware, este concurso es tu patio de recreo. \u00bfQui\u00e9n sabe? \u00a1Podr\u00edas crear la pr\u00f3xima gran cosa en tecnolog\u00eda!

\u00danete a la acci\u00f3n en la p\u00e1gina oficial del concurso de Crowd Supply y chatea con nosotros en el canal de Discord del concurso. \u00a1Que comiencen los juegos de innovaci\u00f3n!

Openterface Mini-KVM disponible en tres carcasas geniales: transparente, plateada y negra

Algunos de los premios geniales: Pi-Cast KVM de HackerGadgets y GameShell de Clockwork

"},{"location":"blog/desaf%C3%ADo-diy-premios-geniales-y-la-producci%C3%B3n-se-acerca-a-la-l%C3%ADnea-de-meta/#actualizacion-de-produccion-casi-listo","title":"Actualizaci\u00f3n de Producci\u00f3n: \u00a1Casi Listo!","text":"

Aqu\u00ed tienes un vistazo al arduo trabajo que se realiza tras bambalinas\u2014\u00a1nuestro estudio ha estado zumbando como una colmena! Hasta ahora, hemos ensamblado 800 unidades del Openterface Mini-KVM.

Nuestro control de calidad es de primera categor\u00eda. Cada unidad es revisada, revisada nuevamente y mimada por nuestro equipo para asegurarnos de que cuando llegue a tus manos, no solo sea buena, \u00a1sino excelente! Apuntamos a la clase de calidad que hace que otros dispositivos se pongan verdes de envidia.

Sabemos que esperar puede ser dif\u00edcil, pero estamos comprometidos a ofrecer la mejor experiencia posible. \u00a1Gracias por tu paciencia mientras ponemos los toques finales!

"},{"location":"blog/desaf%C3%ADo-diy-premios-geniales-y-la-producci%C3%B3n-se-acerca-a-la-l%C3%ADnea-de-meta/#actualizacion-de-software-la-aplicacion-de-android-recibe-una-gran-mejora","title":"Actualizaci\u00f3n de Software: \u00a1La Aplicaci\u00f3n de Android Recibe una Gran Mejora!","text":"

Nuestra aplicaci\u00f3n de Android acaba de recibir una gran actualizaci\u00f3n. \u00a1Ahora controlar tus dispositivos objetivo a trav\u00e9s de tu tel\u00e9fono o tableta nunca ha sido tan f\u00e1cil o divertido!

Mira el video de demostraci\u00f3n aqu\u00ed: Video de Demostraci\u00f3n de la Aplicaci\u00f3n de Android

"},{"location":"blog/desaf%C3%ADo-diy-premios-geniales-y-la-producci%C3%B3n-se-acerca-a-la-l%C3%ADnea-de-meta/#aqui-esta-lo-nuevo","title":"Aqu\u00ed est\u00e1 lo nuevo:","text":"
  • Controles t\u00e1ctiles suaves y receptivos
  • Funcionalidad de arrastrar y soltar f\u00e1cil
  • Toques precisos para una experiencia intuitiva
  • Una nueva barra de teclas de funci\u00f3n para mayor comodidad
  • Pr\u00f3xima funci\u00f3n: atajos de teclado personalizables
  • Compatible con tabletas y tel\u00e9fonos Android

Esta aplicaci\u00f3n hace que el Openterface Mini-KVM sea a\u00fan m\u00e1s \u00fatil para los profesionales de la tecnolog\u00eda en movimiento. \u00a1Tambi\u00e9n hemos subido el \u00faltimo APK y el c\u00f3digo fuente a nuestro repositorio de GitHub si quieres explorar m\u00e1s o contribuir!

"},{"location":"blog/desaf%C3%ADo-diy-premios-geniales-y-la-producci%C3%B3n-se-acerca-a-la-l%C3%ADnea-de-meta/#resumiendo","title":"Resumiendo","text":"

\u00a1Uf! Fue una actualizaci\u00f3n bastante grande, \u00bfverdad?

Si tienes alguna idea, comentario o sue\u00f1os salvajes de KVM, \u00a1queremos escucharlos! Env\u00edanos un mensaje directo, manda una paloma mensajera \ud83d\udd4a\ufe0f, o \u00fanete a uno de nuestros canales comunitarios. \u00a1Nos encanta conectarnos contigo!

Gracias nuevamente por tu paciencia y por ser la mejor comunidad tecnol\u00f3gica que existe. Tenemos m\u00e1s noticias y actualizaciones emocionantes pr\u00f3ximamente\u2014\u00a1mantente atento!

Con gratitud, Billy Wang Gerente de Producto Equipo Openterface | TechxArtisan

"},{"location":"blog/el-env%C3%ADo-est%C3%A1-en-camino-cables-adicionales-a%C3%B1adidos-al-toolkit-qu%C3%A9-sigue/","title":"\u00a1El env\u00edo est\u00e1 en camino! Cables adicionales a\u00f1adidos al Toolkit. \u00bfQu\u00e9 sigue?","text":"

\u00a1Hola, comunidad de Openterface!

Estamos emocionados de anunciar que nuestros productos Openterface han sido oficialmente enviados. \u00a1Actualmente est\u00e1n en el puerto de Shenzhen, listos para embarcarse en un carguero con destino a los EE. UU.!

Estas son las novedades:

"},{"location":"blog/el-env%C3%ADo-est%C3%A1-en-camino-cables-adicionales-a%C3%B1adidos-al-toolkit-qu%C3%A9-sigue/#preparativos-para-el-envio-controles-de-calidad-y-empaque","title":"Preparativos para el env\u00edo: controles de calidad y empaque","text":"

Antes de empacar y enviar, probamos cada unidad minuciosamente para garantizar la m\u00e1s alta calidad, como mencionamos en una actualizaci\u00f3n anterior: \u00a1Desaf\u00edo DIY, premios geniales y la producci\u00f3n se acerca a la meta!. Cada cable fue probado con nuestro Mini-KVM para garantizar la estabilidad en la transmisi\u00f3n de se\u00f1ales.

Ahora, hablemos de las noticias, tanto las malas como las buenas.

"},{"location":"blog/el-env%C3%ADo-est%C3%A1-en-camino-cables-adicionales-a%C3%B1adidos-al-toolkit-qu%C3%A9-sigue/#malas-noticias-algunos-cables-naranjas-no-cumplieron-con-las-expectativas-en-condiciones-dificiles","title":"Malas noticias: Algunos cables naranjas no cumplieron con las expectativas en condiciones dif\u00edciles","text":"

Nuestro Mini-KVM transmite video, audio, control de mouse/teclado y datos USB a trav\u00e9s de un solo cable tipo C. El rendimiento del cable es crucial para la estabilidad de los datos, especialmente en entornos desafiantes.

Para simular interferencias del mundo real, envolvimos el cable tipo C naranja alrededor del motor de un ventilador el\u00e9ctrico mientras varios ordenadores funcionaban cerca. Esto cre\u00f3 un alto nivel de interferencias electromagn\u00e9ticas (EMI) para evaluar la estabilidad en la transmisi\u00f3n de datos de nuestros cables.

Un m\u00e9todo econ\u00f3mico pero efectivo de prueba.

Mira nuestro tweet en video donde mostramos una de nuestras pruebas de rendimiento en comparaci\u00f3n.

En estas condiciones, algunos cables naranjas mostraron p\u00e9rdida de se\u00f1al, lo que gener\u00f3 preocupaciones sobre su fiabilidad en entornos complejos como centros de datos o durante operaciones cr\u00edticas de TI.

Para abordar este problema, Kevin Peng, nuestro director t\u00e9cnico, desarroll\u00f3 un programa de prueba personalizado. Esta herramienta, que te permitir\u00e1 probar la calidad de tus propios cables USB, estar\u00e1 disponible como c\u00f3digo abierto pronto. M\u00e1s actualizaciones est\u00e1n en camino.

Nuestro programa hace que probar cables sea muy f\u00e1cil.

Aunque nuestros cables naranjas, con su textura suave similar al silic\u00f3n y apariencia atractiva, son ideales para el uso diario como carga r\u00e1pida y transmisiones de datos regulares, no son adecuados para trabajos intensos de transmisi\u00f3n en condiciones adversas como alta EMI.

"},{"location":"blog/el-env%C3%ADo-est%C3%A1-en-camino-cables-adicionales-a%C3%B1adidos-al-toolkit-qu%C3%A9-sigue/#buenas-noticias-tenemos-una-solucion","title":"Buenas noticias: \u00a1Tenemos una soluci\u00f3n!","text":"

Hemos adquirido de inmediato cables USB 3.2 de nailon de alta calidad para incluirlos como un extra en la versi\u00f3n Toolkit, sin costo adicional para ti. Estos cables duraderos vienen en tres longitudes en color gris: 1 m (3,2 ft), 1,5 m (4,9 ft) y 2 m (6,5 ft). Recibir\u00e1s uno de estos cables de forma aleatoria en tu versi\u00f3n del Toolkit, garantizando una conexi\u00f3n robusta y confiable para tu Mini-KVM.

En futuras versiones del Mini-KVM Toolkit, el cable naranja para conectar al lado del host del Mini-KVM ser\u00e1 reemplazado por el cable tipo C 3.2 de nailon, combinando funcionalidad, estabilidad y estilo.

Esperamos que aprecies esta decisi\u00f3n y contin\u00faes confiando en Openterface durante momentos cr\u00edticos en la tecnolog\u00eda.

"},{"location":"blog/el-env%C3%ADo-est%C3%A1-en-camino-cables-adicionales-a%C3%B1adidos-al-toolkit-qu%C3%A9-sigue/#cronograma-de-envio","title":"Cronograma de env\u00edo","text":"

\u00bfCu\u00e1ndo puedes esperar tu Mini-KVM? Si todo transcurre sin problemas, nuestros productos deber\u00edan llegar al almac\u00e9n de Mouser de Crowd Supply para mediados de diciembre. Luego se enviar\u00e1n de acuerdo con cada pedido.

  • Para patrocinadores en EE. UU.: Existe una peque\u00f1a posibilidad de entrega antes de Navidad, pero no est\u00e1 garantizado, ya que todo tiende a ralentizarse a medida que se acercan las festividades.
  • Para patrocinadores fuera de EE. UU.: Los tiempos de entrega variar\u00e1n seg\u00fan la regi\u00f3n. Nuestra mejor estimaci\u00f3n es mediados de enero.

\u00a1Esperamos un viaje sin contratiempos para nuestros productos Openterface, sin mareos, n\u00e1useas ni jet lag! \ud83d\ude03

"},{"location":"blog/el-env%C3%ADo-est%C3%A1-en-camino-cables-adicionales-a%C3%B1adidos-al-toolkit-qu%C3%A9-sigue/#camisetas-y-sudaderas-geniales-de-openterface","title":"Camisetas y sudaderas geniales de Openterface","text":"

Estaremos en la Maker Faire de Shenzhen este fin de semana (16\u201317 de noviembre). Para prepararnos, dise\u00f1amos ropa para el equipo, incluyendo camisetas, sudaderas con cremallera y sudaderas tipo pullover.

Echa un vistazo y cu\u00e9ntanos qu\u00e9 opinas:

"},{"location":"blog/el-env%C3%ADo-est%C3%A1-en-camino-cables-adicionales-a%C3%B1adidos-al-toolkit-qu%C3%A9-sigue/#apoya-nuestro-desarrollo","title":"Apoya nuestro desarrollo","text":"

Si deseas apoyar a\u00fan m\u00e1s nuestro desarrollo de c\u00f3digo abierto, visita nuestra Tienda TechxArtisan. Puedes comprar cables, camisetas y sudaderas, mientras nos ayudas financieramente a seguir innovando. Cada compra cuenta y refuerza el esp\u00edritu de la comunidad de c\u00f3digo abierto.

"},{"location":"blog/el-env%C3%ADo-est%C3%A1-en-camino-cables-adicionales-a%C3%B1adidos-al-toolkit-qu%C3%A9-sigue/#proximos-pasos-actualizaciones-de-la-aplicacion-host","title":"Pr\u00f3ximos pasos: Actualizaciones de la aplicaci\u00f3n host","text":"

Ahora que el env\u00edo est\u00e1 en marcha, nuestro enfoque se centrar\u00e1 en mejorar nuestras aplicaciones host. Estamos trabajando para verificarlas en varias tiendas de aplicaciones y garantizar una experiencia fluida al comenzar con Openterface.

"},{"location":"blog/el-env%C3%ADo-est%C3%A1-en-camino-cables-adicionales-a%C3%B1adidos-al-toolkit-qu%C3%A9-sigue/#proximos-pasos-participa-en-nuestro-concurso-diy-de-usb","title":"Pr\u00f3ximos pasos: Participa en nuestro concurso DIY de USB","text":"

\u00bfPor qu\u00e9 no participar en nuestro USB KVM DIY Challenge 2024 una vez que tengas tu Mini-KVM Openterface en tus manos? Es una gran oportunidad para contribuir al desarrollo de c\u00f3digo abierto y ganar premios, incluidos dos Mini-KVM Openterface en ediciones especiales y m\u00e1s. Para m\u00e1s detalles, consulta la p\u00e1gina del concurso de Crowd Supply.

"},{"location":"blog/el-env%C3%ADo-est%C3%A1-en-camino-cables-adicionales-a%C3%B1adidos-al-toolkit-qu%C3%A9-sigue/#para-concluir","title":"Para concluir","text":"

Gracias por ser una parte integral de nuestro viaje. Tu apoyo y tus comentarios nos mantienen avanzando. Si tienes preguntas o ideas, \u00a1nos encantar\u00eda saber de ti! \u00danete a la conversaci\u00f3n en nuestra comunidad en Reddit y Discord.

Con gratitud, Billy Wang Gerente de Producto Equipo Openterface | TechxArtisan

"},{"location":"blog/50-off-en-todos-los-productos--solo-este-black-friday-apoya-el-software-libre/","title":"50% OFF en TODOS los productos \u2013 \u00a1Solo este Black Friday! Apoya el Software Libre.","text":"

Hola, queridos miembros de la comunidad Openterface,

\u00a1Tenemos noticias emocionantes! Hemos lanzado una nueva l\u00ednea de ropa en Openterface. Nuestra colecci\u00f3n incluye camisetas y sudaderas con capucha que reflejan el esp\u00edritu de nuestra comunidad. No son solo prendas de vestir; son una celebraci\u00f3n de nuestros valores compartidos y de la esencia de Openterface.

\u00bfQu\u00e9 hace que estos dise\u00f1os sean a\u00fan m\u00e1s especiales? Tanto la camiseta como la sudadera con capucha presentan con orgullo el dibujo t\u00e9cnico de nuestro Mini-KVM de Openterface, que luce incre\u00edblemente genial. Adem\u00e1s, hemos destacado el texto \"Developer Mode\" de nuestro Mini-KVM en el dise\u00f1o, \u00a1una idea que creemos absolutamente brillante! Al ponerte nuestra camiseta o sudadera, no solo te mantendr\u00e1s abrigado este invierno, sino que tambi\u00e9n entrar\u00e1s en modo s\u00faper desarrollador para todas tus sesiones de programaci\u00f3n y hacking.

\u00bfTe preguntas c\u00f3mo lucen en la vida real? Mira c\u00f3mo los ha estado usando nuestro equipo en acci\u00f3n. Desde mantenerse c\u00f3modos en modo desarrollador mientras programan (ver tweet), hasta una divertida sesi\u00f3n de fotos con David Groom de la revista MAKE: en la Feria Maker de Shenzhen (ver foto), hemos estado mostrando orgullosamente nuestra ropa. Incluso nos inspiramos en una charla del legendario Eric Migicovsky, famoso por Pebble (ver publicaci\u00f3n), mientras hac\u00edamos una demostraci\u00f3n del Mini-KVM de Openterface y conect\u00e1ndonos con amigos del \u00e1mbito tecnol\u00f3gico (ver m\u00e1s, y aqu\u00ed). Estas prendas no son solo ropa; son iniciadores de conversaci\u00f3n y una forma de celebrar nuestra comunidad dondequiera que vayamos.

\u00a1David y yo no podemos tener suficiente de nuestras sudaderas con capucha, pr\u00e1cticamente vivimos en ellas!\ud83d\ude09 Un enorme agradecimiento a David por compartir una foto tan incre\u00edble\u2014\u00a1verdaderamente apreciada!\ud83c\udf89

\u00bfY por qu\u00e9 no darle a este invierno gris un toque de color con nuestro vibrante cable de datos naranja? Es una manera perfecta de iluminar tu espacio de trabajo mientras aseguras una transferencia de datos r\u00e1pida y confiable.

Para endulzar la oferta, estamos ofreciendo un \ud83d\udd25 DESCUENTO ESPECIAL DEL 50% \ud83d\udd25 en todos los art\u00edculos durante los pr\u00f3ximos cinco d\u00edas de este Black Friday 2024, comenzando desde el momento en que leas este mensaje hasta el 1 de diciembre. Es nuestra forma de agradecerte por ser parte de nuestro viaje.

Explora nuestra tienda aqu\u00ed: https://shop.techxartisan.com. Echa un vistazo a nuestra nueva l\u00ednea de ropa y consigue una prenda a mitad de precio\u2014\u00a1no te pierdas esta oferta por tiempo limitado!

"},{"location":"blog/50-off-en-todos-los-productos--solo-este-black-friday-apoya-el-software-libre/#productos-de-openterface","title":"Productos de Openterface","text":""},{"location":"blog/50-off-en-todos-los-productos--solo-este-black-friday-apoya-el-software-libre/#accesorios-de-openterface","title":"Accesorios de Openterface","text":"

Gracias por acompa\u00f1arnos en esta aventura. Tu apoyo significa el mundo para nosotros, y estamos agradecidos por cada conversaci\u00f3n, idea e interacci\u00f3n que hemos tenido.

Saludos c\u00e1lidos,

Billy Wang Gerente de Producto Equipo Openterface | TechxArtisan

P.D. \u00bfTienes alguna idea o comentario? \u00a1Estamos atentos! \u00danete a la conversaci\u00f3n en Reddit o Discord, o m\u00e1ndanos un correo electr\u00f3nico a info@techxartisan.com \u2709\ufe0f.

"},{"location":"blog/feliz-navidad-y-pr%C3%B3spero-a%C3%B1o-nuevo-y-un-peque%C3%B1o-regalo-del-equipo-de-openterface/","title":"\u00a1Feliz Navidad y Pr\u00f3spero A\u00f1o Nuevo y Un Peque\u00f1o Regalo del Equipo de Openterface!","text":"

Hola,

\u00a1Esperamos que este correo electr\u00f3nico te encuentre bien mientras terminamos el a\u00f1o! Para celebrar el A\u00f1o Nuevo y mostrar nuestro agradecimiento por tu apoyo, tenemos algo especial para ti.

Pero primero, queremos tomarnos un momento para agradecer a todos los que han sido parte de nuestro viaje este a\u00f1o. Ya seas un desarrollador que nos ayud\u00f3 a dar vida a nuestras ideas, uno de nuestros beta testers que nos dio una valiosa retroalimentaci\u00f3n temprana, un seguidor que ofreci\u00f3 orientaci\u00f3n y \u00e1nimo, o uno de nuestros incre\u00edbles patrocinadores que crey\u00f3 en nosotros desde el principio\u2014has hecho este a\u00f1o inolvidable. No podr\u00edamos haberlo hecho sin ti.

Aqu\u00ed est\u00e1 el trato: Entre el 24 de diciembre de 2024 y el 10 de enero de 2025, si compras dos Mini-KVM Toolkits en Crowd Supply, te enviaremos un cr\u00e9dito de $20 para nuestra tienda TxA.

Es s\u00faper f\u00e1cil\u2014solo toma una captura de pantalla de tu confirmaci\u00f3n de pedido de Crowd Supply y env\u00edala por correo electr\u00f3nico a info@techxartisan.com. Verificaremos tu compra y te responderemos con tu c\u00f3digo de cr\u00e9dito de $20 para la tienda.

Tambi\u00e9n tenemos una sorpresa especial de vacaciones para ti. T\u00f3mate un momento para relajarte y disfrutar de nuestro acogedor video de Navidad\u2014echa un vistazo a las hermosas luces y escucha melod\u00edas navide\u00f1as relajantes. \u00a1Esperamos que traiga un poco de alegr\u00eda a tu d\u00eda!

Esta es nuestra forma de agradecer y comenzar el 2025 con un peque\u00f1o regalo de nosotros para ti.

Al reflexionar sobre el a\u00f1o pasado, estamos realmente agradecidos por el incre\u00edble apoyo de nuestra comunidad. Tu creencia en nuestra visi\u00f3n ha sido la fuerza impulsora detr\u00e1s de todo lo que hacemos. A nuestros desarrolladores que convirtieron ideas en realidad, a nuestros beta testers que ayudaron a refinar nuestro producto, y a nuestros primeros seguidores que proporcionaron retroalimentaci\u00f3n, \u00e1nimo y orientaci\u00f3n\u2014gracias por ser parte de nuestro viaje. Y a nuestros patrocinadores, tu confianza significa el mundo para nosotros, y estamos infinitamente agradecidos por tu papel en hacer todo esto posible.

\u00bfTienes preguntas? Solo escr\u00edbenos\u2014siempre estamos aqu\u00ed para ayudarte. Al dar la bienvenida al 2025, te deseamos a ti y a tus seres queridos un A\u00f1o Nuevo lleno de alegr\u00eda, felicidad, \u00e9xito y emocionantes nuevas aventuras.

Gracias por ser parte de nuestra historia. \u00a1Estamos emocionados de crear a\u00fan m\u00e1s cosas incre\u00edbles juntos en el a\u00f1o que viene!

Saludos cordiales, El Equipo de Openterface

"},{"location":"blog/category/updates/","title":"Updates","text":""},{"location":"blog/page/2/","title":"Blog","text":""},{"location":"blog/category/updates/page/2/","title":"Updates","text":""}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..4d1c678 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,171 @@ + + + + https://openterface.com/ + 2025-02-11 + + + https://openterface.com/accessories/ + 2025-02-11 + + + https://openterface.com/app/ + 2025-02-11 + + + https://openterface.com/basic/ + 2025-02-11 + + + https://openterface.com/comparison/ + 2025-02-11 + + + https://openterface.com/contact/ + 2025-02-11 + + + https://openterface.com/contributing/ + 2025-02-11 + + + https://openterface.com/faq/ + 2025-02-11 + + + https://openterface.com/features/ + 2025-02-11 + + + https://openterface.com/how-it-works/ + 2025-02-11 + + + https://openterface.com/how-to-connect/ + 2025-02-11 + + + https://openterface.com/open-hardware/ + 2025-02-11 + + + https://openterface.com/pin/ + 2025-02-11 + + + https://openterface.com/privacy-policy/ + 2025-02-11 + + + https://openterface.com/quick-start/ + 2025-02-11 + + + https://openterface.com/return-refunds-warranty/ + 2025-02-11 + + + https://openterface.com/roadmap/ + 2025-02-11 + + + https://openterface.com/specifications/ + 2025-02-11 + + + https://openterface.com/tags/ + 2025-02-11 + + + https://openterface.com/terms-of-service/ + 2025-02-11 + + + https://openterface.com/test/ + 2025-02-11 + + + https://openterface.com/usb-switch/ + 2025-02-11 + + + https://openterface.com/use-cases/ + 2025-02-11 + + + https://openterface.com/whats-in-the-box/ + 2025-02-11 + + + https://openterface.com/why-openterface/ + 2025-02-11 + + + https://openterface.com/blog/ + 2025-02-11 + + + https://openterface.com/blog/la-campa%C3%B1a-de-crowdfunding-para-el-openterface-mini-kvm-est%C3%A1-en-vivo-ahora/ + 2025-02-11 + + + https://openterface.com/blog/desde-el-desarrollo-hasta-tus-manos-detr%C3%A1s-de-escena/ + 2025-02-11 + + + https://openterface.com/blog/charla-casual-con-david-groom-de-make-magazine-la-historia-del-openterface-mini-kvm/ + 2025-02-11 + + + https://openterface.com/blog/actualizaciones-%C3%A9picas-y-%C3%BAltima-semana--%C3%BAltima-oportunidad-para-apoyar-el-mini-kvm/ + 2025-02-11 + + + https://openterface.com/blog/%C3%BAltimas-horas-para-apoyar-y-mini-kvms-en-la-vanguardia-tecnol%C3%B3gica/ + 2025-02-11 + + + https://openterface.com/blog/encu%C3%A9ntrame-en-portland-este-fin-de-semana-y-gana-un-mini-kvm-con-mi-desaf%C3%ADo-de-videojuegos/ + 2025-02-11 + + + https://openterface.com/blog/de-desmontaje-a-producci%C3%B3n-estamos-avanzando/ + 2025-02-11 + + + https://openterface.com/blog/superando-obst%C3%A1culos-actualizaci%C3%B3n-de-progreso-y-nueva-l%C3%ADnea-de-tiempo/ + 2025-02-11 + + + https://openterface.com/blog/te-animas-a-un-desaf%C3%ADo-diy-acomp%C3%A1%C3%B1anos-en-el-show--tell-de-oshwa/ + 2025-02-11 + + + https://openterface.com/blog/desaf%C3%ADo-diy-premios-geniales-y-la-producci%C3%B3n-se-acerca-a-la-l%C3%ADnea-de-meta/ + 2025-02-11 + + + https://openterface.com/blog/el-env%C3%ADo-est%C3%A1-en-camino-cables-adicionales-a%C3%B1adidos-al-toolkit-qu%C3%A9-sigue/ + 2025-02-11 + + + https://openterface.com/blog/50-off-en-todos-los-productos--solo-este-black-friday-apoya-el-software-libre/ + 2025-02-11 + + + https://openterface.com/blog/feliz-navidad-y-pr%C3%B3spero-a%C3%B1o-nuevo-y-un-peque%C3%B1o-regalo-del-equipo-de-openterface/ + 2025-02-11 + + + https://openterface.com/blog/category/updates/ + 2025-02-11 + + + https://openterface.com/blog/page/2/ + 2025-02-11 + + + https://openterface.com/blog/category/updates/page/2/ + 2025-02-11 + + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz new file mode 100644 index 0000000..1ec7e49 Binary files /dev/null and b/sitemap.xml.gz differ diff --git a/specifications/index.html b/specifications/index.html new file mode 100644 index 0000000..0ad6ab7 --- /dev/null +++ b/specifications/index.html @@ -0,0 +1,2130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Especificaciones - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + + +

Especificaciones

+

lig-front +lig-back +lig-front +lig-back

+

Información del Producto

+
    +
  • Nombre del Producto: Openterface Mini-KVM Basic / Toolkit
  • +
  • Nombre del Modelo: OP-MINIKVM-BASIC / OP-MINIKVM-TOOLKIT
  • +
+

Físico

+
    +
  • Dimensiones del Dispositivo (L x A x H): 61 x 53 x 13.5 mm / 2.40 x 2.09 x 0.53 pulgadas
  • +
  • Peso Neto del Dispositivo: Aproximadamente 48g
  • +
  • Material de la Carcasa: Aleación de aluminio, PLA
  • +
+

Compatibilidad

+
    +
  • Host: Windows, macOS, Linux, Android (con aplicación compatible)
  • +
  • Target: No requiere instalación de software
  • +
+

Video

+
    +
  • Entrada de Video Máxima: Hasta 3840x2160@30Hz vía HDMI
  • +
  • Salida de Video Máxima: Hasta 1920x1080@30Hz
  • +
  • Métodos de Compresión de Video: YUV, MJPEG
  • +
  • Soporte Adicional de Video: VGA, DVI, Micro HDMI (vía adaptador)
  • +
  • Latencia: Menos de 140 milisegundos
  • +
+

Audio

+
    +
  • Captura de Audio: Passthrough de audio embebido en HDMI
  • +
+

Energía

+
    +
  • Alimentado por USB-C. No se requiere fuente de alimentación externa.
  • +
+

Conectividad

+
    +
  • Transmisión USB: 12Mbps a velocidad completa
  • +
+

Características

+
    +
  • Emulación completa de teclado y ratón (absoluta y relativa)
  • +
  • Transferencia de texto
  • +
  • Soporte de teclas multimedia
  • +
  • Funcionalidad HID personalizada
  • +
  • Función de despertar la computadora
  • +
+

Ambiental

+
    +
  • Temperatura de Operación: 0°C a 40°C
  • +
  • Temperatura de Almacenamiento: -10°C a 50°C
  • +
  • Humedad: 80% HR
  • +
+ + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tags/index.html b/tags/index.html new file mode 100644 index 0000000..73c0861 --- /dev/null +++ b/tags/index.html @@ -0,0 +1,2079 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Etiquetas - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + + +

Etiquetas

+ + +

+ + +BIOS

+ + + + +

+ + +File Transfer

+ + + + +

+ + +Hardware KVM

+ + + + +

+ + +KVM

+ + + + +

+ + +KVM-over-IP

+ + + + +

+ + +KVM-over-USB

+ + + + +

+ + +Software KVM

+ + + + +

+ + +Switchable USB

+ + + + +

+ + +USBKVM

+ + + + +

+ + +VNC

+ + + + +

+ + +mini-KVM

+ + + + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/terms-of-service/index.html b/terms-of-service/index.html new file mode 100644 index 0000000..cc4adb7 --- /dev/null +++ b/terms-of-service/index.html @@ -0,0 +1,2226 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Términos de Servicio - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + + +

Terms of Service

+

Overview

+

This website is operated by Openterface, part of Guangzhou Billio Tech Co., Ltd. The terms "we", "us", and "our" refer to Openterface. This website, inclusive of all information, tools, and services available from it, is offered to you, the user, subject to your acceptance of all the terms, conditions, policies, and notices outlined here.

+

By accessing or using our website and/or purchasing from us, you engage in our "Service" and agree to be bound by these terms and conditions, referred to as "Terms of Service" or "Terms", which include additional terms, conditions, and policies available via hyperlink. These Terms apply to all site users, including but not limited to browsers, vendors, customers, merchants, and content contributors.

+

Please read these Terms of Service carefully before using our website. By accessing or using any part of the site, you consent to these Terms. If you do not agree with this agreement's terms and conditions, you should not access the website or use any services. If these Terms of Service are regarded as an offer, acceptance is expressly limited to these Terms.

+

New features or tools added to the current store will also fall under these Terms of Service. You can review the latest version of the Terms of Service on this page at any time. We may update, change, or replace parts of these Terms by posting updates and/or changes on our website. Regularly checking this page for changes is your responsibility. Continued use of or access to the website after changes implies acceptance of these changes.

+

By agreeing to these Terms of Service, you confirm that you are at least the age of majority in your state or province of residence. If you are the age of majority, you have also consented to allow your minor dependents to use this site. Our products must not be used for illegal or unauthorized purposes, nor should the Service be used to violate any laws in your jurisdiction, including copyright laws. It is prohibited to transmit harmful code such as worms, viruses, or destructive code. Any breach of these Terms will result in immediate termination of your services.

+

General Conditions

+

We reserve the right to refuse service to anyone at any time. Your content (excluding credit card information) might be transferred unencrypted and may undergo changes to meet technical requirements. Credit card information is always encrypted during transfer. Without our express written permission, you are not allowed to reproduce, duplicate, copy, sell, resell, or exploit any part of the Service or access to the Service. The headings in this agreement are for convenience only and will not limit or affect these Terms.

+

Accuracy, Completeness, and Timeliness of Information

+

We are not liable if the information on this site is inaccurate, incomplete, or not current. The material on this site is for general information and should not be the sole basis for decision-making. Any reliance on the site's material is at your own risk. The site may contain historical information for reference only. We may modify site contents at any time without obligation to update any information. Monitoring changes to our site is your responsibility.

+

Modifications to the Service and Prices

+

Product prices are subject to change without notice. We may modify or discontinue the Service without notice at any time. We are not liable for any Service modification, price change, suspension, or discontinuance.

+

Products or Services

+

Certain products or services may be available exclusively online. These may have limited quantities and are subject to our Return, Refund, and Warranty Policy. We have endeavored to display product colors and images accurately, but cannot guarantee accurate display on your monitor. We reserve the right to limit sales to any person, geographic region, or jurisdiction and to limit product quantities. Product descriptions and pricing are subject to change at any time without notice, at our discretion. We may discontinue any product at any time. Any product or service offers on this site are void where prohibited. We do not warrant that the quality of products, services, information, or other material purchased will meet your expectations, or that service errors will be corrected.

+

Accuracy of Billing and Account Information

+

We reserve the right to refuse any order. We may limit or cancel quantities purchased per person, household, or order. These restrictions can include orders by the same customer account, credit card, and/or orders using the same billing/shipping address. We may contact you via email, billing address, or phone number if we change or cancel an order. We reserve the right to limit or prohibit orders that appear to be placed by dealers, resellers, or distributors.

+

You agree to provide current, complete, and accurate purchase and account information for all purchases. You agree to update your account and other information, including your email address and credit card numbers and expiration dates, to complete your transactions and contact you as needed.

+

For more details, please review our Return, Refund, and Warranty Policy.

+

Optional Tools

+

We may provide access to third-party tools over which we have no control or input. Access to such tools is provided "as is" and "as available" without any warranties, representations, or conditions of any kind and without endorsement. We are not liable for your use of optional third-party tools. Use of these tools is at your own risk and discretion, and you should ensure you are familiar with and approve of the terms provided by the relevant third-party providers. New services and/or features, including new tools and resources, will also be subject to these Terms of Service.

+ +

Content, products, and services available via our Service may include third-party materials. Third-party links may direct you to websites not affiliated with us. We are not responsible for the content or accuracy of third-party websites and do not warrant and will not be liable for any third-party materials, websites, or other products or services. We are not liable for any harm or damages related to third-party goods, services, resources, content, or transactions. Review third-party policies and practices before engaging in transactions. Complaints, claims, concerns, or questions regarding third-party products should be directed to the third-party.

+

User Comments, Feedback, and Other Submissions

+

If you send specific submissions at our request (e.g., contest entries) or send unsolicited creative ideas, suggestions, proposals, plans, or other materials, we may, without restriction, edit, copy, publish, distribute, translate, and use any comments you send us. We are under no obligation to (1) maintain comments in confidence; (2) pay compensation for comments; or (3) respond to comments. We may monitor, edit, or remove content deemed unlawful, offensive, threatening, libelous, defamatory, pornographic, obscene, or otherwise objectionable or violating intellectual property rights or these Terms. You agree your comments will not violate any third-party rights, contain libelous or unlawful material, or malware affecting the Service. You are responsible for your comments' accuracy, and we assume no liability for comments posted by you or any third party.

+

Personal Information

+

Your submission of personal information through the store is governed by our Privacy Policy.

+

Errors, Inaccuracies, and Omissions

+

Occasionally, there may be information in the Service containing typographical errors, inaccuracies, or omissions related to product descriptions, pricing, promotions, offers, product shipping charges, transit times, and availability. We reserve the right to correct any errors, inaccuracies, or omissions, and to change or update information or cancel orders if any Service information is inaccurate at any time without prior notice. No obligation exists to update, amend, or clarify information in the Service or on related websites, including pricing information, except as required by law.

+

Prohibited Uses

+

In addition to other prohibitions set forth in the Terms of Service, you are prohibited from using the site or its content for unlawful purposes; to solicit others to perform unlawful acts; to violate international, federal, state, or local regulations, laws, or ordinances; to infringe upon our or others' intellectual property rights; to harass, abuse, insult, harm, defame, slander, disparage, intimidate, or discriminate; to submit false or misleading information; to upload or transmit malicious code; to collect or track personal information of others; to spam, phish, pharm, pretext, spider, crawl, or scrape; for obscene or immoral purposes; or to interfere with or circumvent the Service's security features. We reserve the right to terminate your use of the Service for violating any of the prohibited uses.

+

Disclaimer of Warranties; Limitation of Liability

+

We cannot guarantee that your use of our service will be uninterrupted, timely, secure, or free from errors. Additionally, we cannot assure that the results obtained from using our service will be accurate or reliable. You acknowledge that we may suspend the service for indefinite periods or cancel the service at any time, without prior notice.

+

Your use of, or inability to use, the service is solely at your own risk. The service and all products and services delivered to you through the service are, unless explicitly stated by us, provided 'as is' and 'as available', without any warranties or conditions of any kind, either express or implied. This includes any implied warranties or conditions of merchantability, fitness for a particular purpose, or non-infringement of intellectual property rights.

+

Under no circumstances shall Openterface, our directors, officers, employees, affiliates, agents, contractors, interns, suppliers, service providers, or licensors be liable for any injury, loss, claim, or direct, indirect, incidental, punitive, special, or consequential damages of any kind. This includes, without limitation, lost profits, lost revenue, lost savings, loss of data, replacement costs, or any similar damages, whether based in contract, tort (including negligence), strict liability, or otherwise, arising from your use of the service or any products procured using the service. This also includes any other claim related in any way to your use of the service or any product, such as errors or omissions in any content, or any loss or damage of any kind incurred as a result of the use of the service or any content (or product) posted, transmitted, or otherwise made available via the service, even if advised of their possibility. The limitation of liability shall apply to the fullest extent permitted by law in the applicable jurisdiction.

+

Indemnification

+

You agree to indemnify, defend, and hold harmless Openterface and our parent, subsidiaries, affiliates, partners, officers, directors, agents, contractors, licensors, service providers, subcontractors, suppliers, interns, and employees from any claims or demands, including reasonable legal fees, made by any third party due to or arising out of your breach of these Terms of Service, the documents they incorporate by reference, or your violation of any law or the rights of a third party.

+

Severability

+

If any provision of these Terms of Service is found to be unlawful, void, or unenforceable, such provision shall nevertheless be enforceable to the fullest extent permitted by applicable law. The unenforceable portion shall be considered severed from these Terms of Service, but this determination shall not affect the validity and enforceability of any other remaining provisions.

+

Termination

+

The obligations and liabilities of the parties incurred prior to the termination date will survive the termination of this agreement for all purposes. These Terms of Service are effective unless and until terminated by either you or us. You may terminate these Terms of Service at any time by notifying us that you no longer wish to use our services, or by ceasing to use our site.

+

We may terminate this agreement at any time without notice if, in our sole judgment, you fail or we suspect you have failed, to comply with any term or provision of these Terms of Service. In such a case, you will remain liable for all amounts due up to and including the date of termination; and we may deny you access to our services (or any part thereof).

+

Entire Agreement

+

Our failure to exercise or enforce any right or provision of these Terms of Service shall not constitute a waiver of such right or provision. These Terms of Service and any policies or operating rules posted by us on this site or in respect to the service constitute the entire agreement and understanding between you and us, and govern your use of the service. This supersedes any prior or contemporaneous agreements, communications, and proposals, whether oral or written, between you and us (including, but not limited to, any prior versions of the Terms of Service). Any ambiguities in the interpretation of these Terms of Service shall not be construed against the drafting party.

+

Governing Law

+

These Terms of Service and any separate agreements whereby we provide you services shall be governed by and construed in accordance with the laws of People's Republic of China.

+

Changes to Terms of Service

+

You can review the most current version of the Terms of Service at any time on this page. We reserve the right, at our sole discretion, to update, change, or replace any part of these Terms of Service by posting updates and changes to our website. It is your responsibility to check our website periodically for changes. Your continued use of or access to our website or the service following the posting of any changes to these Terms of Service constitutes acceptance of those changes.

+

Contact Information

+

For any questions regarding the Terms of Service, please contact us at info@techxartisan.com.

+ + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/index.html b/test/index.html new file mode 100644 index 0000000..fe6ad44 --- /dev/null +++ b/test/index.html @@ -0,0 +1,2189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Pruebas y Desarrollo - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + + +

Pruebas y Desarrollo

+

💻 Compatibilidad

+
    +
  • Soporte de OS: Verificar que diferentes versiones de sistemas operativos puedan usar la aplicación correspondiente.
  • +
  • Pruebas de Rendimiento: Evaluar el rendimiento en varios sistemas anfitriones.
  • +
  • Pruebas de Versiones de OS: Asegurar la compatibilidad a través de diferentes versiones de sistemas operativos.
  • +
  • Problemas Específicos de Dispositivos: Identificar y resolver problemas específicos de ciertos dispositivos o versiones de sistemas operativos.
  • +
+

🖱 Control del Ratón

+
+
    +
  • Latencia de Movimiento: Asegurar un control suave y responsivo.
  • +
  • Botones del Ratón: Probar los botones izquierdo, derecho y central; clic y arrastre.
  • +
  • Desplazamiento: Evaluar la velocidad y dirección del desplazamiento.
  • +
  • Precisión del mapeo de la posición del ratón en modo Absoluto (1)
  • +
  • Sensibilidad del movimiento del ratón en modo Relativo (2)
  • +
+
+
    +
  1. Asegurar que la posición del ratón del objetivo se mapea con precisión en el anfitrión. Esto puede verse afectado por la resolución del objetivo y los cambios en el tamaño de la ventana de la aplicación.
  2. +
  3. Asegurar que el movimiento del ratón cumpla con las expectativas intuitivas.
  4. +
+

⌨️ Teclado

+
+
    +
  • Respuesta al Escribir: Asegurar que cumpla con las expectativas intuitivas.
  • +
  • Mapeo Completo del Teclado: Especialmente para varios símbolos especiales.
  • +
  • Modificadores: Teclas como Ctrl, Shift, Alt y Cmd, o Win.
  • +
  • Combinaciones de Teclas: Soporta técnicamente hasta 8 teclas modificadoras y 6 teclas adicionales presionadas simultáneamente.
  • +
  • Teclas de Medios y ACPI: Teclas como Volumen-, Volumen+, Silencio, Despertar, Dormir y Encendido.
  • +
  • Distribuciones de Teclado: Asegurar un emparejamiento consistente para varias distribuciones. (1)
  • +
+
+

Tip

+
    +
  • Probador de Teclado: Puedes utilizar una herramienta de prueba de teclado en línea tanto en el anfitrión como en los equipos objetivo para verificar si sus pulsaciones están sincronizadas.
  • +
  • Chip CH9329: Consulta los detalles para entender los límites del control de teclado/ratón en el Openterface Mini-KVM.
  • +
+
+
+
    +
  1. ⌨️ 🌏 Las distribuciones de teclado varían globalmente a través de regiones e idiomas, con tipos populares como QWERTY, AZERTY, QWERTZ y Dvorak.
  2. +
+

⚙️ Acceso a Nivel de BIOS

+
    +
  • Entrada al BIOS: Probar la entrada al BIOS durante la secuencia de arranque.
  • +
  • Funcionalidad: Asegurar el control completo del teclado y ratón dentro del BIOS.
  • +
  • Compatibilidad: Verificar el acceso al BIOS en diferentes marcas y modelos de placas base.
  • +
+

🔊 Sonido

+
    +
  • Calidad de Sonido: Evaluar la claridad y sincronización de la reproducción de audio.
  • +
  • Latencia: Medir cualquier retraso entre las acciones y su sonido correspondiente.
  • +
  • Compatibilidad: Probar varias salidas de audio en diferentes sistemas operativos.
  • +
+

🎥 Video

+
    +
  • Soporte de Resolución: Probar varias resoluciones de pantalla y relaciones de aspecto.
  • +
  • Tasa de Fotogramas: Evaluar el rendimiento a diferentes tasas de refresco.
  • +
  • Calidad de la Pantalla: Verificar la presencia de artefactos visuales o problemas de latencia.
  • +
+

🔄 Puerto USB Conmutable

+
    +
  • Pruebas del Interruptor de Conmutación: Probar el interruptor de conmutación en varios escenarios para asegurar su fiabilidad.
  • +
  • Compatibilidad del Puerto: Asegurar que el puerto USB-A 2.0 soporte varios dispositivos USB como memorias flash y cámaras web.
  • +
  • Limitaciones de Potencia: Confirmar la capacidad de suministro de energía del puerto y su adecuación para diferentes dispositivos.
  • +
+

🔌 Conectar y Desconectar

+
    +
  • Pruebas de Conexión: Probar escenarios con diferentes secuencias de conexión y desconexión.
  • +
  • Manejo de Errores: Asegurar que el dispositivo reconozca y se recupere de conexiones incorrectas.
  • +
  • Estabilidad: Verificar la estabilidad cuando los dispositivos se conectan y desconectan repetidamente.
  • +
+

📝 Transferencia de Texto

+
    +
  • +

    Pruebas de Funcionalidad: Verificar que la aplicación anfitriona pueda transferir texto exitosamente desde el ordenador anfitrión al dispositivo objetivo usando códigos ASCII.

    +
  • +
  • +

    Integridad del Contenido: Asegurar que el contenido del texto transferido desde el anfitrión al dispositivo objetivo permanezca intacto y se reproduzca con precisión.

    +
  • +
  • +

    Manejo de Caracteres Especiales: Probar la función de transferencia de texto con varios caracteres ASCII para asegurar un manejo y reproducción adecuados en el dispositivo objetivo.

    +
  • +
  • +

    Pruebas de Longitud de Texto: Probar la función de transferencia de texto con textos de diferentes longitudes para verificar que pueda acomodar diferentes tamaños de texto sin problemas.

    +
  • +
  • +

    Manejo de Errores: Probar escenarios de error, como pérdida de conexión o interrupción durante la transferencia de texto, para asegurar que la aplicación anfitriona maneje estas situaciones de manera adecuada y proporcione retroalimentación apropiada al usuario.

    +
  • +
  • +

    Pruebas de Rendimiento: Evaluar el rendimiento de la función de transferencia de texto bajo varias condiciones, incluyendo en ordenadores más antiguos o lentos, para identificar posibles problemas con la recepción incorrecta de señales de entrada HID y asegurar un funcionamiento fluido.

    +
  • +
  • +

    Pruebas de Interfaz de Usuario: Asegurar que la interfaz de usuario de la aplicación anfitriona proporcione controles intuitivos y retroalimentación para iniciar y monitorear las operaciones de transferencia de texto, facilitando a los usuarios la comprensión y uso efectivo de esta función.

    +
  • +
+

Adicional

+
    +
  • Manejo de Errores: Probar los mecanismos de manejo de errores para una recuperación adecuada de las interrupciones.
  • +
  • Rendimiento: Evaluar el rendimiento del mini-KVM bajo varios escenarios de carga de trabajo.
  • +
  • Estabilidad: Realizar pruebas de estrés para la estabilidad y fiabilidad a largo plazo.
  • +
+ + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/usb-switch/index.html b/usb-switch/index.html new file mode 100644 index 0000000..be37116 --- /dev/null +++ b/usb-switch/index.html @@ -0,0 +1,2256 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Puerto USB Conmutable - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + + +

Mecánica del Puerto USB Conmutable

+

switch-graphics +switch-graphics

+

El dispositivo mini-KVM cuenta con un puerto USB-A 2.0 conmutable que puede alternarse entre la computadora anfitriona y la computadora objetivo, pero no puede estar conectado a ambas simultáneamente. Esta funcionalidad se controla tanto mediante un interruptor físico como un interruptor de software en la aplicación del anfitrión. Este documento explica la mecánica y la lógica detrás de estos interruptores.

+

Tipos de Interruptores

+
    +
  • +

    Interruptor de Software: Un botón de alternancia en la aplicación del anfitrión.

    +
      +
    • Alterna la conexión del puerto USB entre las computadoras anfitriona y objetivo
    • +
    +
  • +
  • +

    Toggle Switch Toggle Switch Interruptor de Hardware: Un interruptor físico de dos posiciones en el dispositivo.

    +
      +
    • Posición hacia adentro: Conecta a la computadora anfitriona
    • +
    • Posición hacia afuera: Conecta a la computadora objetivo
    • +
    +
  • +
+

Configuración Inicial y Sincronización

+

Cuando el mini-KVM está correctamente conectado y se inicia la aplicación del anfitrión:

+
    +
  1. La conexión real del puerto USB del dispositivo (circuito) inicialmente se conecta a la computadora anfitriona.
  2. +
  3. La aplicación del anfitrión detecta la posición actual del interruptor de hardware, que está configurado en la computadora anfitriona o en la computadora objetivo.
  4. +
  5. El interruptor de software se sincroniza con la posición del interruptor de hardware.
  6. +
  7. La conexión del circuito real se actualiza para coincidir con las posiciones de los interruptores.
  8. +
+
+

Limitación de Hardware

+

Si una unidad USB ya está conectada al dispositivo antes de encenderlo o iniciar la aplicación del anfitrión, la computadora anfitriona emitirá una advertencia sobre la extracción insegura del dispositivo USB. Esta es una limitación de hardware para la versión 1.9. Por lo tanto, se recomienda no conectar ningún dispositivo USB antes de encender el dispositivo o iniciar nuestra aplicación del anfitrión.

+
+

Estados Operativos

+

Debido a la presencia de interruptores de hardware y software, pueden ocurrir cuatro estados posibles:

+
    +
  • +

    Estado 1 (Sincronizado, Conectado al Anfitrión):

    +
      +
    • Interruptor de Hardware: Apunta al Anfitrión host-computer host-computer
    • +
    • Interruptor de Software: Apunta al Anfitrión host-computer host-computer
    • +
    • Conexión del Puerto USB: Conectado al Anfitrión host-computer host-computer
    • +
    +
  • +
  • +

    Estado 2 (Sincronizado, Conectado al Objetivo):

    +
      +
    • Interruptor de Hardware: Apunta al Objetivo target-computer target-computer
    • +
    • Interruptor de Software: Apunta al Objetivo target-computer target-computer
    • +
    • Conexión del Puerto USB: Conectado al Objetivo target-computer target-computer
    • +
    +
  • +
  • +

    Estado 3 (Fuera de Sincronización, USB Conectado al Anfitrión):

    +
      +
    • Interruptor de Hardware: Apunta al Objetivo target-computer target-computer
    • +
    • Interruptor de Software: Apunta al Anfitrión host-computer host-computer
    • +
    • Conexión del Puerto USB: Conectado al Anfitrión host-computer host-computer
    • +
    +
  • +
  • +

    Estado 4 (Fuera de Sincronización, USB Conectado al Objetivo):

    +
      +
    • Interruptor de Hardware: Apunta al Anfitrión host-computer host-computer
    • +
    • Interruptor de Software: Apunta al Objetivo target-computer target-computer
    • +
    • Conexión del Puerto USB: Conectado al Objetivo target-computer target-computer
    • +
    +
  • +
+

Transiciones de Estado y Lógica

+

Desde Estado 1 (Sincronizado con el Anfitrión)

+
    +
  • +

    Escenario 1a: El usuario mueve el Interruptor de Hardware al Objetivo

    +
      +
    • Actualizar la variable de estado interno al Objetivo target-computer target-computer
    • +
    • Actualizar la pantalla de la aplicación del anfitrión para mostrar el Objetivo target-computer target-computer
    • +
    • Cambiar la conexión del circuito real al Objetivo target-computer target-computer
    • +
    • Transición al Estado 2, sincronizado
    • +
    +
  • +
  • +

    Escenario 1b: El usuario hace clic en el Interruptor de Software al Objetivo

    +
      +
    • Actualizar la variable de estado interno al Objetivo target-computer target-computer
    • +
    • La posición del interruptor de hardware permanece sin cambios (apuntando al Anfitrión host-computer host-computer)
    • +
    • Cambiar la conexión del circuito real al Objetivo target-computer target-computer
    • +
    • Transición al Estado 3, fuera de sincronización
    • +
    +
  • +
+

Desde Estado 2 (Sincronizado con el Objetivo)

+
    +
  • +

    Escenario 2a: El usuario mueve el Interruptor de Hardware al Anfitrión host-computer host-computer:

    +
      +
    • Actualizar la variable de estado interno al Anfitrión host-computer host-computer
    • +
    • Actualizar la pantalla del interruptor de software para mostrar el Anfitrión host-computer host-computer
    • +
    • Cambiar la conexión del circuito real al Anfitrión host-computer host-computer
    • +
    • Transición al Estado 1, sincronizado
    • +
    +
  • +
  • +

    Escenario 2b: El usuario hace clic en el Interruptor de Software al Anfitrión host-computer host-computer:

    +
      +
    • Actualizar la variable de estado interno al Anfitrión host-computer host-computer
    • +
    • La posición del interruptor de hardware permanece sin cambios (apuntando al Objetivo target-computer target-computer)
    • +
    • Cambiar la conexión del circuito real al Anfitrión host-computer host-computer
    • +
    • Transición al Estado 4, fuera de sincronización
    • +
    +
  • +
+

Desde Estado 3 (Fuera de Sincronización, USB Conectado al Anfitrión)

+
    +
  • +

    Escenario 3a: El usuario mueve el Interruptor de Hardware al Objetivo target-computer target-computer:

    +
      +
    • No hay cambios en las variables
    • +
    • Transición al Estado 2, sincronizado
    • +
    +
  • +
  • +

    Escenario 3b: El usuario hace clic en el Interruptor de Software al Anfitrión host-computer host-computer:

    +
      +
    • Actualizar la variable de estado interno al Anfitrión host-computer host-computer
    • +
    • La posición del interruptor de hardware permanece sin cambios (apuntando al Objetivo target-computer target-computer)
    • +
    • Cambiar la conexión del circuito real al Anfitrión host-computer host-computer
    • +
    • Transición al Estado 1, sincronizado
    • +
    +
  • +
+

Desde Estado 4 (Fuera de Sincronización, USB Conectado al Objetivo)

+
    +
  • +

    Escenario 4a: El usuario mueve el Interruptor de Hardware al Anfitrión host-computer host-computer:

    +
      +
    • No hay cambios en las variables
    • +
    • Transición al Estado 1, sincronizado
    • +
    +
  • +
  • +

    Escenario 4b: El usuario hace clic en el Interruptor de Software al Objetivo target-computer target-computer:

    +
      +
    • Actualizar la variable de estado interno al Objetivo target-computer target-computer
    • +
    • La posición del interruptor de hardware permanece sin cambios (apuntando al Anfitrión host-computer host-computer)
    • +
    • Cambiar la conexión del circuito real al Objetivo target-computer target-computer
    • +
    • Transición al Estado 2, sincronizado
    • +
    +
  • +
+
+

Recuerde expulsar la unidad flash antes de alternar el interruptor

+

Si el puerto USB está siendo utilizado por una unidad flash, asegúrese de expulsar la unidad flash antes de alternar el interruptor para transferir el uso del puerto a otra computadora.

+
+
+

Limitaciones de energía del USB

+

La energía suministrada por el puerto USB depende de la placa base del Anfitrión. No se recomienda conectar dispositivos USB que requieran mucha energía. Típicamente, el consumo de energía no debe exceder los 1.5W. Conectar dispositivos de alta potencia puede resultar en una operación inestable o daño potencial.

+
+
+

Guía para el Usuario

+
    +
  • +

    Prioridad del Interruptor de Software: Independientemente de la posición del interruptor de hardware, hacer clic en el interruptor de software cambiará inmediatamente la dirección del circuito.

    +
  • +
  • +

    Sincronización del Interruptor de Hardware: Cualquier alternancia manual del Interruptor de Hardware alineará su estado con el Interruptor de Software, pasando al Estado 1 o Estado 2 desde el Estado 3 o Estado 4 fuera de sincronización. Sin embargo, esta sincronización no necesariamente alterará la conexión real del circuito.

    +
  • +
  • +

    Monitoreo del Interruptor de Hardware: El Interruptor de Hardware, a pesar de ser físico, es monitoreado por el software y no controla directamente la dirección del circuito. En su lugar, el software interpreta la posición del interruptor y gestiona el cambio real del circuito.

    +
  • +
+
+

Por Qué Importa la Conmutación USB Controlada por Software

+

La mejora de la conmutación USB controlada por software introducida en la versión 1.9 es una característica fundamental para nuestros planes de desarrollo futuro, particularmente en el soporte de soluciones KVM-over-IP como VNC (que aún no hemos implementado). Esta capacidad permite a los usuarios alternar y compartir el puerto USB entre las computadoras objetivo y anfitriona de forma remota, lo cual es especialmente crucial para facilitar la transferencia de archivos en una configuración remota.

+

Esta característica abre un mundo de posibilidades para la gestión y el control remoto. Por ejemplo, permite transferencias de archivos entre dispositivos sin intervención física, mejorando la eficiencia de la solución de problemas y la gestión del sistema de forma remota.

+

¿Tienes ideas creativas sobre cómo aprovechar esta característica? ¡Nos encantaría hablar contigo! Únete a la comunidad de Openterface community y comparte tus pensamientos 😃

+ + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/use-cases/index.html b/use-cases/index.html new file mode 100644 index 0000000..e63a106 --- /dev/null +++ b/use-cases/index.html @@ -0,0 +1,2084 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Casos de Uso - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + + +

Casos de Uso

+

Portabilidad Versátil para Soluciones Rápidas

+

Al combinar el Openterface Mini-KVM con el uConsole de Clockwork, este ordenador portátil Pi se convierte en una herramienta KVM práctica, perfecta para conectar y solucionar problemas rápidamente en dispositivos sin pantalla cercanos. Esta configuración es especialmente útil para ingenieros de campo y entusiastas de la tecnología que necesitan una solución compacta y eficiente para gestionar y diagnosticar dispositivos sobre la marcha.

+

use-case-demo-uconsole

+ + + +

Gestión de Servidores Simplificada

+

Ideal para profesionales de TI que trabajan en el mantenimiento y operación de salas de servidores, nuestro Mini-KVM permite controlar múltiples servidores desde tu propio portátil como una única estación de trabajo, mejorando la eficiencia operativa. +use-case-demo-pc-bios-1

+

Configuración Simplificada para Entusiastas de la Tecnología

+

Este producto facilita el proceso de configuración para los entusiastas de micro-ordenadores que trabajan con dispositivos como Raspberry Pi y Jetson Nano. Permite el control directo desde un ordenador principal, eliminando la necesidad de periféricos adicionales.

+

use-case-demo-respberry-pi

+

Control Unificado para Diversos Dispositivos

+

Perfecto para profesionales que alternan entre ordenadores personales y de trabajo, o que gestionan dispositivos como cajeros automáticos, terminales de lotería y quioscos. El Openterface Mini-KVM ofrece una interfaz unificada que simplifica la gestión de múltiples dispositivos.

+

use-case-demo-macmini2009

+

Operaciones Seguras para Tareas Sensibles

+

Los profesionales que gestionan tareas que requieren segregación de red, como la gestión de activos de criptomonedas, encontrarán este producto indispensable para mantener operaciones locales seguras.

+

use-case-demo-industrial-pc

+

Integración Eficiente para Flujos de Trabajo Mixtos

+

Los usuarios que cambian frecuentemente entre ordenadores personales y de trabajo, o aquellos que gestionan dispositivos de computación en el borde, se beneficiarán de la integración de flujos de trabajo simplificada que proporciona el Openterface Mini-KVM.

+

use-case-demo-macbookpro2010

+

Control Sin Interrupciones: Mini-KVM + Lápiz de Android = Pura Magia

+

¿Qué tal si pudieras usar tu lápiz de Android para controlar sistemas Windows o macOS directamente en tu tableta Android a través del Openterface MiniKVM? Imagina dibujar diseños, marcar documentos, o navegar software con precisión—todo sin cambiar de dispositivos. ¡Sea una herramienta de diseño gráfico como Photoshop, una aplicación de modelado 3D, o incluso un editor de presentaciones, la experiencia es fluida e intuitiva!

+

El Mini-KVM desbloquea esta integración sin interrupciones, permitiéndote usar tu tableta Android como un centro para el control entre plataformas. ¿Tienes un software favorito que probarías primero? ¡Háganoslo saber, y manténgase atento para más formas creativas de elevar tu espacio de trabajo!

+ + + + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/whats-in-the-box/index.html b/whats-in-the-box/index.html new file mode 100644 index 0000000..160e20b --- /dev/null +++ b/whats-in-the-box/index.html @@ -0,0 +1,2032 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Qué Hay en la Caja - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + + +

¿Qué Hay En La Caja?

+

Descubre nuestras dos opciones de compra diseñadas para satisfacer tus necesidades, ya sea que busques lo esencial o un conjunto completo de herramientas.

+

Paquete 1: Paquete Básico

+

basic-pack

+
    +
  1. Producto Principal: Openterface Mini-KVM
  2. +
  3. Guía de Inicio Rápido
  4. +
+

Paquete 2: Paquete de Herramientas

+

toolkit-open

+
    +
  1. Producto Principal: Openterface Mini-KVM
  2. +
  3. Guía de Inicio Rápido
  4. +
  5. Bolsa de Herramientas (165 x 110 x 50mm)
  6. +
  7. Tapa de Extensión de Pin
  8. +
  9. Cable HDMI Macho a Macho (30cm)
  10. +
  11. Cable Tipo-C Macho a USB-A Macho (0.3m) con Adaptador USB-A Hembra a USB-C Macho
  12. +
  13. Cable Tipo-C Macho a Macho (1.5m) con Adaptador USB-C Hembra a USB-A Macho
  14. +
+

toolkit-parts-layout-2-numbers

+ + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/why-openterface/index.html b/why-openterface/index.html new file mode 100644 index 0000000..81d9d75 --- /dev/null +++ b/why-openterface/index.html @@ -0,0 +1,1984 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Por Qué Openterface - Openterface | Conectando Interfaces a Nuevas Posibilidades + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + + +

¿Por qué Openterface?

+

Con tantas soluciones KVM disponibles, aquí te contamos por qué Openterface te conquistará:

+
    +
  1. +

    Portabilidad y Funcionalidad

    +

    Diseñado pensando en la portabilidad, el Openterface Mini-KVM es un dispositivo compacto y ligero que puede acompañarte fácilmente a donde vayas. Con capacidades completas como acceso a nivel de BIOS, integración de audio, un puerto USB conmutador y transferencia de texto, este dispositivo proporciona todas las herramientas necesarias para gestionar y solucionar problemas de tus dispositivos sin pantalla, sin importar dónde te encuentres.

    +
  2. +
  3. +

    Solución sin Red y Resolución Rápida de Problemas

    +

    A diferencia de las soluciones KVM-over-IP o KVM por software que dependen del acceso a la red, el Openterface Mini-KVM ofrece una experiencia plug-and-play independiente de la red. Nuestro dispositivo establece una conexión directa HDMI y USB entre el ordenador anfitrión y el dispositivo objetivo, permitiéndote tomar el control y diagnosticar problemas rápidamente, especialmente en entornos donde la conectividad de red es poco fiable o inexistente. El tiempo de inicio del hardware es de menos de 1 segundo, asegurando que puedas comenzar a solucionar problemas sin demoras ni interrupciones en tu flujo de trabajo.

    +
  4. +
  5. +

    Precio Asequible

    +

    A diferencia de las consolas KVM tradicionales que suelen tener un precio elevado, nuestro Mini-KVM está diseñado para ser accesible y asequible para un amplio espectro de usuarios, desde profesionales de TI hasta entusiastas de la tecnología.

    +
  6. +
  7. +

    Completamente de Código Abierto y Comunidad

    +

    La verdadera magia reside en nuestro compromiso con el desarrollo de código abierto y la participación comunitaria. Al abrazar estos principios, estamos construyendo un ecosistema vibrante donde los usuarios pueden colaborar, contribuir y personalizar el dispositivo para satisfacer sus necesidades únicas, fomentando la innovación y empujando los límites de lo que es posible. 👨‍💻🤝👩‍💻

    +
  8. +
+

Aprende más comparando Openterface con otras soluciones KVM.

+ + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/window/index.html b/window/index.html new file mode 100644 index 0000000..e4acc48 --- /dev/null +++ b/window/index.html @@ -0,0 +1,14 @@ + + + + + + Redirecting... + + + + + +You're being redirected to a new destination. + + diff --git a/x/index.html b/x/index.html new file mode 100644 index 0000000..c7c9d19 --- /dev/null +++ b/x/index.html @@ -0,0 +1,14 @@ + + + + + + Redirecting... + + + + + +You're being redirected to a new destination. + +

Es súper fácil—solo toma una captura de pantalla de tu confirmación de pedido de Crowd Supply y envíala por correo electrónico a info@techxartisan.com. Verificaremos tu compra y te responderemos con tu código de crédito de $20 para la tienda.